carwow-json_api_client 1.19.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 +7 -0
- data/LICENSE +20 -0
- data/README.md +706 -0
- data/Rakefile +32 -0
- data/lib/json_api_client.rb +30 -0
- data/lib/json_api_client/associations.rb +8 -0
- data/lib/json_api_client/associations/base_association.rb +33 -0
- data/lib/json_api_client/associations/belongs_to.rb +31 -0
- data/lib/json_api_client/associations/has_many.rb +8 -0
- data/lib/json_api_client/associations/has_one.rb +16 -0
- data/lib/json_api_client/connection.rb +41 -0
- data/lib/json_api_client/error_collector.rb +91 -0
- data/lib/json_api_client/errors.rb +107 -0
- data/lib/json_api_client/formatter.rb +145 -0
- data/lib/json_api_client/helpers.rb +9 -0
- data/lib/json_api_client/helpers/associatable.rb +88 -0
- data/lib/json_api_client/helpers/callbacks.rb +27 -0
- data/lib/json_api_client/helpers/dirty.rb +75 -0
- data/lib/json_api_client/helpers/dynamic_attributes.rb +78 -0
- data/lib/json_api_client/helpers/uri.rb +9 -0
- data/lib/json_api_client/implementation.rb +12 -0
- data/lib/json_api_client/included_data.rb +58 -0
- data/lib/json_api_client/linking.rb +6 -0
- data/lib/json_api_client/linking/links.rb +22 -0
- data/lib/json_api_client/linking/top_level_links.rb +39 -0
- data/lib/json_api_client/meta_data.rb +19 -0
- data/lib/json_api_client/middleware.rb +7 -0
- data/lib/json_api_client/middleware/json_request.rb +26 -0
- data/lib/json_api_client/middleware/parse_json.rb +31 -0
- data/lib/json_api_client/middleware/status.rb +67 -0
- data/lib/json_api_client/paginating.rb +6 -0
- data/lib/json_api_client/paginating/nested_param_paginator.rb +140 -0
- data/lib/json_api_client/paginating/paginator.rb +89 -0
- data/lib/json_api_client/parsers.rb +5 -0
- data/lib/json_api_client/parsers/parser.rb +102 -0
- data/lib/json_api_client/query.rb +6 -0
- data/lib/json_api_client/query/builder.rb +239 -0
- data/lib/json_api_client/query/requestor.rb +73 -0
- data/lib/json_api_client/relationships.rb +6 -0
- data/lib/json_api_client/relationships/relations.rb +55 -0
- data/lib/json_api_client/relationships/top_level_relations.rb +30 -0
- data/lib/json_api_client/request_params.rb +57 -0
- data/lib/json_api_client/resource.rb +643 -0
- data/lib/json_api_client/result_set.rb +25 -0
- data/lib/json_api_client/schema.rb +154 -0
- data/lib/json_api_client/utils.rb +48 -0
- data/lib/json_api_client/version.rb +3 -0
- metadata +213 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module JsonApiClient
|
4
|
+
class ResultSet < Array
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
attr_accessor :errors,
|
8
|
+
:record_class,
|
9
|
+
:meta,
|
10
|
+
:pages,
|
11
|
+
:uri,
|
12
|
+
:links,
|
13
|
+
:implementation,
|
14
|
+
:relationships,
|
15
|
+
:included
|
16
|
+
|
17
|
+
# pagination methods are handled by the paginator
|
18
|
+
def_delegators :pages, :total_pages, :total_entries, :total_count, :offset, :per_page, :current_page, :limit_value, :next_page, :previous_page, :out_of_bounds?
|
19
|
+
|
20
|
+
def has_errors?
|
21
|
+
errors.present?
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
module JsonApiClient
|
3
|
+
class Schema
|
4
|
+
module Types
|
5
|
+
|
6
|
+
class Integer
|
7
|
+
def self.cast(value, _)
|
8
|
+
value.to_i
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class String
|
13
|
+
def self.cast(value, _)
|
14
|
+
value.to_s
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Float
|
19
|
+
def self.cast(value, _)
|
20
|
+
value.to_f
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Time
|
25
|
+
def self.cast(value, _)
|
26
|
+
value.is_a?(::Time) ? value : ::Time.parse(value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Decimal
|
31
|
+
def self.cast(value, _)
|
32
|
+
BigDecimal(value)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Boolean
|
37
|
+
def self.cast(value, default)
|
38
|
+
case value
|
39
|
+
when "false", "0", 0, false
|
40
|
+
false
|
41
|
+
when "true", "1", 1, true
|
42
|
+
true
|
43
|
+
else
|
44
|
+
# if it's unknown, use the default value
|
45
|
+
default
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
class TypeFactory
|
53
|
+
@@types = {}
|
54
|
+
# Register a new type key or keys with appropriate classes
|
55
|
+
#
|
56
|
+
# eg:
|
57
|
+
#
|
58
|
+
# require 'money'
|
59
|
+
#
|
60
|
+
# class MyMoneyCaster
|
61
|
+
# def self.cast(value, default)
|
62
|
+
# begin
|
63
|
+
# Money.new(value, "USD")
|
64
|
+
# rescue ArgumentError
|
65
|
+
# default
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# JsonApiClient::Schema::TypeFactory.register money: MyMoneyCaster
|
71
|
+
#
|
72
|
+
# You can setup several at once:
|
73
|
+
#
|
74
|
+
# JsonApiClient::Schema::TypeFactory.register money: MyMoneyCaster,
|
75
|
+
# date: MyJsonDateTypeCaster
|
76
|
+
#
|
77
|
+
#
|
78
|
+
#
|
79
|
+
#
|
80
|
+
def self.register(type_hash)
|
81
|
+
@@types.merge!(type_hash)
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.type_for(type)
|
85
|
+
@@types[type]
|
86
|
+
end
|
87
|
+
|
88
|
+
self.register int: Types::Integer,
|
89
|
+
integer: Types::Integer,
|
90
|
+
string: Types::String,
|
91
|
+
float: Types::Float,
|
92
|
+
time: Types::Time,
|
93
|
+
decimal: Types::Decimal,
|
94
|
+
boolean: Types::Boolean
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
Property = Struct.new(:name, :type, :default) do
|
99
|
+
def cast(value)
|
100
|
+
return nil if value.nil?
|
101
|
+
return value if type.nil?
|
102
|
+
type_caster = TypeFactory.type_for(type)
|
103
|
+
return value if type_caster.nil?
|
104
|
+
type_caster.cast(value, default)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def initialize
|
109
|
+
@properties = {}
|
110
|
+
end
|
111
|
+
|
112
|
+
# Add a property to the schema
|
113
|
+
#
|
114
|
+
# @param name [Symbol] the name of the property
|
115
|
+
# @param options [Hash] property options
|
116
|
+
# @option options [Symbol] :type The property type
|
117
|
+
# @option options [Symbol] :default The default value for the property
|
118
|
+
# @return [void]
|
119
|
+
def add(name, options)
|
120
|
+
@properties[name.to_sym] = Property.new(name.to_sym, options[:type], options[:default])
|
121
|
+
end
|
122
|
+
|
123
|
+
# How many properties are defined
|
124
|
+
#
|
125
|
+
# @return [Fixnum] the number of defined properties
|
126
|
+
def size
|
127
|
+
@properties.size
|
128
|
+
end
|
129
|
+
|
130
|
+
alias_method :length, :size
|
131
|
+
|
132
|
+
def each_property(&block)
|
133
|
+
@properties.values.each(&block)
|
134
|
+
end
|
135
|
+
|
136
|
+
alias_method :each, :each_property
|
137
|
+
|
138
|
+
# Look up a property by name
|
139
|
+
#
|
140
|
+
# @param property_name [String] the name of the property
|
141
|
+
# @return [Property, nil] the property definition for property_name or nil
|
142
|
+
def find(property_name)
|
143
|
+
@properties[property_name.to_sym]
|
144
|
+
end
|
145
|
+
|
146
|
+
alias_method :[], :find
|
147
|
+
|
148
|
+
class << self
|
149
|
+
def register(type_hash)
|
150
|
+
TypeFactory.register(type_hash)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module JsonApiClient
|
2
|
+
module Utils
|
3
|
+
|
4
|
+
def self.compute_type(klass, type_name)
|
5
|
+
return klass.custom_type_to_class.fetch(type_name).constantize if klass.custom_type_to_class.key?(type_name)
|
6
|
+
# If the type is prefixed with a scope operator then we assume that
|
7
|
+
# the type_name is an absolute reference.
|
8
|
+
return type_name.constantize if type_name.match(/^::/)
|
9
|
+
|
10
|
+
# Build a list of candidates to search for
|
11
|
+
candidates = []
|
12
|
+
klass.name.scan(/::|$/) { candidates.unshift "#{$`}::#{type_name}" }
|
13
|
+
candidates << type_name
|
14
|
+
|
15
|
+
candidates.each do |candidate|
|
16
|
+
begin
|
17
|
+
constant = candidate.constantize
|
18
|
+
return constant if candidate == constant.to_s
|
19
|
+
rescue NameError => e
|
20
|
+
# We don't want to swallow NoMethodError < NameError errors
|
21
|
+
raise e unless e.instance_of?(NameError)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
raise NameError, "uninitialized constant #{candidates.first}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.parse_includes(klass, *tables)
|
29
|
+
tables.map do |table|
|
30
|
+
case table
|
31
|
+
when Hash
|
32
|
+
table.map do |k, v|
|
33
|
+
parse_includes(klass, *v).map do |sub|
|
34
|
+
"#{k}.#{sub}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
when Array
|
38
|
+
table.map do |v|
|
39
|
+
parse_includes(klass, *v)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
klass.key_formatter.format(table)
|
43
|
+
end
|
44
|
+
end.flatten
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: carwow-json_api_client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.19.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeff Ching
|
8
|
+
- carwow
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2021-05-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 3.2.0
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 3.2.0
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: faraday
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 0.15.2
|
35
|
+
- - "<"
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.2.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.15.2
|
45
|
+
- - "<"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.2.0
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: faraday_middleware
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.0
|
55
|
+
- - "<"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 1.2.0
|
58
|
+
type: :runtime
|
59
|
+
prerelease: false
|
60
|
+
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 0.9.0
|
65
|
+
- - "<"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 1.2.0
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: addressable
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '2.2'
|
75
|
+
type: :runtime
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '2.2'
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: activemodel
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 3.2.0
|
89
|
+
type: :runtime
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 3.2.0
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: rack
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0.2'
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.2'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: webmock
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 3.5.1
|
117
|
+
type: :development
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 3.5.1
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: mocha
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
type: :development
|
132
|
+
prerelease: false
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
description: Build client libraries compliant with specification defined by jsonapi.org
|
139
|
+
email: developers@carwow.co.uk
|
140
|
+
executables: []
|
141
|
+
extensions: []
|
142
|
+
extra_rdoc_files: []
|
143
|
+
files:
|
144
|
+
- LICENSE
|
145
|
+
- README.md
|
146
|
+
- Rakefile
|
147
|
+
- lib/json_api_client.rb
|
148
|
+
- lib/json_api_client/associations.rb
|
149
|
+
- lib/json_api_client/associations/base_association.rb
|
150
|
+
- lib/json_api_client/associations/belongs_to.rb
|
151
|
+
- lib/json_api_client/associations/has_many.rb
|
152
|
+
- lib/json_api_client/associations/has_one.rb
|
153
|
+
- lib/json_api_client/connection.rb
|
154
|
+
- lib/json_api_client/error_collector.rb
|
155
|
+
- lib/json_api_client/errors.rb
|
156
|
+
- lib/json_api_client/formatter.rb
|
157
|
+
- lib/json_api_client/helpers.rb
|
158
|
+
- lib/json_api_client/helpers/associatable.rb
|
159
|
+
- lib/json_api_client/helpers/callbacks.rb
|
160
|
+
- lib/json_api_client/helpers/dirty.rb
|
161
|
+
- lib/json_api_client/helpers/dynamic_attributes.rb
|
162
|
+
- lib/json_api_client/helpers/uri.rb
|
163
|
+
- lib/json_api_client/implementation.rb
|
164
|
+
- lib/json_api_client/included_data.rb
|
165
|
+
- lib/json_api_client/linking.rb
|
166
|
+
- lib/json_api_client/linking/links.rb
|
167
|
+
- lib/json_api_client/linking/top_level_links.rb
|
168
|
+
- lib/json_api_client/meta_data.rb
|
169
|
+
- lib/json_api_client/middleware.rb
|
170
|
+
- lib/json_api_client/middleware/json_request.rb
|
171
|
+
- lib/json_api_client/middleware/parse_json.rb
|
172
|
+
- lib/json_api_client/middleware/status.rb
|
173
|
+
- lib/json_api_client/paginating.rb
|
174
|
+
- lib/json_api_client/paginating/nested_param_paginator.rb
|
175
|
+
- lib/json_api_client/paginating/paginator.rb
|
176
|
+
- lib/json_api_client/parsers.rb
|
177
|
+
- lib/json_api_client/parsers/parser.rb
|
178
|
+
- lib/json_api_client/query.rb
|
179
|
+
- lib/json_api_client/query/builder.rb
|
180
|
+
- lib/json_api_client/query/requestor.rb
|
181
|
+
- lib/json_api_client/relationships.rb
|
182
|
+
- lib/json_api_client/relationships/relations.rb
|
183
|
+
- lib/json_api_client/relationships/top_level_relations.rb
|
184
|
+
- lib/json_api_client/request_params.rb
|
185
|
+
- lib/json_api_client/resource.rb
|
186
|
+
- lib/json_api_client/result_set.rb
|
187
|
+
- lib/json_api_client/schema.rb
|
188
|
+
- lib/json_api_client/utils.rb
|
189
|
+
- lib/json_api_client/version.rb
|
190
|
+
homepage: http://github.com/carwow/json_api_client
|
191
|
+
licenses:
|
192
|
+
- MIT
|
193
|
+
metadata: {}
|
194
|
+
post_install_message:
|
195
|
+
rdoc_options: []
|
196
|
+
require_paths:
|
197
|
+
- lib
|
198
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
199
|
+
requirements:
|
200
|
+
- - ">="
|
201
|
+
- !ruby/object:Gem::Version
|
202
|
+
version: '0'
|
203
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
204
|
+
requirements:
|
205
|
+
- - ">="
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '0'
|
208
|
+
requirements: []
|
209
|
+
rubygems_version: 3.1.4
|
210
|
+
signing_key:
|
211
|
+
specification_version: 4
|
212
|
+
summary: Build client libraries compliant with specification defined by jsonapi.org
|
213
|
+
test_files: []
|