aoc_generator 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []