workflow 2.0.0.pre → 2.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.
- checksums.yaml +4 -4
- data/README.markdown +30 -203
- data/lib/workflow.rb +3 -0
- data/lib/workflow/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60901ed58fefbe1ef7c4e6b4ec5f06c307c3b6c1669f6838d9990bd15ef452ad
|
4
|
+
data.tar.gz: d4f5f51c86f382b65ae4850ede4a7749f9dcc2153e544cdf3c068a0af7561799
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd5fc9eeb0062c0dd432406be66c47bf64530c5f89b95364af6cc92821199c821e895ad16eab361939f02c6ccbbf21bcba33048e2014f56dd920a7bb22219382
|
7
|
+
data.tar.gz: 7d9ca2e0b4e8873bb3802944f29879f0606ccf14adc392cb6a63e5ba2fe2a5c70245fc78e4a4026b374f9b39b4d3330630df2398f22187c86ae2be32da17d78d
|
data/README.markdown
CHANGED
@@ -10,17 +10,9 @@ at http://rubygems.org/gems/workflow : select a version (optional,
|
|
10
10
|
default is latest release), click "Documentation" link. When reading on
|
11
11
|
github.com, the README refers to the upcoming release.
|
12
12
|
|
13
|
-
**Note
|
14
|
-
|
15
|
-
|
16
|
-
maintenance effort, and also to allow for an independent (faster) release cycle
|
17
|
-
for Rails support, starting with workflow **version 2.0** the support for
|
18
|
-
ActiveRecord (4.\*, 5.\* and newer) is extracted into a separate
|
19
|
-
[workflow-activerecord](https://github.com/geekq/workflow-activerecord) gem.
|
20
|
-
|
21
|
-
You can also implement
|
22
|
-
[your own state persistence](https://github.com/geekq/workflow#custom-workflow-state-persistence)
|
23
|
-
for ActiveRecord or any other persistence library.
|
13
|
+
**Note: Workflow 2.0 is a major refactoring of the library.
|
14
|
+
For different options/troubleshooting using it with your Rails application see
|
15
|
+
[State persistence with ActiveRecord](#state-persistence-with-activerecord).**
|
24
16
|
|
25
17
|
What is workflow?
|
26
18
|
-----------------
|
@@ -91,8 +83,8 @@ of possible events and other meta information:
|
|
91
83
|
@transitions_to=:awaiting_review, @name=:submit, @meta={}>},
|
92
84
|
name:new, meta{}
|
93
85
|
|
94
|
-
|
95
|
-
|
86
|
+
You can also check, whether a state comes before or after another state (by the
|
87
|
+
order they were defined):
|
96
88
|
|
97
89
|
article.current_state
|
98
90
|
=> being_reviewed
|
@@ -129,16 +121,6 @@ install the `activesupport` and `ruby-graphviz` gems.
|
|
129
121
|
Versions up to and including 1.0.0 are also available as a single file download -
|
130
122
|
[lib/workflow.rb file](https://github.com/geekq/workflow/blob/v1.0.0/lib/workflow.rb).
|
131
123
|
|
132
|
-
Ruby 1.9
|
133
|
-
--------
|
134
|
-
|
135
|
-
Workflow gem does not work with some Ruby 1.9
|
136
|
-
builds due to a known bug in Ruby 1.9. Either
|
137
|
-
|
138
|
-
* use newer ruby build, 1.9.2-p136 and -p180 tested to work
|
139
|
-
* or compile your Ruby 1.9 from source
|
140
|
-
* or [comment out some lines in workflow](http://github.com/geekq/workflow/issues#issue/6)
|
141
|
-
(reduces functionality).
|
142
124
|
|
143
125
|
Examples
|
144
126
|
--------
|
@@ -208,73 +190,29 @@ due to a deep nesting. We tried (and dismissed) lambdas for this. Eventually
|
|
208
190
|
we decided to invoke an optional user defined callback method with the same
|
209
191
|
name as the event (convention over configuration) as explained before.
|
210
192
|
|
193
|
+
State persistence with ActiveRecord
|
194
|
+
-----------------------------------
|
211
195
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
only need to define a string field on the table called `workflow_state`
|
217
|
-
and include the workflow mixin in your model class as usual:
|
218
|
-
|
219
|
-
class Order < ActiveRecord::Base
|
220
|
-
include Workflow
|
221
|
-
workflow do
|
222
|
-
# list states and transitions here
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
On a database record loading all the state check methods e.g.
|
227
|
-
`article.state`, `article.awaiting_review?` are immediately available.
|
228
|
-
For new records or if the `workflow_state` field is not set the state
|
229
|
-
defaults to the first state declared in the workflow specification. In
|
230
|
-
our example it is `:new`, so `Article.new.new?` returns true and
|
231
|
-
`Article.new.approved?` returns false.
|
232
|
-
|
233
|
-
At the end of a successful state transition like `article.approve!` the
|
234
|
-
new state is immediately saved in the database.
|
235
|
-
|
236
|
-
You can change this behaviour by overriding `persist_workflow_state`
|
237
|
-
method.
|
238
|
-
|
239
|
-
### Scopes
|
240
|
-
|
241
|
-
Workflow library also adds automatically generated scopes with names based on
|
242
|
-
states names:
|
243
|
-
|
244
|
-
class Order < ActiveRecord::Base
|
245
|
-
include Workflow
|
246
|
-
workflow do
|
247
|
-
state :approved
|
248
|
-
state :pending
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
# returns all orders with `approved` state
|
253
|
-
Order.with_approved_state
|
254
|
-
|
255
|
-
# returns all orders with `pending` state
|
256
|
-
Order.with_pending_state
|
257
|
-
|
258
|
-
|
259
|
-
### Custom workflow database column
|
196
|
+
Note: Workflow 2.0 is a major refactoring for the `worklow` library.
|
197
|
+
If your application suddenly breaks after the workflow 2.0 release, you've
|
198
|
+
probably got your Gemfile wrong ;-). workflow uses [semantic versioning][]. For
|
199
|
+
highest compatibility please reference the desired major+minor version.
|
260
200
|
|
261
|
-
|
262
|
-
custom persistence column easily, e.g. for a legacy database schema:
|
263
|
-
|
264
|
-
class LegacyOrder < ActiveRecord::Base
|
265
|
-
include Workflow
|
266
|
-
|
267
|
-
workflow_column :foo_bar # use this legacy database column for
|
268
|
-
# persistence
|
269
|
-
end
|
201
|
+
Note on ActiveRecord/Rails 4.\*, 5.\* Support:
|
270
202
|
|
203
|
+
Since integration with ActiveRecord makes over 90% of the issues and
|
204
|
+
maintenance effort, and also to allow for an independent (faster) release cycle
|
205
|
+
for Rails support, starting with workflow **version 2.0** in January 2019 the
|
206
|
+
support for ActiveRecord (4.\*, 5.\* and newer) has been extracted into a separate
|
207
|
+
gem. Read at [workflow-activerecord][], how to include the right gem.
|
271
208
|
|
209
|
+
To use legacy built-in ActiveRecord 2.3 - 4.* support, reference Workflow 1.2 in
|
210
|
+
your Gemfile:
|
272
211
|
|
273
|
-
|
212
|
+
gem 'workflow', '~> 1.2'
|
274
213
|
|
275
|
-
|
276
|
-
|
277
|
-
definition.
|
214
|
+
[semantic versioning]: https://guides.rubygems.org/patterns/#semantic-versioning
|
215
|
+
[workflow-activerecord]: https://github.com/geekq/workflow-activerecord
|
278
216
|
|
279
217
|
Custom workflow state persistence
|
280
218
|
---------------------------------
|
@@ -385,25 +323,6 @@ also know, if you need any interface beyond `load_workflow_state` and
|
|
385
323
|
favorite database.
|
386
324
|
|
387
325
|
|
388
|
-
Custom Versions of Existing Adapters
|
389
|
-
------------------------------------
|
390
|
-
|
391
|
-
Other adapters (such as a custom ActiveRecord plugin) can be selected by adding a `workflow_adapter` class method, eg.
|
392
|
-
|
393
|
-
```ruby
|
394
|
-
class Example < ActiveRecord::Base
|
395
|
-
def self.workflow_adapter
|
396
|
-
MyCustomAdapter
|
397
|
-
end
|
398
|
-
include Workflow
|
399
|
-
|
400
|
-
# ...
|
401
|
-
end
|
402
|
-
```
|
403
|
-
|
404
|
-
(The above will include `MyCustomAdapter` *instead* of `Workflow::Adapter::ActiveRecord`.)
|
405
|
-
|
406
|
-
|
407
326
|
Accessing your workflow specification
|
408
327
|
-------------------------------------
|
409
328
|
|
@@ -548,69 +467,6 @@ The whole event sequence is as follows:
|
|
548
467
|
* after_transition
|
549
468
|
|
550
469
|
|
551
|
-
Multiple Workflows
|
552
|
-
------------------
|
553
|
-
|
554
|
-
I am frequently asked if it's possible to represent multiple "workflows"
|
555
|
-
in an ActiveRecord class.
|
556
|
-
|
557
|
-
The solution depends on your business logic and how you want to
|
558
|
-
structure your implementation.
|
559
|
-
|
560
|
-
### Use Single Table Inheritance
|
561
|
-
|
562
|
-
One solution can be to do it on the class level and use a class
|
563
|
-
hierarchy. You can use [single table inheritance][STI] so there is only
|
564
|
-
single `orders` table in the database. Read more in the chapter "Single
|
565
|
-
Table Inheritance" of the [ActiveRecord documentation][ActiveRecord].
|
566
|
-
Then you define your different classes:
|
567
|
-
|
568
|
-
class Order < ActiveRecord::Base
|
569
|
-
include Workflow
|
570
|
-
end
|
571
|
-
|
572
|
-
class SmallOrder < Order
|
573
|
-
workflow do
|
574
|
-
# workflow definition for small orders goes here
|
575
|
-
end
|
576
|
-
end
|
577
|
-
|
578
|
-
class BigOrder < Order
|
579
|
-
workflow do
|
580
|
-
# workflow for big orders, probably with a longer approval chain
|
581
|
-
end
|
582
|
-
end
|
583
|
-
|
584
|
-
|
585
|
-
### Individual workflows for objects
|
586
|
-
|
587
|
-
Another solution would be to connect different workflows to object
|
588
|
-
instances via metaclass, e.g.
|
589
|
-
|
590
|
-
# Load an object from the database
|
591
|
-
booking = Booking.find(1234)
|
592
|
-
|
593
|
-
# Now define a workflow - exclusively for this object,
|
594
|
-
# probably depending on some condition or database field
|
595
|
-
if # some condition
|
596
|
-
class << booking
|
597
|
-
include Workflow
|
598
|
-
workflow do
|
599
|
-
state :state1
|
600
|
-
state :state2
|
601
|
-
end
|
602
|
-
end
|
603
|
-
# if some other condition, use a different workflow
|
604
|
-
|
605
|
-
You can also encapsulate this in a class method or even put in some
|
606
|
-
ActiveRecord callback. Please also have a look at [the full working
|
607
|
-
example][multiple_workflow_test]!
|
608
|
-
|
609
|
-
[STI]: http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html
|
610
|
-
[ActiveRecord]: http://api.rubyonrails.org/classes/ActiveRecord/Base.html
|
611
|
-
[multiple_workflow_test]: http://github.com/geekq/workflow/blob/master/test/multiple_workflows_test.rb
|
612
|
-
|
613
|
-
|
614
470
|
Documenting with diagrams
|
615
471
|
-------------------------
|
616
472
|
|
@@ -639,49 +495,20 @@ Development Setup
|
|
639
495
|
bundle exec rake test
|
640
496
|
|
641
497
|
|
642
|
-
Earlier versions
|
643
|
-
----------------
|
644
|
-
|
645
|
-
The `workflow` library was originally written by Ryan Allen.
|
646
|
-
|
647
|
-
The version 0.3 was almost completely (including ActiveRecord
|
648
|
-
integration, API for accessing workflow specification,
|
649
|
-
method_missing free implementation) rewritten by Vladimir Dobriakov
|
650
|
-
keeping the original workflow DSL spirit.
|
651
|
-
|
652
|
-
|
653
|
-
Migration from the original Ryan's library
|
654
|
-
------------------------------------------
|
655
|
-
|
656
|
-
Credit: Michael (rockrep)
|
657
|
-
|
658
|
-
Accessing workflow specification
|
659
|
-
|
660
|
-
my_instance.workflow # old
|
661
|
-
MyClass.workflow_spec # new
|
662
|
-
|
663
|
-
Accessing states, events, meta, e.g.
|
664
|
-
|
665
|
-
my_instance.workflow.states(:some_state).events(:some_event).meta[:some_meta_tag] # old
|
666
|
-
MyClass.workflow_spec.states[:some_state].events[:some_event].meta[:some_meta_tag] # new
|
667
|
-
|
668
|
-
Causing state transitions
|
669
|
-
|
670
|
-
my_instance.workflow.my_event # old
|
671
|
-
my_instance.my_event! # new
|
672
|
-
|
673
|
-
when using both a block and a callback method for an event, the block executes prior to the callback
|
674
|
-
|
675
|
-
|
676
498
|
Changelog
|
677
499
|
---------
|
678
500
|
|
679
|
-
### New in the
|
501
|
+
### New in the version 2.0.0
|
680
502
|
|
681
503
|
* extract Rails/ActiveRecord integration into a separate gem
|
682
504
|
workflow-activerecord
|
683
505
|
* Remodel integration removed - needs to be a separate gem
|
684
506
|
|
507
|
+
Special thanks to [voltechs][] for implementing Rails 5 support
|
508
|
+
and helping to revive `workflow`!
|
509
|
+
|
510
|
+
[voltechs]: https://github.com/voltechs
|
511
|
+
|
685
512
|
### New in the upcoming version 1.3.0 (never released)
|
686
513
|
|
687
514
|
* Retiring Ruby 1.8.7 and Rails 2 support #118. If you still need this older
|
@@ -814,9 +641,9 @@ Support
|
|
814
641
|
About
|
815
642
|
-----
|
816
643
|
|
817
|
-
Author: Vladimir Dobriakov, <
|
644
|
+
Author: Vladimir Dobriakov, <https://infrastructure-as-code.de>
|
818
645
|
|
819
|
-
Copyright (c) 2010-
|
646
|
+
Copyright (c) 2010-2019 Vladimir Dobriakov and Contributors
|
820
647
|
|
821
648
|
Copyright (c) 2008-2009 Vodafone
|
822
649
|
|
data/lib/workflow.rb
CHANGED
@@ -15,6 +15,9 @@ module Workflow
|
|
15
15
|
module ClassMethods
|
16
16
|
attr_reader :workflow_spec
|
17
17
|
|
18
|
+
# Workflow does not provide any state persistence - it is the job of particular
|
19
|
+
# persistence libraries for workflow and activerecord or remodel.
|
20
|
+
# But it still makes sense to provide a default name and override feature.
|
18
21
|
def workflow_column(column_name=nil)
|
19
22
|
if column_name
|
20
23
|
@workflow_state_column_name = column_name.to_sym
|
data/lib/workflow/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Dobriakov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
@@ -135,9 +135,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
135
135
|
version: '2.3'
|
136
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
137
|
requirements:
|
138
|
-
- - "
|
138
|
+
- - ">="
|
139
139
|
- !ruby/object:Gem::Version
|
140
|
-
version:
|
140
|
+
version: '0'
|
141
141
|
requirements: []
|
142
142
|
rubyforge_project:
|
143
143
|
rubygems_version: 2.7.6
|