state_machines-activerecord 0.10.0 → 0.31.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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -0
  3. data/lib/state_machines/integrations/active_record/locale.rb +10 -9
  4. data/lib/state_machines/integrations/active_record/version.rb +1 -1
  5. data/lib/state_machines/integrations/active_record.rb +40 -24
  6. metadata +34 -137
  7. data/test/files/en.yml +0 -5
  8. data/test/files/models/post.rb +0 -13
  9. data/test/integration_test.rb +0 -27
  10. data/test/machine_by_default_test.rb +0 -18
  11. data/test/machine_errors_test.rb +0 -21
  12. data/test/machine_multiple_test.rb +0 -19
  13. data/test/machine_nested_action_test.rb +0 -40
  14. data/test/machine_unmigrated_test.rb +0 -16
  15. data/test/machine_with_aliased_attribute_test.rb +0 -25
  16. data/test/machine_with_callbacks_test.rb +0 -174
  17. data/test/machine_with_column_state_attribute_test.rb +0 -46
  18. data/test/machine_with_complex_pluralization_scopes_test.rb +0 -18
  19. data/test/machine_with_conflicting_predicate_test.rb +0 -20
  20. data/test/machine_with_conflicting_state_name_test.rb +0 -31
  21. data/test/machine_with_custom_attribute_test.rb +0 -23
  22. data/test/machine_with_default_scope_test.rb +0 -20
  23. data/test/machine_with_different_column_default_test.rb +0 -29
  24. data/test/machine_with_different_integer_column_default_test.rb +0 -31
  25. data/test/machine_with_dirty_attribute_and_custom_attributes_during_loopback_test.rb +0 -26
  26. data/test/machine_with_dirty_attribute_and_state_events_test.rb +0 -22
  27. data/test/machine_with_dirty_attributes_and_custom_attribute_test.rb +0 -34
  28. data/test/machine_with_dirty_attributes_during_loopback_test.rb +0 -24
  29. data/test/machine_with_dirty_attributes_test.rb +0 -37
  30. data/test/machine_with_dynamic_initial_state_test.rb +0 -101
  31. data/test/machine_with_event_attributes_on_autosave_test.rb +0 -50
  32. data/test/machine_with_event_attributes_on_custom_action_test.rb +0 -43
  33. data/test/machine_with_event_attributes_on_save_bang_test.rb +0 -84
  34. data/test/machine_with_event_attributes_on_save_test.rb +0 -246
  35. data/test/machine_with_event_attributes_on_validation_test.rb +0 -145
  36. data/test/machine_with_events_test.rb +0 -15
  37. data/test/machine_with_failed_action_test.rb +0 -42
  38. data/test/machine_with_failed_after_callbacks_test.rb +0 -37
  39. data/test/machine_with_failed_before_callbacks_test.rb +0 -38
  40. data/test/machine_with_initialized_state_test.rb +0 -43
  41. data/test/machine_with_internationalization_test.rb +0 -182
  42. data/test/machine_with_loopback_test.rb +0 -24
  43. data/test/machine_with_non_column_state_attribute_defined_test.rb +0 -31
  44. data/test/machine_with_same_column_default_test.rb +0 -28
  45. data/test/machine_with_same_integer_column_default_test.rb +0 -32
  46. data/test/machine_with_scopes_and_joins_test.rb +0 -40
  47. data/test/machine_with_scopes_and_owner_subclass_test.rb +0 -29
  48. data/test/machine_with_scopes_test.rb +0 -72
  49. data/test/machine_with_state_driven_validations_test.rb +0 -32
  50. data/test/machine_with_states_test.rb +0 -15
  51. data/test/machine_with_static_initial_state_test.rb +0 -169
  52. data/test/machine_with_transactions_test.rb +0 -28
  53. data/test/machine_with_validations_and_custom_attribute_test.rb +0 -23
  54. data/test/machine_with_validations_test.rb +0 -49
  55. data/test/machine_without_database_test.rb +0 -22
  56. data/test/machine_without_transactions_test.rb +0 -28
  57. data/test/model_test.rb +0 -14
  58. data/test/test_helper.rb +0 -57
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5e8b447b65a1f99ad367425556a3e726b3f42be5056af03a2a48e741851ff72
4
- data.tar.gz: 801a7943d18a71f506acefedb764cb8ed0a9caa1c459893df99f3b21419c78f7
3
+ metadata.gz: 62bf9146491c433a75447414d5f9cfbab995f876eac289ddbca8ebf7dd9f6714
4
+ data.tar.gz: 5cc62a238e1e450ec00f3f0091130dba47accf257cd1cf2759fa1b682442a09a
5
5
  SHA512:
6
- metadata.gz: c6794e0f3d9e6835682f4a541bb8bde8210599749621c262ed164bae482c78f3ec40aa6cc4279db5ed62583bd5d2f30476f43f49f5adc149ac80eb9df20ee487
7
- data.tar.gz: 0fc0b42cc6de4c17f4a844634647dd0e0245933c6a713cf51e68655b4354e03801b0a6b63e61c1e27298a1db56ae8559a605972e2a6ef3cc879f32f75691c3b6
6
+ metadata.gz: 4633127d19fc427f41ac5343be2c31c8cd11aed017b2511048dbeaacb9e18e8de17f94d2c65fd1effe49f057987269bb4d290bd23a4b8aa450b8ad1f3ec9b321
7
+ data.tar.gz: 9e2443229c90ae33740efafe0e34f931cc8cb61d50fa72069b63ab4cc6e00677d282ff2f71c9a569c63928d5e2088bd4c8d4079e00ff061093937873e33c263c
data/README.md CHANGED
@@ -63,6 +63,15 @@ Vehicle.with_state(:parked) # also plural #with_states
63
63
  Vehicle.without_states(:first_gear, :second_gear) # also singular #without_state
64
64
  ```
65
65
 
66
+ #### Transparent Scopes
67
+ State scopes will return all records when `nil` is passed, making them perfect for search filters:
68
+
69
+ ```ruby
70
+ Vehicle.with_state(nil) # Returns all vehicles
71
+ Vehicle.with_state(params[:state]) # Returns all vehicles if params[:state] is nil
72
+ Vehicle.where(color: 'red').with_state(nil) # Returns all red vehicles (chainable)
73
+ ```
74
+
66
75
  ### State driven validations
67
76
 
68
77
  As mentioned in `StateMachines::Machine#state`, you can define behaviors,
