acfs 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36f33bb4ccf82d17ac10c0c1a142476817229231
4
- data.tar.gz: a881457d71f8437c9f81466e928eb4e7cb57df90
3
+ metadata.gz: 07e4fa8c5a501299db87e1fd63da042f42b4064d
4
+ data.tar.gz: 267732ea7fae5e6d110038ff8769ceb8ee3fb9dd
5
5
  SHA512:
6
- metadata.gz: fcb651f2c3c488d05fdebcd2a63ac2c6612a5d19188519456a1d690cccfe6fdc7786aeeddef7ae6dd30170aa9cc11a4b342037d2102ed4eb67d1b983950e8922
7
- data.tar.gz: eed4cc6c2c6dd9071c40c22fc5786541e7c5e615e708affe2d772e5d7a6e2c9005cb2d97e664bef9acad7cf222fa16904282797a7da1b27c4255a586c65f1aeb
6
+ metadata.gz: 1ef40e8272f8396f232e14efd645ded71b393cdeeea7ddd4057b3e671d212ab627d03e39b58e32e62f90e478b26656b1856ad48e9ad8cdf747c707ae284d5001
7
+ data.tar.gz: d5693941256b767e34fe7934bdfba838156af64f00d1c3d7bd29fc24a1483b4473d3adcfeba616d709183c14bbbe7db8790c8864a3d8918eb2db2b74ec3ea58d
data/README.md CHANGED
@@ -10,7 +10,7 @@ TODO: Write a gem description
10
10
 
11
11
  Add this line to your application's Gemfile:
12
12
 
13
- gem 'acfs', '0.6.0'
13
+ gem 'acfs', '0.7.0'
14
14
 
15
15
  **Note:** Acfs is under development. I'll try to avoid changes to the public
16
16
  API but internal APIs may change quite often.
@@ -30,6 +30,12 @@ First you need to define your service(s):
30
30
  ```ruby
31
31
  class UserService < Acfs::Service
32
32
  self.base_url = 'http://users.myapp.org'
33
+
34
+ # You can configure middlewares you want use for the service here.
35
+ # Each service has it own middleware stack.
36
+ #
37
+ use Acfs::Middleware::JsonDecoder
38
+ use Acfs::Middleware::MessagePackDecoder
33
39
  end
34
40
  ```
35
41
 
@@ -114,24 +120,25 @@ Acfs.run # This call will fire all request as parallel as possible.
114
120
  @user.name # => "John
115
121
  @comments.size # => 25
116
122
  @friends[0].name # => "Miraculix"
123
+ ```
117
124
 
118
125
  ## TODO
119
126
 
120
127
  * Create/Update operations
121
128
  * High level features
122
- ** Pagination? Filtering? (If service API provides such features.)
123
- ** Messaging Queue support for services and models
129
+ * Pagination? Filtering? (If service API provides such features.)
130
+ * Messaging Queue support for services and models
124
131
  * Documentation
125
132
 
126
133
  ## Contributing
127
134
 
128
135
  1. Fork it
129
136
  2. Create your feature branch (`git checkout -b my-new-feature`)
130
- 3a. Add specs for your feature
131
- 3b. Implement your feature
132
- 3c. Commit your changes (`git commit -am 'Add some feature'`)
133
- 4. Push to the branch (`git push origin my-new-feature`)
134
- 5. Create new Pull Request
137
+ 4. Add specs for your feature
138
+ 5. Implement your feature
139
+ 6. Commit your changes (`git commit -am 'Add some feature'`)
140
+ 7. Push to the branch (`git push origin my-new-feature`)
141
+ 8. Create new Pull Request
135
142
 
136
143
  ## License
137
144
 
@@ -33,35 +33,9 @@ module Acfs
33
33
  adapter.run
34
34
  end
35
35
 
36
- def queue(req, &block)
37
- request = Request.new req
38
- request.on_complete &block if block_given?
39
- middleware.call request
40
- end
41
-
42
36
  def adapter
43
37
  @adapter ||= Adapter::Typhoeus.new
44
38
  end
45
-
46
- def middleware
47
- @middleware ||= proc do |request|
48
- adapter.queue request
49
- end
50
- end
51
-
52
- def use(klass, options = {})
53
- @middlewares ||= []
54
-
55
- return false if @middlewares.include? klass
56
-
57
- @middlewares << klass
58
- @middleware = klass.new(middleware, options)
59
- end
60
-
61
- def clear
62
- @middleware = nil
63
- @middlewares = nil
64
- end
65
39
  end
66
40
  end
67
41
 
@@ -37,7 +37,7 @@ module Acfs::Model
37
37
  def all(params = {}, &block)
38
38
  collection = ::Acfs::Collection.new
39
39
 
40
- service.queue(Acfs::Request.new(url, params: params)) do |response|
40
+ request = Acfs::Request.new(url, params: params) do |response|
41
41
  response.data.each do |obj|
42
42
  collection << self.new.tap do |m|
43
43
  m.attributes = obj
@@ -47,6 +47,7 @@ module Acfs::Model
47
47
  collection.loaded!
48
48
  block.call collection unless block.nil?
49
49
  end
50
+ service.queue request
50
51
 
51
52
  collection
52
53
  end
@@ -56,12 +57,12 @@ module Acfs::Model
56
57
  def find_single(id, opts, &block)
57
58
  model = self.new
58
59
 
59
- request = Acfs::Request.new url(id.to_s)
60
- service.queue(request) do |response|
60
+ request = Acfs::Request.new url(id.to_s) do |response|
61
61
  model.attributes = response.data
62
62
  model.loaded!
63
63
  block.call model unless block.nil?
64
64
  end
65
+ service.queue request
65
66
 
66
67
  model
67
68
  end
@@ -11,7 +11,7 @@ module Acfs
11
11
 
12
12
  include Request::Callbacks
13
13
 
14
- def initialize(url, options = {})
14
+ def initialize(url, options = {}, &block)
15
15
  @url = URI.parse(url).tap do |url|
16
16
  @data = options.delete(:data) || nil
17
17
  @format = options.delete(:format) || :json
@@ -20,6 +20,7 @@ module Acfs
20
20
 
21
21
  url.query = nil # params.any? ? params.to_param : nil
22
22
  end.to_s
23
+ on_complete &block if block_given?
23
24
  end
24
25
 
25
26
  def data?
@@ -1,3 +1,6 @@
1
+ require 'acfs/service/middleware'
2
+ require 'acfs/service/queue'
3
+
1
4
  module Acfs
2
5
 
3
6
  # Service object.
@@ -6,6 +9,9 @@ module Acfs
6
9
  attr_accessor :options
7
10
  class_attribute :base_url
8
11
 
12
+ include Service::Queue
13
+ include Service::Middleware
14
+
9
15
  def initialize(options = {})
10
16
  @options = options
11
17
  end
@@ -22,9 +28,5 @@ module Acfs
22
28
  url += "/#{options[:suffix].to_s}" if options[:suffix]
23
29
  url
24
30
  end
25
-
26
- def queue(request, &block)
27
- Acfs.queue request, &block
28
- end
29
31
  end
30
32
  end
@@ -0,0 +1,51 @@
1
+ module Acfs
2
+ class Service
3
+
4
+ # Module providing all function to register middlewares
5
+ # on services and process queued request through the
6
+ # middleware stack.
7
+ #
8
+ module Middleware
9
+ extend ActiveSupport::Concern
10
+
11
+ # Queue a new request. The request will travel through
12
+ # all registered middleware.
13
+ #
14
+ def queue(req)
15
+ super self.class.middleware.call req
16
+ end
17
+
18
+ module ClassMethods
19
+
20
+ # Register a new middleware to be used for this service.
21
+ #
22
+ # class MyService < Acfs::Service
23
+ # self.base_url = 'http://my.srv'
24
+ # use Acfs::Middleware::JsonDecoder
25
+ # end
26
+ #
27
+ def use(klass, options = {})
28
+ @middlewares ||= []
29
+
30
+ return false if @middlewares.include? klass
31
+
32
+ @middlewares << klass
33
+ @middleware = klass.new(middleware, options)
34
+ end
35
+
36
+ # Return top most middleware.
37
+ #
38
+ def middleware
39
+ @middleware ||= proc { |request| request}
40
+ end
41
+
42
+ # Clear all registered middlewares.
43
+ #
44
+ def clear
45
+ @middleware = nil
46
+ @middlewares = nil
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,16 @@
1
+ module Acfs
2
+ class Service
3
+
4
+ # Allows to queue request on this service that will be
5
+ # delegated to global Acfs adapter queue.
6
+ #
7
+ module Queue
8
+
9
+ # Queue a new request on global adapter queue.
10
+ #
11
+ def queue(request)
12
+ Acfs.adapter.queue request
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,7 +1,7 @@
1
1
  module Acfs
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 6
4
+ MINOR = 7
5
5
  PATCH = 0
6
6
  STAGE = nil
7
7
 
@@ -3,17 +3,25 @@ require 'spec_helper'
3
3
  describe "Acfs" do
4
4
 
5
5
  before do
6
- Acfs.clear
7
- Acfs.use Acfs::Middleware::JsonDecoder
8
- Acfs.use Acfs::Middleware::MessagePackDecoder
9
-
10
- headers = { 'Content-Type' => 'application/json' }
11
- stub_request(:get, "http://users.example.org/users").to_return(:body => '[{"id":1,"name":"Anon","age":12},{"id":2,"name":"John","age":26}]', headers: headers)
12
- stub_request(:get, "http://users.example.org/users/2").to_return(:body => '{"id":2,"name":"John","age":26}', headers: headers)
13
- stub_request(:get, "http://users.example.org/users/3").to_return(:body => '{"id":2,"name":"Miraculix","age":122}', headers: headers)
14
- stub_request(:get, "http://users.example.org/users/100").to_return(:body => '{"id":2,"name":"Jimmy","age":45}', headers: headers)
15
- stub_request(:get, "http://users.example.org/users/2/friends").to_return(:body => '[{"id":1,"name":"Anon","age":12}]', headers: headers)
16
- stub_request(:get, "http://comments.example.org/comments?user=2").to_return(:body => '[{"id":1,"text":"Comment #1"},{"id":2,"text":"Comment #2"}]', headers: headers)
6
+ headers = {}
7
+ stub_request(:get, "http://users.example.org/users").to_return(
8
+ body: MessagePack.dump([{ id: 1, name: "Anon", age: 12 }, { id: 2, name: "John", age: 26 }]),
9
+ headers: headers.merge({'Content-Type' => 'application/x-msgpack'}))
10
+ stub_request(:get, "http://users.example.org/users/2").to_return(
11
+ body: MessagePack.dump({ id: 2, name: "John", age: 26 }),
12
+ headers: headers.merge({'Content-Type' => 'application/x-msgpack'}))
13
+ stub_request(:get, "http://users.example.org/users/3").to_return(
14
+ body: MessagePack.dump({ id: 2, name: "Miraculix", age: 122 }),
15
+ headers: headers.merge({'Content-Type' => 'application/x-msgpack'}))
16
+ stub_request(:get, "http://users.example.org/users/100").to_return(
17
+ body: '{"id":2,"name":"Jimmy","age":45}',
18
+ headers: headers.merge({'Content-Type' => 'application/json'}))
19
+ stub_request(:get, "http://users.example.org/users/2/friends").to_return(
20
+ body: '[{"id":1,"name":"Anon","age":12}]',
21
+ headers: headers.merge({'Content-Type' => 'application/json'}))
22
+ stub_request(:get, "http://comments.example.org/comments?user=2").to_return(
23
+ body: '[{"id":1,"text":"Comment #1"},{"id":2,"text":"Comment #2"}]',
24
+ headers: headers.merge({'Content-Type' => 'application/json'}))
17
25
  end
18
26
 
19
27
  it 'should load single resource' do
@@ -1,6 +1,8 @@
1
1
  require 'acfs'
2
2
  require 'coveralls'
3
- Coveralls.wear!
3
+ Coveralls.wear! do
4
+ add_filter 'spec'
5
+ end
4
6
 
5
7
  require 'webmock/rspec'
6
8
 
@@ -1,10 +1,13 @@
1
1
 
2
2
  class UserService < Acfs::Service
3
3
  self.base_url = 'http://users.example.org'
4
+ use Acfs::Middleware::MessagePackDecoder
5
+ use Acfs::Middleware::JsonDecoder
4
6
  end
5
7
 
6
8
  class CommentService < Acfs::Service
7
9
  self.base_url = 'http://comments.example.org'
10
+ use Acfs::Middleware::JsonDecoder
8
11
  end
9
12
 
10
13
  class MyUser
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Graichen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-19 00:00:00.000000000 Z
11
+ date: 2013-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -220,17 +220,19 @@ files:
220
220
  - lib/acfs/response.rb
221
221
  - lib/acfs/response/formats.rb
222
222
  - lib/acfs/service.rb
223
+ - lib/acfs/service/middleware.rb
224
+ - lib/acfs/service/queue.rb
223
225
  - lib/acfs/version.rb
224
226
  - spec/acfs/middleware/json_decoder_spec.rb
225
227
  - spec/acfs/middleware/msgpack_decoder_spec.rb
226
228
  - spec/acfs/request/callbacks_spec.rb
227
229
  - spec/acfs/request_spec.rb
228
230
  - spec/acfs/response/formats_spec.rb
231
+ - spec/acfs/service_spec.rb
229
232
  - spec/acfs_spec.rb
230
233
  - spec/model/attributes_spec.rb
231
234
  - spec/model/initialization_spec.rb
232
235
  - spec/model/locatable_spec.rb
233
- - spec/service_spec.rb
234
236
  - spec/spec_helper.rb
235
237
  - spec/support/service.rb
236
238
  homepage: ''
@@ -263,10 +265,10 @@ test_files:
263
265
  - spec/acfs/request/callbacks_spec.rb
264
266
  - spec/acfs/request_spec.rb
265
267
  - spec/acfs/response/formats_spec.rb
268
+ - spec/acfs/service_spec.rb
266
269
  - spec/acfs_spec.rb
267
270
  - spec/model/attributes_spec.rb
268
271
  - spec/model/initialization_spec.rb
269
272
  - spec/model/locatable_spec.rb
270
- - spec/service_spec.rb
271
273
  - spec/spec_helper.rb
272
274
  - spec/support/service.rb