simple_states 1.1.0.pre → 1.1.0.rc1

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
  SHA1:
3
- metadata.gz: 441bc5305dd74b7fcf14cd4cd9c65bdfdf1b2a57
4
- data.tar.gz: 398464da79ae54350d267a57cfc42a1bfd567fbb
3
+ metadata.gz: b5b7613b006ee2d3b1565ac8f479f43c72800b2a
4
+ data.tar.gz: 671f5cad5f1dee2af5757047410a944160f2a950
5
5
  SHA512:
6
- metadata.gz: 79e01af136e6dc890c3cc94ea9971d78f34fd8ba4332a3afb6a62a333a956b835cc87c463d9ae1065f47961403ccd14964448e50a3dd79a88846175a02887d7a
7
- data.tar.gz: 87d6031b6fd68f2e6c8c010fadf7d9130af544661e2ecb3df9eb6051cfa1c26a9f675fca4589b6737e21138f6935c070d470bb5fa9b7fe62163ea9ffcf8235c2
6
+ metadata.gz: 2cdd779536244575b4e77f88e6a9261b7a44f04dc6f8454980a011aa40167cf922239235779f60710df4bb05873d51a0851d3225340eaf0e3df5158e41e3a4d2
7
+ data.tar.gz: a101a8a07aee3e7a1b59f91014481f88b6a6226fa46ec15cfd89c24bb064184ddf6a8253ef7b4c1e2047cb20a4c3d81ae31400aee9e9a0d324c78cb44c2ad285
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_states (1.0.1)
4
+ simple_states (1.1.0.pre)
5
5
  activesupport
6
6
  hashr (~> 0.0.10)
7
7
 
@@ -17,7 +17,6 @@ GEM
17
17
  hashr (0.0.22)
18
18
  i18n (0.7.0)
19
19
  json (1.8.3)
20
- json (1.8.3-java)
21
20
  metaclass (0.0.1)
22
21
  minitest (5.8.0)
23
22
  mocha (0.14.0)
@@ -25,7 +24,6 @@ GEM
25
24
  rake (0.9.6)
26
25
  test_declarative (0.0.5)
27
26
  thread_safe (0.3.5)
28
- thread_safe (0.3.5-java)
29
27
  tzinfo (1.2.2)
30
28
  thread_safe (~> 0.1)
31
29
 
@@ -39,3 +37,6 @@ DEPENDENCIES
39
37
  rake (~> 0.9.2)
40
38
  simple_states!
41
39
  test_declarative
40
+
41
+ BUNDLED WITH
42
+ 1.10.6
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT LICENSE
2
2
 
3
- Copyright (c) Sven Fuchs <svenfuchs@artweb-design.de>
3
+ Copyright (c) Sven Fuchs <me@svenfuchs.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -117,3 +117,24 @@ foo.finished_at # Time.now
117
117
  foo.was_created? # true
118
118
  foo.was_started? # true
