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,268 +0,0 @@
1
- class Acfs::Resource
2
- #
3
- # = Acfs Attributes
4
- #
5
- # Allows to specify attributes of a class with default
6
- # values and type safety.
7
- #
8
- # @example
9
- # class User < Acfs::Resource
10
- # attribute :name, :string, default: 'Anon'
11
- # attribute :age, :integer
12
- # attribute :special, My::Special::Type
13
- # end
14
- #
15
- # For each attribute a setter and getter will be created and values will be
16
- # type casted when set.
17
- #
18
- module Attributes
19
- extend ActiveSupport::Concern
20
- include ActiveModel::AttributeMethods
21
-
22
- # @api public
23
- #
24
- # Write default attributes defined in resource class.
25
- #
26
- # @see #write_attributes
27
- # @see ClassMethods#attributes
28
- #
29
- def initialize(*attrs)
30
- write_attributes self.class.attributes
31
- reset_changes
32
- super
33
- end
34
-
35
- # @api public
36
- #
37
- # Returns ActiveModel compatible list of attributes and values.
38
- #
39
- # @example
40
- # class User < Acfs::Resource
41
- # attribute :name, type: String, default: 'Anon'
42
- # end
43
- # user = User.new(name: 'John')
44
- # user.attributes # => { "name" => "John" }
45
- #
46
- # @return [HashWithIndifferentAccess{Symbol => Object}]
47
- # Attributes and their values.
48
- #
49
- def attributes
50
- @_attrs ||= HashWithIndifferentAccess.new
51
- end
52
-
53
- # @api public
54
- #
55
- # Update all attributes with given hash. Attribute values will be casted
56
- # to defined attribute type.
57
- #
58
- # @example
59
- # user.attributes = { :name => 'Adam' }
60
- # user.name # => 'Adam'
61
- #
62
- # @param [Hash{String, Symbol => Object}, #each{|key, value|}]
63
- # Attributes to set in resource.
64
- # @see #write_attributes Delegates attributes hash to {#write_attributes}.
65
- #
66
- def attributes=(attributes)
67
- write_attributes attributes
68
- end
69
-
70
- # @api public
71
- #
72
- # Read an attribute from instance variable.
73
- #
74
- # @param [Symbol, String] name Attribute name.
75
- # @return [Object] Attribute value.
76
- #
77
- def read_attribute(name)
78
- attributes[name.to_s]
79
- end
80
-
81
- # @api public
82
- #
83
- # Write a hash of attributes and values.
84
- #
85
- # If attribute value is a `Proc` it will be evaluated in the context
86
- # of the resource after all non-proc attribute values are set. Values
87
- # will be casted to defined attribute type.
88
- #
89
- # The behavior is used to apply default attributes from resource
90
- # class definition.
91
- #
92
- # @example
93
- # user.write_attributes name: 'john', email: ->{ "#{name}@example.org" }
94
- # user.name # => 'john'
95
- # user.email # => 'john@example.org'
96
- #
97
- # @param [Hash{String, Symbol => Object, Proc}, #each{|key, value|}]
98
- # Attributes to write.
99
- #
100
- # @see #write_attribute Delegates attribute values to `#write_attribute`.
101
- #
102
- def write_attributes(attributes, opts = {})
103
- unless attributes.respond_to?(:each) && attributes.respond_to?(:keys)
104
- return false
105
- end
106
-
107
- if opts.fetch(:unknown, :ignore) == :raise
108
- if (attributes.keys.map(&:to_s) - self.class.attributes.keys).any?
109
- missing = attributes.keys - self.class.attributes.keys
110
- missing.map!(&:inspect)
111
- raise ArgumentError.new "Unknown attributes: #{missing.join(', ')}"
112
- end
113
- end
114
-
115
- procs = {}
116
-
117
- attributes.each do |key, _|
118
- if attributes[key].is_a? Proc
119
- procs[key] = attributes[key]
120
- else
121
- write_local_attribute key, attributes[key], opts
122
- end
123
- end
124
-
125
- procs.each do |key, proc|
126
- write_local_attribute key, instance_exec(&proc), opts
127
- end
128
-
129
- true
130
- end
131
-
132
- # @api private
133
- #
134
- # Check if a public getter for attribute exists that should be called to
135
- # write it or of {#write_attribute} should be called directly. This is
136
- # necessary as {#write_attribute} should go though setters but can also
137
- # handle unknown attribute that will not have a generated setter method.
138
- #
139
- def write_local_attribute(name, value, opts = {})
140
- method = "#{name}="
141
- if respond_to? method, true
142
- public_send method, value
143
- else
144
- write_attribute name, value, opts
145
- end
146
- end
147
-
148
- # @api public
149
- #
150
- # Write single attribute with given value. Value will be casted
151
- # to defined attribute type.
152
- #
153
- # @param [String, Symbol] name Attribute name.
154
- # @param [Object] value Value to write.
155
- # @raise [ArgumentError] If no attribute with given name is defined.
156
- #
157
- def write_attribute(name, value, opts = {})
158
- attr_type = self.class.defined_attributes[name.to_s]
159
- if attr_type
160
- write_raw_attribute name, attr_type.cast(value), opts
161
- else
162
- write_raw_attribute name, value, opts
163
- end
164
- end
165
-
166
- # @api private
167
- #
168
- # Write an attribute without checking type or existence or casting
169
- # value to attributes type. Value be stored in an instance variable
170
- # named after attribute name.
171
- #
172
- # @param [String, Symbol] name Attribute name.
173
- # @param [Object] value Attribute value.
174
- #
175
- def write_raw_attribute(name, value, _ = {})
176
- attributes[name.to_s] = value
177
- end
178
-
179
- #
180
- module ClassMethods
181
- ATTR_CLASS_BASE = '::Acfs::Resource::Attributes'.freeze
182
-
183
- #
184
- # @api public
185
- #
186
- # Define a model attribute by name and type. Will create getter and
187
- # setter for given attribute name. Existing methods will be overridden.
188
- #
189
- # Available types can be found in `Acfs::Model::Attributes::*`.
190
- #
191
- # @example
192
- # class User < Acfs::Resource
193
- # attribute :name, :string, default: 'Anon'
194
- # attribute :email, :string, default: lambda{ "#{name}@example.org"}
195
- # end
196
- #
197
- # @param [#to_sym] name Attribute name.
198
- # @param [Symbol, String, Class] type Attribute
199
- # type identifier or type class.
200
- #
201
- def attribute(name, type, opts = {})
202
- if type.is_a?(Symbol) || type.is_a?(String)
203
- type = "#{ATTR_CLASS_BASE}::#{type.to_s.classify}".constantize
204
- end
205
-
206
- define_attribute name.to_sym, type, opts
207
- end
208
-
209
- # @api public
210
- #
211
- # Return list of possible attributes and default
212
- # values for this model class.
213
- #
214
- # @example
215
- # class User < Acfs::Resource
216
- # attribute :name, :string
217
- # attribute :age, :integer, default: 25
218
- # end
219
- # User.attributes # => { "name": nil, "age": 25 }
220
- #
221
- # @return [Hash{String => Object, Proc}]
222
- # Attributes with default values.
223
- #
224
- def attributes
225
- defined_attributes.each_with_object({}) do |(key, attr), hash|
226
- hash[key] = attr.default_value
227
- end
228
- end
229
-
230
- def defined_attributes
231
- if superclass.respond_to?(:defined_attributes)
232
- superclass.defined_attributes.merge(local_attributes)
233
- else
234
- local_attributes
235
- end
236
- end
237
-
238
- private
239
-
240
- def local_attributes
241
- @local_attributes ||= {}
242
- end
243
-
244
- def define_attribute(name, type, opts = {})
245
- name = name.to_s
246
- attribute = type.new opts
247
-
248
- local_attributes[name] = attribute
249
- define_attribute_method name
250
-
251
- send :define_method, name do
252
- read_attribute name
253
- end
254
-
255
- send :define_method, :"#{name}=" do |value|
256
- write_attribute name, value
257
- end
258
- end
259
- end
260
- end
261
- end
262
-
263
- # Load attribute type classes.
264
- #
265
- Dir[File.dirname(__FILE__) + '/attributes/*.rb'].sort.each do |path|
266
- filename = File.basename(path)
267
- require "acfs/resource/attributes/#{filename}"
268
- end
@@ -1,28 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- #
3
- class Base
4
- attr_reader :default
5
-
6
- def initialize(default: nil)
7
- @default = default
8
- end
9
-
10
- def cast(value)
11
- cast_value(value) unless value.nil?
12
- end
13
-
14
- def default_value
15
- if default.respond_to? :call
16
- default
17
- else
18
- cast default
19
- end
20
- end
21
-
22
- private
23
-
24
- def cast_value(_value)
25
- raise NotImplementedError
26
- end
27
- end
28
- end
@@ -1,37 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- # @api public
3
- #
4
- # Boolean attribute type. Use it in your model as an attribute type:
5
- #
6
- # @example
7
- # class User < Acfs::Resource
8
- # attribute :name, :boolean
9
- # end
10
- #
11
- # Given objects will be converted to string. The following strings
12
- # are considered true, everything else false:
13
- #
14
- # true, on, yes
15
- #
16
- class Boolean < Base
17
- FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE', 'off', 'OFF', 'no', 'NO'].to_set
18
-
19
- # @api public
20
- #
21
- # Cast given object to boolean.
22
- #
23
- # @param [Object] value Object to cast.
24
- # @return [TrueClass, FalseClass] Casted boolean.
25
- #
26
- def cast_value(value)
27
- return true if value == true
28
- return false if value == false
29
-
30
- if value.blank?
31
- nil
32
- else
33
- !FALSE_VALUES.include?(value)
34
- end
35
- end
36
- end
37
- end
@@ -1,31 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- # @api public
3
- #
4
- # DateTime attribute type. Use it in your model as
5
- # an attribute type:
6
- #
7
- # @example
8
- # class User < Acfs::Resource
9
- # attribute :name, :date_time
10
- # end
11
- #
12
- class DateTime < Base
13
-
14
- # @api public
15
- #
16
- # Cast given object to DateTime.
17
- #
18
- # @param [Object] value Object to cast.
19
- # @return [DateTime] Casted object as DateTime.
20
- #
21
- def cast_value(value)
22
- if value.blank?
23
- nil
24
- elsif value.acts_like?(:time) || value.acts_like?(:date)
25
- value.to_datetime
26
- else
27
- ::DateTime.iso8601 value
28
- end
29
- end
30
- end
31
- end
@@ -1,37 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- # @api public
3
- #
4
- # Dict attribute type. Use it in your model as an attribute type:
5
- #
6
- # @example
7
- # class User
8
- # include Acfs::Model
9
- # attribute :opts, :dict
10
- # end
11
- #
12
- class Dict < Base
13
- # @api public
14
- #
15
- # Cast given object to a dict/hash.
16
- #
17
- # @param [Object] value Object to cast.
18
- # @return [Hash] Casted object as hash.
19
- # @raise [TypeError] If object cannot be casted to a hash.
20
- #
21
- def cast_value(value)
22
- return {} if value.blank?
23
-
24
- if value.is_a?(Hash)
25
- value
26
- elsif value.respond_to?(:serializable_hash)
27
- value.serializable_hash
28
- elsif value.respond_to?(:to_hash)
29
- value.to_hash
30
- elsif value.respond_to?(:to_h)
31
- value.to_h
32
- else
33
- Hash(value)
34
- end
35
- end
36
- end
37
- end
@@ -1,31 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- # @api public
3
- #
4
- # Float attribute type. Use it in your model as an attribute type:
5
- #
6
- # @example
7
- # class User < Acfs::Resource
8
- # attribute :name, :float
9
- # end
10
- #
11
- class Float < Base
12
- # @api public
13
- #
14
- # Cast given object to float.
15
- #
16
- # @param [Object] value Object to cast.
17
- # @return [Float] Casted object as float.
18
- #
19
- def cast_value(value)
20
- return 0.0 if value.blank?
21
-
22
- case value
23
- when ::Float then value
24
- when "Infinity" then ::Float::INFINITY
25
- when "-Infinity" then -::Float::INFINITY
26
- when "NaN" then ::Float::NAN
27
- else Float(value)
28
- end
29
- end
30
- end
31
- end
@@ -1,27 +0,0 @@
1
- module Acfs::Resource::Attributes
2
- # @api public
3
- #
4
- # Integer attribute type. Use it in your model as an attribute type:
5
- #
6
- # @example
7
- # class User < Acfs::Resource
8
- # attribute :name, :integer
9
- # end
10
- #
11
- class Integer < Base
12
- # @api public
13
- #
14
- # Cast given object to integer.
15
- #
16
- # @param [Object] value Object to cast.
17
- # @return [Fixnum] Casted object as fixnum.
18
- #
19
- def cast_value(value)
20
- if value.blank?
21
- 0
22
- else
23
- Integer(value)
24
- end
25
- end
26
- end
27
- end