aasm 5.2.0 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e3ec7032fd9c8368ddfb4bed4e931edc5f9d96c02a69f89f7ee26913f7d8698
4
- data.tar.gz: ddb4ef39501440da1869426eda3b4359e37eeef67b464c9e0d660e9f353510f6
3
+ metadata.gz: 442f7c145e97a545e9dd1cd5ecab268177b93deb0b258ab381107f1207fe9654
4
+ data.tar.gz: 1d32640b0bfab501acc40b10f7d21be342944ed133086d44ccb924f03485f3b8
5
5
  SHA512:
6
- metadata.gz: c294de071cad6569f855af1455c9d0281622ca5c9a3df0466baacaca569d8974718eb46d4c06e674f54629a77e2634d69829ee2910612ba146b4aaf786891544
7
- data.tar.gz: a7b0c176cec262ad9d89538fe43e6df484f4d79328f85e853dcc9fe6b6ce9a9629f802e7de14659e5c91135a3a4df09a6066011983b1936eff06b17657c24cc5
6
+ metadata.gz: be33b17c558b289c012f25ccbed984cd3b2859e14a5120bf240020eb2d83c2645834784e5bc50dac0e5a3f161f13f3d85c2a29dcefcce694be395b604676ef32
7
+ data.tar.gz: 87668c8a48a9cf0335a4359970e868758a25398e2af8fb025ab9dd39db2a89147f0fad25fee9c11e1da9522fbeca6595f5363318b8baf2b7625ee1b88f3d8b80
@@ -0,0 +1,100 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ build:
9
+ if: "contains(github.event.commits[0].message, '[ci skip]') == false"
10
+ continue-on-error: ${{ matrix.allow_failure || false }}
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ os: [ubuntu-20.04]
15
+ ruby: ['3.0', 2.7, 2.6, jruby-9.1.17.0, truffleruby]
16
+ gemfile: [norails, rails_4.2, rails_4.2_mongoid_5, rails_5.2, rails_6.1]
17
+ redis-version: [6]
18
+ mongodb-version: [5]
19
+ include:
20
+ - ruby: '3.0'
21
+ gemfile: rails_6.1
22
+ os: ubuntu-20.04
23
+ redis-version: 6
24
+ mongodb-version: 5
25
+ - ruby: 3.1
26
+ gemfile: rails_7.0
27
+ os: ubuntu-20.04
28
+ redis-version: 6
29
+ mongodb-version: 5
30
+ exclude:
31
+ - ruby: '3.0'
32
+ gemfile: rails_5.2
33
+ - ruby: '3.0'
34
+ gemfile: rails_4.2
35
+ - ruby: '3.0'
36
+ gemfile: rails_4.2_mongoid_5
37
+ - ruby: 2.7
38
+ gemfile: rails_5.2
39
+ - ruby: 2.7
40
+ gemfile: rails_4.2
41
+ - ruby: 2.7
42
+ gemfile: rails_4.2_mongoid_5
43
+ - ruby: 2.6
44
+ gemfile: rails_4.2_mongoid_5
45
+ - ruby: 2.6
46
+ gemfile: rails_4.2
47
+ - ruby: jruby-9.1.17.0
48
+ gemfile: norails
49
+ - ruby: jruby-9.1.17.0
50
+ gemfile: rails_5.2
51
+ - ruby: jruby-9.1.17.0
52
+ gemfile: rails_6.1
53
+ - ruby: truffleruby
54
+ gemfile: rails_4.2
55
+ - ruby: truffleruby
56
+ gemfile: rails_4.2_mongoid_5
57
+ - ruby: truffleruby
58
+ gemfile: rails_5.2
59
+ allow_failures:
60
+ - false
61
+ env:
62
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
63
+ ALLOW_FAILURES: "${{ matrix.allow_failures }}"
64
+ runs-on: ${{ matrix.os }}
65
+
66
+ steps:
67
+ - uses: actions/checkout@v2
68
+ - name: Install dependencies
69
+ run: |
70
+ mkdir /tmp/dynamodb
71
+ wget -O - https://s3-ap-southeast-1.amazonaws.com/dynamodb-local-singapore/dynamodb_local_latest.tar.gz | tar xz --directory /tmp/dynamodb
72
+ java -Djava.library.path=/tmp/dynamodb/DynamoDBLocal_lib -jar /tmp/dynamodb/DynamoDBLocal.jar -inMemory -delayTransientStatuses -port 30180 &
73
+ mongod --version
74
+ - uses: ruby/setup-ruby@v1
75
+ with:
76
+ ruby-version: ${{ matrix.ruby }}
77
+ bundler-cache: true
78
+ - name: Setup project
79
+ run: bundle install
80
+ - name: Start Redis
81
+ uses: supercharge/redis-github-action@1.2.0
82
+ with:
83
+ redis-version: ${{ matrix.redis-version }}
84
+ - name: Start MongoDB
85
+ uses: supercharge/mongodb-github-action@1.6.0
86
+ with:
87
+ mongodb-version: ${{ matrix.mongodb-version }}
88
+ # - name: Setup DynamoDB Local
89
+ # uses: rrainn/dynamodb-action@v2.0.0
90
+ # with:
91
+ # port: 8000
92
+ # cors: '*'
93
+ - name: Run specs
94
+ run: bundle exec rspec spec
95
+ - name: Run test
96
+ run: bundle exec rake test
97
+ - name: Upload coverage to Codecov
98
+ uses: codecov/codecov-action@v2
99
+ with:
100
+ fail_ci_if_error: false
data/Appraisals CHANGED
@@ -1,7 +1,8 @@
1
1
  appraise 'rails_4.2' do
