aasm 4.0.8 → 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 +4 -4
- data/.travis.yml +5 -2
- data/CHANGELOG.md +6 -2
- data/Gemfile +6 -2
- data/README.md +21 -4
- data/gemfiles/rails_3.2.gemfile +3 -1
- data/gemfiles/rails_4.0.gemfile +2 -5
- data/gemfiles/rails_4.0_bson1.gemfile +14 -0
- data/gemfiles/rails_4.1.gemfile +2 -5
- data/gemfiles/rails_4.1_bson1.gemfile +14 -0
- data/gemfiles/rails_4.2.gemfile +1 -4
- data/gemfiles/rails_4.2_bson1.gemfile +14 -0
- data/lib/aasm/persistence.rb +2 -0
- data/lib/aasm/persistence/active_record_persistence.rb +2 -2
- data/lib/aasm/persistence/base.rb +3 -0
- data/lib/aasm/persistence/mongo_mapper_persistence.rb +174 -0
- data/lib/aasm/persistence/mongoid_persistence.rb +1 -5
- data/lib/aasm/version.rb +1 -1
- data/spec/models/mongo_mapper/no_scope_mongo_mapper.rb +10 -0
- data/spec/models/mongo_mapper/simple_mongo_mapper.rb +11 -0
- data/spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb +12 -0
- data/spec/models/mongoid/simple_new_dsl_mongoid.rb +1 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/persistence/mongo_mapper_persistance_spec.rb +135 -0
- data/spec/unit/persistence/mongoid_persistance_spec.rb +4 -10
- data/spec/unit/persistence/sequel_persistence_spec.rb +2 -1
- metadata +14 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a07996d6cd3f0270a6ec9d010a904cebd462b6a7
|
4
|
+
data.tar.gz: 57e8efc5d284371e23c50d41771beb3172787bdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e1f53507bcbcf9deecce7193a5fed9f37ae5fbc91b6325f127820ead35113e19bea7dba6f87af9482affac31462b05e1b6c89a87ef61a47ad93d95c07f19179
|
7
|
+
data.tar.gz: 9da9eea4b58047190c441dc42c120fed864c318828340cc61505601f70179736d9cc70a0f60166bae13c6fc6aa3f3c8c4569047915a0af72ab152f30ce5422fd
|
data/.travis.yml
CHANGED
@@ -10,7 +10,7 @@ rvm:
|
|
10
10
|
- 2.1
|
11
11
|
- 2.2
|
12
12
|
# - jruby-18mode # JRuby in 1.8 mode
|
13
|
-
- jruby-
|
13
|
+
- jruby-1.7 # JRuby in 1.9 mode
|
14
14
|
- rbx-2.2.1
|
15
15
|
|
16
16
|
services: mongodb
|
@@ -18,13 +18,16 @@ services: mongodb
|
|
18
18
|
gemfile:
|
19
19
|
- gemfiles/rails_3.2.gemfile
|
20
20
|
- gemfiles/rails_4.0.gemfile
|
21
|
+
- gemfiles/rails_4.0_bson1.gemfile
|
21
22
|
- gemfiles/rails_4.1.gemfile
|
23
|
+
- gemfiles/rails_4.1_bson1.gemfile
|
22
24
|
- gemfiles/rails_4.2.gemfile
|
25
|
+
- gemfiles/rails_4.2_bson1.gemfile
|
23
26
|
|
24
27
|
matrix:
|
25
28
|
allow_failures:
|
26
29
|
- rvm: rbx-2.2.1
|
27
|
-
- rvm: jruby-
|
30
|
+
- rvm: jruby-1.7
|
28
31
|
exclude:
|
29
32
|
- rvm: 1.9.3
|
30
33
|
gemfile: gemfiles/rails_4.1.gemfile
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
-
## 4.
|
3
|
+
## 4.2.0 (not yet released)
|
4
4
|
|
5
|
+
## 4.1.0
|
6
|
+
|
7
|
+
* bugfix: initialize the aasm state column after initialization of the _Mongoid_ instance (see [issue #206](https://github.com/aasm/aasm/issues/206), thanks to [@Shwetakale ](https://github.com/Shwetakale ))
|
8
|
+
* added support for mongomapper ORM (see [issue #203](https://github.com/aasm/aasm/issues/203), thanks to [@reidmorrison ](https://github.com/reidmorrison ))
|
5
9
|
* `aasm_column` has been removed. Use `aasm.attribute_name` instead
|
6
10
|
* `aasm_human_event_name` has been removed. Use `aasm.human_event_name` instead
|
7
11
|
|
8
12
|
## 4.0.8
|
9
13
|
|
10
|
-
* bugfix:
|
14
|
+
* bugfix: may_event_name? should return true or false only (see [issue #200](https://github.com/aasm/aasm/issues/200) for details)
|
11
15
|
|
12
16
|
## 4.0.7
|
13
17
|
|
data/Gemfile
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
3
|
gem "sqlite3", :platforms => :ruby
|
4
|
-
gem "coveralls"
|
4
|
+
gem "coveralls"
|
5
5
|
gem 'rubysl', :platforms => :rbx
|
6
6
|
gem "jruby-openssl", :platforms => :jruby
|
7
7
|
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
8
8
|
gem "rails", "~>4.1"
|
9
|
-
gem 'mongoid' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
9
|
+
gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
10
10
|
gem 'sequel'
|
11
|
+
# Since mongoid V4 requires incompatible bson V2, cannot have mongoid (V4 or greater)
|
12
|
+
# and mongo_mapper ( or mongo ) in the same application
|
13
|
+
#gem 'mongo_mapper', '~> 0.13'
|
14
|
+
#gem 'bson_ext', :platforms => :ruby
|
11
15
|
|
12
16
|
gemspec
|
data/README.md
CHANGED
@@ -9,8 +9,8 @@ This package contains AASM, a library for adding finite state machines to Ruby c
|
|
9
9
|
|
10
10
|
AASM started as the *acts_as_state_machine* plugin but has evolved into a more generic library
|
11
11
|
that no longer targets only ActiveRecord models. It currently provides adapters for
|
12
|
-
[ActiveRecord](http://api.rubyonrails.org/classes/ActiveRecord/Base.html)
|
13
|
-
[Mongoid](http://mongoid.org/), but it can be used for any Ruby class, no matter what
|
12
|
+
[ActiveRecord](http://api.rubyonrails.org/classes/ActiveRecord/Base.html),
|
13
|
+
[Mongoid](http://mongoid.org/), and [Mongomapper](http://mongomapper.com/) but it can be used for any Ruby class, no matter what
|
14
14
|
parent class it has (if any).
|
15
15
|
|
16
16
|
## Upgrade from version 3 to 4
|
@@ -435,7 +435,7 @@ to ```false```.
|
|
435
435
|
|
436
436
|
### Sequel
|
437
437
|
|
438
|
-
AASM also supports [Sequel](http://sequel.jeremyevans.net/) besides _ActiveRecord_ and
|
438
|
+
AASM also supports [Sequel](http://sequel.jeremyevans.net/) besides _ActiveRecord_, _Mongoid_, and _MongoMapper_.
|
439
439
|
|
440
440
|
```ruby
|
441
441
|
class Job < Sequel::Model
|
@@ -466,6 +466,23 @@ class Job
|
|
466
466
|
end
|
467
467
|
```
|
468
468
|
|
469
|
+
### MongoMapper
|
470
|
+
|
471
|
+
AASM also supports persistence to Mongodb if you're using MongoMapper. Make sure
|
472
|
+
to include MongoMapper::Document before you include AASM.
|
473
|
+
|
474
|
+
```ruby
|
475
|
+
class Job
|
476
|
+
include MongoMapper::Document
|
477
|
+
include AASM
|
478
|
+
|
479
|
+
key :aasm_state, Symbol
|
480
|
+
aasm do
|
481
|
+
...
|
482
|
+
end
|
483
|
+
end
|
484
|
+
```
|
485
|
+
|
469
486
|
### Automatic Scopes
|
470
487
|
|
471
488
|
AASM will automatically create scope methods for each state in the model.
|
@@ -671,7 +688,7 @@ purpose.
|
|
671
688
|
|
672
689
|
## License ##
|
673
690
|
|
674
|
-
Copyright (c) 2006-
|
691
|
+
Copyright (c) 2006-2015 Scott Barron
|
675
692
|
|
676
693
|
Permission is hereby granted, free of charge, to any person obtaining
|
677
694
|
a copy of this software and associated documentation files (the
|
data/gemfiles/rails_3.2.gemfile
CHANGED
@@ -7,7 +7,9 @@ gem 'rubinius-developer_tools', :platforms => :rbx
|
|
7
7
|
gem "jruby-openssl", :platforms => :jruby
|
8
8
|
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
9
9
|
gem "rails", "3.2.21"
|
10
|
-
gem 'mongoid' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
10
|
+
gem 'mongoid', '~>3.1' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
11
11
|
gem 'sequel'
|
12
|
+
gem 'mongo_mapper', '~>0.13'
|
13
|
+
gem 'bson_ext', :platforms => :ruby
|
12
14
|
|
13
15
|
gemspec :path => "../"
|
data/gemfiles/rails_4.0.gemfile
CHANGED
@@ -6,11 +6,8 @@ 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 "rails", "4.0.
|
10
|
-
|
11
|
-
# mongoid is not yet compatible with Rails >= 4
|
12
|
-
# gem 'mongoid' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
13
|
-
|
9
|
+
gem "rails", "4.0.13"
|
10
|
+
gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
14
11
|
gem 'sequel'
|
15
12
|
|
16
13
|
gemspec :path => "../"
|
@@ -0,0 +1,14 @@
|
|
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.0.13"
|
10
|
+
gem 'sequel'
|
11
|
+
gem 'mongo_mapper', '~>0.13'
|
12
|
+
gem 'bson_ext', :platforms => :ruby
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
data/gemfiles/rails_4.1.gemfile
CHANGED
@@ -6,11 +6,8 @@ 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 "rails", "4.1.
|
10
|
-
|
11
|
-
# mongoid is not yet compatible with Rails >= 4
|
12
|
-
# gem 'mongoid' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
13
|
-
|
9
|
+
gem "rails", "4.1.9"
|
10
|
+
gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
14
11
|
gem 'sequel'
|
15
12
|
|
16
13
|
gemspec :path => "../"
|
@@ -0,0 +1,14 @@
|
|
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.9"
|
10
|
+
gem 'sequel'
|
11
|
+
gem 'mongo_mapper', '~> 0.13'
|
12
|
+
gem 'bson_ext', :platforms => :ruby
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
data/gemfiles/rails_4.2.gemfile
CHANGED
@@ -7,10 +7,7 @@ gem 'rubinius-developer_tools', :platforms => :rbx
|
|
7
7
|
gem "jruby-openssl", :platforms => :jruby
|
8
8
|
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
9
9
|
gem "rails", "4.2.0"
|
10
|
-
|
11
|
-
# mongoid is not yet compatible with Rails >= 4
|
12
|
-
# gem 'mongoid' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
13
|
-
|
10
|
+
gem 'mongoid', '~>4.0' if Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version.create('1.9.3')
|
14
11
|
gem 'sequel'
|
15
12
|
|
16
13
|
gemspec :path => "../"
|
@@ -0,0 +1,14 @@
|
|
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.2.0"
|
10
|
+
gem 'sequel'
|
11
|
+
gem 'mongo_mapper'
|
12
|
+
gem 'bson_ext', :platforms => :ruby
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
data/lib/aasm/persistence.rb
CHANGED
@@ -10,6 +10,8 @@ module AASM
|
|
10
10
|
include_persistence base, :active_record
|
11
11
|
elsif hierarchy.include?("Mongoid::Document")
|
12
12
|
include_persistence base, :mongoid
|
13
|
+
elsif hierarchy.include?("MongoMapper::Document")
|
14
|
+
include_persistence base, :mongo_mapper
|
13
15
|
elsif hierarchy.include?("Sequel::Model")
|
14
16
|
include_persistence base, :sequel
|
15
17
|
else
|
@@ -10,7 +10,7 @@ module AASM
|
|
10
10
|
#
|
11
11
|
# Adds
|
12
12
|
#
|
13
|
-
#
|
13
|
+
# after_initialize :aasm_ensure_initial_state
|
14
14
|
#
|
15
15
|
# As a result, it doesn't matter when you define your methods - the following 2 are equivalent
|
16
16
|
#
|
@@ -166,7 +166,7 @@ module AASM
|
|
166
166
|
def aasm_ensure_initial_state
|
167
167
|
# checking via respond_to? does not work in Rails <= 3
|
168
168
|
# if respond_to?(self.class.aasm.attribute_name) && send(self.class.aasm.attribute_name).blank? # Rails 4
|
169
|
-
if
|
169
|
+
if attribute_names.include?(self.class.aasm.attribute_name.to_s) && send(self.class.aasm.attribute_name).blank?
|
170
170
|
aasm.enter_initial_state
|
171
171
|
end
|
172
172
|
end
|
@@ -71,6 +71,9 @@ module AASM
|
|
71
71
|
elsif @klass.ancestors.map {|klass| klass.to_s}.include?("Mongoid::Document")
|
72
72
|
scope_options = lambda { @klass.send(:where, {@klass.aasm.attribute_name.to_sym => name.to_s}) }
|
73
73
|
@klass.send(:scope, name, scope_options)
|
74
|
+
elsif @klass.ancestors.map {|klass| klass.to_s}.include?("MongoMapper::Document")
|
75
|
+
conditions = { @klass.aasm.attribute_name.to_sym => name.to_s }
|
76
|
+
@klass.scope(name, lambda { @klass.where(conditions) })
|
74
77
|
end
|
75
78
|
end
|
76
79
|
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module AASM
|
4
|
+
module Persistence
|
5
|
+
module MongoMapperPersistence
|
6
|
+
# This method:
|
7
|
+
#
|
8
|
+
# * extends the model with ClassMethods
|
9
|
+
# * includes InstanceMethods
|
10
|
+
#
|
11
|
+
# Adds
|
12
|
+
#
|
13
|
+
# before_validation :aasm_ensure_initial_state, :on => :create
|
14
|
+
#
|
15
|
+
# As a result, it doesn't matter when you define your methods - the following 2 are equivalent
|
16
|
+
#
|
17
|
+
# class Foo
|
18
|
+
# include MongoMapper::Document
|
19
|
+
# def aasm_write_state(state)
|
20
|
+
# "bar"
|
21
|
+
# end
|
22
|
+
# include AASM
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# class Foo < ActiveRecord::Base
|
26
|
+
# include MongoMapper::Document
|
27
|
+
# include AASM
|
28
|
+
# def aasm_write_state(state)
|
29
|
+
# "bar"
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
def self.included(base)
|
34
|
+
base.send(:include, AASM::Persistence::Base)
|
35
|
+
base.extend AASM::Persistence::MongoMapperPersistence::ClassMethods
|
36
|
+
base.send(:include, AASM::Persistence::MongoMapperPersistence::InstanceMethods)
|
37
|
+
|
38
|
+
base.before_create :aasm_ensure_initial_state
|
39
|
+
|
40
|
+
# ensure state is in the list of states
|
41
|
+
base.validate :aasm_validate_states
|
42
|
+
end
|
43
|
+
|
44
|
+
module ClassMethods
|
45
|
+
|
46
|
+
def find_in_state(number, state, *args)
|
47
|
+
with_state_scope(state).find!(number, *args)
|
48
|
+
end
|
49
|
+
|
50
|
+
def count_in_state(state, *args)
|
51
|
+
with_state_scope(state).count(*args)
|
52
|
+
end
|
53
|
+
|
54
|
+
def calculate_in_state(state, *args)
|
55
|
+
with_state_scope(state).calculate(*args)
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
def with_state_scope(state)
|
60
|
+
where(aasm.attribute_name.to_sym => state.to_s)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module InstanceMethods
|
65
|
+
|
66
|
+
# Writes <tt>state</tt> to the state column and persists it to the database
|
67
|
+
#
|
68
|
+
# foo = Foo.find(1)
|
69
|
+
# foo.aasm.current_state # => :opened
|
70
|
+
# foo.close!
|
71
|
+
# foo.aasm.current_state # => :closed
|
72
|
+
# Foo.find(1).aasm.current_state # => :closed
|
73
|
+
#
|
74
|
+
# NOTE: intended to be called from an event
|
75
|
+
def aasm_write_state(state)
|
76
|
+
old_value = read_attribute(self.class.aasm.attribute_name)
|
77
|
+
aasm_write_attribute state
|
78
|
+
|
79
|
+
success = if aasm_skipping_validations
|
80
|
+
value = aasm_raw_attribute_value state
|
81
|
+
self.class.where(self.class.primary_key => self.id).update_all(self.class.aasm.attribute_name => value) == 1
|
82
|
+
else
|
83
|
+
self.save
|
84
|
+
end
|
85
|
+
unless success
|
86
|
+
write_attribute(self.class.aasm.attribute_name, old_value)
|
87
|
+
return false
|
88
|
+
end
|
89
|
+
|
90
|
+
true
|
91
|
+
end
|
92
|
+
|
93
|
+
# Writes <tt>state</tt> to the state column, but does not persist it to the database
|
94
|
+
#
|
95
|
+
# foo = Foo.find(1)
|
96
|
+
# foo.aasm.current_state # => :opened
|
97
|
+
# foo.close
|
98
|
+
# foo.aasm.current_state # => :closed
|
99
|
+
# Foo.find(1).aasm.current_state # => :opened
|
100
|
+
# foo.save
|
101
|
+
# foo.aasm.current_state # => :closed
|
102
|
+
# Foo.find(1).aasm.current_state # => :closed
|
103
|
+
#
|
104
|
+
# NOTE: intended to be called from an event
|
105
|
+
def aasm_write_state_without_persistence(state)
|
106
|
+
aasm_write_attribute state
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
def aasm_enum
|
111
|
+
case AASM::StateMachine[self.class].config.enum
|
112
|
+
when false then nil
|
113
|
+
when true then aasm_guess_enum_method
|
114
|
+
when nil then aasm_guess_enum_method if aasm_column_looks_like_enum
|
115
|
+
else AASM::StateMachine[self.class].config.enum
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def aasm_column_looks_like_enum
|
120
|
+
self.class.keys[self.class.aasm.attribute_name.to_s].type == Integer
|
121
|
+
end
|
122
|
+
|
123
|
+
def aasm_guess_enum_method
|
124
|
+
self.class.aasm.attribute_name.to_s.pluralize.to_sym
|
125
|
+
end
|
126
|
+
|
127
|
+
def aasm_skipping_validations
|
128
|
+
AASM::StateMachine[self.class].config.skip_validation_on_save
|
129
|
+
end
|
130
|
+
|
131
|
+
def aasm_write_attribute(state)
|
132
|
+
write_attribute self.class.aasm.attribute_name, aasm_raw_attribute_value(state)
|
133
|
+
end
|
134
|
+
|
135
|
+
def aasm_raw_attribute_value(state)
|
136
|
+
if aasm_enum
|
137
|
+
self.class.send(aasm_enum)[state]
|
138
|
+
else
|
139
|
+
state.to_s
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# Ensures that if the aasm_state column is nil and the record is new
|
144
|
+
# that the initial state gets populated before validation on create
|
145
|
+
#
|
146
|
+
# foo = Foo.new
|
147
|
+
# foo.aasm_state # => nil
|
148
|
+
# foo.valid?
|
149
|
+
# foo.aasm_state # => "open" (where :open is the initial state)
|
150
|
+
#
|
151
|
+
#
|
152
|
+
# foo = Foo.find(:first)
|
153
|
+
# foo.aasm_state # => 1
|
154
|
+
# foo.aasm_state = nil
|
155
|
+
# foo.valid?
|
156
|
+
# foo.aasm_state # => nil
|
157
|
+
#
|
158
|
+
def aasm_ensure_initial_state
|
159
|
+
return send("#{self.class.aasm.attribute_name}=", aasm.enter_initial_state.to_s) if send(self.class.aasm.attribute_name).blank?
|
160
|
+
end
|
161
|
+
|
162
|
+
def aasm_validate_states
|
163
|
+
send("#{self.class.aasm.attribute_name}=", aasm.enter_initial_state.to_s) if send(self.class.aasm.attribute_name).blank?
|
164
|
+
unless AASM::StateMachine[self.class].config.skip_validation_on_save
|
165
|
+
if aasm.current_state && !aasm.states.include?(aasm.current_state)
|
166
|
+
self.errors.add(AASM::StateMachine[self.class].config.column , "is invalid")
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end # InstanceMethods
|
171
|
+
|
172
|
+
end
|
173
|
+
end # Persistence
|
174
|
+
end # AASM
|
@@ -35,11 +35,7 @@ module AASM
|
|
35
35
|
base.extend AASM::Persistence::MongoidPersistence::ClassMethods
|
36
36
|
base.send(:include, AASM::Persistence::MongoidPersistence::InstanceMethods)
|
37
37
|
|
38
|
-
|
39
|
-
# base.before_validation_on_create :aasm_ensure_initial_state
|
40
|
-
base.before_validation :aasm_ensure_initial_state
|
41
|
-
# ensure initial aasm state even when validations are skipped
|
42
|
-
base.before_create :aasm_ensure_initial_state
|
38
|
+
base.after_initialize :aasm_ensure_initial_state
|
43
39
|
end
|
44
40
|
|
45
41
|
module ClassMethods
|
data/lib/aasm/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -11,6 +11,8 @@ Coveralls.wear!
|
|
11
11
|
# require 'ruby-debug/completion'
|
12
12
|
# require 'pry'
|
13
13
|
|
14
|
+
SEQUEL_DB = defined?(JRUBY_VERSION) ? 'jdbc:sqlite::memory:' : 'sqlite:/'
|
15
|
+
|
14
16
|
def load_schema
|
15
17
|
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
16
18
|
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
@@ -0,0 +1,135 @@
|
|
1
|
+
describe 'mongo_mapper' do
|
2
|
+
begin
|
3
|
+
require 'mongo_mapper'
|
4
|
+
require 'logger'
|
5
|
+
require 'spec_helper'
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
Dir[File.dirname(__FILE__) + "/../../models/mongo_mapper/*.rb"].sort.each { |f| require File.expand_path(f) }
|
9
|
+
|
10
|
+
config = {
|
11
|
+
'test' => {
|
12
|
+
'database' => "mongo_mapper_#{Process.pid}"
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
MongoMapper.setup(config, 'test') #, :logger => Logger.new(STDERR))
|
17
|
+
end
|
18
|
+
|
19
|
+
after do
|
20
|
+
# Clear Out all non-system Mongo collections between tests
|
21
|
+
MongoMapper.database.collections.each do |collection|
|
22
|
+
collection.drop unless collection.capped? || (collection.name =~ /\Asystem/)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "named scopes with the old DSL" do
|
27
|
+
|
28
|
+
context "Does not already respond_to? the scope name" do
|
29
|
+
it "should add a scope" do
|
30
|
+
expect(SimpleMongoMapper).to respond_to(:unknown_scope)
|
31
|
+
expect(SimpleMongoMapper.unknown_scope.class).to eq(MongoMapper::Plugins::Querying::DecoratedPluckyQuery)
|
32
|
+
#expect(SimpleMongoMapper.unknown_scope.is_a?(ActiveRecord::Relation)).to be_truthy
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "Already respond_to? the scope name" do
|
37
|
+
it "should not add a scope" do
|
38
|
+
expect(SimpleMongoMapper).to respond_to(:next)
|
39
|
+
expect(SimpleMongoMapper.new.class).to eq(SimpleMongoMapper)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "named scopes with the new DSL" do
|
46
|
+
|
47
|
+
context "Does not already respond_to? the scope name" do
|
48
|
+
it "should add a scope" do
|
49
|
+
expect(SimpleNewDslMongoMapper).to respond_to(:unknown_scope)
|
50
|
+
expect(SimpleNewDslMongoMapper.unknown_scope.class).to eq(MongoMapper::Plugins::Querying::DecoratedPluckyQuery)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "Already respond_to? the scope name" do
|
55
|
+
it "should not add a scope" do
|
56
|
+
expect(SimpleNewDslMongoMapper).to respond_to(:next)
|
57
|
+
expect(SimpleNewDslMongoMapper.new.class).to eq(SimpleNewDslMongoMapper)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it "does not create scopes if requested" do
|
62
|
+
expect(NoScopeMongoMapper).not_to respond_to(:ignored_scope)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#find_in_state" do
|
68
|
+
|
69
|
+
let!(:model) { SimpleNewDslMongoMapper.create!(:status => :unknown_scope) }
|
70
|
+
let!(:model_id) { model._id }
|
71
|
+
|
72
|
+
it "should respond to method" do
|
73
|
+
expect(SimpleNewDslMongoMapper).to respond_to(:find_in_state)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should find the model when given the correct scope and model id" do
|
77
|
+
expect(SimpleNewDslMongoMapper.find_in_state(model_id, 'unknown_scope').class).to eq(SimpleNewDslMongoMapper)
|
78
|
+
expect(SimpleNewDslMongoMapper.find_in_state(model_id, 'unknown_scope')).to eq(model)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should raise DocumentNotFound error when given incorrect scope" do
|
82
|
+
expect {SimpleNewDslMongoMapper.find_in_state(model_id, 'next')}.to raise_error MongoMapper::DocumentNotFound
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should raise DocumentNotFound error when given incorrect model id" do
|
86
|
+
expect {SimpleNewDslMongoMapper.find_in_state('bad_id', 'unknown_scope')}.to raise_error MongoMapper::DocumentNotFound
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "#count_in_state" do
|
92
|
+
|
93
|
+
before do
|
94
|
+
3.times { SimpleNewDslMongoMapper.create!(:status => :unknown_scope) }
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should respond to method" do
|
98
|
+
expect(SimpleNewDslMongoMapper).to respond_to(:count_in_state)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should return n for a scope with n records persisted" do
|
102
|
+
expect(SimpleNewDslMongoMapper.count_in_state('unknown_scope').class).to eq(Fixnum)
|
103
|
+
expect(SimpleNewDslMongoMapper.count_in_state('unknown_scope')).to eq(3)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should return zero for a scope without records persisted" do
|
107
|
+
expect(SimpleNewDslMongoMapper.count_in_state('next').class).to eq(Fixnum)
|
108
|
+
expect(SimpleNewDslMongoMapper.count_in_state('next')).to eq(0)
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "instance methods" do
|
114
|
+
|
115
|
+
let(:simple) {SimpleNewDslMongoMapper.new}
|
116
|
+
|
117
|
+
it "should call aasm_ensure_initial_state on validation before create" do
|
118
|
+
expect(SimpleNewDslMongoMapper.aasm.initial_state).to eq(:unknown_scope)
|
119
|
+
expect(SimpleNewDslMongoMapper.aasm.attribute_name).to eq(:status)
|
120
|
+
expect(simple.status).to eq(nil)
|
121
|
+
simple.valid?
|
122
|
+
expect(simple.status).to eq('unknown_scope')
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should call aasm_ensure_initial_state before create, even if skipping validations" do
|
126
|
+
expect(simple.status).to eq(nil)
|
127
|
+
simple.save(:validate => false)
|
128
|
+
expect(simple.status).to eq('unknown_scope')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
rescue LoadError
|
133
|
+
puts "Not running MongoMapper specs because mongo_mapper gem is not installed!!!"
|
134
|
+
end
|
135
|
+
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
describe 'mongoid'
|
2
|
-
# describe 'mongoid' do
|
3
|
-
|
1
|
+
describe 'mongoid' do
|
4
2
|
begin
|
5
3
|
require 'mongoid'
|
6
4
|
require 'logger'
|
@@ -135,15 +133,11 @@ describe 'mongoid', :if => Gem::Version.create(RUBY_VERSION.dup) >= Gem::Version
|
|
135
133
|
describe "instance methods" do
|
136
134
|
let(:simple) {SimpleNewDslMongoid.new}
|
137
135
|
|
138
|
-
it "should
|
139
|
-
expect(
|
140
|
-
|
136
|
+
it "should initialize the aasm state on instantiation" do
|
137
|
+
expect(SimpleNewDslMongoid.new.status).to eql 'unknown_scope'
|
138
|
+
expect(SimpleNewDslMongoid.new.aasm.current_state).to eql :unknown_scope
|
141
139
|
end
|
142
140
|
|
143
|
-
it "should call aasm_ensure_initial_state before create, even if skipping validations" do
|
144
|
-
expect(simple).to receive(:aasm_ensure_initial_state).and_return(true)
|
145
|
-
simple.save(:validate => false)
|
146
|
-
end
|
147
141
|
end
|
148
142
|
|
149
143
|
rescue LoadError
|
@@ -6,7 +6,8 @@ describe 'sequel' do
|
|
6
6
|
require 'spec_helper'
|
7
7
|
|
8
8
|
before(:all) do
|
9
|
-
db = Sequel.
|
9
|
+
db = Sequel.connect(SEQUEL_DB)
|
10
|
+
|
10
11
|
# if you want to see the statements while running the spec enable the following line
|
11
12
|
# db.loggers << Logger.new($stderr)
|
12
13
|
db.create_table(:models) do
|
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
|
4
|
+
version: 4.1.0
|
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:
|
13
|
+
date: 2015-02-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -91,8 +91,11 @@ files:
|
|
91
91
|
- callbacks.txt
|
92
92
|
- gemfiles/rails_3.2.gemfile
|
93
93
|
- gemfiles/rails_4.0.gemfile
|
94
|
+
- gemfiles/rails_4.0_bson1.gemfile
|
94
95
|
- gemfiles/rails_4.1.gemfile
|
96
|
+
- gemfiles/rails_4.1_bson1.gemfile
|
95
97
|
- gemfiles/rails_4.2.gemfile
|
98
|
+
- gemfiles/rails_4.2_bson1.gemfile
|
96
99
|
- lib/aasm.rb
|
97
100
|
- lib/aasm/aasm.rb
|
98
101
|
- lib/aasm/base.rb
|
@@ -107,6 +110,7 @@ files:
|
|
107
110
|
- lib/aasm/persistence.rb
|
108
111
|
- lib/aasm/persistence/active_record_persistence.rb
|
109
112
|
- lib/aasm/persistence/base.rb
|
113
|
+
- lib/aasm/persistence/mongo_mapper_persistence.rb
|
110
114
|
- lib/aasm/persistence/mongoid_persistence.rb
|
111
115
|
- lib/aasm/persistence/plain_persistence.rb
|
112
116
|
- lib/aasm/persistence/sequel_persistence.rb
|
@@ -132,6 +136,9 @@ files:
|
|
132
136
|
- spec/models/foo.rb
|
133
137
|
- spec/models/guardian.rb
|
134
138
|
- spec/models/invalid_persistor.rb
|
139
|
+
- spec/models/mongo_mapper/no_scope_mongo_mapper.rb
|
140
|
+
- spec/models/mongo_mapper/simple_mongo_mapper.rb
|
141
|
+
- spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb
|
135
142
|
- spec/models/mongoid/no_scope_mongoid.rb
|
136
143
|
- spec/models/mongoid/simple_mongoid.rb
|
137
144
|
- spec/models/mongoid/simple_new_dsl_mongoid.rb
|
@@ -159,6 +166,7 @@ files:
|
|
159
166
|
- spec/unit/memory_leak_spec.rb
|
160
167
|
- spec/unit/new_dsl_spec.rb
|
161
168
|
- spec/unit/persistence/active_record_persistence_spec.rb
|
169
|
+
- spec/unit/persistence/mongo_mapper_persistance_spec.rb
|
162
170
|
- spec/unit/persistence/mongoid_persistance_spec.rb
|
163
171
|
- spec/unit/persistence/sequel_persistence_spec.rb
|
164
172
|
- spec/unit/reloading_spec.rb
|
@@ -211,6 +219,9 @@ test_files:
|
|
211
219
|
- spec/models/foo.rb
|
212
220
|
- spec/models/guardian.rb
|
213
221
|
- spec/models/invalid_persistor.rb
|
222
|
+
- spec/models/mongo_mapper/no_scope_mongo_mapper.rb
|
223
|
+
- spec/models/mongo_mapper/simple_mongo_mapper.rb
|
224
|
+
- spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb
|
214
225
|
- spec/models/mongoid/no_scope_mongoid.rb
|
215
226
|
- spec/models/mongoid/simple_mongoid.rb
|
216
227
|
- spec/models/mongoid/simple_new_dsl_mongoid.rb
|
@@ -238,6 +249,7 @@ test_files:
|
|
238
249
|
- spec/unit/memory_leak_spec.rb
|
239
250
|
- spec/unit/new_dsl_spec.rb
|
240
251
|
- spec/unit/persistence/active_record_persistence_spec.rb
|
252
|
+
- spec/unit/persistence/mongo_mapper_persistance_spec.rb
|
241
253
|
- spec/unit/persistence/mongoid_persistance_spec.rb
|
242
254
|
- spec/unit/persistence/sequel_persistence_spec.rb
|
243
255
|
- spec/unit/reloading_spec.rb
|