aoc_generator 0.1.1 → 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: 579687651649a576b4a217b4db66695d9b8da18c373fd1fc5c61bcab91874916
4
- data.tar.gz: 9090643816096affbd2b0588652a7dc270668b5deebcd2752edd0ed5fde6e8eb
3
+ metadata.gz: 4b769226917de985f62166b06a18ac48433df5e5ca362fdfc7248338d368ce39
4
+ data.tar.gz: 9f1be6d33fe107041e8ebcbc90c9dc67b05d5ad27506a84ee2ebe5239cf4920b
5
5
  SHA512:
6
- metadata.gz: 84772a24e510af0c88595a7191d9edb67bfa51b645ccba9cdc0accce29407f94980a69eb86d09e1ba6aaef187ee55d52f1b6f9c089fc7369536379727bcf1d8b
7
- data.tar.gz: 53495eba8e1ac78e30e59fdcab46a221ffb5384f28efafbc7a5788c9cdad78d48efe6f24b90a287eafb3a2210223fa7316a58bf0a6b6871d7419a2740d9f4399
6
+ metadata.gz: 0fad21368f7c4033a73670fdb2dece5a1ed468de3e0075d50426b821d65a3e15ae840bf2c8f6e20f5e8070f836ffe21bb72eb7abd100162bed5ee60101ca8821
7
+ data.tar.gz: 1ec320f03139f386435f78e21f3922e840a36433795f7e34421ff4d464b53073497c7c742da1998a025b15e31c1c34e719a5f008cd049a8ad65d2351f1ad8234
data/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Changelog
2
2
 
3
- ## [0.1.1] - 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]
10
+
11
+ - [Fix] Add the correct FileUtils gem
12
+
13
+ ## [0.1.1]
4
14
 
5
15
  - Add FileUtils gem
6
16
  - Specify dependencies
data/Gemfile CHANGED
@@ -7,7 +7,7 @@ gemspec
7
7
  ruby file: ".tool-versions"
8
8
 
9
9
  gem "debug", "~> 1.9"
10
- gem "file_utils", "~> 1.1"
10
+ gem "fileutils", "~> 1.7"
11
11
  gem "nokogiri", "~> 1.16"
12
12
  gem "rake", "~> 13.2"
13
13
  gem "rspec", "~> 3.13"
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- aoc_generator (0.1.1)
5
- file_utils (~> 1.1)
4
+ aoc_generator (0.1.3)
5
+ fileutils (~> 1.7)
6
6
  nokogiri (~> 1.16)
7
7
  thor (~> 1.3)
8
8
 
@@ -20,7 +20,7 @@ GEM
20
20
  irb (~> 1.10)
21
21
  reline (>= 0.3.8)
22
22
  diff-lcs (1.5.1)
23
- file_utils (1.1.2)
23
+ fileutils (1.7.3)
24
24
  hashdiff (1.1.2)
25
25
  io-console (0.7.2)
26
26
  irb (1.14.1)
@@ -95,7 +95,7 @@ PLATFORMS
95
95
  DEPENDENCIES
96
96
  aoc_generator!
97
97
  debug (~> 1.9)
98
- file_utils (~> 1.1)
98
+ fileutils (~> 1.7)
99
99
  nokogiri (~> 1.16)
100
100
  rake (~> 13.2)
101
101
  rspec (~> 3.13)
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)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "fileutils"
4
+
3
5
  module AdventOfCodeGenerator
4
6
  # Creates directory structure and files for daily Advent of Code puzzles:
5
7
  #
@@ -10,8 +12,8 @@ module AdventOfCodeGenerator
10
12
  # └── year_2024/
11
13
  # |
12
14
  # └── day_01/
13
- # ├── main.rb
14
- # ├── spec.rb
15
+ # ├── day_01.rb
16
+ # ├── day_01_spec.rb
15
17
  # ├── data.txt
16
18
  # └── README.md
17
19
  #
@@ -56,7 +58,7 @@ module AdventOfCodeGenerator
56
58
  end
57
59
 
58
60
  def main_file
59
- path = "#{daily_directory}/main.rb"
61
+ path = "#{daily_directory}/day_#{@day}.rb"
60
62
  content = <<~RUBY
61
63
  # frozen_string_literal: true
62
64
 
@@ -83,11 +85,11 @@ module AdventOfCodeGenerator
83
85
  end
84
86
 
85
87
  def spec_file
86
- path = "#{daily_directory}/spec.rb"
88
+ path = "#{daily_directory}/day_#{@day}_spec.rb"
87
89
  content = <<~RUBY
88
90
  # frozen_string_literal: true
89
91
 
90
- require_relative "main"
92
+ require_relative "day_#{@day}"
91
93
 
92
94
  RSpec.describe #{@username.capitalize}::Year#{@year}::Day#{@day} do
93
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.1"
4
+ VERSION = "0.1.3"
5
5
 
6
6
  class Error < StandardError; end
7
7
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aoc_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
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
- name: file_utils
14
+ name: fileutils
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
19
+ version: '1.7'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.1'
26
+ version: '1.7'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -63,20 +63,18 @@ executables:
63
63
  extensions: []
64
64
  extra_rdoc_files: []
65
65
  files:
66
- - ".rspec"
67
- - ".rubocop.yml"
68
66
  - ".tool-versions"
69
67
  - CHANGELOG.md
70
68
  - Gemfile
71
69
  - Gemfile.lock
72
70
  - README.md
73
- - Rakefile
74
71
  - bin/console
75
72
  - bin/setup
76
73
  - exe/aoc
77
74
  - lib/advent_of_code_generator.rb
78
75
  - lib/advent_of_code_generator/cli.rb
79
76
  - lib/advent_of_code_generator/generator.rb
77
+ - lib/advent_of_code_generator/html_parser.rb
80
78
  - lib/advent_of_code_generator/scraper.rb
81
79
  homepage: https://github.com/cheddachedda/advent_of_code_generator
82
80
  licenses: []
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- --require spec_helper
data/.rubocop.yml DELETED
@@ -1,20 +0,0 @@
1
- require:
2
- - rubocop-rake
3
- - rubocop-rspec
4
-
5
- AllCops:
6
- DisplayCopNames: true
7
- NewCops: enable
8
- TargetRubyVersion: 3.3
9
-
10
- Metrics/MethodLength:
11
- CountAsOne: heredoc
12
-
13
- Style/StringLiterals:
14
- EnforcedStyle: double_quotes
15
-
16
- Style/StringLiteralsInInterpolation:
17
- EnforcedStyle: double_quotes
18
-
19
- RSpec/ExampleLength:
20
- Enabled: false
data/Rakefile DELETED
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- require "rubocop/rake_task"
9
-
10
- RuboCop::RakeTask.new
11
-
12
- task default: %i[spec rubocop]