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.
@@ -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 { adapter.create(:x, :y) }
124
-
125
- before { adapter.create(:y, :z) }
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) }
@@ -201,6 +201,6 @@ describe Statesman::Adapters::TypeSafeActiveRecordQueries, :active_record do
201
201
  end
202
202
 
203
203
  context "using configuration method" do
204
- include_examples "testing methods"
204
+ it_behaves_like "testing methods"
205
205
  end
206
206
  end
@@ -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 { machine.state(:x) }
9
-
10
- before { machine.state(:y) }
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 { instance.transition_to!(:y) }
543
-
544
- before { instance.transition_to!(:z) }
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 succesful" do
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.7"
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: 12.0.0
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: 2023-11-30 00:00:00.000000000 Z
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.7'
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.4.10
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: []