statesman 4.0.0 → 4.1.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 +5 -5
- data/.circleci/config.yml +78 -0
- data/CHANGELOG.md +4 -0
- data/lib/statesman/adapters/active_record.rb +38 -4
- data/lib/statesman/version.rb +1 -1
- data/spec/support/active_record.rb +7 -12
- data/statesman.gemspec +1 -1
- metadata +13 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4fb61c0976e4be7109c74119ce4a04bec415b463295a2a72adddedde288012bc
|
4
|
+
data.tar.gz: 895b55c0827be27cccde416b3c71cc375f2e2f0c7fa847ef858f40e58ddfbf4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a12259539822ebb79e79a76f47275636da60d799b28b8c436cd9ddfdcc1e8d459897867816832fe524263b1f5c536db78e3617609e77054d43d872c6286a652
|
7
|
+
data.tar.gz: a1963915c8231d6c8ed037733a652e581f1efcf6d8ce76e535b8f50fa81e8a288a3723bb2974a2178cd11b2b0c6502fe6b49b216b2c9f82e1846cbdfb1cc6ada
|
data/.circleci/config.yml
CHANGED
@@ -138,6 +138,78 @@ jobs:
|
|
138
138
|
- POSTGRES_USER=postgres
|
139
139
|
- POSTGRES_DB=statesman_test
|
140
140
|
steps: *steps
|
141
|
+
build-ruby262-rails-600-mongo:
|
142
|
+
docker:
|
143
|
+
- image: circleci/ruby:2.6.2-node
|
144
|
+
environment:
|
145
|
+
- RAILS_VERSION=6.0.0.beta3
|
146
|
+
- DATABASE_DEPENDENCY_PORT=27017
|
147
|
+
- image: circleci/mongo:3
|
148
|
+
steps: *steps
|
149
|
+
build-ruby262-rails-600-mysql:
|
150
|
+
docker:
|
151
|
+
- image: circleci/ruby:2.6.2-node
|
152
|
+
environment:
|
153
|
+
- RAILS_VERSION=6.0.0.beta3
|
154
|
+
- DATABASE_URL=mysql2://root@127.0.0.1/statesman_test
|
155
|
+
- EXCLUDE_MONGOID=true
|
156
|
+
- DATABASE_DEPENDENCY_PORT=3306
|
157
|
+
- image: circleci/mysql:5.7.18
|
158
|
+
environment:
|
159
|
+
- MYSQL_ALLOW_EMPTY_PASSWORD=true
|
160
|
+
- MYSQL_USER=root
|
161
|
+
- MYSQL_PASSWORD=
|
162
|
+
- MYSQL_DATABASE=statesman_test
|
163
|
+
steps: *steps
|
164
|
+
build-ruby262-rails-600-postgres:
|
165
|
+
docker:
|
166
|
+
- image: circleci/ruby:2.6.2-node
|
167
|
+
environment:
|
168
|
+
- RAILS_VERSION=6.0.0.beta3
|
169
|
+
- DATABASE_URL=postgres://postgres@localhost/statesman_test
|
170
|
+
- EXCLUDE_MONGOID=true
|
171
|
+
- DATABASE_DEPENDENCY_PORT=5432
|
172
|
+
- image: circleci/postgres:9.6
|
173
|
+
environment:
|
174
|
+
- POSTGRES_USER=postgres
|
175
|
+
- POSTGRES_DB=statesman_test
|
176
|
+
steps: *steps
|
177
|
+
build-ruby241-rails-523-mongo:
|
178
|
+
docker:
|
179
|
+
- image: circleci/ruby:2.4.1-node
|
180
|
+
environment:
|
181
|
+
- RAILS_VERSION=5.2.3
|
182
|
+
- DATABASE_DEPENDENCY_PORT=27017
|
183
|
+
- image: circleci/mongo:3
|
184
|
+
steps: *steps
|
185
|
+
build-ruby241-rails-523-mysql:
|
186
|
+
docker:
|
187
|
+
- image: circleci/ruby:2.4.1-node
|
188
|
+
environment:
|
189
|
+
- RAILS_VERSION=5.2.3
|
190
|
+
- DATABASE_URL=mysql2://root@127.0.0.1/statesman_test
|
191
|
+
- EXCLUDE_MONGOID=true
|
192
|
+
- DATABASE_DEPENDENCY_PORT=3306
|
193
|
+
- image: circleci/mysql:5.7.18
|
194
|
+
environment:
|
195
|
+
- MYSQL_ALLOW_EMPTY_PASSWORD=true
|
196
|
+
- MYSQL_USER=root
|
197
|
+
- MYSQL_PASSWORD=
|
198
|
+
- MYSQL_DATABASE=statesman_test
|
199
|
+
steps: *steps
|
200
|
+
build-ruby241-rails-523-postgres:
|
201
|
+
docker:
|
202
|
+
- image: circleci/ruby:2.4.1-node
|
203
|
+
environment:
|
204
|
+
- RAILS_VERSION=5.2.3
|
205
|
+
- DATABASE_URL=postgres://postgres@localhost/statesman_test
|
206
|
+
- EXCLUDE_MONGOID=true
|
207
|
+
- DATABASE_DEPENDENCY_PORT=5432
|
208
|
+
- image: circleci/postgres:9.6
|
209
|
+
environment:
|
210
|
+
- POSTGRES_USER=postgres
|
211
|
+
- POSTGRES_DB=statesman_test
|
212
|
+
steps: *steps
|
141
213
|
build-ruby233-rails-429-mongo:
|
142
214
|
docker:
|
143
215
|
- image: circleci/ruby:2.3.3-node
|
@@ -368,6 +440,12 @@ workflows:
|
|
368
440
|
- build-ruby241-rails-513-mongo
|
369
441
|
- build-ruby241-rails-513-mysql
|
370
442
|
- build-ruby241-rails-513-postgres
|
443
|
+
- build-ruby241-rails-523-mongo
|
444
|
+
- build-ruby241-rails-523-mysql
|
445
|
+
- build-ruby241-rails-523-postgres
|
446
|
+
- build-ruby262-rails-600-mongo
|
447
|
+
- build-ruby262-rails-600-mysql
|
448
|
+
- build-ruby262-rails-600-postgres
|
371
449
|
- build-ruby233-rails-429-mongo
|
372
450
|
- build-ruby233-rails-429-mysql
|
373
451
|
- build-ruby233-rails-429-postgres
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## v4.1.0, 10 April 2019
|
2
|
+
|
3
|
+
- Add better support for mysql (and others) in `transition_conflict_error?` [@greysteil](https://github.com/greysteil) (https://github.com/gocardless/statesman/pull/342)
|
4
|
+
|
1
5
|
## v4.0.0, 22 February 2019
|
2
6
|
|
3
7
|
- Forces Statesman to use a new transactions with `requires_new: true` (https://github.com/gocardless/statesman/pull/249)
|
@@ -93,7 +93,7 @@ module Statesman
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def transitions_for_parent
|
96
|
-
|
96
|
+
parent_model.send(@association_name)
|
97
97
|
end
|
98
98
|
|
99
99
|
def unset_old_most_recent
|
@@ -128,10 +128,44 @@ module Statesman
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def transition_conflict_error?(err)
|
131
|
-
err.message.include?(
|
131
|
+
return true if unique_indexes.any? { |i| err.message.include?(i.name) }
|
132
|
+
|
133
|
+
err.message.include?(transition_class.table_name) &&
|
132
134
|
(err.message.include?("sort_key") || err.message.include?("most_recent"))
|
133
135
|
end
|
134
136
|
|
137
|
+
def unique_indexes
|
138
|
+
::ActiveRecord::Base.connection.
|
139
|
+
indexes(transition_class.table_name).
|
140
|
+
select do |index|
|
141
|
+
next unless index.unique
|
142
|
+
|
143
|
+
index.columns.sort == [parent_join_foreign_key, "sort_key"] ||
|
144
|
+
index.columns.sort == [parent_join_foreign_key, "most_recent"]
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def parent_join_foreign_key
|
149
|
+
association =
|
150
|
+
parent_model.class.
|
151
|
+
reflect_on_all_associations(:has_many).
|
152
|
+
find { |r| r.name.to_s == @association_name.to_s }
|
153
|
+
|
154
|
+
association_join_primary_key(association)
|
155
|
+
end
|
156
|
+
|
157
|
+
def association_join_primary_key(association)
|
158
|
+
if association.respond_to?(:join_primary_key)
|
159
|
+
association.join_primary_key
|
160
|
+
elsif association.method(:join_keys).arity.zero?
|
161
|
+
# Support for Rails 5.1
|
162
|
+
association.join_keys.key
|
163
|
+
else
|
164
|
+
# Support for Rails < 5.1
|
165
|
+
association.join_keys(transition_class).key
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
135
169
|
def with_updated_timestamp(params)
|
136
170
|
# TODO: Once we've set expectations that transition classes should conform to
|
137
171
|
# the interface of Adapters::ActiveRecordTransition as a breaking change in the
|
@@ -140,8 +174,8 @@ module Statesman
|
|
140
174
|
#
|
141
175
|
# At the moment, most transition classes will include the module, but not all,
|
142
176
|
# not least because it doesn't work with PostgreSQL JSON columns for metadata.
|
143
|
-
column = if
|
144
|
-
|
177
|
+
column = if transition_class.respond_to?(:updated_timestamp_column)
|
178
|
+
transition_class.updated_timestamp_column
|
145
179
|
else
|
146
180
|
ActiveRecordTransition::DEFAULT_UPDATED_TIMESTAMP_COLUMN
|
147
181
|
end
|
data/lib/statesman/version.rb
CHANGED
@@ -94,14 +94,12 @@ class CreateMyActiveRecordModelTransitionMigration < MIGRATION_CLASS
|
|
94
94
|
%i[my_active_record_model_id most_recent],
|
95
95
|
unique: true,
|
96
96
|
where: "most_recent",
|
97
|
-
name: "
|
98
|
-
"parent_most_recent"
|
97
|
+
name: "index_my_active_record_model_transitions_parent_latest"
|
99
98
|
else
|
100
99
|
add_index :my_active_record_model_transitions,
|
101
100
|
%i[my_active_record_model_id most_recent],
|
102
101
|
unique: true,
|
103
|
-
name: "
|
104
|
-
"parent_most_recent"
|
102
|
+
name: "index_my_active_record_model_transitions_parent_latest"
|
105
103
|
end
|
106
104
|
end
|
107
105
|
end
|
@@ -173,13 +171,13 @@ class CreateOtherActiveRecordModelTransitionMigration < MIGRATION_CLASS
|
|
173
171
|
unique: true,
|
174
172
|
where: "most_recent",
|
175
173
|
name: "index_other_active_record_model_transitions_"\
|
176
|
-
"
|
174
|
+
"parent_latest"
|
177
175
|
else
|
178
176
|
add_index :other_active_record_model_transitions,
|
179
177
|
%i[other_active_record_model_id most_recent],
|
180
178
|
unique: true,
|
181
179
|
name: "index_other_active_record_model_transitions_"\
|
182
|
-
"
|
180
|
+
"parent_latest"
|
183
181
|
end
|
184
182
|
end
|
185
183
|
end
|
@@ -188,8 +186,7 @@ end
|
|
188
186
|
class DropMostRecentColumn < MIGRATION_CLASS
|
189
187
|
def change
|
190
188
|
remove_index :my_active_record_model_transitions,
|
191
|
-
name: "
|
192
|
-
"parent_most_recent"
|
189
|
+
name: "index_my_active_record_model_transitions_parent_latest"
|
193
190
|
remove_column :my_active_record_model_transitions, :most_recent
|
194
191
|
end
|
195
192
|
end
|
@@ -270,14 +267,12 @@ class CreateNamespacedARModelTransitionMigration < MIGRATION_CLASS
|
|
270
267
|
%i[my_active_record_model_id most_recent],
|
271
268
|
unique: true,
|
272
269
|
where: "most_recent",
|
273
|
-
name: "
|
274
|
-
"parent_most_recent"
|
270
|
+
name: "index_namespace_model_transitions_parent_latest"
|
275
271
|
else
|
276
272
|
add_index :my_namespace_my_active_record_model_transitions,
|
277
273
|
%i[my_active_record_model_id most_recent],
|
278
274
|
unique: true,
|
279
|
-
name: "
|
280
|
-
"parent_most_recent"
|
275
|
+
name: "index_namespace_model_transitions_parent_latest"
|
281
276
|
end
|
282
277
|
end
|
283
278
|
# rubocop:enable MethodLength
|
data/statesman.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "ammeter", "~> 1.1"
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
24
|
spec.add_development_dependency "gc_ruboconfig", "~> 2.3.9"
|
25
|
-
spec.add_development_dependency "mysql2", "
|
25
|
+
spec.add_development_dependency "mysql2", ">= 0.4", "< 0.6"
|
26
26
|
spec.add_development_dependency "pg", "~> 0.18"
|
27
27
|
spec.add_development_dependency "pry"
|
28
28
|
spec.add_development_dependency "rails", ">= 3.2"
|
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: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GoCardless
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ammeter
|
@@ -56,16 +56,22 @@ dependencies:
|
|
56
56
|
name: mysql2
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.4
|
61
|
+
version: '0.4'
|
62
|
+
- - "<"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0.6'
|
62
65
|
type: :development
|
63
66
|
prerelease: false
|
64
67
|
version_requirements: !ruby/object:Gem::Requirement
|
65
68
|
requirements:
|
66
|
-
- - "
|
69
|
+
- - ">="
|
67
70
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.4
|
71
|
+
version: '0.4'
|
72
|
+
- - "<"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0.6'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: pg
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -292,8 +298,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
298
|
- !ruby/object:Gem::Version
|
293
299
|
version: '0'
|
294
300
|
requirements: []
|
295
|
-
|
296
|
-
rubygems_version: 2.6.14
|
301
|
+
rubygems_version: 3.0.1
|
297
302
|
signing_key:
|
298
303
|
specification_version: 4
|
299
304
|
summary: A statesman-like state machine library
|