workflow 3.0.0 → 3.1.0.pre

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a90286a0749bd94cabc4fab8cc89dc5c9fc7b05d60ea5cf58cd6493852159206
4
- data.tar.gz: 8c4015a8ba91be4c4fc37bd5e8004534146d1daedfd290d32538edec33ac02a3
3
+ metadata.gz: ecf93e8750c9a77e512c840987b34f0616fd6304ed9f2bc98372aaea992fcfe9
4
+ data.tar.gz: 5e86611e43d7d49f61e814e3c6804664b2134c293c768ccb73ebd8bcb09b07c3
5
5
  SHA512:
6
- metadata.gz: b72b7e1d8de350a9e5478d291d7ff6a1e0f6f192bff31eac6951f9f5e8fbf4941597e84e990838402902fb65fa79acabfffdfc5fd168d937967e5d63239dc7f1
7
- data.tar.gz: 9aaea40918c7f2b55b9e51a8ae881708869af77e22995545a5e5017731b19575d7f0ed0a6ffbd5343a6c8883854d81e83749e7447abedd796d6c2d77345bebf8
6
+ metadata.gz: e77f206fc4206d3407e33b3d044b5c291784a4f544bc01a21aacc3f8f92db0fa011a02acfe0987b352e01ddf7b391337ae3a4bde8616d44dfa331c48cfa86595
7
+ data.tar.gz: 33042e85d5f98fbef4c43094da563fb7b22fa2d175220489a062a0295ed52dc2f1445ecc941ce8094c0b858c468431458fadb73f80ec7c56c2b53c813310f260
data/README.adoc CHANGED
@@ -102,7 +102,7 @@ article.current_state.between? :awaiting_review, :rejected # => true
102
102
  ```
103
103
 
104
104
  Now we can call the submit event, which transitions to the
105
- <tt>:awaiting_review</tt> state:
105
+ `:awaiting_review` state:
106
106
 
107
107
  ```rb
108
108
  article.submit!
@@ -131,7 +131,7 @@ gem install workflow
131
131
  install the `activesupport` and `ruby-graphviz` gems.
132
132
 
133
133
  Versions up to and including 1.0.0 are also available as a single file download -