2
2
  gem 'nokogiri', '1.6.8.1', platforms: %i[ruby_19]
3
3
  gem 'mime-types', '~> 2', platforms: %i[ruby_19 jruby]
4
- gem 'rails', '4.2.5'
4
+ gem 'sqlite3', '~> 1.3.5', platforms: :ruby
5
+ gem 'rails', '~> 4.2.11'
5
6
  gem 'mongoid', '~> 4.0'
6
7
  gem 'sequel'
7
8
  gem 'dynamoid', '~> 1', platforms: :ruby
@@ -11,50 +12,32 @@ appraise 'rails_4.2' do
11
12
  gem "after_commit_everywhere", "~> 1.0"
12
13
  end
13
14
 
14
- appraise 'rails_4.2_nobrainer' do
15
- gem 'rails', '4.2.5'
16
- gem 'nobrainer', '~> 0.33.0'
17
- end
18
-
19
15
  appraise 'rails_4.2_mongoid_5' do
16
+ gem 'sqlite3', '~> 1.3.5', platforms: :ruby
20
17
  gem 'mime-types', '~> 2', platforms: %i[ruby_19 jruby]
21
- gem 'rails', '4.2.5'
18
+ gem 'rails', '~> 4.2.11'
22
19
  gem 'mongoid', '~> 5.0'
23
20
  gem 'activerecord-jdbcsqlite3-adapter', '1.3.24', platforms: :jruby
24
21
  gem "after_commit_everywhere", "~> 1.0"
25
22
  end
26
23
 
27
- appraise 'rails_5.0' do
28
- gem 'rails', '5.0.0'
29
- gem 'mongoid', '~> 6.0'
30
- gem 'sequel'
31
- gem 'dynamoid', '~> 1.3', platforms: :ruby
32
- gem 'aws-sdk', '~> 2', platforms: :ruby
33
- gem 'redis-objects'
34
- gem "after_commit_everywhere", "~> 1.0"
35
- end
36
-
37
- appraise 'rails_5.0_nobrainer' do
38
- gem 'rails', '5.0.0'
39
- gem 'nobrainer', '~> 0.33.0'
40
- end
41
-
42
- appraise 'rails_5.1' do
43
- gem 'rails', '5.1'
24
+ appraise 'rails_5.2' do
25
+ gem 'sqlite3', '~> 1.3.5', platforms: :ruby
26
+ gem 'rails', '~> 5.2.4'
44
27
  gem 'mongoid', '~>6.0'
45
28
  gem 'sequel'
46
- gem 'dynamoid', '~> 1.3', platforms: :ruby
29
+ gem 'dynamoid', '~>2.2', platforms: :ruby
47
30
  gem 'aws-sdk', '~>2', platforms: :ruby
48
31
  gem 'redis-objects'
49
32
  gem "after_commit_everywhere", "~> 1.0"
50
33
  end
51
34
 
52
- appraise 'rails_5.2' do
53
- gem 'rails', '5.2'
54
- gem 'mongoid', '~>6.0'
35
+ appraise 'rails_6.1' do
36
+ gem 'rails', '~> 6.1.4'
37
+ gem 'mongoid', '~>7.0', '>= 7.0.5'
55
38
  gem 'sequel'
56
- gem 'dynamoid', '~>2.2', platforms: :ruby
57
- gem 'aws-sdk', '~>2', platforms: :ruby
39
+ gem 'dynamoid', '~>3.3', platforms: :ruby
40
+ gem 'aws-sdk-dynamodb', '~> 1'
58
41
  gem 'redis-objects'
59
42
  gem "after_commit_everywhere", "~> 1.0"
60
43
  end
@@ -64,4 +47,5 @@ appraise 'norails' do
64
47
  gem 'rails', install_if: false
65
48
  gem 'sequel'
66
49
  gem 'redis-objects'
50
+ gem "after_commit_everywhere", install_if: false
67
51
  end
data/CHANGELOG.md CHANGED
@@ -1,6 +1,17 @@
1
1
  # CHANGELOG
2
2
 
3
3
  ## unreleased
