workflow 0.8.7 → 1.0.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.
- data/.travis.yml +14 -0
- data/README.markdown +20 -0
- data/Rakefile +9 -0
- data/gemfiles/Gemfile.rails-2.3.x +10 -0
- data/lib/workflow.rb +14 -3
- data/lib/workflow/version.rb +1 -1
- data/test/advanced_examples_test.rb +61 -0
- data/test/attr_protected_test.rb +104 -0
- data/test/main_test.rb +41 -20
- data/test/new_versions/compare_states_test.rb +31 -0
- data/test/new_versions/persistence_test.rb +62 -0
- data/workflow.gemspec +1 -0
- metadata +35 -15
- data/VERSION +0 -1
data/.travis.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
before_install:
|
2
|
+
- sudo apt-get install -qq graphviz
|
3
|
+
|
4
|
+
rvm:
|
5
|
+
- 1.9.3
|
6
|
+
- 2.0.0
|
7
|
+
|
8
|
+
matrix:
|
9
|
+
include:
|
10
|
+
# legacy build: Ruby 1.8.7, Rails 2.3, less features, smaller test set
|
11
|
+
- rvm: 1.8.7
|
12
|
+
gemfile: gemfiles/Gemfile.rails-2.3.x
|
13
|
+
# running a smaller test set for old Rails and Ruby
|
14
|
+
script: rake test_without_new_versions
|
data/README.markdown
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://travis-ci.org/geekq/workflow)
|
2
|
+
|
1
3
|
What is workflow?
|
2
4
|
-----------------
|
3
5
|
|
@@ -501,6 +503,24 @@ when using both a block and a callback method for an event, the block executes p
|
|
501
503
|
Changelog
|
502
504
|
---------
|
503
505
|
|
506
|
+
### New in the version 1.0.0
|
507
|
+
|
508
|
+
* **Support to private/protected callback methods.**
|
509
|
+
See also issues [#53](https://github.com/geekq/workflow/pull/53)
|
510
|
+
and [#58](https://github.com/geekq/workflow/pull/58). With the new
|
511
|
+
implementation:
|
512
|
+
|
513
|
+
* callback methods can be hidden (non public): both private methods
|
514
|
+
in the immediate class and protected methods somewhere in the class
|
515
|
+
hierarchy are supported
|
516
|
+
* no unintentional calls on `fail!` and other Kernel methods
|
517
|
+
* inheritance hierarchy with workflow is supported
|
518
|
+
|
519
|
+
* using Rails' 3.1 `update_column` whenever available so only the
|
520
|
+
workflow state column and not other pending attribute changes are
|
521
|
+
saved on state transition. Fallback to `update_attribute` for older
|
522
|
+
Rails and other ORMs. [commit](https://github.com/geekq/workflow/commit/7e091d8ded1aeeb0a86647bbf7d78ab3c9d0c458)
|
523
|
+
|
504
524
|
### New in the version 0.8.7
|
505
525
|
|
506
526
|
* switch from [jeweler][] to pure bundler for building gems
|
data/Rakefile
CHANGED
@@ -15,6 +15,15 @@ end
|
|
15
15
|
|
16
16
|
require 'rake'
|
17
17
|
Rake::TestTask.new do |t|
|
18
|
+
t.libs << 'test'
|
19
|
+
t.verbose = true
|
20
|
+
t.warning = true
|
21
|
+
t.test_files = FileList['test/*_test.rb'] + FileList['test/new_versions/*_test.rb']
|
22
|
+
end
|
23
|
+
|
24
|
+
Rake::TestTask.new do |t|
|
25
|
+
t.name = 'test_without_new_versions'
|
26
|
+
t.libs << 'test'
|
18
27
|
t.verbose = true
|
19
28
|
t.warning = true
|
20
29
|
t.pattern = 'test/*_test.rb'
|
data/lib/workflow.rb
CHANGED
@@ -284,9 +284,14 @@ module Workflow
|
|
284
284
|
def run_action(action, *args)
|
285
285
|
instance_exec(*args, &action) if action
|
286
286
|
end
|
287
|
-
|
287
|
+
|
288
288
|
def has_callback?(action)
|
289
|
-
|
289
|
+
# 1. public callback method or
|
290
|
+
# 2. protected method somewhere in the class hierarchy or
|
291
|
+
# 3. private in the immediate class (parent classes ignored)
|
292
|
+
self.respond_to?(action) or
|
293
|
+
self.class.protected_method_defined?(action) or
|
294
|
+
self.private_methods(false).map(&:to_sym).include?(action)
|
290
295
|
end
|
291
296
|
|
292
297
|
def run_action_callback(action_name, *args)
|
@@ -338,7 +343,13 @@ module Workflow
|
|
338
343
|
# On transition the new workflow state is immediately saved in the
|
339
344
|
# database.
|
340
345
|
def persist_workflow_state(new_value)
|
341
|
-
|
346
|
+
if self.respond_to? :update_column
|
347
|
+
# Rails 3.1 or newer
|
348
|
+
update_column self.class.workflow_column, new_value
|
349
|
+
else
|
350
|
+
# older Rails; beware of side effect: other (pending) attribute changes will be persisted too
|
351
|
+
update_attribute self.class.workflow_column, new_value
|
352
|
+
end
|
342
353
|
end
|
343
354
|
|
344
355
|
private
|
data/lib/workflow/version.rb
CHANGED
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
require 'workflow'
|
3
|
+
class AdvanceExamplesTest < ActiveRecordTestCase
|
4
|
+
|
5
|
+
class Article
|
6
|
+
include Workflow
|
7
|
+
workflow do
|
8
|
+
state :new do
|
9
|
+
event :submit, :transitions_to => :awaiting_review
|
10
|
+
end
|
11
|
+
state :awaiting_review do
|
12
|
+
event :review, :transitions_to => :being_reviewed
|
13
|
+
end
|
14
|
+
state :being_reviewed do
|
15
|
+
event :accept, :transitions_to => :accepted
|
16
|
+
event :reject, :transitions_to => :rejected
|
17
|
+
end
|
18
|
+
state :accepted do
|
19
|
+
end
|
20
|
+
state :rejected do
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
test '#63 undoing event - automatically add revert events for every defined event' do
|
26
|
+
# also see https://github.com/geekq/workflow/issues/63
|
27
|
+
spec = Article.workflow_spec
|
28
|
+
spec.state_names.each do |state_name|
|
29
|
+
state = spec.states[state_name]
|
30
|
+
|
31
|
+
(state.events.values.reject {|e| e.name.to_s =~ /^revert_/ }).each do |event|
|
32
|
+
event_name = event.name
|
33
|
+
revert_event_name = "revert_" + event_name.to_s
|
34
|
+
|
35
|
+
# Add revert events
|
36
|
+
spec.states[event.transitions_to.to_sym].events[revert_event_name.to_sym] =
|
37
|
+
Workflow::Event.new(revert_event_name, state, {})
|
38
|
+
|
39
|
+
# Add methods for revert events
|
40
|
+
Article.module_eval do
|
41
|
+
define_method "#{revert_event_name}!".to_sym do |*args|
|
42
|
+
process_event!(revert_event_name, *args)
|
43
|
+
end
|
44
|
+
define_method "can_#{revert_event_name}?" do
|
45
|
+
return self.current_state.events.include?(revert_event_name)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
a = Article.new
|
53
|
+
assert(a.new?, "should start with the 'new' state")
|
54
|
+
a.submit!
|
55
|
+
assert(a.awaiting_review?, "should now be in 'awaiting_review' state")
|
56
|
+
assert_equal(['revert_submit', 'review'], a.current_state.events.keys.map(&:to_s).sort)
|
57
|
+
a.revert_submit! # this method is added by our meta programming magic above
|
58
|
+
assert(a.new?, "should now be back in the 'new' state")
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
$VERBOSE = false
|
4
|
+
require 'active_record'
|
5
|
+
require 'logger'
|
6
|
+
require 'sqlite3'
|
7
|
+
require 'workflow'
|
8
|
+
require 'mocha/setup'
|
9
|
+
require 'stringio'
|
10
|
+
|
11
|
+
ActiveRecord::Migration.verbose = false
|
12
|
+
|
13
|
+
class AttrProtectedTestOrder < ActiveRecord::Base
|
14
|
+
include Workflow
|
15
|
+
|
16
|
+
workflow do
|
17
|
+
state :submitted do
|
18
|
+
event :accept, :transitions_to => :accepted, :meta => {:doc_weight => 8} do |reviewer, args|
|
19
|
+
end
|
20
|
+
end
|
21
|
+
state :accepted do
|
22
|
+
event :ship, :transitions_to => :shipped
|
23
|
+
end
|
24
|
+
state :shipped
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_accessible :title # protecting all the other attributes
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
AttrProtectedTestOrder.logger = Logger.new(STDOUT) # active_record 2.3 expects a logger instance
|
32
|
+
AttrProtectedTestOrder.logger.level = Logger::WARN # switch to Logger::DEBUG to see the SQL statements
|
33
|
+
|
34
|
+
class AttrProtectedTest < ActiveRecordTestCase
|
35
|
+
|
36
|
+
def setup
|
37
|
+
super
|
38
|
+
|
39
|
+
ActiveRecord::Schema.define do
|
40
|
+
create_table :attr_protected_test_orders do |t|
|
41
|
+
t.string :title, :null => false
|
42
|
+
t.string :workflow_state
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
exec "INSERT INTO attr_protected_test_orders(title, workflow_state) VALUES('order1', 'submitted')"
|
47
|
+
exec "INSERT INTO attr_protected_test_orders(title, workflow_state) VALUES('order2', 'accepted')"
|
48
|
+
exec "INSERT INTO attr_protected_test_orders(title, workflow_state) VALUES('order3', 'accepted')"
|
49
|
+
exec "INSERT INTO attr_protected_test_orders(title, workflow_state) VALUES('order4', 'accepted')"
|
50
|
+
exec "INSERT INTO attr_protected_test_orders(title, workflow_state) VALUES('order5', 'accepted')"
|
51
|
+
exec "INSERT INTO attr_protected_test_orders(title, workflow_state) VALUES('protected order', 'submitted')"
|
52
|
+
end
|
53
|
+
|
54
|
+
def assert_state(title, expected_state, klass = AttrProtectedTestOrder)
|
55
|
+
o = klass.find_by_title(title)
|
56
|
+
assert_equal expected_state, o.read_attribute(klass.workflow_column)
|
57
|
+
o
|
58
|
+
end
|
59
|
+
|
60
|
+
test 'cannot mass-assign workflow_state if attr_protected' do
|
61
|
+
o = AttrProtectedTestOrder.find_by_title('order1')
|
62
|
+
assert_equal 'submitted', o.read_attribute(:workflow_state)
|
63
|
+
o.update_attributes :workflow_state => 'some_bad_value'
|
64
|
+
assert_equal 'submitted', o.read_attribute(:workflow_state)
|
65
|
+
o.update_attribute :workflow_state, 'some_overridden_value'
|
66
|
+
assert_equal 'some_overridden_value', o.read_attribute(:workflow_state)
|
67
|
+
end
|
68
|
+
|
69
|
+
test 'immediately save the new workflow_state on state machine transition' do
|
70
|
+
o = assert_state 'order2', 'accepted'
|
71
|
+
assert o.ship!
|
72
|
+
assert_state 'order2', 'shipped'
|
73
|
+
end
|
74
|
+
|
75
|
+
test 'persist workflow_state in the db and reload' do
|
76
|
+
o = assert_state 'order3', 'accepted'
|
77
|
+
assert_equal :accepted, o.current_state.name
|
78
|
+
o.ship! # should save in the database, no `o.save!` needed
|
79
|
+
|
80
|
+
assert_state 'order3', 'shipped'
|
81
|
+
|
82
|
+
o.reload
|
83
|
+
assert_equal 'shipped', o.read_attribute(:workflow_state)
|
84
|
+
end
|
85
|
+
|
86
|
+
test 'default workflow column should be workflow_state' do
|
87
|
+
o = assert_state 'order4', 'accepted'
|
88
|
+
assert_equal :workflow_state, o.class.workflow_column
|
89
|
+
end
|
90
|
+
|
91
|
+
test 'access workflow specification' do
|
92
|
+
assert_equal 3, AttrProtectedTestOrder.workflow_spec.states.length
|
93
|
+
assert_equal ['submitted', 'accepted', 'shipped'].sort,
|
94
|
+
AttrProtectedTestOrder.workflow_spec.state_names.map{|n| n.to_s}.sort
|
95
|
+
end
|
96
|
+
|
97
|
+
test 'current state object' do
|
98
|
+
o = assert_state 'order5', 'accepted'
|
99
|
+
assert_equal 'accepted', o.current_state.to_s
|
100
|
+
assert_equal 1, o.current_state.events.length
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
data/test/main_test.rb
CHANGED
@@ -4,7 +4,7 @@ $VERBOSE = false
|
|
4
4
|
require 'active_record'
|
5
5
|
require 'sqlite3'
|
6
6
|
require 'workflow'
|
7
|
-
require 'mocha'
|
7
|
+
require 'mocha/setup'
|
8
8
|
require 'stringio'
|
9
9
|
#require 'ruby-debug'
|
10
10
|
|
@@ -244,17 +244,6 @@ class MainTest < ActiveRecordTestCase
|
|
244
244
|
assert !o.shipped?
|
245
245
|
end
|
246
246
|
|
247
|
-
unless RUBY_VERSION < '1.9'
|
248
|
-
test 'compare states' do
|
249
|
-
o = assert_state 'some order', 'accepted'
|
250
|
-
assert o.current_state < :shipped
|
251
|
-
assert o.current_state > :submitted
|
252
|
-
assert_raise ArgumentError do
|
253
|
-
o.current_state > :unknown
|
254
|
-
end
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
247
|
test 'correct exception for event, that is not allowed in current state' do
|
259
248
|
o = assert_state 'some order', 'accepted'
|
260
249
|
assert_raise Workflow::NoTransitionAllowed do
|
@@ -289,26 +278,58 @@ class MainTest < ActiveRecordTestCase
|
|
289
278
|
a.my_transition!(args)
|
290
279
|
end
|
291
280
|
|
292
|
-
test '#53 Support for
|
281
|
+
test '#53 Support for non public transition callbacks' do
|
293
282
|
args = mock()
|
294
|
-
args.expects(:log).once
|
295
|
-
|
283
|
+
args.expects(:log).with('in private callback').once
|
284
|
+
args.expects(:log).with('in protected callback in the base class').once
|
285
|
+
|
286
|
+
b = Class.new # the base class with a protected callback
|
287
|
+
b.class_eval do
|
288
|
+
protected
|
289
|
+
def assign_old(args)
|
290
|
+
args.log('in protected callback in the base class')
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
c = Class.new(b) # inheriting class with an additional protected callback
|
296
295
|
c.class_eval do
|
297
296
|
include Workflow
|
298
297
|
workflow do
|
299
298
|
state :new do
|
300
299
|
event :assign, :transitions_to => :assigned
|
300
|
+
event :assign_old, :transitions_to => :assigned_old
|
301
301
|
end
|
302
302
|
state :assigned
|
303
|
+
state :assigned_old
|
303
304
|
end
|
304
305
|
|
305
306
|
private
|
306
307
|
def assign(args)
|
307
|
-
args.log('
|
308
|
+
args.log('in private callback')
|
308
309
|
end
|
309
310
|
end
|
311
|
+
|
310
312
|
a = c.new
|
311
313
|
a.assign!(args)
|
314
|
+
|
315
|
+
a2 = c.new
|
316
|
+
a2.assign_old!(args)
|
317
|
+
end
|
318
|
+
|
319
|
+
test '#58 Limited private transition callback lookup' do
|
320
|
+
args = mock()
|
321
|
+
c = Class.new
|
322
|
+
c.class_eval do
|
323
|
+
include Workflow
|
324
|
+
workflow do
|
325
|
+
state :new do
|
326
|
+
event :fail, :transitions_to => :failed
|
327
|
+
end
|
328
|
+
state :failed
|
329
|
+
end
|
330
|
+
end
|
331
|
+
a = c.new
|
332
|
+
a.fail!(args)
|
312
333
|
end
|
313
334
|
|
314
335
|
test 'Single table inheritance (STI)' do
|
@@ -417,7 +438,7 @@ class MainTest < ActiveRecordTestCase
|
|
417
438
|
test 'diagram generation' do
|
418
439
|
begin
|
419
440
|
$stdout = StringIO.new('', 'w')
|
420
|
-
Workflow::create_workflow_diagram(Order, '
|
441
|
+
Workflow::create_workflow_diagram(Order, '/tmp')
|
421
442
|
assert_match(/open.+\.pdf/, $stdout.string,
|
422
443
|
'PDF should be generate and a hint be given to the user.')
|
423
444
|
ensure
|
@@ -496,14 +517,14 @@ class MainTest < ActiveRecordTestCase
|
|
496
517
|
end
|
497
518
|
|
498
519
|
test 'workflow graph generation' do
|
499
|
-
Dir.chdir('tmp') do
|
520
|
+
Dir.chdir('/tmp') do
|
500
521
|
capture_streams do
|
501
|
-
Workflow::create_workflow_diagram(Order)
|
522
|
+
Workflow::create_workflow_diagram(Order, '/tmp')
|
502
523
|
end
|
503
524
|
end
|
504
525
|
end
|
505
526
|
|
506
|
-
test 'workflow graph generation in path with spaces' do
|
527
|
+
test 'workflow graph generation in a path with spaces' do
|
507
528
|
`mkdir -p '/tmp/Workflow test'`
|
508
529
|
capture_streams do
|
509
530
|
Workflow::create_workflow_diagram(Order, '/tmp/Workflow test')
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'workflow'
|
3
|
+
|
4
|
+
class ComparableStatesOrder
|
5
|
+
include Workflow
|
6
|
+
workflow do
|
7
|
+
state :submitted do
|
8
|
+
event :accept, :transitions_to => :accepted, :meta => {:doc_weight => 8} do |reviewer, args|
|
9
|
+
end
|
10
|
+
end
|
11
|
+
state :accepted do
|
12
|
+
event :ship, :transitions_to => :shipped
|
13
|
+
end
|
14
|
+
state :shipped
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class CompareStatesTest < Test::Unit::TestCase
|
19
|
+
|
20
|
+
test 'compare states' do
|
21
|
+
o = ComparableStatesOrder.new
|
22
|
+
o.accept!
|
23
|
+
assert_equal :accepted, o.current_state.name
|
24
|
+
assert o.current_state < :shipped
|
25
|
+
assert o.current_state > :submitted
|
26
|
+
assert_raise ArgumentError do
|
27
|
+
o.current_state > :unknown
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'active_record'
|
3
|
+
require 'logger'
|
4
|
+
require 'sqlite3'
|
5
|
+
require 'workflow'
|
6
|
+
require 'mocha/setup'
|
7
|
+
require 'stringio'
|
8
|
+
|
9
|
+
ActiveRecord::Migration.verbose = false
|
10
|
+
|
11
|
+
class PersistenceTestOrder < ActiveRecord::Base
|
12
|
+
include Workflow
|
13
|
+
|
14
|
+
workflow do
|
15
|
+
state :submitted do
|
16
|
+
event :accept, :transitions_to => :accepted, :meta => {:doc_weight => 8} do |reviewer, args|
|
17
|
+
end
|
18
|
+
end
|
19
|
+
state :accepted do
|
20
|
+
event :ship, :transitions_to => :shipped
|
21
|
+
end
|
22
|
+
state :shipped
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_accessible :title # protecting all the other attributes
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
PersistenceTestOrder.logger = Logger.new(STDOUT) # active_record 2.3 expects a logger instance
|
30
|
+
PersistenceTestOrder.logger.level = Logger::WARN # switch to Logger::DEBUG to see the SQL statements
|
31
|
+
|
32
|
+
class PersistenceTest < ActiveRecordTestCase
|
33
|
+
|
34
|
+
def setup
|
35
|
+
super
|
36
|
+
|
37
|
+
ActiveRecord::Schema.define do
|
38
|
+
create_table :persistence_test_orders do |t|
|
39
|
+
t.string :title, :null => false
|
40
|
+
t.string :workflow_state
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
exec "INSERT INTO persistence_test_orders(title, workflow_state) VALUES('order6', 'accepted')"
|
45
|
+
end
|
46
|
+
|
47
|
+
def assert_state(title, expected_state, klass = PersistenceTestOrder)
|
48
|
+
o = klass.find_by_title(title)
|
49
|
+
assert_equal expected_state, o.read_attribute(klass.workflow_column)
|
50
|
+
o
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'ensure other dirty attributes are not saved on state change' do
|
54
|
+
o = assert_state 'order6', 'accepted'
|
55
|
+
o.title = 'going to change the title'
|
56
|
+
assert o.changed?
|
57
|
+
o.ship!
|
58
|
+
assert o.changed?, 'title should not be saved and the change still stay pending'
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
data/workflow.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
16
|
-
requirement: &
|
16
|
+
requirement: &7744380 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.12'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *7744380
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &7771320 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *7771320
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activerecord
|
38
|
-
requirement: &
|
38
|
+
requirement: &7767500 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *7767500
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: sqlite3
|
49
|
-
requirement: &
|
49
|
+
requirement: &7789480 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *7789480
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: mocha
|
60
|
-
requirement: &
|
60
|
+
requirement: &7788080 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,18 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *7788080
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: &7784180 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *7784180
|
69
80
|
description: ! " Workflow is a finite-state-machine-inspired API for modeling and
|
70
81
|
interacting\n with what we tend to refer to as 'workflow'.\n\n * nice DSL
|
71
82
|
to describe your states, events and transitions\n * robust integration with ActiveRecord
|
@@ -80,18 +91,23 @@ extra_rdoc_files:
|
|
80
91
|
- README.markdown
|
81
92
|
files:
|
82
93
|
- .gitignore
|
94
|
+
- .travis.yml
|
83
95
|
- Gemfile
|
84
96
|
- MIT-LICENSE
|
85
97
|
- README.markdown
|
86
98
|
- Rakefile
|
87
|
-
-
|
99
|
+
- gemfiles/Gemfile.rails-2.3.x
|
88
100
|
- lib/workflow.rb
|
89
101
|
- lib/workflow/version.rb
|
102
|
+
- test/advanced_examples_test.rb
|
90
103
|
- test/advanced_hooks_and_validation_test.rb
|
104
|
+
- test/attr_protected_test.rb
|
91
105
|
- test/before_transition_test.rb
|
92
106
|
- test/couchtiny_example.rb
|
93
107
|
- test/main_test.rb
|
94
108
|
- test/multiple_workflows_test.rb
|
109
|
+
- test/new_versions/compare_states_test.rb
|
110
|
+
- test/new_versions/persistence_test.rb
|
95
111
|
- test/on_error_test.rb
|
96
112
|
- test/readme_example.rb
|
97
113
|
- test/test_helper.rb
|
@@ -112,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
128
|
version: '0'
|
113
129
|
segments:
|
114
130
|
- 0
|
115
|
-
hash:
|
131
|
+
hash: 666989584691565007
|
116
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
133
|
none: false
|
118
134
|
requirements:
|
@@ -121,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
137
|
version: '0'
|
122
138
|
segments:
|
123
139
|
- 0
|
124
|
-
hash:
|
140
|
+
hash: 666989584691565007
|
125
141
|
requirements: []
|
126
142
|
rubyforge_project:
|
127
143
|
rubygems_version: 1.8.10
|
@@ -129,11 +145,15 @@ signing_key:
|
|
129
145
|
specification_version: 3
|
130
146
|
summary: A replacement for acts_as_state_machine.
|
131
147
|
test_files:
|
148
|
+
- test/advanced_examples_test.rb
|
132
149
|
- test/advanced_hooks_and_validation_test.rb
|
150
|
+
- test/attr_protected_test.rb
|
133
151
|
- test/before_transition_test.rb
|
134
152
|
- test/couchtiny_example.rb
|
135
153
|
- test/main_test.rb
|
136
154
|
- test/multiple_workflows_test.rb
|
155
|
+
- test/new_versions/compare_states_test.rb
|
156
|
+
- test/new_versions/persistence_test.rb
|
137
157
|
- test/on_error_test.rb
|
138
158
|
- test/readme_example.rb
|
139
159
|
- test/test_helper.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.8.6
|