state_machine_ext 0.2.1

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/README.rdoc ADDED
@@ -0,0 +1,61 @@
1
+ = state_machine extensions
2
+ state_machine_ext is an extension of the state_machine[https://github.com/pluginaweek/state_machine] gem.
3
+
4
+ == Install
5
+ gem install state_machine_ext
6
+
7
+ == Usage
8
+ This gem adds state groups functionality and method to find all possible transitions from a state.
9
+ Below is an example of the features offered:
10
+
11
+ === Class definition
12
+
13
+ class Order
14
+ state_machine :initial => :not_selected do
15
+ event :choose do
16
+ transition :not_selected => :selected
17
+ end
18
+ event :add_to_basket do
19
+ transition :selected => :in_basket
20
+ end
21
+ event :pay do
22
+ transition :in_basket => :paid
23
+ end
24
+ event :to_send do
25
+ transition :paid => :sent
26
+ end
27
+
28
+ #initialize groups of the states
29
+ group :not_paid do
30
+ state :not_selected
31
+ state :selected
32
+ state :in_basket
33
+ end
34
+ group :in_progress do
35
+ state :paid, :sent
36
+ end
37
+ end
38
+ end
39
+
40
+ === Using extensions
41
+
42
+ order = Order.new
43
+ # returns the array of all the states which we can reach from the current one
44
+ order.state_all_transitions #=> [:sent, :paid, :in_basket, :selected]
45
+ # same for the particular state
46
+ order.state_all_transitions(:in_basket) #=> [:sent, :paid]
47
+ # check whether a group includes some state
48
+ order.group(:not_paid).include?(:selected) #=> true
49
+ # find groups to which belongs a state
50
+ order.find_group(:paid) #=> [:in_progress]
51
+
52
+
53
+ == Credits
54
+
55
+ === Project Team
56
+ * Mykhaylo Sorochan - Project Manager
57
+ * Dmitriy Landberg - Software Developer
58
+ * Nataliya Shatokhina - Tester
59
+ * Sergey Mostovoy - Extension idea
60
+
61
+ Copyright (c) 2010 {Sphere Consulting Inc.}[http://www.sphereinc.com], released under the MIT license (see LICENSE).
data/lib/group.rb ADDED
@@ -0,0 +1,36 @@
1
+ module StateMachineExt
2
+
3
+ class InvalidState < StandardError
4
+ end
5
+
6
+ class Group
7
+
8
+ attr_accessor :name
9
+
10
+ def initialize(name, parent)
11
+ @machine = parent
12
+ @name = name
13
+ @group_states = []
14
+ end
15
+
16
+ def state(*args)
17
+ args.each do |arg|
18
+ is_include = false
19
+ @machine.states.each do |state|
20
+ if state.name == arg
21
+ @group_states << state
22
+ is_include = true
23
+ end
24
+ end
25
+ raise InvalidState, "\"#{arg}\" is an unknown state machine state" unless is_include
26
+ end
27
+ end
28
+
29
+ def include?(state)
30
+ group_state = @group_states.detect {|item| item.name == state}
31
+ group_state.nil? ? false : true
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,89 @@
1
+ $:.unshift(File.expand_path(File.dirname(__FILE__) + "/../"))
2
+ require 'rubygems'
3
+ require 'state_machine'
4
+ require 'lib/group'
5
+
6
+ module StateMachineExt
7
+
8
+ class InvalidGroup < StandardError
9
+ end
10
+
11
+ def self.included(base)
12
+ base.class_eval do
13
+
14
+ def group(name, &block)
15
+ @groups = [] if @groups.nil?
16
+ group = @groups.detect {|item| item.name == name}
17
+ @groups << group = Group.new(name,self) if group.nil?
18
+ group.instance_eval(&block) if block
19
+ end
20
+
21
+ attr_accessor :groups
22
+ alias_method :define_event_helpers_original, :define_event_helpers
23
+
24
+ def define_event_helpers
25
+ define_event_helpers_original
26
+
27
+ # Define the method that returns the group with the given name
28
+ define_instance_method(:group) do |machine, object, request_group|
29
+ group = nil
30
+ group = @groups.detect {|item| item.name == request_group}
31
+ if group.nil?
32
+ raise InvalidGroup, "\"#{request_group}\" is an unknown state machine group"
33
+ end
34
+
35
+ group
36
+ end
37
+
38
+ # Define the method that returns the state machine's group for the given
39
+ # state
40
+ define_instance_method(:find_group) do |machine, object, request_state|
41
+ @groups.inject([]) do |res,group|
42
+ res << group.name if group.include?(request_state.to_sym)
43
+ res
44
+ end
45
+ end
46
+
47
+ #Define the method that returns all states which can be reached
48
+ #from the given one
49
+ define_instance_method(attribute(:all_transitions)) do |machine, object, *args|
50
+ next_transitions = []
51
+ request_state = []
52
+
53
+ transitions = return_transition(next_transitions, request_state, machine, object, *args)
54
+
55
+ transitions.inject([]) do |res,trans|
56
+ res << trans.to_name unless trans.is_a?(Array)
57
+ res.uniq
58
+ end
59
+ end
60
+ end
61
+
62
+ def return_transition(next_transitions, request_state, machine, object, *args)
63
+ state = args.empty? ? object.state_name : args.first
64
+ request_state << state
65
+
66
+ *args = {:from => args.first} unless args.empty?
67
+ transitions = machine.events.transitions_for(object, *args)
68
+
69
+ transitions.each do |transition|
70
+ unless request_state.include?(transition.to_name)
71
+ next_transition =
72
+ return_transition(next_transitions, request_state,
73
+ machine, object, transition.to_name)
74
+ next_transitions << next_transition unless next_transition.empty?
75
+ end
76
+ next_transitions << transition
77
+ end
78
+
79
+ next_transitions
80
+ end
81
+ private :return_transition
82
+ end
83
+ end
84
+
85
+ end
86
+
87
+ class StateMachine::Machine
88
+ include StateMachineExt
89
+ end
@@ -0,0 +1 @@
1
+ file.reference.ExtendedStateMachine-lib=/mnt/hgfs/server/ExtendedStateMachine/lib
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project-private xmlns="http://www.netbeans.org/ns/project-private/1">
3
+ <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
4
+ </project-private>
@@ -0,0 +1,4 @@
1
+ main.file=
2
+ platform.active=Ruby_1
3
+ source.encoding=UTF-8
4
+ src.dir=${file.reference.ExtendedStateMachine-lib}
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://www.netbeans.org/ns/project/1">
3
+ <type>org.netbeans.modules.ruby.rubyproject</type>
4
+ <configuration>
5
+ <data xmlns="http://www.netbeans.org/ns/ruby-project/1">
6
+ <name>ExStateMachine</name>
7
+ <source-roots>
8
+ <root id="src.dir"/>
9
+ </source-roots>
10
+ <test-roots/>
11
+ </data>
12
+ </configuration>
13
+ </project>
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: state_machine_ext
3
+ version: !ruby/object:Gem::Version
4
+ hash: 21
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 1
10
+ version: 0.2.1
11
+ platform: ruby
12
+ authors:
13
+ - Sphere Consulting Inc.
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-08 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: state_machine
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 51
30
+ segments:
31
+ - 0
32
+ - 9
33
+ - 4
34
+ version: 0.9.4
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ description: " Extensions for the state_machine gem\n"
38
+ email:
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files: []
44
+
45
+ files:
46
+ - lib/group.rb
47
+ - lib/state_machine_ext.rb
48
+ - nbproject/private/private.properties
49
+ - nbproject/private/private.xml
50
+ - nbproject/project.properties
51
+ - nbproject/project.xml
52
+ - README.rdoc
53
+ has_rdoc: true
54
+ homepage: https://github.com/SphereConsultingInc/state_machine_ext/
55
+ licenses: []
56
+
57
+ post_install_message:
58
+ rdoc_options: []
59
+
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ hash: 57
68
+ segments:
69
+ - 1
70
+ - 8
71
+ - 7
72
+ version: 1.8.7
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 23
79
+ segments:
80
+ - 1
81
+ - 3
82
+ - 6
83
+ version: 1.3.6
84
+ requirements: []
85
+
86
+ rubyforge_project:
87
+ rubygems_version: 1.3.7
88
+ signing_key:
89
+ specification_version: 3
90
+ summary: Extensions for the state_machine gem
91
+ test_files: []
92
+