statesman 7.4.1 → 8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9dc585aeecc837bf65850c562c9f41524959bd07c5f7f889284f534c260911c3
4
- data.tar.gz: 807ae19092dcce330131916b825964e5f62ff13f8c4bde2e2140dee9d1f9983d
3
+ metadata.gz: aeab084afcfb068e82eae390dbac202fb8167884b3a58610429ca2efb30a8b46
4
+ data.tar.gz: 65f10904ea38a716a26f7acd6d6809a484f4cb51eb5458b98f94d2b29acfd746
5
5
  SHA512:
6
- metadata.gz: 2688beb079f3b1993bd19b4460834a18a4ca1d5eac9733003c7c5f08c1fd2deb19aeb46103a8f799e89c346ac0704368119ff180ed907928c74587b6a6623ea0
7
- data.tar.gz: c58db63a374f2474ccc73f0064d9dc089d8e52967b047ef77333fdae9b57eb1798cf428a0e6ec162788eaec99e5758d1bd26118c43944f5edda90261dbcb6845
6
+ metadata.gz: 36a6a95abb071113a8a17e59982db8c0c1e82cd189d2b5c0d59e4825f894dfde59a0051357a935ff9c3070520541461a69177a08003c7734252c4c1ae42946b6
7
+ data.tar.gz: 96887197a7551e0fe65269b727cff3cba0318c459e895836d05969120cd22d6b17f1f9052935ce768f91ff4af9a0d33aff43af025e41bba28f24a1948e188056
@@ -1,3 +1,18 @@
1
+ ## v8.0.0 6th January 2021
2
+
3
+ ### Added
4
+
5
+ - Use AR Arel table to type cast booleans in order to avoid deprecation warning [#421](https://github.com/gocardless/statesman/pull/421)
6
+ - Support relationships that doesn't use `id` as a Primary Key
7
+ [#422](https://github.com/gocardless/statesman/pull/422)
8
+
9
+ ## v7.4.1 11th November 2020
10
+
11
+ ### Added
12
+
13
+ - Add #reset method to state machine and adapter interfaces
14
+ [#417](https://github.com/gocardless/statesman/pull/417)
15
+
1
16
  ## v7.4.0 26th August 2020
2
17
 
3
18
  ### Added
data/README.md CHANGED
@@ -404,10 +404,12 @@ Model.in_state(:state_1).or(
404
404
  #### Storing the state on the model object
405
405
 
406
406
  If you wish to store the model state on the model directly, you can keep it up
407
- to date using an `after_transition` hook:
407
+ to date using an `after_transition` hook.
408
+ Combine it with the `after_commit` option to ensure the model state will only be
409
+ saved once the transition has made it irreversibly to the database:
408
410
 
409
411
  ```ruby
410
- after_transition do |model, transition|
412
+ after_transition(after_commit: true) do |model, transition|
411
413
  model.state = transition.to_state
412
414
  model.save!
413
415
  end
@@ -39,8 +39,16 @@ module Statesman
39
39
  end
40
40
 
41
41
  def mysql?
42
- ActiveRecord::Base.configurations[Rails.env].
43
- try(:[], "adapter").try(:match, /mysql/)
42
+ configuration.try(:[], "adapter").try(:match, /mysql/)
43
+ end
44
+
45
+ # [] is deprecated and will be removed in 6.2
46
+ def configuration
47
+ if ActiveRecord::Base.configurations.respond_to?(:configs_for)
48
+ ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).first
49
+ else
50
+ ActiveRecord::Base.configurations[Rails.env]
51
+ end
44
52
  end
45
53
 
46
54
  def database_supports_partial_indexes?
@@ -305,23 +305,21 @@ module Statesman
305
305
  end
306
306
 
307
307
  def db_true
308
- value = ::ActiveRecord::Base.connection.type_cast(
309
- true,
310
- transition_class.columns_hash["most_recent"],
311
- )
312
- ::ActiveRecord::Base.connection.quote(value)
308
+ ::ActiveRecord::Base.connection.quote(type_cast(true))
313
309
  end
314
310
 
315
311
  def db_false
316
- value = ::ActiveRecord::Base.connection.type_cast(
317
- false,
318
- transition_class.columns_hash["most_recent"],
319
- )
320
- ::ActiveRecord::Base.connection.quote(value)
312
+ ::ActiveRecord::Base.connection.quote(type_cast(false))
321
313
  end
322
314
 
323
315
  def db_null
324
- Arel::Nodes::SqlLiteral.new("NULL")
316
+ type_cast(nil)
317
+ end
318
+
319
+ # Type casting against a column is deprecated and will be removed in Rails 6.2.
320
+ # See https://github.com/rails/arel/commit/6160bfbda1d1781c3b08a33ec4955f170e95be11
321
+ def type_cast(value)
322
+ ::ActiveRecord::Base.connection.type_cast(value)
325
323
  end
326
324
 
327
325
  # Check whether the `most_recent` column allows null values. If it doesn't, set old
@@ -104,7 +104,7 @@ module Statesman
104
104
 
105
105
  def most_recent_transition_join
106
106
  "LEFT OUTER JOIN #{model_table} AS #{most_recent_transition_alias} " \
107
- "ON #{model.table_name}.id = " \
107
+ "ON #{model.table_name}.#{model_primary_key} = " \
108
108
  "#{most_recent_transition_alias}.#{model_foreign_key} " \
109
109
  "AND #{most_recent_transition_alias}.most_recent = #{db_true}"
110
110
  end
@@ -127,6 +127,10 @@ module Statesman
127
127
  "and #{transition_class}."
128
128
  end
129
129
 
130
+ def model_primary_key
131
+ transition_reflection.active_record_primary_key
132
+ end
133
+
130
134
  def model_foreign_key
131
135
  transition_reflection.foreign_key
132
136
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Statesman
4
- VERSION = "7.4.1"
4
+ VERSION = "8.0.0"
5
5
  end
@@ -154,6 +154,31 @@ describe Statesman::Adapters::ActiveRecordQueries, active_record: true do
154
154
  end
155
155
  end
156
156
 
157
+ context "with a custom primary key for the model" do
158
+ before do
159
+ # Switch to using OtherActiveRecordModelTransition, so the existing
160
+ # relation with MyActiveRecordModelTransition doesn't interfere with
161
+ # this spec.
162
+ # Configure the relationship to use a different primary key,
163
+ MyActiveRecordModel.send(:has_many,
164
+ :custom_name,
165
+ class_name: "OtherActiveRecordModelTransition",
166
+ primary_key: :external_id)
167
+
168
+ MyActiveRecordModel.class_eval do
169
+ def self.transition_class
170
+ OtherActiveRecordModelTransition
171
+ end
172
+ end
173
+ end
174
+
175
+ describe ".in_state" do
176
+ subject(:query) { MyActiveRecordModel.in_state(:succeeded) }
177
+
178
+ specify { expect { query }.to_not raise_error }
179
+ end
180
+ end
181
+
157
182
  context "after_commit transactional integrity" do
158
183
  before do
159
184
  MyStateMachine.class_eval do
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: 7.4.1
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GoCardless
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-19 00:00:00.000000000 Z
11
+ date: 2021-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ammeter
@@ -303,7 +303,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
303
303
  - !ruby/object:Gem::Version
304
304
  version: '0'
305
305
  requirements: []
306
- rubygems_version: 3.2.0.rc.1
306
+ rubygems_version: 3.1.2
307
307
  signing_key:
308
308
  specification_version: 4
309
309
  summary: A statesman-like state machine library