acfs 0.15.0 → 0.16.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: f5bd82876ac05bd67b6a8d95a8d9e0779eb7d1c1
4
- data.tar.gz: 5234ed3bfb459596c3cc0533bec51a67013f0b69
3
+ metadata.gz: 0f5f03951ec6374b76946211e390bfc2c0ff6f1f
4
+ data.tar.gz: af8cf339ce2bc9e4a5542a55bb1b8d1e8b63793b
5
5
  SHA512:
6
- metadata.gz: e10f336df5c116c5155ab4c51dbbe8a746ce3235b87180c69a5a1651ed285c75abeccd219b95fc0dda1a5e65bd9ccd3bfa74a42f672ae9de60d8ec1f9f99f14a
7
- data.tar.gz: 8631fdb5b179084f4f54ca953aa750f6b70242c5ebcd6aa6c52f97836663dd88e3d98c6dc30239c9144a63718913d3bac4041530a3aaccebedf8567f4404ef4e
6
+ metadata.gz: 66728dbe0550a7d8585d1d47b615c60534417d176125ddca78b572e11e13f6611b4ec16877db10096c4752f9d24f1323ea01da8bfc5f0b97fd9bcd83e530a85f
7
+ data.tar.gz: 55f211e28b344c2c5245161d76c12826cd6c89d36132a7838fdfa1402ac5e1dde1618851e3a1e9d6c1c40b5b17ff6bbdef5c6101b464d1cd7196a46d66418a3c
@@ -3,6 +3,7 @@ rvm:
3
3
  - 2.0.0
4
4
  - 1.9.3
5
5
  - jruby
6
+ - rbx-19mode
6
7
 
7
8
  gemfile:
8
9
  - gemfiles/Gemfile.rails-3-2
@@ -0,0 +1,78 @@
1
+ # Changelog
2
+
3
+ ## 0.16.0
4
+
5
+ * Add YAML configuration
6
+ * Add external configuration for services
7
+ * Add Rubinius support
8
+
9
+ ## 0.15.0
10
+
11
+ * Add stubbing capabilities for resources
12
+
13
+ ## 0.14.0 & 0.13.0
14
+
15
+ * Fix response attributes
16
+
17
+ ## 0.12.0
18
+
19
+ * Add JRuby support
20
+ * Improve handling of error respones (422)
21
+
22
+ ## 0.11.0
23
+
24
+ * Add Logger Middleware
25
+ * Add handling of error responses
26
+
27
+ ## 0.10.0
28
+
29
+ * Return hash with indifferent access for resource attributes
30
+
31
+ ## 0.9.0
32
+
33
+ * Add create operation
34
+
35
+ ## 0.8.0
36
+
37
+ * Add save operation (PUT and POST)
38
+ * Add JSON and MessagePack encoder middlewares for encoding request data
39
+ * ActiveModel::Dirty
40
+ * Add persistant state methods
41
+
42
+ ## 0.7.0
43
+
44
+ * Per-service middleware stack
45
+
46
+ ## 0.6.0
47
+
48
+ * Add support for multiple ids for .find
49
+ * Add MessagePack support
50
+
51
+ ## 0.5.1
52
+
53
+ * Fix mime type parsing for mime types with aditional parameters (ActionPack < 4.0)
54
+
55
+ ## 0.5.0
56
+
57
+ * Add mime type support for respones
58
+
59
+ ## 0.4.0
60
+
61
+ * Improve JSON response detection
62
+ * Add bool attribute type
63
+
64
+ ## 0.3.0
65
+
66
+ * Add tracking for loading state (if resource is loaded or queued)
67
+ * Add JSON middleware to decode respones
68
+ * Add middleware support
69
+ * Add method to fetch single resources or list of resources
70
+ * Use typhoeus as http library for parallel request processing
71
+
72
+ ## 0.2.0
73
+
74
+ * Allow to define resources and attributes
75
+
76
+ ## 0.1.0
77
+
78
+ * Project start
data/README.md CHANGED
@@ -10,7 +10,7 @@ Acfs covers model and service abstraction, convenient query and filter methods,
10
10
 
11
11
  Add this line to your application's Gemfile:
12
12
 
13
- gem 'acfs', '~> 0.14.0'
13
+ gem 'acfs', '~> 0.16.0'
14
14
 
15
15
  **Note:** Acfs is under development. I'll try to avoid changes to the public API but internal APIs may change quite often.
16
16
 
@@ -1,6 +1,7 @@
1
1
  require 'active_support'
2
- require 'active_support/core_ext/class'
3
2
  require 'active_support/core_ext/hash'
3
+ require 'active_support/core_ext/class'
4
+ require 'active_support/core_ext/string'
4
5
  require 'active_support/core_ext/module'
5
6
 
6
7
  require 'acfs/version'
@@ -19,6 +20,7 @@ module Acfs
19
20
  autoload :Stub
20
21
  autoload :Operation
21
22
  autoload :Runner
23
+ autoload :Configuration
22
24
 
23
25
  module Middleware
24
26
  extend ActiveSupport::Autoload
@@ -0,0 +1,63 @@
1
+ require 'uri'
2
+ require 'yaml'
3
+
4
+ module Acfs
5
+
6
+ #
7
+ #
8
+ class Configuration
9
+ attr_reader :locations
10
+
11
+ def initialize
12
+ @locations = {}
13
+ end
14
+
15
+ def configure(&block)
16
+ if block.arity > 0
17
+ block.call self
18
+ else
19
+ instance_eval &block
20
+ end
21
+ end
22
+
23
+ def locate(service, uri = nil)
24
+ service = service.to_s.underscore.to_sym
25
+ if uri.nil?
26
+ locations[service]
27
+ else
28
+ locations[service] = URI.parse uri
29
+ end
30
+ end
31
+
32
+ def load(filename)
33
+ config = YAML::load File.read filename
34
+ env = ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
35
+
36
+ config = config[env] if config.has_key? env
37
+ config.each do |key, value|
38
+ case key
39
+ when 'services' then load_services value
40
+ end
41
+ end
42
+ end
43
+
44
+ def load_services(services)
45
+ services.each do |service, data|
46
+ if (val = data).is_a?(String) || (val = data['locate'])
47
+ locate service.to_sym, val
48
+ end
49
+ end
50
+ end
51
+
52
+ class << self
53
+
54
+ def current
55
+ @configuration ||= new
56
+ end
57
+
58
+ def set(configuration)
59
+ @configuration = configuration if configuration.is_a? Configuration
60
+ end
61
+ end
62
+ end
63
+ end
@@ -29,5 +29,5 @@ module Acfs
29
29
  end
30
30
  end
31
31
 
32
- class RealRequestNotAllowedError < StandardError; end
32
+ class RealRequestsNotAllowedError < StandardError; end
33
33
  end
@@ -13,5 +13,9 @@ module Acfs
13
13
  def run
14
14
  runner.start
15
15
  end
16
+
17
+ def configure(&block)
18
+ Configuration.current.configure &block
19
+ end
16
20
  end
17
21
  end
@@ -6,7 +6,6 @@ module Acfs
6
6
  #
7
7
  class Service
8
8
  attr_accessor :options
9
- class_attribute :base_url
10
9
 
11
10
  include Service::Middleware
12
11
 
@@ -26,5 +25,21 @@ module Acfs
26
25
  url += "/#{options[:suffix].to_s}" if options[:suffix]
27
26
  url
28
27
  end
28
+
29
+ class << self
30
+
31
+ def identity(identity = nil)
32
+ @identity = identity.to_s.to_sym unless identity.nil?
33
+ @identity ||= name.to_sym
34
+ end
35
+
36
+ def base_url
37
+ unless (base = Acfs::Configuration.current.locate identity)
38
+ raise ArgumentError, "#{identity} not configured. Add `locate '#{identity.to_s.underscore}', 'http://service.url/'` to your configuration."
39
+ end
40
+
41
+ base.to_s
42
+ end
43
+ end
29
44
  end
30
45
  end
@@ -60,7 +60,7 @@ module Acfs
60
60
  stub = stub_for op
61
61
  unless stub
62
62
  return false if allow_requests?
63
- raise RealRequestNotAllowedError, "No stub found for `#{op.resource.name}` with params `#{op.params}`"
63
+ raise RealRequestsNotAllowedError, "No stub found for `#{op.resource.name}` with params `#{op.params}`"
64
64
  end
65
65
 
66
66
  if (data = stub[:return])
@@ -1,7 +1,7 @@
1
1
  module Acfs
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 15
4
+ MINOR = 16
5
5
  PATCH = 0
6
6
  STAGE = nil
7
7
 
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Acfs::Configuration do
4
+
5
+ let(:cfg) { Acfs::Configuration.new }
6
+ before { @configuration = Acfs::Configuration.current.dup }
7
+ after { Acfs::Configuration.set @configuration }
8
+
9
+ describe 'Acfs.configure' do
10
+
11
+ it 'should invoke configure on current configuration' do
12
+ Acfs::Configuration.current.should_receive(:configure).once.and_call_original
13
+
14
+ Acfs.configure do |c|
15
+ expect(c).to be_a Acfs::Configuration
16
+ end
17
+ end
18
+ end
19
+
20
+ describe '.load' do
21
+ it 'should be able to load YAML' do
22
+ cfg.configure do
23
+ load 'spec/fixtures/config.yml'
24
+ end
25
+
26
+ expect(cfg.locate(UserService).to_s).to be == 'http://localhost:3001/'
27
+ expect(cfg.locate(CommentService).to_s).to be == 'http://localhost:3002/'
28
+ end
29
+
30
+ context 'with RACK_ENV' do
31
+ before { @env = ENV['RACK_ENV']; ENV['RACK_ENV'] = 'production' }
32
+ after { ENV['RACK_ENV'] = @env }
33
+
34
+ it 'should load ENV block' do
35
+ cfg.configure do
36
+ load 'spec/fixtures/config.yml'
37
+ end
38
+
39
+ expect(cfg.locate(UserService).to_s).to be == 'http://user.example.org/'
40
+ expect(cfg.locate(CommentService).to_s).to be == 'http://comment.example.org/'
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,14 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Acfs::Service do
4
- let(:srv_class) { Class.new(Acfs::Service) }
4
+ let(:srv_class) { Class.new(Acfs::Service) { identity :test } }
5
5
  let(:options) { {} }
6
6
  let(:service) { srv_class.new options }
7
7
 
8
+ before do
9
+ Acfs::Configuration.current.locate :test, ''
10
+ end
11
+
8
12
  describe '#initialize' do
9
13
  let(:options) { { path: 'abc', key: 'value' } }
10
14
 
11
- it "should set options" do
15
+ it 'should set options' do
12
16
  expect(service.options).to eq(options)
13
17
  end
14
18
  end
@@ -28,8 +32,12 @@ describe Acfs::Service do
28
32
  end
29
33
 
30
34
  describe '.base_url' do
31
- it "should have a static base_url configuration option" do
32
- srv_class.base_url = 'http://abc.de/api/v1'
35
+
36
+ before do
37
+ Acfs::Configuration.current.locate :test, 'http://abc.de/api/v1'
38
+ end
39
+
40
+ it 'should return configured URI for service' do
33
41
 
34
42
  expect(srv_class.base_url).to eq('http://abc.de/api/v1')
35
43
  end
@@ -89,7 +89,7 @@ describe Acfs::Stub do
89
89
 
90
90
  it 'should allow real requests' do
91
91
  @user = MyUser.find 2
92
- expect { Acfs.run }.to raise_error(Acfs::RealRequestNotAllowedError)
92
+ expect { Acfs.run }.to raise_error(Acfs::RealRequestsNotAllowedError)
93
93
  end
94
94
  end
95
95
  end
@@ -0,0 +1,14 @@
1
+ development: &dev
2
+ services:
3
+ user_service: http://localhost:3001/
4
+ comment_service:
5
+ locate: http://localhost:3002/
6
+
7
+ production:
8
+ services:
9
+ user_service:
10
+ locate: http://user.example.org/
11
+ comment_service: http://comment.example.org/
12
+
13
+ test:
14
+ <<: *dev
@@ -1,13 +1,16 @@
1
1
 
2
+ Acfs.configure do
3
+ locate :user_service, 'http://users.example.org'
4
+ locate :comment_service, 'http://comments.example.org'
5
+ end
6
+
2
7
  class UserService < Acfs::Service
3
- self.base_url = 'http://users.example.org'
4
8
  use Acfs::Middleware::MessagePackDecoder
5
9
  use Acfs::Middleware::JsonDecoder
6
10
  use Acfs::Middleware::JsonEncoder
7
11
  end
8
12
 
9
13
  class CommentService < Acfs::Service
10
- self.base_url = 'http://comments.example.org'
11
14
  use Acfs::Middleware::JsonDecoder
12
15
  end
13
16
 
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.15.0
4
+ version: 0.16.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-05-09 00:00:00.000000000 Z
11
+ date: 2013-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -118,6 +118,7 @@ files:
118
118
  - .gitignore
119
119
  - .rspec
120
120
  - .travis.yml
121
+ - CHANGELOG.md
121
122
  - Gemfile
122
123
  - Guardfile
123
124
  - LICENSE
@@ -130,6 +131,7 @@ files:
130
131
  - lib/acfs/adapter/base.rb
131
132
  - lib/acfs/adapter/typhoeus.rb
132
133
  - lib/acfs/collection.rb
134
+ - lib/acfs/configuration.rb
133
135
  - lib/acfs/errors.rb
134
136
  - lib/acfs/global.rb
135
137
  - lib/acfs/middleware/base.rb
@@ -164,6 +166,7 @@ files:
164
166
  - lib/acfs/service/middleware.rb
165
167
  - lib/acfs/stub.rb
166
168
  - lib/acfs/version.rb
169
+ - spec/acfs/configuration_spec.rb
167
170
  - spec/acfs/middleware/json_decoder_spec.rb
168
171
  - spec/acfs/middleware/msgpack_decoder_spec.rb
169
172
  - spec/acfs/model/attributes_spec.rb
@@ -181,6 +184,7 @@ files:
181
184
  - spec/acfs/service_spec.rb
182
185
  - spec/acfs/stub_spec.rb
183
186
  - spec/acfs_spec.rb
187
+ - spec/fixtures/config.yml
184
188
  - spec/spec_helper.rb
185
189
  - spec/support/response.rb
186
190
  - spec/support/service.rb
@@ -209,6 +213,7 @@ signing_key:
209
213
  specification_version: 4
210
214
  summary: An abstract API base client for service oriented application.
211
215
  test_files:
216
+ - spec/acfs/configuration_spec.rb
212
217
  - spec/acfs/middleware/json_decoder_spec.rb
213
218
  - spec/acfs/middleware/msgpack_decoder_spec.rb
214
219
  - spec/acfs/model/attributes_spec.rb
@@ -226,6 +231,7 @@ test_files:
226
231
  - spec/acfs/service_spec.rb
227
232
  - spec/acfs/stub_spec.rb
228
233
  - spec/acfs_spec.rb
234
+ - spec/fixtures/config.yml
229
235
  - spec/spec_helper.rb
230
236
  - spec/support/response.rb
231
237
  - spec/support/service.rb