aoc_cli 1.0.0 → 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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/aoc_cli.gemspec +1 -1
- data/db/migrate/7_create_progresses.rb +17 -0
- data/db/migrate/8_remove_legacy_timestamps.rb +8 -0
- data/lib/aoc_cli/models/progress.rb +33 -0
- data/lib/aoc_cli/models/puzzle.rb +8 -8
- data/lib/aoc_cli/processors/progress_syncer.rb +48 -0
- data/lib/aoc_cli/processors/puzzle_initialiser.rb +15 -0
- data/lib/aoc_cli/processors/solution_poster.rb +1 -1
- data/lib/aoc_cli/version.rb +1 -1
- data/lib/aoc_cli.rb +5 -1
- data/rbs_collection.lock.yaml +7 -7
- data/sig/aoc_cli/models/progress.rbs +21 -0
- data/sig/aoc_cli/models/puzzle.rbs +3 -4
- data/sig/aoc_cli/processors/progress_syncer.rbs +29 -0
- data/sig/aoc_cli/processors/puzzle_initialiser.rbs +4 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ddf7e8e1d35efd516bae0a1a9b4d773a0ff59120f3ae287491668fa81740ffba
|
4
|
+
data.tar.gz: 7fc18fbfcf0391b6d9b6ed43b6e6f35b372f368c9ffd8f5f23c2f3a305c470d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41cb419b34d2d7a385e3c227e11b4f548f834d1f6d14566d11baff340367ff95ed7e87cdf512ae45aa3dc4339b65e9549ff2182960e33d0b26af06a6e36e1f24
|
7
|
+
data.tar.gz: e32591f10e88ff7aa402ebe0523328af2bc61a8458028ff3c559477ec81aa3ee34944b8cf63156ae8625e9000e4a9716d910c02a59a4010679c524dcf387652b
|
data/Gemfile.lock
CHANGED
data/aoc_cli.gemspec
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
change do
|
3
|
+
create_table :progresses do
|
4
|
+
primary_key :id
|
5
|
+
|
6
|
+
foreign_key :puzzle_id, :puzzles, null: false
|
7
|
+
|
8
|
+
integer :level, null: false
|
9
|
+
|
10
|
+
datetime :started_at, null: false
|
11
|
+
datetime :completed_at
|
12
|
+
|
13
|
+
datetime :created_at
|
14
|
+
datetime :updated_at
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module AocCli
|
2
|
+
class Progress < Kangaru::Model
|
3
|
+
many_to_one :puzzle
|
4
|
+
|
5
|
+
validates :puzzle, required: true
|
6
|
+
validates :level, integer: { between: 1..2 }
|
7
|
+
validates :started_at, required: true
|
8
|
+
|
9
|
+
def complete?
|
10
|
+
!incomplete?
|
11
|
+
end
|
12
|
+
|
13
|
+
def incomplete?
|
14
|
+
completed_at.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def complete!
|
18
|
+
update(completed_at: Time.now)
|
19
|
+
end
|
20
|
+
|
21
|
+
def reset!
|
22
|
+
update(started_at: Time.now)
|
23
|
+
end
|
24
|
+
|
25
|
+
def time_taken
|
26
|
+
if complete?
|
27
|
+
completed_at - started_at
|
28
|
+
else
|
29
|
+
Time.now - started_at
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -6,6 +6,14 @@ module AocCli
|
|
6
6
|
one_to_one :location, as: :resource
|
7
7
|
one_to_many :attempts
|
8
8
|
|
9
|
+
one_to_one :part_one_progress,
|
10
|
+
class: "AocCli::Progress",
|
11
|
+
conditions: { level: 1 }
|
12
|
+
|
13
|
+
one_to_one :part_two_progress,
|
14
|
+
class: "AocCli::Progress",
|
15
|
+
conditions: { level: 2 }
|
16
|
+
|
9
17
|
validates :event, required: true
|
10
18
|
validates :day, integer: { between: 1..25 }
|
11
19
|
validates :content, required: true
|
@@ -16,13 +24,5 @@ module AocCli
|
|
16
24
|
def presenter
|
17
25
|
@presenter ||= Presenters::PuzzlePresenter.new(self)
|
18
26
|
end
|
19
|
-
|
20
|
-
def mark_complete!(level)
|
21
|
-
case level
|
22
|
-
when 1 then update(part_one_completed_at: Time.now)
|
23
|
-
when 2 then update(part_two_completed_at: Time.now)
|
24
|
-
else raise "invalid level"
|
25
|
-
end
|
26
|
-
end
|
27
27
|
end
|
28
28
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module AocCli
|
2
|
+
module Processors
|
3
|
+
class ProgressSyncer < Core::Processor
|
4
|
+
attr_accessor :puzzle, :stats
|
5
|
+
|
6
|
+
validates :puzzle, required: true
|
7
|
+
validates :stats, required: true
|
8
|
+
|
9
|
+
def run
|
10
|
+
case current_progress
|
11
|
+
when 0 then handle_not_complete!
|
12
|
+
when 1 then handle_partially_complete!
|
13
|
+
when 2 then handle_fully_complete!
|
14
|
+
else raise
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def_delegators :puzzle, :part_one_progress, :part_two_progress
|
21
|
+
|
22
|
+
def current_progress
|
23
|
+
stats.progress(puzzle.day)
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_part_one_progress!
|
27
|
+
Progress.create(puzzle:, level: 1, started_at: Time.now)
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_part_two_progress!
|
31
|
+
Progress.create(puzzle:, level: 2, started_at: Time.now)
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle_not_complete!
|
35
|
+
create_part_one_progress! if part_one_progress.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
def handle_partially_complete!
|
39
|
+
part_one_progress&.complete! if part_one_progress&.incomplete?
|
40
|
+
create_part_two_progress! if part_two_progress.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
def handle_fully_complete!
|
44
|
+
part_two_progress&.complete! if part_two_progress&.incomplete?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -8,6 +8,7 @@ module AocCli
|
|
8
8
|
|
9
9
|
def validate
|
10
10
|
super
|
11
|
+
validate_event_stats_set! if errors.empty?
|
11
12
|
validate_event_location_set! if errors.empty?
|
12
13
|
validate_event_dir_exists! if errors.empty?
|
13
14
|
validate_puzzle_dir_does_not_exist! if errors.empty?
|
@@ -15,6 +16,8 @@ module AocCli
|
|
15
16
|
|
16
17
|
def run
|
17
18
|
create_or_update_puzzle!(fetch_content!, fetch_input!).tap do |puzzle|
|
19
|
+
sync_puzzle_progress!(puzzle)
|
20
|
+
|
18
21
|
attach_puzzle_dir!(puzzle).tap do |location|
|
19
22
|
write_puzzle_files!(puzzle, location)
|
20
23
|
end
|
@@ -53,6 +56,10 @@ module AocCli
|
|
53
56
|
end
|
54
57
|
end
|
55
58
|
|
59
|
+
def sync_puzzle_progress!(puzzle)
|
60
|
+
ProgressSyncer.run!(puzzle:, stats: event.stats)
|
61
|
+
end
|
62
|
+
|
56
63
|
def attach_puzzle_dir!(puzzle)
|
57
64
|
puzzle_dir.mkdir
|
58
65
|
|
@@ -63,6 +70,14 @@ module AocCli
|
|
63
70
|
PuzzleDirSynchroniser.run!(puzzle:, location:)
|
64
71
|
end
|
65
72
|
|
73
|
+
def validate_event_stats_set!
|
74
|
+
return unless event.stats.nil?
|
75
|
+
|
76
|
+
errors << Kangaru::Validation::Error.new(
|
77
|
+
attribute: :event_stats, message: "can't be blank"
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
66
81
|
def validate_event_location_set!
|
67
82
|
return unless event.location.nil?
|
68
83
|
|
data/lib/aoc_cli/version.rb
CHANGED
data/lib/aoc_cli.rb
CHANGED
@@ -14,9 +14,13 @@ module AocCli
|
|
14
14
|
config_path "spec/aoc.yml", env: :test
|
15
15
|
|
16
16
|
configure do |config|
|
17
|
+
migration_path = File.join(
|
18
|
+
File.expand_path(__dir__ || raise), "../db/migrate"
|
19
|
+
)
|
20
|
+
|
17
21
|
config.database.adaptor = :sqlite
|
18
22
|
config.database.path = File.expand_path("~/.local/share/aoc/aoc.sqlite3")
|
19
|
-
config.database.migration_path =
|
23
|
+
config.database.migration_path = migration_path
|
20
24
|
end
|
21
25
|
|
22
26
|
configure env: :test do |config|
|
data/rbs_collection.lock.yaml
CHANGED
@@ -6,7 +6,7 @@ gems:
|
|
6
6
|
source:
|
7
7
|
type: git
|
8
8
|
name: ruby/gem_rbs_collection
|
9
|
-
revision:
|
9
|
+
revision: ec140aff951e3af39846eed4525ba5d040d294fa
|
10
10
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
11
11
|
repo_dir: gems
|
12
12
|
- name: addressable
|
@@ -14,7 +14,7 @@ gems:
|
|
14
14
|
source:
|
15
15
|
type: git
|
16
16
|
name: ruby/gem_rbs_collection
|
17
|
-
revision:
|
17
|
+
revision: ec140aff951e3af39846eed4525ba5d040d294fa
|
18
18
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
19
19
|
repo_dir: gems
|
20
20
|
- name: base64
|
@@ -42,7 +42,7 @@ gems:
|
|
42
42
|
source:
|
43
43
|
type: git
|
44
44
|
name: ruby/gem_rbs_collection
|
45
|
-
revision:
|
45
|
+
revision: ec140aff951e3af39846eed4525ba5d040d294fa
|
46
46
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
47
47
|
repo_dir: gems
|
48
48
|
- name: connection_pool
|
@@ -50,7 +50,7 @@ gems:
|
|
50
50
|
source:
|
51
51
|
type: git
|
52
52
|
name: ruby/gem_rbs_collection
|
53
|
-
revision:
|
53
|
+
revision: ec140aff951e3af39846eed4525ba5d040d294fa
|
54
54
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
55
55
|
repo_dir: gems
|
56
56
|
- name: date
|
@@ -74,7 +74,7 @@ gems:
|
|
74
74
|
source:
|
75
75
|
type: git
|
76
76
|
name: ruby/gem_rbs_collection
|
77
|
-
revision:
|
77
|
+
revision: ec140aff951e3af39846eed4525ba5d040d294fa
|
78
78
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
79
79
|
repo_dir: gems
|
80
80
|
- name: i18n
|
@@ -82,7 +82,7 @@ gems:
|
|
82
82
|
source:
|
83
83
|
type: git
|
84
84
|
name: ruby/gem_rbs_collection
|
85
|
-
revision:
|
85
|
+
revision: ec140aff951e3af39846eed4525ba5d040d294fa
|
86
86
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
87
87
|
repo_dir: gems
|
88
88
|
- name: kangaru
|
@@ -114,7 +114,7 @@ gems:
|
|
114
114
|
source:
|
115
115
|
type: git
|
116
116
|
name: ruby/gem_rbs_collection
|
117
|
-
revision:
|
117
|
+
revision: ec140aff951e3af39846eed4525ba5d040d294fa
|
118
118
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
119
119
|
repo_dir: gems
|
120
120
|
- name: pathname
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module AocCli
|
2
|
+
class Progress < Kangaru::Model
|
3
|
+
attr_accessor id: Integer
|
4
|
+
attr_accessor puzzle: Puzzle
|
5
|
+
attr_accessor level: Integer
|
6
|
+
attr_accessor started_at: Time
|
7
|
+
attr_accessor completed_at: Time
|
8
|
+
attr_accessor created_at: Time
|
9
|
+
attr_accessor updated_at: Time
|
10
|
+
|
11
|
+
def complete?: -> bool
|
12
|
+
|
13
|
+
def incomplete?: -> bool
|
14
|
+
|
15
|
+
def complete!: -> void
|
16
|
+
|
17
|
+
def reset!: -> void
|
18
|
+
|
19
|
+
def time_taken: -> Float
|
20
|
+
end
|
21
|
+
end
|
@@ -9,8 +9,6 @@ module AocCli
|
|
9
9
|
attr_accessor input: String
|
10
10
|
attr_accessor created_at: Time
|
11
11
|
attr_accessor updated_at: Time
|
12
|
-
attr_accessor part_one_completed_at: Time
|
13
|
-
attr_accessor part_two_completed_at: Time
|
14
12
|
|
15
13
|
attr_accessor location: Location
|
16
14
|
attr_accessor location_dataset: Sequel::Dataset
|
@@ -18,11 +16,12 @@ module AocCli
|
|
18
16
|
attr_accessor attempts: Array[Attempt]
|
19
17
|
attr_accessor attempts_dataset: Sequel::Dataset
|
20
18
|
|
19
|
+
attr_accessor part_one_progress: Progress?
|
20
|
+
attr_accessor part_two_progress: Progress?
|
21
|
+
|
21
22
|
# Delegated to event
|
22
23
|
def year: -> Integer
|
23
24
|
|
24
25
|
attr_reader presenter: Presenters::PuzzlePresenter
|
25
|
-
|
26
|
-
def mark_complete!: (Integer) -> void
|
27
26
|
end
|
28
27
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module AocCli
|
2
|
+
module Processors
|
3
|
+
class ProgressSyncer < Core::Processor
|
4
|
+
attr_accessor puzzle: Puzzle
|
5
|
+
attr_accessor stats: Stats
|
6
|
+
|
7
|
+
def run: -> void
|
8
|
+
|
9
|
+
def self.run!: (puzzle: untyped, stats: untyped) -> void
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def part_one_progress: -> Progress?
|
14
|
+
def part_two_progress: -> Progress?
|
15
|
+
|
16
|
+
def current_progress: -> Integer
|
17
|
+
|
18
|
+
def create_part_one_progress!: -> void
|
19
|
+
|
20
|
+
def create_part_two_progress!: -> void
|
21
|
+
|
22
|
+
def handle_not_complete!: -> void
|
23
|
+
|
24
|
+
def handle_partially_complete!: -> void
|
25
|
+
|
26
|
+
def handle_fully_complete!: -> void
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -23,10 +23,14 @@ module AocCli
|
|
23
23
|
|
24
24
|
def create_or_update_puzzle!: (String, String) -> Puzzle
|
25
25
|
|
26
|
+
def sync_puzzle_progress!: (Puzzle) -> void
|
27
|
+
|
26
28
|
def attach_puzzle_dir!: (Puzzle) -> Location
|
27
29
|
|
28
30
|
def write_puzzle_files!: (Puzzle, Location) -> PuzzleDirSyncLog
|
29
31
|
|
32
|
+
def validate_event_stats_set!: -> void
|
33
|
+
|
30
34
|
def validate_event_location_set!: -> void
|
31
35
|
|
32
36
|
def validate_event_dir_exists!: -> void
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aoc_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Welham
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http
|
@@ -123,6 +123,8 @@ files:
|
|
123
123
|
- db/migrate/4_create_attempts.rb
|
124
124
|
- db/migrate/5_create_locations.rb
|
125
125
|
- db/migrate/6_create_puzzle_dir_sync_logs.rb
|
126
|
+
- db/migrate/7_create_progresses.rb
|
127
|
+
- db/migrate/8_remove_legacy_timestamps.rb
|
126
128
|
- exe/aoc
|
127
129
|
- lib/aoc_cli.rb
|
128
130
|
- lib/aoc_cli/components/attempts_table.erb
|
@@ -155,6 +157,7 @@ files:
|
|
155
157
|
- lib/aoc_cli/models/attempt.rb
|
156
158
|
- lib/aoc_cli/models/event.rb
|
157
159
|
- lib/aoc_cli/models/location.rb
|
160
|
+
- lib/aoc_cli/models/progress.rb
|
158
161
|
- lib/aoc_cli/models/puzzle.rb
|
159
162
|
- lib/aoc_cli/models/puzzle_dir_sync_log.rb
|
160
163
|
- lib/aoc_cli/models/stats.rb
|
@@ -162,6 +165,7 @@ files:
|
|
162
165
|
- lib/aoc_cli/presenters/puzzle_presenter.rb
|
163
166
|
- lib/aoc_cli/presenters/stats_presenter.rb
|
164
167
|
- lib/aoc_cli/processors/event_initialiser.rb
|
168
|
+
- lib/aoc_cli/processors/progress_syncer.rb
|
165
169
|
- lib/aoc_cli/processors/puzzle_dir_synchroniser.rb
|
166
170
|
- lib/aoc_cli/processors/puzzle_initialiser.rb
|
167
171
|
- lib/aoc_cli/processors/puzzle_refresher.rb
|
@@ -215,6 +219,7 @@ files:
|
|
215
219
|
- sig/aoc_cli/models/attempt.rbs
|
216
220
|
- sig/aoc_cli/models/event.rbs
|
217
221
|
- sig/aoc_cli/models/location.rbs
|
222
|
+
- sig/aoc_cli/models/progress.rbs
|
218
223
|
- sig/aoc_cli/models/puzzle.rbs
|
219
224
|
- sig/aoc_cli/models/puzzle_dir_sync_log.rbs
|
220
225
|
- sig/aoc_cli/models/stats.rbs
|
@@ -222,6 +227,7 @@ files:
|
|
222
227
|
- sig/aoc_cli/presenters/puzzle_presenter.rbs
|
223
228
|
- sig/aoc_cli/presenters/stats_presenter.rbs
|
224
229
|
- sig/aoc_cli/processors/event_initialiser.rbs
|
230
|
+
- sig/aoc_cli/processors/progress_syncer.rbs
|
225
231
|
- sig/aoc_cli/processors/puzzle_dir_synchroniser.rbs
|
226
232
|
- sig/aoc_cli/processors/puzzle_initialiser.rbs
|
227
233
|
- sig/aoc_cli/processors/puzzle_refresher.rbs
|
@@ -249,6 +255,7 @@ post_install_message:
|
|
249
255
|
rdoc_options: []
|
250
256
|
require_paths:
|
251
257
|
- lib
|
258
|
+
- db
|
252
259
|
required_ruby_version: !ruby/object:Gem::Requirement
|
253
260
|
requirements:
|
254
261
|
- - ">="
|