statesman 12.0.0 → 13.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.
- checksums.yaml +4 -4
- data/.devcontainer/devcontainer.json +31 -0
- data/.devcontainer/docker-compose.yml +39 -0
- data/.github/workflows/tests.yml +42 -20
- data/.rspec +1 -0
- data/.rubocop.yml +1 -4
- data/.rubocop_todo.yml +23 -38
- data/.ruby-version +1 -1
- data/CHANGELOG.md +185 -51
- data/CONTRIBUTING.md +14 -13
- data/Gemfile +15 -1
- data/README.md +136 -77
- data/docs/COMPATIBILITY.md +3 -3
- data/lib/statesman/adapters/active_record.rb +0 -2
- data/lib/statesman/adapters/active_record_queries.rb +1 -1
- data/lib/statesman/callback.rb +2 -2
- data/lib/statesman/config.rb +1 -1
- data/lib/statesman/guard.rb +1 -1
- data/lib/statesman/machine.rb +8 -0
- data/lib/statesman/version.rb +1 -1
- data/lib/statesman.rb +1 -1
- data/spec/statesman/adapters/active_record_queries_spec.rb +2 -2
- data/spec/statesman/adapters/active_record_spec.rb +8 -6
- data/spec/statesman/adapters/shared_examples.rb +4 -3
- data/spec/statesman/adapters/type_safe_active_record_queries_spec.rb +1 -1
- data/spec/statesman/machine_spec.rb +81 -9
- data/spec/support/active_record.rb +2 -2
- data/statesman.gemspec +1 -15
- metadata +7 -202
@@ -120,9 +120,10 @@ shared_examples_for "an adapter" do |adapter_class, transition_class, options =
|
|
120
120
|
describe "#last" do
|
121
121
|
subject { adapter.last }
|
122
122
|
|
123
|
-
before
|
124
|
-
|
125
|
-
|
123
|
+
before do
|
124
|
+
adapter.create(:x, :y)
|
125
|
+
adapter.create(:y, :z)
|
126
|
+
end
|
126
127
|
|
127
128
|
it { is_expected.to be_a(transition_class) }
|
128
129
|
specify { expect(adapter.last.to_state.to_sym).to eq(:z) }
|
@@ -5,9 +5,10 @@ describe Statesman::Machine do
|
|
5
5
|
let(:my_model) { Class.new { attr_accessor :current_state }.new }
|
6
6
|
|
7
7
|
describe ".state" do
|
8
|
-
before
|
9
|
-
|
10
|
-
|
8
|
+
before do
|
9
|
+
machine.state(:x)
|
10
|
+
machine.state(:y)
|
11
|
+
end
|
11
12
|
|
12
13
|
specify { expect(machine.states).to eq(%w[x y]) }
|
13
14
|
|
@@ -478,12 +479,83 @@ describe Statesman::Machine do
|
|
478
479
|
it_behaves_like "a callback store", :after_guard_failure, :after_guard_failure
|
479
480
|
end
|
480
481
|
|
482
|
+
shared_examples "initial transition is not created" do
|
483
|
+
it "doesn't call .create on storage adapter" do
|
484
|
+
expect_any_instance_of(Statesman.storage_adapter).to_not receive(:create)
|
485
|
+
machine.new(my_model, options)
|
486
|
+
end
|
487
|
+
end
|
488
|
+
|
489
|
+
shared_examples "initial transition is created" do
|
490
|
+
it "calls .create on storage adapter" do
|
491
|
+
expect_any_instance_of(Statesman.storage_adapter).to receive(:create).with(nil, "x")
|
492
|
+
machine.new(my_model, options)
|
493
|
+
end
|
494
|
+
|
495
|
+
it "creates a new transition object" do
|
496
|
+
instance = machine.new(my_model, options)
|
497
|
+
|
498
|
+
expect(instance.history.count).to eq(1)
|
499
|
+
expect(instance.history.first.to_state).to eq("x")
|
500
|
+
end
|
501
|
+
end
|
502
|
+
|
481
503
|
describe "#initialize" do
|
482
504
|
it "accepts an object to manipulate" do
|
483
505
|
machine_instance = machine.new(my_model)
|
484
506
|
expect(machine_instance.object).to be(my_model)
|
485
507
|
end
|
486
508
|
|
509
|
+
context "initial_transition is not provided" do
|
510
|
+
let(:options) { {} }
|
511
|
+
|
512
|
+
it_behaves_like "initial transition is not created"
|
513
|
+
end
|
514
|
+
|
515
|
+
context "initial_transition is provided" do
|
516
|
+
context "initial_transition is true" do
|
517
|
+
let(:options) do
|
518
|
+
{ initial_transition: true,
|
519
|
+
transition_class: Statesman::Adapters::MemoryTransition }
|
520
|
+
end
|
521
|
+
|
522
|
+
context "history is empty" do
|
523
|
+
context "initial state is defined" do
|
524
|
+
before { machine.state(:x, initial: true) }
|
525
|
+
|
526
|
+
it_behaves_like "initial transition is created"
|
527
|
+
end
|
528
|
+
|
529
|
+
context "initial state is not defined" do
|
530
|
+
it_behaves_like "initial transition is not created"
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
context "history is not empty" do
|
535
|
+
before do
|
536
|
+
allow_any_instance_of(Statesman.storage_adapter).to receive(:history).
|
537
|
+
and_return([{}])
|
538
|
+
end
|
539
|
+
|
540
|
+
context "initial state is defined" do
|
541
|
+
before { machine.state(:x, initial: true) }
|
542
|
+
|
543
|
+
it_behaves_like "initial transition is not created"
|
544
|
+
end
|
545
|
+
|
546
|
+
context "initial state is not defined" do
|
547
|
+
it_behaves_like "initial transition is not created"
|
548
|
+
end
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
context "initial_transition is false" do
|
553
|
+
let(:options) { { initial_transition: false } }
|
554
|
+
|
555
|
+
it_behaves_like "initial transition is not created"
|
556
|
+
end
|
557
|
+
end
|
558
|
+
|
487
559
|
context "transition class" do
|
488
560
|
it "sets a default" do
|
489
561
|
expect(Statesman.storage_adapter).to receive(:new).once.
|
@@ -539,9 +611,10 @@ describe Statesman::Machine do
|
|
539
611
|
end
|
540
612
|
|
541
613
|
context "with multiple transitions" do
|
542
|
-
before
|
543
|
-
|
544
|
-
|
614
|
+
before do
|
615
|
+
instance.transition_to!(:y)
|
616
|
+
instance.transition_to!(:z)
|
617
|
+
end
|
545
618
|
|
546
619
|
it { is_expected.to eq("z") }
|
547
620
|
end
|
@@ -556,12 +629,11 @@ describe Statesman::Machine do
|
|
556
629
|
state :y
|
557
630
|
transition from: :x, to: :y
|
558
631
|
end
|
632
|
+
instance.transition_to!(:y)
|
559
633
|
end
|
560
634
|
|
561
635
|
let(:instance) { machine.new(my_model) }
|
562
636
|
|
563
|
-
before { instance.transition_to!(:y) }
|
564
|
-
|
565
637
|
context "when machine is in given state" do
|
566
638
|
let(:state) { "y" }
|
567
639
|
|
@@ -924,7 +996,7 @@ describe Statesman::Machine do
|
|
924
996
|
let(:instance) { machine.new(my_model) }
|
925
997
|
let(:metadata) { { some: :metadata } }
|
926
998
|
|
927
|
-
context "when it is
|
999
|
+
context "when it is successful" do
|
928
1000
|
before do
|
929
1001
|
expect(instance).to receive(:transition_to!).once.
|
930
1002
|
with(:some_state, metadata).and_return(:some_state)
|
@@ -32,7 +32,7 @@ class MyActiveRecordModel < ActiveRecord::Base
|
|
32
32
|
|
33
33
|
include Statesman::Adapters::ActiveRecordQueries[
|
34
34
|
transition_class: MyActiveRecordModelTransition,
|
35
|
-
initial_state: :initial
|
35
|
+
initial_state: :initial,
|
36
36
|
]
|
37
37
|
|
38
38
|
def state_machine
|
@@ -162,7 +162,7 @@ class SecondaryActiveRecordModel < SecondaryRecord
|
|
162
162
|
|
163
163
|
include Statesman::Adapters::ActiveRecordQueries[
|
164
164
|
transition_class: SecondaryActiveRecordModelTransition,
|
165
|
-
initial_state: :initial
|
165
|
+
initial_state: :initial,
|
166
166
|
]
|
167
167
|
|
168
168
|
def state_machine
|
data/statesman.gemspec
CHANGED
@@ -20,21 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.required_ruby_version = ">= 2
|
24
|
-
|
25
|
-
spec.add_development_dependency "ammeter", "~> 1.1"
|
26
|
-
spec.add_development_dependency "bundler", "~> 2"
|
27
|
-
spec.add_development_dependency "gc_ruboconfig", "~> 4.3.0"
|
28
|
-
spec.add_development_dependency "mysql2", ">= 0.4", "< 0.6"
|
29
|
-
spec.add_development_dependency "pg", ">= 0.18", "<= 1.6"
|
30
|
-
spec.add_development_dependency "rails", ">= 5.2"
|
31
|
-
spec.add_development_dependency "rake", "~> 13.0.0"
|
32
|
-
spec.add_development_dependency "rspec", "~> 3.1"
|
33
|
-
spec.add_development_dependency "rspec-github", "~> 2.4.0"
|
34
|
-
spec.add_development_dependency "rspec-its", "~> 1.1"
|
35
|
-
spec.add_development_dependency "rspec-rails", "~> 6.0"
|
36
|
-
spec.add_development_dependency "sqlite3", "~> 1.6.1"
|
37
|
-
spec.add_development_dependency "timecop", "~> 0.9.1"
|
23
|
+
spec.required_ruby_version = ">= 3.2"
|
38
24
|
|
39
25
|
spec.metadata = {
|
40
26
|
"bug_tracker_uri" => "#{GITHUB_URL}/issues",
|
metadata
CHANGED
@@ -1,209 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: statesman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 13.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GoCardless
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: ammeter
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.1'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.1'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '2'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: gc_ruboconfig
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 4.3.0
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 4.3.0
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: mysql2
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0.4'
|
62
|
-
- - "<"
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: '0.6'
|
65
|
-
type: :development
|
66
|
-
prerelease: false
|
67
|
-
version_requirements: !ruby/object:Gem::Requirement
|
68
|
-
requirements:
|
69
|
-
- - ">="
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
version: '0.4'
|
72
|
-
- - "<"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '0.6'
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: pg
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - ">="
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '0.18'
|
82
|
-
- - "<="
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
version: '1.6'
|
85
|
-
type: :development
|
86
|
-
prerelease: false
|
87
|
-
version_requirements: !ruby/object:Gem::Requirement
|
88
|
-
requirements:
|
89
|
-
- - ">="
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version: '0.18'
|
92
|
-
- - "<="
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
version: '1.6'
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: rails
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
requirements:
|
99
|
-
- - ">="
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '5.2'
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
requirements:
|
106
|
-
- - ">="
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version: '5.2'
|
109
|
-
- !ruby/object:Gem::Dependency
|
110
|
-
name: rake
|
111
|
-
requirement: !ruby/object:Gem::Requirement
|
112
|
-
requirements:
|
113
|
-
- - "~>"
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
version: 13.0.0
|
116
|
-
type: :development
|
117
|
-
prerelease: false
|
118
|
-
version_requirements: !ruby/object:Gem::Requirement
|
119
|
-
requirements:
|
120
|
-
- - "~>"
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
version: 13.0.0
|
123
|
-
- !ruby/object:Gem::Dependency
|
124
|
-
name: rspec
|
125
|
-
requirement: !ruby/object:Gem::Requirement
|
126
|
-
requirements:
|
127
|
-
- - "~>"
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
version: '3.1'
|
130
|
-
type: :development
|
131
|
-
prerelease: false
|
132
|
-
version_requirements: !ruby/object:Gem::Requirement
|
133
|
-
requirements:
|
134
|
-
- - "~>"
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
version: '3.1'
|
137
|
-
- !ruby/object:Gem::Dependency
|
138
|
-
name: rspec-github
|
139
|
-
requirement: !ruby/object:Gem::Requirement
|
140
|
-
requirements:
|
141
|
-
- - "~>"
|
142
|
-
- !ruby/object:Gem::Version
|
143
|
-
version: 2.4.0
|
144
|
-
type: :development
|
145
|
-
prerelease: false
|
146
|
-
version_requirements: !ruby/object:Gem::Requirement
|
147
|
-
requirements:
|
148
|
-
- - "~>"
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: 2.4.0
|
151
|
-
- !ruby/object:Gem::Dependency
|
152
|
-
name: rspec-its
|
153
|
-
requirement: !ruby/object:Gem::Requirement
|
154
|
-
requirements:
|
155
|
-
- - "~>"
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: '1.1'
|
158
|
-
type: :development
|
159
|
-
prerelease: false
|
160
|
-
version_requirements: !ruby/object:Gem::Requirement
|
161
|
-
requirements:
|
162
|
-
- - "~>"
|
163
|
-
- !ruby/object:Gem::Version
|
164
|
-
version: '1.1'
|
165
|
-
- !ruby/object:Gem::Dependency
|
166
|
-
name: rspec-rails
|
167
|
-
requirement: !ruby/object:Gem::Requirement
|
168
|
-
requirements:
|
169
|
-
- - "~>"
|
170
|
-
- !ruby/object:Gem::Version
|
171
|
-
version: '6.0'
|
172
|
-
type: :development
|
173
|
-
prerelease: false
|
174
|
-
version_requirements: !ruby/object:Gem::Requirement
|
175
|
-
requirements:
|
176
|
-
- - "~>"
|
177
|
-
- !ruby/object:Gem::Version
|
178
|
-
version: '6.0'
|
179
|
-
- !ruby/object:Gem::Dependency
|
180
|
-
name: sqlite3
|
181
|
-
requirement: !ruby/object:Gem::Requirement
|
182
|
-
requirements:
|
183
|
-
- - "~>"
|
184
|
-
- !ruby/object:Gem::Version
|
185
|
-
version: 1.6.1
|
186
|
-
type: :development
|
187
|
-
prerelease: false
|
188
|
-
version_requirements: !ruby/object:Gem::Requirement
|
189
|
-
requirements:
|
190
|
-
- - "~>"
|
191
|
-
- !ruby/object:Gem::Version
|
192
|
-
version: 1.6.1
|
193
|
-
- !ruby/object:Gem::Dependency
|
194
|
-
name: timecop
|
195
|
-
requirement: !ruby/object:Gem::Requirement
|
196
|
-
requirements:
|
197
|
-
- - "~>"
|
198
|
-
- !ruby/object:Gem::Version
|
199
|
-
version: 0.9.1
|
200
|
-
type: :development
|
201
|
-
prerelease: false
|
202
|
-
version_requirements: !ruby/object:Gem::Requirement
|
203
|
-
requirements:
|
204
|
-
- - "~>"
|
205
|
-
- !ruby/object:Gem::Version
|
206
|
-
version: 0.9.1
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies: []
|
207
12
|
description: A statesman-like state machine library
|
208
13
|
email:
|
209
14
|
- developers@gocardless.com
|
@@ -211,6 +16,8 @@ executables: []
|
|
211
16
|
extensions: []
|
212
17
|
extra_rdoc_files: []
|
213
18
|
files:
|
19
|
+
- ".devcontainer/devcontainer.json"
|
20
|
+
- ".devcontainer/docker-compose.yml"
|
214
21
|
- ".github/dependabot.yml"
|
215
22
|
- ".github/workflows/tests.yml"
|
216
23
|
- ".gitignore"
|
@@ -281,7 +88,6 @@ metadata:
|
|
281
88
|
homepage_uri: https://github.com/gocardless/statesman
|
282
89
|
source_code_uri: https://github.com/gocardless/statesman
|
283
90
|
rubygems_mfa_required: 'true'
|
284
|
-
post_install_message:
|
285
91
|
rdoc_options: []
|
286
92
|
require_paths:
|
287
93
|
- lib
|
@@ -289,15 +95,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
289
95
|
requirements:
|
290
96
|
- - ">="
|
291
97
|
- !ruby/object:Gem::Version
|
292
|
-
version: '2
|
98
|
+
version: '3.2'
|
293
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
294
100
|
requirements:
|
295
101
|
- - ">="
|
296
102
|
- !ruby/object:Gem::Version
|
297
103
|
version: '0'
|
298
104
|
requirements: []
|
299
|
-
rubygems_version: 3.
|
300
|
-
signing_key:
|
105
|
+
rubygems_version: 3.6.9
|
301
106
|
specification_version: 4
|
302
107
|
summary: A statesman-like state machine library
|
303
108
|
test_files: []
|