aasm 4.10.0 → 4.10.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: 0a36f037200d0d9577fe0164fdd7a66e23db9156
4
- data.tar.gz: 253250812a0f774df4e1d0c5111bf6c273ccd76d
3
+ metadata.gz: f62dfd355dcd559e5f9b2d00afc1d858c2b9a1f8
4
+ data.tar.gz: 168ae1576773a1e9e56444818704cfa74284f226
5
5
  SHA512:
6
- metadata.gz: b41ce1fa467ee74ec16d1e3260506adfbda581d13078f2548120e4322c6a1582fb93aae9c84b451e834cd621ce115a3bb6f75c57a7b09be598fc93d2a348f919
7
- data.tar.gz: c43910a1666f9011dfe6b604f6626931c821f5a2e5d9f641194e1837a5eb0b3a000f5d85cfca24af60635dec36074f3df9c83bbcd552b4e7da0da6b00d323e9d
6
+ metadata.gz: a93b62dad3157b2b731859ba126b427d0cc6401e30d215a73dcd6182fd9126b5f0fc183cc467108937c4ff9be2d60147074f017c88b5044f2e5e80959444547a
7
+ data.tar.gz: 91014f1d7a04436d98121a506ce34a3ed6777fe382dba29978f36257b17481d3d909b04562fcd747fe1e9498d2665850408da8ef8e195cba126719df5f659135
@@ -4,12 +4,10 @@ cache: bundler
4
4
 
5
5
  rvm:
6
6
  - 1.9.3
7
- - 2.0.0
8
- - 2.1
9
- - 2.2
10
- - 2.3
7
+ - 2.2.5
8
+ - 2.3.1
11
9
  - jruby-1.7 # JRuby in 1.9 mode
12
- - jruby-9.0.4.0
10
+ - jruby-9.0.5.0
13
11
  - rbx-2.5.8
14
12
 
15
13
  services:
@@ -20,11 +18,10 @@ gemfile:
20
18
  - gemfiles/rails_3.2_stable.gemfile
21
19
  - gemfiles/rails_4.0.gemfile
22
20
  - gemfiles/rails_4.0_mongo_mapper.gemfile
23
- - gemfiles/rails_4.1.gemfile
24
- - gemfiles/rails_4.1_mongo_mapper.gemfile
25
21
  - gemfiles/rails_4.2.gemfile
26
22
  - gemfiles/rails_4.2_mongoid_5.gemfile
27
23
  - gemfiles/rails_4.2_mongo_mapper.gemfile
24
+ - gemfiles/rails_5.0.gemfile
28
25
 
29
26
  before_script:
30
27
  - mkdir /tmp/dynamodb
@@ -33,15 +30,16 @@ before_script:
33
30
 
34
31
  matrix:
35
32
  allow_failures:
36
- - rvm: rbx-2.2.1
37
- - rvm: jruby-1.7
38
- - rvm: 2.3
33
+ - rvm: jruby-9.0.5.0
34
+ gemfile: gemfiles/rails_5.0.gemfile
35
+ - rvm: rbx-2.5.8
36
+ gemfile: gemfiles/rails_5.0.gemfile
39
37
  exclude:
40
38
  - rvm: 1.9.3
41
- gemfile: gemfiles/rails_4.1.gemfile
42
- - rvm: 2.2
39
+ gemfile: gemfiles/rails_5.0.gemfile
40
+ - rvm: 2.2.5
43
41
  gemfile: gemfiles/rails_3.2_stable.gemfile
44
- - rvm: 2.3
42
+ - rvm: 2.3.1
45
43
  gemfile: gemfiles/rails_3.2_stable.gemfile
46
- - rvm: jruby-19mode
47
- gemfile: gemfiles/rails_4.1.gemfile
44
+ - rvm: jruby-1.7
45
+ gemfile: gemfiles/rails_5.0.gemfile
@@ -1,5 +1,11 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 4.10.1
4
+
5
+ * fix: suppress warnings when using ActiveRecord enums feature (see [issue #346](https://github.com/aasm/aasm/pull/346) for details, thanks to [@110y](https://github.com/110y), and [issue #353](https://github.com/aasm/aasm/pull/353) for details, thanks to [@nathanstitt](https://github.com/nathanstitt))
6
+ * fix: handle array of success callbacks for transitions properly (see [issue #363](https://github.com/aasm/aasm/pull/363) for details, thanks to [@shunichi](https://github.com/shunichi))
7
+ * support `permitted: false` for states and events query/inspection methods (see [issue #364](https://github.com/aasm/aasm/pull/364) for details, thanks to [@hspazio](https://github.com/hspazio))
8
+
3
9
  ## 4.10.0
4
10
 
5
11
  * fix: some issues with RubyMotion (see [issue #320](https://github.com/aasm/aasm/pull/320) and [issue #343](https://github.com/aasm/aasm/pull/343) for details, thanks to [@Infotaku](https://github.com/Infotaku))
data/Gemfile CHANGED
@@ -4,6 +4,7 @@ gem "sqlite3", :platforms => :ruby
4
4
  gem 'rubysl', :platforms => :rbx
5
5
  gem "jruby-openssl", :platforms => :jruby
6
6
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
7
+ gem "mime-types", "~> 2" if Gem::Version.create(RUBY_VERSION.dup) <= Gem::Version.create('1.9.3')
7
8
  gem "rails", "~>4.2"
8
9
  gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
9
10
  gem 'sequel'
data/README.md CHANGED
@@ -151,7 +151,7 @@ is finished.
151
151
 
152
152
  AASM will also initialize `LogRunTime` and run the `call` method for you after the transition from `running` to `finished` in the example above. You can pass arguments to the class by defining an initialize method on it, like this:
153
153
 
154
- ```
154
+ ```ruby
155
155
  class LogRunTime
156
156
  # optional args parameter can be omitted, but if you define initialize
157
157
  # you must accept the model instance as the first parameter to it.
@@ -524,7 +524,7 @@ successful or `false` if errors occur. Exceptions are not raised.
524
524
  If you want make sure the state gets saved without running validations (and
525
525
  thereby maybe persisting aninvalid object state), simply tell AASM to skip the
526
526
  validations. Be aware that when skipping validations, only the state column will
527
- be updated in the database (just like ActiveRecord `change_column` is working).
527
+ be updated in the database (just like ActiveRecord `update_column` is working).
528
528
 
529
529
  ```ruby
530
530
  class Job < ActiveRecord::Base
@@ -866,29 +866,70 @@ end
866
866
 
867
867
  ### Inspection
868
868
 
869
- AASM supports a couple of methods to find out which states or events are provided or permitted.
869
+ AASM supports query methods for states and events
870
+
871
+ Given the following `Job` class:
872
+ ```ruby
873
+ class Job
874
+ include AASM
875
+
876
+ aasm do
877
+ state :sleeping, :initial => true
878
+ state :running, :cleaning
879
+
880
+ event :run do
881
+ transitions :from => :sleeping, :to => :running
882
+ end
883
+
884
+ event :clean do
885
+ transitions :from => :running, :to => :cleaning, :guard => :cleaning_needed?
886
+ end
870
887
 
871
- Given this `Job` class:
888
+ event :sleep do
889
+ transitions :from => [:running, :cleaning], :to => :sleeping
890
+ end
891
+ end
892
+
893
+ def cleaning_needed?
894
+ false
895
+ end
896
+ end
897
+ ```
872
898
 
873
899
  ```ruby
874
900
  # show all states
875
- Job.aasm.states.map(&:name)
876
- => [:sleeping, :running, :cleaning]
901
+ Job.aasm.states.map(&:name)
902
+ #=> [:sleeping, :running, :cleaning]
877
903
 
878
904
  job = Job.new
879
905
 
880
- # show all permitted (reachable / possible) states
881
- job.aasm.states(:permitted => true).map(&:name)
882
- => [:running]
906
+ # show all permitted states (from initial state)
907
+ job.aasm.states(:permitted => true).map(&:name)
908
+ #=> [:running]
909
+
883
910
  job.run
884
911
  job.aasm.states(:permitted => true).map(&:name)
885
- => [:cleaning, :sleeping]
912
+ #=> [:sleeping]
886
913
 
887
- # show all possible (triggerable) events (allowed by transitions)
914
+ # show all non permitted states
915
+ job.aasm.states(:permitted => false).map(&:name)
916
+ #=> [:cleaning]
917
+
918
+ # show all possible (triggerable) events from the current state
888
919
  job.aasm.events.map(&:name)
889
- => [:sleep]
920
+ #=> [:clean, :sleep]
921
+
922
+ # show all permitted events
923
+ job.aasm.events(:permitted => true).map(&:name)
924
+ #=> [:sleep]
925
+
926
+ # show all non permitted events
927
+ job.aasm.events(:permitted => false).map(&:name)
928
+ #=> [:clean]
929
+
930
+ # show all possible events except a specific one
890
931
  job.aasm.events(:reject => :sleep).map(&:name)
891
- => []
932
+ #=> [:clean]
892
933
 
893
934
  # list states for select
894
935
  Job.aasm.states_for_select
@@ -5,6 +5,7 @@ gem 'rubysl', :platforms => :rbx
5
5
  gem 'rubinius-developer_tools', :platforms => :rbx
6
6
  gem "jruby-openssl", :platforms => :jruby
7
7
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
8
+ gem "mime-types", "~> 2" if Gem::Version.create(RUBY_VERSION.dup) <= Gem::Version.create('1.9.3')
8
9
  gem "rails", "4.0.13"
9
10
  gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
10
11
  gem 'sequel'
@@ -6,6 +6,7 @@ gem 'rubysl', :platforms => :rbx
6
6
  gem 'rubinius-developer_tools', :platforms => :rbx
7
7
  gem "jruby-openssl", :platforms => :jruby
8
8
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
9
+ gem "mime-types", "~> 2" if Gem::Version.create(RUBY_VERSION.dup) <= Gem::Version.create('1.9.3')
9
10
  gem "rails", "4.0.13"
10
11
  gem 'sequel'
11
12
  gem 'mongo_mapper', '~>0.13'
@@ -5,6 +5,7 @@ gem 'rubysl', :platforms => :rbx
5
5
  gem 'rubinius-developer_tools', :platforms => :rbx
6
6
  gem "jruby-openssl", :platforms => :jruby
7
7
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
8
+ gem "mime-types", "~> 2" if Gem::Version.create(RUBY_VERSION.dup) <= Gem::Version.create('1.9.3')
8
9
  gem "rails", "4.2.5"
9
10
  gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
10
11
  gem 'sequel'
@@ -6,6 +6,7 @@ gem 'rubysl', :platforms => :rbx
6
6
  gem 'rubinius-developer_tools', :platforms => :rbx
7
7
  gem "jruby-openssl", :platforms => :jruby
8
8
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
9
+ gem "mime-types", "~> 2" if Gem::Version.create(RUBY_VERSION.dup) <= Gem::Version.create('1.9.3')
9
10
  gem "rails", "4.2.5"
10
11
  gem 'sequel'
11
12
  gem 'mongo_mapper'
@@ -5,6 +5,7 @@ gem 'rubysl', :platforms => :rbx
5
5
  gem 'rubinius-developer_tools', :platforms => :rbx
6
6
  gem "jruby-openssl", :platforms => :jruby
7
7
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
8
+ gem "mime-types", "~> 2" if Gem::Version.create(RUBY_VERSION.dup) <= Gem::Version.create('1.9.3')
8
9
  gem "rails", "4.2.5"
9
10
  gem 'mongoid', '~>5.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
10
11
  gem 'sequel'
@@ -5,11 +5,17 @@ gem 'rubysl', :platforms => :rbx
5
5
  gem 'rubinius-developer_tools', :platforms => :rbx
6
6
  gem "jruby-openssl", :platforms => :jruby
7
7
  gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
8
- gem "rails", "4.1.14"
9
- gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
8
+
9
+ gem "rails", "5.0.0.beta4"
10
+
11
+ # mongoid is not yet Rails 5 compatible
12
+ # gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
13
+
10
14
  gem 'sequel'
11
- gem 'dynamoid', '~> 1', :platforms => :ruby
15
+
16
+ # dynamoid is not yet Rails 5 compatible
17
+ # gem 'dynamoid', '~> 1', :platforms => :ruby
18
+
12
19
  gem 'aws-sdk', '~>2', :platforms => :ruby
13
- gem "redis-objects"
14
20
 
15
21
  gemspec :path => "../"
@@ -193,7 +193,13 @@ module AASM
193
193
  end
194
194
 
195
195
  def safely_define_method(klass, method_name, method_definition)
196
- if klass.instance_methods.include?(method_name.to_sym)
196
+ # Warn if method exists and it did not originate from an enum
197
+ if klass.method_defined?(method_name) &&
198
+ ! ( @state_machine.config.enum &&
199
+ klass.respond_to?(:defined_enums) &&
200
+ klass.defined_enums.values.any?{ |methods|
201
+ methods.keys{| enum | enum + '?' == method_name }
202
+ })
197
203
  warn "#{klass.name}: overriding method '#{method_name}'!"
198
204
  end
199
205
 
@@ -125,7 +125,7 @@ module AASM::Core
125
125
  when Proc
126
126
  code.arity == 0 ? record.instance_exec(&code) : record.instance_exec(*args, &code)
127
127
  when Array
128
- @success.map {|a| _fire_callbacks(a, obj, args)}
128
+ code.map {|a| _fire_callbacks(a, record, args)}
129
129
  else
130
130
  true
131
131
  end
@@ -34,19 +34,22 @@ module AASM
34
34
  end
35
35
 
36
36
  def states(options={})
37
- if options[:permitted]
38
- permitted_events = events(:permitted => true)
39
-
37
+ if options.has_key?(:permitted)
38
+ selected_events = events(:permitted => options[:permitted])
40
39
  # An array of arrays. Each inner array represents the transitions that
41
40
  # transition from the current state for an event
42
- event_transitions = permitted_events.map {|e| e.transitions_from_state(current_state) }
41
+ event_transitions = selected_events.map {|e| e.transitions_from_state(current_state) }
43
42
 
44
- # An array of symbols that are possible :to transition states
43
+ # An array of :to transition states
45
44
  to_state_names = event_transitions.map do |transitions|
46
45
  return nil if transitions.empty?
47
46
 
48
- # Return the :to state of the first transition that is allowed or nil
49
- transition = transitions.find { |t| t.allowed?(@instance) }
47
+ # Return the :to state of the first transition that is allowed (or not) or nil
48
+ if options[:permitted]
49
+ transition = transitions.find { |t| t.allowed?(@instance) }
50
+ else
51
+ transition = transitions.find { |t| !t.allowed?(@instance) }
52
+ end
50
53
  transition ? transition.to : nil
51
54
  end.flatten.compact.uniq
52
55
 
@@ -64,10 +67,14 @@ module AASM
64
67
  options[:reject] = Array(options[:reject])
65
68
  events.reject! { |e| options[:reject].include?(e.name) }
66
69
 
67
- if options[:permitted]
70
+ if options.has_key?(:permitted)
68
71
  # filters the results of events_for_current_state so that only those that
69
72
  # are really currently possible (given transition guards) are shown.
70
- events.select! { |e| @instance.send("may_#{e.name}?") }
73
+ if options[:permitted]
74
+ events.select! { |e| @instance.send("may_#{e.name}?") }
75
+ else
76
+ events.select! { |e| !@instance.send("may_#{e.name}?") }
77
+ end
71
78
  end
72
79
 
73
80
  events
@@ -1,3 +1,3 @@
1
1
  module AASM
2
- VERSION = "4.10.0"
2
+ VERSION = "4.10.1"
3
3
  end
@@ -25,10 +25,15 @@ describe 'inspection for common cases' do
25
25
  expect(states).to include(:closed)
26
26
  expect(states).to include(:final)
27
27
 
28
- states = foo.aasm.states(:permitted => true)
29
- expect(states).to include(:closed)
30
- expect(states).not_to include(:open)
31
- expect(states).not_to include(:final)
28
+ permitted_states = foo.aasm.states(:permitted => true)
29
+ expect(permitted_states).to include(:closed)
30
+ expect(permitted_states).not_to include(:open)
31
+ expect(permitted_states).not_to include(:final)
32
+
33
+ blocked_states = foo.aasm.states(:permitted => false)
34
+ expect(blocked_states).to include(:closed)
35
+ expect(blocked_states).not_to include(:open)
36
+ expect(blocked_states).to include(:final)
32
37
 
33
38
  foo.close
34
39
  expect(foo.aasm.states(:permitted => true)).to be_empty
@@ -124,3 +129,16 @@ describe 'permitted events' do
124
129
  expect(foo.aasm.events(:permitted => true, reject: [:close])).not_to include(:close)
125
130
  end
126
131
  end
132
+
133
+ describe 'not permitted events' do
134
+ let(:foo) {Foo.new}
135
+
136
+ it 'work' do
137
+ expect(foo.aasm.events(:permitted => false)).to include(:null)
138
+ expect(foo.aasm.events(:permitted => false)).not_to include(:close)
139
+ end
140
+
141
+ it 'should not include events in the reject option' do
142
+ expect(foo.aasm.events(:permitted => false, reject: :null)).to eq([])
143
+ end
144
+ end
@@ -12,6 +12,21 @@ describe 'warns when overrides a method' do
12
12
  end
13
13
  end
14
14
 
15
+ module WithEnumBase
16
+ def self.included base
17
+ base.send :include, AASM
18
+ base.instance_eval do
19
+ def defined_enums
20
+ { 'state' => { 'valid' => 0, 'invalid' => 1 } }
21
+ end
22
+ end
23
+ base.aasm enum: true do
24
+ state :valid
25
+ event(:save) { }
26
+ end
27
+ end
28
+ end
29
+
15
30
  describe 'state' do
16
31
  class Base
17
32
  def valid?; end
@@ -22,6 +37,16 @@ describe 'warns when overrides a method' do
22
37
  end
23
38
  end
24
39
 
40
+ describe 'enum' do
41
+ class EnumBase
42
+ def valid?; end
43
+ end
44
+ it "dosn't warn when overriding an enum" do
45
+ expect { EnumBase.send :include, WithEnumBase }.
46
+ not_to output(/EnumBase: overriding method 'valid\?'!/).to_stderr
47
+ end
48
+ end
49
+
25
50
  describe 'event' do
26
51
  context 'may?' do
27
52
  class Base
@@ -40,4 +65,5 @@ describe 'warns when overrides a method' do
40
65
  end
41
66
  end
42
67
  end
68
+
43
69
  end
@@ -392,6 +392,18 @@ describe AASM::Core::Transition, '- when invoking the transition :success method
392
392
  st.invoke_success_callbacks(obj, args)
393
393
  end
394
394
 
395
+ it 'should accept a Array for the method name' do
396
+ opts = {:from => 'foo', :to => 'bar', :success => [:test1, :test2]}
397
+ st = AASM::Core::Transition.new(event, opts)
398
+ args = {:arg1 => '1', :arg2 => '2'}
399
+ obj = double('object', :aasm => 'aasm')
400
+
401
+ expect(obj).to receive(:test1)
402
+ expect(obj).to receive(:test2)
403
+
404
+ st.invoke_success_callbacks(obj, args)
405
+ end
406
+
395
407
  it 'should pass args if the target method accepts them' do
396
408
  opts = {:from => 'foo', :to => 'bar', :success => :test}
397
409
  st = AASM::Core::Transition.new(event, opts)
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.10.0
4
+ version: 4.10.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: 2016-03-31 00:00:00.000000000 Z
13
+ date: 2016-05-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake
@@ -107,11 +107,10 @@ files:
107
107
  - gemfiles/rails_3.2_stable.gemfile
108
108
  - gemfiles/rails_4.0.gemfile
109
109
  - gemfiles/rails_4.0_mongo_mapper.gemfile
110
- - gemfiles/rails_4.1.gemfile
111
- - gemfiles/rails_4.1_mongo_mapper.gemfile
112
110
  - gemfiles/rails_4.2.gemfile
113
111
  - gemfiles/rails_4.2_mongo_mapper.gemfile
114
112
  - gemfiles/rails_4.2_mongoid_5.gemfile
113
+ - gemfiles/rails_5.0.gemfile
115
114
  - lib/aasm.rb
116
115
  - lib/aasm/aasm.rb
117
116
  - lib/aasm/base.rb
@@ -300,7 +299,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
300
299
  version: '0'
301
300
  requirements: []
302
301
  rubyforge_project:
303
- rubygems_version: 2.2.2
302
+ rubygems_version: 2.4.5
304
303
  signing_key:
305
304
  specification_version: 4
306
305
  summary: State machine mixin for Ruby objects
@@ -1,16 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "sqlite3", :platforms => :ruby
4
- gem "coveralls"
5
- gem 'rubysl', :platforms => :rbx
6
- gem 'rubinius-developer_tools', :platforms => :rbx
7
- gem "jruby-openssl", :platforms => :jruby
8
- gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
9
- gem "rails", "4.1.14"
10
- gem 'sequel'
11
- gem 'mongo_mapper', '~> 0.13'
12
- gem 'bson_ext', :platforms => :ruby
13
- gem 'dynamoid', '~> 1', :platforms => :ruby
14
- gem 'aws-sdk', '~>2', :platforms => :ruby
15
-
16
- gemspec :path => "../"