aoc_generator 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 938e976e4342e3115907290c0c0c90385ca25c67f80bde2befc904baeb510a56
4
- data.tar.gz: 2900af440cc153869f1f5575c8a162a53b60ff36b702b8628dcc22e8cdb3c814
3
+ metadata.gz: 4b769226917de985f62166b06a18ac48433df5e5ca362fdfc7248338d368ce39
4
+ data.tar.gz: 9f1be6d33fe107041e8ebcbc90c9dc67b05d5ad27506a84ee2ebe5239cf4920b
5
5
  SHA512:
6
- metadata.gz: 11471565e51be4d99ad7e11cd4e1aa2bb43546301aa485c1fbd64d4b5ce9fc78c02b85128e0f6c608caddae2dbeb63ca59d676b5712e1c91d3de72b933d52360
7
- data.tar.gz: 66b8d3dc1df84f44f5600aa3ec497f75b4245c955e54f287431e200d1e34eec3cf2efe3a7ec16f7363be522ae140f18b2060b276882b043d39f9f7dd3e44f6e2
6
+ metadata.gz: 0fad21368f7c4033a73670fdb2dece5a1ed468de3e0075d50426b821d65a3e15ae840bf2c8f6e20f5e8070f836ffe21bb72eb7abd100162bed5ee60101ca8821
7
+ data.tar.gz: 1ec320f03139f386435f78e21f3922e840a36433795f7e34421ff4d464b53073497c7c742da1998a025b15e31c1c34e719a5f008cd049a8ad65d2351f1ad8234
data/CHANGELOG.md CHANGED
@@ -1,6 +1,12 @@
1
1
  # Changelog
2
2
 
3
- ## [0.1.2] - 2024-11-28
3
+ ## [0.1.3] - 2024-11-28
4
+
5
+ - Allow to read a AOC_SESSION environment variable
6
+ - Change file names
7
+ - Convert HTML to Markdown
8
+
9
+ ## [0.1.2]
4
10
 
5
11
  - [Fix] Add the correct FileUtils gem
6
12
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- aoc_generator (0.1.2)
4
+ aoc_generator (0.1.3)
5
5
  fileutils (~> 1.7)
6
6
  nokogiri (~> 1.16)
7
7
  thor (~> 1.3)
data/README.md CHANGED
@@ -16,12 +16,11 @@ A Ruby gem that generates daily puzzle templates for Advent of Code.
16
16
 
17
17
  ```sh
18
18
  -y, [--year=N] # Defaults to the current year.
19
- # Default: 2024
20
19
  -d, [--day=N] # Defaults to the current day.
21
- # Default: 28
22
20
  -u, [--username=USERNAME] # Files will be generated in a directory with this name. Useful for multi-user repos.
23
21
  # Default: advent_of_code
24
22
  -s, [--session=SESSION] # Your adventofcode.com session key. Necessary for scraping data files and specs for part two.
23
+ # Default: reads AOC_SESSION environment variable if it exists.
25
24
  ```
26
25
 
27
26
  ## Generated file structure
@@ -32,8 +31,8 @@ adventofcode/
32
31
  └── year_2024/
33
32
  |
34
33
  └── day_01/
35
- ├── main.rb
36
- ├── spec.rb
34
+ ├── day_01.rb
35
+ ├── day_01_spec.rb
37
36
  ├── data.txt
38
37
  └── README.md
39
38
  ```
@@ -32,7 +32,10 @@ module AdventOfCodeGenerator
32
32
  method_option :session,
33
33
  required: false,
34
34
  aliases: "-s",
35
- desc: "Your adventofcode.com session key. Necessary for scraping data files and specs for part two."
35
+ desc: "Your adventofcode.com session key. " \
36
+ "Necessary for scraping data files and specs for part two. " \
37
+ "Defaults to a AOC_SESSION environment variable if it exists.",
38
+ default: ENV.fetch("AOC_SESSION", nil)
36
39
 
37
40
  def generate
38
41
  scraper = AdventOfCodeGenerator::Scraper.new(options)
@@ -12,8 +12,8 @@ module AdventOfCodeGenerator
12
12
  # └── year_2024/
13
13
  # |
14
14
  # └── day_01/
15
- # ├── main.rb
16
- # ├── spec.rb
15
+ # ├── day_01.rb
16
+ # ├── day_01_spec.rb
17
17
  # ├── data.txt
18
18
  # └── README.md
19
19
  #
@@ -58,7 +58,7 @@ module AdventOfCodeGenerator
58
58
  end
59
59
 
60
60
  def main_file
61
- path = "#{daily_directory}/main.rb"
61
+ path = "#{daily_directory}/day_#{@day}.rb"
62
62
  content = <<~RUBY
63
63
  # frozen_string_literal: true
64
64
 
@@ -85,11 +85,11 @@ module AdventOfCodeGenerator
85
85
  end
86
86
 
87
87
  def spec_file
88
- path = "#{daily_directory}/spec.rb"
88
+ path = "#{daily_directory}/day_#{@day}_spec.rb"
89
89
  content = <<~RUBY
90
90
  # frozen_string_literal: true
91
91
 
92
- require_relative "main"
92
+ require_relative "day_#{@day}"
93
93
 
94
94
  RSpec.describe #{@username.capitalize}::Year#{@year}::Day#{@day} do
95
95
  subject(:puzzle) { described_class.new(input) }
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ module AdventOfCodeGenerator
6
+ # Converts HTML puzzle descriptions from adventofcode.com into markdown format.
7
+ class HTMLParser
8
+ def initialize(input)
9
+ @input = input
10
+ end
11
+
12
+ def call
13
+ articles.map do |node|
14
+ process_article(node)
15
+ end.join("\n").strip
16
+ end
17
+
18
+ private
19
+
20
+ def articles
21
+ doc = Nokogiri::HTML(@input)
22
+ doc.css("article")
23
+ end
24
+
25
+ def process_article(article)
26
+ article.children.map { |node| process_node(node) }.compact
27
+ end
28
+
29
+ def process_node(node)
30
+ case node.name
31
+ when "h2"
32
+ "## #{node.text}\n"
33
+ when "p"
34
+ "#{process_paragraph(node)}\n"
35
+ when "pre"
36
+ "```sh\n#{node.text.strip}\n```\n"
37
+ end
38
+ end
39
+
40
+ def process_paragraph(para)
41
+ para.inner_html
42
+ .gsub(%r{<a[^>]*href="([^"]*)"[^>]*>(.*?)</a>}, '[\2](\1)')
43
+ .gsub(%r{<code><em>(.*?)</em></code>}, '**`\1`**')
44
+ .gsub(%r{<em><code>(.*?)</code></em>}, '**`\1`**')
45
+ .gsub(%r{<em.*?>(.*?)</em>}, '**\1**')
46
+ .gsub(%r{<code>(.*?)</code>}, '`\1`')
47
+ .gsub(/<[^>]*>/, "")
48
+ end
49
+ end
50
+ end
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "net/http"
4
+ require_relative "html_parser"
4
5
 
5
6
  module AdventOfCodeGenerator
6
7
  # Fetches puzzle descriptions and input data from adventofcode.com.
7
8
  class Scraper
8
- def initialize(options)
9
+ def initialize(options, parser = AdventOfCodeGenerator::HTMLParser)
9
10
  @year = options[:year]
10
11
  @day = options[:day]
11
12
  @session_key = options[:session]
13
+ @parser = parser
12
14
  end
13
15
 
14
16
  def puzzle_description
@@ -17,7 +19,7 @@ module AdventOfCodeGenerator
17
19
  uri = URI("https://adventofcode.com/#{@year}/day/#{@day}")
18
20
  response = Net::HTTP.get_response(uri, headers)
19
21
 
20
- response.body
22
+ @parser.new(response.body).call
21
23
  end
22
24
 
23
25
  def input_data
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AdventOfCodeGenerator
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
 
6
6
  class Error < StandardError; end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aoc_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-27 00:00:00.000000000 Z
11
+ date: 2024-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fileutils
@@ -74,6 +74,7 @@ files:
74
74
  - lib/advent_of_code_generator.rb
75
75
  - lib/advent_of_code_generator/cli.rb
76
76
  - lib/advent_of_code_generator/generator.rb
77
+ - lib/advent_of_code_generator/html_parser.rb
77
78
  - lib/advent_of_code_generator/scraper.rb
78
79
  homepage: https://github.com/cheddachedda/advent_of_code_generator
79
80
  licenses: []