aoc_cli 0.2.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) 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/Gemfile +8 -0
  6. data/Gemfile.lock +187 -0
  7. data/README.md +88 -282
  8. data/Rakefile +9 -2
  9. data/Steepfile +13 -0
  10. data/aoc_cli.gemspec +36 -26
  11. data/db/migrate/1_create_events.rb +14 -0
  12. data/db/migrate/2_create_puzzles.rb +21 -0
  13. data/db/migrate/3_create_stats.rb +19 -0
  14. data/db/migrate/4_create_attempts.rb +19 -0
  15. data/db/migrate/5_create_locations.rb +17 -0
  16. data/db/migrate/6_create_puzzle_dir_sync_logs.rb +18 -0
  17. data/exe/aoc +5 -0
  18. data/lib/aoc_cli/components/attempts_table.erb +5 -0
  19. data/lib/aoc_cli/components/attempts_table.rb +58 -0
  20. data/lib/aoc_cli/components/docs_component.erb +19 -0
  21. data/lib/aoc_cli/components/docs_component.rb +41 -0
  22. data/lib/aoc_cli/components/errors_component.erb +8 -0
  23. data/lib/aoc_cli/components/errors_component.rb +36 -0
  24. data/lib/aoc_cli/components/progress_table.erb +1 -0
  25. data/lib/aoc_cli/components/progress_table.rb +43 -0
  26. data/lib/aoc_cli/components/puzzle_sync_component.erb +2 -0
  27. data/lib/aoc_cli/components/puzzle_sync_component.rb +26 -0
  28. data/lib/aoc_cli/configurators/session_configurator.rb +7 -0
  29. data/lib/aoc_cli/controllers/application_controller.rb +27 -0
  30. data/lib/aoc_cli/controllers/concerns/error_concern.rb +17 -0
  31. data/lib/aoc_cli/controllers/concerns/location_concern.rb +79 -0
  32. data/lib/aoc_cli/controllers/default_controller.rb +9 -0
  33. data/lib/aoc_cli/controllers/event_controller.rb +35 -0
  34. data/lib/aoc_cli/controllers/help/event_controller.rb +11 -0
  35. data/lib/aoc_cli/controllers/help/puzzle_controller.rb +13 -0
  36. data/lib/aoc_cli/controllers/puzzle_controller.rb +39 -0
  37. data/lib/aoc_cli/core/attempt_parser.rb +69 -0
  38. data/lib/aoc_cli/core/processor.rb +32 -0
  39. data/lib/aoc_cli/core/repository.rb +74 -0
  40. data/lib/aoc_cli/core/request.rb +37 -0
  41. data/lib/aoc_cli/core/resource.rb +39 -0
  42. data/lib/aoc_cli/core/stats_parser.rb +43 -0
  43. data/lib/aoc_cli/helpers/table_generator.rb +64 -0
  44. data/lib/aoc_cli/helpers/view_helper.rb +35 -0
  45. data/lib/aoc_cli/models/attempt.rb +67 -0
  46. data/lib/aoc_cli/models/event.rb +9 -0
  47. data/lib/aoc_cli/models/location.rb +24 -0
  48. data/lib/aoc_cli/models/puzzle.rb +28 -0
  49. data/lib/aoc_cli/models/puzzle_dir_sync_log.rb +14 -0
  50. data/lib/aoc_cli/models/stats.rb +43 -0
  51. data/lib/aoc_cli/presenters/attempt_presenter.rb +29 -0
  52. data/lib/aoc_cli/presenters/puzzle_presenter.rb +29 -0
  53. data/lib/aoc_cli/presenters/stats_presenter.rb +32 -0
  54. data/lib/aoc_cli/processors/event_initialiser.rb +64 -0
  55. data/lib/aoc_cli/processors/puzzle_dir_synchroniser.rb +80 -0
  56. data/lib/aoc_cli/processors/puzzle_initialiser.rb +91 -0
  57. data/lib/aoc_cli/processors/puzzle_refresher.rb +27 -0
  58. data/lib/aoc_cli/processors/resource_attacher.rb +22 -0
  59. data/lib/aoc_cli/processors/solution_poster.rb +72 -0
  60. data/lib/aoc_cli/processors/stats_initialiser.rb +36 -0
  61. data/lib/aoc_cli/processors/stats_refresher.rb +23 -0
  62. data/lib/aoc_cli/validators/collection_type_validator.rb +57 -0
  63. data/lib/aoc_cli/validators/event_year_validator.rb +42 -0
  64. data/lib/aoc_cli/validators/included_validator.rb +21 -0
  65. data/lib/aoc_cli/validators/integer_validator.rb +32 -0
  66. data/lib/aoc_cli/validators/path_validator.rb +39 -0
  67. data/lib/aoc_cli/validators/type_validator.rb +54 -0
  68. data/lib/aoc_cli/version.rb +1 -1
  69. data/lib/aoc_cli/views/event/attach.erb +3 -0
  70. data/lib/aoc_cli/views/event/init.erb +3 -0
  71. data/lib/aoc_cli/views/help/event/attach.erb +32 -0
  72. data/lib/aoc_cli/views/help/event/init.erb +38 -0
  73. data/lib/aoc_cli/views/help/event/progress.erb +12 -0
  74. data/lib/aoc_cli/views/help/puzzle/attempts.erb +12 -0
  75. data/lib/aoc_cli/views/help/puzzle/init.erb +31 -0
  76. data/lib/aoc_cli/views/help/puzzle/solve.erb +33 -0
  77. data/lib/aoc_cli/views/help/puzzle/sync.erb +32 -0
  78. data/lib/aoc_cli/views/puzzle/init.erb +3 -0
  79. data/lib/aoc_cli/views/puzzle/solve.erb +10 -0
  80. data/lib/aoc_cli.rb +32 -16
  81. data/rbs_collection.lock.yaml +168 -0
  82. data/rbs_collection.yaml +28 -0
  83. data/sig/aoc_cli/components/attempts_table.rbs +29 -0
  84. data/sig/aoc_cli/components/docs_component.rbs +15 -0
  85. data/sig/aoc_cli/components/errors_component.rbs +19 -0
  86. data/sig/aoc_cli/components/progress_table.rbs +28 -0
  87. data/sig/aoc_cli/components/puzzle_sync_component.rbs +19 -0
  88. data/sig/aoc_cli/configurators/session_configurator.rbs +7 -0
  89. data/sig/aoc_cli/controllers/application_controller.rbs +12 -0
  90. data/sig/aoc_cli/controllers/concerns/error_concern.rbs +9 -0
  91. data/sig/aoc_cli/controllers/concerns/location_concern.rbs +35 -0
  92. data/sig/aoc_cli/controllers/default_controller.rbs +7 -0
  93. data/sig/aoc_cli/controllers/event_controller.rbs +18 -0
  94. data/sig/aoc_cli/controllers/help/event_controller.rbs +11 -0
  95. data/sig/aoc_cli/controllers/help/puzzle_controller.rbs +13 -0
  96. data/sig/aoc_cli/controllers/puzzle_controller.rbs +15 -0
  97. data/sig/aoc_cli/core/attempt_parser.rbs +41 -0
  98. data/sig/aoc_cli/core/processor.rbs +25 -0
  99. data/sig/aoc_cli/core/repository.rbs +25 -0
  100. data/sig/aoc_cli/core/request.rbs +29 -0
  101. data/sig/aoc_cli/core/resource.rbs +25 -0
  102. data/sig/aoc_cli/core/stats_parser.rbs +23 -0
  103. data/sig/aoc_cli/helpers/table_generator.rbs +36 -0
  104. data/sig/aoc_cli/helpers/view_helper.rbs +15 -0
  105. data/sig/aoc_cli/models/attempt.rbs +35 -0
  106. data/sig/aoc_cli/models/event.rbs +17 -0
  107. data/sig/aoc_cli/models/location.rbs +19 -0
  108. data/sig/aoc_cli/models/puzzle.rbs +28 -0
  109. data/sig/aoc_cli/models/puzzle_dir_sync_log.rbs +11 -0
  110. data/sig/aoc_cli/models/stats.rbs +53 -0
  111. data/sig/aoc_cli/presenters/attempt_presenter.rbs +13 -0
  112. data/sig/aoc_cli/presenters/puzzle_presenter.rbs +19 -0
  113. data/sig/aoc_cli/presenters/stats_presenter.rbs +19 -0
  114. data/sig/aoc_cli/processors/event_initialiser.rbs +26 -0
  115. data/sig/aoc_cli/processors/puzzle_dir_synchroniser.rbs +40 -0
  116. data/sig/aoc_cli/processors/puzzle_initialiser.rbs +37 -0
  117. data/sig/aoc_cli/processors/puzzle_refresher.rbs +21 -0
  118. data/sig/aoc_cli/processors/resource_attacher.rbs +16 -0
  119. data/sig/aoc_cli/processors/solution_poster.rbs +34 -0
  120. data/sig/aoc_cli/processors/stats_initialiser.rbs +15 -0
  121. data/sig/aoc_cli/processors/stats_refresher.rbs +19 -0
  122. data/sig/aoc_cli/validators/collection_type_validator.rbs +24 -0
  123. data/sig/aoc_cli/validators/event_year_validator.rbs +19 -0
  124. data/sig/aoc_cli/validators/included_validator.rbs +11 -0
  125. data/sig/aoc_cli/validators/integer_validator.rbs +15 -0
  126. data/sig/aoc_cli/validators/path_validator.rbs +17 -0
  127. data/sig/aoc_cli/validators/type_validator.rbs +22 -0
  128. data/sig/aoc_cli.rbs +6 -0
  129. data/sig/http.rbs +3 -0
  130. data/sig/kangaru.rbs +5 -0
  131. data/sig/nokogiri.rbs +3 -0
  132. data/sig/reverse_markdown.rbs +3 -0
  133. metadata +142 -34
  134. data/.gitignore +0 -5
  135. data/bin/aoc +0 -4
  136. data/bin/console +0 -15
  137. data/bin/setup +0 -7
  138. data/lib/aoc_cli/commands.rb +0 -232
  139. data/lib/aoc_cli/database.rb +0 -224
  140. data/lib/aoc_cli/day.rb +0 -124
  141. data/lib/aoc_cli/db/reddit.db +0 -0
  142. data/lib/aoc_cli/errors.rb +0 -275
  143. data/lib/aoc_cli/files.rb +0 -163
  144. data/lib/aoc_cli/help.rb +0 -77
  145. data/lib/aoc_cli/interface.rb +0 -81
  146. data/lib/aoc_cli/paths.rb +0 -101
  147. data/lib/aoc_cli/solve.rb +0 -104
  148. data/lib/aoc_cli/tables.rb +0 -138
  149. data/lib/aoc_cli/tools.rb +0 -120
  150. data/lib/aoc_cli/year.rb +0 -116
  151. 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