119
119
  ```
120
+
121
+ In order to treat states as "ordered", the option `ordered: true` can be
122
+ passed. Events will still behave the same, callbacks be called, etc. However,
123
+ the `state` attribute will never be set back to a previous state.
124
+
125
+ For example:
126
+
127
+ ```
128
+ class Foo
129
+ include SimpleStates
130
+
131
+ states :created, :started, :finished, ordered: true
132
+ end
133
+
134
+ foo = Foo.new
135
+ foo.finish
136
+ foo.start
137
+
138
+ p foo.state
139
+ # => :finished
140
+ ```
@@ -14,35 +14,26 @@ module SimpleStates
14
14
  end
15
15
  end
16
16
 
17
- def saving
18
- @saving = true
19
- yield
20
- ensure
21
- @saving = false
22
- end
23
-
24
17
  def call(object, *args)
25
18
  return if skip?(object, args)
26
19
 
27
20
  raise_invalid_transition(object) unless can_transition?(object)
28
21
  run_callbacks(object, :before, args)
29
- set_state(object)
22
+ set_state(object, args)
30
23
 
31
24
  yield.tap do
32
- run_callbacks(object, :after, args)
33
25
  raise_unknown_target_state(object) unless known_target_state?(object)
34
- object.save! if @saving
35
- end
36
- end
37
-
38
- def merge(other, append = true)
39
- other.options.each do |key, value|
40
- options[key] = [options[key]].send(append ? :push : :unshift, value).compact.flatten
26
+ run_callbacks(object, :after, args)
27
+ object.save! if save?
41
28
  end
42
29
  end
43
30
 
44
31
  protected
45
32
 
33
+ def save?
34
+ options[:save]
35
+ end
36
+
46
37
  def skip?(object, args)
47
38
  result = false
48
39
  result ||= !send_methods(object, options.if, args) if options.if?
@@ -55,12 +46,12 @@ module SimpleStates
55
46
  end
56
47
 
57
48
  def run_callbacks(object, type, args)
58
- object.save! if @saving
49
+ object.save! if save?
59
50
  send_methods(object, options.send(type), args)
60
51
  end
61
52
 
62
- def set_state(object)
63
- state = target_state
53
+ def set_state(object, args)
54
+ state = target_state(args)
64
55
  object.past_states << object.state if object.state
65
56
  object.state = state.to_sym if set_state?(object, state)
66
57
  object.send(:"#{state}_at=", now) if object.respond_to?(:"#{state}_at=") && object.respond_to?(:"#{state}_at") && object.send(:"#{state}_at").nil?
@@ -69,11 +60,13 @@ module SimpleStates
69
60
  def set_state?(object, state)
70
61
  return true unless object.class.state_options[:ordered]
71
62
  states = object.class.state_names
72
- states.index(object.state.try(:to_sym)) < states.index(state)
63
+ lft, rgt = states.index(object.state.try(:to_sym)), states.index(state)
64
+ lft && rgt && lft < rgt
73
65
  end
74
66
 
75
- def target_state
76
- options.to || :"#{name}ed"
67
+ def target_state(args)
68
+ state = args.last[:state].try(:to_sym) if args.last.is_a?(Hash)
69
+ state || options.to || "#{name}ed".sub(/eed$/, 'ed').to_sym
77
70
  end
78
71
 
79
72
  def send_methods(object, methods, args)
@@ -27,17 +27,14 @@ module SimpleStates
27
27
  end
28
28
  end
29
29
 
30
- def define_event(const, event)
31
- const.send(:define_method, event.name) do |*args|
32
- event.send(:call, self, *args) do
33
- super(*args) if defined?(super)
34
- end
30
+ def define_event(const, (name, options))
31
+ const.send(:define_method, name) do |*args|
32
+ event = args.first.is_a?(Event) ? args.shift : Event.new(name, options)
33
+ event.call(self, *args) { super(*args) if defined?(super) }
35
34
  end
36
35
 
37
- const.send(:define_method, :"#{event.name}!") do |*args|
38
- event.saving do
39
- send(event.name, *args)
40
- end
36
+ const.send(:define_method, :"#{name}!") do |*args|
37
+ send(name, Event.new(name, options.merge(save: true)), *args)
41
38
  end
42
39
  end
43
40
 
@@ -52,14 +49,17 @@ module SimpleStates
52
49
  end
53
50
 
54
51
  def merge_events(events)
55
- if merge_ix = events.index { |event| event.name == :all }
56
- merge = events.slice!(merge_ix)
57
- events.each_with_index do |event, ix|
58
- event.merge(merge, ix < merge_ix)
59
- end
60
- merge_events(events)
61
- else
62
- events
52
+ return events unless other_ix = events.index { |event| event.first == :all }
53
+ other = events.slice!(other_ix)
54
+ events.each_with_index do |event, ix|
55
+ merge_event(event, other, ix < other_ix)
56
+ end
57
+ merge_events(events)
58
+ end
59
+
60
+ def merge_event(event, other, append = true)
61
+ other.last.each do |key, value|
62
+ event.last[key] = [event.last[key]].send(append ? :push : :unshift, value).compact.flatten
63
63
  end
64
64
  end
65
65
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleStates
2
- VERSION = '1.1.0.pre'
2
+ VERSION = '1.1.0.rc1'
3
3
  end
data/lib/simple_states.rb CHANGED
@@ -49,7 +49,7 @@ module SimpleStates
49
49
 
50
50
  def event(name, options = {})
51
51
  add_states(options[:to], *options[:from])
52
- self.events += [Event.new(name, options)]
52
+ self.events << [name, options]
53
53
  end
54
54
 
55
55
  def states_module
@@ -9,6 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.authors = ["Sven Fuchs"]
10
10
  s.email = "svenfuchs@artweb-design.de"
11
11
  s.homepage = "https://github.com/svenfuchs/simple_states"
12
+ s.licenses = ['MIT']
12
13
  s.summary = "[summary]"
13
14
  s.description = "[description]"
14
15
 
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.1.0.pre
4
+ version: 1.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sven Fuchs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-02 00:00:00.000000000 Z
11
+ date: 2015-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -98,7 +98,8 @@ files:
98
98
  - lib/simple_states/version.rb
99
99
  - simple_states.gemspec
100
100
  homepage: https://github.com/svenfuchs/simple_states
101
- licenses: []
101
+ licenses:
102
+ - MIT
102
103
  metadata: {}
103
104
  post_install_message:
104
105
  rdoc_options: []