acfs 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +50 -0
- data/README.md +3 -4
- data/acfs.gemspec +19 -10
- data/lib/acfs.rb +2 -0
- data/lib/acfs/adapter/base.rb +6 -8
- data/lib/acfs/adapter/typhoeus.rb +26 -7
- data/lib/acfs/collection.rb +2 -1
- data/lib/acfs/collections/paginatable.rb +2 -1
- data/lib/acfs/configuration.rb +14 -7
- data/lib/acfs/errors.rb +33 -12
- data/lib/acfs/global.rb +12 -2
- data/lib/acfs/location.rb +9 -5
- data/lib/acfs/middleware/base.rb +5 -1
- data/lib/acfs/middleware/json.rb +2 -0
- data/lib/acfs/middleware/logger.rb +2 -0
- data/lib/acfs/middleware/msgpack.rb +2 -0
- data/lib/acfs/middleware/print.rb +2 -0
- data/lib/acfs/middleware/serializer.rb +2 -0
- data/lib/acfs/operation.rb +5 -3
- data/lib/acfs/request.rb +3 -0
- data/lib/acfs/request/callbacks.rb +5 -1
- data/lib/acfs/resource.rb +2 -0
- data/lib/acfs/resource/attributes.rb +3 -2
- data/lib/acfs/resource/attributes/base.rb +2 -1
- data/lib/acfs/resource/attributes/boolean.rb +2 -0
- data/lib/acfs/resource/attributes/date_time.rb +2 -1
- data/lib/acfs/resource/attributes/dict.rb +2 -0
- data/lib/acfs/resource/attributes/float.rb +5 -3
- data/lib/acfs/resource/attributes/integer.rb +2 -0
- data/lib/acfs/resource/attributes/list.rb +2 -0
- data/lib/acfs/resource/attributes/string.rb +2 -0
- data/lib/acfs/resource/attributes/uuid.rb +4 -3
- data/lib/acfs/resource/dirty.rb +2 -0
- data/lib/acfs/resource/initialization.rb +2 -0
- data/lib/acfs/resource/loadable.rb +2 -0
- data/lib/acfs/resource/locatable.rb +10 -6
- data/lib/acfs/resource/operational.rb +2 -1
- data/lib/acfs/resource/persistence.rb +7 -4
- data/lib/acfs/resource/query_methods.rb +5 -3
- data/lib/acfs/resource/service.rb +3 -1
- data/lib/acfs/resource/validation.rb +3 -1
- data/lib/acfs/response.rb +2 -0
- data/lib/acfs/response/formats.rb +2 -0
- data/lib/acfs/response/status.rb +3 -1
- data/lib/acfs/rspec.rb +2 -0
- data/lib/acfs/runner.rb +6 -1
- data/lib/acfs/service.rb +8 -2
- data/lib/acfs/service/middleware.rb +2 -0
- data/lib/acfs/service/middleware/stack.rb +5 -3
- data/lib/acfs/singleton_resource.rb +4 -2
- data/lib/acfs/stub.rb +33 -11
- data/lib/acfs/util.rb +2 -0
- data/lib/acfs/version.rb +3 -1
- data/lib/acfs/yard.rb +1 -0
- data/spec/acfs/adapter/typhoeus_spec.rb +30 -3
- data/spec/acfs/collection_spec.rb +7 -5
- data/spec/acfs/configuration_spec.rb +2 -0
- data/spec/acfs/global_spec.rb +48 -1
- data/spec/acfs/location_spec.rb +25 -0
- data/spec/acfs/middleware/json_spec.rb +2 -0
- data/spec/acfs/middleware/msgpack_spec.rb +2 -0
- data/spec/acfs/operation_spec.rb +2 -0
- data/spec/acfs/request/callbacks_spec.rb +2 -0
- data/spec/acfs/request_spec.rb +3 -1
- data/spec/acfs/resource/attributes/boolean_spec.rb +2 -0
- data/spec/acfs/resource/attributes/date_time_spec.rb +2 -0
- data/spec/acfs/resource/attributes/dict_spec.rb +4 -2
- data/spec/acfs/resource/attributes/float_spec.rb +2 -0
- data/spec/acfs/resource/attributes/integer_spec.rb +2 -0
- data/spec/acfs/resource/attributes/list_spec.rb +5 -3
- data/spec/acfs/resource/attributes/uuid_spec.rb +2 -0
- data/spec/acfs/resource/attributes_spec.rb +6 -4
- data/spec/acfs/resource/dirty_spec.rb +2 -0
- data/spec/acfs/resource/initialization_spec.rb +8 -2
- data/spec/acfs/resource/loadable_spec.rb +2 -0
- data/spec/acfs/resource/locatable_spec.rb +2 -0
- data/spec/acfs/resource/persistance_spec.rb +10 -4
- data/spec/acfs/resource/query_methods_spec.rb +25 -18
- data/spec/acfs/resource/validation_spec.rb +2 -0
- data/spec/acfs/response/formats_spec.rb +3 -1
- data/spec/acfs/response/status_spec.rb +2 -0
- data/spec/acfs/runner_spec.rb +6 -8
- data/spec/acfs/service/middleware_spec.rb +2 -0
- data/spec/acfs/service_spec.rb +3 -1
- data/spec/acfs/singleton_resource_spec.rb +2 -0
- data/spec/acfs/stub_spec.rb +2 -0
- data/spec/acfs_spec.rb +2 -0
- data/spec/spec_helper.rb +11 -6
- data/spec/support/hash.rb +2 -0
- data/spec/support/response.rb +2 -0
- data/spec/support/service.rb +1 -0
- data/spec/support/shared/find_callbacks.rb +2 -0
- metadata +12 -11
data/lib/acfs/middleware/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Acfs
|
2
4
|
module Middleware
|
3
5
|
# A base middleware that does not modify request or response.
|
@@ -12,7 +14,9 @@ module Acfs
|
|
12
14
|
end
|
13
15
|
|
14
16
|
def call(request)
|
15
|
-
|
17
|
+
if respond_to? :response
|
18
|
+
request.on_complete {|res, nxt| response(res, nxt) }
|
19
|
+
end
|
16
20
|
app.call(request)
|
17
21
|
end
|
18
22
|
end
|
data/lib/acfs/middleware/json.rb
CHANGED
data/lib/acfs/operation.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Acfs
|
2
4
|
# @api private
|
3
5
|
#
|
@@ -19,7 +21,7 @@ module Acfs
|
|
19
21
|
@data = (opts[:data] || {}).dup
|
20
22
|
|
21
23
|
if opts[:url]
|
22
|
-
@url
|
24
|
+
@url = opts[:url]
|
23
25
|
else
|
24
26
|
@location = resource.location(action: @action).extract_from(@params, @data)
|
25
27
|
@url = location.str
|
@@ -29,11 +31,11 @@ module Acfs
|
|
29
31
|
end
|
30
32
|
|
31
33
|
def single?
|
32
|
-
[
|
34
|
+
%i[read update delete].include? action
|
33
35
|
end
|
34
36
|
|
35
37
|
def synchronous?
|
36
|
-
[
|
38
|
+
%i[update delete create].include? action
|
37
39
|
end
|
38
40
|
|
39
41
|
def id
|
data/lib/acfs/request.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Acfs
|
2
4
|
class Request
|
3
5
|
# Module containing callback handling for Requests.
|
@@ -43,7 +45,9 @@ module Acfs
|
|
43
45
|
private
|
44
46
|
|
45
47
|
def call_callback(res, index)
|
46
|
-
|
48
|
+
if index < callbacks.size
|
49
|
+
callbacks[index].call res, proc {|bres| call_callback bres, index + 1 }
|
50
|
+
end
|
47
51
|
end
|
48
52
|
end
|
49
53
|
end
|
data/lib/acfs/resource.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Acfs::Resource
|
2
4
|
#
|
3
5
|
# = Acfs Attributes
|
@@ -176,9 +178,8 @@ class Acfs::Resource
|
|
176
178
|
attributes[name.to_s] = value
|
177
179
|
end
|
178
180
|
|
179
|
-
#
|
180
181
|
module ClassMethods
|
181
|
-
ATTR_CLASS_BASE = '::Acfs::Resource::Attributes'
|
182
|
+
ATTR_CLASS_BASE = '::Acfs::Resource::Attributes'
|
182
183
|
|
183
184
|
#
|
184
185
|
# @api public
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Acfs::Resource::Attributes
|
2
4
|
# @api public
|
3
5
|
#
|
@@ -21,9 +23,9 @@ module Acfs::Resource::Attributes
|
|
21
23
|
|
22
24
|
case value
|
23
25
|
when ::Float then value
|
24
|
-
when
|
25
|
-
when
|
26
|
-
when
|
26
|
+
when 'Infinity' then ::Float::INFINITY
|
27
|
+
when '-Infinity' then -::Float::INFINITY
|
28
|
+
when 'NaN' then ::Float::NAN
|
27
29
|
else Float(value)
|
28
30
|
end
|
29
31
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Acfs::Resource::Attributes
|
2
4
|
# @api public
|
3
5
|
#
|
@@ -9,8 +11,7 @@ module Acfs::Resource::Attributes
|
|
9
11
|
# end
|
10
12
|
#
|
11
13
|
class UUID < Base
|
12
|
-
|
13
|
-
UUID_REGEXP = /[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}/i
|
14
|
+
UUID_REGEXP = /[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}/i.freeze
|
14
15
|
|
15
16
|
# @api public
|
16
17
|
#
|
@@ -37,7 +38,7 @@ module Acfs::Resource::Attributes
|
|
37
38
|
elsif value.to_s =~ UUID_REGEXP
|
38
39
|
value
|
39
40
|
else
|
40
|
-
raise TypeError.new "Invalid UUID: `#{value
|
41
|
+
raise TypeError.new "Invalid UUID: `#{value}'"
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
data/lib/acfs/resource/dirty.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Acfs::Resource
|
2
4
|
# Provide methods for generation URLs for resources.
|
3
5
|
#
|
@@ -11,7 +13,6 @@ class Acfs::Resource
|
|
11
13
|
module Locatable
|
12
14
|
extend ActiveSupport::Concern
|
13
15
|
|
14
|
-
#
|
15
16
|
module ClassMethods
|
16
17
|
# @overload url(suffix)
|
17
18
|
# @deprecated
|
@@ -40,7 +41,10 @@ class Acfs::Resource
|
|
40
41
|
# @return [String] Generated URL.
|
41
42
|
#
|
42
43
|
def url(suffix = nil, opts = {})
|
43
|
-
|
44
|
+
if suffix.is_a? Hash
|
45
|
+
opts = suffix
|
46
|
+
suffix = nil
|
47
|
+
end
|
44
48
|
|
45
49
|
opts[:action] = :list if suffix
|
46
50
|
|
@@ -85,9 +89,9 @@ class Acfs::Resource
|
|
85
89
|
def location_default_path(action, path)
|
86
90
|
case action
|
87
91
|
when :list, :create
|
88
|
-
|
92
|
+
path
|
89
93
|
when :read, :update, :delete
|
90
|
-
|
94
|
+
"#{path}/:id"
|
91
95
|
end
|
92
96
|
end
|
93
97
|
end
|
@@ -109,8 +113,8 @@ class Acfs::Resource
|
|
109
113
|
return nil if need_primary_key? && !primary_key?
|
110
114
|
|
111
115
|
self.class.service
|
112
|
-
|
113
|
-
|
116
|
+
.location(self.class, opts.reverse_merge(action: :read))
|
117
|
+
.build(attributes).str
|
114
118
|
end
|
115
119
|
|
116
120
|
# @api private
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Acfs::Resource
|
2
4
|
# @api private
|
3
5
|
#
|
@@ -11,7 +13,6 @@ class Acfs::Resource
|
|
11
13
|
extend ActiveSupport::Concern
|
12
14
|
delegate :operation, to: :'self.class'
|
13
15
|
|
14
|
-
#
|
15
16
|
module ClassMethods
|
16
17
|
# Invoke CRUD operation.
|
17
18
|
def operation(action, opts = {}, &block)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Acfs::Resource
|
2
4
|
#
|
3
5
|
# Allow to track the persistence state of a model.
|
@@ -40,7 +42,7 @@ class Acfs::Resource
|
|
40
42
|
def new?
|
41
43
|
!loaded?
|
42
44
|
end
|
43
|
-
|
45
|
+
alias new_record? new?
|
44
46
|
|
45
47
|
# @api public
|
46
48
|
#
|
@@ -86,9 +88,9 @@ class Acfs::Resource
|
|
86
88
|
operation((new? ? :create : :update), opts) do |data|
|
87
89
|
update_with data
|
88
90
|
end
|
89
|
-
rescue ::Acfs::InvalidResource =>
|
90
|
-
self.remote_errors =
|
91
|
-
raise
|
91
|
+
rescue ::Acfs::InvalidResource => e
|
92
|
+
self.remote_errors = e.errors
|
93
|
+
raise e
|
92
94
|
end
|
93
95
|
|
94
96
|
# @api public
|
@@ -251,6 +253,7 @@ class Acfs::Resource
|
|
251
253
|
|
252
254
|
def check_loaded!(opts = {})
|
253
255
|
return if loaded? || opts[:force]
|
256
|
+
|
254
257
|
raise ::Acfs::ResourceNotLoaded.new resource: self
|
255
258
|
end
|
256
259
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Acfs::Resource
|
2
4
|
# Methods providing the query interface for finding resouces.
|
3
5
|
#
|
@@ -14,7 +16,6 @@ class Acfs::Resource
|
|
14
16
|
module QueryMethods
|
15
17
|
extend ActiveSupport::Concern
|
16
18
|
|
17
|
-
#
|
18
19
|
module ClassMethods
|
19
20
|
# @api public
|
20
21
|
#
|
@@ -89,7 +90,7 @@ class Acfs::Resource
|
|
89
90
|
|
90
91
|
collection
|
91
92
|
end
|
92
|
-
|
93
|
+
alias where all
|
93
94
|
|
94
95
|
# @api public
|
95
96
|
#
|
@@ -140,7 +141,7 @@ class Acfs::Resource
|
|
140
141
|
raise Acfs::ResourceNotFound.new message: 'Received erroneous ' \
|
141
142
|
"response: no `#{name}` with params #{params} found"
|
142
143
|
end
|
143
|
-
block
|
144
|
+
block&.call m
|
144
145
|
end
|
145
146
|
end
|
146
147
|
|
@@ -249,6 +250,7 @@ class Acfs::Resource
|
|
249
250
|
|
250
251
|
def resource_class_lookup(type)
|
251
252
|
return self if type.nil?
|
253
|
+
|
252
254
|
klass = type.camelize.constantize
|
253
255
|
|
254
256
|
unless klass <= self
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Acfs::Resource
|
2
4
|
# Included by Acfs::Model. Allows to configure the service
|
3
5
|
# a resource belongs to.
|
@@ -5,7 +7,6 @@ class Acfs::Resource
|
|
5
7
|
module Service
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
8
|
-
#
|
9
10
|
module ClassMethods
|
10
11
|
# @api public
|
11
12
|
#
|
@@ -35,6 +36,7 @@ class Acfs::Resource
|
|
35
36
|
#
|
36
37
|
def service(klass = nil, options = {})
|
37
38
|
return (@service = klass.new options) if klass
|
39
|
+
|
38
40
|
@service || superclass.service
|
39
41
|
end
|
40
42
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Acfs::Resource
|
2
|
-
#
|
3
4
|
module Validation
|
4
5
|
def valid?(*args)
|
5
6
|
super
|
@@ -31,6 +32,7 @@ class Acfs::Resource
|
|
31
32
|
unless valid?(new? ? :create : :save)
|
32
33
|
raise ::Acfs::InvalidResource.new resource: self, errors: errors.to_a
|
33
34
|
end
|
35
|
+
|
34
36
|
super
|
35
37
|
end
|
36
38
|
end
|
data/lib/acfs/response.rb
CHANGED