statesman 10.0.0 → 10.2.3

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.
@@ -20,10 +20,22 @@ class MyStateMachine
20
20
  transition from: :failed, to: :initial
21
21
  end
22
22
 
23
+ class MyActiveRecordModelTransition < ActiveRecord::Base
24
+ include Statesman::Adapters::ActiveRecordTransition
25
+
26
+ belongs_to :my_active_record_model
27
+ serialize :metadata, JSON
28
+ end
29
+
23
30
  class MyActiveRecordModel < ActiveRecord::Base
24
31
  has_many :my_active_record_model_transitions, autosave: false
25
32
  alias_method :transitions, :my_active_record_model_transitions
26
33
 
34
+ include Statesman::Adapters::ActiveRecordQueries[
35
+ transition_class: MyActiveRecordModelTransition,
36
+ initial_state: :initial
37
+ ]
38
+
27
39
  def state_machine
28
40
  @state_machine ||= MyStateMachine.new(
29
41
  self, transition_class: MyActiveRecordModelTransition
@@ -33,18 +45,6 @@ class MyActiveRecordModel < ActiveRecord::Base
33
45
  def metadata
34
46
  super || {}
35
47
  end
36
-
37
- def reload(*)
38
- state_machine.reset
39
- super
40
- end
41
- end
42
-
43
- class MyActiveRecordModelTransition < ActiveRecord::Base
44
- include Statesman::Adapters::ActiveRecordTransition
45
-
46
- belongs_to :my_active_record_model
47
- serialize :metadata, JSON
48
48
  end
49
49
 
50
50
  class MyActiveRecordModelTransitionWithoutInclude < ActiveRecord::Base
@@ -64,7 +64,6 @@ class CreateMyActiveRecordModelMigration < MIGRATION_CLASS
64
64
  end
65
65
 
66
66
  # TODO: make this a module we can extend from the app? Or a generator?
67
- # rubocop:disable Metrics/MethodLength
68
67
  class CreateMyActiveRecordModelTransitionMigration < MIGRATION_CLASS
69
68
  def change
70
69
  create_table :my_active_record_model_transitions do |t|
@@ -110,7 +109,6 @@ class CreateMyActiveRecordModelTransitionMigration < MIGRATION_CLASS
110
109
  end
111
110
  end
112
111
  end
113
- # rubocop:enable Metrics/MethodLength
114
112
 
115
113
  class OtherActiveRecordModel < ActiveRecord::Base
116
114
  has_many :other_active_record_model_transitions, autosave: false
@@ -144,7 +142,6 @@ class CreateOtherActiveRecordModelMigration < MIGRATION_CLASS
144
142
  end
145
143
  end
146
144
 
147
- # rubocop:disable Metrics/MethodLength
148
145
  class CreateOtherActiveRecordModelTransitionMigration < MIGRATION_CLASS
149
146
  def change
150
147
  create_table :other_active_record_model_transitions do |t|
@@ -177,18 +174,17 @@ class CreateOtherActiveRecordModelTransitionMigration < MIGRATION_CLASS
177
174
  %i[other_active_record_model_id most_recent],
178
175
  unique: true,
179
176
  where: "most_recent",
180
- name: "index_other_active_record_model_transitions_"\
177
+ name: "index_other_active_record_model_transitions_" \
181
178
  "parent_latest"
182
179
  else
183
180
  add_index :other_active_record_model_transitions,
184
181
  %i[other_active_record_model_id most_recent],
185
182
  unique: true,
186
- name: "index_other_active_record_model_transitions_"\
183
+ name: "index_other_active_record_model_transitions_" \
187
184
  "parent_latest"
188
185
  end
189
186
  end
190
187
  end
191
- # rubocop:enable Metrics/MethodLength
192
188
 
193
189
  class DropMostRecentColumn < MIGRATION_CLASS
194
190
  def change
@@ -242,7 +238,6 @@ class CreateNamespacedARModelMigration < MIGRATION_CLASS
242
238
  end
243
239
  end
244
240
 
245
- # rubocop:disable Metrics/MethodLength
246
241
  class CreateNamespacedARModelTransitionMigration < MIGRATION_CLASS
247
242
  def change
248
243
  create_table :my_namespace_my_active_record_model_transitions do |t|
@@ -282,5 +277,95 @@ class CreateNamespacedARModelTransitionMigration < MIGRATION_CLASS
282
277
  name: "index_namespace_model_transitions_parent_latest"
283
278
  end
284
279
  end
285
- # rubocop:enable Metrics/MethodLength
280
+ end
281
+
282
+ class StiActiveRecordModel < ActiveRecord::Base
283
+ has_many :sti_a_active_record_model_transitions, autosave: false
284
+ has_many :sti_b_active_record_model_transitions, autosave: false
285
+
286
+ def state_machine_a
287
+ @state_machine_a ||= MyStateMachine.new(
288
+ self, transition_class: StiAActiveRecordModelTransition
289
+ )
290
+ end
291
+
292
+ def state_machine_b
293
+ @state_machine_b ||= MyStateMachine.new(
294
+ self, transition_class: StiBActiveRecordModelTransition
295
+ )
296
+ end
297
+
298
+ def metadata
299
+ super || {}
300
+ end
301
+
302
+ def reload(*)
303
+ state_machine_a.reset
304
+ state_machine_b.reset
305
+ super
306
+ end
307
+ end
308
+
309
+ class StiActiveRecordModelTransition < ActiveRecord::Base
310
+ include Statesman::Adapters::ActiveRecordTransition
311
+
312
+ belongs_to :sti_active_record_model
313
+ serialize :metadata, JSON
314
+ end
315
+
316
+ class StiAActiveRecordModelTransition < StiActiveRecordModelTransition
317
+ end
318
+
319
+ class StiBActiveRecordModelTransition < StiActiveRecordModelTransition
320
+ end
321
+
322
+ class CreateStiActiveRecordModelMigration < MIGRATION_CLASS
323
+ def change
324
+ create_table :sti_active_record_models do |t|
325
+ t.timestamps null: false
326
+ end
327
+ end
328
+ end
329
+
330
+ class CreateStiActiveRecordModelTransitionMigration < MIGRATION_CLASS
331
+ def change
332
+ create_table :sti_active_record_model_transitions do |t|
333
+ t.string :to_state
334
+ t.integer :sti_active_record_model_id
335
+ t.integer :sort_key
336
+ t.string :type
337
+
338
+ # MySQL doesn't allow default values on text fields
339
+ if ActiveRecord::Base.connection.adapter_name == "Mysql2"
340
+ t.text :metadata
341
+ else
342
+ t.text :metadata, default: "{}"
343
+ end
344
+
345
+ if Statesman::Adapters::ActiveRecord.database_supports_partial_indexes?
346
+ t.boolean :most_recent, default: true, null: false
347
+ else
348
+ t.boolean :most_recent, default: true
349
+ end
350
+
351
+ t.timestamps null: false
352
+ end
353
+
354
+ add_index :sti_active_record_model_transitions,
355
+ %i[type sti_active_record_model_id sort_key],
356
+ unique: true, name: "sti_sort_key_index"
357
+
358
+ if Statesman::Adapters::ActiveRecord.database_supports_partial_indexes?
359
+ add_index :sti_active_record_model_transitions,
360
+ %i[type sti_active_record_model_id most_recent],
361
+ unique: true,
362
+ where: "most_recent",
363
+ name: "index_sti_active_record_model_transitions_parent_latest"
364
+ else
365
+ add_index :sti_active_record_model_transitions,
366
+ %i[type sti_active_record_model_id most_recent],
367
+ unique: true,
368
+ name: "index_sti_active_record_model_transitions_parent_latest"
369
+ end
370
+ end
286
371
  end
data/statesman.gemspec CHANGED
@@ -18,24 +18,22 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
20
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
21
  spec.require_paths = ["lib"]
23
22
 
24
23
  spec.required_ruby_version = ">= 2.7"
25
24
 
26
25
  spec.add_development_dependency "ammeter", "~> 1.1"
27
26
  spec.add_development_dependency "bundler", "~> 2"
28
- spec.add_development_dependency "gc_ruboconfig", "~> 2.26.0"
27
+ spec.add_development_dependency "gc_ruboconfig", "~> 3.6.0"
29
28
  spec.add_development_dependency "mysql2", ">= 0.4", "< 0.6"
30
- spec.add_development_dependency "pg", ">= 0.18", "<= 1.3"
31
- spec.add_development_dependency "pry"
29
+ spec.add_development_dependency "pg", ">= 0.18", "<= 1.5"
32
30
  spec.add_development_dependency "rails", ">= 5.2"
33
31
  spec.add_development_dependency "rake", "~> 13.0.0"
34
32
  spec.add_development_dependency "rspec", "~> 3.1"
33
+ spec.add_development_dependency "rspec-github", "~> 2.4.0"
35
34
  spec.add_development_dependency "rspec-its", "~> 1.1"
36
- spec.add_development_dependency "rspec_junit_formatter", "~> 0.5.1"
37
- spec.add_development_dependency "rspec-rails", "~> 3.1"
38
- spec.add_development_dependency "sqlite3", "~> 1.4.2"
35
+ spec.add_development_dependency "rspec-rails", "~> 6.0"
36
+ spec.add_development_dependency "sqlite3", "~> 1.6.1"
39
37
  spec.add_development_dependency "timecop", "~> 0.9.1"
40
38
 
41
39
  spec.metadata = {
@@ -44,5 +42,6 @@ Gem::Specification.new do |spec|
44
42
  "documentation_uri" => "#{GITHUB_URL}/blob/master/README.md",
45
43
  "homepage_uri" => GITHUB_URL,
46
44
  "source_code_uri" => GITHUB_URL,
45
+ "rubygems_mfa_required" => "true",
47
46
  }
48
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: statesman
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.0.0
4
+ version: 10.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - GoCardless
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-17 00:00:00.000000000 Z
11
+ date: 2023-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ammeter
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 2.26.0
47
+ version: 3.6.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 2.26.0
54
+ version: 3.6.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: mysql2
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +81,7 @@ dependencies:
81
81
  version: '0.18'
82
82
  - - "<="
83
83
  - !ruby/object:Gem::Version
84
- version: '1.3'
84
+ version: '1.5'
85
85
  type: :development
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
@@ -91,21 +91,7 @@ dependencies:
91
91
  version: '0.18'
92
92
  - - "<="
93
93
  - !ruby/object:Gem::Version
94
- version: '1.3'
95
- - !ruby/object:Gem::Dependency
96
- name: pry
97
- requirement: !ruby/object:Gem::Requirement
98
- requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: '0'
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- requirements:
106
- - - ">="
107
- - !ruby/object:Gem::Version
108
- version: '0'
94
+ version: '1.5'
109
95
  - !ruby/object:Gem::Dependency
110
96
  name: rails
111
97
  requirement: !ruby/object:Gem::Requirement
@@ -149,61 +135,61 @@ dependencies:
149
135
  - !ruby/object:Gem::Version
150
136
  version: '3.1'
151
137
  - !ruby/object:Gem::Dependency
152
- name: rspec-its
138
+ name: rspec-github
153
139
  requirement: !ruby/object:Gem::Requirement
154
140
  requirements:
155
141
  - - "~>"
156
142
  - !ruby/object:Gem::Version
157
- version: '1.1'
143
+ version: 2.4.0
158
144
  type: :development
159
145
  prerelease: false
160
146
  version_requirements: !ruby/object:Gem::Requirement
161
147
  requirements:
162
148
  - - "~>"
163
149
  - !ruby/object:Gem::Version
164
- version: '1.1'
150
+ version: 2.4.0
165
151
  - !ruby/object:Gem::Dependency
166
- name: rspec_junit_formatter
152
+ name: rspec-its
167
153
  requirement: !ruby/object:Gem::Requirement
168
154
  requirements:
169
155
  - - "~>"
170
156
  - !ruby/object:Gem::Version
171
- version: 0.5.1
157
+ version: '1.1'
172
158
  type: :development
173
159
  prerelease: false
174
160
  version_requirements: !ruby/object:Gem::Requirement
175
161
  requirements:
176
162
  - - "~>"
177
163
  - !ruby/object:Gem::Version
178
- version: 0.5.1
164
+ version: '1.1'
179
165
  - !ruby/object:Gem::Dependency
180
166
  name: rspec-rails
181
167
  requirement: !ruby/object:Gem::Requirement
182
168
  requirements:
183
169
  - - "~>"
184
170
  - !ruby/object:Gem::Version
185
- version: '3.1'
171
+ version: '6.0'
186
172
  type: :development
187
173
  prerelease: false
188
174
  version_requirements: !ruby/object:Gem::Requirement
189
175
  requirements:
190
176
  - - "~>"
191
177
  - !ruby/object:Gem::Version
192
- version: '3.1'
178
+ version: '6.0'
193
179
  - !ruby/object:Gem::Dependency
194
180
  name: sqlite3
195
181
  requirement: !ruby/object:Gem::Requirement
196
182
  requirements:
197
183
  - - "~>"
198
184
  - !ruby/object:Gem::Version
199
- version: 1.4.2
185
+ version: 1.6.1
200
186
  type: :development
201
187
  prerelease: false
202
188
  version_requirements: !ruby/object:Gem::Requirement
203
189
  requirements:
204
190
  - - "~>"
205
191
  - !ruby/object:Gem::Version
206
- version: 1.4.2
192
+ version: 1.6.1
207
193
  - !ruby/object:Gem::Dependency
208
194
  name: timecop
209
195
  requirement: !ruby/object:Gem::Requirement
@@ -225,8 +211,8 @@ executables: []
225
211
  extensions: []
226
212
  extra_rdoc_files: []
227
213
  files:
228
- - ".circleci/config.yml"
229
214
  - ".github/dependabot.yml"
215
+ - ".github/workflows/tests.yml"
230
216
  - ".gitignore"
231
217
  - ".rubocop.yml"
232
218
  - ".rubocop_todo.yml"
@@ -251,6 +237,7 @@ files:
251
237
  - lib/statesman/adapters/active_record_transition.rb
252
238
  - lib/statesman/adapters/memory.rb
253
239
  - lib/statesman/adapters/memory_transition.rb
240
+ - lib/statesman/adapters/type_safe_active_record_queries.rb
254
241
  - lib/statesman/callback.rb
255
242
  - lib/statesman/config.rb
256
243
  - lib/statesman/exceptions.rb
@@ -272,6 +259,7 @@ files:
272
259
  - spec/statesman/adapters/memory_spec.rb
273
260
  - spec/statesman/adapters/memory_transition_spec.rb
274
261
  - spec/statesman/adapters/shared_examples.rb
262
+ - spec/statesman/adapters/type_safe_active_record_queries_spec.rb
275
263
  - spec/statesman/callback_spec.rb
276
264
  - spec/statesman/config_spec.rb
277
265
  - spec/statesman/exceptions_spec.rb
@@ -290,6 +278,7 @@ metadata:
290
278
  documentation_uri: https://github.com/gocardless/statesman/blob/master/README.md
291
279
  homepage_uri: https://github.com/gocardless/statesman
292
280
  source_code_uri: https://github.com/gocardless/statesman
281
+ rubygems_mfa_required: 'true'
293
282
  post_install_message:
294
283
  rdoc_options: []
295
284
  require_paths:
@@ -305,28 +294,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
305
294
  - !ruby/object:Gem::Version
306
295
  version: '0'
307
296
  requirements: []
308
- rubygems_version: 3.2.22
297
+ rubygems_version: 3.4.1
309
298
  signing_key:
310
299
  specification_version: 4
311
300
  summary: A statesman-like state machine library
312
- test_files:
313
- - spec/fixtures/add_constraints_to_most_recent_for_bacon_transitions_with_partial_index.rb
314
- - spec/fixtures/add_constraints_to_most_recent_for_bacon_transitions_without_partial_index.rb
315
- - spec/fixtures/add_most_recent_to_bacon_transitions.rb
316
- - spec/generators/statesman/active_record_transition_generator_spec.rb
317
- - spec/generators/statesman/migration_generator_spec.rb
318
- - spec/spec_helper.rb
319
- - spec/statesman/adapters/active_record_queries_spec.rb
320
- - spec/statesman/adapters/active_record_spec.rb
321
- - spec/statesman/adapters/active_record_transition_spec.rb
322
- - spec/statesman/adapters/memory_spec.rb
323
- - spec/statesman/adapters/memory_transition_spec.rb
324
- - spec/statesman/adapters/shared_examples.rb
325
- - spec/statesman/callback_spec.rb
326
- - spec/statesman/config_spec.rb
327
- - spec/statesman/exceptions_spec.rb
328
- - spec/statesman/guard_spec.rb
329
- - spec/statesman/machine_spec.rb
330
- - spec/statesman/utils_spec.rb
331
- - spec/support/active_record.rb
332
- - spec/support/generators_shared_examples.rb
301
+ test_files: []
data/.circleci/config.yml DELETED
@@ -1,127 +0,0 @@
1
- ---
2
- version: 2.1
3
-
4
- references:
5
- bundle_install: &bundle_install
6
- run:
7
- name: Bundle
8
- command: |
9
- gem install bundler --no-document && \
10
- bundle config set no-cache 'true' && \
11
- bundle config set jobs '4' && \
12
- bundle config set retry '3' && \
13
- bundle install
14
-
15
- cache_bundle: &cache_bundle
16
- save_cache:
17
- key: bundle-<< parameters.ruby_version >>-<< parameters.rails_version >>-{{ checksum "statesman.gemspec" }}-{{ checksum "Gemfile" }}
18
- paths:
19
- - vendor/bundle
20
-
21
- restore_bundle: &restore_bundle
22
- restore_cache:
23
- key: bundle-<< parameters.ruby_version >>-<< parameters.rails_version >>-{{ checksum "statesman.gemspec" }}-{{ checksum "Gemfile" }}
24
-
25
- steps: &steps
26
- - add_ssh_keys
27
- - checkout
28
- - run:
29
- name: "Add dependencies"
30
- command: |
31
- sudo apt-get update && sudo apt-get install -y sqlite3 libsqlite3-dev
32
- - *restore_bundle
33
- - *bundle_install
34
- - *cache_bundle
35
- - run: dockerize -wait tcp://localhost:$DATABASE_DEPENDENCY_PORT -timeout 1m
36
- - run:
37
- name: Run specs
38
- command: |
39
- bundle exec rspec $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings) --profile --format progress --format RspecJunitFormatter -o /tmp/circle_artifacts/rspec.xml
40
- - run:
41
- name: "Rubocop"
42
- command: bundle exec rubocop --extra-details --display-style-guide --parallel --force-exclusion
43
- - store_artifacts:
44
- path: /tmp/circle_artifacts/
45
- - store_test_results:
46
- path: /tmp/circle_artifacts/
47
-
48
- ruby_versions: &ruby_versions
49
- - "2.7"
50
- - "3.0"
51
- - "3.1"
52
-
53
- rails_versions: &rails_versions
54
- - "5.2.7"
55
- - "6.0.4"
56
- - "6.1.5"
57
- - "7.0.2"
58
- - "main"
59
-
60
- mysql_versions: &mysql_versions
61
- - "5.7"
62
-
63
- psql_versions: &psql_versions
64
- - "9.6"
65
-
66
- jobs:
67
- rspec_mysql:
68
- working_directory: /mnt/ramdisk
69
- parameters:
70
- ruby_version:
71
- type: string
72
- rails_version:
73
- type: string
74
- mysql_version:
75
- type: string
76
- docker:
77
- - image: cimg/ruby:<< parameters.ruby_version >>
78
- environment:
79
- CIRCLE_TEST_REPORTS: /tmp/circle_artifacts/
80
- DATABASE_URL: mysql2://foobar:password@127.0.0.1/statesman_test
81
- DATABASE_DEPENDENCY_PORT: "3306"
82
- - image: cimg/mysql:<< parameters.mysql_version >>
83
- environment:
84
- MYSQL_ROOT_PASSWORD: password
85
- MYSQL_USER: foobar
86
- MYSQL_PASSWORD: password
87
- MYSQL_DATABASE: statesman_test
88
- steps: *steps
89
-
90
- rspec_postgres:
91
- working_directory: /mnt/ramdisk
92
- parameters:
93
- ruby_version:
94
- type: string
95
- rails_version:
96
- type: string
97
- psql_version:
98
- type: string
99
- docker:
100
- - image: cimg/ruby:<< parameters.ruby_version >>
101
- environment:
102
- CIRCLE_TEST_REPORTS: /tmp/circle_artifacts/
103
- DATABASE_URL: postgres://postgres@localhost/statesman_test
104
- DATABASE_DEPENDENCY_PORT: "5432"
105
- - image: circleci/postgres:<< parameters.psql_version >>
106
- environment:
107
- POSTGRES_USER: postgres
108
- POSTGRES_DB: statesman_test
109
- POSTGRES_PASSWORD: statesman
110
- steps: *steps
111
-
112
- workflows:
113
- version: 2
114
- tests:
115
- jobs:
116
- - rspec_mysql:
117
- matrix:
118
- parameters:
119
- mysql_version: *mysql_versions
120
- ruby_version: *ruby_versions
121
- rails_version: *rails_versions
122
- - rspec_postgres:
123
- matrix:
124
- parameters:
125
- psql_version: *psql_versions
126
- ruby_version: *ruby_versions
127
- rails_version: *rails_versions