json_api_client 0.4.0 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6ba83068b0d92b968d8ab4edd3f4d4daca21f90
4
- data.tar.gz: 53051631d82e0bddf15c2854d14382893a0448cd
3
+ metadata.gz: eafc20bde2b50f635c58ba67bd72c3234d3cf098
4
+ data.tar.gz: db4d71324f20cd39c03677afb1d089001ceac8cb
5
5
  SHA512:
6
- metadata.gz: 3fab60fb4108bd15e9c7164370623c616153d52d5ca6c77df8b70a94ca0340a8a25b3dd8c18fbd73eb487616abf7857438950980a86b80261bda88e9cec0f918
7
- data.tar.gz: 8d1998191c06f27e45208832a934b408214673a1a54c9318c875af1ccb9a0e293c1b159d6c83b5ebafbdba4a44ee55a348ea377fe88952cba6b256475ca0671a
6
+ metadata.gz: 0496018b36ad43f465f18f96b80d7361223cc70b0e3a0d956030ed19b756b9e72be62b7f85b7c98f7faea442d35f37ccf24664134d0b8338c50e016d1330cddf
7
+ data.tar.gz: ba8475927ba6c4f2af4b96aa84c5a4674e40b2c3a03255e471205d435a74b3dc0929f39d71d4573aee1821650a7cfd6faaea86c7c04dd473bf7f4a6740b3c948
data/README.md CHANGED
@@ -159,4 +159,47 @@ You can also call the instance method `verify` on a `MyApi::User` instance.
159
159
 
160
160
  We also respect the [links specification](http://jsonapi.org/format/#document-structure-resource-relationships). The client can fetch linked resources based on the defined endpoint from the link specification as well as load data from any `linked` data provided in the response. Additionally, it will still fetch missing data if not all linked resources are provided in the `linked` data response.
161
161
 
162
- See the [tests](https://github.com/chingor13/json_api_client/blob/master/test/unit/links_test.rb).
162
+ See the [tests](https://github.com/chingor13/json_api_client/blob/master/test/unit/links_test.rb).
163
+
164
+ ## Schema
165
+
166
+ You can define schema within your client model. You can define basic types and set default values if you wish. If you declare a basic type, we will try to cast any input to be that type.
167
+
168
+ The added benefit of declaring your schema is that you can access fields before data is set (otherwise, you'll get a `NoMethodError`).
169
+
170
+ ### Example
171
+
172
+ ```
173
+ class User < JsonApiClient::Resource
174
+ property :name, type: :string
175
+ property :is_admin, type: :boolean, default: false
176
+ property :points_accrued, type: :int, default: 0
177
+ property :averge_points_per_day, type: :float
178
+ end
179
+
180
+ # default values
181
+ u = User.new
182
+ u.name
183
+ => nil
184
+ u.is_admin
185
+ => false
186
+ u.points_accrued
187
+ => 0
188
+
189
+ # casting
190
+ u.average_points_per_day = "0.3"
191
+ u.average_points_per_day
192
+ => 0.3
193
+
194
+ ```
195
+
196
+ ### Types
197
+
198
+ The basic types that we allow are:
199
+
200
+ * `:int` or `:integer`
201
+ * `:float`
202
+ * `:string`
203
+ * `:boolean` - *Note: we will cast the string version of "true" and "false" to their respective values*
204
+
205
+ Also, we consider `nil` to be an acceptable value and will not cast the value.
@@ -15,7 +15,9 @@ module JsonApiClient
15
15
  @attributes ||= {}.with_indifferent_access
16
16
 
17
17
  return @attributes unless attrs.present?
18
- @attributes.merge!(attrs)
18
+ attrs.each do |key, value|
19
+ set_attribute(key, value)
20
+ end
19
21
  end
20
22
 
21
23
  def update_attributes(attrs = {})
@@ -0,0 +1,68 @@
1
+ module JsonApiClient
2
+ module Helpers
3
+ module Schemable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ initializer do |obj, params|
8
+ obj.send(:set_default_values)
9
+ end
10
+ end
11
+
12
+ module ClassMethods
13
+ # Returns the schema for this resource class
14
+ #
15
+ # @return [Schema] the schema for this resource class
16
+ def schema
17
+ @schema ||= Schema.new
18
+ end
19
+
20
+ # Declares a new property by name
21
+ #
22
+ # @param name [Symbol] the name of the property
23
+ # @param options [Hash] property options
24
+ # @option options [Symbol] :type The property type
25
+ # @option options [Symbol] :default The default value for the property
26
+ def property(name, options = {})
27
+ schema.add(name, options)
28
+ end
29
+
30
+ # Declare multiple properties with the same optional options
31
+ #
32
+ # @param [Array<Symbol>] names
33
+ # @param options [Hash] property options
34
+ # @option options [Symbol] :type The property type
35
+ # @option options [Symbol] :default The default value for the property
36
+ def properties(*names)
37
+ options = names.last.is_a?(Hash) ? names.pop : {}
38
+ names.each do |name|
39
+ property name, options
40
+ end
41
+ end
42
+ end
43
+
44
+ protected
45
+
46
+ def set_attribute(name, value)
47
+ property = property_for(name)
48
+ value = property.cast(value) if property
49
+ super(name, value)
50
+ end
51
+
52
+ def has_attribute?(attr_name)
53
+ !!property_for(attr_name) || super
54
+ end
55
+
56
+ def set_default_values
57
+ self.class.schema.each_property do |property|
58
+ attributes[property.name] = property.default unless attributes.has_key?(property.name)
59
+ end
60
+ end
61
+
62
+ def property_for(name)
63
+ self.class.schema.find(name)
64
+ end
65
+
66
+ end
67
+ end
68
+ end
@@ -7,6 +7,7 @@ module JsonApiClient
7
7
  autoload :Linkable, 'json_api_client/helpers/linkable'
8
8
  autoload :Parsable, 'json_api_client/helpers/parsable'
9
9
  autoload :Queryable, 'json_api_client/helpers/queryable'
10
+ autoload :Schemable, 'json_api_client/helpers/schemable'
10
11
  autoload :Serializable, 'json_api_client/helpers/serializable'
11
12
  end
12
13
  end
@@ -54,6 +54,7 @@ module JsonApiClient
54
54
  include Helpers::Serializable
55
55
  include Helpers::Linkable
56
56
  include Helpers::CustomEndpoints
57
+ include Helpers::Schemable
57
58
 
58
59
  def save
59
60
  query = persisted? ?
@@ -0,0 +1,64 @@
1
+ module JsonApiClient
2
+ class Schema
3
+ Property = Struct.new(:name, :type, :default) do
4
+ def cast(value)
5
+ return nil if value.nil?
6
+ return value if type.nil?
7
+
8
+ case type.to_sym
9
+ when :int, :integer
10
+ value.to_i
11
+ when :string
12
+ value.to_s
13
+ when :float
14
+ value.to_f
15
+ when :boolean
16
+ if value.is_a?(String)
17
+ value == "false" ? false : true
18
+ else
19
+ !!value
20
+ end
21
+ else
22
+ value
23
+ end
24
+ end
25
+ end
26
+
27
+ def initialize
28
+ @properties = {}
29
+ end
30
+
31
+ # Add a property to the schema
32
+ #
33
+ # @param name [Symbol] the name of the property
34
+ # @param options [Hash] property options
35
+ # @option options [Symbol] :type The property type
36
+ # @option options [Symbol] :default The default value for the property
37
+ # @return [void]
38
+ def add(name, options)
39
+ @properties[name.to_sym] = Property.new(name.to_sym, options[:type], options[:default])
40
+ end
41
+
42
+ # How many properties are defined
43
+ #
44
+ # @return [Fixnum] the number of defined properties
45
+ def size
46
+ @properties.size
47
+ end
48
+ alias_method :length, :size
49
+
50
+ def each_property(&block)
51
+ @properties.values.each(&block)
52
+ end
53
+ alias_method :each, :each_property
54
+
55
+ # Look up a property by name
56
+ #
57
+ # @param property_name [String] the name of the property
58
+ # @return [Property, nil] the property definition for property_name or nil
59
+ def find(property_name)
60
+ @properties[property_name.to_sym]
61
+ end
62
+ alias_method :[], :find
63
+ end
64
+ end
@@ -1,3 +1,3 @@
1
1
  module JsonApiClient
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -14,6 +14,7 @@ module JsonApiClient
14
14
  autoload :Query, 'json_api_client/query'
15
15
  autoload :Resource, 'json_api_client/resource'
16
16
  autoload :ResultSet, 'json_api_client/result_set'
17
+ autoload :Schema, 'json_api_client/schema'
17
18
  autoload :Scope, 'json_api_client/scope'
18
19
  autoload :Utils, 'json_api_client/utils'
19
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_api_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Ching
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-25 00:00:00.000000000 Z
11
+ date: 2014-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -91,6 +91,7 @@ files:
91
91
  - lib/json_api_client/helpers/linkable.rb
92
92
  - lib/json_api_client/helpers/parsable.rb
93
93
  - lib/json_api_client/helpers/queryable.rb
94
+ - lib/json_api_client/helpers/schemable.rb
94
95
  - lib/json_api_client/helpers/serializable.rb
95
96
  - lib/json_api_client/link.rb
96
97
  - lib/json_api_client/link_definition.rb
@@ -110,6 +111,7 @@ files:
110
111
  - lib/json_api_client/query/update.rb
111
112
  - lib/json_api_client/resource.rb
112
113
  - lib/json_api_client/result_set.rb
114
+ - lib/json_api_client/schema.rb
113
115
  - lib/json_api_client/scope.rb
114
116
  - lib/json_api_client/utils.rb
115
117
  - lib/json_api_client/version.rb