nanomachine 1.0.1 → 1.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8700d4a90a91dab6251130620aa30143dcca6a02
4
+ data.tar.gz: 146d5b6046e62314bfb7ce7c6ea2678d21204794
5
+ SHA512:
6
+ metadata.gz: 93d15ec3b077ccdd871d2f23d23ee6b935ea2d776183d6d53e7f956533c7c32d87f92f6230d3fb69212b80d1c9c831215ed570353378d9416bf4991b3cfde0e9
7
+ data.tar.gz: 5b8edab1a67ff0ed7421ecfa25d2dc71b10aa01cbd821ee5b0bf958b021232ec6e2d91a74301af897313db0812cf075a7fa88896cfc01ff1a64b8b136cd6ba4f
data/.travis.yml CHANGED
@@ -1,8 +1,11 @@
1
+ language: ruby
1
2
  rvm:
2
- - "1.9.3"
3
- - "1.9.2"
4
- - "jruby-19mode"
5
- - "rbx-19mode"
6
- - "1.8.7"
7
- - "jruby-18mode"
8
- - "rbx-18mode"
3
+ - 2.1
4
+ - 2.2
5
+ - ruby-head
6
+ - jruby
7
+ - rbx-2
8
+ sudo: false
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: ruby-head
data/CHANGES CHANGED
@@ -1,3 +1,7 @@
1
+ # 1.1
2
+
3
+ - Added #transition_to?
4
+
1
5
  # 1.0.0 to 1.0.1
2
6
 
3
7
  - Removed gem description because it’s ugly on rubygems. Use the summary.
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Nanomachine
2
2
 
3
+ [![Build Status](https://travis-ci.org/elabs/nanomachine.svg?branch=master)](http://travis-ci.org/elabs/nanomachine)
4
+
3
5
  A really tiny state machine for ruby. No events, only accepted transitions and transition callbacks.
4
6
 
5
7
  The difference between Nanomachine, and otherwise known Micromachine (https://rubygems.org/gems/micromachine) is that
data/lib/nanomachine.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "nanomachine/version"
2
2
  require "set"
3
+ require "monitor"
3
4
 
4
5
  # A minimal state machine where you transition between states, instead
5
6
  # of transition by input symbols or events.
@@ -54,11 +55,7 @@ class Nanomachine
54
55
  # @yield [self] yields the machine for easy definition of states
55
56
  # @yieldparam [Nanomachine] self
56
57
  def initialize(initial_state)
57
- if initial_state.nil?
58
- raise InvalidStateError, "initial state cannot be nil"
59
- end
60
-
61
- @state = initial_state.to_s
58
+ @state = to_state(initial_state)
62
59
  @transitions = Hash.new(Set.new)
63
60
  @callbacks = Hash.new { |h, k| h[k] = [] }
64
61
  yield self if block_given?
@@ -85,7 +82,7 @@ class Nanomachine
85
82
  # @param [#to_s] from
86
83
  # @param [#each] to each target state must respond to #to_s
87
84
  def transition(from, to)
88
- transitions[from.to_s] = Set.new(to).map!(&:to_s)
85
+ transitions[to_state(from)] = Set.new(to).map! { |state| to_state(state) }
89
86
  end
90
87
 
91
88
  # Define a callback to be executed on transition.
@@ -125,10 +122,10 @@ class Nanomachine
125
122
  end
126
123
 
127
124
  from = options.delete(:from)
128
- from &&= from.to_s
125
+ from &&= to_state(from)
129
126
 
130
127
  to = options.delete(:to)
131
- to &&= to.to_s
128
+ to &&= to_state(to)
132
129
 
133
130
  unless options.empty?
134
131
  raise ArgumentError, "unknown options: #{options.keys.join(", ")}"
@@ -151,12 +148,12 @@ class Nanomachine
151
148
  # @param block passed to callbacks defined with {#on_transition}
152
149
  # @return [String, false] state the machine was in before transition, or false if transition is not allowed
153
150
  def transition_to(other_state, *args, &block)
154
- other_state &&= other_state.to_s
155
- if transitions[state].include?(other_state)
151
+ if transition_to?(other_state)
152
+ other_state = to_state(other_state)
156
153
  previous_state, @state = @state, other_state
157
- [[nil, nil], [previous_state, nil], [nil, @state], [previous_state, @state]].each do |combo|
154
+ [[nil, nil], [previous_state, nil], [nil, other_state], [previous_state, other_state]].each do |combo|
158
155
  @callbacks[combo].each do |callback|
159
- callback.call([previous_state, @state], *args, &block)
156
+ callback.call([previous_state, other_state], *args, &block)
160
157
  end
161
158
  end
162
159
  previous_state
@@ -180,4 +177,25 @@ class Nanomachine
180
177
  raise InvalidTransitionError, "cannot transition from #{state.inspect} to #{other_state.inspect}"
181
178
  end
182
179
  end
180
+
181
+ # Query to see if it's possible to transition to the given state.
182
+ #
183
+ # @example
184
+ # fsm.transition_to?("state") # => true
185
+ #
186
+ # @param (see #transition_to)
187
+ # @return [Boolean]
188
+ def transition_to?(other_state)
189
+ transitions[state].include?(to_state(other_state))
190
+ end
191
+
192
+ private
193
+
194
+ def to_state(state)
195
+ if state.nil?
196
+ raise InvalidStateError, "state cannot be nil"
197
+ else
198
+ state.to_s
199
+ end
200
+ end
183
201
  end
@@ -1,4 +1,4 @@
1
1
  class Nanomachine
2
2
  # @see http://semver.org/
3
- VERSION = "1.0.1"
3
+ VERSION = "1.1.0"
4
4
  end
data/nanomachine.gemspec CHANGED
@@ -20,5 +20,5 @@ Gem::Specification.new do |gem|
20
20
  gem.require_paths = ["lib"]
21
21
 
22
22
  gem.add_development_dependency "rake"
23
- gem.add_development_dependency "rspec", "~> 2.0"
23
+ gem.add_development_dependency "rspec", "~> 3.0"
24
24
  end
@@ -39,7 +39,7 @@ describe "Nanomachine state machine" do
39
39
 
40
40
  describe "#initialize" do
41
41
  it "raises an error if given an invalid initial state" do
42
- expect { Nanomachine.new(nil) }.to raise_error(Nanomachine::InvalidStateError, /initial state/)
42
+ expect { Nanomachine.new(nil) }.to raise_error(Nanomachine::InvalidStateError)
43
43
  end
44
44
  end
45
45
 
@@ -76,7 +76,7 @@ describe "Nanomachine state machine" do
76
76
 
77
77
  it "does not transition when the transition is undefined" do
78
78
  fsm.transition_to("X")
79
- expect { fsm.transition_to("A").should be_false }.to_not change { fsm.state }
79
+ expect { fsm.transition_to("A").should be_falsy }.to_not change { fsm.state }
80
80
  end
81
81
 
82
82
  it "returns the previous state" do
@@ -84,7 +84,11 @@ describe "Nanomachine state machine" do
84
84
  end
85
85
 
86
86
  it "returns false if transition failed" do
87
- fsm.transition_to("D").should be_false
87
+ fsm.transition_to("D").should be_falsy
88
+ end
89
+
90
+ it "raises a type error if state is nil" do
91
+ expect { fsm.transition_to(nil) }.to raise_error(Nanomachine::InvalidStateError)
88
92
  end
89
93
 
90
94
  context "callbacks" do
@@ -144,7 +148,7 @@ describe "Nanomachine state machine" do
144
148
  end
145
149
 
146
150
  it "executes no callbacks on failed transitions" do
147
- fsm.transition_to("D").should be_false
151
+ fsm.transition_to("D").should be_falsy
148
152
  @callbacks.should be_empty
149
153
  end
150
154
  end
@@ -159,5 +163,23 @@ describe "Nanomachine state machine" do
159
163
  it "returns the previous state on success" do
160
164
  fsm.transition_to!("B").should eq "A"
161
165
  end
166
+
167
+ it "raises a type error if state is nil" do
168
+ expect { fsm.transition_to!(nil) }.to raise_error(Nanomachine::InvalidStateError)
169
+ end
170
+ end
171
+
172
+ describe "#transition_to?" do
173
+ it "returns false if it cannot transition to the given state" do
174
+ fsm.transition_to?("D").should be_falsy
175
+ end
176
+
177
+ it "returns true if it can transition to the given state" do
178
+ fsm.transition_to?("B").should be_truthy
179
+ end
180
+
181
+ it "raises a type error if state is nil" do
182
+ expect { fsm.transition_to?(nil) }.to raise_error(Nanomachine::InvalidStateError)
183
+ end
162
184
  end
163
185
  end
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,12 @@
1
1
  require "rspec"
2
2
  require "nanomachine"
3
+
4
+ RSpec.configure do |config|
5
+ config.expect_with :rspec do |c|
6
+ c.syntax = [:expect, :should]
7
+ end
8
+
9
+ config.mock_with :rspec do |c|
10
+ c.syntax = [:expect, :should]
11
+ end
12
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanomachine
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ivan Navarrete
@@ -10,30 +9,36 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2012-11-15 00:00:00.000000000 Z
12
+ date: 2015-10-28 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: rake
17
- requirement: &2167133420 !ruby/object:Gem::Requirement
18
- none: false
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  requirements:
20
- - - ! '>='
18
+ - - ">="
21
19
  - !ruby/object:Gem::Version
22
20
  version: '0'
23
21
  type: :development
24
22
  prerelease: false
25
- version_requirements: *2167133420
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
26
28
  - !ruby/object:Gem::Dependency
27
29
  name: rspec
28
- requirement: &2167132520 !ruby/object:Gem::Requirement
29
- none: false
30
+ requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - ~>
32
+ - - "~>"
32
33
  - !ruby/object:Gem::Version
33
- version: '2.0'
34
+ version: '3.0'
34
35
  type: :development
35
36
  prerelease: false
36
- version_requirements: *2167132520
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '3.0'
37
42
  description:
38
43
  email:
39
44
  - crzivn@gmail.com
@@ -42,9 +47,9 @@ executables: []
42
47
  extensions: []
43
48
  extra_rdoc_files: []
44
49
  files:
45
- - .gitignore
46
- - .rspec
47
- - .travis.yml
50
+ - ".gitignore"
51
+ - ".rspec"
52
+ - ".travis.yml"
48
53
  - CHANGES
49
54
  - Gemfile
50
55
  - README.md
@@ -57,27 +62,26 @@ files:
57
62
  homepage: https://github.com/elabs/nanomachine
58
63
  licenses:
59
64
  - MIT License
65
+ metadata: {}
60
66
  post_install_message:
61
67
  rdoc_options: []
62
68
  require_paths:
63
69
  - lib
64
70
  required_ruby_version: !ruby/object:Gem::Requirement
65
- none: false
66
71
  requirements:
67
- - - ! '>='
72
+ - - ">="
68
73
  - !ruby/object:Gem::Version
69
74
  version: '0'
70
75
  required_rubygems_version: !ruby/object:Gem::Requirement
71
- none: false
72
76
  requirements:
73
- - - ! '>='
77
+ - - ">="
74
78
  - !ruby/object:Gem::Version
75
79
  version: '0'
76
80
  requirements: []
77
81
  rubyforge_project:
78
- rubygems_version: 1.8.10
82
+ rubygems_version: 2.4.5.1
79
83
  signing_key:
80
- specification_version: 3
84
+ specification_version: 4
81
85
  summary: A really tiny state machine for ruby. No events, only acceptable transitions
82
86
  and transition callbacks.
83
87
  test_files: