commute 0.2.0.rc.2 → 0.3.0.pre
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/.todo +28 -12
- data/README.md +0 -1
- data/commute.gemspec +4 -5
- data/lib/commute/common/basic_auth.rb +10 -9
- data/lib/commute/common/caching.rb +208 -0
- data/lib/commute/common/chemicals.rb +47 -24
- data/lib/commute/common/eventmachine.rb +68 -0
- data/lib/commute/common/synchrony.rb +42 -0
- data/lib/commute/common/typhoeus.rb +64 -0
- data/lib/commute/core/api.rb +42 -29
- data/lib/commute/core/builder.rb +4 -15
- data/lib/commute/core/context.rb +156 -15
- data/lib/commute/core/http.rb +124 -0
- data/lib/commute/core/layer.rb +187 -0
- data/lib/commute/core/sequence.rb +83 -132
- data/lib/commute/core/stack.rb +63 -72
- data/lib/commute/core/status.rb +45 -0
- data/lib/commute/core/util/event_emitter.rb +58 -0
- data/lib/commute/core/util/path.rb +37 -0
- data/lib/commute/core/util/stream.rb +141 -0
- data/lib/commute/extensions/crud.rb +88 -0
- data/lib/commute/extensions/param.rb +20 -0
- data/lib/commute/extensions/url.rb +53 -0
- data/lib/commute/version.rb +1 -1
- data/spec/commute/common/caching_spec.rb +158 -0
- data/spec/commute/common/eventmachine_spec.rb +74 -0
- data/spec/commute/common/typhoeus_spec.rb +67 -0
- data/spec/commute/core/api_spec.rb +3 -1
- data/spec/commute/core/builder_spec.rb +8 -8
- data/spec/commute/core/http_spec.rb +39 -0
- data/spec/commute/core/layer_spec.rb +81 -0
- data/spec/commute/core/sequence_spec.rb +36 -150
- data/spec/commute/core/stack_spec.rb +33 -83
- data/spec/commute/core/util/event_emitter_spec.rb +35 -0
- data/spec/commute/core/util/path_spec.rb +29 -0
- data/spec/commute/core/util/stream_spec.rb +90 -0
- data/spec/commute/extensions/url_spec.rb +76 -0
- data/spec/spec_helper.rb +3 -1
- metadata +61 -48
- data/examples/gist_api.rb +0 -71
- data/examples/highrise_task_api.rb +0 -59
- data/examples/pastie_api.rb +0 -18
- data/lib/commute/aspects/caching.rb +0 -37
- data/lib/commute/aspects/crud.rb +0 -41
- data/lib/commute/aspects/pagination.rb +0 -16
- data/lib/commute/aspects/url.rb +0 -57
- data/lib/commute/common/cache.rb +0 -43
- data/lib/commute/common/conditional.rb +0 -27
- data/lib/commute/common/em-synchrony_adapter.rb +0 -29
- data/lib/commute/common/em_http_request_adapter.rb +0 -57
- data/lib/commute/common/typhoeus_adapter.rb +0 -40
- data/lib/commute/common/xml.rb +0 -7
- data/lib/commute/core/commuter.rb +0 -116
- data/lib/commute/core/processors/code_status_processor.rb +0 -40
- data/lib/commute/core/processors/hook.rb +0 -14
- data/lib/commute/core/processors/request_builder.rb +0 -26
- data/lib/commute/core/processors/sequencer.rb +0 -46
- data/lib/commute/core/request.rb +0 -58
- data/lib/commute/core/response.rb +0 -18
- data/spec/commute/aspects/caching_spec.rb +0 -12
- data/spec/commute/aspects/url_spec.rb +0 -61
- data/spec/commute/core/commuter_spec.rb +0 -64
- data/spec/commute/core/processors/code_status_processor_spec.rb +0 -5
- data/spec/commute/core/processors/hook_spec.rb +0 -25
- data/spec/commute/core/processors/request_builder_spec.rb +0 -25
- data/spec/commute/core/processors/sequencer_spec.rb +0 -33
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'commute/core/context'
|
3
|
+
require 'commute/core/http'
|
4
|
+
require 'commute/extensions/url'
|
5
|
+
|
6
|
+
describe Commute::Extension::Url do
|
7
|
+
|
8
|
+
class TestApi < Commute::Api
|
9
|
+
include Commute::Extension::Url
|
10
|
+
end
|
11
|
+
|
12
|
+
class TestApiClass < Commute::Api
|
13
|
+
include Commute::Extension::Url
|
14
|
+
url 'http://www.example.com'
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:request) { Commute::Http::Request.new nil }
|
18
|
+
|
19
|
+
it 'should be available both on class and instance level' do
|
20
|
+
TestApi.builder.respond_to?(:url).must_equal true
|
21
|
+
TestApi.new.respond_to?(:url).must_equal true
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should work on class level' do
|
25
|
+
TestApiClass.builder.transformations.size.must_equal 1
|
26
|
+
TestApiClass.new.transformations.size.must_equal 1
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should create an url transformation without parameters' do
|
30
|
+
transformation = example('http://api.example.com')
|
31
|
+
# Hash that acts as a context.
|
32
|
+
context = Commute::Context.new
|
33
|
+
transformation.call(request, context)
|
34
|
+
# Checks.
|
35
|
+
request.uri.scheme.must_equal 'http'
|
36
|
+
request.uri.host.must_equal 'api.example.com'
|
37
|
+
request.uri.path.must_be_empty
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should create an url transformation with parameters in the host and path' do
|
41
|
+
transformation = example('https://api.%{root}.com:3000/1/%{scope}/%{id}.xml')
|
42
|
+
# Hash that acts as a context.
|
43
|
+
context = Commute::Context.new(nil, {
|
44
|
+
root: 'example',
|
45
|
+
scope: 'people',
|
46
|
+
id: '3'
|
47
|
+
})
|
48
|
+
transformation.call(request, context)
|
49
|
+
# Checks.
|
50
|
+
request.uri.scheme.must_equal 'https'
|
51
|
+
request.uri.host.must_equal 'api.example.com'
|
52
|
+
request.uri.path.must_equal '/1/people/3.xml'
|
53
|
+
request.uri.port.must_equal 3000
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should create an url transformation with parameters in the host and path when only some of the values are present' do
|
57
|
+
transformation = example('https://api.%{root}.com:3000/1/%{scope}/%{id}.xml')
|
58
|
+
# Hash that acts as a context.
|
59
|
+
context = Commute::Context.new(nil, {
|
60
|
+
root: 'example',
|
61
|
+
scope: 'people'
|
62
|
+
})
|
63
|
+
transformation.call(request, context)
|
64
|
+
# Checks.
|
65
|
+
request.uri.scheme.must_equal 'https'
|
66
|
+
request.uri.host.must_equal 'api.example.com'
|
67
|
+
request.uri.path.must_equal '/1/people.xml'
|
68
|
+
request.uri.port.must_equal 3000
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def example pattern
|
74
|
+
TestApi.new(Commute::Context.new).url(pattern).transformations.first
|
75
|
+
end
|
76
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commute
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0.pre
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: typhoeus
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- - '
|
19
|
+
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0
|
22
|
-
type: :
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- - '
|
27
|
+
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0
|
29
|
+
version: '0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: em-http-request
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -35,7 +35,23 @@ dependencies:
|
|
35
35
|
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: '0'
|
38
|
-
type: :
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: yajl-ruby
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
39
55
|
prerelease: false
|
40
56
|
version_requirements: !ruby/object:Gem::Requirement
|
41
57
|
none: false
|
@@ -76,7 +92,7 @@ dependencies:
|
|
76
92
|
- !ruby/object:Gem::Version
|
77
93
|
version: '0'
|
78
94
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
95
|
+
name: rb-fsevent
|
80
96
|
requirement: !ruby/object:Gem::Requirement
|
81
97
|
none: false
|
82
98
|
requirements:
|
@@ -92,7 +108,7 @@ dependencies:
|
|
92
108
|
- !ruby/object:Gem::Version
|
93
109
|
version: '0'
|
94
110
|
- !ruby/object:Gem::Dependency
|
95
|
-
name: guard
|
111
|
+
name: guard
|
96
112
|
requirement: !ruby/object:Gem::Requirement
|
97
113
|
none: false
|
98
114
|
requirements:
|
@@ -108,7 +124,7 @@ dependencies:
|
|
108
124
|
- !ruby/object:Gem::Version
|
109
125
|
version: '0'
|
110
126
|
- !ruby/object:Gem::Dependency
|
111
|
-
name:
|
127
|
+
name: guard-minitest
|
112
128
|
requirement: !ruby/object:Gem::Requirement
|
113
129
|
none: false
|
114
130
|
requirements:
|
@@ -124,7 +140,7 @@ dependencies:
|
|
124
140
|
- !ruby/object:Gem::Version
|
125
141
|
version: '0'
|
126
142
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
143
|
+
name: yard
|
128
144
|
requirement: !ruby/object:Gem::Requirement
|
129
145
|
none: false
|
130
146
|
requirements:
|
@@ -140,7 +156,7 @@ dependencies:
|
|
140
156
|
- !ruby/object:Gem::Version
|
141
157
|
version: '0'
|
142
158
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
159
|
+
name: simplecov
|
144
160
|
requirement: !ruby/object:Gem::Requirement
|
145
161
|
none: false
|
146
162
|
requirements:
|
@@ -156,7 +172,7 @@ dependencies:
|
|
156
172
|
- !ruby/object:Gem::Version
|
157
173
|
version: '0'
|
158
174
|
- !ruby/object:Gem::Dependency
|
159
|
-
name:
|
175
|
+
name: webmock
|
160
176
|
requirement: !ruby/object:Gem::Requirement
|
161
177
|
none: false
|
162
178
|
requirements:
|
@@ -187,48 +203,43 @@ files:
|
|
187
203
|
- README.md
|
188
204
|
- Rakefile
|
189
205
|
- commute.gemspec
|
190
|
-
- examples/gist_api.rb
|
191
|
-
- examples/highrise_task_api.rb
|
192
|
-
- examples/pastie_api.rb
|
193
206
|
- lib/commute.rb
|
194
|
-
- lib/commute/aspects/caching.rb
|
195
|
-
- lib/commute/aspects/crud.rb
|
196
|
-
- lib/commute/aspects/pagination.rb
|
197
|
-
- lib/commute/aspects/url.rb
|
198
207
|
- lib/commute/common/basic_auth.rb
|
199
|
-
- lib/commute/common/
|
208
|
+
- lib/commute/common/caching.rb
|
200
209
|
- lib/commute/common/chemicals.rb
|
201
|
-
- lib/commute/common/
|
202
|
-
- lib/commute/common/em-synchrony_adapter.rb
|
203
|
-
- lib/commute/common/em_http_request_adapter.rb
|
210
|
+
- lib/commute/common/eventmachine.rb
|
204
211
|
- lib/commute/common/json.rb
|
205
|
-
- lib/commute/common/
|
206
|
-
- lib/commute/common/
|
212
|
+
- lib/commute/common/synchrony.rb
|
213
|
+
- lib/commute/common/typhoeus.rb
|
207
214
|
- lib/commute/configuration.rb
|
208
215
|
- lib/commute/core/api.rb
|
209
216
|
- lib/commute/core/builder.rb
|
210
|
-
- lib/commute/core/commuter.rb
|
211
217
|
- lib/commute/core/context.rb
|
212
|
-
- lib/commute/core/
|
213
|
-
- lib/commute/core/
|
214
|
-
- lib/commute/core/processors/request_builder.rb
|
215
|
-
- lib/commute/core/processors/sequencer.rb
|
216
|
-
- lib/commute/core/request.rb
|
217
|
-
- lib/commute/core/response.rb
|
218
|
+
- lib/commute/core/http.rb
|
219
|
+
- lib/commute/core/layer.rb
|
218
220
|
- lib/commute/core/sequence.rb
|
219
221
|
- lib/commute/core/stack.rb
|
222
|
+
- lib/commute/core/status.rb
|
223
|
+
- lib/commute/core/util/event_emitter.rb
|
224
|
+
- lib/commute/core/util/path.rb
|
225
|
+
- lib/commute/core/util/stream.rb
|
226
|
+
- lib/commute/extensions/crud.rb
|
227
|
+
- lib/commute/extensions/param.rb
|
228
|
+
- lib/commute/extensions/url.rb
|
220
229
|
- lib/commute/version.rb
|
221
|
-
- spec/commute/
|
222
|
-
- spec/commute/
|
230
|
+
- spec/commute/common/caching_spec.rb
|
231
|
+
- spec/commute/common/eventmachine_spec.rb
|
232
|
+
- spec/commute/common/typhoeus_spec.rb
|
223
233
|
- spec/commute/core/api_spec.rb
|
224
234
|
- spec/commute/core/builder_spec.rb
|
225
|
-
- spec/commute/core/
|
226
|
-
- spec/commute/core/
|
227
|
-
- spec/commute/core/processors/hook_spec.rb
|
228
|
-
- spec/commute/core/processors/request_builder_spec.rb
|
229
|
-
- spec/commute/core/processors/sequencer_spec.rb
|
235
|
+
- spec/commute/core/http_spec.rb
|
236
|
+
- spec/commute/core/layer_spec.rb
|
230
237
|
- spec/commute/core/sequence_spec.rb
|
231
238
|
- spec/commute/core/stack_spec.rb
|
239
|
+
- spec/commute/core/util/event_emitter_spec.rb
|
240
|
+
- spec/commute/core/util/path_spec.rb
|
241
|
+
- spec/commute/core/util/stream_spec.rb
|
242
|
+
- spec/commute/extensions/url_spec.rb
|
232
243
|
- spec/spec_helper.rb
|
233
244
|
homepage: http://challengee.github.com/commute/
|
234
245
|
licenses: []
|
@@ -257,16 +268,18 @@ summary: ! 'Commute helps you to: 1) Dynamically build HTTP requests for your fa
|
|
257
268
|
HTTP library (currently only Typhoeus). 2) Easily process request and response bodies.
|
258
269
|
3) Execute parallel HTTP requests.'
|
259
270
|
test_files:
|
260
|
-
- spec/commute/
|
261
|
-
- spec/commute/
|
271
|
+
- spec/commute/common/caching_spec.rb
|
272
|
+
- spec/commute/common/eventmachine_spec.rb
|
273
|
+
- spec/commute/common/typhoeus_spec.rb
|
262
274
|
- spec/commute/core/api_spec.rb
|
263
275
|
- spec/commute/core/builder_spec.rb
|
264
|
-
- spec/commute/core/
|
265
|
-
- spec/commute/core/
|
266
|
-
- spec/commute/core/processors/hook_spec.rb
|
267
|
-
- spec/commute/core/processors/request_builder_spec.rb
|
268
|
-
- spec/commute/core/processors/sequencer_spec.rb
|
276
|
+
- spec/commute/core/http_spec.rb
|
277
|
+
- spec/commute/core/layer_spec.rb
|
269
278
|
- spec/commute/core/sequence_spec.rb
|
270
279
|
- spec/commute/core/stack_spec.rb
|
280
|
+
- spec/commute/core/util/event_emitter_spec.rb
|
281
|
+
- spec/commute/core/util/path_spec.rb
|
282
|
+
- spec/commute/core/util/stream_spec.rb
|
283
|
+
- spec/commute/extensions/url_spec.rb
|
271
284
|
- spec/spec_helper.rb
|
272
285
|
has_rdoc:
|
data/examples/gist_api.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'commute'
|
2
|
-
require 'commute/common/json'
|
3
|
-
require 'commute/common/basic_auth'
|
4
|
-
|
5
|
-
class GistApi < Commute::Api
|
6
|
-
|
7
|
-
transform do |request, context|
|
8
|
-
if context[:auth][:username]
|
9
|
-
request.url = "https://api.github.com/gists"
|
10
|
-
else
|
11
|
-
request.url = "https://api.github.com/#{context[:auth][:username]}/gists"
|
12
|
-
end
|
13
|
-
request.url << "/#{context[:id]}" if context[:id]
|
14
|
-
end
|
15
|
-
|
16
|
-
using(:request) do
|
17
|
-
append Commute::Common::Json::Render.new
|
18
|
-
append Commute::Common::BasicAuth.new
|
19
|
-
end
|
20
|
-
|
21
|
-
using(:response) do
|
22
|
-
append Commute::Common::Json::Parse.new
|
23
|
-
end
|
24
|
-
|
25
|
-
def find id = nil
|
26
|
-
# Id for url.
|
27
|
-
where id: id if id
|
28
|
-
# Get method.
|
29
|
-
get
|
30
|
-
end
|
31
|
-
|
32
|
-
def update gist = nil
|
33
|
-
body(gist).patch
|
34
|
-
end
|
35
|
-
|
36
|
-
def create gist = nil
|
37
|
-
body(gist).post
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def body gist = nil
|
43
|
-
with gist: gist if gist
|
44
|
-
transform(:gist) { |request, gist| request.body = gist }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
ID = '46ecd83c5e13cca5a18e'
|
49
|
-
|
50
|
-
api = GistApi.with auth: {
|
51
|
-
username: 'challengee',
|
52
|
-
password: 'challengeez0'
|
53
|
-
}
|
54
|
-
|
55
|
-
# gist, status = api.find(ID).run
|
56
|
-
# p status
|
57
|
-
|
58
|
-
# gist[:description] = 'cool'
|
59
|
-
|
60
|
-
gist = {
|
61
|
-
:public => false
|
62
|
-
:files => {
|
63
|
-
"file1.txt" => {
|
64
|
-
:content => 'test'
|
65
|
-
}
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
gist, status = api.create(gist).run
|
70
|
-
p gist
|
71
|
-
p status
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
|
3
|
-
require 'commute'
|
4
|
-
|
5
|
-
require 'commute/aspects/url'
|
6
|
-
require 'commute/aspects/crud'
|
7
|
-
require 'commute/common/basic_auth'
|
8
|
-
|
9
|
-
require 'active_support/core_ext/hash/conversions'
|
10
|
-
|
11
|
-
class HighriseTaskApi < Commute::Api
|
12
|
-
include Commute::Aspect::Url
|
13
|
-
include Commute::Aspect::Crud
|
14
|
-
|
15
|
-
using(:request) do
|
16
|
-
append Proc.new { |c|
|
17
|
-
c.get.body = c.get.body.to_xml(root: 'task').gsub("\n", '') if c.get.body
|
18
|
-
}
|
19
|
-
append Commute::Common::BasicAuth.new
|
20
|
-
end
|
21
|
-
|
22
|
-
using(:response) do
|
23
|
-
# append Proc.new { |c|
|
24
|
-
# c.get.body = Array.from_xml(c.get.body)['tasks'] if c.get.body
|
25
|
-
# }
|
26
|
-
end
|
27
|
-
|
28
|
-
url 'https://$account.highrisehq.com/$scope/tasks/$id.xml'
|
29
|
-
|
30
|
-
transform(:task) do |request, context|
|
31
|
-
request.body = context[:task]
|
32
|
-
end
|
33
|
-
# transform :task => :body
|
34
|
-
|
35
|
-
transform { |request| request.headers['Content-Type'] = 'application/xml' }
|
36
|
-
|
37
|
-
def update task = nil
|
38
|
-
super.transform { |request| request.query['reload'] = 'true' }
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
api = HighriseTaskApi.with account: 'piepetest', auth: {
|
43
|
-
username: '610bf60020bb861761f07feef88ba42d',
|
44
|
-
password: 'X'
|
45
|
-
}
|
46
|
-
|
47
|
-
task = {
|
48
|
-
body: 'Kmoe iets doen'
|
49
|
-
}
|
50
|
-
|
51
|
-
task, status = api.all.run
|
52
|
-
p task.size
|
53
|
-
p status
|
54
|
-
|
55
|
-
p 'AGAIN ------------------'
|
56
|
-
|
57
|
-
task, status = api.all.run
|
58
|
-
p task.size
|
59
|
-
p status
|
data/examples/pastie_api.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'commute'
|
2
|
-
|
3
|
-
class PastieApi < Commute::Api
|
4
|
-
|
5
|
-
transform(:id) do |request, id|
|
6
|
-
request.url = "http://pastie.org/pastes/#{id}/download"
|
7
|
-
end
|
8
|
-
|
9
|
-
def find id = nil
|
10
|
-
# Id for url.
|
11
|
-
where id: id if id
|
12
|
-
# Get method.
|
13
|
-
get
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
pastie, status = PastieApi.find(5119067).run.data
|
18
|
-
# p pastie
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'commute/common/cache'
|
2
|
-
require 'commute/common/conditional'
|
3
|
-
|
4
|
-
module Commute
|
5
|
-
module Aspect
|
6
|
-
|
7
|
-
# Public: Enables caching in your api by inserting
|
8
|
-
# cache processors in the api stack.
|
9
|
-
#
|
10
|
-
# Requires you to have a processor called request, before
|
11
|
-
# which the fetch processor will be inserted.
|
12
|
-
#
|
13
|
-
module Caching
|
14
|
-
|
15
|
-
def self.included api
|
16
|
-
# Insert a processor that fetches response from the cache.
|
17
|
-
api.builder.using(:request) do
|
18
|
-
insert Common::Cache::Fetch.new
|
19
|
-
end
|
20
|
-
|
21
|
-
# Insert a processor that inserts responses in the cache.
|
22
|
-
api.builder.using(:response) do
|
23
|
-
append Common::Cache::Store.new
|
24
|
-
end
|
25
|
-
|
26
|
-
# Wrap some phases so that they will only be executed on a miss.
|
27
|
-
api.builder.using do
|
28
|
-
[:execution, :response, :status].each do |id|
|
29
|
-
sequence.replace id do |processor|
|
30
|
-
Common::Conditional::NotTagged.new(processor, :hit)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/lib/commute/aspects/crud.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Commute
|
2
|
-
module Aspect
|
3
|
-
|
4
|
-
module Crud
|
5
|
-
|
6
|
-
def self.included base
|
7
|
-
base.builder.transform(:body) do |request, resource|
|
8
|
-
request.body = resource
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def all
|
13
|
-
get.multiple
|
14
|
-
end
|
15
|
-
|
16
|
-
def find id = nil
|
17
|
-
get.where(id: id).single
|
18
|
-
end
|
19
|
-
|
20
|
-
def update body = nil
|
21
|
-
put.with(body: body).single
|
22
|
-
end
|
23
|
-
|
24
|
-
def create body = nil
|
25
|
-
post.with(body: body).single
|
26
|
-
end
|
27
|
-
|
28
|
-
def destroy id = nil
|
29
|
-
delete.where(id: id).single
|
30
|
-
end
|
31
|
-
|
32
|
-
def single
|
33
|
-
self
|
34
|
-
end
|
35
|
-
|
36
|
-
def multiple
|
37
|
-
self
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/commute/aspects/url.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module Commute
|
2
|
-
module Aspect
|
3
|
-
|
4
|
-
module Url
|
5
|
-
|
6
|
-
def self.included base
|
7
|
-
base.extend ClassMethods
|
8
|
-
end
|
9
|
-
|
10
|
-
module ClassMethods
|
11
|
-
def url pattern
|
12
|
-
transform &generate(pattern)
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def generate pattern
|
18
|
-
# Regex to match different parts of a URL.
|
19
|
-
matcher = \
|
20
|
-
/(?<scheme>https?):\/\/(?<host>[^\/:]+):?(?<port>\d+)?(?<path>[^\.]*)(?<extension>\..+)?/
|
21
|
-
# Match the pattern.
|
22
|
-
matched = matcher.match(pattern)
|
23
|
-
raise 'Invalid url: At least a host and scheme required' \
|
24
|
-
unless matched && matched[:host] && matched[:scheme]
|
25
|
-
# Collect the parts.
|
26
|
-
parts = {
|
27
|
-
scheme: matched[:scheme],
|
28
|
-
host: matched[:host].split('.'),
|
29
|
-
port: matched[:port],
|
30
|
-
path: matched[:path].split('/'),
|
31
|
-
extension: matched[:extension]
|
32
|
-
}
|
33
|
-
|
34
|
-
Proc.new do |request, context|
|
35
|
-
request.scheme = parts[:scheme]
|
36
|
-
request.host = fill(parts[:host], context).join '.'
|
37
|
-
request.path = fill(parts[:path], context).join('/') + (parts[:extension] || '')
|
38
|
-
request.port = matched[:port]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def fill parts, params
|
43
|
-
new_parts = []
|
44
|
-
parts.each do |part|
|
45
|
-
if part.start_with?('$')
|
46
|
-
param = params[part[1..-1].to_sym]
|
47
|
-
new_parts << param if param
|
48
|
-
else
|
49
|
-
new_parts << part
|
50
|
-
end
|
51
|
-
end
|
52
|
-
new_parts
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
data/lib/commute/common/cache.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Commute
|
2
|
-
module Common
|
3
|
-
|
4
|
-
module Cache
|
5
|
-
|
6
|
-
class Success
|
7
|
-
|
8
|
-
def success?
|
9
|
-
true
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
SUCCESS = Success.new
|
14
|
-
|
15
|
-
class Fetch
|
16
|
-
@id = :cache
|
17
|
-
|
18
|
-
def call commuter, cache = nil
|
19
|
-
return unless cache
|
20
|
-
request = commuter.get
|
21
|
-
# Hit.
|
22
|
-
if request.method == :get && result = cache.get(request.url)
|
23
|
-
commuter.set [result, SUCCESS]
|
24
|
-
commuter.tag :hit
|
25
|
-
commuter.return
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class Store
|
31
|
-
@id = :cache
|
32
|
-
|
33
|
-
def call commuter, cache = nil
|
34
|
-
return unless cache
|
35
|
-
response = commuter.get
|
36
|
-
if response.request.method == :get && response.body
|
37
|
-
cache.set response.request.url, response.body
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'commute/core/commuter'
|
2
|
-
|
3
|
-
module Commute
|
4
|
-
module Common
|
5
|
-
module Conditional
|
6
|
-
|
7
|
-
class Tagged
|
8
|
-
|
9
|
-
def initialize processor, *tags
|
10
|
-
@processor = processor
|
11
|
-
@tags = tags
|
12
|
-
end
|
13
|
-
|
14
|
-
def call commuter
|
15
|
-
@processor.call unless @tags.any? { |tag| commuter.tagged? tag }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class NotTagged < Tagged
|
20
|
-
|
21
|
-
def call commuter
|
22
|
-
@processor.call commuter if @tags.all? { |tag| !commuter.tagged? tag }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|