simple_states 1.0.2 → 1.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 +4 -4
- data/Gemfile +3 -10
- data/Gemfile.lock +16 -16
- data/lib/simple_states.rb +29 -30
- data/lib/simple_states/event.rb +19 -8
- data/lib/simple_states/states.rb +30 -20
- data/lib/simple_states/version.rb +1 -1
- data/simple_states.gemspec +26 -0
- metadata +16 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 441bc5305dd74b7fcf14cd4cd9c65bdfdf1b2a57
|
4
|
+
data.tar.gz: 398464da79ae54350d267a57cfc42a1bfd567fbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79e01af136e6dc890c3cc94ea9971d78f34fd8ba4332a3afb6a62a333a956b835cc87c463d9ae1065f47961403ccd14964448e50a3dd79a88846175a02887d7a
|
7
|
+
data.tar.gz: 87d6031b6fd68f2e6c8c010fadf7d9130af544661e2ecb3df9eb6051cfa1c26a9f675fca4589b6737e21138f6935c070d470bb5fa9b7fe62163ea9ffcf8235c2
|
data/Gemfile
CHANGED
@@ -2,13 +2,6 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
# gem 'ruby-debug'
|
9
|
-
# end
|
10
|
-
#
|
11
|
-
# platforms :mri_19 do
|
12
|
-
# gem 'ruby-debug19', :platforms => :mri_19 unless RUBY_VERSION == '1.9.3'
|
13
|
-
# end
|
14
|
-
# end
|
5
|
+
group :test do
|
6
|
+
gem 'minitest'
|
7
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
simple_states (1.0.
|
4
|
+
simple_states (1.0.1)
|
5
5
|
activesupport
|
6
|
+
hashr (~> 0.0.10)
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: https://rubygems.org/
|
9
10
|
specs:
|
10
|
-
activesupport (
|
11
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
11
|
+
activesupport (4.2.4)
|
12
12
|
i18n (~> 0.7)
|
13
|
+
json (~> 1.7, >= 1.7.7)
|
13
14
|
minitest (~> 5.1)
|
15
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
14
16
|
tzinfo (~> 1.1)
|
15
|
-
|
16
|
-
i18n (0.
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
hashr (0.0.22)
|
18
|
+
i18n (0.7.0)
|
19
|
+
json (1.8.3)
|
20
|
+
json (1.8.3-java)
|
21
|
+
metaclass (0.0.1)
|
22
|
+
minitest (5.8.0)
|
23
|
+
mocha (0.14.0)
|
20
24
|
metaclass (~> 0.0.1)
|
21
|
-
power_assert (1.0.1)
|
22
25
|
rake (0.9.6)
|
23
|
-
test-unit (3.2.3)
|
24
|
-
power_assert
|
25
26
|
test_declarative (0.0.5)
|
26
|
-
thread_safe (0.3.
|
27
|
+
thread_safe (0.3.5)
|
28
|
+
thread_safe (0.3.5-java)
|
27
29
|
tzinfo (1.2.2)
|
28
30
|
thread_safe (~> 0.1)
|
29
31
|
|
30
32
|
PLATFORMS
|
33
|
+
java
|
31
34
|
ruby
|
32
35
|
|
33
36
|
DEPENDENCIES
|
37
|
+
minitest
|
34
38
|
mocha
|
35
39
|
rake (~> 0.9.2)
|
36
40
|
simple_states!
|
37
|
-
test-unit
|
38
41
|
test_declarative
|
39
|
-
|
40
|
-
BUNDLED WITH
|
41
|
-
1.14.5
|
data/lib/simple_states.rb
CHANGED
@@ -6,21 +6,28 @@ module SimpleStates
|
|
6
6
|
autoload :Event, 'simple_states/event'
|
7
7
|
autoload :States, 'simple_states/states'
|
8
8
|
|
9
|
-
|
10
|
-
base
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
9
|
+
class << self
|
10
|
+
def included(base)
|
11
|
+
base.extend(SimpleStates::ClassMethods)
|
12
|
+
define_accessors(base, :state_names, :state_options, :initial_state, :events)
|
13
|
+
set_defaults(base)
|
14
|
+
end
|
15
|
+
|
16
|
+
def define_accessors(base, *names)
|
17
|
+
base.singleton_class.send(:attr_accessor, *names)
|
18
|
+
base.public_class_method(*names + names.map { |name| "#{name}=".to_sym })
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_defaults(base)
|
22
|
+
base.after_initialize(:init_state) if base.respond_to?(:after_initialize)
|
23
|
+
base.initial_state = :created
|
24
|
+
base.state_names = []
|
25
|
+
base.state_options = {}
|
26
|
+
base.events = []
|
27
|
+
end
|
20
28
|
end
|
21
29
|
|
22
30
|
module ClassMethods
|
23
|
-
|
24
31
|
def new(*)
|
25
32
|
super.tap { |object| States.init(object) }
|
26
33
|
end
|
@@ -30,23 +37,24 @@ module SimpleStates
|
|
30
37
|
end
|
31
38
|
|
32
39
|
def states(*args)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
self.initial_state = options[:initial].to_sym if options.key?(:initial)
|
38
|
-
add_states(*[self.initial_state].concat(args))
|
39
|
-
end
|
40
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
41
|
+
self.initial_state = options.delete(:initial).to_sym if options.key?(:initial)
|
42
|
+
self.state_options = options
|
43
|
+
add_states(*[self.initial_state].concat(args))
|
40
44
|
end
|
41
45
|
|
42
|
-
def add_states(*
|
43
|
-
self.state_names =
|
46
|
+
def add_states(*names)
|
47
|
+
self.state_names = self.state_names.concat(names.compact.map(&:to_sym)).uniq
|
44
48
|
end
|
45
49
|
|
46
50
|
def event(name, options = {})
|
47
51
|
add_states(options[:to], *options[:from])
|
48
52
|
self.events += [Event.new(name, options)]
|
49
53
|
end
|
54
|
+
|
55
|
+
def states_module
|
56
|
+
const_defined?(*args) ? self::StatesProxy : const_set(:StatesProxy, Module.new)
|
57
|
+
end
|
50
58
|
end
|
51
59
|
|
52
60
|
attr_reader :past_states
|
@@ -66,13 +74,4 @@ module SimpleStates
|
|
66
74
|
def was_state?(state)
|
67
75
|
past_states.concat([self.state.try(:to_sym)]).compact.include?(state.to_sym)
|
68
76
|
end
|
69
|
-
|
70
|
-
def respond_to?(method, include_private = false)
|
71
|
-
method.to_s =~ /(was_|^)(#{self.class.states.join('|')})\?$/ && self.class.state_names.include?($2.to_sym) || super
|
72
|
-
end
|
73
|
-
|
74
|
-
def method_missing(method, *args, &block)
|
75
|
-
method.to_s =~ /(was_|^)(#{self.class.states.join('|')})\?$/ ? send(:"#{$1}state?", $2, *args) : super
|
76
|
-
end
|
77
77
|
end
|
78
|
-
|
data/lib/simple_states/event.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/core_ext/module/delegation'
|
2
|
+
require 'hashr'
|
2
3
|
|
3
4
|
module SimpleStates
|
4
5
|
class Event
|
@@ -6,7 +7,11 @@ module SimpleStates
|
|
6
7
|
|
7
8
|
def initialize(name, options = {})
|
8
9
|
@name = name
|
9
|
-
@options = options
|
10
|
+
@options = Hashr.new(options) do
|
11
|
+
def except
|
12
|
+
self[:except]
|
13
|
+
end
|
14
|
+
end
|
10
15
|
end
|
11
16
|
|
12
17
|
def saving
|
@@ -40,29 +45,35 @@ module SimpleStates
|
|
40
45
|
|
41
46
|
def skip?(object, args)
|
42
47
|
result = false
|
43
|
-
result ||= !send_methods(object, options
|
44
|
-
result ||= send_methods(object, options
|
48
|
+
result ||= !send_methods(object, options.if, args) if options.if?
|
49
|
+
result ||= send_methods(object, options.unless, args) if options.unless?
|
45
50
|
result
|
46
51
|
end
|
47
52
|
|
48
53
|
def can_transition?(object)
|
49
|
-
!options
|
54
|
+
!options.from || object.state && Array(options.from).include?(object.state.to_sym)
|
50
55
|
end
|
51
56
|
|
52
57
|
def run_callbacks(object, type, args)
|
53
58
|
object.save! if @saving
|
54
|
-
send_methods(object, options
|
59
|
+
send_methods(object, options.send(type), args)
|
55
60
|
end
|
56
61
|
|
57
62
|
def set_state(object)
|
58
63
|
state = target_state
|
59
64
|
object.past_states << object.state if object.state
|
60
|
-
object.state = state.to_sym
|
65
|
+
object.state = state.to_sym if set_state?(object, state)
|
61
66
|
object.send(:"#{state}_at=", now) if object.respond_to?(:"#{state}_at=") && object.respond_to?(:"#{state}_at") && object.send(:"#{state}_at").nil?
|
62
67
|
end
|
63
68
|
|
69
|
+
def set_state?(object, state)
|
70
|
+
return true unless object.class.state_options[:ordered]
|
71
|
+
states = object.class.state_names
|
72
|
+
states.index(object.state.try(:to_sym)) < states.index(state)
|
73
|
+
end
|
74
|
+
|
64
75
|
def target_state
|
65
|
-
options
|
76
|
+
options.to || :"#{name}ed"
|
66
77
|
end
|
67
78
|
|
68
79
|
def send_methods(object, methods, args)
|
@@ -84,7 +95,7 @@ module SimpleStates
|
|
84
95
|
end
|
85
96
|
|
86
97
|
def known_target_state?(object)
|
87
|
-
object.state && object.class.
|
98
|
+
object.state && object.class.state_names.include?(object.state.to_sym)
|
88
99
|
end
|
89
100
|
|
90
101
|
def raise_invalid_transition(object)
|
data/lib/simple_states/states.rb
CHANGED
@@ -2,46 +2,55 @@ module SimpleStates
|
|
2
2
|
class States < Module
|
3
3
|
class << self
|
4
4
|
def init(object)
|
5
|
-
object.
|
5
|
+
object.class.state_names = [object.class.initial_state] if object.class.state_names.empty?
|
6
|
+
respond_to?(:prepend) ? prepend_module(object.class) : include_module(object)
|
6
7
|
object.init_state unless object.singleton_class.respond_to?(:after_initialize)
|
7
8
|
end
|
8
9
|
|
9
|
-
def
|
10
|
-
|
11
|
-
klass.const_defined?(*args) ? klass::StatesProxy : klass.const_set(:StatesProxy, new(klass.events))
|
10
|
+
def prepend_module(const)
|
11
|
+
const.prepend(module_for(const)) unless const.const_defined?(:StatesProxy)
|
12
12
|
end
|
13
|
-
end
|
14
|
-
|
15
|
-
attr_reader :events
|
16
13
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
14
|
+
def include_module(object)
|
15
|
+
object.singleton_class.send(:include, module_for(object.class))
|
16
|
+
end
|
21
17
|
|
22
|
-
|
18
|
+
def module_for(const)
|
19
|
+
args = [:StatesProxy].concat(const.method(:const_defined?).arity != 1 ? [false] : [])
|
20
|
+
const.const_defined?(*args) ? const::StatesProxy : const.const_set(:StatesProxy, create_module(const))
|
21
|
+
end
|
23
22
|
|
24
|
-
def
|
25
|
-
|
26
|
-
define_event(event)
|
23
|
+
def create_module(const)
|
24
|
+
new.tap do |mod|
|
25
|
+
merge_events(const.events).each { |event| define_event(mod, event) }
|
26
|
+
const.state_names.each { |name| define_state(mod, name) }
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
define_method(event.name) do |*args|
|
30
|
+
def define_event(const, event)
|
31
|
+
const.send(:define_method, event.name) do |*args|
|
33
32
|
event.send(:call, self, *args) do
|
34
|
-
super(*args) if
|
33
|
+
super(*args) if defined?(super)
|
35
34
|
end
|
36
35
|
end
|
37
36
|
|
38
|
-
|
37
|
+
const.send(:define_method, :"#{event.name}!") do |*args|
|
39
38
|
event.saving do
|
40
39
|
send(event.name, *args)
|
41
40
|
end
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
44
|
+
def define_state(const, state)
|
45
|
+
const.send(:define_method, :"#{state}?") do |*args|
|
46
|
+
defined?(super) ? super() : state?(state, *args)
|
47
|
+
end
|
48
|
+
|
49
|
+
const.send(:define_method, :"was_#{state}?") do |*args|
|
50
|
+
defined?(super) ? super() : was_state?(state, *args)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
45
54
|
def merge_events(events)
|
46
55
|
if merge_ix = events.index { |event| event.name == :all }
|
47
56
|
merge = events.slice!(merge_ix)
|
@@ -53,5 +62,6 @@ module SimpleStates
|
|
53
62
|
events
|
54
63
|
end
|
55
64
|
end
|
65
|
+
end
|
56
66
|
end
|
57
67
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require 'simple_states/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "simple_states"
|
8
|
+
s.version = SimpleStates::VERSION
|
9
|
+
s.authors = ["Sven Fuchs"]
|
10
|
+
s.email = "svenfuchs@artweb-design.de"
|
11
|
+
s.homepage = "https://github.com/svenfuchs/simple_states"
|
12
|
+
s.summary = "[summary]"
|
13
|
+
s.description = "[description]"
|
14
|
+
|
15
|
+
s.files = Dir.glob("{lib/**/*,[A-Z]*}")
|
16
|
+
s.platform = Gem::Platform::RUBY
|
17
|
+
s.require_path = 'lib'
|
18
|
+
s.rubyforge_project = '[none]'
|
19
|
+
|
20
|
+
s.add_dependency 'activesupport'
|
21
|
+
s.add_dependency 'hashr', '~> 0.0.10'
|
22
|
+
|
23
|
+
s.add_development_dependency 'rake', '~> 0.9.2'
|
24
|
+
s.add_development_dependency 'test_declarative'
|
25
|
+
s.add_development_dependency 'mocha'
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_states
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.1.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sven Fuchs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -25,33 +25,33 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: hashr
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
34
|
-
type: :
|
33
|
+
version: 0.0.10
|
34
|
+
type: :runtime
|
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: 0.
|
40
|
+
version: 0.0.10
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.9.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:
|
54
|
+
version: 0.9.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: test_declarative
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- lib/simple_states/event.rb
|
97
97
|
- lib/simple_states/states.rb
|
98
98
|
- lib/simple_states/version.rb
|
99
|
+
- simple_states.gemspec
|
99
100
|
homepage: https://github.com/svenfuchs/simple_states
|
100
101
|
licenses: []
|
101
102
|
metadata: {}
|
@@ -110,13 +111,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
110
111
|
version: '0'
|
111
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
113
|
requirements:
|
113
|
-
- - "
|
114
|
+
- - ">"
|
114
115
|
- !ruby/object:Gem::Version
|
115
|
-
version:
|
116
|
+
version: 1.3.1
|
116
117
|
requirements: []
|
117
118
|
rubyforge_project: "[none]"
|
118
|
-
rubygems_version: 2.5
|
119
|
+
rubygems_version: 2.4.5
|
119
120
|
signing_key:
|
120
121
|
specification_version: 4
|
121
122
|
summary: "[summary]"
|
122
123
|
test_files: []
|
124
|
+
has_rdoc:
|