transitions 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/LICENSE +1 -1
- data/README.rdoc +43 -1
- data/lib/active_record/transitions.rb +5 -2
- data/lib/transitions.rb +1 -1
- data/lib/transitions/event.rb +48 -2
- data/lib/transitions/machine.rb +7 -0
- data/lib/transitions/version.rb +1 -1
- data/test/db/create_db.rb +19 -0
- data/test/helper.rb +7 -0
- data/test/test_active_record.rb +3 -12
- data/test/test_active_record_timestamps.rb +118 -0
- data/test/test_scopes.rb +64 -0
- data/transitions.gemspec +2 -2
- metadata +58 -64
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -30,6 +30,29 @@ I really encourage you to try {state_machine}[https://github.com/pluginaweek/sta
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
== Automatic scope generation
|
34
|
+
|
35
|
+
`transitions` will automatically generate scopes for you if you are using AR:
|
36
|
+
|
37
|
+
Given a model like this:
|
38
|
+
|
39
|
+
class Order < ActiveRecord::Base
|
40
|
+
include ActiveRecord::Transitions
|
41
|
+
state_machine do
|
42
|
+
state :pick_line_items
|
43
|
+
state :picking_line_items
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
you can use this feature a la:
|
48
|
+
|
49
|
+
>> Order.pick_line_items
|
50
|
+
=> []
|
51
|
+
>> Order.create!
|
52
|
+
=> #<Order id: 3, state: "pick_line_items", description: nil, created_at: "2011-08-23 15:48:46", updated_at: "2011-08-23 15:48:46">
|
53
|
+
>> Order.pick_line_items
|
54
|
+
=> [#<Order id: 3, state: "pick_line_items", description: nil, created_at: "2011-08-23 15:48:46", updated_at: "2011-08-23 15:48:46">]
|
55
|
+
|
33
56
|
== Using on_transition
|
34
57
|
|
35
58
|
Each event definition takes an optional "on_transition" argument, which allows you to execute methods on transition.
|
@@ -39,6 +62,25 @@ You can pass in a Symbol, a String, a Proc or an Array containing method names a
|
|
39
62
|
transitions :to => :discontinued, :from => [:available, :out_of_stock], :on_transition => [:do_discontinue, :notify_clerk]
|
40
63
|
end
|
41
64
|
|
65
|
+
== Timestamps
|
66
|
+
|
67
|
+
If you'd like to note the time of a state change, Transitions comes with timestamps free!
|
68
|
+
To activate them, simply pass the :timestamp option to the event definition with a value of either true or
|
69
|
+
the name of the timestamp column.
|
70
|
+
*NOTE - This should be either true, a String or a Symbol*
|
71
|
+
|
72
|
+
# This will look for an attribute called exploded_at or exploded_on (in that order)
|
73
|
+
# If present, it will be updated
|
74
|
+
event :explode, :timestamp => true do
|
75
|
+
transitions :from => :complete, :to => :exploded
|
76
|
+
end
|
77
|
+
|
78
|
+
# This will look for an attribute named repaired_on to update upon save
|
79
|
+
event :rebuild, :timestamp => :repaired_on do
|
80
|
+
transiions :from => :exploded, :to => :rebuilt
|
81
|
+
end
|
82
|
+
|
83
|
+
|
42
84
|
== Using with Rails
|
43
85
|
|
44
86
|
This goes into your Gemfile:
|
@@ -86,4 +128,4 @@ bang(!)-version will call <tt>write_state</tt>.
|
|
86
128
|
|
87
129
|
== Copyright
|
88
130
|
|
89
|
-
Copyright (c) 2010 Jakub Kuźma. See LICENSE for details.
|
131
|
+
Copyright (c) 2010 Jakub Kuźma, Timo Rößner. See LICENSE for details.
|
@@ -30,8 +30,11 @@ module ActiveRecord
|
|
30
30
|
validates_presence_of :state
|
31
31
|
validate :state_inclusion
|
32
32
|
end
|
33
|
-
|
34
|
-
|
33
|
+
|
34
|
+
# The optional options argument is passed to find when reloading so you may
|
35
|
+
# do e.g. record.reload(:lock => true) to reload the same record with an
|
36
|
+
# exclusive row lock.
|
37
|
+
def reload(options = nil)
|
35
38
|
super.tap do
|
36
39
|
self.class.state_machines.values.each do |sm|
|
37
40
|
remove_instance_variable(sm.current_state_variable) if instance_variable_defined?(sm.current_state_variable)
|
data/lib/transitions.rb
CHANGED
@@ -58,7 +58,7 @@ module Transitions
|
|
58
58
|
def define_state_query_method(state_name)
|
59
59
|
name = "#{state_name}?"
|
60
60
|
undef_method(name) if method_defined?(name)
|
61
|
-
|
61
|
+
define_method(name) { current_state.to_s == %(#{state_name}) }
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
data/lib/transitions/event.rb
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
module Transitions
|
24
24
|
class Event
|
25
|
-
attr_reader :name, :success
|
25
|
+
attr_reader :name, :success, :timestamp
|
26
26
|
|
27
27
|
def initialize(machine, name, options = {}, &block)
|
28
28
|
@machine, @name, @transitions = machine, name, []
|
@@ -51,6 +51,8 @@ module Transitions
|
|
51
51
|
break
|
52
52
|
end
|
53
53
|
end
|
54
|
+
# Update timestamps on obj if a timestamp has been defined
|
55
|
+
update_event_timestamp(obj, next_state) if timestamp_defined?
|
54
56
|
next_state
|
55
57
|
end
|
56
58
|
|
@@ -65,14 +67,58 @@ module Transitions
|
|
65
67
|
name == event.name
|
66
68
|
end
|
67
69
|
end
|
70
|
+
|
71
|
+
# Has the timestamp option been specified for this event?
|
72
|
+
def timestamp_defined?
|
73
|
+
!@timestamp.nil?
|
74
|
+
end
|
68
75
|
|
69
76
|
def update(options = {}, &block)
|
70
|
-
@success
|
77
|
+
@success = options[:success] if options.key?(:success)
|
78
|
+
self.timestamp = options[:timestamp] if options[:timestamp]
|
71
79
|
instance_eval(&block) if block
|
72
80
|
self
|
73
81
|
end
|
82
|
+
|
83
|
+
# update the timestamp attribute on obj
|
84
|
+
def update_event_timestamp(obj, next_state)
|
85
|
+
obj.send "#{timestamp_attribute_name(obj, next_state)}=", Time.now
|
86
|
+
end
|
87
|
+
|
88
|
+
# Set the timestamp attribute.
|
89
|
+
# @raise [ArgumentError] timestamp should be either a String, Symbol or true
|
90
|
+
def timestamp=(value)
|
91
|
+
case value
|
92
|
+
when String, Symbol, TrueClass
|
93
|
+
@timestamp = value
|
94
|
+
else
|
95
|
+
raise ArgumentError, "timestamp must be either: true, a String or a Symbol"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
74
99
|
|
75
100
|
private
|
101
|
+
|
102
|
+
# Returns the name of the timestamp attribute for this event
|
103
|
+
# If the timestamp was simply true it returns the default_timestamp_name
|
104
|
+
# otherwise, returns the user-specified timestamp name
|
105
|
+
def timestamp_attribute_name(obj, next_state)
|
106
|
+
timestamp == true ? default_timestamp_name(obj, next_state) : @timestamp
|
107
|
+
end
|
108
|
+
|
109
|
+
# If @timestamp is true, try a default timestamp name
|
110
|
+
def default_timestamp_name(obj, next_state)
|
111
|
+
at_name = "%s_at" % next_state
|
112
|
+
on_name = "%s_on" % next_state
|
113
|
+
case
|
114
|
+
when obj.respond_to?(at_name) then at_name
|
115
|
+
when obj.respond_to?(on_name) then on_name
|
116
|
+
else
|
117
|
+
raise NoMethodError, "Couldn't find a suitable timestamp field for event: #{@name}.
|
118
|
+
Please define #{at_name} or #{on_name} in #{obj.class}"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
76
122
|
|
77
123
|
def transitions(trans_opts)
|
78
124
|
Array(trans_opts[:from]).each do |s|
|
data/lib/transitions/machine.rb
CHANGED
@@ -38,6 +38,7 @@ module Transitions
|
|
38
38
|
def update(options = {}, &block)
|
39
39
|
@initial_state = options[:initial] if options.key?(:initial)
|
40
40
|
instance_eval(&block) if block
|
41
|
+
include_scopes if defined?(ActiveRecord::Base) && @klass < ActiveRecord::Base
|
41
42
|
self
|
42
43
|
end
|
43
44
|
|
@@ -92,6 +93,12 @@ module Transitions
|
|
92
93
|
def event_failed_callback
|
93
94
|
@event_failed_callback ||= (@name == :default ? '' : "#{@name}_") + 'event_failed'
|
94
95
|
end
|
96
|
+
|
97
|
+
def include_scopes
|
98
|
+
@states.each do |state|
|
99
|
+
@klass.scope state.name.to_sym, @klass.where(:state => state.name.to_s)
|
100
|
+
end
|
101
|
+
end
|
95
102
|
end
|
96
103
|
end
|
97
104
|
|
data/lib/transitions/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Use this schema to create all required tables
|
2
|
+
class CreateDb < ActiveRecord::Migration
|
3
|
+
def self.up
|
4
|
+
create_table(:traffic_lights, force: true) do |t|
|
5
|
+
t.string :state
|
6
|
+
t.string :name
|
7
|
+
end
|
8
|
+
|
9
|
+
create_table(:orders, force: true) do |t|
|
10
|
+
t.string :state
|
11
|
+
t.string :order_number
|
12
|
+
t.datetime :paid_at
|
13
|
+
t.datetime :prepared_on
|
14
|
+
t.datetime :dispatched_at
|
15
|
+
t.date :cancellation_date
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/test/helper.rb
CHANGED
@@ -3,6 +3,7 @@ require "test/unit"
|
|
3
3
|
require "active_support/all"
|
4
4
|
require "active_record"
|
5
5
|
require "mocha"
|
6
|
+
require "db/create_db"
|
6
7
|
|
7
8
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
8
9
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
@@ -12,3 +13,9 @@ require "active_record/transitions"
|
|
12
13
|
class Test::Unit::TestCase
|
13
14
|
|
14
15
|
end
|
16
|
+
|
17
|
+
def create_database
|
18
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
19
|
+
ActiveRecord::Migration.verbose = false
|
20
|
+
CreateDb.migrate(:up)
|
21
|
+
end
|
data/test/test_active_record.rb
CHANGED
@@ -1,14 +1,7 @@
|
|
1
1
|
require "helper"
|
2
2
|
require 'active_support/core_ext/module/aliasing'
|
3
3
|
|
4
|
-
|
5
|
-
def self.up
|
6
|
-
create_table(:traffic_lights) do |t|
|
7
|
-
t.string :state
|
8
|
-
t.string :name
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
4
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
12
5
|
|
13
6
|
class TrafficLight < ActiveRecord::Base
|
14
7
|
include ActiveRecord::Transitions
|
@@ -52,10 +45,7 @@ end
|
|
52
45
|
|
53
46
|
class TestActiveRecord < Test::Unit::TestCase
|
54
47
|
def setup
|
55
|
-
|
56
|
-
ActiveRecord::Migration.verbose = false
|
57
|
-
CreateTrafficLights.migrate(:up)
|
58
|
-
|
48
|
+
create_database
|
59
49
|
@light = TrafficLight.create!
|
60
50
|
end
|
61
51
|
|
@@ -142,6 +132,7 @@ end
|
|
142
132
|
class TestNewActiveRecord < TestActiveRecord
|
143
133
|
|
144
134
|
def setup
|
135
|
+
create_database
|
145
136
|
@light = TrafficLight.new
|
146
137
|
end
|
147
138
|
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require "helper"
|
2
|
+
require 'active_support/core_ext/module/aliasing'
|
3
|
+
|
4
|
+
create_database
|
5
|
+
|
6
|
+
class Order < ActiveRecord::Base
|
7
|
+
include ActiveRecord::Transitions
|
8
|
+
|
9
|
+
state_machine do
|
10
|
+
state :opened
|
11
|
+
state :placed
|
12
|
+
state :paid
|
13
|
+
state :prepared
|
14
|
+
state :delivered
|
15
|
+
state :cancelled
|
16
|
+
|
17
|
+
# no timestamp col is being specified here - should be ignored
|
18
|
+
event :place do
|
19
|
+
transitions :from => :opened, :to => :placed
|
20
|
+
end
|
21
|
+
|
22
|
+
# should set paid_at timestamp
|
23
|
+
event :pay, :timestamp => true do
|
24
|
+
transitions :from => :placed, :to => :paid
|
25
|
+
end
|
26
|
+
|
27
|
+
# should set prepared_on
|
28
|
+
event :prepare, :timestamp => true do
|
29
|
+
transitions :from => :paid, :to => :prepared
|
30
|
+
end
|
31
|
+
|
32
|
+
# should set dispatched_at
|
33
|
+
event :deliver, :timestamp => "dispatched_at" do
|
34
|
+
transitions :from => :prepared, :to => :delivered
|
35
|
+
end
|
36
|
+
|
37
|
+
# should set cancellation_date
|
38
|
+
event :cancel, :timestamp => :cancellation_date do
|
39
|
+
transitions :from => [:placed, :paid, :prepared], :to => :cancelled
|
40
|
+
end
|
41
|
+
|
42
|
+
# should raise an exception as there is no timestamp col
|
43
|
+
event :reopen, :timestamp => true do
|
44
|
+
transitions :from => :cancelled, :to => :opened
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
class TestActiveRecordTimestamps < Test::Unit::TestCase
|
52
|
+
|
53
|
+
require "securerandom"
|
54
|
+
|
55
|
+
def setup
|
56
|
+
create_database
|
57
|
+
end
|
58
|
+
|
59
|
+
def create_order(state = nil)
|
60
|
+
Order.create! order_number: SecureRandom.hex(4), state: state
|
61
|
+
end
|
62
|
+
|
63
|
+
# control case, no timestamp has been set so we should expect default behaviour
|
64
|
+
test "moving to placed does not raise any exceptions" do
|
65
|
+
@order = create_order
|
66
|
+
assert_nothing_raised { @order.place! }
|
67
|
+
assert_equal @order.state, "placed"
|
68
|
+
end
|
69
|
+
|
70
|
+
test "moving to paid should set paid_at" do
|
71
|
+
@order = create_order(:placed)
|
72
|
+
@order.pay!
|
73
|
+
@order.reload
|
74
|
+
assert_not_nil @order.paid_at
|
75
|
+
end
|
76
|
+
|
77
|
+
test "moving to prepared should set prepared_on" do
|
78
|
+
@order = create_order(:paid)
|
79
|
+
@order.prepare!
|
80
|
+
@order.reload
|
81
|
+
assert_not_nil @order.prepared_on
|
82
|
+
end
|
83
|
+
|
84
|
+
test "moving to delivered should set dispatched_at" do
|
85
|
+
@order = create_order(:prepared)
|
86
|
+
@order.deliver!
|
87
|
+
@order.reload
|
88
|
+
assert_not_nil @order.dispatched_at
|
89
|
+
end
|
90
|
+
|
91
|
+
test "moving to cancelled should set cancellation_date" do
|
92
|
+
@order = create_order(:placed)
|
93
|
+
@order.cancel!
|
94
|
+
@order.reload
|
95
|
+
assert_not_nil @order.cancellation_date
|
96
|
+
end
|
97
|
+
|
98
|
+
test "moving to reopened should raise an exception as there is no attribute" do
|
99
|
+
@order = create_order(:cancelled)
|
100
|
+
assert_raise(NoMethodError) { @order.re_open! }
|
101
|
+
@order.reload
|
102
|
+
end
|
103
|
+
|
104
|
+
test "passing an invalid value to timestamp options should raise an exception" do
|
105
|
+
assert_raise(ArgumentError) do
|
106
|
+
class Order < ActiveRecord::Base
|
107
|
+
include ActiveRecord::Transitions
|
108
|
+
state_machine do
|
109
|
+
event :replace, timestamp: 1 do
|
110
|
+
transitions :from => :prepared, :to => :placed
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
data/test/test_scopes.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require "helper"
|
2
|
+
require 'active_support/core_ext/module/aliasing'
|
3
|
+
|
4
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
5
|
+
|
6
|
+
class CreateTrafficLights < ActiveRecord::Migration
|
7
|
+
def self.up
|
8
|
+
create_table(:traffic_lights) do |t|
|
9
|
+
t.string :state
|
10
|
+
t.string :name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class TrafficLight < ActiveRecord::Base
|
16
|
+
include ActiveRecord::Transitions
|
17
|
+
|
18
|
+
state_machine do
|
19
|
+
state :off
|
20
|
+
|
21
|
+
state :red
|
22
|
+
state :green
|
23
|
+
state :yellow
|
24
|
+
|
25
|
+
event :red_on do
|
26
|
+
transitions :to => :red, :from => [:yellow]
|
27
|
+
end
|
28
|
+
|
29
|
+
event :green_on do
|
30
|
+
transitions :to => :green, :from => [:red]
|
31
|
+
end
|
32
|
+
|
33
|
+
event :yellow_on do
|
34
|
+
transitions :to => :yellow, :from => [:green]
|
35
|
+
end
|
36
|
+
|
37
|
+
event :reset do
|
38
|
+
transitions :to => :red, :from => [:off]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class TestScopes < Test::Unit::TestCase
|
44
|
+
def setup
|
45
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
46
|
+
ActiveRecord::Migration.verbose = false
|
47
|
+
CreateTrafficLights.migrate(:up)
|
48
|
+
|
49
|
+
@light = TrafficLight.create!
|
50
|
+
end
|
51
|
+
|
52
|
+
test "scope returns correct object" do
|
53
|
+
assert TrafficLight.respond_to? :off
|
54
|
+
assert_equal TrafficLight.off.first, @light
|
55
|
+
assert TrafficLight.red.empty?
|
56
|
+
end
|
57
|
+
|
58
|
+
test "scopes exist" do
|
59
|
+
assert TrafficLight.respond_to? :off
|
60
|
+
assert TrafficLight.respond_to? :red
|
61
|
+
assert TrafficLight.respond_to? :green
|
62
|
+
assert TrafficLight.respond_to? :yellow
|
63
|
+
end
|
64
|
+
end
|
data/transitions.gemspec
CHANGED
@@ -5,8 +5,8 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.name = "transitions"
|
6
6
|
s.version = Transitions::VERSION
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
|
-
s.authors = ["Jakub Kuźma"]
|
9
|
-
s.email = "
|
8
|
+
s.authors = ["Jakub Kuźma", "Timo Rößner"]
|
9
|
+
s.email = "timo.roessner@googlemail.com"
|
10
10
|
s.homepage = "http://github.com/qoobaa/transitions"
|
11
11
|
s.summary = "State machine extracted from ActiveModel"
|
12
12
|
s.description = "Lightweight state machine extracted from ActiveModel"
|
metadata
CHANGED
@@ -1,82 +1,78 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: transitions
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.11
|
4
5
|
prerelease:
|
5
|
-
version: 0.0.10
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
-
|
7
|
+
authors:
|
8
|
+
- Jakub Kuźma
|
9
|
+
- Timo Rößner
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2011-10-12 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
17
16
|
name: bundler
|
18
|
-
requirement: &
|
17
|
+
requirement: &69475640 !ruby/object:Gem::Requirement
|
19
18
|
none: false
|
20
|
-
requirements:
|
19
|
+
requirements:
|
21
20
|
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1'
|
24
23
|
type: :development
|
25
24
|
prerelease: false
|
26
|
-
version_requirements: *
|
27
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *69475640
|
26
|
+
- !ruby/object:Gem::Dependency
|
28
27
|
name: test-unit
|
29
|
-
requirement: &
|
28
|
+
requirement: &69470060 !ruby/object:Gem::Requirement
|
30
29
|
none: false
|
31
|
-
requirements:
|
30
|
+
requirements:
|
32
31
|
- - ~>
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version:
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2'
|
35
34
|
type: :development
|
36
35
|
prerelease: false
|
37
|
-
version_requirements: *
|
38
|
-
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: *69470060
|
37
|
+
- !ruby/object:Gem::Dependency
|
39
38
|
name: mocha
|
40
|
-
requirement: &
|
39
|
+
requirement: &69469200 !ruby/object:Gem::Requirement
|
41
40
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version:
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
46
45
|
type: :development
|
47
46
|
prerelease: false
|
48
|
-
version_requirements: *
|
49
|
-
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: *69469200
|
48
|
+
- !ruby/object:Gem::Dependency
|
50
49
|
name: sqlite3-ruby
|
51
|
-
requirement: &
|
50
|
+
requirement: &69468690 !ruby/object:Gem::Requirement
|
52
51
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version:
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
57
56
|
type: :development
|
58
57
|
prerelease: false
|
59
|
-
version_requirements: *
|
60
|
-
- !ruby/object:Gem::Dependency
|
58
|
+
version_requirements: *69468690
|
59
|
+
- !ruby/object:Gem::Dependency
|
61
60
|
name: activerecord
|
62
|
-
requirement: &
|
61
|
+
requirement: &69467660 !ruby/object:Gem::Requirement
|
63
62
|
none: false
|
64
|
-
requirements:
|
63
|
+
requirements:
|
65
64
|
- - ~>
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version:
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '3'
|
68
67
|
type: :development
|
69
68
|
prerelease: false
|
70
|
-
version_requirements: *
|
69
|
+
version_requirements: *69467660
|
71
70
|
description: Lightweight state machine extracted from ActiveModel
|
72
|
-
email:
|
71
|
+
email: timo.roessner@googlemail.com
|
73
72
|
executables: []
|
74
|
-
|
75
73
|
extensions: []
|
76
|
-
|
77
74
|
extra_rdoc_files: []
|
78
|
-
|
79
|
-
files:
|
75
|
+
files:
|
80
76
|
- .gitignore
|
81
77
|
- Gemfile
|
82
78
|
- Gemfile.lock
|
@@ -90,47 +86,45 @@ files:
|
|
90
86
|
- lib/transitions/state.rb
|
91
87
|
- lib/transitions/state_transition.rb
|
92
88
|
- lib/transitions/version.rb
|
89
|
+
- test/db/create_db.rb
|
93
90
|
- test/helper.rb
|
94
91
|
- test/test_active_record.rb
|
92
|
+
- test/test_active_record_timestamps.rb
|
95
93
|
- test/test_event.rb
|
96
94
|
- test/test_event_arguments.rb
|
97
95
|
- test/test_event_being_fired.rb
|
98
96
|
- test/test_machine.rb
|
97
|
+
- test/test_scopes.rb
|
99
98
|
- test/test_state.rb
|
100
99
|
- test/test_state_transition.rb
|
101
100
|
- test/test_state_transition_callbacks.rb
|
102
101
|
- test/test_state_transition_guard_check.rb
|
103
102
|
- transitions.gemspec
|
104
|
-
has_rdoc: true
|
105
103
|
homepage: http://github.com/qoobaa/transitions
|
106
104
|
licenses: []
|
107
|
-
|
108
105
|
post_install_message:
|
109
106
|
rdoc_options: []
|
110
|
-
|
111
|
-
require_paths:
|
107
|
+
require_paths:
|
112
108
|
- lib
|
113
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
110
|
none: false
|
115
|
-
requirements:
|
116
|
-
- -
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
|
119
|
-
segments:
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
segments:
|
120
116
|
- 0
|
121
|
-
|
122
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
+
hash: 59531697
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
119
|
none: false
|
124
|
-
requirements:
|
125
|
-
- -
|
126
|
-
- !ruby/object:Gem::Version
|
120
|
+
requirements:
|
121
|
+
- - ! '>='
|
122
|
+
- !ruby/object:Gem::Version
|
127
123
|
version: 1.3.6
|
128
124
|
requirements: []
|
129
|
-
|
130
125
|
rubyforge_project: transitions
|
131
|
-
rubygems_version: 1.6
|
126
|
+
rubygems_version: 1.8.6
|
132
127
|
signing_key:
|
133
128
|
specification_version: 3
|
134
129
|
summary: State machine extracted from ActiveModel
|
135
130
|
test_files: []
|
136
|
-
|