aasm 4.0.0 → 4.0.1

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
  SHA1:
3
- metadata.gz: e82947e11b28a1768717833153778b493f638129
4
- data.tar.gz: eb74d70ed1a8ddd968aa24db3ec1903d29d332d8
3
+ metadata.gz: 1018c5f3c99b9124aa39e379ad07d1edc8e1a41a
4
+ data.tar.gz: c0f9d694a94587e857dddb747cf5eebbcec6a8e0
5
5
  SHA512:
6
- metadata.gz: 4144ba3401348e02bfda53f0eff38f7f018b3e8eef93a157bd727ab4bc499a1c645440263bbc405e07da213c553ea9f1bc697c40fcfcb0e79b72cf1bf6dd1a6d
7
- data.tar.gz: c80f18c84bf32c1be09220253e438afb8ca249c63c3d68d3ba15bf0669ab71b1b79f6c926affaa3064194cee37be91f5c74e4c290ab82ac277388795c8f35621
6
+ metadata.gz: 559fbc728a655f88f10b979ea74985c72b2705a663fd3c0b42b04cb2cc92d07c4ab65e791bc44972cb5d192030e30184e2376f6b1301ec3c28d0d612cf443f19
7
+ data.tar.gz: e13c9a34e666e1a03f3f7474347ca5c4da39a55649a1b34dcc2d38f97d02b84e98e439dc74324a0487a385ae6e5e9eb29570129832800042b25561f9595033b8
@@ -1,5 +1,13 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 4.1.0 (not yet released)
4
+
5
+ * `aasm_human_event_name` is deprecated, use `aasm.human_event_name` instead
6
+
7
+ ## 4.0.1
8
+
9
+ * fire guards only once per transition (see [issue #184](https://github.com/aasm/aasm/issues/184) for details)
10
+
3
11
  ## 4.0.0
4
12
 
5
13
  * support `if` and `unless` guard syntax: (see [issue #179](https://github.com/aasm/aasm/issues/179) and [issue #181](https://github.com/aasm/aasm/issues/181)), thanks to [@bigtunacan](https://github.com/bigtunacan)
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ gem "coveralls", :platforms => :ruby
5
5
  gem 'rubysl', :platforms => :rbx
6
6
  gem "jruby-openssl", :platforms => :jruby
7
7
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
8
- gem "rails", "3.2.18"
8
+ gem "rails", "~>4.1"
9
9
  gem 'mongoid' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
10
10
  gem 'sequel'
11
11
 
data/README.md CHANGED
@@ -13,6 +13,10 @@ that no longer targets only ActiveRecord models. It currently provides adapters
13
13
  [Mongoid](http://mongoid.org/), but it can be used for any Ruby class, no matter what
14
14
  parent class it has (if any).
15
15
 
16
+ ## Upgrade from version 3 to 4
17
+
18
+ Take a look at the [README_FROM_VERSION_3_TO_4](https://github.com/aasm/aasm/blob/master/README_FROM_VERSION_3_TO_4.md) for details how to switch from version 3.x to 4.0 of _AASM_.
19
+
16
20
  ## Usage
17
21
 
18
22
  Adding a state machine is as simple as including the AASM module and start defining
@@ -137,14 +141,12 @@ Here you can see a list of all possible callbacks, together with their order of
137
141
  ```ruby
138
142
  begin
139
143
  event before
140
- event guards # test run
141
- transition guards # test run
144
+ event guards
145
+ transition guards
142
146
  old_state before_exit
143
147
  old_state exit
144
148
  new_state before_enter
145
149
  new_state enter
146
- event guards
147
- transition guards
148
150
  ...update state...
149
151
  transition after
150
152
  event success # if persist successful
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### Callback order has been changed
6
6
 
7
- The first callback to be run is `:before` of the event. A state's `:before_exit' callback
7
+ The first callback to be run is `:before` of the event. A state's `:before_exit` callback
8
8
  is now run directly before its `:exit` callback. Event-based guards are now run before
9
9
  any of the transition guards are run. And finally, before running any state callbacks,
10
10
  all (event- and transition-based) guards are run to check whether the state callbacks
@@ -1,5 +1,8 @@
1
1
  module AASM
2
2
 
3
+ # provide a state machine for the including class
4
+ # make sure to load class methods as well
5
+ # initialize persistence for the state machine
3
6
  def self.included(base) #:nodoc:
4
7
  base.extend AASM::ClassMethods
5
8
 
@@ -26,9 +29,10 @@ module AASM
26
29
  @aasm
27
30
  end
28
31
 
29
- # aasm.event(:event_name).human?
32
+ # deprecated, remove in version 4.1
30
33
  def aasm_human_event_name(event) # event_name?
31
- AASM::Localizer.new.human_event_name(self, event)
34
+ warn '[DEPRECATION] AASM: aasm_human_event_name is deprecated, use aasm.human_event_name instead'
35
+ aasm.human_event_name(event)
32
36
  end
33
37
  end # ClassMethods
34
38
 
@@ -82,11 +86,11 @@ private
82
86
  *process_args(event, aasm.current_state, *args)
83
87
  )
84
88
 
85
- if event.may_fire?(self, *args)
89
+ if may_fire_to = event.may_fire?(self, *args)
86
90
  old_state.fire_callbacks(:before_exit, self)
87
91
  old_state.fire_callbacks(:exit, self) # TODO: remove for AASM 4?
88
92
 
89
- if new_state_name = event.fire(self, *args)
93
+ if new_state_name = event.fire(self, {:may_fire => may_fire_to}, *args)
90
94
  aasm_fired(event, old_state, new_state_name, options, *args, &block)
91
95
  else
92
96
  aasm_failed(event_name, old_state)
@@ -85,6 +85,11 @@ module AASM
85
85
  @state_machine.events.values
86
86
  end
87
87
 
88
+ # aasm.event(:event_name).human?
89
+ def human_event_name(event) # event_name?
90
+ AASM::Localizer.new.human_event_name(@klass, event)
91
+ end
92
+
88
93
  def states_for_select
89
94
  states.map { |state| state.for_select }
90
95
  end
@@ -19,11 +19,11 @@ module AASM
19
19
  # executes the transition guards to determine if a transition is even
20
20
  # an option given current conditions.
21
21
  def may_fire?(obj, to_state=nil, *args)
22
- _fire(obj, true, to_state, *args) # true indicates test firing
22
+ _fire(obj, {:test_only => true}, to_state, *args) # true indicates test firing
23
23
  end
24
24
 
25
- def fire(obj, to_state=nil, *args)
26
- _fire(obj, false, to_state, *args) # false indicates this is not a test (fire!)
25
+ def fire(obj, options={}, to_state=nil, *args)
26
+ _fire(obj, options, to_state, *args) # false indicates this is not a test (fire!)
27
27
  end
28
28
 
29
29
  def transitions_from_state?(state)
@@ -86,8 +86,8 @@ module AASM
86
86
  end
87
87
 
88
88
  # Execute if test == false, otherwise return true/false depending on whether it would fire
89
- def _fire(obj, test, to_state=nil, *args)
90
- result = test ? false : nil
89
+ def _fire(obj, options={}, to_state=nil, *args)
90
+ result = options[:test_only] ? false : nil
91
91
  if @transitions.map(&:from).any?
92
92
  transitions = @transitions.select { |t| t.from == obj.aasm.current_state }
93
93
  return result if transitions.size == 0
@@ -106,11 +106,11 @@ module AASM
106
106
 
107
107
  transitions.each do |transition|
108
108
  next if to_state and !Array(transition.to).include?(to_state)
109
- if transition.allowed?(obj, *args)
110
- if test
111
- result = true
109
+ if Array(transition.to).include?(options[:may_fire]) || transition.allowed?(obj, *args)
110
+ result = to_state || Array(transition.to).first
111
+ if options[:test_only]
112
+ # result = true
112
113
  else
113
- result = to_state || Array(transition.to).first
114
114
  transition.execute(obj, *args)
115
115
  end
116
116
 
@@ -1,3 +1,3 @@
1
1
  module AASM
2
- VERSION = "4.0.0"
2
+ VERSION = "4.0.1"
3
3
  end
@@ -11,8 +11,8 @@ describe 'callbacks for the new DSL' do
11
11
  expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
12
12
  expect(callback).to receive(:before_exit_open).once.ordered # these should be before the state changes
13
13
  expect(callback).to receive(:exit_open).once.ordered
14
- expect(callback).to receive(:event_guard).once.ordered.and_return(true)
15
- expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
14
+ # expect(callback).to receive(:event_guard).once.ordered.and_return(true)
15
+ # expect(callback).to receive(:transition_guard).once.ordered.and_return(true)
16
16
  expect(callback).to receive(:transitioning).once.ordered
17
17
  expect(callback).to receive(:before_enter_closed).once.ordered
18
18
  expect(callback).to receive(:enter_closed).once.ordered
@@ -101,7 +101,7 @@ describe 'firing an event' do
101
101
  obj = double('object', :aasm => double('aasm', :current_state => :open))
102
102
  expect(obj).to receive(:guard_fn).with('arg1', 'arg2').and_return(true)
103
103
 
104
- expect(event.fire(obj, nil, 'arg1', 'arg2')).to eq(:closed)
104
+ expect(event.fire(obj, {}, nil, 'arg1', 'arg2')).to eq(:closed)
105
105
  end
106
106
 
107
107
  end
@@ -67,13 +67,13 @@ describe AASM::Localizer, "new style" do
67
67
  end
68
68
  end
69
69
 
70
- context 'aasm_human_event_name' do
70
+ context 'aasm.human_event_name' do
71
71
  it 'should return translated event name' do
72
- expect(LocalizerTestModel.aasm_human_event_name(:close)).to eq("Let's close it!")
72
+ expect(LocalizerTestModel.aasm.human_event_name(:close)).to eq("Let's close it!")
73
73
  end
74
74
 
75
75
  it 'should return humanized event name' do
76
- expect(LocalizerTestModel.aasm_human_event_name(:open)).to eq("Open")
76
+ expect(LocalizerTestModel.aasm.human_event_name(:open)).to eq("Open")
77
77
  end
78
78
  end
79
79
  end
@@ -102,13 +102,13 @@ describe AASM::Localizer, "deprecated style" do
102
102
  end
103
103
  end
104
104
 
105
- context 'aasm_human_event_name' do
105
+ context 'aasm.human_event_name' do
106
106
  it 'should return translated event name' do
107
- expect(LocalizerTestModel.aasm_human_event_name(:close)).to eq("Let's close it!")
107
+ expect(LocalizerTestModel.aasm.human_event_name(:close)).to eq("Let's close it!")
108
108
  end
109
109
 
110
110
  it 'should return humanized event name' do
111
- expect(LocalizerTestModel.aasm_human_event_name(:open)).to eq("Open")
111
+ expect(LocalizerTestModel.aasm.human_event_name(:open)).to eq("Open")
112
112
  end
113
113
  end
114
114
  end
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: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Barron
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-11-15 00:00:00.000000000 Z
13
+ date: 2014-11-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake