module AocRb::Puzzle

Public Instance Methods

create_puzzle(year, day) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 56
def create_puzzle(year, day)

end
create_required_directories(year, day) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 65
def create_required_directories(year, day)
  year_directory = File.join("challenges", year.to_s, padded(day))
  FileUtils.mkdir_p(year_directory) unless Dir.exist?(year_directory)
end
create_source(year, day) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 19
def create_source(year, day)
  source_dir = File.join("challenges", year.to_s, padded(day))
  source_path = File.join(source_dir, "solution.rb")
  FileUtils.mkdir_p(source_dir) unless Dir.exist?(source_dir)
  PuzzleInput.skip_if_exists(source_path) do
    template = File.read(File.join(File.dirname(__FILE__), "../../templates", "solution.rb.erb"))
    @year = year.to_s
    @day = padded(day)
    File.open(source_path, "w") do |f|
      f.write ERB.new(template).result(binding)
    end
  end
end
create_spec(year, day) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 33
def create_spec(year, day)
  spec_dir = File.join("spec", year.to_s, padded(day))
  spec_path = File.join(spec_dir, "solution_spec.rb")
  FileUtils.mkdir_p(spec_dir) unless Dir.exist?(spec_dir)
  PuzzleInput.skip_if_exists(spec_path) do
    template = File.read(File.join(File.dirname(__FILE__), "../../templates", "solution_spec.rb.erb"))
    @year = year.to_s
    @day = padded(day)
    File.open(spec_path, "w") do |f|
      f.write ERB.new(template).result(binding)
    end
  end
end
create_templates(year, day) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 10
def create_templates(year, day)
  create_source(year, day)
  create_spec(year, day)
end
fetch_instructions(year, day) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 47
def fetch_instructions(year, day)
  create_required_directories year, day

  api = AocRb::AocApi.new(ENV['AOC_COOKIE'])
  content = api.puzzle_instructions(year, day)

  parse_and_save_instructions(year, day, content.body)
end
instructions_exist?(year, day, part) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 60
def instructions_exist?(year, day, part)
  filename = File.join("challenges", year.to_s, padded(day), "#{part}.md")
  File.exist?(filename)
end
padded(day) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 15
def padded(day)
  day.to_s.rjust(2, "0")
end
parse_and_save_instructions(year, day, content) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 70
def parse_and_save_instructions(year, day, content)
  doc = Nokogiri::HTML(content)
  articles = doc.css("article.day-desc")
  articles.each_with_index { |article, index| process_article(year, day, article, index) }
end
process_article(year, day, article, index) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 76
def process_article(year, day, article, index)
  part_num = index + 1
  filename = File.join("challenges", year.to_s, padded(day), "part_#{part_num}.md")

  File.open(filename, "w") do |f|
    process_page_content(f, article)
    f.close
  end
end
process_children(f, children, indent_level = 0, strip_em = false) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 124
def process_children(f, children, indent_level = 0, strip_em = false)
  children.each do |child|
    process_page_content f, child, indent_level, strip_em
  end
end
process_page_content(f, child, indent_level = 0, strip_em = false) click to toggle source
# File lib/aoc_rb/puzzle.rb, line 86
def process_page_content(f, child, indent_level = 0, strip_em = false)
  # byebug
  return unless child.respond_to?(:name)
  case child.name
  when "text"
    f.write child.content.chomp.gsub("\n", "\n" + (" " * indent_level))
  when "h2"
    f.write "## "
    process_children f, child.children, indent_level, strip_em
    f.write "\n\n"
  when "p"
    process_children f, child.children, indent_level, strip_em
    f.write "\n\n"
  when "ul"
    process_children f, child.children, indent_level, strip_em
    f.write "\n"
  when "li"
    f.write "* "
    process_children f, child.children, indent_level, strip_em
    f.write "\n"
  when "em"
    f.write "**" unless strip_em
    process_children f, child.children
    f.write "**" unless strip_em
  when "code"
    f.write " " * indent_level
    f.write "``" unless indent_level > 0
    process_children f, child.children, indent_level, true
    f.write "``" unless indent_level > 0
  when "pre"
    process_children f, child.children, 4, strip_em
    f.write "\n\n"
  else
    process_children f, child.children, indent_level, strip_em
    # byebug
  end
end