134
- [lib/workflow.rb file](https://github.com/geekq/workflow/blob/v1.0.0/lib/workflow.rb).
134
+ link:https://github.com/geekq/workflow/blob/v1.0.0/lib/workflow.rb[lib/workflow.rb file].
135
135
 
136
136
 
137
137
  === Examples
@@ -345,43 +345,6 @@ favorite database.
345
345
  Advanced usage
346
346
  --------------
347
347
 
348
- ### Accessing your workflow specification
349
-
350
- You can easily reflect on workflow specification programmatically - for
351
- the whole class or for the current object. Examples:
352
-
353
- ```rb
354
- article2.current_state.events # lists possible events from here
355
- article2.current_state.events[:reject].transitions_to # => :rejected
356
-
357
- Article.workflow_spec.states.keys
358
- #=> [:rejected, :awaiting_review, :being_reviewed, :accepted, :new]
359
-
360
- Article.workflow_spec.state_names
361
- #=> [:rejected, :awaiting_review, :being_reviewed, :accepted, :new]
362
-
363
- # list all events for all states
364
- Article.workflow_spec.states.values.collect &:events
365
- ```
366
-
367
- You can also store and later retrieve additional meta data for every
368
- state and every event:
369
-
370
- ```rb
371
- class MyProcess
372
- include Workflow
373
- workflow do
374
- state :main, :meta => {:importance => 8}
375
- state :supplemental, :meta => {:importance => 1}
376
- end
377
- end
378
- puts MyProcess.workflow_spec.states[:supplemental].meta[:importance] # => 1
379
- ```
380
-
381
- The workflow library itself uses this feature to tweak the graphical
382
- representation of the workflow. See below.
383
-
384
-
385
348
  ### Conditional event transitions
386
349
 
387
350
  Conditions can be a "method name symbol" with a corresponding instance method, a `proc` or `lambda` which are added to events, like so:
@@ -407,6 +370,8 @@ When calling a `device.can_<fire_event>?` check, or attempting a `device.<event>
407
370
  * If an `:if` check is present, proceed if it evaluates to true, or drop to the next event.
408
371
  * If you've run out of events to check (eg. `battery_level == 0`), then the transition isn't possible.
409
372
 
373
+ You can also pass additional arguments, which can be evaluated by :if methods or procs. See examples in
374
+ link:test/conditionals_test.rb#L45[conditionals_test.rb]
410
375
 
411
376
  ### Advanced transition hooks
412
377
 
@@ -487,11 +452,60 @@ The whole event sequence is as follows:
487
452
  * event specific action
488
453
  * on_transition (if action did not halt)
489
454
  * on_exit
490
- * PERSIST WORKFLOW STATE, i.e. transition
455
+ * PERSIST WORKFLOW STATE (i.e. transition) or on_error
491
456
  * on_entry
492
457
  * after_transition
493
458
 
494
459
 
460
+ ### Accessing your workflow specification
461
+
462
+ You can easily reflect on workflow specification programmatically - for
463
+ the whole class or for the current object. Examples:
464
+
465
+ ```rb
466
+ article2.current_state.events # lists possible events from here
467
+ article2.current_state.events[:reject].transitions_to # => :rejected
468
+
469
+ Article.workflow_spec.states.keys
470
+ #=> [:rejected, :awaiting_review, :being_reviewed, :accepted, :new]
471
+
472
+ Article.workflow_spec.state_names
473
+ #=> [:rejected, :awaiting_review, :being_reviewed, :accepted, :new]
474
+
475
+ # list all events for all states
476
+ Article.workflow_spec.states.values.collect &:events
477
+ ```
478
+
479
+ You can also store and later retrieve additional meta data for every
480
+ state and every event:
481
+
482
+ ```rb
483
+ class MyProcess
484
+ include Workflow
485
+ workflow do
486
+ state :main, :meta => {:importance => 8}
487
+ state :supplemental, :meta => {:importance => 1}
488
+ end
489
+ end
490
+ puts MyProcess.workflow_spec.states[:supplemental].meta[:importance] # => 1
491
+ ```
492
+
493
+ The workflow library itself uses this feature to tweak the graphical
494
+ representation of the workflow. See below.
495
+
496
+
497
+ ### Defining workflow dynamically from JSON
498
+
499
+ For an advance example please see
500
+ link:https://github.com/geekq/workflow/blob/develop/test/workflow_from_json_test.rb[workflow_from_json_test.rb].
501
+
502
+
503
+ ### Compose workflow definition with `include`
504
+
505
+ In case you have very extensive workflow definition or would like to reuse
506
+ workflow definition for different classes, you can include parts like in
507
+ the link:https://github.com/geekq/workflow/blob/develop/test/main_test.rb#L95-L110[`including a child workflow definition` example].
508
+
495
509
  Documenting with diagrams
496
510
  -------------------------
497
511
 
@@ -513,11 +527,17 @@ end
513
527
  Changelog
514
528
  ---------
515
529
 
530
+ === New in the version 3.1.0
531
+
532
+ * link:https://github.com/geekq/workflow/pull/227[#227] Allow event arguments to be taken into account when selecting the event
533
+ * link:https://github.com/geekq/workflow/pull/232[#232] Add ability to include partial workflow definitions for composability
534
+ * link:https://github.com/geekq/workflow/pull/241[#241] Example for defining workflow dynamically from JSON
535
+
516
536
  === New in the version 3.0.0
517
537
 
518
- * gh-228 Support for Ruby 3 keyword args, provided by @agirling
538
+ * link:https://github.com/geekq/workflow/pull/228[#228] Support for Ruby 3 keyword args, provided by @agirling
519
539
  * retire Ruby 2.6 since it has reached end of live; please use workflow 2.x, if you still depend on that Ruby version
520
- * gh-229 Switch from travis CI to GihHub actions for continuous integration
540
+ * link:https://github.com/geekq/workflow/pull/229[#229] Switch from travis CI to GihHub actions for continuous integration
521
541
 
522
542
  ### New in the versions 2.x
523
543
 
@@ -543,6 +563,11 @@ bundle install
543
563
  bundle exec rake test
544
564
  ```
545
565
 
566
+ ### Check list for you pull request
567
+
568
+ * [ ] unit tests for the new behavior provided: new tests fail without you change, all tests succeed with your change
569
+ * [ ] documentation update included
570
+
546
571
  ### Other 3rd party libraries
547
572
 
548
573
  https://github.com/kwent/active_admin-workflow[ActiveAdmin-Workflow] - is an
@@ -552,7 +577,7 @@ integration with https://github.com/activeadmin/activeadmin[ActiveAdmin].
552
577
 
553
578
  Author: Vladimir Dobriakov, <https://infrastructure-as-code.de>
554
579
 
555
- Copyright (c) 2010-2022 Vladimir Dobriakov and Contributors
580
+ Copyright (c) 2010-2024 Vladimir Dobriakov and Contributors
556
581
 
557
582
  Copyright (c) 2008-2009 Vodafone
558
583
 
@@ -561,4 +586,3 @@ Copyright (c) 2007-2008 Ryan Allen, FlashDen Pty Ltd
561
586
  Based on the work of Ryan Allen and Scott Barron
562
587
 
563
588
  Licensed under MIT license, see the MIT-LICENSE file.
564
-
@@ -15,12 +15,22 @@ module Workflow
15
15
  end
16
16
  end
17
17
 
18
- def condition_applicable?(object)
18
+ def condition_applicable?(object, event_arguments)
19
19
  if condition
20
20
  if condition.is_a?(Symbol)
21
- object.send(condition)
21
+ m = object.method(condition)
22
+ # Conditionals can now take the arguments of the trasition action into account #227
23
+ # But in case the current conditional wants to ignore any event_argument on its decision -
24
+ # does not accept parameters, also support that.
25
+ if m.arity == 0 # no additional parameters accepted
26
+ object.send(condition)
27
+ else
28
+ object.send(condition, *event_arguments)
29
+ end
22
30
  else
23
- condition.call(object)
31
+ # since blocks can ignore extra arguments without raising an error in Ruby,
32
+ # no `if` is needed - compare with `arity` switch in above methods handling
33
+ condition.call(object, *event_arguments)
24
34
  end
25
35
  else
26
36
  true
@@ -26,9 +26,9 @@ module Workflow
26
26
  end
27
27
  end
28
28
 
29
- def first_applicable(name, object_context)
29
+ def first_applicable(name, object_context, event_arguments)
30
30
  (self[name] || []).detect do |event|
31
- event.condition_applicable?(object_context) && event
31
+ event.condition_applicable?(object_context, event_arguments) && event
32
32
  end
33
33
  end
34
34
 
@@ -20,6 +20,10 @@ module Workflow
20
20
 
21
21
  private
22
22
 
23
+ def include(proc)
24
+ instance_eval(&proc)
25
+ end
26
+
23
27
  def state(name, meta = {:meta => {}}, &events_and_etc)
24
28
  # meta[:meta] to keep the API consistent..., gah
25
29
  new_state = Workflow::State.new(name, self, meta[:meta])
@@ -1,3 +1,3 @@
1
1
  module Workflow
2
- VERSION = "3.0.0"
2
+ VERSION = "3.1.0.pre"
3
3
  end
data/lib/workflow.rb CHANGED
@@ -65,8 +65,8 @@ module Workflow
65
65
  process_event!(event_name, *args, **kwargs)
66
66
  end
67
67
 
68
- define_method "can_#{event_name}?" do
69
- return !!current_state.events.first_applicable(event_name, self)
68
+ define_method "can_#{event_name}?".to_sym do |*args, **kwargs|
69
+ return !!current_state.events.first_applicable(event_name, self, args)
70
70
  end
71
71
  end
72
72
  end
@@ -95,7 +95,7 @@ module Workflow
95
95
  end
96
96
 
97
97
  def process_event!(name, *args, **kwargs)
98
- event = current_state.events.first_applicable(name, self)
98
+ event = current_state.events.first_applicable(name, self, args)
99
99
  raise NoTransitionAllowed.new(
100
100
  "There is no event #{name.to_sym} defined for the #{current_state} state") \
101
101
  if event.nil?
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: 3.0.0
4
+ version: 3.1.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dobriakov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-29 00:00:00.000000000 Z
11
+ date: 2024-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -16,70 +16,70 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '6.1'
19
+ version: '6.4'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '6.1'
26
+ version: '6.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
33
+ version: '2.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.0'
40
+ version: '2.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mocha
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.8'
47
+ version: '2.2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.8'
54
+ version: '2.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '12.3'
61
+ version: '13.1'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '12.3'
68
+ version: '13.1'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: minitest
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '5.11'
75
+ version: '5.21'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '5.11'
82
+ version: '5.21'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: ruby-graphviz
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -122,7 +122,7 @@ homepage: https://github.com/geekq/workflow
122
122
  licenses:
123
123
  - MIT
124
124
  metadata: {}
125
- post_install_message:
125
+ post_install_message:
126
126
  rdoc_options: []
127
127
  require_paths:
128
128
  - lib
@@ -133,12 +133,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
133
133
  version: '2.7'
134
134
  required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - ">"
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: 1.3.1
139
139
  requirements: []
140
- rubygems_version: 3.1.2
141
- signing_key:
140
+ rubygems_version: 3.3.7
141
+ signing_key:
142
142
  specification_version: 4
143
143
  summary: A replacement for acts_as_state_machine.
144
144
  test_files: []