acfs 1.3.2 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
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