motion-state-machine 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +56 -36
- data/Rakefile +4 -14
- data/lib/motion-state-machine/spec_app_delegate.rb +1 -1
- data/lib/motion-state-machine/version.rb +1 -1
- data/spec/{motion-state-machine/base_spec.rb → base_spec.rb} +0 -0
- data/spec/{motion-state-machine/benchmark_spec.rb → benchmark_spec.rb} +0 -0
- data/spec/helpers/no_exception_logging.rb +1 -0
- data/spec/{motion-state-machine/notification_transition_spec.rb → notification_transition_spec.rb} +0 -0
- data/spec/{motion-state-machine/send_event_transition_spec.rb → send_event_transition_spec.rb} +0 -0
- data/spec/{motion-state-machine/state_spec.rb → state_spec.rb} +0 -0
- data/spec/{motion-state-machine/timed_transition_spec.rb → timed_transition_spec.rb} +0 -0
- data/spec/{motion-state-machine/transition_spec.rb → transition_spec.rb} +0 -0
- metadata +22 -20
data/README.md
CHANGED
@@ -3,6 +3,30 @@
|
|
3
3
|
Hey, this is `motion-state-machine` — a state machine gem designed for
|
4
4
|
[RubyMotion](http://rubymotion.com) for iOS.
|
5
5
|
|
6
|
+
It features:
|
7
|
+
|
8
|
+
- A simple, nice-looking definition syntax
|
9
|
+
- Reaction to sent events, defined timeouts and global NSNotifications
|
10
|
+
- Transition guards and actions
|
11
|
+
- State entry / exit actions
|
12
|
+
- Internal transitions that don't leave the machine's current state
|
13
|
+
- Optional verbose log output for easy debugging
|
14
|
+
- [Grand Central Dispatch](https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html)-awareness — uses GCD queues for synchronization
|
15
|
+
|
16
|
+
Defining a state machine looks like this:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
fsm = StateMachine::Base.new start_state: :awake
|
20
|
+
|
21
|
+
fsm.when :awake do |state|
|
22
|
+
state.on_entry { puts "I'm awake, started and alive!" }
|
23
|
+
state.transition_to :sleeping, on: :finished_hard_work,
|
24
|
+
state.die on: :too_hard_work
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
28
|
+
See below for more examples and usage instructions.
|
29
|
+
|
6
30
|
## Motivation
|
7
31
|
|
8
32
|
Undefined states and visual glitches in applications with complex UIs can
|
@@ -15,20 +39,6 @@ asynchronous event handling does not lead to undefined results (a.k.a. bugs).
|
|
15
39
|
MacRuby and Cocoa don't provide a simple library to address this —
|
16
40
|
motion-state-machine should fill the gap for RubyMotion developers.
|
17
41
|
|
18
|
-
motion-state-machine comes with a simple and nice-looking syntax to define
|
19
|
-
states and transitions:
|
20
|
-
|
21
|
-
fsm = StateMachine::Base.new start_state: :awake
|
22
|
-
|
23
|
-
fsm.when :awake do |state|
|
24
|
-
state.on_entry { puts "I'm awake, started and alive!" }
|
25
|
-
state.transition_to :sleeping, on: :finished_hard_work,
|
26
|
-
state.die on: :too_hard_work
|
27
|
-
end
|
28
|
-
|
29
|
-
It is [Grand Central Dispatch](https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html)-aware
|
30
|
-
and uses GCD queues for synchronization.
|
31
|
-
|
32
42
|
## Installation
|
33
43
|
|
34
44
|
1. If not done yet, add `bundler` gem management to your RubyMotion app.
|
@@ -37,18 +47,23 @@ and uses GCD queues for synchronization.
|
|
37
47
|
|
38
48
|
2. Add this line to your application's Gemfile:
|
39
49
|
|
40
|
-
|
41
|
-
|
50
|
+
```ruby
|
51
|
+
gem 'motion-state-machine'
|
52
|
+
```
|
42
53
|
|
43
54
|
3. Execute:
|
44
55
|
|
45
|
-
|
56
|
+
```bash
|
57
|
+
$ bundle
|
58
|
+
```
|
46
59
|
|
47
60
|
## Usage
|
48
61
|
|
49
62
|
The following example shows how to initialize and define a state machine:
|
50
63
|
|
51
|
-
|
64
|
+
```ruby
|
65
|
+
fsm = StateMachine::Base.new start_state: :working, verbose: true
|
66
|
+
```
|
52
67
|
|
53
68
|
This initializes a state machine. Calling `fsm.start!` would start the
|
54
69
|
machine in the defined start state `:working`. Using `:verbose` activates
|
@@ -58,19 +73,21 @@ debug output on the console.
|
|
58
73
|
|
59
74
|
After initialization, you can define states and transitions:
|
60
75
|
|
61
|
-
|
76
|
+
```ruby
|
77
|
+
fsm.when :working do |state|
|
62
78
|
|
63
|
-
|
64
|
-
|
79
|
+
state.on_entry { puts "I'm awake, started and alive!" }
|
80
|
+
state.on_exit { puts "Phew. That was enough work." }
|
65
81
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
82
|
+
state.transition_to :sleeping,
|
83
|
+
on: :finished_hard_work,
|
84
|
+
if: proc { really_worked_enough_for_now? },
|
85
|
+
action: proc { puts "Will go to sleep now." }
|
70
86
|
|
71
|
-
|
87
|
+
state.die on: :too_hard_work
|
72
88
|
|
73
|
-
|
89
|
+
end
|
90
|
+
```
|
74
91
|
|
75
92
|
This defines…
|
76
93
|
|
@@ -100,19 +117,22 @@ Transitions can be triggered…
|
|
100
117
|
- by calling the state machine's `#event` method (see above).
|
101
118
|
|
102
119
|
- automatically after a given timeout:
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
fsm.when :sleeping do |state|
|
123
|
+
state.transition_to :working, after: 20
|
124
|
+
end
|
125
|
+
```
|
107
126
|
|
108
127
|
(goes back to `:working` after 20 seconds in state `:sleeping`)
|
109
128
|
|
110
129
|
- when a `NSNotification` is posted:
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
130
|
+
```ruby
|
131
|
+
fsm.when :awake do |state|
|
132
|
+
state.transition_to :in_background,
|
133
|
+
on_notification: UIApplicationDidEnterBackgroundNotification
|
134
|
+
end
|
135
|
+
```
|
116
136
|
|
117
137
|
### How fast is it?
|
118
138
|
|
data/Rakefile
CHANGED
@@ -11,21 +11,11 @@ Bundler.setup
|
|
11
11
|
Bundler.require
|
12
12
|
|
13
13
|
Motion::Project::App.setup do |app|
|
14
|
-
app.name = '
|
15
|
-
app.identifier = 'com.screenfashion.motion
|
16
|
-
app.specs_dir = './spec
|
14
|
+
app.name = 'Spec Suite'
|
15
|
+
app.identifier = 'com.screenfashion.motion.spec-app'
|
16
|
+
app.specs_dir = './spec'
|
17
17
|
app.development do
|
18
18
|
# TODO: How to use module namespacing here?
|
19
|
-
app.delegate_class = '
|
19
|
+
app.delegate_class = 'SpecAppDelegate'
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
23
|
-
namespace :spec do
|
24
|
-
task :lib do
|
25
|
-
sh "bacon #{Dir.glob("spec/lib/**/*_spec.rb").join(' ')}"
|
26
|
-
end
|
27
|
-
|
28
|
-
task :motion => 'spec'
|
29
|
-
|
30
|
-
task :all => [:lib, :motion]
|
31
|
-
end
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
Exception.log_exceptions = false
|
data/spec/{motion-state-machine/notification_transition_spec.rb → notification_transition_spec.rb}
RENAMED
File without changes
|
data/spec/{motion-state-machine/send_event_transition_spec.rb → send_event_transition_spec.rb}
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-state-machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
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-06
|
12
|
+
date: 2012-07-06 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70164739051240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70164739051240
|
25
25
|
description: A finite state machine for RubyMotion with a flavor of Grand Central
|
26
26
|
Dispatch.
|
27
27
|
email:
|
@@ -42,13 +42,14 @@ files:
|
|
42
42
|
- lib/motion-state-machine/transition.rb
|
43
43
|
- lib/motion-state-machine/version.rb
|
44
44
|
- motion-state-machine.gemspec
|
45
|
-
- spec/
|
46
|
-
- spec/
|
47
|
-
- spec/
|
48
|
-
- spec/
|
49
|
-
- spec/
|
50
|
-
- spec/
|
51
|
-
- spec/
|
45
|
+
- spec/base_spec.rb
|
46
|
+
- spec/benchmark_spec.rb
|
47
|
+
- spec/helpers/no_exception_logging.rb
|
48
|
+
- spec/notification_transition_spec.rb
|
49
|
+
- spec/send_event_transition_spec.rb
|
50
|
+
- spec/state_spec.rb
|
51
|
+
- spec/timed_transition_spec.rb
|
52
|
+
- spec/transition_spec.rb
|
52
53
|
homepage: https://github.com/opyh/motion-state-machine
|
53
54
|
licenses: []
|
54
55
|
post_install_message:
|
@@ -63,7 +64,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
63
64
|
version: '0'
|
64
65
|
segments:
|
65
66
|
- 0
|
66
|
-
hash:
|
67
|
+
hash: -1755037909543191418
|
67
68
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
69
|
none: false
|
69
70
|
requirements:
|
@@ -72,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
73
|
version: '0'
|
73
74
|
segments:
|
74
75
|
- 0
|
75
|
-
hash:
|
76
|
+
hash: -1755037909543191418
|
76
77
|
requirements: []
|
77
78
|
rubyforge_project:
|
78
79
|
rubygems_version: 1.8.10
|
@@ -81,10 +82,11 @@ specification_version: 3
|
|
81
82
|
summary: Comes with a nice syntax for state and transition definition. Supports triggering
|
82
83
|
via events, timeouts and NSNotifications.
|
83
84
|
test_files:
|
84
|
-
- spec/
|
85
|
-
- spec/
|
86
|
-
- spec/
|
87
|
-
- spec/
|
88
|
-
- spec/
|
89
|
-
- spec/
|
90
|
-
- spec/
|
85
|
+
- spec/base_spec.rb
|
86
|
+
- spec/benchmark_spec.rb
|
87
|
+
- spec/helpers/no_exception_logging.rb
|
88
|
+
- spec/notification_transition_spec.rb
|
89
|
+
- spec/send_event_transition_spec.rb
|
90
|
+
- spec/state_spec.rb
|
91
|
+
- spec/timed_transition_spec.rb
|
92
|
+
- spec/transition_spec.rb
|