elevate 0.4.0 → 0.5.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.
- 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
|
+
[](https://codeclimate.com/github/mattgreen/elevate) [](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
|