dm-is-persistent_state_machine 0.1.3 → 0.1.4
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/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
|