simple_states 0.1.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
data/Gemfile.lock CHANGED
@@ -1,23 +1,23 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_states (0.1.0.pre3)
4
+ simple_states (0.1.1)
5
5
  activesupport
6
6
  hashr (~> 0.0.10)
7
7
 
8
8
  GEM
9
- remote: http://rubygems.org/
9
+ remote: https://rubygems.org/
10
10
  specs:
11
- activesupport (3.2.3)
12
- i18n (~> 0.6)
11
+ activesupport (3.2.13)
12
+ i18n (= 0.6.1)
13
13
  multi_json (~> 1.0)
14
- hashr (0.0.21)
15
- i18n (0.6.0)
14
+ hashr (0.0.22)
15
+ i18n (0.6.1)
16
16
  metaclass (0.0.1)
17
- mocha (0.11.3)
17
+ mocha (0.14.0)
18
18
  metaclass (~> 0.0.1)
19
- multi_json (1.3.4)
20
- rake (0.9.2.2)
19
+ multi_json (1.7.3)
20
+ rake (0.9.6)
21
21
  test_declarative (0.0.5)
22
22
 
23
23
  PLATFORMS
@@ -24,10 +24,11 @@ module SimpleStates
24
24
 
25
25
  raise_invalid_transition(object) unless can_transition?(object)
26
26
  run_callbacks(object, :before, args)
27
+ set_state(object)
27
28
 
28
29
  yield.tap do
29
- set_state(object)
30
30
  run_callbacks(object, :after, args)
31
+ raise_unknown_target_state(object) unless known_target_state?(object)
31
32
  object.save! if @saving
32
33
  end
33
34
  end
@@ -48,26 +49,23 @@ module SimpleStates
48
49
  end
49
50
 
50
51
  def can_transition?(object)
51
- !options.from || object.state && Array(options.from).include?(object.state)
52
+ !options.from || object.state && Array(options.from).include?(object.state.to_sym)
52
53
  end
53
54
 
54
55
  def run_callbacks(object, type, args)
56
+ object.save! if @saving
55
57
  send_methods(object, options.send(type), args)
56
58
  end
57
59
 
58
60
  def set_state(object)
59
- if state = target_state(object)
60
- object.past_states << object.state if object.state
61
- object.state = state.to_sym
62
- object.send(:"#{state}_at=", now) if object.respond_to?(:"#{state}_at=") && object.respond_to?(:"#{state}_at") && object.send(:"#{state}_at").nil?
63
- object.save! if @saving
64
- end
61
+ state = target_state
62
+ object.past_states << object.state if object.state
63
+ object.state = state.to_sym
64
+ object.send(:"#{state}_at=", now) if object.respond_to?(:"#{state}_at=") && object.respond_to?(:"#{state}_at") && object.send(:"#{state}_at").nil?
65
65
  end
66
66
 
67
- def target_state(object)
68
- options.to || :"#{name}ed".tap do |state|
69
- raise_unknown_target_state(object) unless object.class.states.include?(state)
70
- end
67
+ def target_state
68
+ options.to || :"#{name}ed"
71
69
  end
72
70
 
73
71
  def send_methods(object, methods, args)
@@ -88,12 +86,16 @@ module SimpleStates
88
86
  Time.respond_to?(:zone) && Time.zone ? Time.zone.now : Time.now.utc
89
87
  end
90
88
 
89
+ def known_target_state?(object)
90
+ object.state && object.class.states.include?(object.state.to_sym)
91
+ end
92
+
91
93
  def raise_invalid_transition(object)
92
94
  raise TransitionException, "#{object.inspect} can not receive event #{name.inspect} while in state #{object.state.inspect}."
93
95
  end
94
96
 
95
97
  def raise_unknown_target_state(object)
96
- raise TransitionException, "can not find target state for #{object.inspect} for event #{name.inspect}."
98
+ raise TransitionException, "unknown target state #{object.state.inspect} for #{object.inspect} for event #{name.inspect}. known states are #{object.class.states.inspect}"
97
99
  end
98
100
  end
99
101
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleStates
2
- VERSION = '0.1.1'
2
+ VERSION = '1.0.0'
3
3
  end
data/lib/simple_states.rb CHANGED
@@ -1,6 +1,3 @@
1
- require 'active_support/concern'
2
- require 'active_support/core_ext/class/attribute'
3
- require 'active_support/core_ext/kernel/singleton_class'
4
1
  require 'active_support/core_ext/object/try'
5
2
 
6
3
  module SimpleStates
@@ -9,16 +6,21 @@ module SimpleStates
9
6
  autoload :Event, 'simple_states/event'
10
7
  autoload :States, 'simple_states/states'
11
8
 
12
- extend ActiveSupport::Concern
13
-
14
- included do
15
- class_attribute :state_names, :initial_state, :events
16
- after_initialize :init_state if respond_to?(:after_initialize)
17
- self.initial_state = :created
18
- self.events = []
9
+ def self.included(base)
10
+ base.extend SimpleStates::ClassMethods
11
+ # Add class level attribute accessors
12
+ added_class_accessors = [ :state_names, :initial_state, :events ]
13
+ base.singleton_class.send :attr_accessor, *added_class_accessors
14
+ base.public_class_method *added_class_accessors
15
+ base.public_class_method *added_class_accessors.map{|att| "#{att}=".to_sym }
16
+ # default states
17
+ base.after_initialize :init_state if base.respond_to?(:after_initialize)
18
+ base.initial_state = :created
19
+ base.events = []
19
20
  end
20
21
 
21
22
  module ClassMethods
23
+
22
24
  def new(*)
23
25
  super.tap { |object| States.init(object) }
24
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_states
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
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: 2012-04-30 00:00:00.000000000 Z
12
+ date: 2013-05-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70324948858120 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70324948858120
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: hashr
27
- requirement: &70324948857460 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 0.0.10
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70324948857460
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.0.10
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rake
38
- requirement: &70324948856640 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 0.9.2
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70324948856640
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.2
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: test_declarative
49
- requirement: &70324948855800 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70324948855800
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: mocha
60
- requirement: &70324948854880 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,7 +85,12 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70324948854880
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  description: ! '[description]'
70
95
  email: svenfuchs@artweb-design.de
71
96
  executables: []
@@ -102,8 +127,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
127
  version: '0'
103
128
  requirements: []
104
129
  rubyforge_project: ! '[none]'
105
- rubygems_version: 1.8.11
130
+ rubygems_version: 1.8.23
106
131
  signing_key:
107
132
  specification_version: 3
108
133
  summary: ! '[summary]'
109
134
  test_files: []
135
+ has_rdoc: