simple_states 2.0.0 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 627c1d0bd3ec1db9f71afc51615e7a1c5d8ee194
4
- data.tar.gz: ca2532ece2327f549c0c113dcd09155f4df8b578
3
+ metadata.gz: a68d333f828efbb2ced448294618c846da08b4d1
4
+ data.tar.gz: ea6fbcdb518fed14d6883ef44c8c887f3e63b58b
5
5
  SHA512:
6
- metadata.gz: e8295626ea865b2d3e1bfdac8e6ef2e4a5c50100ac3c0168fb68e183a03a3a8d591dfc578713d6ecae618a6ccdd9973f329068fbddde3f1039fd5ab95fd29939
7
- data.tar.gz: c6a2062e68a1f7814a3b40634eb7aefcdb3e567bc444dd95b15c8ec2b4adcca3e03526c01829946104572f0ff3fbd29ffd9dc73aa5c38da6fad7c38fa11a8718
6
+ metadata.gz: f3137b1e0780c03f5a045c4e1df7e381e6a7b7eec8bdf5a2317c979694b097f92f6fe56ba92191cc127eb086916809578a63b1af6c1f362abf9ebb569dbb1661
7
+ data.tar.gz: 795e118a9f6a5cb73d673b7d7bf393ac5bc7ade2039136a45ad2d5264f907981cb7839a6800fc810faf471fa45af3eb4ee4ec4fbf3c79c15b6a4d9260db0c588
@@ -5,22 +5,21 @@ GEM
5
5
  metaclass (0.0.4)
6
6
  mocha (1.1.0)
7
7
  metaclass (~> 0.0.1)
8
- rspec (3.3.0)
9
- rspec-core (~> 3.3.0)
10
- rspec-expectations (~> 3.3.0)
11
- rspec-mocks (~> 3.3.0)
12
- rspec-core (3.3.2)
13
- rspec-support (~> 3.3.0)
14
- rspec-expectations (3.3.1)
8
+ rspec (3.4.0)
9
+ rspec-core (~> 3.4.0)
10
+ rspec-expectations (~> 3.4.0)
11
+ rspec-mocks (~> 3.4.0)
12
+ rspec-core (3.4.4)
13
+ rspec-support (~> 3.4.0)
14
+ rspec-expectations (3.4.0)
15
15
  diff-lcs (>= 1.2.0, < 2.0)
16
- rspec-support (~> 3.3.0)
17
- rspec-mocks (3.3.2)
16
+ rspec-support (~> 3.4.0)
17
+ rspec-mocks (3.4.1)
18
18
  diff-lcs (>= 1.2.0, < 2.0)
19
- rspec-support (~> 3.3.0)
20
- rspec-support (3.3.0)
19
+ rspec-support (~> 3.4.0)
20
+ rspec-support (3.4.1)
21
21
 
22
22
  PLATFORMS
23
- java
24
23
  ruby
25
24
 
26
25
  DEPENDENCIES
@@ -28,4 +27,4 @@ DEPENDENCIES
28
27
  rspec
29
28
 
30
29
  BUNDLED WITH
31
- 1.10.6
30
+ 1.11.2
data/README.md CHANGED
@@ -3,6 +3,10 @@
3
3
  A super-slim (~200 loc) statemachine-like support library focussed on use in
4
4
  Travis CI.
5
5
 
6
+ Note that the current version behaves slightly differently, and comes with
7
+ reduced features compared to the original version. If you are looking for the
8
+ original version see the tag `v1.1.0.rc11`.
9
+
6
10
  ## Usage
7
11
 
8
12
  Define states and events like this:
@@ -11,10 +15,8 @@ Define states and events like this:
11
15
  class Foo
12
16
  include SimpleStates
13
17
 
14
- states :created, :started, :finished
15
-
16
- event :start, :from => :created, :to => :started, :if => :startable?
17
- event :finish, :to => :finished, :after => :cleanup
18
+ event :start, if: :start?
19
+ event :finish, to: [:passed, :failed], after: :notify, unless: :finished?
18
20
 
19
21
  attr_accessor :state, :started_at, :finished_at
20
22
 
@@ -22,119 +24,57 @@ class Foo
22
24
  # start foo
23
25
  end
24
26
 
25
- def startable?
27
+ def start?
26
28
  true
27
29
  end
28
30
 
29
- def cleanup
30
- # cleanup foo
31
+ def notify(event)
32
+ # notify about event on foo
31
33
  end
32
34
  end
33
35
  ```
34
36
 
35
- Including the SimpleStates module to your class is currently required. We'll add
36
- hooks for ActiveRecord etc later.
37
-
38
37
  SimpleStates expects your model to support attribute accessors for `:state`.
39
38
 
40
39
  Event options have the following well-known meanings:
41
40
 
42
41
  ``` ruby
43
- :from # valid states to transition from
44
- :to # target state to transition to
42
+ :to # allowed target states to transition to, deferred from the event name if not given
45
43
  :if # only proceed if the given method returns true
46
44
  :unless # only proceed if the given method returns false
47
45
  :before # run the given method before running `super` and setting the new state
48
46
  :after # run the given method at the very end
49
47
  ```
50
48
 
51
- All of these options except for `:to` can be given as a single symbol or string or
52
- as an Array of symbols or strings.
49
+ All of these options except can be given as a single symbol or string or as an
50
+ Array of symbols or strings.
53
51
 
54
52
  Calling `event` will effectively add methods to a proxy module which is
55
- included to the singleton class of your class' instances. E.g. declaring `event
56
- :start` in the example above will add methods `start` and `start!` to a module
57
- included to the singleton class of instances of `Foo`.
53
+ prepended to your class (included to the singleton class of your class'
54
+ instances on 1.9). E.g. declaring `event :start` in the example above will add
55
+ methods `start` and `start!` to a module included to the singleton class of
56
+ instances of `Foo`.
58
57
 
59
58
  This method will
60
59
 
61
60
  1. check if `:if`/`:unless` conditions apply (if given) and just return from the method otherwise
62
- 2. check if the object currently is in a valid `:from` state (if given) and raise an exception otherwise
63
- 3. run `:before` callbacks (if given)
64
- 4. call `super` if Foo defines the current method (i.e. call `start` but not `finish` in the example above)
65
- 5. add the object's current state to its `past_states` history
66
- 6. set the object's `state` to the target state given as `:to`
67
- 7. set the object's `[state]_at` attribute to `Time.now` if the object defines a writer for it
68
- 8. run `:after` callbacks (if given)
61
+ 2. run `:before` callbacks (if given)
62
+ 3. set the object's `state` to the target state
63
+ 4. set the object's `[state]_at` attribute to `Time.now` if the object defines a writer for it
64
+ 5. call `super` if Foo defines the current method (i.e. call `start` but not `finish` in the example above)
65
+ 6. run `:after` callbacks (if given)
69
66
 
70
67
  You can define options for all events like so:
71
68
 
72
69
  ``` ruby
73
- event :finish, :to => :finished, :after => :cleanup
74
- event :all, :after => :notify
70
+ event :finish, after: :cleanup
71
+ event :all, after: :notify
75
72
  ```
76
73
 
77
74
  This will call :cleanup first and then :notify on :finish.
78
75
 
79
76
  If no target state was given for an event then SimpleStates will try to derive
80
- it from the states list. I.e. for an event `start` it will check the states
77
+ it from the event name. I.e. for an event `start` it will check the states
81
78
  list for a state `started` and use it. If it can not find a target state this
82
79
  way then it will raise an exception.
83
80
 
84
- By default SimpleStates will assume `:created` as an initial state. You can
85
- overwrite this using:
86
-
87
- ``` ruby
88
- # note that we have to use self here!
89
- self.initial_state = :some_state
90
- ```
91
-
92
- So with the example above something the following would work:
93
-
94
- ``` ruby
95
- foo = Foo.new
96
-
97
- foo.state # :created
98
- foo.created? # true
99
- foo.was_created? # true
100
- foo.state?(:created) # true
101
-
102
- foo.start # checks Foo#startable? and then calls Foo#start
103
- # calling foo.start! (with exclamation mark) would perform same actions as foo.start, but
104
- # also call foo.save! afterwards.
105
-
106
- foo.state # :started
107
- foo.started? # true
108
- foo.started_at # Time.now
109
- foo.created? # false
110
- foo.was_created? # true
111
-
112
- foo.finish # just performs state logic as there's no Foo#finish
113
-
114
- foo.state # :finished
115
- foo.finished? # true
116
- foo.finished_at # Time.now
117
- foo.was_created? # true
118
- foo.was_started? # true
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
- ```
@@ -36,7 +36,11 @@ module SimpleStates
36
36
  end
37
37
 
38
38
  def set_attr(obj, key, value)
39
- obj.send(:"#{key}=", value) if obj.respond_to?(:"#{key}=")
39
+ obj.send(:"#{key}=", value) if obj.respond_to?(:"#{key}=") and not has_timestamp?(obj, key)
40
+ end
41
+
42
+ def has_timestamp?(obj, key)
43
+ key.to_s.end_with?('_at') && obj.respond_to?(key) && obj.send(key)
40
44
  end
41
45
 
42
46
  def ordered?(obj, data)
@@ -1,3 +1,3 @@
1
1
  module SimpleStates
2
- VERSION = '2.0.0'
2
+ VERSION = '2.0.1'
3
3
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_states
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
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-11-01 00:00:00.000000000 Z
11
+ date: 2016-04-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: "[description]"
13
+ description: '[description]'
14
14
  email: me@svenfuchs.com
15
15
  executables: []
16
16
  extensions: []
@@ -27,7 +27,6 @@ files:
27
27
  - lib/simple_states/helpers.rb
28
28
  - lib/simple_states/states.rb
29
29
  - lib/simple_states/version.rb
30
- - simple_states.gemspec
31
30
  homepage: https://github.com/svenfuchs/simple_states
32
31
  licenses:
33
32
  - MIT
@@ -38,19 +37,18 @@ require_paths:
38
37
  - lib
39
38
  required_ruby_version: !ruby/object:Gem::Requirement
40
39
  requirements:
41
- - - ">="
40
+ - - '>='
42
41
  - !ruby/object:Gem::Version
43
42
  version: '0'
44
43
  required_rubygems_version: !ruby/object:Gem::Requirement
45
44
  requirements:
46
- - - ">="
45
+ - - '>='
47
46
  - !ruby/object:Gem::Version
48
47
  version: '0'
49
48
  requirements: []
50
- rubyforge_project: "[none]"
51
- rubygems_version: 2.4.5
49
+ rubyforge_project: '[none]'
50
+ rubygems_version: 2.4.8
52
51
  signing_key:
53
52
  specification_version: 4
54
- summary: "[summary]"
53
+ summary: '[summary]'
55
54
  test_files: []
56
- has_rdoc:
@@ -1,20 +0,0 @@
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 = "me@svenfuchs.com"
11
- s.homepage = "https://github.com/svenfuchs/simple_states"
12
- s.licenses = ['MIT']
13
- s.summary = "[summary]"
14
- s.description = "[description]"
15
-
16
- s.files = Dir.glob("{lib/**/*,[A-Z]*}")
17
- s.platform = Gem::Platform::RUBY
18
- s.require_path = 'lib'
19
- s.rubyforge_project = '[none]'
20
- end