elevate 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/README.md +23 -10
- data/lib/elevate/api.rb +3 -2
- data/lib/elevate/dsl.rb +16 -11
- data/lib/elevate/operation.rb +22 -27
- data/lib/elevate/task_context.rb +12 -0
- data/lib/elevate/version.rb +1 -1
- data/spec/api_spec.rb +31 -2
- data/spec/operation_spec.rb +3 -3
- metadata +4 -12
- data/Gemfile.lock +0 -41
- data/spec/dsl_spec.rb +0 -21
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
Elevate
|
1
|
+
Elevate
|
2
2
|
======
|
3
3
|
|
4
4
|
Stop scattering your domain logic across your view controller. Consolidate it to a single conceptual unit with Elevate.
|
5
5
|
|
6
|
+
[![Code Climate](https://codeclimate.com/github/mattgreen/elevate.png)](https://codeclimate.com/github/mattgreen/elevate) [![Travis](https://api.travis-ci.org/mattgreen/elevate.png)](https://travis-ci.org/mattgreen/elevate)
|
7
|
+
|
6
8
|
Example
|
7
9
|
-------
|
8
10
|
|
@@ -19,16 +21,24 @@ Example
|
|
19
21
|
UserRegistration.store(credentials.username, credentials.token)
|
20
22
|
end
|
21
23
|
|
22
|
-
#
|
24
|
+
# Anything yielded from this block is passed to on_update
|
25
|
+
yield "Logged in!"
|
26
|
+
|
27
|
+
# Return value of block is passed back to on_finish
|
23
28
|
credentials != nil
|
24
29
|
end
|
25
30
|
|
26
|
-
|
31
|
+
on_start do
|
27
32
|
# This block runs on the UI thread after the operation has been queued.
|
28
33
|
SVProgressHUD.showWithStatus("Logging In...")
|
29
34
|
end
|
30
35
|
|
31
|
-
|
36
|
+
on_update do |status|
|
37
|
+
# This block runs on the UI thread with anything the task yields
|
38
|
+
puts status
|
39
|
+
end
|
40
|
+
|
41
|
+
on_finish do |result, exception|
|
32
42
|
# This block runs on the UI thread after the task block has finished.
|
33
43
|
SVProgressHUD.dismiss
|
34
44
|
|
@@ -71,7 +81,7 @@ Installation
|
|
71
81
|
------------
|
72
82
|
Update your Gemfile:
|
73
83
|
|
74
|
-
gem "elevate", "~> 0.
|
84
|
+
gem "elevate", "~> 0.5.0"
|
75
85
|
|
76
86
|
Bundle:
|
77
87
|
|
@@ -91,7 +101,12 @@ Launch an async task with the `async` method:
|
|
91
101
|
|
92
102
|
* Pass all the data the task needs to operate (such as credentials or search terms) in to the `async` method.
|
93
103
|
* Define a block that contains a `task` block. The `task` block should contain all of your non-UI code. It will be run on a background thread. Any data passed into the `async` method will be available as instance variables, keyed by the provided hash key.
|
94
|
-
* Optionally
|
104
|
+
* Optionally:
|
105
|
+
* Define an `on_start` block to be run when the task starts
|
106
|
+
* Define an `on_finish` block to be run when the task finishes
|
107
|
+
* Define an `on_update` block to be called any time the task calls yield (useful for relaying status information back during long operations)
|
108
|
+
|
109
|
+
All of the `on_` blocks are called on the UI thread. `on_start` is guaranteed to precede `on_update` and `on_finish`.
|
95
110
|
|
96
111
|
```ruby
|
97
112
|
@track_task = async artist: searchBar.text do
|
@@ -100,11 +115,11 @@ Launch an async task with the `async` method:
|
|
100
115
|
ArtistDB.update(artist)
|
101
116
|
end
|
102
117
|
|
103
|
-
|
118
|
+
on_start do
|
104
119
|
SVProgressHUD.showWithStatus("Adding...")
|
105
120
|
end
|
106
121
|
|
107
|
-
|
122
|
+
on_finish do |result, exception|
|
108
123
|
SVProgressHUD.dismiss
|
109
124
|
end
|
110
125
|
end
|
@@ -117,12 +132,10 @@ To cancel a task (like when the view controller is being dismissed), call `cance
|
|
117
132
|
To Do
|
118
133
|
-----
|
119
134
|
* Need ability to set timeout for tasks
|
120
|
-
* More thought on the semantics
|
121
135
|
|
122
136
|
Caveats
|
123
137
|
---------
|
124
138
|
* Must use Elevate's HTTP client instead of other iOS networking libs
|
125
|
-
* No way to report progress (idea: `execute` could yield status information via optional block)
|
126
139
|
|
127
140
|
Inspiration
|
128
141
|
-----------
|
data/lib/elevate/api.rb
CHANGED
@@ -22,8 +22,9 @@ module Elevate
|
|
22
22
|
raise "No task block specified!" unless dsl.task_callback
|
23
23
|
|
24
24
|
operation = ElevateOperation.alloc.initWithTarget(dsl.task_callback, args: args)
|
25
|
-
operation.
|
26
|
-
operation.
|
25
|
+
operation.on_start = Callback.new(self, dsl.start_callback) if dsl.start_callback
|
26
|
+
operation.on_finish = Callback.new(self, dsl.finish_callback) if dsl.finish_callback
|
27
|
+
operation.on_update = Callback.new(self, dsl.update_callback) if dsl.update_callback
|
27
28
|
|
28
29
|
yield operation
|
29
30
|
|
data/lib/elevate/dsl.rb
CHANGED
@@ -4,26 +4,31 @@ module Elevate
|
|
4
4
|
instance_eval(&block)
|
5
5
|
end
|
6
6
|
|
7
|
-
attr_reader :
|
8
|
-
attr_reader :
|
7
|
+
attr_reader :finish_callback
|
8
|
+
attr_reader :start_callback
|
9
9
|
attr_reader :task_callback
|
10
|
+
attr_reader :update_callback
|
10
11
|
|
11
|
-
def
|
12
|
-
raise "
|
12
|
+
def on_finish(&block)
|
13
|
+
raise "on_finish blocks must accept two parameters" unless block.arity == 2
|
13
14
|
|
14
|
-
@
|
15
|
+
@finish_callback = block
|
15
16
|
end
|
16
17
|
|
17
|
-
def
|
18
|
-
raise "
|
18
|
+
def on_start(&block)
|
19
|
+
raise "on_start blocks must accept zero parameters" unless block.arity == 0
|
20
|
+
|
21
|
+
@start_callback = block
|
22
|
+
end
|
19
23
|
|
20
|
-
|
24
|
+
def on_update(&block)
|
25
|
+
@update_callback = block
|
21
26
|
end
|
22
27
|
|
23
|
-
def
|
24
|
-
raise "
|
28
|
+
def task(&block)
|
29
|
+
raise "task blocks must accept zero parameters" unless block.arity == 0
|
25
30
|
|
26
|
-
@
|
31
|
+
@task_callback = block
|
27
32
|
end
|
28
33
|
end
|
29
34
|
end
|
data/lib/elevate/operation.rb
CHANGED
@@ -1,31 +1,21 @@
|
|
1
1
|
module Elevate
|
2
|
-
class Context
|
3
|
-
def initialize(args, &block)
|
4
|
-
metaclass = class << self; self; end
|
5
|
-
metaclass.send(:define_method, :execute, &block)
|
6
|
-
|
7
|
-
args.each do |key, value|
|
8
|
-
instance_variable_set("@#{key}", value)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
2
|
class ElevateOperation < NSOperation
|
14
3
|
def initWithTarget(target, args:args)
|
15
4
|
if init()
|
16
5
|
@coordinator = IOCoordinator.new
|
17
|
-
@
|
18
|
-
@
|
19
|
-
@
|
6
|
+
@context = TaskContext.new(args, &target)
|
7
|
+
@update_callback = nil
|
8
|
+
@finish_callback = nil
|
20
9
|
|
21
10
|
setCompletionBlock(lambda do
|
22
|
-
if @
|
23
|
-
@
|
11
|
+
if @finish_callback
|
12
|
+
@finish_callback.call(@result, @exception) unless isCancelled
|
24
13
|
end
|
25
14
|
|
26
15
|
Dispatch::Queue.main.sync do
|
27
|
-
@
|
28
|
-
@
|
16
|
+
@context = nil
|
17
|
+
@update_callback = nil
|
18
|
+
@finish_callback = nil
|
29
19
|
end
|
30
20
|
end)
|
31
21
|
end
|
@@ -42,7 +32,6 @@ module Elevate
|
|
42
32
|
def inspect
|
43
33
|
details = []
|
44
34
|
details << "<canceled>" if @coordinator.cancelled?
|
45
|
-
details << "@target=#{@target.class.name}"
|
46
35
|
|
47
36
|
"#<#{self.class.name}: #{details.join(" ")}>"
|
48
37
|
end
|
@@ -58,7 +47,9 @@ module Elevate
|
|
58
47
|
|
59
48
|
begin
|
60
49
|
unless @coordinator.cancelled?
|
61
|
-
@result = @context.execute
|
50
|
+
@result = @context.execute do |*args|
|
51
|
+
@update_callback.call(*args) if @update_callback
|
52
|
+
end
|
62
53
|
end
|
63
54
|
|
64
55
|
rescue Exception => e
|
@@ -73,18 +64,22 @@ module Elevate
|
|
73
64
|
attr_reader :exception
|
74
65
|
attr_reader :result
|
75
66
|
|
76
|
-
def
|
77
|
-
|
78
|
-
|
67
|
+
def on_finish=(callback)
|
68
|
+
@finish_callback = callback
|
69
|
+
end
|
70
|
+
|
71
|
+
def on_start=(callback)
|
72
|
+
start_callback = callback
|
73
|
+
start_callback.retain
|
79
74
|
|
80
75
|
Dispatch::Queue.main.async do
|
81
|
-
|
82
|
-
|
76
|
+
start_callback.call unless isCancelled
|
77
|
+
start_callback.release
|
83
78
|
end
|
84
79
|
end
|
85
80
|
|
86
|
-
def
|
87
|
-
@
|
81
|
+
def on_update=(callback)
|
82
|
+
@update_callback = callback
|
88
83
|
end
|
89
84
|
end
|
90
85
|
end
|
data/lib/elevate/version.rb
CHANGED
data/spec/api_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe Elevate do
|
|
12
12
|
true
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
on_finish do |result, exception|
|
16
16
|
@called = result
|
17
17
|
resume
|
18
18
|
end
|
@@ -29,7 +29,7 @@ describe Elevate do
|
|
29
29
|
@name
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
on_finish do |name, exception|
|
33
33
|
@result = name
|
34
34
|
resume
|
35
35
|
end
|
@@ -39,5 +39,34 @@ describe Elevate do
|
|
39
39
|
@result.should == "harry"
|
40
40
|
end
|
41
41
|
end
|
42
|
+
|
43
|
+
it "allows tasks to report progress" do
|
44
|
+
@updates = []
|
45
|
+
|
46
|
+
async do
|
47
|
+
task do
|
48
|
+
sleep 0.1
|
49
|
+
yield 1
|
50
|
+
sleep 0.2
|
51
|
+
yield 2
|
52
|
+
sleep 0.3
|
53
|
+
yield 3
|
54
|
+
|
55
|
+
true
|
56
|
+
end
|
57
|
+
|
58
|
+
on_update do |count|
|
59
|
+
@updates << count
|
60
|
+
end
|
61
|
+
|
62
|
+
on_finish do |result, exception|
|
63
|
+
resume
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
wait_max 1.0 do
|
68
|
+
@updates.should == [1,2,3]
|
69
|
+
end
|
70
|
+
end
|
42
71
|
end
|
43
72
|
end
|
data/spec/operation_spec.rb
CHANGED
@@ -13,12 +13,12 @@ describe Elevate::ElevateOperation do
|
|
13
13
|
@operation.class.ancestors.should.include NSOperation
|
14
14
|
end
|
15
15
|
|
16
|
-
describe "#
|
16
|
+
describe "#on_finish=" do
|
17
17
|
it "invokes it after #on_started" do
|
18
18
|
@lock = NSLock.alloc.init
|
19
19
|
@value = []
|
20
20
|
|
21
|
-
@operation.
|
21
|
+
@operation.on_start = lambda do
|
22
22
|
@lock.lock()
|
23
23
|
if @value == []
|
24
24
|
@value << 1
|
@@ -26,7 +26,7 @@ describe Elevate::ElevateOperation do
|
|
26
26
|
@lock.unlock()
|
27
27
|
end
|
28
28
|
|
29
|
-
@operation.
|
29
|
+
@operation.on_finish = lambda do |result, exception|
|
30
30
|
@lock.lock()
|
31
31
|
if @value == [1]
|
32
32
|
@value << 2
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elevate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -85,7 +85,6 @@ files:
|
|
85
85
|
- .gitignore
|
86
86
|
- .travis.yml
|
87
87
|
- Gemfile
|
88
|
-
- Gemfile.lock
|
89
88
|
- Guardfile
|
90
89
|
- LICENSE
|
91
90
|
- README.md
|
@@ -107,10 +106,10 @@ files:
|
|
107
106
|
- lib/elevate/io_coordinator.rb
|
108
107
|
- lib/elevate/operation.rb
|
109
108
|
- lib/elevate/promise.rb
|
109
|
+
- lib/elevate/task_context.rb
|
110
110
|
- lib/elevate/version.rb
|
111
111
|
- spec/api_spec.rb
|
112
112
|
- spec/callback_spec.rb
|
113
|
-
- spec/dsl_spec.rb
|
114
113
|
- spec/http/activity_indicator_spec.rb
|
115
114
|
- spec/http/http_client_spec.rb
|
116
115
|
- spec/http/http_request_spec.rb
|
@@ -128,28 +127,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
128
127
|
- - ! '>='
|
129
128
|
- !ruby/object:Gem::Version
|
130
129
|
version: '0'
|
131
|
-
segments:
|
132
|
-
- 0
|
133
|
-
hash: -1464207392655779665
|
134
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
131
|
none: false
|
136
132
|
requirements:
|
137
133
|
- - ! '>='
|
138
134
|
- !ruby/object:Gem::Version
|
139
135
|
version: '0'
|
140
|
-
segments:
|
141
|
-
- 0
|
142
|
-
hash: -1464207392655779665
|
143
136
|
requirements: []
|
144
137
|
rubyforge_project:
|
145
|
-
rubygems_version: 1.8.
|
138
|
+
rubygems_version: 1.8.23
|
146
139
|
signing_key:
|
147
140
|
specification_version: 3
|
148
141
|
summary: Distill the essence of your RubyMotion app
|
149
142
|
test_files:
|
150
143
|
- spec/api_spec.rb
|
151
144
|
- spec/callback_spec.rb
|
152
|
-
- spec/dsl_spec.rb
|
153
145
|
- spec/http/activity_indicator_spec.rb
|
154
146
|
- spec/http/http_client_spec.rb
|
155
147
|
- spec/http/http_request_spec.rb
|
data/Gemfile.lock
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
elevate (0.4.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
coderay (1.0.8)
|
10
|
-
guard (1.6.2)
|
11
|
-
listen (>= 0.6.0)
|
12
|
-
lumberjack (>= 1.0.2)
|
13
|
-
pry (>= 0.9.10)
|
14
|
-
terminal-table (>= 1.4.3)
|
15
|
-
thor (>= 0.14.6)
|
16
|
-
guard-motion (0.1.1)
|
17
|
-
guard (>= 1.1.0)
|
18
|
-
rake (>= 0.9)
|
19
|
-
listen (0.7.2)
|
20
|
-
lumberjack (1.0.2)
|
21
|
-
method_source (0.8.1)
|
22
|
-
pry (0.9.11.4)
|
23
|
-
coderay (~> 1.0.5)
|
24
|
-
method_source (~> 0.8)
|
25
|
-
slop (~> 3.4)
|
26
|
-
rake (0.9.6)
|
27
|
-
rb-fsevent (0.9.3)
|
28
|
-
slop (3.4.3)
|
29
|
-
terminal-table (1.4.5)
|
30
|
-
thor (0.17.0)
|
31
|
-
webstub (0.3.4)
|
32
|
-
|
33
|
-
PLATFORMS
|
34
|
-
ruby
|
35
|
-
|
36
|
-
DEPENDENCIES
|
37
|
-
elevate!
|
38
|
-
guard-motion (~> 0.1.1)
|
39
|
-
rake (>= 0.9.0)
|
40
|
-
rb-fsevent (~> 0.9.1)
|
41
|
-
webstub (~> 0.3.3)
|
data/spec/dsl_spec.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
describe Elevate::DSL do
|
2
|
-
describe "#on_started" do
|
3
|
-
it "stores the provided block" do
|
4
|
-
i = Elevate::DSL.new do
|
5
|
-
on_started { puts 'hi' }
|
6
|
-
end
|
7
|
-
|
8
|
-
i.started_callback.should.not.be.nil
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
describe "#on_completed" do
|
13
|
-
it "stores the passed block" do
|
14
|
-
i = Elevate::DSL.new do
|
15
|
-
on_completed { |result, exception| puts 'hi' }
|
16
|
-
end
|
17
|
-
|
18
|
-
i.finished_callback.should.not.be.nil
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|