state_manager 0.2.10 → 0.2.11
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.
- data/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -9
- data/Gemfile.lock +46 -62
- data/Rakefile +0 -24
- data/VERSION +1 -1
- data/lib/state_manager/adapters/active_record.rb +20 -15
- data/lib/state_manager/dsl.rb +2 -2
- data/lib/state_manager/plugins/delayed_job.rb +7 -1
- data/lib/state_manager/resource.rb +1 -1
- data/state_manager.gemspec +20 -99
- data/test/adapters/active_record_test.rb +40 -7
- data/test/basic_test.rb +5 -5
- data/test/definition_test.rb +1 -1
- data/test/helper.rb +11 -9
- data/test/helpers_test.rb +1 -1
- data/test/plugins/delayed_job_test.rb +9 -4
- data/test/transitions_test.rb +1 -1
- metadata +31 -186
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -1,18 +1,13 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
|
3
|
+
gemspec
|
4
4
|
|
5
5
|
group :development do
|
6
|
-
gem "
|
7
|
-
gem 'pry'
|
8
|
-
gem 'pry-doc'
|
9
|
-
gem 'pry-remote'
|
10
|
-
gem 'pry-nav'
|
11
|
-
gem 'pry-stack_explorer'
|
12
|
-
gem "bundler", "~> 1.0.0"
|
13
|
-
gem "jeweler", "~> 1.8.3"
|
6
|
+
gem "bundler"
|
14
7
|
gem 'delayed_job_active_record'
|
15
8
|
gem 'activerecord'
|
16
9
|
gem 'sqlite3'
|
17
10
|
gem 'timecop'
|
11
|
+
gem 'database_cleaner'
|
12
|
+
gem 'byebug'
|
18
13
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,74 +1,58 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
state_manager (0.2.11)
|
5
|
+
activesupport
|
6
|
+
|
1
7
|
GEM
|
2
8
|
remote: http://rubygems.org/
|
3
9
|
specs:
|
4
|
-
activemodel (
|
5
|
-
activesupport (=
|
6
|
-
builder (~> 3.
|
7
|
-
activerecord (
|
8
|
-
activemodel (=
|
9
|
-
activesupport (=
|
10
|
-
arel (~>
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
json (1.
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
pry (>= 0.9.0)
|
40
|
-
yard (~> 0.8.1)
|
41
|
-
pry-nav (0.2.1)
|
42
|
-
pry (~> 0.9.9)
|
43
|
-
pry-remote (0.1.4)
|
44
|
-
pry (~> 0.9.9)
|
45
|
-
slop (~> 2.1)
|
46
|
-
pry-stack_explorer (0.4.2)
|
47
|
-
binding_of_caller (~> 0.6.2)
|
48
|
-
pry (~> 0.9.9)
|
49
|
-
rake (0.9.2.2)
|
50
|
-
rdoc (3.12)
|
51
|
-
json (~> 1.4)
|
52
|
-
slop (2.4.4)
|
53
|
-
sqlite3 (1.3.6)
|
54
|
-
timecop (0.3.5)
|
55
|
-
tzinfo (0.3.33)
|
56
|
-
yard (0.8.1)
|
10
|
+
activemodel (4.1.1)
|
11
|
+
activesupport (= 4.1.1)
|
12
|
+
builder (~> 3.1)
|
13
|
+
activerecord (4.1.1)
|
14
|
+
activemodel (= 4.1.1)
|
15
|
+
activesupport (= 4.1.1)
|
16
|
+
arel (~> 5.0.0)
|
17
|
+
activesupport (4.1.1)
|
18
|
+
i18n (~> 0.6, >= 0.6.9)
|
19
|
+
json (~> 1.7, >= 1.7.7)
|
20
|
+
minitest (~> 5.1)
|
21
|
+
thread_safe (~> 0.1)
|
22
|
+
tzinfo (~> 1.1)
|
23
|
+
arel (5.0.1.20140414130214)
|
24
|
+
builder (3.2.2)
|
25
|
+
byebug (3.1.2)
|
26
|
+
columnize (~> 0.8)
|
27
|
+
debugger-linecache (~> 1.2)
|
28
|
+
columnize (0.8.9)
|
29
|
+
database_cleaner (1.3.0)
|
30
|
+
debugger-linecache (1.2.0)
|
31
|
+
delayed_job (4.0.1)
|
32
|
+
activesupport (>= 3.0, < 4.2)
|
33
|
+
delayed_job_active_record (4.0.1)
|
34
|
+
activerecord (>= 3.0, < 4.2)
|
35
|
+
delayed_job (>= 3.0, < 4.1)
|
36
|
+
i18n (0.6.9)
|
37
|
+
json (1.8.1)
|
38
|
+
minitest (5.3.4)
|
39
|
+
rake (10.3.2)
|
40
|
+
sqlite3 (1.3.9)
|
41
|
+
thread_safe (0.3.4)
|
42
|
+
timecop (0.7.1)
|
43
|
+
tzinfo (1.2.1)
|
44
|
+
thread_safe (~> 0.1)
|
57
45
|
|
58
46
|
PLATFORMS
|
59
47
|
ruby
|
60
48
|
|
61
49
|
DEPENDENCIES
|
62
50
|
activerecord
|
63
|
-
|
64
|
-
|
51
|
+
bundler
|
52
|
+
byebug
|
53
|
+
database_cleaner
|
65
54
|
delayed_job_active_record
|
66
|
-
|
67
|
-
pry
|
68
|
-
pry-doc
|
69
|
-
pry-nav
|
70
|
-
pry-remote
|
71
|
-
pry-stack_explorer
|
72
|
-
rdoc (~> 3.12)
|
55
|
+
rake
|
73
56
|
sqlite3
|
57
|
+
state_manager!
|
74
58
|
timecop
|
data/Rakefile
CHANGED
@@ -11,20 +11,6 @@ rescue Bundler::BundlerError => e
|
|
11
11
|
end
|
12
12
|
require 'rake'
|
13
13
|
|
14
|
-
require 'jeweler'
|
15
|
-
Jeweler::Tasks.new do |gem|
|
16
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
-
gem.name = "state_manager"
|
18
|
-
gem.homepage = "http://github.com/ghempton/state_manager"
|
19
|
-
gem.license = "MIT"
|
20
|
-
gem.summary = "%Q{Finite state machine implementation.}"
|
21
|
-
gem.description = %Q{Finite state machine implementation that keeps logic separate from model classes and supports sub-states.}
|
22
|
-
gem.email = "ghempton@gmail.com"
|
23
|
-
gem.authors = ["Gordon Hempton"]
|
24
|
-
# dependencies defined in Gemfile
|
25
|
-
end
|
26
|
-
Jeweler::RubygemsDotOrgTasks.new
|
27
|
-
|
28
14
|
require 'rake/testtask'
|
29
15
|
Rake::TestTask.new(:test) do |test|
|
30
16
|
test.libs << 'lib' << 'test'
|
@@ -33,13 +19,3 @@ Rake::TestTask.new(:test) do |test|
|
|
33
19
|
end
|
34
20
|
|
35
21
|
task :default => :test
|
36
|
-
|
37
|
-
require 'rdoc/task'
|
38
|
-
Rake::RDocTask.new do |rdoc|
|
39
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
40
|
-
|
41
|
-
rdoc.rdoc_dir = 'rdoc'
|
42
|
-
rdoc.title = "statemanager #{version}"
|
43
|
-
rdoc.rdoc_files.include('README*')
|
44
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
45
|
-
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.11
|
@@ -13,26 +13,13 @@ module StateManager
|
|
13
13
|
module ResourceMethods
|
14
14
|
|
15
15
|
def self.included(base)
|
16
|
-
base.after_initialize do
|
17
|
-
self.state_managers ||= {}
|
18
|
-
end
|
19
|
-
base.before_validation do
|
20
|
-
validate_states!
|
21
|
-
end
|
22
|
-
base.before_save do
|
23
|
-
state_managers.values.map(&:before_save)
|
24
|
-
end
|
25
|
-
base.after_save do
|
26
|
-
state_managers.values.map(&:after_save)
|
27
|
-
end
|
28
|
-
|
29
16
|
base.extend(ClassMethods)
|
30
17
|
end
|
31
18
|
|
32
19
|
def _validate_states
|
33
20
|
self.validate_states!
|
34
21
|
end
|
35
|
-
|
22
|
+
|
36
23
|
module ClassMethods
|
37
24
|
def state_manager_added(property, klass, options)
|
38
25
|
class_eval do
|
@@ -47,6 +34,24 @@ module StateManager
|
|
47
34
|
where(query, state, like_term)
|
48
35
|
}
|
49
36
|
end
|
37
|
+
|
38
|
+
after_initialize do
|
39
|
+
self.state_managers ||= {}
|
40
|
+
end
|
41
|
+
before_validation do
|
42
|
+
validate_states!
|
43
|
+
end
|
44
|
+
before_save do
|
45
|
+
state_managers.values.map(&:before_save)
|
46
|
+
end
|
47
|
+
|
48
|
+
save_callback = options[:save_callback] && options[:save_callback].to_sym
|
49
|
+
if save_callback == :after_commit
|
50
|
+
after_commit(:on => :create) { state_managers.values.map(&:after_save) }
|
51
|
+
after_commit(:on => :update) { state_managers.values.map(&:after_save) }
|
52
|
+
else # defaults to after_save
|
53
|
+
after_save { state_managers.values.map(&:after_save) }
|
54
|
+
end
|
50
55
|
end
|
51
56
|
end
|
52
57
|
end
|
@@ -100,4 +105,4 @@ module StateManager
|
|
100
105
|
end
|
101
106
|
end
|
102
107
|
end
|
103
|
-
end
|
108
|
+
end
|
data/lib/state_manager/dsl.rb
CHANGED
@@ -9,14 +9,14 @@ module StateManager
|
|
9
9
|
# If no base class is specified we look for a class inside the current
|
10
10
|
# state's class which has the same name as the state
|
11
11
|
const_name = name.to_s.classify
|
12
|
-
klass ||= if const_defined?(const_name)
|
12
|
+
klass ||= if const_defined?(const_name, false)
|
13
13
|
self.const_get(const_name)
|
14
14
|
else
|
15
15
|
Class.new(StateManager::State)
|
16
16
|
end
|
17
17
|
klass = Class.new(klass, &block) if block_given?
|
18
18
|
|
19
|
-
remove_const const_name if const_defined?(const_name)
|
19
|
+
remove_const const_name if const_defined?(const_name, false)
|
20
20
|
const_set(const_name, klass)
|
21
21
|
|
22
22
|
specification.states[name.to_sym] = klass
|
@@ -23,7 +23,13 @@ if defined?(Delayed)
|
|
23
23
|
|
24
24
|
def entered
|
25
25
|
delayed_events.each do |name, event|
|
26
|
-
delay = event[:delay]
|
26
|
+
delay = if event[:delay].is_a? Proc
|
27
|
+
instance_exec(&event[:delay])
|
28
|
+
elsif event[:delay].is_a? Symbol
|
29
|
+
send event[:delay]
|
30
|
+
else
|
31
|
+
event[:delay]
|
32
|
+
end
|
27
33
|
delayed_event = DelayedEvent.new(path, event, state_manager)
|
28
34
|
Delayed::Job.enqueue delayed_event, :run_at => delay.from_now
|
29
35
|
end
|
@@ -45,7 +45,7 @@ module StateManager
|
|
45
45
|
# Define the subclass as a constant. We do this for multiple reasons, one
|
46
46
|
# of which is to allow it to be serialized to YAML for delayed_job
|
47
47
|
const_name = "#{property.to_s.camelize}States"
|
48
|
-
remove_const const_name if const_defined?(const_name)
|
48
|
+
remove_const const_name if const_defined?(const_name, false)
|
49
49
|
const_set(const_name, klass)
|
50
50
|
|
51
51
|
# Create an accessor for the state manager on this resource
|
data/state_manager.gemspec
CHANGED
@@ -1,103 +1,24 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'state_manager/version'
|
5
5
|
|
6
|
-
Gem::Specification.new do |
|
7
|
-
|
8
|
-
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "state_manager"
|
8
|
+
spec.version = StateManager::VERSION
|
9
|
+
spec.authors = ["Gordon L. Hempton"]
|
10
|
+
spec.email = ["ghempton@gmail.com"]
|
11
|
+
spec.summary = "%Q{Finite state machine implementation.}"
|
12
|
+
spec.description = "Finite state machine implementation that keeps logic separate from model classes and supports sub-states."
|
13
|
+
spec.homepage = "https://github.com/ghempton/state_manager"
|
14
|
+
spec.license = "MIT"
|
9
15
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
s.email = "ghempton@gmail.com"
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE.txt",
|
17
|
-
"README.md"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
"Gemfile",
|
22
|
-
"Gemfile.lock",
|
23
|
-
"LICENSE.txt",
|
24
|
-
"README.md",
|
25
|
-
"Rakefile",
|
26
|
-
"VERSION",
|
27
|
-
"lib/state_manager.rb",
|
28
|
-
"lib/state_manager/adapters.rb",
|
29
|
-
"lib/state_manager/adapters/active_record.rb",
|
30
|
-
"lib/state_manager/adapters/base.rb",
|
31
|
-
"lib/state_manager/base.rb",
|
32
|
-
"lib/state_manager/core.rb",
|
33
|
-
"lib/state_manager/dsl.rb",
|
34
|
-
"lib/state_manager/helpers.rb",
|
35
|
-
"lib/state_manager/plugins.rb",
|
36
|
-
"lib/state_manager/plugins/delayed_job.rb",
|
37
|
-
"lib/state_manager/resource.rb",
|
38
|
-
"lib/state_manager/serialization.rb",
|
39
|
-
"lib/state_manager/state.rb",
|
40
|
-
"state_manager.gemspec",
|
41
|
-
"test/adapters/active_record_test.rb",
|
42
|
-
"test/basic_test.rb",
|
43
|
-
"test/definition_test.rb",
|
44
|
-
"test/helper.rb",
|
45
|
-
"test/helpers_test.rb",
|
46
|
-
"test/plugins/delayed_job_test.rb",
|
47
|
-
"test/transitions_test.rb"
|
48
|
-
]
|
49
|
-
s.homepage = "http://github.com/ghempton/state_manager"
|
50
|
-
s.licenses = ["MIT"]
|
51
|
-
s.require_paths = ["lib"]
|
52
|
-
s.rubygems_version = "1.8.23"
|
53
|
-
s.summary = "%Q{Finite state machine implementation.}"
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
54
20
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
59
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
60
|
-
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
61
|
-
s.add_development_dependency(%q<pry>, [">= 0"])
|
62
|
-
s.add_development_dependency(%q<pry-doc>, [">= 0"])
|
63
|
-
s.add_development_dependency(%q<pry-remote>, [">= 0"])
|
64
|
-
s.add_development_dependency(%q<pry-nav>, [">= 0"])
|
65
|
-
s.add_development_dependency(%q<pry-stack_explorer>, [">= 0"])
|
66
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
67
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
|
68
|
-
s.add_development_dependency(%q<delayed_job_active_record>, [">= 0"])
|
69
|
-
s.add_development_dependency(%q<activerecord>, [">= 0"])
|
70
|
-
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
71
|
-
s.add_development_dependency(%q<timecop>, [">= 0"])
|
72
|
-
else
|
73
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
74
|
-
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
75
|
-
s.add_dependency(%q<pry>, [">= 0"])
|
76
|
-
s.add_dependency(%q<pry-doc>, [">= 0"])
|
77
|
-
s.add_dependency(%q<pry-remote>, [">= 0"])
|
78
|
-
s.add_dependency(%q<pry-nav>, [">= 0"])
|
79
|
-
s.add_dependency(%q<pry-stack_explorer>, [">= 0"])
|
80
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
81
|
-
s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
|
82
|
-
s.add_dependency(%q<delayed_job_active_record>, [">= 0"])
|
83
|
-
s.add_dependency(%q<activerecord>, [">= 0"])
|
84
|
-
s.add_dependency(%q<sqlite3>, [">= 0"])
|
85
|
-
s.add_dependency(%q<timecop>, [">= 0"])
|
86
|
-
end
|
87
|
-
else
|
88
|
-
s.add_dependency(%q<activesupport>, [">= 0"])
|
89
|
-
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
90
|
-
s.add_dependency(%q<pry>, [">= 0"])
|
91
|
-
s.add_dependency(%q<pry-doc>, [">= 0"])
|
92
|
-
s.add_dependency(%q<pry-remote>, [">= 0"])
|
93
|
-
s.add_dependency(%q<pry-nav>, [">= 0"])
|
94
|
-
s.add_dependency(%q<pry-stack_explorer>, [">= 0"])
|
95
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
96
|
-
s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
|
97
|
-
s.add_dependency(%q<delayed_job_active_record>, [">= 0"])
|
98
|
-
s.add_dependency(%q<activerecord>, [">= 0"])
|
99
|
-
s.add_dependency(%q<sqlite3>, [">= 0"])
|
100
|
-
s.add_dependency(%q<timecop>, [">= 0"])
|
101
|
-
end
|
21
|
+
spec.add_runtime_dependency 'activesupport'
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
23
|
+
spec.add_development_dependency "rake"
|
102
24
|
end
|
103
|
-
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
class ActiveRecordTest < Test
|
3
|
+
class ActiveRecordTest < Minitest::Test
|
4
4
|
|
5
5
|
class PostStates < StateManager::Base
|
6
6
|
attr_accessor :before_callbacks_called
|
@@ -37,6 +37,12 @@ class ActiveRecordTest < Test::Unit::TestCase
|
|
37
37
|
extend StateManager::Resource
|
38
38
|
state_manager
|
39
39
|
end
|
40
|
+
|
41
|
+
class Post2 < ActiveRecord::Base
|
42
|
+
self.table_name = 'posts'
|
43
|
+
extend StateManager::Resource
|
44
|
+
state_manager(:state, PostStates, :save_callback => :after_commit)
|
45
|
+
end
|
40
46
|
|
41
47
|
def exec(sql)
|
42
48
|
ActiveRecord::Base.connection.execute sql
|
@@ -50,7 +56,6 @@ class ActiveRecordTest < Test::Unit::TestCase
|
|
50
56
|
|
51
57
|
ActiveRecord::Schema.define do
|
52
58
|
create_table :posts do |t|
|
53
|
-
t.integer :id
|
54
59
|
t.string :title
|
55
60
|
t.string :body
|
56
61
|
t.string :state
|
@@ -63,9 +68,11 @@ class ActiveRecordTest < Test::Unit::TestCase
|
|
63
68
|
exec "INSERT INTO posts VALUES(4, NULL, NULL, 'submitted.bad_state')"
|
64
69
|
|
65
70
|
@resource = nil
|
71
|
+
DatabaseCleaner.start
|
66
72
|
end
|
67
73
|
|
68
74
|
def teardown
|
75
|
+
DatabaseCleaner.clean
|
69
76
|
ActiveRecord::Base.connection.disconnect!
|
70
77
|
end
|
71
78
|
|
@@ -81,9 +88,11 @@ class ActiveRecordTest < Test::Unit::TestCase
|
|
81
88
|
assert !@resource.state_manager.before_callbacks_called
|
82
89
|
assert !@resource.state_manager.after_callbacks_called
|
83
90
|
assert @resource.changed?, "state should not have been persisted"
|
84
|
-
@resource.
|
85
|
-
|
86
|
-
|
91
|
+
@resource.transaction do
|
92
|
+
@resource.save
|
93
|
+
assert @resource.state_manager.before_callbacks_called
|
94
|
+
assert @resource.state_manager.after_callbacks_called
|
95
|
+
end
|
87
96
|
end
|
88
97
|
|
89
98
|
def test_initial_state_value
|
@@ -148,8 +157,32 @@ class ActiveRecordTest < Test::Unit::TestCase
|
|
148
157
|
@resource = Post.find(2)
|
149
158
|
@resource.state_manager.send_event :submit
|
150
159
|
assert_state 'submitted.awaiting_review'
|
151
|
-
|
160
|
+
assert_raises(StateManager::Adapters::ActiveRecord::DirtyTransition) do
|
152
161
|
@resource.state_manager.send_event :review
|
153
162
|
end
|
154
163
|
end
|
155
|
-
|
164
|
+
|
165
|
+
def test_after_commit_callback
|
166
|
+
@resource = Post2.find(1)
|
167
|
+
assert_state 'unsubmitted'
|
168
|
+
assert !@resource.state_manager.before_callbacks_called
|
169
|
+
assert !@resource.state_manager.after_callbacks_called
|
170
|
+
assert @resource.changed?, "state should not have been persisted"
|
171
|
+
@resource.transaction do
|
172
|
+
@resource.save!
|
173
|
+
assert @resource.state_manager.before_callbacks_called
|
174
|
+
assert !@resource.state_manager.after_callbacks_called
|
175
|
+
end
|
176
|
+
assert @resource.state_manager.after_callbacks_called
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_after_commit_callback_on_create
|
180
|
+
Post2.transaction do
|
181
|
+
@resource = Post2.new
|
182
|
+
assert !@resource.state_manager.after_callbacks_called
|
183
|
+
@resource.save
|
184
|
+
assert !@resource.state_manager.after_callbacks_called
|
185
|
+
end
|
186
|
+
assert @resource.state_manager.after_callbacks_called
|
187
|
+
end
|
188
|
+
end
|
data/test/basic_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
class BasicTest < Test
|
3
|
+
class BasicTest < Minitest::Test
|
4
4
|
|
5
5
|
class PostStates < StateManager::Base
|
6
6
|
state :unsubmitted do
|
@@ -87,7 +87,7 @@ class BasicTest < Test::Unit::TestCase
|
|
87
87
|
|
88
88
|
assert_state 'rejected', 'state should have transitioned'
|
89
89
|
|
90
|
-
|
90
|
+
assert_raises StateManager::StateNotFound do
|
91
91
|
@resource.state_manager.transition_to 'reviewing'
|
92
92
|
end
|
93
93
|
end
|
@@ -98,7 +98,7 @@ class BasicTest < Test::Unit::TestCase
|
|
98
98
|
assert_equal @resource.state_manager.current_state.path, 'submitted.awaiting_review', 'state should have transitioned'
|
99
99
|
assert_equal @resource.state, 'submitted.awaiting_review', 'state should have been written'
|
100
100
|
|
101
|
-
|
101
|
+
assert_raises StateManager::InvalidEvent do
|
102
102
|
@resource.state_manager.send_event! :submit
|
103
103
|
end
|
104
104
|
assert_equal @resource.state, 'submitted.awaiting_review', 'state should not have changed'
|
@@ -115,7 +115,7 @@ class BasicTest < Test::Unit::TestCase
|
|
115
115
|
assert_equal @resource.workflow_state_manager.current_state.path, 'submitted.awaiting_review', 'state should have transitioned'
|
116
116
|
assert_equal @resource.workflow_state, 'submitted.awaiting_review', 'state should have been written'
|
117
117
|
|
118
|
-
|
118
|
+
assert_raises StateManager::InvalidEvent do
|
119
119
|
@resource.workflow_state_manager.send_event! :submit
|
120
120
|
end
|
121
121
|
assert_equal @resource.workflow_state, 'submitted.awaiting_review', 'state should not have changed'
|
@@ -124,7 +124,7 @@ class BasicTest < Test::Unit::TestCase
|
|
124
124
|
end
|
125
125
|
|
126
126
|
def test_can_only_transition_to_leaf
|
127
|
-
|
127
|
+
assert_raises StateManager::InvalidTransition do
|
128
128
|
@resource.state_manager.transition_to('submitted')
|
129
129
|
end
|
130
130
|
end
|
data/test/definition_test.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -7,16 +7,23 @@ rescue Bundler::BundlerError => e
|
|
7
7
|
$stderr.puts "Run `bundle install` to install missing gems"
|
8
8
|
exit e.status_code
|
9
9
|
end
|
10
|
-
require '
|
10
|
+
require 'minitest/autorun'
|
11
11
|
|
12
12
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
13
13
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
14
|
-
require 'pry'
|
15
14
|
require 'delayed_job_active_record'
|
16
15
|
require 'state_manager'
|
17
16
|
require 'timecop'
|
17
|
+
require 'database_cleaner'
|
18
|
+
require 'byebug'
|
18
19
|
|
19
|
-
|
20
|
+
DatabaseCleaner.strategy = :truncation
|
21
|
+
|
22
|
+
class Minitest::Test
|
23
|
+
|
24
|
+
def teardown
|
25
|
+
Timecop.return
|
26
|
+
end
|
20
27
|
|
21
28
|
def assert_state(path, state_manager=nil, message=nil)
|
22
29
|
if state_manager.is_a? String
|
@@ -27,11 +34,6 @@ class Test::Unit::TestCase
|
|
27
34
|
assert_equal path, state_manager.current_state.path
|
28
35
|
end
|
29
36
|
|
30
|
-
def teardown
|
31
|
-
ActiveRecord::Base.connection.disconnect!
|
32
|
-
Timecop.return
|
33
|
-
end
|
34
|
-
|
35
37
|
# Convince delayed job that the duration has passed and perform any jobs that
|
36
38
|
# need doing
|
37
39
|
def time_warp(duration)
|
@@ -44,4 +46,4 @@ class Test::Unit::TestCase
|
|
44
46
|
raise "Delayed job error: #{error}" if error
|
45
47
|
end
|
46
48
|
|
47
|
-
end
|
49
|
+
end
|
data/test/helpers_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'helper'
|
2
2
|
require 'timecop'
|
3
3
|
|
4
|
-
class DelayedJobTest < Test
|
4
|
+
class DelayedJobTest < Minitest::Test
|
5
5
|
|
6
6
|
class ProjectStates < StateManager::Base
|
7
7
|
initial_state 'unsubmitted.initial'
|
@@ -14,13 +14,19 @@ class DelayedJobTest < Test::Unit::TestCase
|
|
14
14
|
end
|
15
15
|
state :submitted do
|
16
16
|
event :accept, :transitions_to => 'accepted'
|
17
|
-
event :auto_accept, :transitions_to => 'accepted', :delay =>
|
17
|
+
event :auto_accept, :transitions_to => 'accepted', :delay => :delay
|
18
18
|
event :reject, :transitions_to => 'rejected'
|
19
19
|
end
|
20
20
|
state :accepted do
|
21
21
|
event :remind, :transitions_to => 'rejected'
|
22
22
|
end
|
23
23
|
state :rejected
|
24
|
+
|
25
|
+
class Submitted
|
26
|
+
def delay
|
27
|
+
1.day
|
28
|
+
end
|
29
|
+
end
|
24
30
|
end
|
25
31
|
|
26
32
|
def exec(sql)
|
@@ -35,7 +41,6 @@ class DelayedJobTest < Test::Unit::TestCase
|
|
35
41
|
|
36
42
|
ActiveRecord::Schema.define do
|
37
43
|
create_table :projects do |t|
|
38
|
-
t.integer :id
|
39
44
|
t.string :title
|
40
45
|
t.string :state
|
41
46
|
end
|
@@ -125,4 +130,4 @@ class DelayedJobTest < Test::Unit::TestCase
|
|
125
130
|
assert_state 'unsubmitted.reminded'
|
126
131
|
end
|
127
132
|
|
128
|
-
end
|
133
|
+
end
|
data/test/transitions_test.rb
CHANGED
metadata
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: state_manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
- Gordon Hempton
|
8
|
+
- Gordon L. Hempton
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-06-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
@@ -24,103 +24,7 @@ dependencies:
|
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: rdoc
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '3.12'
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '3.12'
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: pry
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: pry-doc
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ! '>='
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
70
|
-
type: :development
|
71
|
-
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ! '>='
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: pry-remote
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ! '>='
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '0'
|
86
|
-
type: :development
|
87
|
-
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ! '>='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: '0'
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: pry-nav
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ! '>='
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '0'
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ! '>='
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: pry-stack_explorer
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ! '>='
|
27
|
+
- - ">="
|
124
28
|
- !ruby/object:Gem::Version
|
125
29
|
version: '0'
|
126
30
|
- !ruby/object:Gem::Dependency
|
@@ -128,39 +32,23 @@ dependencies:
|
|
128
32
|
requirement: !ruby/object:Gem::Requirement
|
129
33
|
none: false
|
130
34
|
requirements:
|
131
|
-
- - ~>
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: 1.0.0
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ~>
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: 1.0.0
|
142
|
-
- !ruby/object:Gem::Dependency
|
143
|
-
name: jeweler
|
144
|
-
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
|
-
requirements:
|
147
|
-
- - ~>
|
35
|
+
- - "~>"
|
148
36
|
- !ruby/object:Gem::Version
|
149
|
-
version: 1.
|
37
|
+
version: '1.5'
|
150
38
|
type: :development
|
151
39
|
prerelease: false
|
152
40
|
version_requirements: !ruby/object:Gem::Requirement
|
153
41
|
none: false
|
154
42
|
requirements:
|
155
|
-
- - ~>
|
43
|
+
- - "~>"
|
156
44
|
- !ruby/object:Gem::Version
|
157
|
-
version: 1.
|
45
|
+
version: '1.5'
|
158
46
|
- !ruby/object:Gem::Dependency
|
159
|
-
name:
|
47
|
+
name: rake
|
160
48
|
requirement: !ruby/object:Gem::Requirement
|
161
49
|
none: false
|
162
50
|
requirements:
|
163
|
-
- -
|
51
|
+
- - ">="
|
164
52
|
- !ruby/object:Gem::Version
|
165
53
|
version: '0'
|
166
54
|
type: :development
|
@@ -168,67 +56,20 @@ dependencies:
|
|
168
56
|
version_requirements: !ruby/object:Gem::Requirement
|
169
57
|
none: false
|
170
58
|
requirements:
|
171
|
-
- -
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '0'
|
174
|
-
- !ruby/object:Gem::Dependency
|
175
|
-
name: activerecord
|
176
|
-
requirement: !ruby/object:Gem::Requirement
|
177
|
-
none: false
|
178
|
-
requirements:
|
179
|
-
- - ! '>='
|
180
|
-
- !ruby/object:Gem::Version
|
181
|
-
version: '0'
|
182
|
-
type: :development
|
183
|
-
prerelease: false
|
184
|
-
version_requirements: !ruby/object:Gem::Requirement
|
185
|
-
none: false
|
186
|
-
requirements:
|
187
|
-
- - ! '>='
|
188
|
-
- !ruby/object:Gem::Version
|
189
|
-
version: '0'
|
190
|
-
- !ruby/object:Gem::Dependency
|
191
|
-
name: sqlite3
|
192
|
-
requirement: !ruby/object:Gem::Requirement
|
193
|
-
none: false
|
194
|
-
requirements:
|
195
|
-
- - ! '>='
|
196
|
-
- !ruby/object:Gem::Version
|
197
|
-
version: '0'
|
198
|
-
type: :development
|
199
|
-
prerelease: false
|
200
|
-
version_requirements: !ruby/object:Gem::Requirement
|
201
|
-
none: false
|
202
|
-
requirements:
|
203
|
-
- - ! '>='
|
204
|
-
- !ruby/object:Gem::Version
|
205
|
-
version: '0'
|
206
|
-
- !ruby/object:Gem::Dependency
|
207
|
-
name: timecop
|
208
|
-
requirement: !ruby/object:Gem::Requirement
|
209
|
-
none: false
|
210
|
-
requirements:
|
211
|
-
- - ! '>='
|
212
|
-
- !ruby/object:Gem::Version
|
213
|
-
version: '0'
|
214
|
-
type: :development
|
215
|
-
prerelease: false
|
216
|
-
version_requirements: !ruby/object:Gem::Requirement
|
217
|
-
none: false
|
218
|
-
requirements:
|
219
|
-
- - ! '>='
|
59
|
+
- - ">="
|
220
60
|
- !ruby/object:Gem::Version
|
221
61
|
version: '0'
|
222
62
|
description: Finite state machine implementation that keeps logic separate from model
|
223
63
|
classes and supports sub-states.
|
224
|
-
email:
|
64
|
+
email:
|
65
|
+
- ghempton@gmail.com
|
225
66
|
executables: []
|
226
67
|
extensions: []
|
227
|
-
extra_rdoc_files:
|
228
|
-
- LICENSE.txt
|
229
|
-
- README.md
|
68
|
+
extra_rdoc_files: []
|
230
69
|
files:
|
231
|
-
- .document
|
70
|
+
- ".document"
|
71
|
+
- ".gitignore"
|
72
|
+
- ".travis.yml"
|
232
73
|
- Gemfile
|
233
74
|
- Gemfile.lock
|
234
75
|
- LICENSE.txt
|
@@ -256,7 +97,7 @@ files:
|
|
256
97
|
- test/helpers_test.rb
|
257
98
|
- test/plugins/delayed_job_test.rb
|
258
99
|
- test/transitions_test.rb
|
259
|
-
homepage:
|
100
|
+
homepage: https://github.com/ghempton/state_manager
|
260
101
|
licenses:
|
261
102
|
- MIT
|
262
103
|
post_install_message:
|
@@ -266,22 +107,26 @@ require_paths:
|
|
266
107
|
required_ruby_version: !ruby/object:Gem::Requirement
|
267
108
|
none: false
|
268
109
|
requirements:
|
269
|
-
- -
|
110
|
+
- - ">="
|
270
111
|
- !ruby/object:Gem::Version
|
271
112
|
version: '0'
|
272
|
-
segments:
|
273
|
-
- 0
|
274
|
-
hash: -1972430724111836425
|
275
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
276
114
|
none: false
|
277
115
|
requirements:
|
278
|
-
- -
|
116
|
+
- - ">="
|
279
117
|
- !ruby/object:Gem::Version
|
280
118
|
version: '0'
|
281
119
|
requirements: []
|
282
120
|
rubyforge_project:
|
283
|
-
rubygems_version: 1.8.
|
121
|
+
rubygems_version: 1.8.25
|
284
122
|
signing_key:
|
285
123
|
specification_version: 3
|
286
|
-
summary:
|
287
|
-
test_files:
|
124
|
+
summary: "%Q{Finite state machine implementation.}"
|
125
|
+
test_files:
|
126
|
+
- test/adapters/active_record_test.rb
|
127
|
+
- test/basic_test.rb
|
128
|
+
- test/definition_test.rb
|
129
|
+
- test/helper.rb
|
130
|
+
- test/helpers_test.rb
|
131
|
+
- test/plugins/delayed_job_test.rb
|
132
|
+
- test/transitions_test.rb
|