acfs 1.3.2 → 1.3.3

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.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. metadata +8 -141
  3. data/CHANGELOG.md +0 -325
  4. data/LICENSE +0 -22
  5. data/README.md +0 -334
  6. data/acfs.gemspec +0 -37
  7. data/lib/acfs.rb +0 -49
  8. data/lib/acfs/adapter/base.rb +0 -26
  9. data/lib/acfs/adapter/typhoeus.rb +0 -60
  10. data/lib/acfs/collection.rb +0 -27
  11. data/lib/acfs/collections/paginatable.rb +0 -75
  12. data/lib/acfs/configuration.rb +0 -113
  13. data/lib/acfs/errors.rb +0 -106
  14. data/lib/acfs/global.rb +0 -99
  15. data/lib/acfs/location.rb +0 -78
  16. data/lib/acfs/middleware/base.rb +0 -20
  17. data/lib/acfs/middleware/json.rb +0 -27
  18. data/lib/acfs/middleware/logger.rb +0 -23
  19. data/lib/acfs/middleware/msgpack.rb +0 -30
  20. data/lib/acfs/middleware/print.rb +0 -21
  21. data/lib/acfs/middleware/serializer.rb +0 -39
  22. data/lib/acfs/operation.rb +0 -81
  23. data/lib/acfs/request.rb +0 -36
  24. data/lib/acfs/request/callbacks.rb +0 -50
  25. data/lib/acfs/resource.rb +0 -37
  26. data/lib/acfs/resource/attributes.rb +0 -268
  27. data/lib/acfs/resource/attributes/base.rb +0 -28
  28. data/lib/acfs/resource/attributes/boolean.rb +0 -37
  29. data/lib/acfs/resource/attributes/date_time.rb +0 -31
  30. data/lib/acfs/resource/attributes/dict.rb +0 -37
  31. data/lib/acfs/resource/attributes/float.rb +0 -31
  32. data/lib/acfs/resource/attributes/integer.rb +0 -27
  33. data/lib/acfs/resource/attributes/list.rb +0 -34
  34. data/lib/acfs/resource/attributes/string.rb +0 -24
  35. data/lib/acfs/resource/attributes/uuid.rb +0 -47
  36. data/lib/acfs/resource/dirty.rb +0 -35
  37. data/lib/acfs/resource/initialization.rb +0 -29
  38. data/lib/acfs/resource/loadable.rb +0 -33
  39. data/lib/acfs/resource/locatable.rb +0 -128
  40. data/lib/acfs/resource/operational.rb +0 -22
  41. data/lib/acfs/resource/persistence.rb +0 -257
  42. data/lib/acfs/resource/query_methods.rb +0 -264
  43. data/lib/acfs/resource/service.rb +0 -42
  44. data/lib/acfs/resource/validation.rb +0 -37
  45. data/lib/acfs/response.rb +0 -28
  46. data/lib/acfs/response/formats.rb +0 -25
  47. data/lib/acfs/response/status.rb +0 -31
  48. data/lib/acfs/rspec.rb +0 -11
  49. data/lib/acfs/runner.rb +0 -97
  50. data/lib/acfs/service.rb +0 -91
  51. data/lib/acfs/service/middleware.rb +0 -56
  52. data/lib/acfs/service/middleware/stack.rb +0 -63
  53. data/lib/acfs/singleton_resource.rb +0 -83
  54. data/lib/acfs/stub.rb +0 -172
  55. data/lib/acfs/util.rb +0 -20
  56. data/lib/acfs/version.rb +0 -14
  57. data/lib/acfs/yard.rb +0 -5
  58. data/spec/acfs/adapter/typhoeus_spec.rb +0 -28
  59. data/spec/acfs/collection_spec.rb +0 -155
  60. data/spec/acfs/configuration_spec.rb +0 -51
  61. data/spec/acfs/global_spec.rb +0 -137
  62. data/spec/acfs/location_spec.rb +0 -23
  63. data/spec/acfs/middleware/json_spec.rb +0 -63
  64. data/spec/acfs/middleware/msgpack_spec.rb +0 -60
  65. data/spec/acfs/operation_spec.rb +0 -10
  66. data/spec/acfs/request/callbacks_spec.rb +0 -46
  67. data/spec/acfs/request_spec.rb +0 -77
  68. data/spec/acfs/resource/attributes/boolean_spec.rb +0 -56
  69. data/spec/acfs/resource/attributes/date_time_spec.rb +0 -49
  70. data/spec/acfs/resource/attributes/dict_spec.rb +0 -75
  71. data/spec/acfs/resource/attributes/float_spec.rb +0 -59
  72. data/spec/acfs/resource/attributes/integer_spec.rb +0 -34
  73. data/spec/acfs/resource/attributes/list_spec.rb +0 -58
  74. data/spec/acfs/resource/attributes/uuid_spec.rb +0 -40
  75. data/spec/acfs/resource/attributes_spec.rb +0 -179
  76. data/spec/acfs/resource/dirty_spec.rb +0 -47
  77. data/spec/acfs/resource/initialization_spec.rb +0 -30
  78. data/spec/acfs/resource/loadable_spec.rb +0 -20
  79. data/spec/acfs/resource/locatable_spec.rb +0 -116
  80. data/spec/acfs/resource/persistance_spec.rb +0 -316
  81. data/spec/acfs/resource/query_methods_spec.rb +0 -541
  82. data/spec/acfs/resource/validation_spec.rb +0 -127
  83. data/spec/acfs/response/formats_spec.rb +0 -50
  84. data/spec/acfs/response/status_spec.rb +0 -69
  85. data/spec/acfs/runner_spec.rb +0 -97
  86. data/spec/acfs/service/middleware_spec.rb +0 -33
  87. data/spec/acfs/service_spec.rb +0 -46
  88. data/spec/acfs/singleton_resource_spec.rb +0 -15
  89. data/spec/acfs/stub_spec.rb +0 -343
  90. data/spec/acfs_spec.rb +0 -203
  91. data/spec/fixtures/config.yml +0 -14
  92. data/spec/spec_helper.rb +0 -41
  93. data/spec/support/hash.rb +0 -9
  94. data/spec/support/response.rb +0 -10
  95. data/spec/support/service.rb +0 -91
  96. data/spec/support/shared/find_callbacks.rb +0 -48
@@ -1,34 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- # @api public
3
- #
4
- # List attribute type. Use it in your model as an attribute type:
5
- #
6
- # @example
7
- # class User < Acfs::Resource
8
- # attribute :name, :list
9
- # end
10
- #
11
- class List < Base
12
- # @api public
13
- #
14
- # Cast given object to a list.
15
- #
16
- # @param [Object] value Object to cast.
17
- # @return [Fixnum] Casted object as list.
18
- # @raise [TypeError] If object cannot be casted to a list.
19
- #
20
- def cast_value(value)
21
- return [] if value.blank?
22
-
23
- if value.is_a?(::Array)
24
- value
25
- elsif value.respond_to?(:to_ary)
26
- value.to_ary
27
- elsif value.respond_to?(:to_a)
28
- value.to_a
29
- else
30
- Array(value)
31
- end
32
- end
33
- end
34
- end
@@ -1,24 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- # @api public
3
- #
4
- # String attribute type. Use it in your model as
5
- # an attribute type:
6
- #
7
- # @example
8
- # class User < Acfs::Resource
9
- # attribute :name, :string
10
- # end
11
- #
12
- class String < Base
13
- # @api public
14
- #
15
- # Cast given object to string.
16
- #
17
- # @param [Object] value Object to cast.
18
- # @return [String] Casted string.
19
- #
20
- def cast_value(value)
21
- value.to_s
22
- end
23
- end
24
- end
@@ -1,47 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- # @api public
3
- #
4
- # UUID attribute type. Use it in your model as an attribute type:
5
- #
6
- # @example
7
- # class User < Acfs::Resource
8
- # attribute :id, :uuid
9
- # end
10
- #
11
- class UUID < Base
12
- #
13
- UUID_REGEXP = /[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}/i
14
-
15
- # @api public
16
- #
17
- # Check if given object looks like a UUID, eg:
18
- # `450b7a40-94ad-11e3-baa8-0800200c9a66`
19
- # Valid UUIDs are 16 byte numbers represented as
20
- # a hexadecimal string in five sub-groups seperated
21
- # by a dash. Each group has to consist of a fixed
22
- # number of hexadecimal digits:
23
- # | Group | Digits |
24
- # | -----:|:------ |
25
- # | 1 | 8 |
26
- # | 2 | 4 |
27
- # | 3 | 4 |
28
- # | 4 | 4 |
29
- # | 5 | 12 |
30
- #
31
- # @param [Object] value Object to cast.
32
- # @return [String] Casted object as UUID.
33
- #
34
- def cast_value(value)
35
- if value.blank?
36
- nil
37
- elsif value.to_s =~ UUID_REGEXP
38
- value
39
- else
40
- raise TypeError.new "Invalid UUID: `#{value.to_s}'"
41
- end
42
- end
43
- end
44
-
45
- # Lower-case alias for automatic type lookup
46
- Uuid = UUID
47
- end
@@ -1,35 +0,0 @@
1
- class Acfs::Resource
2
- #
3
- # Thin wrapper around ActiveModel::Dirty
4
- #
5
- module Dirty
6
- extend ActiveSupport::Concern
7
- include ActiveModel::Dirty
8
-
9
- # @api private
10
- #
11
- def reset_changes
12
- clear_changes_information
13
- end
14
-
15
- # @api private
16
- #
17
- def save!(*)
18
- super.tap {|_| changes_applied }
19
- end
20
-
21
- # @api private
22
- #
23
- def loaded!
24
- reset_changes
25
- super
26
- end
27
-
28
- # @api private
29
- #
30
- def write_raw_attribute(name, value, opts = {})
31
- attribute_will_change!(name) if opts[:change].nil? || opts[:change]
32
- super
33
- end
34
- end
35
- end
@@ -1,29 +0,0 @@
1
- class Acfs::Resource
2
- #
3
- # Initialization drop-in for pre-4.0 ActiveModel.
4
- #
5
- module Initialization
6
- #
7
- # @api public
8
- #
9
- # Initializes a new model with the given `params`. fff
10
- #
11
- # @example
12
- # class User < Acfs::Resource
13
- # attribute :name
14
- # attribute :email, default: ->{ "#{name}@dom.tld" }
15
- # attribute :age, :integer, default: 18
16
- # end
17
- #
18
- # user = User.new(name: 'bob')
19
- # user.name # => "bob"
20
- # user.email # => "bob@dom.tld"
21
- # user.age # => 18
22
- #
23
- # @param params [Hash{Symbol => Object}] Attributes to set on resource.
24
- #
25
- def initialize(params = {})
26
- write_attributes params if params
27
- end
28
- end
29
- end
@@ -1,33 +0,0 @@
1
- class Acfs::Resource
2
- # Provides method to check for loading state of resources.
3
- # A resource that is created but not yet fetched will be loaded
4
- # after running {Acfs::Global#run Acfs.run}.
5
- #
6
- # @example
7
- # user = User.find 5
8
- # user.loaded? # => false
9
- # Acfs.run
10
- # user.loaded? # => true
11
- #
12
- module Loadable
13
- extend ActiveSupport::Concern
14
-
15
- # @api public
16
- #
17
- # Check if model is loaded or if request is still queued.
18
- #
19
- # @return [Boolean] True if resource is loaded, false otherwise.
20
- #
21
- def loaded?
22
- @loaded.nil? ? false : @loaded
23
- end
24
-
25
- # @api private
26
- #
27
- # Mark model as loaded.
28
- #
29
- def loaded!
30
- @loaded = true
31
- end
32
- end
33
- end
@@ -1,128 +0,0 @@
1
- class Acfs::Resource
2
- # Provide methods for generation URLs for resources.
3
- #
4
- # @example
5
- # class User
6
- # service AccountService # With base URL `http://acc.svr`
7
- # end
8
- # User.url # => "http://acc.svr/users"
9
- # User.url(5) # => "http://acc.svr/users/5"
10
- #
11
- module Locatable
12
- extend ActiveSupport::Concern
13
-
14
- #
15
- module ClassMethods
16
- # @overload url(suffix)
17
- # @deprecated
18
- # Return URL for this class of resource. Given suffix
19
- # will be appended.
20
- #
21
- # @example
22
- # User.url # => "http://users.srv.org/users"
23
- # User.url(5) # => "http://users.srv.org/users/5"
24
- #
25
- # @param suffix [String] Suffix to append to URL.
26
- # @return [String] Generated URL.
27
- #
28
- # @overload url(opts = {})
29
- # Return URL for this class of resources. Given options
30
- # will be used to replace URL path arguments and to
31
- # determine the operation action.
32
- #
33
- # @example
34
- # User.url(id: 5, action: :read) # => "http://users.srv.org/users/5"
35
- # User.url(action: :list) # => "http://users.srv.org/users"
36
- #
37
- # @param opts [Hash] Options.
38
- # @option opts [Symbol] :action Operation action,
39
- # usually `:list`, `:create`, `:read`, `:update` or`:delete`.
40
- # @return [String] Generated URL.
41
- #
42
- def url(suffix = nil, opts = {})
43
- opts, suffix = suffix, nil if suffix.is_a? Hash
44
-
45
- opts[:action] = :list if suffix
46
-
47
- url = location(opts).build(opts).str
48
- url += "/#{suffix}" if suffix.to_s.present?
49
- url
50
- end
51
-
52
- # Return a location object able to build the URL for this
53
- # resource and given action.
54
- #
55
- # @example
56
- # class Identity < ::Acfs::Resource
57
- # service MyService, path: 'users/:user_id/identities'
58
- # end
59
- #
60
- # location = Identity.location(action: :read)
61
- # location.arguments
62
- # => [:user_id, :id]
63
- #
64
- # location.raw_url
65
- # => 'http://service/users/:user_id/identities/:id'
66
- #
67
- # location = Identity.location(action: :list)
68
- # location.arguments
69
- # => [:user_id]
70
- #
71
- # location.build(user_id: 42)
72
- # => 'http://service/users/42/identities'
73
- #
74
- # @param opts [Hash] Options.
75
- # @option opts [Symbol] :action Operation action,
76
- # usually `:list`, `:create`, `:read`, `:update` or`:delete`.
77
- #
78
- # @return [Location] Location object.
79
- #
80
- def location(opts = {})
81
- service.location(self, opts)
82
- end
83
-
84
- # @api private
85
- def location_default_path(action, path)
86
- case action
87
- when :list, :create
88
- return path
89
- when :read, :update, :delete
90
- return "#{path}/:id"
91
- end
92
- end
93
- end
94
-
95
- # Return URL for this resource. Resource if will be appended
96
- # as suffix if present.
97
- #
98
- # @example
99
- # user.new.url # => "http://users.srv.org/users"
100
- #
101
- # user = User.find 5
102
- # Acfs.run
103
- # user.url # => "http://users.srv.org/users/5"
104
- #
105
- # @return [ String ] Generated URL.
106
- # @see ClassMethods#url
107
- #
108
- def url(opts = {})
109
- return nil if need_primary_key? && !primary_key?
110
-
111
- self.class.service
112
- .location(self.class, opts.reverse_merge(action: :read))
113
- .build(attributes).str
114
- end
115
-
116
- # @api private
117
- # Return true if resource needs a primary key (id) for singular actions.
118
- def need_primary_key?
119
- true
120
- end
121
-
122
- # @api private
123
- # Return true if resource has a primary key (id) set.
124
- def primary_key?
125
- respond_to?(:id) && !id.nil?
126
- end
127
- end
128
- end
@@ -1,22 +0,0 @@
1
- class Acfs::Resource
2
- # @api private
3
- #
4
- # Provide methods for creating and processing CRUD operations and
5
- # handling responses. That includes error handling as well as
6
- # handling stubbed resources.
7
- #
8
- # Should only be used internal.
9
- #
10
- module Operational
11
- extend ActiveSupport::Concern
12
- delegate :operation, to: :'self.class'
13
-
14
- #
15
- module ClassMethods
16
- # Invoke CRUD operation.
17
- def operation(action, opts = {}, &block)
18
- Acfs.runner.process ::Acfs::Operation.new self, action, opts, &block
19
- end
20
- end
21
- end
22
- end
@@ -1,257 +0,0 @@
1
- class Acfs::Resource
2
- #
3
- # Allow to track the persistence state of a model.
4
- #
5
- module Persistence
6
- extend ActiveSupport::Concern
7
-
8
- # @api public
9
- #
10
- # Check if the model is persisted. A model is persisted if
11
- # it is saved after being created
12
- #
13
- # @example Newly created resource:
14
- # user = User.new name: "John"
15
- # user.persisted? # => false
16
- # user.save
17
- # user.persisted? # => true
18
- #
19
- # @example Modified resource:
20
- # user2 = User.find 5
21
- # user2.persisted? # => true
22
- # user2.name = 'Amy'
23
- # user2.persisted? # => true
24
- # user2.save
25
- # user2.persisted? # => true
26
- #
27
- # @return [Boolean] True if resource has been saved
28
- #
29
- def persisted?
30
- !new?
31
- end
32
-
33
- # @api public
34
- #
35
- # Return true if model is a new record and was not saved yet.
36
- #
37
- # @return [Boolean] True if resource is newly created,
38
- # false otherwise.
39
- #
40
- def new?
41
- !loaded?
42
- end
43
- alias_method :new_record?, :new?
44
-
45
- # @api public
46
- #
47
- # Saves the resource.
48
- #
49
- # It will PUT to the service to update the resource or send
50
- # a POST to create a new one if the resource is new.
51
- #
52
- # Saving a resource is a synchronous operation.
53
- #
54
- # @return [Boolean] True if save operation was successful,
55
- # false otherwise.
56
- # @see #save! See {#save!} for available options.
57
- #
58
- def save(*args)
59
- save!(*args)
60
- true
61
- rescue Acfs::Error
62
- false
63
- end
64
-
65
- # @api public
66
- #
67
- # Saves the resource. Raises an error if something happens.
68
- #
69
- # Saving a resource is a synchronous operation.
70
- #
71
- # @param opts [Hash] Hash with additional options.
72
- # @option opts [Hash] :data Data to send to remote service.
73
- # Default will be resource attributes.
74
- #
75
- # @raise [Acfs::InvalidResource]
76
- # If remote services respond with 422 response. Will fill
77
- # errors with data from response
78
- # @raise [Acfs::ErroneousResponse]
79
- # If remote service respond with not successful response.
80
- #
81
- # @see #save
82
- #
83
- def save!(opts = {})
84
- opts[:data] = attributes unless opts[:data]
85
-
86
- operation((new? ? :create : :update), opts) do |data|
87
- update_with data
88
- end
89
- rescue ::Acfs::InvalidResource => err
90
- self.remote_errors = err.errors
91
- raise err
92
- end
93
-
94
- # @api public
95
- #
96
- # Update attributes with given data and save resource.
97
- #
98
- # Saving a resource is a synchronous operation.
99
- #
100
- # @param attrs [Hash] Hash with attributes to write.
101
- # @param opts [Hash] Options passed to `save`.
102
- #
103
- # @return [Boolean]
104
- # True if save operation was successful, false otherwise.
105
- #
106
- # @see #save
107
- # @see #attributes=
108
- # @see #update_attributes!
109
- #
110
- def update_attributes(attrs, opts = {})
111
- check_loaded! opts
112
-
113
- self.attributes = attrs
114
- save opts
115
- end
116
-
117
- # @api public
118
- #
119
- # Update attributes with given data and save resource.
120
- #
121
- # Saving a resource is a synchronous operation.
122
- #
123
- # @param [Hash] attrs Hash with attributes to write.
124
- # @param [Hash] opts Options passed to `save!`.
125
- #
126
- # @raise [Acfs::InvalidResource]
127
- # If remote services respond with 422 response. Will fill
128
- # errors with data from response
129
- #
130
- # @raise [Acfs::ErroneousResponse]
131
- # If remote service respond with not successful response.
132
- #
133
- # @see #save!
134
- # @see #attributes=
135
- # @see #update_attributes
136
- #
137
- def update_attributes!(attrs, opts = {})
138
- check_loaded! opts
139
-
140
- self.attributes = attrs
141
- save! opts
142
- end
143
-
144
- # @api public
145
- #
146
- # Destroy resource by sending a DELETE request.
147
- #
148
- # Deleting a resource is a synchronous operation.
149
- #
150
- # @return [Boolean]
151
- # @see #delete!
152
- #
153
- def delete(opts = {})
154
- delete! opts
155
- true
156
- rescue Acfs::Error
157
- false
158
- end
159
-
160
- # @api public
161
- #
162
- # Destroy resource by sending a DELETE request.
163
- # Will raise an error in case something goes wrong.
164
- #
165
- # Deleting a resource is a synchronous operation.
166
-
167
- # @raise [Acfs::ErroneousResponse]
168
- # If remote service respond with not successful response.
169
- #
170
- # @return [undefined]
171
- # @see #delete
172
- #
173
- def delete!(opts = {})
174
- opts[:params] ||= {}
175
- opts[:params] = attributes_for_url(:delete).merge opts[:params]
176
-
177
- operation :delete, opts do |data|
178
- update_with data
179
- freeze
180
- end
181
- end
182
-
183
- private
184
-
185
- def attributes_for_url(action)
186
- arguments_for_url = self.class.location(action: action).arguments
187
- attributes.slice(*arguments_for_url)
188
- end
189
-
190
- module ClassMethods
191
- # @api public
192
- #
193
- # Create a new resource sending given data. If resource cannot be
194
- # created an error will be thrown.
195
- #
196
- # Saving a resource is a synchronous operation.
197
- #
198
- # @param data [Hash{Symbol, String => Object}]
199
- # Data to send in create request.
200
- #
201
- # @return [self] Newly resource object.
202
- #
203
- # @raise [Acfs::InvalidResource]
204
- # If remote services respond with 422 response. Will fill
205
- # errors with data from response
206
- #
207
- # @raise [Acfs::ErroneousResponse]
208
- # If remote service respond with not successful response.
209
- #
210
- # @see Acfs::Model::Persistence#save! Available options. `:data`
211
- # will be overridden with provided data hash.
212
- # @see #create
213
- #
214
- def create!(data, _opts = {})
215
- new(data).tap(&:save!)
216
- end
217
-
218
- # @api public
219
- #
220
- # Create a new resource sending given data. If resource cannot be
221
- # create model will be returned and error hash contains response
222
- # errors if available.
223
- #
224
- # Saving a resource is a synchronous operation.
225
- #
226
- # @param data [Hash{Symbol, String => Object}]
227
- # Data to send in create request.
228
- #
229
- # @return [self] Newly resource object.
230
- #
231
- # @raise [Acfs::ErroneousResponse]
232
- # If remote service respond with not successful response.
233
- #
234
- # @see Acfs::Model::Persistence#save! Available options. `:data`
235
- # will be overridden with provided data hash.
236
- # @see #create!
237
- #
238
- def create(data, _opts = {})
239
- model = new data
240
- model.save
241
- model
242
- end
243
- end
244
-
245
- private
246
-
247
- def update_with(data)
248
- self.attributes = data
249
- loaded!
250
- end
251
-
252
- def check_loaded!(opts = {})
253
- return if loaded? || opts[:force]
254
- raise ::Acfs::ResourceNotLoaded.new resource: self
255
- end
256
- end
257
- end