dm-is-persistent_state_machine 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dm-is-persistent_state_machine}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["michael"]
|
12
|
-
s.date = %q{2010-02-
|
12
|
+
s.date = %q{2010-02-04}
|
13
13
|
s.description = %q{A persistent State Machine for DataMapper}
|
14
14
|
s.email = %q{ma@zive.at}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -57,22 +57,6 @@ class StateEvent
|
|
57
57
|
property :type, Discriminator
|
58
58
|
end
|
59
59
|
|
60
|
-
class StateChange
|
61
|
-
include DataMapper::Resource
|
62
|
-
|
63
|
-
property :id, Serial
|
64
|
-
|
65
|
-
property :from_id, Integer, :required => true, :min => 1
|
66
|
-
property :to_id, Integer, :required => true, :min => 1
|
67
|
-
property :user_id, Integer
|
68
|
-
property :created_at, DateTime
|
69
|
-
|
70
|
-
# associations
|
71
|
-
belongs_to :user
|
72
|
-
belongs_to :from, "State"
|
73
|
-
belongs_to :to, "State"
|
74
|
-
end
|
75
|
-
|
76
60
|
module DataMapper
|
77
61
|
module Is
|
78
62
|
module PersistentStateMachine
|
@@ -83,7 +67,7 @@ module DataMapper
|
|
83
67
|
# fired when plugin gets included into Resource
|
84
68
|
#
|
85
69
|
def self.included(base)
|
86
|
-
|
70
|
+
|
87
71
|
end
|
88
72
|
|
89
73
|
##
|
@@ -102,18 +86,44 @@ module DataMapper
|
|
102
86
|
# Add instance-methods
|
103
87
|
include DataMapper::Is::PersistentStateMachine::InstanceMethods
|
104
88
|
|
89
|
+
target_model_name = self.name.snake_case
|
90
|
+
|
105
91
|
# target object must have a status associated
|
106
92
|
property :state_id, Integer, :required => true, :min => 1
|
107
93
|
belongs_to :state
|
108
94
|
|
95
|
+
has n, Extlib::Inflection.pluralize(target_model_name+"StateChange").to_sym
|
96
|
+
|
109
97
|
# generate a FooState class that is derived from State
|
110
98
|
state_model = Object.full_const_set(self.to_s+"State", Class.new(State))
|
111
99
|
# generate a FooStateEvent class that is derived from StateEvent
|
112
100
|
event_model = Object.full_const_set(self.to_s+"StateEvent", Class.new(StateEvent))
|
101
|
+
|
102
|
+
state_change_model = Class.new do
|
103
|
+
include DataMapper::Resource
|
104
|
+
|
105
|
+
property :id, ::DataMapper::Types::Serial
|
106
|
+
|
107
|
+
property :from_id, Integer, :required => true, :min => 1
|
108
|
+
property :to_id, Integer, :required => true, :min => 1
|
109
|
+
property :user_id, Integer
|
110
|
+
property Extlib::Inflection.foreign_key(target_model_name).to_sym, Integer, :required => true, :min => 1
|
111
|
+
property :created_at, DateTime
|
112
|
+
|
113
|
+
# associations
|
114
|
+
belongs_to :user
|
115
|
+
belongs_to :from, "State"
|
116
|
+
belongs_to :to, "State"
|
117
|
+
belongs_to target_model_name.to_sym
|
118
|
+
end
|
119
|
+
|
120
|
+
state_change_model = Object.full_const_set(self.to_s+"StateChange",state_change_model)
|
121
|
+
|
122
|
+
self_cached = self
|
113
123
|
|
114
124
|
after :save do
|
115
125
|
if (@prev_state && @prev_state != state)
|
116
|
-
@state_change =
|
126
|
+
@state_change = state_change_model.create(:from => @prev_state, :to => state, :created_at => DateTime.now, :user => @user, Extlib::Inflection.foreign_key(target_model_name).to_sym => self.id)
|
117
127
|
@prev_state = nil # clean up cache
|
118
128
|
@user = nil
|
119
129
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe DataMapper::Is::PersistentStateMachine do
|
4
|
-
|
5
4
|
before(:all) do
|
6
5
|
DataMapper.auto_migrate!
|
7
6
|
|
@@ -25,7 +24,7 @@ describe DataMapper::Is::PersistentStateMachine do
|
|
25
24
|
describe "at least" do
|
26
25
|
before :each do
|
27
26
|
Project.auto_migrate!
|
28
|
-
|
27
|
+
ProjectStateChange.auto_migrate!
|
29
28
|
end
|
30
29
|
|
31
30
|
it "should log state changes" do
|
@@ -33,12 +32,13 @@ describe DataMapper::Is::PersistentStateMachine do
|
|
33
32
|
@project.state.code.should == "open"
|
34
33
|
@project.trigger_event!('review', User.first)
|
35
34
|
Project.first(:name => "Operation X").state.code.should == "open" # not persistent yet
|
36
|
-
|
37
|
-
|
35
|
+
|
36
|
+
ProjectStateChange.count.should == 0
|
38
37
|
@project.state.code.should == "reviewed"
|
39
38
|
@project.save
|
40
|
-
|
41
|
-
|
39
|
+
ProjectStateChange.count.should == 1
|
40
|
+
ProjectStateChange.first.user.name.should == "John Doe"
|
41
|
+
ProjectStateChange.first.project.should == @project
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-is-persistent_state_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- michael
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-04 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|