aoc_cli 0.2.2 → 1.0.0

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.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.rubocop.yml +88 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +8 -0
  7. data/Gemfile.lock +187 -0
  8. data/README.md +88 -282
  9. data/Rakefile +9 -2
  10. data/Steepfile +13 -0
  11. data/aoc_cli.gemspec +36 -26
  12. data/db/migrate/1_create_events.rb +14 -0
  13. data/db/migrate/2_create_puzzles.rb +21 -0
  14. data/db/migrate/3_create_stats.rb +19 -0
  15. data/db/migrate/4_create_attempts.rb +19 -0
  16. data/db/migrate/5_create_locations.rb +17 -0
  17. data/db/migrate/6_create_puzzle_dir_sync_logs.rb +18 -0
  18. data/exe/aoc +5 -0
  19. data/lib/aoc_cli/components/attempts_table.erb +5 -0
  20. data/lib/aoc_cli/components/attempts_table.rb +58 -0
  21. data/lib/aoc_cli/components/docs_component.erb +19 -0
  22. data/lib/aoc_cli/components/docs_component.rb +41 -0
  23. data/lib/aoc_cli/components/errors_component.erb +8 -0
  24. data/lib/aoc_cli/components/errors_component.rb +36 -0
  25. data/lib/aoc_cli/components/progress_table.erb +1 -0
  26. data/lib/aoc_cli/components/progress_table.rb +43 -0
  27. data/lib/aoc_cli/components/puzzle_sync_component.erb +2 -0
  28. data/lib/aoc_cli/components/puzzle_sync_component.rb +26 -0
  29. data/lib/aoc_cli/configurators/session_configurator.rb +7 -0
  30. data/lib/aoc_cli/controllers/application_controller.rb +27 -0
  31. data/lib/aoc_cli/controllers/concerns/error_concern.rb +17 -0
  32. data/lib/aoc_cli/controllers/concerns/location_concern.rb +79 -0
  33. data/lib/aoc_cli/controllers/default_controller.rb +9 -0
  34. data/lib/aoc_cli/controllers/event_controller.rb +35 -0
  35. data/lib/aoc_cli/controllers/help/event_controller.rb +11 -0
  36. data/lib/aoc_cli/controllers/help/puzzle_controller.rb +13 -0
  37. data/lib/aoc_cli/controllers/puzzle_controller.rb +39 -0
  38. data/lib/aoc_cli/core/attempt_parser.rb +69 -0
  39. data/lib/aoc_cli/core/processor.rb +32 -0
  40. data/lib/aoc_cli/core/repository.rb +74 -0
  41. data/lib/aoc_cli/core/request.rb +37 -0
  42. data/lib/aoc_cli/core/resource.rb +39 -0
  43. data/lib/aoc_cli/core/stats_parser.rb +43 -0
  44. data/lib/aoc_cli/helpers/table_generator.rb +64 -0
  45. data/lib/aoc_cli/helpers/view_helper.rb +35 -0
  46. data/lib/aoc_cli/models/attempt.rb +67 -0
  47. data/lib/aoc_cli/models/event.rb +9 -0
  48. data/lib/aoc_cli/models/location.rb +24 -0
  49. data/lib/aoc_cli/models/puzzle.rb +28 -0
  50. data/lib/aoc_cli/models/puzzle_dir_sync_log.rb +14 -0
  51. data/lib/aoc_cli/models/stats.rb +43 -0
  52. data/lib/aoc_cli/presenters/attempt_presenter.rb +29 -0
  53. data/lib/aoc_cli/presenters/puzzle_presenter.rb +29 -0
  54. data/lib/aoc_cli/presenters/stats_presenter.rb +32 -0
  55. data/lib/aoc_cli/processors/event_initialiser.rb +64 -0
  56. data/lib/aoc_cli/processors/puzzle_dir_synchroniser.rb +80 -0
  57. data/lib/aoc_cli/processors/puzzle_initialiser.rb +91 -0
  58. data/lib/aoc_cli/processors/puzzle_refresher.rb +27 -0
  59. data/lib/aoc_cli/processors/resource_attacher.rb +22 -0
  60. data/lib/aoc_cli/processors/solution_poster.rb +72 -0
  61. data/lib/aoc_cli/processors/stats_initialiser.rb +36 -0
  62. data/lib/aoc_cli/processors/stats_refresher.rb +23 -0
  63. data/lib/aoc_cli/validators/collection_type_validator.rb +57 -0
  64. data/lib/aoc_cli/validators/event_year_validator.rb +42 -0
  65. data/lib/aoc_cli/validators/included_validator.rb +21 -0
  66. data/lib/aoc_cli/validators/integer_validator.rb +32 -0
  67. data/lib/aoc_cli/validators/path_validator.rb +39 -0
  68. data/lib/aoc_cli/validators/type_validator.rb +54 -0
  69. data/lib/aoc_cli/version.rb +1 -1
  70. data/lib/aoc_cli/views/event/attach.erb +3 -0
  71. data/lib/aoc_cli/views/event/init.erb +3 -0
  72. data/lib/aoc_cli/views/help/event/attach.erb +32 -0
  73. data/lib/aoc_cli/views/help/event/init.erb +38 -0
  74. data/lib/aoc_cli/views/help/event/progress.erb +12 -0
  75. data/lib/aoc_cli/views/help/puzzle/attempts.erb +12 -0
  76. data/lib/aoc_cli/views/help/puzzle/init.erb +31 -0
  77. data/lib/aoc_cli/views/help/puzzle/solve.erb +33 -0
  78. data/lib/aoc_cli/views/help/puzzle/sync.erb +32 -0
  79. data/lib/aoc_cli/views/puzzle/init.erb +3 -0
  80. data/lib/aoc_cli/views/puzzle/solve.erb +10 -0
  81. data/lib/aoc_cli.rb +32 -16
  82. data/rbs_collection.lock.yaml +168 -0
  83. data/rbs_collection.yaml +28 -0
  84. data/sig/aoc_cli/components/attempts_table.rbs +29 -0
  85. data/sig/aoc_cli/components/docs_component.rbs +15 -0
  86. data/sig/aoc_cli/components/errors_component.rbs +19 -0
  87. data/sig/aoc_cli/components/progress_table.rbs +28 -0
  88. data/sig/aoc_cli/components/puzzle_sync_component.rbs +19 -0
  89. data/sig/aoc_cli/configurators/session_configurator.rbs +7 -0
  90. data/sig/aoc_cli/controllers/application_controller.rbs +12 -0
  91. data/sig/aoc_cli/controllers/concerns/error_concern.rbs +9 -0
  92. data/sig/aoc_cli/controllers/concerns/location_concern.rbs +35 -0
  93. data/sig/aoc_cli/controllers/default_controller.rbs +7 -0
  94. data/sig/aoc_cli/controllers/event_controller.rbs +18 -0
  95. data/sig/aoc_cli/controllers/help/event_controller.rbs +11 -0
  96. data/sig/aoc_cli/controllers/help/puzzle_controller.rbs +13 -0
  97. data/sig/aoc_cli/controllers/puzzle_controller.rbs +15 -0
  98. data/sig/aoc_cli/core/attempt_parser.rbs +41 -0
  99. data/sig/aoc_cli/core/processor.rbs +25 -0
  100. data/sig/aoc_cli/core/repository.rbs +25 -0
  101. data/sig/aoc_cli/core/request.rbs +29 -0
  102. data/sig/aoc_cli/core/resource.rbs +25 -0
  103. data/sig/aoc_cli/core/stats_parser.rbs +23 -0
  104. data/sig/aoc_cli/helpers/table_generator.rbs +36 -0
  105. data/sig/aoc_cli/helpers/view_helper.rbs +15 -0
  106. data/sig/aoc_cli/models/attempt.rbs +35 -0
  107. data/sig/aoc_cli/models/event.rbs +17 -0
  108. data/sig/aoc_cli/models/location.rbs +19 -0
  109. data/sig/aoc_cli/models/puzzle.rbs +28 -0
  110. data/sig/aoc_cli/models/puzzle_dir_sync_log.rbs +11 -0
  111. data/sig/aoc_cli/models/stats.rbs +53 -0
  112. data/sig/aoc_cli/presenters/attempt_presenter.rbs +13 -0
  113. data/sig/aoc_cli/presenters/puzzle_presenter.rbs +19 -0
  114. data/sig/aoc_cli/presenters/stats_presenter.rbs +19 -0
  115. data/sig/aoc_cli/processors/event_initialiser.rbs +26 -0
  116. data/sig/aoc_cli/processors/puzzle_dir_synchroniser.rbs +40 -0
  117. data/sig/aoc_cli/processors/puzzle_initialiser.rbs +37 -0
  118. data/sig/aoc_cli/processors/puzzle_refresher.rbs +21 -0
  119. data/sig/aoc_cli/processors/resource_attacher.rbs +16 -0
  120. data/sig/aoc_cli/processors/solution_poster.rbs +34 -0
  121. data/sig/aoc_cli/processors/stats_initialiser.rbs +15 -0
  122. data/sig/aoc_cli/processors/stats_refresher.rbs +19 -0
  123. data/sig/aoc_cli/validators/collection_type_validator.rbs +24 -0
  124. data/sig/aoc_cli/validators/event_year_validator.rbs +19 -0
  125. data/sig/aoc_cli/validators/included_validator.rbs +11 -0
  126. data/sig/aoc_cli/validators/integer_validator.rbs +15 -0
  127. data/sig/aoc_cli/validators/path_validator.rbs +17 -0
  128. data/sig/aoc_cli/validators/type_validator.rbs +22 -0
  129. data/sig/aoc_cli.rbs +6 -0
  130. data/sig/http.rbs +3 -0
  131. data/sig/kangaru.rbs +5 -0
  132. data/sig/nokogiri.rbs +3 -0
  133. data/sig/reverse_markdown.rbs +3 -0
  134. metadata +142 -34
  135. data/.gitignore +0 -5
  136. data/bin/aoc +0 -4
  137. data/bin/console +0 -15
  138. data/bin/setup +0 -7
  139. data/lib/aoc_cli/commands.rb +0 -232
  140. data/lib/aoc_cli/database.rb +0 -224
  141. data/lib/aoc_cli/day.rb +0 -124
  142. data/lib/aoc_cli/db/reddit.db +0 -0
  143. data/lib/aoc_cli/errors.rb +0 -275
  144. data/lib/aoc_cli/files.rb +0 -163
  145. data/lib/aoc_cli/help.rb +0 -77
  146. data/lib/aoc_cli/interface.rb +0 -81
  147. data/lib/aoc_cli/paths.rb +0 -101
  148. data/lib/aoc_cli/solve.rb +0 -104
  149. data/lib/aoc_cli/tables.rb +0 -138
  150. data/lib/aoc_cli/tools.rb +0 -120
  151. data/lib/aoc_cli/year.rb +0 -116
  152. data/sample/aoc.rc +0 -21