4
+
5
+ ## 5.3.0
6
+
7
+ * Add Ruby 3.1 and Rails 7 to the CI matrix [#775](https://github.com/aasm/aasm/pull/775), thanks to [petergoldstein](https://github.com/petergoldstein)
8
+ * Fixed an error in Ruby 3 when specifying a method that takes keyword arguments, such as event's before hook [#777](https://github.com/aasm/aasm/pull/777), thanks to [pocari](https://github.com/pocari)
9
+ * Fix multi-threading bug not firing success callbacks [#778](https://github.com/aasm/aasm/pull/778), thanks to [guewen](https://github.com/guewen)
10
+ * Raise AASM::UndefinedState when calling fire or fire! with undefined event names [#753](https://github.com/aasm/aasm/pull/753), thanks to [danielvdao](https://github.com/danielvdao)
11
+ * Fixing Readme typos [#745](https://github.com/aasm/aasm/pull/745) [#772](https://github.com/aasm/aasm/pull/772) [#774](https://github.com/aasm/aasm/pull/774) [#781](https://github.com/aasm/aasm/pull/781), thanks to [jaredsmithse](https://github.com/jaredsmithse) [jcat4](https://github.com/jcat4) [ChandanChainani](https://github.com/ChandanChainani) [TessHuelskamp](https://github.com/TessHuelskamp)
12
+ * Add github actions config [#750](https://github.com/aasm/aasm/pull/750), thanks to [aka47](https://github.com/aka47)
13
+ * Test against for Rails 6.0 and improve ci [#719](https://github.com/aasm/aasm/pull/719), thanks to [yujideveloper](https://github.com/yujideveloper)
14
+ * Fix migration class name to work with zeitwerk [#720](https://github.com/aasm/aasm/pull/720), thanks to [rwegrzyniak](https://github.com/rwegrzyniak)
4
15
  ## 5.2.0
5
16
 
6
17
  * fix: timestamp will work with named machine [#739](https://github.com/aasm/aasm/pull/739), thanks to [RolandStuder](https://github.com/RolandStuder)
data/Gemfile CHANGED
@@ -2,5 +2,6 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'sqlite3', '~> 1.3.5', :platforms => :ruby
6
- gem 'rails', '5.1.4'
5
+ gem 'sqlite3', '~> 1.4', :platforms => :ruby
6
+ gem 'rails', '~> 6.1.4'
7
+ gem 'after_commit_everywhere', '~> 1.0'
data/README.md CHANGED
@@ -221,18 +221,18 @@ You can pass parameters to events:
221
221
  job.run(:defragmentation)
222
222
  ```
223
223
 
224
- All guards and after callbacks will receive these parameters. In this case `set_process` would be called with
224
+ All guards and after callbacks will receive these parameters. In this case `set_process` would be called with
225
225
  `:defragmentation` argument.
226
226
 
227
- If the first argument to the event is a state (e.g. `:running` or `:finished`), the first argument is consumed and
228
- the state machine will attempt to transition to that state. Add comma separated parameter for gaurds and callbacks
227
+ If the first argument to the event is a state (e.g. `:running` or `:finished`), the first argument is consumed and
228
+ the state machine will attempt to transition to that state. Add comma separated parameter for guards and callbacks
229
229
 
230
230
  ```ruby
231
231
  job = Job.new
232
232
  job.run(:running, :defragmentation)
233
233
  ```
234
- In this case `set_process` won't be called, job will transition to running state and callback will receive
235
- :defragmentation as parameter
234
+ In this case `set_process` won't be called, job will transition to running state and callback will receive
235
+ `:defragmentation` as parameter
236
236
 
237
237
  #### Error Handling
238
238
  In case of an error during the event processing the error is rescued and passed to `:error`
@@ -321,7 +321,7 @@ and then
321
321
  Let's assume you want to allow particular transitions only if a defined condition is
322
322
  given. For this you can set up a guard per transition, which will run before actually
323
323
  running the transition. If the guard returns `false` the transition will be
324
- denied (raising `AASM::InvalidTransition` or returning `false` itself):
324
+ denied (raising `AASM::InvalidTransition`):
325
325
 
326
326
  ```ruby
327
327
  class Cleaner
@@ -364,7 +364,7 @@ job.clean # => raises AASM::InvalidTransition
364
364
  job.may_clean_if_needed? # => true
365
365
  job.clean_if_needed! # idle
366
366
 
367
- job.clean_if_dirty(:clean) # => false
367
+ job.clean_if_dirty(:clean) # => raises AASM::InvalidTransition
368
368
  job.clean_if_dirty(:dirty) # => true
369
369
  ```
370
370
 
@@ -400,7 +400,7 @@ If you prefer a more Ruby-like guard syntax, you can use `if` and `unless` as we
400
400
  end
401
401
  ```
402
402
 
403
- You can invoke a Class instead a method since this Class responds to `call`
403
+ You can invoke a Class instead of a method if the Class responds to `call`
404
404
 
405
405
  ```ruby
406
406
  event :sleep do
@@ -758,7 +758,7 @@ job.aasm.fire!(:run) # saved
758
758
 
759
759
  Saving includes running all validations on the `Job` class. If
760
760
  `whiny_persistence` flag is set to `true`, exception is raised in case of
761
- failure. If `whiny_persistence` flag is set to false, methods with a bang return
761
+ failure. If `whiny_persistence` flag is set to `false`, methods with a bang return
762
762
  `true` if the state transition is successful or `false` if an error occurs.
763
763
 
764
764
  If you want make sure the state gets saved without running validations (and
@@ -786,7 +786,7 @@ class Job < ActiveRecord::Base
786
786
  end
787
787
  ```
788
788
 
789
- Also You can skip the validation at instance level with `some_event_name_without_validation!` method.
789
+ Also, you can skip the validation at instance level with `some_event_name_without_validation!` method.
790
790
  With this you have the flexibility of having validation for all your transitions by default and then skip it wherever required.
791
791
  Please note that only state column will be updated as mentioned in the above example.
792
792
 
@@ -1084,7 +1084,7 @@ end
1084
1084
 
1085
1085
  which then leads to `transaction(requires_new: false)`, the Rails default.
1086
1086
 
1087
- Additionally, if you do not want any of your active record actions to be
1087
+ Additionally, if you do not want any of your ActiveRecord actions to be
1088
1088
  wrapped in a transaction, you can specify the `use_transactions` flag. This can
1089
1089
  be useful if you want want to persist things to the database that happen as a
1090
1090
  result of a transaction or callback, even when some error occurs. The
@@ -1104,7 +1104,7 @@ end
1104
1104
 
1105
1105
  ### Pessimistic Locking
1106
1106
 
1107
- AASM supports [Active Record pessimistic locking via `with_lock`](http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html#method-i-with_lock) for database persistence layers.
1107
+ AASM supports [ActiveRecord pessimistic locking via `with_lock`](http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html#method-i-with_lock) for database persistence layers.
1108
1108
 
1109
1109
  | Option | Purpose |
1110
1110
  | ------ | ------- |
@@ -1160,7 +1160,7 @@ end
1160
1160
  Whatever column name is used, make sure to add a migration to provide this column
1161
1161
  (of type `string`).
1162
1162
  Do not add default value for column at the database level. If you add default
1163
- value in database then AASM callbacks on the initial state will not be fired upon
1163
+ value in database then AASM callbacks on the initial state will not be fired upon
1164
1164
  instantiation of the model.
1165
1165
 
1166
1166
  ```ruby
@@ -1461,7 +1461,7 @@ After installing AASM you can run generator:
1461
1461
  ```
1462
1462
  Replace NAME with the Model name, COLUMN_NAME is optional(default is 'aasm_state').
1463
1463
  This will create a model (if one does not exist) and configure it with aasm block.
1464
- For Active record orm a migration file is added to add aasm state column to table.
1464
+ For ActiveRecord orm a migration file is added to add aasm state column to table.
1465
1465
 
1466
1466
  ### Docker
1467
1467
 
@@ -1491,6 +1491,12 @@ Feel free to
1491
1491
  * [Anil Maurya](http://github.com/anilmaurya) (since 2016)
1492
1492
 
1493
1493
 
1494
+
1495
+ ## Stargazers over time
1496
+
1497
+ [![Stargazers over time](https://starchart.cc/aasm/aasm.svg)](https://starchart.cc/aasm/aasm)
1498
+
1499
+
1494
1500
  ## [Contributing](CONTRIBUTING.md)
1495
1501
 
1496
1502
  ## Warranty ##
@@ -4,6 +4,7 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "sqlite3", "~> 1.3", ">= 1.3.5", platforms: :ruby
6
6
  gem "rails", install_if: false
7
+ gem "after_commit_everywhere", install_if: false
7
8
  gem "sequel"
8
9
  gem "redis-objects"
9
10
 
@@ -3,7 +3,8 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "sqlite3", "~> 1.3.5", platforms: :ruby
6
- gem "rails", "4.2.5"
6
+ gem "rails", "~> 4.2.11"
7
+ gem "after_commit_everywhere", "~> 1.0"
7
8
  gem "nokogiri", "1.6.8.1", platforms: [:ruby_19]
8
9
  gem "mime-types", "~> 2", platforms: [:ruby_19, :jruby]
9
10
  gem "mongoid", "~> 4.0"
@@ -12,6 +13,5 @@ gem "dynamoid", "~> 1", platforms: :ruby
12
13
  gem "aws-sdk", "~> 2", platforms: :ruby
13
14
  gem "redis-objects"
14
15
  gem "activerecord-jdbcsqlite3-adapter", "1.3.24", platforms: :jruby
15
- gem "after_commit_everywhere", "~> 1.0"
16
16
 
17
17
  gemspec path: "../"
@@ -3,10 +3,10 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "sqlite3", "~> 1.3.5", platforms: :ruby
6
- gem "rails", "4.2.5"
6
+ gem "rails", "~> 4.2.11"
7
+ gem "after_commit_everywhere", "~> 1.0"
7
8
  gem "mime-types", "~> 2", platforms: [:ruby_19, :jruby]
8
9
  gem "mongoid", "~> 5.0"
9
10
  gem "activerecord-jdbcsqlite3-adapter", "1.3.24", platforms: :jruby
10
- gem "after_commit_everywhere", "~> 1.0"
11
11
 
12
12
  gemspec path: "../"
@@ -3,7 +3,8 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "sqlite3", "~> 1.3.5", platforms: :ruby
6
- gem "rails", "4.2.5"
6
+ gem "rails", "~> 4.2.11"
7
+ gem "after_commit_everywhere", "~> 1.0"
7
8
  gem "nobrainer", "~> 0.33.0"
8
9
 
9
10
  gemspec path: "../"
@@ -3,12 +3,12 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "sqlite3", "~> 1.3.5", platforms: :ruby
6
- gem "rails", "5.2"
6
+ gem "rails", "~> 5.2.4"
7
+ gem "after_commit_everywhere", "~> 1.0"
7
8
  gem "mongoid", "~>6.0"
8
9
  gem "sequel"
9
10
  gem "dynamoid", "~>2.2", platforms: :ruby
10
11
  gem "aws-sdk", "~>2", platforms: :ruby
11
12
  gem "redis-objects"
12
- gem "after_commit_everywhere", "~> 1.0"
13
13
 
14
14
  gemspec path: "../"
@@ -0,0 +1,14 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sqlite3", "~> 1.4", platforms: :ruby
6
+ gem "rails", "~> 6.0.3"
7
+ gem "after_commit_everywhere", "~> 1.0"
8
+ gem "mongoid", "~>7.0", ">= 7.0.5"
9
+ gem "sequel"
10
+ gem "dynamoid", "~>3.3", platforms: :ruby
11
+ gem "aws-sdk-dynamodb", "~> 1"
12
+ gem "redis-objects"
13
+
14
+ gemspec path: "../"
@@ -0,0 +1,14 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sqlite3", "~> 1.4", platforms: :ruby
6
+ gem "rails", "~> 6.1.4"
7
+ gem "after_commit_everywhere", "~> 1.0"
8
+ gem "mongoid", "~>7.0", ">= 7.0.5"
9
+ gem "sequel"
10
+ gem "dynamoid", "~>3.3", platforms: :ruby
11
+ gem "aws-sdk-dynamodb", "~> 1"
12
+ gem "redis-objects"
13
+
14
+ gemspec path: "../"
@@ -0,0 +1,14 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sqlite3", "~> 1.4", platforms: :ruby
6
+ gem "rails", "~> 7.0.1"
7
+ gem "after_commit_everywhere", "~> 1.0"
8
+ gem "mongoid", "~>7", ">= 7.3.4"
9
+ gem "sequel"
10
+ gem "dynamoid", "~>3.3", platforms: :ruby
11
+ gem "aws-sdk-dynamodb", "~> 1"
12
+ gem "redis-objects"
13
+
14
+ gemspec path: "../"
data/lib/aasm/base.rb CHANGED
@@ -223,7 +223,20 @@ module AASM
223
223
  end
224
224
  end
225
225
 
226
- klass.send(:define_method, method_name, method_definition)
226
+ klass.send(:define_method, method_name, method_definition).tap do |sym|
227
+ apply_ruby2_keyword(klass, sym)
228
+ end
229
+ end
230
+
231
+ def apply_ruby2_keyword(klass, sym)
232
+ if RUBY_VERSION >= '2.7.1'
233
+ if klass.instance_method(sym).parameters.find { |type, _| type.to_s.start_with?('rest') }
234
+ # If there is a place where you are receiving in *args, do ruby2_keywords.
235
+ klass.module_eval do
236
+ ruby2_keywords sym
237
+ end
238
+ end
239
+ end
227
240
  end
228
241
 
229
242
  def namespace?
@@ -10,7 +10,7 @@ module AASM::Core
10
10
  @name = name
11
11
  @state_machine = state_machine
12
12
  @transitions = []
13
- @valid_transitions = {}
13
+ @valid_transitions = Hash.new { |h, k| h[k] = {} }
14
14
  @guards = Array(options[:guard] || options[:guards] || options[:if])
15
15
  @unless = Array(options[:unless]) #TODO: This could use a better name
16
16
  @default_display_name = name.to_s.gsub(/_/, ' ').capitalize
@@ -79,8 +79,9 @@ module AASM::Core
79
79
 
80
80
  def fire_transition_callbacks(obj, *args)
81
81
  from_state = obj.aasm(state_machine.name).current_state
82
- transition = @valid_transitions[from_state]
83
- @valid_transitions[from_state].invoke_success_callbacks(obj, *args) if transition
82
+ transition = @valid_transitions[obj.object_id][from_state]
83
+ transition.invoke_success_callbacks(obj, *args) if transition
84
+ @valid_transitions.delete(obj.object_id)
84
85
  end
85
86
 
86
87
  def ==(event)
@@ -153,7 +154,7 @@ module AASM::Core
153
154
  result = transition
154
155
  else
155
156
  result = to_state || Array(transition.to).first
156
- Array(transition.to).each {|to| @valid_transitions[to] = transition }
157
+ Array(transition.to).each {|to| @valid_transitions[obj.object_id][to] = transition }
157
158
  transition.execute(obj, *args)
158
159
  end
159
160
 
@@ -1,6 +1,5 @@
1
1
  module AASM
2
2
  class InstanceBase
3
-
4
3
  attr_accessor :from_state, :to_state, :current_event
5
4
 
6
5
  def initialize(instance, name=:default) # instance of the class including AASM, name of the state machine
@@ -115,12 +114,15 @@ module AASM
115
114
  end
116
115
 
117
116
  def fire(event_name, *args, &block)
117
+ event_exists?(event_name)
118
+
118
119
  @instance.send(event_name, *args, &block)
119
120
  end
120
121
 
121
122
  def fire!(event_name, *args, &block)
122
- event_name = event_name.to_s.+("!").to_sym
123
- @instance.send(event_name, *args, &block)
123
+ event_exists?(event_name, true)
124
+ bang_event_name = "#{event_name}!".to_sym
125
+ @instance.send(bang_event_name, *args, &block)
124
126
  end
125
127
 
126
128
  def set_current_state_with_persistence(state)
@@ -129,5 +131,13 @@ module AASM
129
131
  save_success
130
132
  end
131
133
 
134
+ private
135
+
136
+ def event_exists?(event_name, bang = false)
137
+ event = @instance.class.aasm(@name).state_machine.events[event_name]
138
+ event_error = bang ? "#{event_name}!" : event_name
139
+
140
+ raise AASM::UndefinedState, "State :#{event_error} doesn't exist" if event.nil?
141
+ end
132
142
  end
133
143
  end
data/lib/aasm/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module AASM
2
- VERSION = "5.2.0"
2
+ VERSION = "5.3.0"
3
3
  end
@@ -1,4 +1,4 @@
1
- class AASMCreate<%= table_name.camelize %> < ActiveRecord::Migration[<%= ActiveRecord::VERSION::STRING.to_f %>]
1
+ class AasmCreate<%= table_name.camelize %> < ActiveRecord::Migration[<%= ActiveRecord::VERSION::STRING.to_f %>]
2
2
  def change
3
3
  create_table(:<%= table_name %>) do |t|
4
4
  t.string :<%= column_name %>
@@ -0,0 +1,16 @@
1
+ class EventWithKeywordArguments
2
+ include AASM
3
+
4
+ aasm do
5
+ state :open, :initial => true, :column => :status
6
+ state :closed
7
+
8
+ event :close do
9
+ before :_before_close
10
+ transitions from: :open, to: :closed
11
+ end
12
+ end
13
+
14
+ def _before_close(key:)
15
+ end
16
+ end
@@ -2,8 +2,12 @@
2
2
 
3
3
  begin
4
4
  require 'dynamoid'
5
- require 'aws-sdk-resources'
6
5
  puts "dynamoid #{Dynamoid::VERSION} gem found, running Dynamoid specs \e[32m#{'✔'}\e[0m"
6
+ if Gem::Version.new(Dynamoid::VERSION) >= Gem::Version.new('3.0.0')
7
+ require 'aws-sdk-dynamodb'
8
+ else
9
+ require 'aws-sdk-resources'
10
+ end
7
11
 
8
12
  ENV['ACCESS_KEY'] ||= 'abcd'
9
13
  ENV['SECRET_KEY'] ||= '1234'
@@ -90,11 +90,9 @@ describe 'callbacks for the new DSL' do
90
90
  expect(callback).to receive(:ensure_on_all_events).once.ordered
91
91
  end
92
92
 
93
- # puts "------- close!"
94
93
  callback.close!
95
94
  end
96
95
 
97
-
98
96
  it "works fine after reload" do
99
97
  show_debug_log = false
100
98
 
@@ -125,10 +123,43 @@ describe 'callbacks for the new DSL' do
125
123
  expect(callback).to receive(:after_event).once.ordered
126
124
  end
127
125
 
128
- # puts "------- close!"
129
126
  callback.close!
130
127
  end
131
128
 
129
+ it 'does not run callbacks if firing an unknown event' do
130
+ show_debug_log = false
131
+
132
+ callback = Callbacks::Basic.new(:log => show_debug_log)
133
+
134
+ expect(callback).to_not receive(:before_all_events).ordered
135
+ expect(callback).to_not receive(:before_event).ordered
136
+ expect(callback).to_not receive(:event_guard).ordered
137
+ expect(callback).to_not receive(:transition_guard)
138
+ expect(callback).to_not receive(:before_exit_open)
139
+ expect(callback).to_not receive(:exit_open)
140
+ expect(callback).to_not receive(:after_all_transitions)
141
+ expect(callback).to_not receive(:after_transition)
142
+ expect(callback).to_not receive(:before_enter_closed)
143
+ expect(callback).to_not receive(:enter_closed)
144
+ expect(callback).to_not receive(:aasm_write_state)
145
+ expect(callback).to_not receive(:event_before_success)
146
+ expect(callback).to_not receive(:success_transition)
147
+ expect(callback).to_not receive(:after_exit_open)
148
+ expect(callback).to_not receive(:after_enter_closed)
149
+ expect(callback).to_not receive(:after_event)
150
+ expect(callback).to_not receive(:after_all_events)
151
+ expect(callback).to_not receive(:ensure_event).ordered
152
+ expect(callback).to_not receive(:ensure_on_all_events).ordered
153
+
154
+ expect {
155
+ callback.aasm.fire(:unknown)
156
+ }.to raise_error(AASM::UndefinedState, "State :unknown doesn't exist")
157
+
158
+ expect {
159
+ callback.aasm.fire!(:unknown)
160
+ }.to raise_error(AASM::UndefinedState, "State :unknown! doesn't exist")
161
+ end
162
+
132
163
  it "does not run any state callback if the event guard fails" do
133
164
  callback = Callbacks::Basic.new(:log => false)
134
165
  callback.aasm.current_state
@@ -164,7 +195,6 @@ describe 'callbacks for the new DSL' do
164
195
  callback = Callbacks::PrivateMethod.new(:log => show_debug_log)
165
196
  callback.aasm.current_state
166
197
 
167
- # puts "------- close!"
168
198
  expect {
169
199
  callback.close!
170
200
  }.to_not raise_error
@@ -90,4 +90,12 @@ describe 'when being unsuspended' do
90
90
  it "should not be able to fire unknown events" do
91
91
  expect(auth.aasm.may_fire_event?(:unknown)).to be false
92
92
  end
93
+
94
+ it "should raise AASM::UndefinedState when firing unknown events" do
95
+ expect { auth.aasm.fire(:unknown) }.to raise_error(AASM::UndefinedState, "State :unknown doesn't exist")
96
+ end
97
+
98
+ it "should raise AASM::UndefinedState when firing unknown bang events" do
99
+ expect { auth.aasm.fire!(:unknown) }.to raise_error(AASM::UndefinedState, "State :unknown! doesn't exist")
100
+ end
93
101
  end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe EventWithKeywordArguments do
4
+ let(:example) { EventWithKeywordArguments.new }
5
+ describe 'enable keyword arguments' do
6
+ it 'should be executed correctly that method registered by "before hooks" for events with keyword arguments.' do
7
+ expect(example.close(key: 1)).to be_truthy
8
+ end
9
+ end
10
+ end
@@ -23,7 +23,11 @@ end
23
23
  # Dynamoid initialization
24
24
  begin
25
25
  require 'dynamoid'
26
- require 'aws-sdk-resources'
26
+ if Gem::Version.new(Dynamoid::VERSION) >= Gem::Version.new('3.0.0')
27
+ require 'aws-sdk-dynamodb'
28
+ else
29
+ require 'aws-sdk-resources'
30
+ end
27
31
 
28
32
  ENV['ACCESS_KEY'] ||= 'abcd'
29
33
  ENV['SECRET_KEY'] ||= '1234'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aasm
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thorsten Boettger
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-05-02 00:00:00.000000000 Z
12
+ date: 2022-07-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: concurrent-ruby
@@ -147,8 +147,8 @@ files:
147
147
  - ".document"
148
148
  - ".github/ISSUE_TEMPLATE/bug_report.md"
149
149
  - ".github/ISSUE_TEMPLATE/feature_request.md"
150
+ - ".github/workflows/build.yml"
150
151
  - ".gitignore"
151
- - ".travis.yml"
152
152
  - API
153
153
  - Appraisals
154
154
  - CHANGELOG.md
@@ -170,10 +170,10 @@ files:
170
170
  - gemfiles/rails_4.2.gemfile
171
171
  - gemfiles/rails_4.2_mongoid_5.gemfile
172
172
  - gemfiles/rails_4.2_nobrainer.gemfile
173
- - gemfiles/rails_5.0.gemfile
174
- - gemfiles/rails_5.0_nobrainer.gemfile
175
- - gemfiles/rails_5.1.gemfile
176
173
  - gemfiles/rails_5.2.gemfile
174
+ - gemfiles/rails_6.0.gemfile
175
+ - gemfiles/rails_6.1.gemfile
176
+ - gemfiles/rails_7.0.gemfile
177
177
  - lib/aasm.rb
178
178
  - lib/aasm/aasm.rb
179
179
  - lib/aasm/base.rb
@@ -282,6 +282,7 @@ files:
282
282
  - spec/models/dynamoid/complex_dynamoid_example.rb
283
283
  - spec/models/dynamoid/dynamoid_multiple.rb
284
284
  - spec/models/dynamoid/dynamoid_simple.rb
285
+ - spec/models/event_with_keyword_arguments.rb
285
286
  - spec/models/foo.rb
286
287
  - spec/models/foo_callback_multiple.rb
287
288
  - spec/models/guard_arguments_check.rb
@@ -362,6 +363,7 @@ files:
362
363
  - spec/unit/event_multiple_spec.rb
363
364
  - spec/unit/event_naming_spec.rb
364
365
  - spec/unit/event_spec.rb
366
+ - spec/unit/event_with_keyword_arguments_spec.rb
365
367
  - spec/unit/exception_spec.rb
366
368
  - spec/unit/guard_arguments_check_spec.rb
367
369
  - spec/unit/guard_multiple_spec.rb
@@ -493,6 +495,7 @@ test_files:
493
495
  - spec/models/dynamoid/complex_dynamoid_example.rb
494
496
  - spec/models/dynamoid/dynamoid_multiple.rb
495
497
  - spec/models/dynamoid/dynamoid_simple.rb
498
+ - spec/models/event_with_keyword_arguments.rb
496
499
  - spec/models/foo.rb
497
500
  - spec/models/foo_callback_multiple.rb
498
501
  - spec/models/guard_arguments_check.rb
@@ -573,6 +576,7 @@ test_files:
573
576
  - spec/unit/event_multiple_spec.rb
574
577
  - spec/unit/event_naming_spec.rb
575
578
  - spec/unit/event_spec.rb
579
+ - spec/unit/event_with_keyword_arguments_spec.rb
576
580
  - spec/unit/exception_spec.rb
577
581
  - spec/unit/guard_arguments_check_spec.rb
578
582
  - spec/unit/guard_multiple_spec.rb
data/.travis.yml DELETED
@@ -1,82 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- cache: bundler
4
-
5
- jdk:
6
- - openjdk8
7
-
8
- before_install:
9
- - rvm list
10
- - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
11
- - gem install bundler -v '1.16.1'
12
- - bundle _1.16.1_ install
13
-
14
- rvm:
15
- - 2.5.0
16
- - 2.6.5
17
- - 2.7.0
18
- - jruby-9.1.12.0
19
-
20
- services:
21
- - mongodb
22
- - redis-server
23
-
24
- #addons:
25
- # rethinkdb: '2.3.4'
26
-
27
- gemfile:
28
- - gemfiles/norails.gemfile
29
- - gemfiles/rails_4.2.gemfile
30
- - gemfiles/rails_4.2_mongoid_5.gemfile
31
- # - gemfiles/rails_4.2_nobrainer.gemfile
32
- - gemfiles/rails_5.0.gemfile
33
- # - gemfiles/rails_5.0_nobrainer.gemfile
34
- - gemfiles/rails_5.1.gemfile
35
- - gemfiles/rails_5.2.gemfile
36
-
37
- before_script:
38
- - mkdir /tmp/dynamodb
39
- - wget -O - https://s3-ap-southeast-1.amazonaws.com/dynamodb-local-singapore/dynamodb_local_latest.tar.gz | tar xz --directory /tmp/dynamodb
40
- - java -Djava.library.path=/tmp/dynamodb/DynamoDBLocal_lib -jar /tmp/dynamodb/DynamoDBLocal.jar -inMemory -delayTransientStatuses -port 30180 &
41
- - mongod --version
42
-
43
- script:
44
- - bundle exec rspec spec
45
- - bundle exec rake test
46
-
47
- matrix:
48
- exclude:
49
- - rvm: 2.7.0
50
- gemfile: gemfiles/rails_5.2.gemfile
51
- - rvm: 2.6.5
52
- gemfile: gemfiles/rails_5.2.gemfile
53
- - rvm: 2.5.0
54
- gemfile: gemfiles/rails_4.2.gemfile
55
- - rvm: 2.6.5
56
- gemfile: gemfiles/rails_4.2.gemfile
57
- - rvm: 2.7.0
58
- gemfile: gemfiles/rails_4.2.gemfile
59
- - rvm: 2.5.0
60
- gemfile: gemfiles/rails_4.2_mongoid_5.gemfile
61
- - rvm: 2.6.5
62
- gemfile: gemfiles/rails_4.2_mongoid_5.gemfile
63
- - rvm: 2.7.0
64
- gemfile: gemfiles/rails_4.2_mongoid_5.gemfile
65
- # - rvm: 2.5.0
66
- # gemfile: gemfiles/rails_4.2_nobrainer.gemfile
67
- - rvm: jruby-9.1.12.0
68
- gemfile: gemfiles/norails.gemfile
69
- - rvm: jruby-9.1.12.0
70
- gemfile: gemfiles/rails_5.0.gemfile
71
- - rvm: jruby-9.1.12.0
72
- gemfile: gemfiles/rails_5.1.gemfile
73
- - rvm: jruby-9.1.12.0
74
- gemfile: gemfiles/rails_5.2.gemfile
75
- # - rvm: jruby-9.1.12.0
76
- # gemfile: gemfiles/rails_4.2_nobrainer.gemfile
77
- # - rvm: jruby-9.1.12.0
78
- # gemfile: gemfiles/rails_5.0_nobrainer.gemfile
79
-
80
- notifications:
81
- slack:
82
- secure: gpltVWntdKz0nSE6A5UvuX4qbN35uW51nsW+Ojgqm8Qsv8K240/NlZRYutFHr7GnJTe0rEEP2Oy3ZBnBtZKFn13RlTEAU/FCAxebr4H24rr29Ypwwp5xjiSE4MuoBEnroo4lw6ka3LsJnrY2PKRMiLJGsS0WsEPY4x8NUG/vyY8=
@@ -1,14 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "sqlite3", "~> 1.3.5", platforms: :ruby
6
- gem "rails", "5.0.0"
7
- gem "mongoid", "~> 6.0"
8
- gem "sequel"
9
- gem "dynamoid", "~> 1.3", platforms: :ruby
10
- gem "aws-sdk", "~> 2", platforms: :ruby
11
- gem "redis-objects"
12
- gem "after_commit_everywhere", "~> 1.0"
13
-
14
- gemspec path: "../"
@@ -1,9 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "sqlite3", "~> 1.3.5", platforms: :ruby
6
- gem "rails", "5.0.0"
7
- gem "nobrainer", "~> 0.33.0"
8
-
9
- gemspec path: "../"
@@ -1,14 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "sqlite3", "~> 1.3.5", platforms: :ruby
6
- gem "rails", "5.1"
7
- gem "mongoid", "~>6.0"
8
- gem "sequel"
9
- gem "dynamoid", "~> 1.3", platforms: :ruby
10
- gem "aws-sdk", "~>2", platforms: :ruby
11
- gem "redis-objects"
12
- gem "after_commit_everywhere", "~> 1.0"
13
-
14
- gemspec path: "../"