@@ -1,14 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Use lazy evaluation to avoid circular dependencies with frozen default_messages
4
+ # This ensures messages can be updated after gem loading while maintaining thread safety
3
5
  { en: {
4
- activerecord: {
5
- errors: {
6
- messages: {
7
- invalid: StateMachines::Machine.default_messages[:invalid],
8
- invalid_event: StateMachines::Machine.default_messages[:invalid_event] % ['%{state}'],
9
- invalid_transition: StateMachines::Machine.default_messages[:invalid_transition] % ['%{event}']
10
- }
11
- }
6
+ activerecord: {
7
+ errors: {
8
+ messages: {
9
+ invalid: ->(*) { StateMachines::Machine.default_messages[:invalid] },
10
+ invalid_event: ->(*) { format(StateMachines::Machine.default_messages[:invalid_event], '%<state>s') },
11
+ invalid_transition: ->(*) { format(StateMachines::Machine.default_messages[:invalid_transition], '%<event>s') }
12
+ }
12
13
  }
14
+ }
13
15
  } }
14
-
@@ -3,7 +3,7 @@
3
3
  module StateMachines
4
4
  module Integrations
5
5
  module ActiveRecord
6
- VERSION = '0.10.0'
6
+ VERSION = '0.31.0'
7
7
  end
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ require 'active_record'
3
3
  require 'state_machines/integrations/active_record/version'
4
4
 
5
5
  module StateMachines
6
- module Integrations #:nodoc:
6
+ module Integrations # :nodoc:
7
7
  # Adds support for integrating state machines with ActiveRecord models.
8
8
  #
9
9
  # == Examples
@@ -207,10 +207,10 @@ module StateMachines
207
207
  #
208
208
  # class Vehicle < ApplicationRecord
209
209
  # # with_states also aliased to with_state
210
- # scope :with_states, ->(states) { where(state: states) }
210
+ # scope :with_states, ->(states) { states.present? ? where(state: states) : all }
211
211
  #
212
212
  # # without_states also aliased to without_state
213
- # scope :without_states, ->(states) { where.not(state: states) }
213
+ # scope :without_states, ->(states) { states.present? ? where.not(state: states) : all }
214
214
  # end
215
215
  #
216
216
  # *Note*, however, that the states are converted to their stored values
@@ -226,6 +226,15 @@ module StateMachines
226
226
  #
227
227
  # Vehicle.with_state('parked')
228
228
  #
229
+ # === Transparent Scopes
230
+ #
231
+ # When `nil` is passed to any of the state scopes, they return `all` records
232
+ # without applying any filters. This allows for more flexible scope chaining
233
+ # in search interfaces:
234
+ #
235
+ # Vehicle.with_state(params[:state]) # Returns all vehicles if params[:state] is nil
236
+ # Vehicle.where(color: 'red').with_state(nil) # Returns all red vehicles
237
+ #
229
238
  # == Callbacks
230
239
  #
231
240
  # All before/after transition callbacks defined for ActiveRecord models
@@ -358,7 +367,7 @@ module StateMachines
358
367
  include ActiveModel
359
368
 
360
369
  # The default options to use for state machines using this integration
361
- @defaults = {:action => :save, use_transactions: true}
370
+ @defaults = { action: :save, use_transactions: true }
362
371
  class << self
363
372
  # Classes that inherit from ActiveRecord::Base will automatically use
364
373
  # the ActiveRecord integration.
@@ -376,28 +385,29 @@ module StateMachines
376
385
 
377
386
  # Gets the db default for the machine's attribute
378
387
  def owner_class_attribute_default
379
- if owner_class.connected? && owner_class.table_exists?
380
- owner_class.column_defaults[attribute.to_s]
381
- end
388
+ return unless owner_class.connected? && owner_class.table_exists?
389
+
390
+ owner_class.column_defaults[attribute.to_s]
382
391
  end
383
392
 
384
393
  def define_state_initializer
385
- define_helper :instance, <<-end_eval, __FILE__, __LINE__ + 1
394
+ define_helper :instance, <<-END_EVAL, __FILE__, __LINE__ + 1
386
395
  def initialize(attributes = nil, *)
387
396
  super(attributes) do |*args|
388
- scoped_attributes = (attributes || {}).merge(self.class.scope_attributes)
397
+ attributes = (attributes || {}).transform_keys { |key| self.class.attribute_aliases[key.to_s] || key }
398
+ scoped_attributes = attributes.merge(self.class.scope_attributes)
389
399
 
390
400
  self.class.state_machines.initialize_states(self, {}, scoped_attributes)
391
401
  yield(*args) if block_given?
392
402
  end
393
403
  end
394
- end_eval
404
+ END_EVAL
395
405
  end
396
406
 
397
407
  # Uses around callbacks to run state events if using the :save hook
398
408
  def define_action_hook
399
409
  if action_hook == :save
400
- define_helper :instance, <<-end_eval, __FILE__, __LINE__ + 1
410
+ define_helper :instance, <<-END_EVAL, __FILE__, __LINE__ + 1
401
411
  def save(*, **)
402
412
  self.class.state_machine(#{name.inspect}).send(:around_save, self) { super }
403
413
  end
@@ -410,15 +420,15 @@ module StateMachines
410
420
  def changed_for_autosave?
411
421
  super || self.class.state_machines.any? {|name, machine| machine.action == :save && machine.read(self, :event)}
412
422
  end
413
- end_eval
423
+ END_EVAL
414
424
  else
415
425
  super
416
426
  end
417
427
  end
418
428
 
419
429
  # Runs state events around the machine's :save action
420
- def around_save(object)
421
- object.class.state_machines.transitions(object, action).perform { yield }
430
+ def around_save(object, &)
431
+ object.class.state_machines.transitions(object, action).perform(&)
422
432
  end
423
433
 
424
434
  # Creates a scope for finding records *with* a particular state or
@@ -456,17 +466,23 @@ module StateMachines
456
466
 
457
467
  private
458
468
 
459
- # Defines a new scope with the given name
460
- def create_scope(name, scope)
461
- lambda { |model, values| model.where(scope.call(values)) }
462
- end
469
+ # Defines a new scope with the given name
470
+ def create_scope(_name, scope)
471
+ ->(model, values) { values.present? ? model.where(scope.call(values)) : model.all }
472
+ end
463
473
 
464
- # ActiveModel's use of method_missing / respond_to for attribute methods
465
- # breaks both ancestor lookups and defined?(super). Need to special-case
466
- # the existence of query attribute methods.
467
- def owner_class_ancestor_has_method?(scope, method)
468
- scope == :instance && method == "#{attribute}?" ? owner_class : super
469
- end
474
+ # Generates the results for the given scope based on one or more states to filter by
475
+ def run_scope(scope, machine, klass, states)
476
+ values = states.flatten.compact.map { |state| machine.states.fetch(state).value }
477
+ scope.call(klass, values)
478
+ end
479
+
480
+ # ActiveModel's use of method_missing / respond_to for attribute methods
481
+ # breaks both ancestor lookups and defined?(super). Need to special-case
482
+ # the existence of query attribute methods.
483
+ def owner_class_ancestor_has_method?(scope, method)
484
+ scope == :instance && method == "#{attribute}?" ? owner_class : super
485
+ end
470
486
  end
471
487
  register(ActiveRecord)
472
488
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: state_machines-activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.31.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdelkader Boudih
@@ -11,103 +11,103 @@ cert_chain: []
11
11
  date: 1980-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: state_machines-activemodel
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.10.0
19
+ version: '7.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.10.0
26
+ version: '7.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: activerecord
28
+ name: state_machines-activemodel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '7.1'
33
+ version: 0.10.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '7.1'
40
+ version: 0.10.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: appraisal
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '13.0'
47
+ version: '1'
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: '13.0'
54
+ version: '1'
55
55
  - !ruby/object:Gem::Dependency
56
- name: sqlite3
56
+ name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.3'
61
+ version: 5.4.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1.3'
68
+ version: 5.4.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: appraisal
70
+ name: minitest-reporters
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '1'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '1'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: minitest
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 5.4.0
89
+ version: '13.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 5.4.0
96
+ version: '13.0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: minitest-reporters
98
+ name: sqlite3
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: '1.3'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
110
+ version: '1.3'
111
111
  description: Adds support for creating state machines for attributes on ActiveRecord
112
112
  email:
113
113
  - terminale@gmail.com
@@ -122,62 +122,11 @@ files:
122
122
  - lib/state_machines/integrations/active_record.rb
123
123
  - lib/state_machines/integrations/active_record/locale.rb
124
124
  - lib/state_machines/integrations/active_record/version.rb
125
- - test/files/en.yml
126
- - test/files/models/post.rb
127
- - test/integration_test.rb
128
- - test/machine_by_default_test.rb
129
- - test/machine_errors_test.rb
130
- - test/machine_multiple_test.rb
131
- - test/machine_nested_action_test.rb
132
- - test/machine_unmigrated_test.rb
133
- - test/machine_with_aliased_attribute_test.rb
134
- - test/machine_with_callbacks_test.rb
135
- - test/machine_with_column_state_attribute_test.rb
136
- - test/machine_with_complex_pluralization_scopes_test.rb
137
- - test/machine_with_conflicting_predicate_test.rb
138
- - test/machine_with_conflicting_state_name_test.rb
139
- - test/machine_with_custom_attribute_test.rb
140
- - test/machine_with_default_scope_test.rb
141
- - test/machine_with_different_column_default_test.rb
142
- - test/machine_with_different_integer_column_default_test.rb
143
- - test/machine_with_dirty_attribute_and_custom_attributes_during_loopback_test.rb
144
- - test/machine_with_dirty_attribute_and_state_events_test.rb
145
- - test/machine_with_dirty_attributes_and_custom_attribute_test.rb
146
- - test/machine_with_dirty_attributes_during_loopback_test.rb
147
- - test/machine_with_dirty_attributes_test.rb
148
- - test/machine_with_dynamic_initial_state_test.rb
149
- - test/machine_with_event_attributes_on_autosave_test.rb
150
- - test/machine_with_event_attributes_on_custom_action_test.rb
151
- - test/machine_with_event_attributes_on_save_bang_test.rb
152
- - test/machine_with_event_attributes_on_save_test.rb
153
- - test/machine_with_event_attributes_on_validation_test.rb
154
- - test/machine_with_events_test.rb
155
- - test/machine_with_failed_action_test.rb
156
- - test/machine_with_failed_after_callbacks_test.rb
157
- - test/machine_with_failed_before_callbacks_test.rb
158
- - test/machine_with_initialized_state_test.rb
159
- - test/machine_with_internationalization_test.rb
160
- - test/machine_with_loopback_test.rb
161
- - test/machine_with_non_column_state_attribute_defined_test.rb
162
- - test/machine_with_same_column_default_test.rb
163
- - test/machine_with_same_integer_column_default_test.rb
164
- - test/machine_with_scopes_and_joins_test.rb
165
- - test/machine_with_scopes_and_owner_subclass_test.rb
166
- - test/machine_with_scopes_test.rb
167
- - test/machine_with_state_driven_validations_test.rb
168
- - test/machine_with_states_test.rb
169
- - test/machine_with_static_initial_state_test.rb
170
- - test/machine_with_transactions_test.rb
171
- - test/machine_with_validations_and_custom_attribute_test.rb
172
- - test/machine_with_validations_test.rb
173
- - test/machine_without_database_test.rb
174
- - test/machine_without_transactions_test.rb
175
- - test/model_test.rb
176
- - test/test_helper.rb
177
125
  homepage: https://github.com/state-machines/state_machines-activerecord/
178
126
  licenses:
179
127
  - MIT
180
- metadata: {}
128
+ metadata:
129
+ rubygems_mfa_required: 'true'
181
130
  rdoc_options: []
182
131
  require_paths:
183
132
  - lib
@@ -192,59 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
141
  - !ruby/object:Gem::Version
193
142
  version: '0'
194
143
  requirements: []
195
- rubygems_version: 3.6.7
144
+ rubygems_version: 3.6.9
196
145
  specification_version: 4
197
146
  summary: State machines Active Record Integration
198
- test_files:
199
- - test/files/en.yml
200
- - test/files/models/post.rb
201
- - test/integration_test.rb
202
- - test/machine_by_default_test.rb
203
- - test/machine_errors_test.rb
204
- - test/machine_multiple_test.rb
205
- - test/machine_nested_action_test.rb
206
- - test/machine_unmigrated_test.rb
207
- - test/machine_with_aliased_attribute_test.rb
208
- - test/machine_with_callbacks_test.rb
209
- - test/machine_with_column_state_attribute_test.rb
210
- - test/machine_with_complex_pluralization_scopes_test.rb
211
- - test/machine_with_conflicting_predicate_test.rb
212
- - test/machine_with_conflicting_state_name_test.rb
213
- - test/machine_with_custom_attribute_test.rb
214
- - test/machine_with_default_scope_test.rb
215
- - test/machine_with_different_column_default_test.rb
216
- - test/machine_with_different_integer_column_default_test.rb
217
- - test/machine_with_dirty_attribute_and_custom_attributes_during_loopback_test.rb
218
- - test/machine_with_dirty_attribute_and_state_events_test.rb
219
- - test/machine_with_dirty_attributes_and_custom_attribute_test.rb
220
- - test/machine_with_dirty_attributes_during_loopback_test.rb
221
- - test/machine_with_dirty_attributes_test.rb
222
- - test/machine_with_dynamic_initial_state_test.rb
223
- - test/machine_with_event_attributes_on_autosave_test.rb
224
- - test/machine_with_event_attributes_on_custom_action_test.rb
225
- - test/machine_with_event_attributes_on_save_bang_test.rb
226
- - test/machine_with_event_attributes_on_save_test.rb
227
- - test/machine_with_event_attributes_on_validation_test.rb
228
- - test/machine_with_events_test.rb
229
- - test/machine_with_failed_action_test.rb
230
- - test/machine_with_failed_after_callbacks_test.rb
231
- - test/machine_with_failed_before_callbacks_test.rb
232
- - test/machine_with_initialized_state_test.rb
233
- - test/machine_with_internationalization_test.rb
234
- - test/machine_with_loopback_test.rb
235
- - test/machine_with_non_column_state_attribute_defined_test.rb
236
- - test/machine_with_same_column_default_test.rb
237
- - test/machine_with_same_integer_column_default_test.rb
238
- - test/machine_with_scopes_and_joins_test.rb
239
- - test/machine_with_scopes_and_owner_subclass_test.rb
240
- - test/machine_with_scopes_test.rb
241
- - test/machine_with_state_driven_validations_test.rb
242
- - test/machine_with_states_test.rb
243
- - test/machine_with_static_initial_state_test.rb
244
- - test/machine_with_transactions_test.rb
245
- - test/machine_with_validations_and_custom_attribute_test.rb
246
- - test/machine_with_validations_test.rb
247
- - test/machine_without_database_test.rb
248
- - test/machine_without_transactions_test.rb
249
- - test/model_test.rb
250
- - test/test_helper.rb
147
+ test_files: []
data/test/files/en.yml DELETED
@@ -1,5 +0,0 @@
1
- en:
2
- activerecord:
3
- errors:
4
- messages:
5
- invalid_transition: "cannot transition"
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ActiveRecord::Base.connection.create_table(:posts, :force => true) do |t|
4
- t.string :title
5
- t.string :content
6
- t.string :state
7
- end
8
-
9
- class Post < ActiveRecord::Base
10
- state_machine initial: :draft do
11
-
12
- end
13
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'test_helper'
4
-
5
- class IntegrationTest < BaseTestCase
6
- def test_should_have_an_integration_name
7
- assert_equal :active_record, StateMachines::Integrations::ActiveRecord.integration_name
8
- end
9
-
10
- def test_should_be_before_activemodel
11
- integrations = StateMachines::Integrations.list.to_a
12
- assert StateMachines::Integrations::ActiveRecord, integrations.first
13
- assert StateMachines::Integrations::ActiveModel, integrations.last
14
- end
15
-
16
- def test_should_match_if_class_inherits_from_active_record
17
- assert StateMachines::Integrations::ActiveRecord.matches?(new_model)
18
- end
19
-
20
- def test_should_not_match_if_class_does_not_inherit_from_active_record
21
- refute StateMachines::Integrations::ActiveRecord.matches?(Class.new)
22
- end
23
-
24
- def test_should_have_defaults
25
- assert_equal({action: :save, use_transactions: true}, StateMachines::Integrations::ActiveRecord.defaults)
26
- end
27
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'test_helper'
4
-
5
- class MachineByDefaultTest < BaseTestCase
6
- def setup
7
- @model = new_model
8
- @machine = StateMachines::Machine.new(@model)
9
- end
10
-
11
- def test_should_use_save_as_action
12
- assert_equal :save, @machine.action
13
- end
14
-
15
- def test_should_use_transactions
16
- assert_equal true, @machine.use_transactions
17
- end
18
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'test_helper'
4
-
5
- class MachineErrorsTest < BaseTestCase
6
- def setup
7
- @model = new_model
8
- @machine = StateMachines::Machine.new(@model)
9
- @record = @model.new
10
- end
11
-
12
- def test_should_be_able_to_describe_current_errors
13
- @record.errors.add(:id, 'cannot be blank')
14
- @record.errors.add(:state, 'is invalid')
15
- assert_equal ['Id cannot be blank', 'State is invalid'], @machine.errors_for(@record).split(', ').sort
16
- end
17
-
18
- def test_should_describe_as_halted_with_no_errors
19
- assert_equal 'Transition halted', @machine.errors_for(@record)
20
- end
21
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'test_helper'
4
-
5
- class MachineMultipleTest < BaseTestCase
6
- def setup
7
- @model = new_model do
8
- connection.add_column table_name, :status, :string
9
- end
10
- @state_machine = StateMachines::Machine.new(@model, :initial => :parked)
11
- @status_machine = StateMachines::Machine.new(@model, :status, :initial => :idling)
12
- end
13
-
14
- def test_should_should_initialize_each_state
15
- record = @model.new
16
- assert_equal 'parked', record.state
17
- assert_equal 'idling', record.status
18
- end
19
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'test_helper'
4
-
5
- class MachineNestedActionTest < BaseTestCase
6
- def setup
7
- @callbacks = []
8
-
9
- @model = new_model
10
- @machine = StateMachines::Machine.new(@model)
11
- @machine.event :ignite do
12
- transition :parked => :idling
13
- end
14
-
15
- @record = @model.new(:state => 'parked')
16
- end
17
-
18
- def test_should_allow_transition_prior_to_creation_if_skipping_action
19
- record = @record
20
- @model.before_create { record.ignite(false) }
21
- result = @record.save
22
-
23
- assert_equal true, result
24
- assert_equal "idling", @record.state
25
- @record.reload
26
- assert_equal "idling", @record.state
27
- end
28
-
29
- def test_should_allow_transition_after_creation
30
- record = @record
31
- @model.after_create { record.ignite }
32
- result = @record.save
33
-
34
- assert_equal true, result
35
- assert_equal "idling", @record.state
36
- @record.reload
37
- assert_equal "idling", @record.state
38
- end
39
- end
40
-
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'test_helper'
4
-
5
- class MachineUnmigratedTest < BaseTestCase
6
- def setup
7
- @model = new_model(false)
8
-
9
- # Drop the table so that it definitely doesn't exist
10
- @model.connection.drop_table(@model.table_name) if @model.table_exists?
11
- end
12
-
13
- def test_should_allow_machine_creation
14
- assert_nothing_raised { StateMachines::Machine.new(@model) }
15
- end
16
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'test_helper'
4
-
5
- class MachineWithAliasedAttributeTest < BaseTestCase
6
- def setup
7
- @model = new_model do
8
- alias_attribute :vehicle_status, :state
9
- end
10
-
11
- @machine = StateMachines::Machine.new(@model, :status, :attribute => :vehicle_status)
12
- @machine.state :parked
13
-
14
- @record = @model.new
15
- end
16
-
17
- def test_should_check_custom_attribute_for_predicate
18
- @record.vehicle_status = nil
19
- refute @record.status?(:parked)
20
-
21
- @record.vehicle_status = 'parked'
22
- assert @record.status?(:parked)
23
- end
24
- end
25
-