aoc_cli 0.2.3 → 1.0.1

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 (157) 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/db/migrate/7_create_progresses.rb +17 -0
  18. data/db/migrate/8_remove_legacy_timestamps.rb +8 -0
  19. data/exe/aoc +5 -0
  20. data/lib/aoc_cli/components/attempts_table.erb +5 -0
  21. data/lib/aoc_cli/components/attempts_table.rb +58 -0
  22. data/lib/aoc_cli/components/docs_component.erb +19 -0
  23. data/lib/aoc_cli/components/docs_component.rb +41 -0
  24. data/lib/aoc_cli/components/errors_component.erb +8 -0
  25. data/lib/aoc_cli/components/errors_component.rb +36 -0
  26. data/lib/aoc_cli/components/progress_table.erb +1 -0
  27. data/lib/aoc_cli/components/progress_table.rb +43 -0
  28. data/lib/aoc_cli/components/puzzle_sync_component.erb +2 -0
  29. data/lib/aoc_cli/components/puzzle_sync_component.rb +26 -0
  30. data/lib/aoc_cli/configurators/session_configurator.rb +7 -0
  31. data/lib/aoc_cli/controllers/application_controller.rb +27 -0
  32. data/lib/aoc_cli/controllers/concerns/error_concern.rb +17 -0
  33. data/lib/aoc_cli/controllers/concerns/location_concern.rb +79 -0
  34. data/lib/aoc_cli/controllers/default_controller.rb +9 -0
  35. data/lib/aoc_cli/controllers/event_controller.rb +35 -0
  36. data/lib/aoc_cli/controllers/help/event_controller.rb +11 -0
  37. data/lib/aoc_cli/controllers/help/puzzle_controller.rb +13 -0
  38. data/lib/aoc_cli/controllers/puzzle_controller.rb +39 -0
  39. data/lib/aoc_cli/core/attempt_parser.rb +69 -0
  40. data/lib/aoc_cli/core/processor.rb +32 -0
  41. data/lib/aoc_cli/core/repository.rb +74 -0
  42. data/lib/aoc_cli/core/request.rb +37 -0
  43. data/lib/aoc_cli/core/resource.rb +39 -0
  44. data/lib/aoc_cli/core/stats_parser.rb +43 -0
  45. data/lib/aoc_cli/helpers/table_generator.rb +64 -0
  46. data/lib/aoc_cli/helpers/view_helper.rb +35 -0
  47. data/lib/aoc_cli/models/attempt.rb +67 -0
  48. data/lib/aoc_cli/models/event.rb +9 -0
  49. data/lib/aoc_cli/models/location.rb +24 -0
  50. data/lib/aoc_cli/models/progress.rb +33 -0
  51. data/lib/aoc_cli/models/puzzle.rb +28 -0
  52. data/lib/aoc_cli/models/puzzle_dir_sync_log.rb +14 -0
  53. data/lib/aoc_cli/models/stats.rb +43 -0
  54. data/lib/aoc_cli/presenters/attempt_presenter.rb +29 -0
  55. data/lib/aoc_cli/presenters/puzzle_presenter.rb +29 -0
  56. data/lib/aoc_cli/presenters/stats_presenter.rb +32 -0
  57. data/lib/aoc_cli/processors/event_initialiser.rb +64 -0
  58. data/lib/aoc_cli/processors/progress_syncer.rb +48 -0
  59. data/lib/aoc_cli/processors/puzzle_dir_synchroniser.rb +80 -0
  60. data/lib/aoc_cli/processors/puzzle_initialiser.rb +106 -0
  61. data/lib/aoc_cli/processors/puzzle_refresher.rb +27 -0
  62. data/lib/aoc_cli/processors/resource_attacher.rb +22 -0
  63. data/lib/aoc_cli/processors/solution_poster.rb +72 -0
  64. data/lib/aoc_cli/processors/stats_initialiser.rb +36 -0
  65. data/lib/aoc_cli/processors/stats_refresher.rb +23 -0
  66. data/lib/aoc_cli/validators/collection_type_validator.rb +57 -0
  67. data/lib/aoc_cli/validators/event_year_validator.rb +42 -0
  68. data/lib/aoc_cli/validators/included_validator.rb +21 -0
  69. data/lib/aoc_cli/validators/integer_validator.rb +32 -0
  70. data/lib/aoc_cli/validators/path_validator.rb +39 -0
  71. data/lib/aoc_cli/validators/type_validator.rb +54 -0
  72. data/lib/aoc_cli/version.rb +1 -1
  73. data/lib/aoc_cli/views/event/attach.erb +3 -0
  74. data/lib/aoc_cli/views/event/init.erb +3 -0
  75. data/lib/aoc_cli/views/help/event/attach.erb +32 -0
  76. data/lib/aoc_cli/views/help/event/init.erb +38 -0
  77. data/lib/aoc_cli/views/help/event/progress.erb +12 -0
  78. data/lib/aoc_cli/views/help/puzzle/attempts.erb +12 -0
  79. data/lib/aoc_cli/views/help/puzzle/init.erb +31 -0
  80. data/lib/aoc_cli/views/help/puzzle/solve.erb +33 -0
  81. data/lib/aoc_cli/views/help/puzzle/sync.erb +32 -0
  82. data/lib/aoc_cli/views/puzzle/init.erb +3 -0
  83. data/lib/aoc_cli/views/puzzle/solve.erb +10 -0
  84. data/lib/aoc_cli.rb +36 -16
  85. data/rbs_collection.lock.yaml +168 -0
  86. data/rbs_collection.yaml +28 -0
  87. data/sig/aoc_cli/components/attempts_table.rbs +29 -0
  88. data/sig/aoc_cli/components/docs_component.rbs +15 -0
  89. data/sig/aoc_cli/components/errors_component.rbs +19 -0
  90. data/sig/aoc_cli/components/progress_table.rbs +28 -0
  91. data/sig/aoc_cli/components/puzzle_sync_component.rbs +19 -0
  92. data/sig/aoc_cli/configurators/session_configurator.rbs +7 -0
  93. data/sig/aoc_cli/controllers/application_controller.rbs +12 -0
  94. data/sig/aoc_cli/controllers/concerns/error_concern.rbs +9 -0
  95. data/sig/aoc_cli/controllers/concerns/location_concern.rbs +35 -0
  96. data/sig/aoc_cli/controllers/default_controller.rbs +7 -0
  97. data/sig/aoc_cli/controllers/event_controller.rbs +18 -0
  98. data/sig/aoc_cli/controllers/help/event_controller.rbs +11 -0
  99. data/sig/aoc_cli/controllers/help/puzzle_controller.rbs +13 -0
  100. data/sig/aoc_cli/controllers/puzzle_controller.rbs +15 -0
  101. data/sig/aoc_cli/core/attempt_parser.rbs +41 -0
  102. data/sig/aoc_cli/core/processor.rbs +25 -0
  103. data/sig/aoc_cli/core/repository.rbs +25 -0
  104. data/sig/aoc_cli/core/request.rbs +29 -0
  105. data/sig/aoc_cli/core/resource.rbs +25 -0
  106. data/sig/aoc_cli/core/stats_parser.rbs +23 -0
  107. data/sig/aoc_cli/helpers/table_generator.rbs +36 -0
  108. data/sig/aoc_cli/helpers/view_helper.rbs +15 -0
  109. data/sig/aoc_cli/models/attempt.rbs +35 -0
  110. data/sig/aoc_cli/models/event.rbs +17 -0
  111. data/sig/aoc_cli/models/location.rbs +19 -0
  112. data/sig/aoc_cli/models/progress.rbs +21 -0
  113. data/sig/aoc_cli/models/puzzle.rbs +27 -0
  114. data/sig/aoc_cli/models/puzzle_dir_sync_log.rbs +11 -0
  115. data/sig/aoc_cli/models/stats.rbs +53 -0
  116. data/sig/aoc_cli/presenters/attempt_presenter.rbs +13 -0
  117. data/sig/aoc_cli/presenters/puzzle_presenter.rbs +19 -0
  118. data/sig/aoc_cli/presenters/stats_presenter.rbs +19 -0
  119. data/sig/aoc_cli/processors/event_initialiser.rbs +26 -0
  120. data/sig/aoc_cli/processors/progress_syncer.rbs +29 -0
  121. data/sig/aoc_cli/processors/puzzle_dir_synchroniser.rbs +40 -0
  122. data/sig/aoc_cli/processors/puzzle_initialiser.rbs +41 -0
  123. data/sig/aoc_cli/processors/puzzle_refresher.rbs +21 -0
  124. data/sig/aoc_cli/processors/resource_attacher.rbs +16 -0
  125. data/sig/aoc_cli/processors/solution_poster.rbs +34 -0
  126. data/sig/aoc_cli/processors/stats_initialiser.rbs +15 -0
  127. data/sig/aoc_cli/processors/stats_refresher.rbs +19 -0
  128. data/sig/aoc_cli/validators/collection_type_validator.rbs +24 -0
  129. data/sig/aoc_cli/validators/event_year_validator.rbs +19 -0
  130. data/sig/aoc_cli/validators/included_validator.rbs +11 -0
  131. data/sig/aoc_cli/validators/integer_validator.rbs +15 -0
  132. data/sig/aoc_cli/validators/path_validator.rbs +17 -0
  133. data/sig/aoc_cli/validators/type_validator.rbs +22 -0
  134. data/sig/aoc_cli.rbs +6 -0
  135. data/sig/http.rbs +3 -0
  136. data/sig/kangaru.rbs +5 -0
  137. data/sig/nokogiri.rbs +3 -0
  138. data/sig/reverse_markdown.rbs +3 -0
  139. metadata +149 -34
  140. data/.gitignore +0 -5
  141. data/bin/aoc +0 -4
  142. data/bin/console +0 -15
  143. data/bin/setup +0 -7
  144. data/lib/aoc_cli/commands.rb +0 -232
  145. data/lib/aoc_cli/database.rb +0 -224
  146. data/lib/aoc_cli/day.rb +0 -124
  147. data/lib/aoc_cli/db/reddit.db +0 -0
  148. data/lib/aoc_cli/errors.rb +0 -275
  149. data/lib/aoc_cli/files.rb +0 -163
  150. data/lib/aoc_cli/help.rb +0 -77
  151. data/lib/aoc_cli/interface.rb +0 -81
  152. data/lib/aoc_cli/paths.rb +0 -101
  153. data/lib/aoc_cli/solve.rb +0 -104
  154. data/lib/aoc_cli/tables.rb +0 -138
  155. data/lib/aoc_cli/tools.rb +0 -120
  156. data/lib/aoc_cli/year.rb +0 -116
  157. data/sample/aoc.rc +0 -21
@@ -1,275 +0,0 @@
1
- module AocCli
2
- module Errors
3
- ERROR = "Error".bold.red
4
- class UserNil < StandardError
5
- def message
6
- <<~error
7
- #{ERROR}: No user alias value.
8
- Specify an alias to use when passing the #{"-u".yellow} or #{"--user".yellow} flag
9
- error
10
- end
11
- end
12
- class UserInv < StandardError
13
- def initialize(user)
14
- @user = user
15
- end
16
- def message
17
- <<~error
18
- #{ERROR}: Invalid user: #{@user.to_s.red}
19
- No key was found under this alias
20
- error
21
- end
22
- end
23
- class UserDup < StandardError
24
- attr_reader :user
25
- def initialize(user)
26
- @user = user
27
- end
28
- def message
29
- <<~error
30
- #{ERROR}: There is already a key set for the user #{user.yellow}
31
- Either check your config file or set a new username for this key using the #{"-u".yellow} or #{"--user".yellow} flags
32
- error
33
- end
34
- end
35
- class YearNil < StandardError
36
- def message
37
- <<~error
38
- #{ERROR}: No year value.
39
- Set the year using the #{"-y".yellow} or #{"--year".yellow} flags.
40
- error
41
- end
42
- end
43
- class YearInv < StandardError
44
- attr_reader :year
45
- def initialize(year)
46
- @year = year
47
- end
48
- def message
49
- <<~error
50
- #{ERROR}: Invalid year: #{year.to_s.red}
51
- Advent of Code currently spans 2015 - 2020.
52
- error
53
- end
54
- end
55
- class DayNil < StandardError
56
- def message
57
- <<~error
58
- #{ERROR}: No day value.
59
- Specify the day using the #{"-d".yellow} or #{"--day".yellow} flags.
60
- error
61
- end
62
- end
63
- class DayInv < StandardError
64
- def initialize(day)
65
- @day = day
66
- end
67
- def message
68
- <<~error
69
- #{ERROR}: Invalid day: #{@day.to_s.red}
70
- Valid days are between 1 and 25
71
- error
72
- end
73
- end
74
- class DayExist < StandardError
75
- def initialize(day)
76
- @day = day.to_s
77
- end
78
- def message
79
- <<~error
80
- #{ERROR}: Day #{@day.red} is already initialised!
81
- error
82
- end
83
- end
84
- class PartNil < StandardError
85
- def message
86
- <<~error
87
- #{ERROR}: No part value.
88
- Check the .meta file or pass it manually with the #{"-p".yellow} or #{"--part".yellow} flags
89
- error
90
- end
91
- end
92
- class PartInv < StandardError
93
- attr_reader :part
94
- def initialize(part)
95
- @part = part
96
- end
97
- def message
98
- <<~error
99
- #{ERROR}: Invalid part: #{part.red}
100
- Part refers to the part of the puzzle and can either be 1 or 2.
101
- error
102
- end
103
- end
104
- class AnsNil < StandardError
105
- def message
106
- <<~error
107
- #{ERROR}: No answer value.
108
- error
109
- end
110
- end
111
- class KeyNil < StandardError
112
- def message
113
- <<~error
114
- #{ERROR}: No session key value.
115
- Use the #{"-k".yellow} or #{"--key".yellow} flags to store the key
116
- error
117
- end
118
- end
119
- class KeyDup < StandardError
120
- attr_reader :key
121
- def initialize(key)
122
- @key = key
123
- end
124
- def message
125
- <<~error
126
- #{ERROR}: The key #{key.yellow} already exists in your config file
127
- error
128
- end
129
- end
130
- class AlrInit < StandardError
131
- def message
132
- <<~error
133
- #{ERROR}: This directory is already initialised.
134
- error
135
- end
136
- end
137
- class NotInit < StandardError
138
- def message
139
- <<~error
140
- #{ERROR}: You must initialise the directory first
141
- error
142
- end
143
- end
144
- class PuzzComp < StandardError
145
- def message
146
- <<~error
147
- #{ERROR}: This puzzle is already complete!
148
- error
149
- end
150
- end
151
- class FlagInv < StandardError
152
- attr_reader :flag
153
- def initialize(flag)
154
- @flag = flag
155
- end
156
- def message
157
- <<~error
158
- #{ERROR}: Invalid flag: #{flag.red}
159
- Use the #{"-h".yellow} or #{"--help".yellow} flags for a list of commands
160
- error
161
- end
162
- end
163
- class CmdNil < StandardError
164
- def message
165
- <<~error
166
- #{ERROR}: Flags passed but no command specified
167
- error
168
- end
169
- end
170
- class KeyInv < StandardError
171
- def message
172
- <<~error
173
- #{ERROR}: Invalid key
174
- Double check your session key. It should start with "session="
175
- error
176
- end
177
- end
178
- class ConfigExist < StandardError
179
- def message
180
- <<~error
181
- #{ERROR}: A config file already exists in #{Paths::Config.path.blue}
182
- error
183
- end
184
- end
185
- class AtmptDup < StandardError
186
- attr_reader :answer
187
- def initialize(answer)
188
- @answer = answer
189
- end
190
- def message
191
- <<~error
192
- #{ERROR}: You have already tried #{answer.red}
193
- To see previous attempts run #{"aoc -a".yellow}
194
- error
195
- end
196
- end
197
- end
198
- class Validate
199
- E = Errors
200
- def self.cmd(cmd)
201
- raise E::CmdNil if cmd.nil?
202
- cmd
203
- end
204
- def self.user(user)
205
- raise E::UserNil if user.nil?
206
- raise E::UserInv.new(user) unless user_in_config?(user)
207
- user
208
- end
209
- def self.set_user(user)
210
- raise E::UserNil if user.nil?
211
- raise E::UserDup.new(user) if user_in_config?(user)
212
- user
213
- end
214
- def self.year(year)
215
- raise E::YearNil if year.nil?
216
- raise E::YearInv.new(year) if year.to_i < 2015 ||
217
- year.to_i > 2020
218
- year
219
- end
220
- def self.day(day)
221
- raise E::DayNil if day.nil? || day == 0
222
- raise E::DayInv.new(day) if day.to_i < 1 ||
223
- day.to_i > 25
224
- day
225
- end
226
- def self.part(part)
227
- raise E::PartNil if part.nil?
228
- raise E::PuzzComp if part.to_i == 3
229
- raise E::PartInv if part.to_i < 1 || part.to_i > 2
230
- part
231
- end
232
- def self.set_key(key)
233
- raise E::KeyNil if key.nil?
234
- raise E::KeyDup.new(key) if Files::Config::Tools
235
- .is_set?(val:"#{key}(\b|$)")
236
- raise E::KeyInv unless valid_key?(key)
237
- key
238
- end
239
- def self.key(key)
240
- raise E::KeyNil if key.nil?
241
- raise E::KeyInv unless valid_key?(key)
242
- key
243
- end
244
- def self.ans(attempt:, ans:)
245
- raise E::AnsNil if ans.nil?
246
- raise E::AtmptDup.new(ans) if Database::Attempt
247
- .new(attempt:attempt).duplicate?(ans:ans)
248
- ans
249
- end
250
- def self.day_dir(day)
251
- raise E::DayExist.new(day) if Dir.exist?(day)
252
- day
253
- end
254
- def self.init(dir)
255
- raise E::NotInit unless File.exist?("#{dir}/.meta")
256
- dir
257
- end
258
- def self.not_init(dir:, year:)
259
- raise E::AlrInit if File.exist?("#{dir}/.meta") &&
260
- Metafile.get(:year) != year.to_s
261
- dir
262
- end
263
- def self.no_config
264
- raise E::ConfigExist if File.exist?(Paths::Config.path)
265
- Paths::Config.path
266
- end
267
- private
268
- def self.valid_key?(key)
269
- /session=(?:[a-f0-9]){96}/.match?(key)
270
- end
271
- def self.user_in_config?(user)
272
- Files::Config::Tools.is_set?(key:"cookie=>#{user}")
273
- end
274
- end
275
- end
data/lib/aoc_cli/files.rb DELETED
@@ -1,163 +0,0 @@
1
- module AocCli
2
- module Files
3
- module Config
4
- class Tools
5
- def self.is_set?(key:nil, val:nil)
6
- read.split("\n").grep(/(?<!\/\/)#{key}=>#{val}/).any?
7
- end
8
- def self.get_all(key:)
9
- read.scan(/(?:(?<=(?<!\/\/)#{key}=>)).*$/)
10
- end
11
- def self.get_line(key:)
12
- get_all(key:key)&.first
13
- #read.scan(/(?:(?<=(?<!\/\/)#{key}=>)).*$/)&.first
14
- end
15
- def self.get_bool(key:)
16
- get_line(key:key) == "true" ? true : false
17
- end
18
- def self.mod_line(key:, val:)
19
- is_set?(key:key) ?
20
- write(f:read.gsub(/(?<=^#{key}=>).*$/, val.to_s)) :
21
- write(f:"#{key}=>#{val}\n", m:"a")
22
- end
23
- def self.set_line(key:, val:)
24
- write(f:"#{key}=>#{val}\n", m:"a")
25
- end
26
- private
27
- def self.read
28
- Paths::Config.create
29
- File.read(Paths::Config.path)
30
- end
31
- def self.write(f:, m:"w")
32
- Paths::Config.create
33
- File.write(Paths::Config.path, f, mode:m)
34
- end
35
- end
36
- class Prefs < Tools
37
- def self.default_alias
38
- is_set?(key:"default") ? get_line(key:"default") :
39
- is_set?(key:"cookie=>main") ? "main" :
40
- list_aliases.first || "main"
41
- end
42
- def self.list_aliases
43
- get_all(key:"cookie")&.map{|a| a.gsub(/=>.*/, "")}
44
- end
45
- def self.bool(key:)
46
- is_set?(key:key) ?
47
- get_bool(key:key) : defaults[key.to_sym]
48
- end
49
- def self.string(key:)
50
- is_set?(key:key) ?
51
- get_line(key:key) : defaults[key.to_sym]
52
- end
53
- private
54
- def self.defaults
55
- { calendar_file:true,
56
- day_dir_prefix:"",
57
- ignore_md_files:true,
58
- ignore_meta_files:true,
59
- init_git:false,
60
- lb_in_calendar:true,
61
- reddit_in_browser:false,
62
- unicode_tables:true
63
- }
64
- end
65
- end
66
- class Cookie < Tools
67
- def self.store(user:, key:)
68
- set_line(key:"cookie=>#{Validate.set_user(user)}",
69
- val:Validate.set_key(key))
70
- end
71
- def self.key(user:)
72
- Validate.key(get_line(key:"cookie=>#{Validate
73
- .user(user)}"))
74
- end
75
- end
76
- class Example
77
- def self.write
78
- File.write(Validate.no_config, file)
79
- end
80
- def self.file
81
- <<~file
82
- //aoc-cli example config
83
- //See the github repo for more information on configuring aoc-cli
84
- //https://github.com/apexatoll/aoc-cli
85
-
86
- [General]
87
- //Print table in unicode rather than ascii
88
- unicode_tables=>true
89
- //Open Reddit in browser rather than use a Reddit CLI
90
- reddit_in_browser=>false
91
-
92
- [Initialise Year]
93
- //Create a calendar file
94
- calendar_file=>true
95
- //Initialise git repo on year initialisation
96
- init_git=>false
97
- //Add calendar and puzzle files to gitignore
98
- ignore_md_files=>true
99
- //Add .meta files to gitignore
100
- ignore_meta_files=>true
101
- //Include leaderboard stats in calendar file
102
- lb_in_calendar=>true
103
- file
104
- end
105
- end
106
- end
107
- class Metafile
108
- def self.get(field)
109
- read.scan(/(?<=#{field}=>).*$/)&.first&.chomp
110
- end
111
- def self.type
112
- get("dir").to_sym
113
- end
114
- def self.part(d:)
115
- Database::Calendar::Part.new(d:d).get
116
- end
117
- private
118
- def self.read(dir:".")
119
- File.read("#{Validate.init(dir)}/.meta")
120
- end
121
- def self.year(u:, y:)
122
- <<~meta
123
- dir=>ROOT
124
- user=>#{u}
125
- year=>#{y}
126
- meta
127
- end
128
- def self.day(u:, y:, d:)
129
- <<~meta
130
- dir=>DAY
131
- user=>#{u}
132
- year=>#{y}
133
- day=>#{d}
134
- part=>#{part(d:d)}
135
- meta
136
- end
137
- end
138
- class Calendar
139
- attr_reader :cal, :stats, :year
140
- def initialize(y:Metafile.get(:year), cal:, stats:)
141
- @year, @cal, @stats = Validate.year(y), cal, stats
142
- end
143
- def include_leaderboard?
144
- Prefs.bool(key:"lb_in_calendar")
145
- end
146
- def title
147
- "Year #{year}: #{stats.total_stars}/50 *"
148
- end
149
- def underline
150
- "-" * (cal.data[0].to_s.length + 2)
151
- end
152
- def make
153
- <<~file
154
- #{title}
155
- #{underline}
156
- #{cal.data.join("\n")}\n
157
- #{stats.data.join("\n") if stats.total_stars > 0 &&
158
- include_leaderboard?}
159
- file
160
- end
161
- end
162
- end
163
- end
data/lib/aoc_cli/help.rb DELETED
@@ -1,77 +0,0 @@
1
- def title(title)
2
- "#{title.bold}"
3
- end
4
- def flag(short, full)
5
- str = " #{short.yellow.bold} [#{full.blue.italic}]"
6
- full.length > 6 ?
7
- str += "\t" :
8
- str += "\t\t"
9
- str
10
- end
11
-
12
- help = <<~help
13
- Advent of Code - cli, version #{AocCli::VERSION}
14
- #{"C. Welham Feb 2021".italic}
15
-
16
- #{title("Usage")}
17
- #{" aoc".bold + " -flag".italic.yellow + " value".bold.blue}
18
-
19
- #{title("General")}
20
- #{flag("-v","--version")}Print version
21
- #{flag("-h","--help")}Print this screen
22
-
23
- #{title("Setup")}
24
- - Store session cookie keys to access AoC
25
-
26
- #{flag("-k","--key")}Store a session cookie to use the cli.
27
- #{flag("-u","--user")}Set alias for key (default: "main")
28
- #{flag("-U","--default")}Get/set default alias
29
-
30
- #{title("Year Directory")}
31
- - Initialise a year directory to use aoc-cli.
32
- - If no alias is passed, the default key is used
33
-
34
- #{flag("-y","--init-year")}Initialise directory and fetch calendar
35
- #{flag("-u","--user")}Specify alias for initialisation
36
- #{flag("-d","--init-day")}Create day subdirectory, fetch puzzle and input
37
- #{flag("-r", "--refresh")}Refresh calendar
38
-
39
- #{title("Day Subdirectory")}
40
- - These commands can be run from the day subdirectory
41
-
42
- #{flag("-s","--solve")}Attempt puzzle
43
- #{flag("-p","--part")}Specify part (attempts)
44
- #{flag("-r","--refresh")}Refresh puzzle
45
-
46
- #{title("Reddit")}
47
- - Defaults to a Reddit CLI if one is installed
48
-
49
- #{flag("-R","--reddit")}Open Reddit solution megathread
50
- #{flag("-B","--browser")}Open Reddit thread in browser
51
-
52
- #{title("Manual Usage")}
53
- - AocCli uses metadata so that these flags do not need to be entered.
54
- - Command flags can be entered manually, but this is not recommended
55
-
56
- #{flag("-u","--user")}Specify user
57
- #{flag("-Y","--year")}Specify year
58
- #{flag("-D","--day")}Specify day
59
- #{flag("-p","--part")}Specify part
60
-
61
- #{title("Configuration")}
62
- - Pass with a value to update setting
63
- - Pass without an argument to display current setting.
64
-
65
- #{flag("-U","--default")}Default key alias to use
66
- #{flag("-G","--gen-config")}Creates an example config file
67
-
68
- #{title("Tables")}
69
- - Print stats in a terminal-friendly table
70
-
71
- #{flag("-a","--attempts")}Prints previous attempts for puzzle (part needed)
72
- #{flag("-c","--simple-cal")}Prints your progress
73
- #{flag("-C","--fancy-cal")}Prints your calendar file
74
- #{flag("-S","--stats")}Prints your stats (time taken, number of attempts)
75
-
76
- help
77
- system("echo '#{help}' | less -r")
@@ -1,81 +0,0 @@
1
- module AocCli
2
- module Interface
3
- class Query
4
- def initialize
5
- ARGV.size > 0 ?
6
- run(args:Args.new.parse) : Help.print
7
- rescue StandardError => e
8
- abort e.message
9
- end
10
- def run(args:)
11
- cmd = Commands.const_get(Validate.cmd(args.cmd))
12
- .new(args.args).exec
13
- cmd.respond if cmd.class
14
- .instance_methods.include?(:respond)
15
- end
16
- end
17
- class Help
18
- def self.print
19
- require_relative "help.rb"
20
- end
21
- end
22
- class Args
23
- attr_reader :cmd, :args
24
- def initialize
25
- @args = {}
26
- end
27
- def parse
28
- while ARGV.size > 0
29
- case ARGV.shift
30
- when "-a", "--attempts"
31
- @cmd = :AttemptsTable
32
- when "-B", "--browser"
33
- @cmd = :OpenReddit
34
- args[:browser] = true
35
- when "-c", "--simple-cal"
36
- @cmd = :CalendarTable
37
- when "-C", "--fancy-cal"
38
- @cmd = :PrintCal
39
- when "-d", "--init-day"
40
- @cmd = :DayInit
41
- args[:day] = Validate.day(ARGV.shift.to_i)
42
- when "-D", "--day"
43
- args[:day] = ARGV.shift.to_i
44
- when "-G", "--gen-config"
45
- @cmd = :GenerateConfig
46
- when "-h", "--help"
47
- exit Help.print
48
- when "-k", "--key"
49
- @cmd = :KeyStore
50
- args[:key] = Validate.set_key(ARGV.shift)
51
- when "-p", "--part"
52
- args[:part] = ARGV.shift.to_i
53
- when "-r", "--refresh"
54
- @cmd = :Refresh
55
- when "-R", "--reddit"
56
- @cmd = :OpenReddit
57
- when "-s", "--solve"
58
- @cmd = :DaySolve
59
- args[:ans] = ARGV.shift
60
- when "-S", "--stats"
61
- @cmd = :StatsTable
62
- when "-u", "--user"
63
- args[:user] = ARGV.shift
64
- when "-U", "--default"
65
- @cmd = :DefaultAlias
66
- args[:user] = ARGV.shift
67
- when "-v", "--version"
68
- abort "aoc-cli(#{VERSION})"
69
- when "-y", "--init-year"
70
- @cmd = :YearInit
71
- args[:year] = Validate.year(ARGV.shift.to_i)
72
- when "-Y", "--year"
73
- args[:year] = ARGV.shift.to_i
74
- else raise Errors::FlagInv
75
- end
76
- end
77
- self
78
- end
79
- end
80
- end
81
- end
data/lib/aoc_cli/paths.rb DELETED
@@ -1,101 +0,0 @@
1
- module AocCli
2
- module Paths
3
- require 'fileutils'
4
- class Year
5
- attr_reader :user, :year
6
- def initialize(u:Metafile.get(:user),
7
- y:Metafile.get(:year))
8
- @user = Validate.user(u)
9
- @year = Validate.year(y)
10
- end
11
- def in_year?
12
- File.exist?("./.meta") ?
13
- Metafile.type == :ROOT : true
14
- end
15
- def year_dir
16
- in_year? ? "." : ".."
17
- end
18
- def local(f:)
19
- "#{Validate.not_init(dir:year_dir,
20
- year:year)}/#{filename(f:f)}"
21
- end
22
- def filename(f:)
23
- case f.to_sym
24
- when :Stars then "#{year}.md"
25
- when :meta then ".meta"
26
- end
27
- end
28
- end
29
- class Day
30
- attr_reader :user, :year, :day
31
- def initialize(u:Metafile.get(:user),
32
- y:Metafile.get(:year), d:)
33
- @user = Validate.user(u)
34
- @year = Validate.year(y)
35
- @day = Validate.day(d)
36
- end
37
- def create_cache
38
- FileUtils.mkdir_p(cache_dir) unless Dir.exist?(cache_dir)
39
- end
40
- def prefix
41
- Prefs.string(key:"day_dir_prefix")
42
- end
43
- def filename(f:)
44
- case f.to_sym
45
- when :Input then "input"
46
- when :Puzzle then "#{day}.md"
47
- when :meta then ".meta"
48
- end
49
- end
50
- def in_day?
51
- Metafile.type == :DAY
52
- end
53
- def day_dir
54
- day.to_i < 10 ?
55
- "#{prefix}0#{day}" :
56
- "#{prefix}#{day}"
57
- end
58
- def local_dir
59
- in_day? ? "." : "#{day_dir}"
60
- end
61
- def cache_dir
62
- "#{Dir.home}/.cache/aoc-cli/"\
63
- "#{user}/#{year}/#{day_dir}"
64
- end
65
- def local(f:)
66
- "#{local_dir}/#{filename(f:f)}"
67
- end
68
- def cache_path(f:)
69
- "#{cache_dir}/#{filename(f:f)}"
70
- end
71
- def cache_and_local(f:)
72
- [cache_path(f:f), local(f:f)]
73
- end
74
- end
75
- class Config
76
- def self.create
77
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
78
- File.write(path, "", mode:"a") unless File.exist?(path)
79
- end
80
- def self.dir
81
- "#{Dir.home}/.config/aoc-cli"
82
- end
83
- def self.path
84
- "#{dir}/aoc.rc"
85
- end
86
- end
87
- class Database < Config
88
- def self.dir
89
- "#{super}/db"
90
- end
91
- def self.cfg(name)
92
- FileUtils.mkdir_p(dir) unless Dir
93
- .exist?(dir)
94
- "#{dir}/#{name}.db"
95
- end
96
- def self.root(name)
97
- "#{__dir__}/db/#{name}.db"
98
- end
99
- end
100
- end
101
- end