@@ -0,0 +1,25 @@
1
+ module AocCli
2
+ module Core
3
+ class Processor
4
+ extend Forwardable
5
+
6
+ include Kangaru::Attributable
7
+ extend Kangaru::Attributable::ClassMethods
8
+
9
+ include Kangaru::Validatable
10
+ extend Kangaru::Validatable::ClassMethods
11
+
12
+ class Error < StandardError
13
+ attr_reader processor: Processor
14
+
15
+ def initialize: (Processor) -> void
16
+ end
17
+
18
+ def run: -> untyped
19
+
20
+ def run!: -> untyped
21
+
22
+ def self.run!: (**untyped) -> untyped
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module AocCli
2
+ module Core
3
+ class Repository
4
+ HOST: String
5
+
6
+ RESOURCES: Hash[Symbol, Hash[Symbol, untyped]]
7
+
8
+ def self.get_stats: (year: Integer) -> Hash[Symbol, Integer]
9
+
10
+ def self.get_puzzle: (year: Integer, day: Integer) -> String
11
+
12
+ def self.get_input: (year: Integer, day: Integer) -> String
13
+
14
+ def self.post_solution: (
15
+ year: Integer, day: Integer, level: Integer, answer: untyped
16
+ ) -> Hash[Symbol, untyped]
17
+
18
+ private
19
+
20
+ def self.build_resource: (Symbol, **untyped) -> Resource
21
+
22
+ def self.format_url: (String, **untyped) -> String
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ module AocCli
2
+ module Core
3
+ class Request
4
+ extend Forwardable
5
+
6
+ attr_reader client: HTTP::Client
7
+
8
+ def initialize: (token: String) -> void
9
+
10
+ def get: (String) -> HTTP::Response
11
+
12
+ def post: (String, **untyped) -> HTTP::Response
13
+
14
+ def self.build: -> Request
15
+
16
+ def self.get: (String) -> HTTP::Response
17
+
18
+ def self.post: (String, **untyped) -> HTTP::Response
19
+
20
+ class ::Class
21
+ def def_delegators: (Symbol, *Symbol) -> void
22
+ end
23
+
24
+ private
25
+
26
+ def setup_client!: (String) -> HTTP::Client
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ module AocCli
2
+ module Core
3
+ class Resource
4
+ attr_reader url: String
5
+ attr_reader scope: String?
6
+ attr_reader method: Symbol
7
+ attr_reader params: Hash[Symbol, untyped]
8
+
9
+ def initialize: (
10
+ url: String,
11
+ ?scope: String?,
12
+ ?method: Symbol,
13
+ ?params: Hash[Symbol, untyped]
14
+ ) -> void
15
+
16
+ def fetch: -> String
17
+
18
+ def fetch_markdown: -> String
19
+
20
+ private
21
+
22
+ def response: -> String
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ module AocCli
2
+ module Core
3
+ class StatsParser
4
+ DAY_CLASS_PREFIX: String
5
+ ONE_STAR_CLASS: String
6
+ TWO_STARS_CLASS: String
7
+
8
+ attr_reader calendar_html: String
9
+
10
+ def initialize: (String) -> void
11
+
12
+ def to_h: -> Hash[Symbol, Integer]
13
+
14
+ private
15
+
16
+ def calendar_link_classes: -> Array[Array[String]]
17
+
18
+ def calendar_links: -> Nokogiri::XML::NodeSet
19
+
20
+ def count_stars: (Array[String]) -> Integer
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,36 @@
1
+ module AocCli
2
+ module Helpers
3
+ class TableGenerator
4
+ type matrix[T] = Array[Array[T]]
5
+
6
+ include Kangaru::Validatable
7
+ extend Kangaru::Validatable::ClassMethods
8
+
9
+ attr_reader rows: matrix[String]
10
+ attr_reader gap: Integer
11
+ attr_reader indent: Integer
12
+
13
+ def initialize: (
14
+ rows: matrix[String],
15
+ ?gap: Integer,
16
+ ?indent: Integer
17
+ ) -> void
18
+
19
+ def validate!: -> void
20
+
21
+ def generate!: -> String
22
+
23
+ private
24
+
25
+ CELL_GAP: Integer
26
+
27
+ attr_reader column_widths: Array[Integer]
28
+
29
+ def space: (Integer) -> String
30
+
31
+ def format_row!: (Array[String]) -> String
32
+
33
+ def validate_rows_are_same_length!: -> void
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ module AocCli
2
+ module Helpers
3
+ module ViewHelper
4
+ def main_header: -> String
5
+
6
+ def heading: (String) -> String
7
+
8
+ def success_tag: -> String
9
+
10
+ def table_for: (*Array[String], ?gap: Integer, ?indent: Integer) -> String
11
+
12
+ def wrap_text: (String, ?width: Integer, ?indent: Integer) -> String
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,35 @@
1
+ module AocCli
2
+ class Attempt < Kangaru::Model
3
+ attr_accessor id: Integer
4
+ attr_accessor level: Integer
5
+ attr_accessor answer: String
6
+ attr_accessor status: Symbol
7
+ attr_accessor hint: Symbol?
8
+ attr_accessor wait_time: Integer?
9
+ attr_accessor created_at: Time
10
+ attr_accessor updated_at: Time
11
+
12
+ attr_accessor puzzle: Puzzle
13
+ attr_accessor puzzle_dataset: Sequel::Dataset
14
+
15
+ attr_reader presenter: Presenters::AttemptPresenter
16
+
17
+ def incorrect?: -> bool
18
+ def correct?: -> bool
19
+ def rate_limited?: -> bool
20
+ def wrong_level?: -> bool
21
+
22
+ def too_low?: -> bool
23
+ def too_high?: -> bool
24
+
25
+ private
26
+
27
+ def validate_hint_not_set!: -> void
28
+
29
+ def validate_hint!: -> void
30
+
31
+ def validate_wait_time_not_set!: -> void
32
+
33
+ def validate_wait_time_integer!: -> void
34
+ end
35
+ end
@@ -0,0 +1,17 @@
1
+ module AocCli
2
+ class Event < Kangaru::Model
3
+ attr_accessor id: Integer
4
+ attr_accessor year: Integer
5
+ attr_accessor created_at: Time
6
+ attr_accessor updated_at: Time
7
+
8
+ attr_accessor puzzles: Array[Puzzle]
9
+ attr_accessor puzzles_dataset: Sequel::Dataset
10
+
11
+ attr_accessor stats: Stats
12
+ attr_accessor stats_dataset: Sequel::Dataset
13
+
14
+ attr_accessor location: Location
15
+ attr_accessor location_dataset: Sequel::Dataset
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module AocCli
2
+ class Location < Kangaru::Model
3
+ type resource = (Event | Puzzle)
4
+
5
+ attr_accessor id: Integer
6
+ attr_accessor path: String
7
+ attr_accessor resource: resource
8
+ attr_accessor created_at: Time
9
+ attr_accessor updated_at: Time
10
+
11
+ def exists?: -> bool
12
+
13
+ def event_dir?: -> bool
14
+
15
+ def puzzle_dir?: -> bool
16
+
17
+ def to_pathname: -> Pathname
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ module AocCli
2
+ class Puzzle < Kangaru::Model
3
+ extend Forwardable
4
+
5
+ attr_accessor id: Integer
6
+ attr_accessor event: Event
7
+ attr_accessor day: Integer
8
+ attr_accessor content: String
9
+ attr_accessor input: String
10
+ attr_accessor created_at: Time
11
+ attr_accessor updated_at: Time
12
+ attr_accessor part_one_completed_at: Time
13
+ attr_accessor part_two_completed_at: Time
14
+
15
+ attr_accessor location: Location
16
+ attr_accessor location_dataset: Sequel::Dataset
17
+
18
+ attr_accessor attempts: Array[Attempt]
19
+ attr_accessor attempts_dataset: Sequel::Dataset
20
+
21
+ # Delegated to event
22
+ def year: -> Integer
23
+
24
+ attr_reader presenter: Presenters::PuzzlePresenter
25
+
26
+ def mark_complete!: (Integer) -> void
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ module AocCli
2
+ class PuzzleDirSyncLog < Kangaru::Model
3
+ attr_accessor id: Integer
4
+ attr_accessor puzzle: Puzzle
5
+ attr_accessor location: Location
6
+ attr_accessor puzzle_status: Symbol
7
+ attr_accessor input_status: Symbol
8
+
9
+ STATUS_ENUM: Hash[Symbol, Integer]
10
+ end
11
+ end
@@ -0,0 +1,53 @@
1
+ module AocCli
2
+ class Stats < Kangaru::Model
3
+ extend Forwardable
4
+
5
+ attr_accessor id: Integer
6
+ attr_accessor day_1: Integer
7
+ attr_accessor day_2: Integer
8
+ attr_accessor day_3: Integer
9
+ attr_accessor day_4: Integer
10
+ attr_accessor day_5: Integer
11
+ attr_accessor day_6: Integer
12
+ attr_accessor day_7: Integer
13
+ attr_accessor day_8: Integer
14
+ attr_accessor day_9: Integer
15
+ attr_accessor day_10: Integer
16
+ attr_accessor day_11: Integer
17
+ attr_accessor day_12: Integer
18
+ attr_accessor day_13: Integer
19
+ attr_accessor day_14: Integer
20
+ attr_accessor day_15: Integer
21
+ attr_accessor day_16: Integer
22
+ attr_accessor day_17: Integer
23
+ attr_accessor day_18: Integer
24
+ attr_accessor day_19: Integer
25
+ attr_accessor day_20: Integer
26
+ attr_accessor day_21: Integer
27
+ attr_accessor day_22: Integer
28
+ attr_accessor day_23: Integer
29
+ attr_accessor day_24: Integer
30
+ attr_accessor day_25: Integer
31
+ attr_accessor created_at: Time
32
+ attr_accessor updated_at: Time
33
+ attr_accessor completed_at: Time
34
+
35
+ attr_accessor event: Event
36
+ attr_accessor event_dataset: Sequel::Dataset
37
+
38
+ # Delegated to event
39
+ def year: -> Integer
40
+
41
+ attr_reader presenter: Presenters::StatsPresenter
42
+
43
+ def total: -> Integer
44
+
45
+ def progress: (Integer) -> Integer
46
+
47
+ def current_level: (Integer) -> Integer?
48
+
49
+ def complete?: (Integer) -> bool
50
+
51
+ def advance_progress!: (Integer) -> void
52
+ end
53
+ end
@@ -0,0 +1,13 @@
1
+ module AocCli
2
+ module Presenters
3
+ class AttemptPresenter
4
+ attr_reader attempt: Attempt
5
+
6
+ def initialize: (Attempt) -> void
7
+
8
+ def status: -> String
9
+
10
+ def hint: -> String
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module AocCli
2
+ module Presenters
3
+ class PuzzlePresenter
4
+ attr_reader puzzle: Puzzle
5
+
6
+ def initialize: (Puzzle) -> void
7
+
8
+ def date: -> String
9
+
10
+ def puzzle_filename: -> String
11
+
12
+ def input_filename: -> String
13
+
14
+ private
15
+
16
+ def formatted_day: -> String
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module AocCli
2
+ module Presenters
3
+ class StatsPresenter
4
+ attr_reader stats: Stats
5
+
6
+ def initialize: (Stats) -> void
7
+
8
+ def total_progress: -> String
9
+
10
+ def progress_icons: (Integer) -> String
11
+
12
+ module Icons
13
+ INCOMPLETE: String
14
+ HALF_COMPLETE: String
15
+ COMPLETE: String
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ module AocCli
2
+ module Processors
3
+ class EventInitialiser < Core::Processor
4
+ attr_accessor year: Integer
5
+ attr_accessor dir: String
6
+
7
+ def self.run!: (year: untyped, dir: untyped) -> Event
8
+
9
+ private
10
+
11
+ attr_reader event_dir: Pathname
12
+
13
+ def create_event!: -> Event
14
+
15
+ def initialise_stats!: (Event) -> void
16
+
17
+ def make_event_directory!: -> void
18
+
19
+ def attach_event!: (Event) -> void
20
+
21
+ def validate_event_dir_does_not_exist!: -> void
22
+
23
+ def validate_event_not_already_initialised!: -> void
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,40 @@
1
+ module AocCli
2
+ module Processors
3
+ class PuzzleDirSynchroniser < Core::Processor
4
+ attr_accessor puzzle: Puzzle
5
+ attr_accessor location: Location
6
+ attr_accessor skip_cache: bool
7
+
8
+ def self.run!: (
9
+ puzzle: untyped,
10
+ location: untyped,
11
+ ?skip_cache: untyped
12
+ )-> PuzzleDirSyncLog
13
+
14
+ private
15
+
16
+ # Delegated to Puzzle
17
+ def year: -> Integer
18
+ def day: -> Integer
19
+ def presenter: -> Presenters::PuzzlePresenter
20
+
21
+ # Delegated to Presenter
22
+ def puzzle_filename: -> String
23
+ def input_filename: -> String
24
+
25
+ attr_reader puzzle_dir: Pathname
26
+ attr_reader puzzle_file: Pathname
27
+ attr_reader input_file: Pathname
28
+
29
+ def refresh_puzzle!: -> void
30
+
31
+ def create_puzzle_dir_sync_log!: -> PuzzleDirSyncLog
32
+
33
+ def puzzle_status: -> Symbol
34
+
35
+ def input_status: -> Symbol
36
+
37
+ def validate_puzzle_dir_exists!: -> void
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,37 @@
1
+ module AocCli
2
+ module Processors
3
+ class PuzzleInitialiser < Core::Processor
4
+ attr_accessor event: Event
5
+ attr_accessor day: Integer
6
+
7
+ def run: -> Puzzle
8
+
9
+ def self.run!: (event: untyped, day: untyped) -> Puzzle
10
+
11
+ private
12
+
13
+ # Delegated to Event
14
+ def year: -> Integer
15
+
16
+ attr_reader event_dir: Pathname
17
+ attr_reader puzzle_dir: Pathname
18
+ attr_reader existing_puzzle: Puzzle?
19
+
20
+ def fetch_content!: -> String
21
+
22
+ def fetch_input!: -> String
23
+
24
+ def create_or_update_puzzle!: (String, String) -> Puzzle
25
+
26
+ def attach_puzzle_dir!: (Puzzle) -> Location
27
+
28
+ def write_puzzle_files!: (Puzzle, Location) -> PuzzleDirSyncLog
29
+
30
+ def validate_event_location_set!: -> void
31
+
32
+ def validate_event_dir_exists!: -> void
33
+
34
+ def validate_puzzle_dir_does_not_exist!: -> void
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ module AocCli
2
+ module Processors
3
+ class PuzzleRefresher < Core::Processor
4
+ attr_accessor puzzle: Puzzle
5
+
6
+ def self.run!: (puzzle: Puzzle) -> Puzzle
7
+
8
+ private
9
+
10
+ extend Forwardable
11
+
12
+ def year: -> Integer
13
+
14
+ def day: -> Integer
15
+
16
+ def content: -> String
17
+
18
+ def input: -> String
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module AocCli
2
+ module Processors
3
+ class ResourceAttacher < Core::Processor
4
+ type resource = Event | Puzzle
5
+
6
+ attr_accessor resource: resource
7
+ attr_accessor path: String
8
+
9
+ def run: -> Location
10
+
11
+ def self.run!: (resource: resource, path: String) -> Location
12
+
13
+ def location: -> Location?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,34 @@
1
+ module AocCli
2
+ module Processors
3
+ class SolutionPoster < Core::Processor
4
+ attr_accessor puzzle: Puzzle
5
+ attr_accessor answer: Integer
6
+
7
+ def run: -> Attempt
8
+
9
+ def self.run!: (puzzle: untyped, answer: untyped) -> Attempt
10
+
11
+ private
12
+
13
+ # Delegated to @puzzle
14
+ def event: -> Event
15
+ def location: -> Location
16
+ def year: -> Integer
17
+ def day: -> Integer
18
+
19
+ attr_reader level: Integer
20
+
21
+ def post_solution!: -> Hash[Symbol, untyped]
22
+
23
+ def create_attempt!: (Hash[Symbol, untyped]) -> Attempt
24
+
25
+ def advance_puzzle!: -> void
26
+
27
+ def validate_puzzle_location_set!: -> void
28
+
29
+ def validate_stats_associated!: -> void
30
+
31
+ def validate_puzzle_not_complete!: -> void
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ module AocCli
2
+ module Processors
3
+ class StatsInitialiser < Core::Processor
4
+ attr_accessor event: Event
5
+
6
+ private
7
+
8
+ BLANK_STATS: Hash[Symbol, Integer]
9
+
10
+ def fetch_stats!: -> Hash[Symbol, Integer]
11
+
12
+ def validate_stats_do_not_exist!: -> void
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ module AocCli
2
+ module Processors
3
+ class StatsRefresher < Core::Processor
4
+ extend Forwardable
5
+
6
+ attr_accessor stats: Stats
7
+
8
+ def run: -> Stats
9
+
10
+ def self.run!: (stats: Stats) -> Stats
11
+
12
+ private
13
+
14
+ def year: -> Integer
15
+
16
+ def updated_stats: -> Hash[Symbol, Integer]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module AocCli
2
+ module Validators
3
+ class CollectionTypeValidator < Kangaru::Validator
4
+
5
+ private
6
+
7
+ VALIDATION_RULES: Array[Symbol]
8
+
9
+ ERROR: String
10
+
11
+ attr_reader validation_rule: Symbol
12
+
13
+ attr_reader target_type: Class
14
+
15
+ def validate_preconditions!: -> void
16
+
17
+ def validate_all_elements!: -> void
18
+
19
+ def validate_any_elements!: -> void
20
+
21
+ def validate_none_elements!: -> void
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ module AocCli
2
+ module Validators
3
+ class EventYearValidator < Kangaru::Validator
4
+ def validate: -> untyped
5
+
6
+ private
7
+
8
+ ERRORS: Hash[Symbol, String]
9
+
10
+ MIN_YEAR: Integer
11
+
12
+ def max_year: -> untyped
13
+
14
+ def in_december?: -> bool
15
+
16
+ def validate_year!: -> void
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module AocCli
2
+ module Validators
3
+ class IncludedValidator < Kangaru::Validator
4
+ private
5
+
6
+ ERRORS: Hash[Symbol, String]
7
+
8
+ def allowed_values: -> Array[untyped]
9
+ end
10
+ end
11
+ end