query-interface-client 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -2
- data/Gemfile.lock +41 -39
- data/lib/query-interface-client/api.rb +48 -0
- data/lib/query-interface-client/json_middleware.rb +37 -0
- data/lib/query-interface-client/lazy_query.rb +2 -9
- data/lib/query-interface-client/model.rb +206 -0
- data/lib/query-interface-client/request.rb +98 -0
- data/lib/query-interface-client/resource.rb +59 -19
- data/lib/query-interface-client/types.rb +77 -0
- data/lib/query-interface-client/version.rb +1 -1
- data/lib/query-interface-client.rb +5 -0
- data/query-interface-client.gemspec +2 -2
- data/spec/lib/lazy_query_spec.rb +73 -74
- data/spec/lib/resource_spec.rb +6 -6
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 058935aef6e41bdd7e467dd59ec3f367b98d93fd
|
4
|
+
data.tar.gz: 30ecc627ea8f2b63a1afa8bd084bf921039e2bd3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50a8b92a71878b2a277ff1a3248750e72359c391abab5201b680c679a63a9e16015fa66b23f858435337a0406ec3668c6b75ed1206cb91531acd7a730a47e5b3
|
7
|
+
data.tar.gz: d14949f8023b16b781fc69a312406c129741021ad977247dba4e0008c67608fed5cec585df0a9b9d6d2d7379fd37021445bc452924e1d1d37453558920e0f342
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,49 +1,52 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
|
5
|
-
activesupport (= 4.
|
6
|
-
builder (~> 3.1
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
actionview (4.1.6)
|
5
|
+
activesupport (= 4.1.6)
|
6
|
+
builder (~> 3.1)
|
7
|
+
erubis (~> 2.7.0)
|
8
|
+
activesupport (4.1.6)
|
9
|
+
i18n (~> 0.6, >= 0.6.9)
|
10
|
+
json (~> 1.7, >= 1.7.7)
|
11
|
+
minitest (~> 5.1)
|
11
12
|
thread_safe (~> 0.1)
|
12
|
-
tzinfo (~>
|
13
|
-
atomic (1.1.10)
|
13
|
+
tzinfo (~> 1.1)
|
14
14
|
autotest-standalone (4.5.11)
|
15
|
-
builder (3.
|
16
|
-
diff-lcs (1.2.
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
activesupport (>= 3.0.0)
|
22
|
-
faraday (~> 0.8)
|
23
|
-
multi_json (~> 1.7)
|
15
|
+
builder (3.2.2)
|
16
|
+
diff-lcs (1.2.5)
|
17
|
+
docile (1.1.5)
|
18
|
+
erubis (2.7.0)
|
19
|
+
faraday (0.9.0)
|
20
|
+
multipart-post (>= 1.2, < 3)
|
24
21
|
i18n (0.6.11)
|
25
22
|
json (1.8.1)
|
26
|
-
minitest (4.
|
27
|
-
multi_json (1.
|
28
|
-
multipart-post (
|
29
|
-
rake (10.
|
30
|
-
rs_paginator (0.
|
23
|
+
minitest (5.4.2)
|
24
|
+
multi_json (1.10.1)
|
25
|
+
multipart-post (2.0.0)
|
26
|
+
rake (10.3.2)
|
27
|
+
rs_paginator (0.1.1)
|
28
|
+
actionview
|
31
29
|
i18n
|
32
|
-
rspec (
|
33
|
-
rspec-core (~>
|
34
|
-
rspec-expectations (~>
|
35
|
-
rspec-mocks (~>
|
36
|
-
rspec-core (
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
30
|
+
rspec (3.1.0)
|
31
|
+
rspec-core (~> 3.1.0)
|
32
|
+
rspec-expectations (~> 3.1.0)
|
33
|
+
rspec-mocks (~> 3.1.0)
|
34
|
+
rspec-core (3.1.6)
|
35
|
+
rspec-support (~> 3.1.0)
|
36
|
+
rspec-expectations (3.1.2)
|
37
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
+
rspec-support (~> 3.1.0)
|
39
|
+
rspec-mocks (3.1.3)
|
40
|
+
rspec-support (~> 3.1.0)
|
41
|
+
rspec-support (3.1.2)
|
42
|
+
simplecov (0.9.1)
|
43
|
+
docile (~> 1.1.0)
|
41
44
|
multi_json (~> 1.0)
|
42
|
-
simplecov-html (~> 0.
|
43
|
-
simplecov-html (0.
|
44
|
-
thread_safe (0.
|
45
|
-
|
46
|
-
|
45
|
+
simplecov-html (~> 0.8.0)
|
46
|
+
simplecov-html (0.8.0)
|
47
|
+
thread_safe (0.3.4)
|
48
|
+
tzinfo (1.2.2)
|
49
|
+
thread_safe (~> 0.1)
|
47
50
|
|
48
51
|
PLATFORMS
|
49
52
|
ruby
|
@@ -51,8 +54,7 @@ PLATFORMS
|
|
51
54
|
DEPENDENCIES
|
52
55
|
activesupport
|
53
56
|
autotest-standalone
|
54
|
-
|
55
|
-
json
|
57
|
+
faraday
|
56
58
|
rake
|
57
59
|
rs_paginator
|
58
60
|
rspec
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module QueryInterface
|
4
|
+
module Client
|
5
|
+
class API
|
6
|
+
attr_accessor :connection, :url, :options
|
7
|
+
|
8
|
+
def self.setup(options={}, &faraday_block)
|
9
|
+
@default_api = self.new(options)
|
10
|
+
@default_api.setup_connection(&faraday_block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(options)
|
14
|
+
if options.include?(:url)
|
15
|
+
self.url = options.delete(:url)
|
16
|
+
end
|
17
|
+
self.options = options
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup_connection(&faraday_block)
|
21
|
+
Faraday.new do |connection|
|
22
|
+
self.connection = connection
|
23
|
+
yield connection if block_given?
|
24
|
+
end
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def request(options={})
|
29
|
+
method = options.delete(:_method)
|
30
|
+
path = options.delete(:_path)
|
31
|
+
headers = options.delete(:_headers)
|
32
|
+
response = self.connection.send method do |request|
|
33
|
+
request.headers.merge!(headers) if headers
|
34
|
+
if method == :get
|
35
|
+
# For GET requests, treat additional parameters as querystring data
|
36
|
+
request.url path, options
|
37
|
+
else
|
38
|
+
# For POST, PUT and DELETE requests, treat additional parameters as request body
|
39
|
+
request.url path
|
40
|
+
request.body = options
|
41
|
+
end
|
42
|
+
end
|
43
|
+
{parsed_data: response.env[:body], response: response}
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module QueryInterface
|
4
|
+
module Client
|
5
|
+
class JsonMiddleware < Faraday::Response::Middleware
|
6
|
+
|
7
|
+
def parse_json(body)
|
8
|
+
body = '{}' if body.blank?
|
9
|
+
json = JSON.parse(body, symbolize_names: true)
|
10
|
+
unless json.is_a?(Hash) || json.is_a?(Array)
|
11
|
+
raise "Response must be Hash or Array, got: #{body.inspect}"
|
12
|
+
end
|
13
|
+
json
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse(body)
|
17
|
+
json = parse_json(body)
|
18
|
+
errors = json.delete(:errors) || {}
|
19
|
+
metadata = json.delete(:metadata) || {}
|
20
|
+
{
|
21
|
+
:data => json,
|
22
|
+
:errors => errors,
|
23
|
+
:metadata => metadata
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_complete(env)
|
28
|
+
env[:body] = case env[:status]
|
29
|
+
when 204
|
30
|
+
parse('{}')
|
31
|
+
else
|
32
|
+
parse(env[:body])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -15,10 +15,6 @@ module QueryInterface
|
|
15
15
|
self.result_model = result_model
|
16
16
|
end
|
17
17
|
|
18
|
-
def parse(data)
|
19
|
-
(self.result_model ? self.result_model.parse(data) : self.model.parse(data))
|
20
|
-
end
|
21
|
-
|
22
18
|
def instantiate(data)
|
23
19
|
(self.result_model ? self.result_model.new(data) : self.model.new(data))
|
24
20
|
end
|
@@ -128,15 +124,12 @@ module QueryInterface
|
|
128
124
|
if parsed_data[:data].is_a?(Array)
|
129
125
|
self.instantiate_collection(parsed_data)
|
130
126
|
else
|
131
|
-
self.instantiate(
|
132
|
-
self.parse(parsed_data[:data]).
|
133
|
-
merge(_metadata: parsed_data[:metadata], _errors: parsed_data[:errors])
|
134
|
-
)
|
127
|
+
self.instantiate(parsed_data[:data])
|
135
128
|
end
|
136
129
|
end
|
137
130
|
|
138
131
|
def do_raw_query
|
139
|
-
self.model.get_raw(:query, transformations: JSON.dump(self.transformations))
|
132
|
+
self.model.get_raw(path: :query, params: {transformations: JSON.dump(self.transformations)})
|
140
133
|
end
|
141
134
|
|
142
135
|
def first(*args)
|
@@ -0,0 +1,206 @@
|
|
1
|
+
module QueryInterface
|
2
|
+
module Client
|
3
|
+
class Property
|
4
|
+
attr_accessor :type, :name, :primary, :update, :array, :default
|
5
|
+
|
6
|
+
def initialize(name, type, options={})
|
7
|
+
unless conversion = QueryInterface::Client.types[type]
|
8
|
+
raise "Unknown Type #{type}"
|
9
|
+
end
|
10
|
+
self.type = conversion
|
11
|
+
self.primary = options.delete(:primary) {false}
|
12
|
+
self.update = options.delete(:update) {true}
|
13
|
+
self.array = options.delete(:array) {false}
|
14
|
+
self.default = options.delete(:default) {nil}
|
15
|
+
end
|
16
|
+
|
17
|
+
def run_get_conversion(value)
|
18
|
+
if self.array
|
19
|
+
value ||= []
|
20
|
+
value.map { |item| self.type.apply_get(item) }
|
21
|
+
else
|
22
|
+
self.type.apply_get(value) unless value.nil?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def run_set_conversion(value)
|
27
|
+
if self.array
|
28
|
+
value ||= []
|
29
|
+
value.map { |item| self.type.apply_set(item) }
|
30
|
+
else
|
31
|
+
self.type.apply_set(value) unless value.nil?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module Model
|
37
|
+
def self.included(base)
|
38
|
+
base.include(QueryInterface::Client::Request)
|
39
|
+
base.include(QueryInterface::Client::Resource)
|
40
|
+
base.include(ActiveModel::Validations)
|
41
|
+
base.include(ActiveModel::Validations::Callbacks)
|
42
|
+
base.include(ActiveModel::Conversion)
|
43
|
+
base.instance_variable_set(:@properties, {})
|
44
|
+
base.send(:attr_accessor, :_property_values, :_additional_values, :_property_changes)
|
45
|
+
base.extend(ClassMethods)
|
46
|
+
base.include(InstanceMethods)
|
47
|
+
end
|
48
|
+
|
49
|
+
module ClassMethods
|
50
|
+
def property(name, type, options={}, &definitions)
|
51
|
+
property = QueryInterface::Client::Property.new(name, type, options)
|
52
|
+
|
53
|
+
define_method name do
|
54
|
+
self.get_value(name)
|
55
|
+
end
|
56
|
+
|
57
|
+
unless property.primary || !property.update
|
58
|
+
define_method "#{name}=".to_sym do |value|
|
59
|
+
if self.get_value(name) != value
|
60
|
+
self.property_changes << name unless self.property_changes.include?(name)
|
61
|
+
self.set_value(name, value)
|
62
|
+
else
|
63
|
+
value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
if block_given?
|
69
|
+
property.instance_eval &definitions
|
70
|
+
end
|
71
|
+
|
72
|
+
@properties[name] = property
|
73
|
+
end
|
74
|
+
|
75
|
+
def primary_keys
|
76
|
+
@properties.map do |name, property|
|
77
|
+
name if property.primary
|
78
|
+
end.compact
|
79
|
+
end
|
80
|
+
|
81
|
+
def new_collection(collection)
|
82
|
+
collection[:data].map do |data|
|
83
|
+
self.new(data)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def get(path, params={})
|
88
|
+
data = self.get_raw(path: path, params: params)[:parsed_data][:data]
|
89
|
+
self.new(data)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
module InstanceMethods
|
94
|
+
def initialize(data={})
|
95
|
+
self.set_data(data)
|
96
|
+
end
|
97
|
+
|
98
|
+
def properties
|
99
|
+
self.class.instance_variable_get(:@properties)
|
100
|
+
end
|
101
|
+
|
102
|
+
def set_data(data)
|
103
|
+
data.each do |name, value|
|
104
|
+
name = name.to_sym
|
105
|
+
if self.properties.has_key?(name)
|
106
|
+
property = self.properties[name]
|
107
|
+
self.set_value(name, property.run_set_conversion(value))
|
108
|
+
else
|
109
|
+
self.additional_values[name] = value
|
110
|
+
end
|
111
|
+
end
|
112
|
+
# Initialize missing fields to whatever their default is
|
113
|
+
(self.properties.keys - data.keys.map(&:to_sym)).each do |name|
|
114
|
+
property = self.properties[name]
|
115
|
+
default = property.default
|
116
|
+
self.set_value(name, default.is_a?(Enumerable) ? default.dup : default)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def to_attributes(additional_data={})
|
121
|
+
data = {}
|
122
|
+
properties = self.properties.map do |name, property|
|
123
|
+
[name, property.run_get_conversion(self.get_value(name))] if (property.update && !property.primary)
|
124
|
+
end.compact.to_h
|
125
|
+
data[self.class.name.underscore.to_sym] = properties.merge(additional_data)
|
126
|
+
data
|
127
|
+
end
|
128
|
+
|
129
|
+
def save(additional_data={})
|
130
|
+
if self.persisted? && self.dirty?
|
131
|
+
result = self.put_raw(params: self.to_attributes(additional_data))
|
132
|
+
return result[:response].success?
|
133
|
+
elsif !self.persisted?
|
134
|
+
result = self.class.post_raw(params: self.to_attributes(additional_data))
|
135
|
+
if result[:response].success?
|
136
|
+
self.set_data(result[:parsed_data][:data])
|
137
|
+
return true
|
138
|
+
else
|
139
|
+
return false
|
140
|
+
end
|
141
|
+
else
|
142
|
+
return true
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def update_attributes(attributes)
|
147
|
+
self.assign_attributes(attributes)
|
148
|
+
self.save
|
149
|
+
end
|
150
|
+
|
151
|
+
def assign_attributes(attributes)
|
152
|
+
attributes.each do |name, value|
|
153
|
+
method = "#{name}=".to_sym
|
154
|
+
if self.respond_to?(method)
|
155
|
+
self.send(method, value)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def property_values
|
161
|
+
self._property_values ||= {}
|
162
|
+
end
|
163
|
+
|
164
|
+
def additional_values
|
165
|
+
self._additional_values ||= {}
|
166
|
+
end
|
167
|
+
|
168
|
+
def property_changes
|
169
|
+
self._property_changes ||= []
|
170
|
+
end
|
171
|
+
|
172
|
+
def dirty?
|
173
|
+
self.property_changes.size > 0
|
174
|
+
end
|
175
|
+
|
176
|
+
def set_value(name, value)
|
177
|
+
self.property_values[name] = value
|
178
|
+
end
|
179
|
+
|
180
|
+
def get_value(name)
|
181
|
+
self.property_values[name]
|
182
|
+
end
|
183
|
+
|
184
|
+
def persisted?
|
185
|
+
!!self.id
|
186
|
+
end
|
187
|
+
|
188
|
+
def as_json(options={})
|
189
|
+
prop_vals = self.properties.map do |name, property|
|
190
|
+
[name, property.run_get_conversion(self.get_value(name))]
|
191
|
+
end.to_h
|
192
|
+
prop_vals.merge(self.additional_values).as_json(options)
|
193
|
+
end
|
194
|
+
|
195
|
+
def get(path, params={})
|
196
|
+
self.get_raw(path: path, params: params)[:parsed_data]
|
197
|
+
end
|
198
|
+
|
199
|
+
def destroy
|
200
|
+
result = self.delete_raw()[:parsed_data]
|
201
|
+
# TODO: handle errors and destroyed flag
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module QueryInterface
|
2
|
+
module Client
|
3
|
+
module Request
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
base.include(InstanceMethods)
|
7
|
+
base.instance_variable_set(:@_qi_collection_path_fragments, nil)
|
8
|
+
base.instance_variable_set(:@_qi_resource_path_fragments, nil)
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def resource_name
|
13
|
+
self.name.underscore.pluralize
|
14
|
+
end
|
15
|
+
|
16
|
+
def collection_path_fragments(*fragments)
|
17
|
+
unless fragments.empty?
|
18
|
+
@_qi_collection_path_fragments = [self.default_api.url] + fragments
|
19
|
+
end
|
20
|
+
@_qi_collection_path_fragments || [self.default_api.url, self.resource_name]
|
21
|
+
end
|
22
|
+
|
23
|
+
def resource_path_fragments(*fragments)
|
24
|
+
unless fragments.empty?
|
25
|
+
@_qi_resource_path_fragments = [self.default_api.url] + fragments
|
26
|
+
end
|
27
|
+
@_qi_resource_path_fragments || self.collection_path_fragments + [:id]
|
28
|
+
end
|
29
|
+
|
30
|
+
def default_api
|
31
|
+
QueryInterface::Client::API.instance_variable_get(:@default_api)
|
32
|
+
end
|
33
|
+
|
34
|
+
def collection_path(path=nil)
|
35
|
+
fragments = self.collection_path_fragments.dup
|
36
|
+
fragments << path unless path.blank?
|
37
|
+
fragments.join("/")
|
38
|
+
end
|
39
|
+
|
40
|
+
# TODO: Discern by "am i an instance or a class" what collection and member routes do
|
41
|
+
def member_path(path=nil, keys={})
|
42
|
+
fragments = self.resource_path_fragments.map do |fragment|
|
43
|
+
if fragment.is_a?(Symbol)
|
44
|
+
if keys.has_key?(fragment)
|
45
|
+
keys[fragment]
|
46
|
+
else
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
else
|
50
|
+
fragment
|
51
|
+
end
|
52
|
+
end.compact
|
53
|
+
fragments << path unless path.blank?
|
54
|
+
fragments.join("/")
|
55
|
+
end
|
56
|
+
|
57
|
+
def raw_request(method, params, keys, path)
|
58
|
+
if keys
|
59
|
+
params[:_path] = self.member_path(path, keys)
|
60
|
+
else
|
61
|
+
params[:_path] = self.collection_path(path)
|
62
|
+
end
|
63
|
+
params[:_method] = method
|
64
|
+
if params.include?(:_headers)
|
65
|
+
params[:_headers] = params[:_headers].merge(self.default_api.options[:headers])
|
66
|
+
else
|
67
|
+
params[:_headers] = self.default_api.options[:headers]
|
68
|
+
end
|
69
|
+
result = self.default_api.request(params)
|
70
|
+
{parsed_data: result[:parsed_data], response: result[:response]}
|
71
|
+
end
|
72
|
+
|
73
|
+
[:get, :post, :put, :delete].each do |method|
|
74
|
+
define_method "#{method}_raw" do |options={}|
|
75
|
+
params = options.delete(:params) { {} }
|
76
|
+
keys = options.delete(:keys) { {} }
|
77
|
+
path = options.delete(:path)
|
78
|
+
self.raw_request(method, params, keys, path)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
module InstanceMethods
|
84
|
+
def keys
|
85
|
+
Hash[self.class.primary_keys.map {|primary_key| [primary_key, self.send(primary_key)]}]
|
86
|
+
end
|
87
|
+
|
88
|
+
[:get, :post, :put, :delete, :patch].each do |method|
|
89
|
+
define_method "#{method}_raw" do |options={}|
|
90
|
+
params = options.delete(:params) { {} }
|
91
|
+
path = options.delete(:path)
|
92
|
+
self.class.raw_request(method, params, self.keys, path)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -1,32 +1,72 @@
|
|
1
|
-
module QueryInterface
|
2
|
-
module
|
1
|
+
module QueryInterface
|
2
|
+
module Client
|
3
|
+
class Association
|
4
|
+
attr_accessor :basemodel, :klass, :autoresolve, :dataset
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def first(*args)
|
10
|
-
self.query.order('id').first
|
6
|
+
def initialize(basemodel, name, options={})
|
7
|
+
self.basemodel = basemodel
|
8
|
+
self.klass = (options.delete(:class_name) {name.to_s.singularize.camelize}).constantize
|
9
|
+
self.autoresolve = options.delete(:autoresolve) {true}
|
10
|
+
self.dataset = options.delete(:dataset) {name}
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
self.query.
|
13
|
+
def query(id)
|
14
|
+
self.basemodel.query.instance(id).context(self.dataset, self.klass)
|
15
15
|
end
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
18
|
+
module Resource
|
19
|
+
def self.included(base)
|
20
|
+
base.instance_variable_set(:@associations, {})
|
21
|
+
base.extend(ClassMethods)
|
22
|
+
base.include(InstanceMethods)
|
19
23
|
end
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
module ClassMethods
|
26
|
+
def first(*args)
|
27
|
+
self.query.order('id').first
|
28
|
+
end
|
29
|
+
|
30
|
+
def last(*args)
|
31
|
+
self.query.order('id').last
|
32
|
+
end
|
33
|
+
|
34
|
+
def query
|
35
|
+
LazyQuery.new(self)
|
36
|
+
end
|
37
|
+
|
38
|
+
def association(name, options={})
|
39
|
+
association = QueryInterface::Client::Association.new(self, name, options)
|
40
|
+
define_method name do
|
41
|
+
association.query(self.id)
|
42
|
+
end
|
43
|
+
@associations[name] = association
|
44
|
+
end
|
45
|
+
|
46
|
+
def [](id)
|
47
|
+
self.query.instance(id).evaluate
|
48
|
+
end
|
49
|
+
|
50
|
+
def all
|
51
|
+
self.query.evaluate
|
26
52
|
end
|
27
53
|
end
|
28
54
|
|
29
|
-
|
55
|
+
module InstanceMethods
|
56
|
+
def associations
|
57
|
+
self.class.instance_variable_get(:@associations)
|
58
|
+
end
|
30
59
|
|
60
|
+
def associations_resolved?
|
61
|
+
self.associations.map do |name, association|
|
62
|
+
[name, (association.autoresolve || self.send(name).count == 0)]
|
63
|
+
end.to_h
|
64
|
+
end
|
65
|
+
|
66
|
+
def has_unresolved_dependencies?
|
67
|
+
!self.associations_resolved?.values.all?
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
31
71
|
end
|
32
72
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module QueryInterface
|
2
|
+
module Client
|
3
|
+
class Conversion
|
4
|
+
attr_accessor :set_block, :get_block
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
self.get_block = self.set_block = Proc.new { |value| value }
|
8
|
+
end
|
9
|
+
|
10
|
+
def set(&set_block)
|
11
|
+
self.set_block = set_block
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(&get_block)
|
15
|
+
self.get_block = get_block
|
16
|
+
end
|
17
|
+
|
18
|
+
def apply_set(value)
|
19
|
+
self.set_block.call(value)
|
20
|
+
end
|
21
|
+
|
22
|
+
def apply_get(value)
|
23
|
+
self.get_block.call(value)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.types
|
28
|
+
@_types ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.register_type(type, ®istry_block)
|
32
|
+
conversion = Conversion.new
|
33
|
+
if block_given?
|
34
|
+
conversion.instance_eval ®istry_block
|
35
|
+
end
|
36
|
+
self.types[type] = conversion
|
37
|
+
end
|
38
|
+
|
39
|
+
register_type :string do
|
40
|
+
set { |value| value.to_s }
|
41
|
+
end
|
42
|
+
|
43
|
+
register_type :integer do
|
44
|
+
set { |value| value.to_i }
|
45
|
+
end
|
46
|
+
|
47
|
+
register_type :float do
|
48
|
+
set { |value| value.to_f }
|
49
|
+
end
|
50
|
+
|
51
|
+
register_type :ip do
|
52
|
+
set { |value| IPAddr.new(value) }
|
53
|
+
get { |value| value.to_s }
|
54
|
+
end
|
55
|
+
|
56
|
+
register_type :date_time do
|
57
|
+
set { |value| value.to_datetime }
|
58
|
+
get { |value| value.to_s }
|
59
|
+
end
|
60
|
+
|
61
|
+
register_type :date do
|
62
|
+
set { |value| value.to_date }
|
63
|
+
get { |value| value.to_s }
|
64
|
+
end
|
65
|
+
|
66
|
+
register_type :mac do
|
67
|
+
set { |value| NetAddr::EUI.create(value) }
|
68
|
+
get { |value| value.address(Delimiter: ':') }
|
69
|
+
end
|
70
|
+
|
71
|
+
register_type :boolean do
|
72
|
+
set { |value| !!value }
|
73
|
+
end
|
74
|
+
|
75
|
+
register_type :raw
|
76
|
+
end
|
77
|
+
end
|
@@ -4,3 +4,8 @@ require 'active_support/core_ext/string'
|
|
4
4
|
|
5
5
|
require 'query-interface-client/lazy_query'
|
6
6
|
require 'query-interface-client/resource'
|
7
|
+
require 'query-interface-client/model'
|
8
|
+
require 'query-interface-client/api'
|
9
|
+
require 'query-interface-client/request'
|
10
|
+
require 'query-interface-client/types'
|
11
|
+
require 'query-interface-client/json_middleware'
|
@@ -23,9 +23,9 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.summary = "Client for the radar query interface"
|
24
24
|
s.license = "ISC"
|
25
25
|
|
26
|
-
s.add_runtime_dependency(%q<her>)
|
27
|
-
s.add_runtime_dependency(%q<activesupport>)
|
28
26
|
s.add_runtime_dependency(%q<rs_paginator>)
|
27
|
+
s.add_runtime_dependency(%q<activesupport>)
|
28
|
+
s.add_runtime_dependency(%q<faraday>)
|
29
29
|
s.add_development_dependency(%q<rake>)
|
30
30
|
s.add_development_dependency(%q<rspec>)
|
31
31
|
end
|
data/spec/lib/lazy_query_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
|
4
4
|
def deep_copy_check(left, right)
|
5
5
|
left.each_with_index do |item, idx|
|
6
|
-
right[idx].
|
6
|
+
expect(right[idx]).not_to be(item)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
@@ -19,13 +19,13 @@ describe QueryInterface::Client::LazyQuery do
|
|
19
19
|
|
20
20
|
it "initializes itself with empty parameters and a supplied model" do
|
21
21
|
query = subject.new(model)
|
22
|
-
query.transformations.
|
23
|
-
query.model.
|
22
|
+
expect(query.transformations).to eq([])
|
23
|
+
expect(query.model).to eq(model)
|
24
24
|
end
|
25
25
|
|
26
26
|
it "honors passed transformations params" do
|
27
27
|
query = subject.new(model, transformations)
|
28
|
-
query.transformations.
|
28
|
+
expect(query.transformations).to eq(transformations)
|
29
29
|
end
|
30
30
|
|
31
31
|
it "does not alter the originally passed transformations" do
|
@@ -38,7 +38,7 @@ describe QueryInterface::Client::LazyQuery do
|
|
38
38
|
it "provides a copy method cloning transformations onto a new instance" do
|
39
39
|
query = subject.new(model, transformations)
|
40
40
|
query_copy = query.copy
|
41
|
-
query_copy.transformations.
|
41
|
+
expect(query_copy.transformations).to eq(query.transformations)
|
42
42
|
deep_copy_check(query_copy.transformations, query.transformations)
|
43
43
|
end
|
44
44
|
end
|
@@ -47,32 +47,32 @@ describe QueryInterface::Client::LazyQuery do
|
|
47
47
|
it "should create a new instance with updated transformations" do
|
48
48
|
query = subject.new(model)
|
49
49
|
query_copy = subject.new(model)
|
50
|
-
query.
|
50
|
+
expect(query).to receive(:copy).and_return(query_copy)
|
51
51
|
query.filter(a: :b)
|
52
|
-
query_copy.transformations.
|
52
|
+
expect(query_copy.transformations).to eq([{transformation: :filter, parameter: {field: :a, value: :b}}])
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
context "instancing" do
|
57
57
|
it "sets the instance parameter" do
|
58
58
|
query = subject.new(model)
|
59
|
-
query.
|
59
|
+
expect(query).to receive(:copy).and_return(query)
|
60
60
|
query.instance(5)
|
61
|
-
query.transformations.
|
61
|
+
expect(query.transformations).to eq([{transformation: :instance, parameter: 5}])
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
65
|
context "context" do
|
66
66
|
let(:query) {subject.new(model)}
|
67
67
|
before do
|
68
|
-
query.
|
68
|
+
expect(query).to receive(:copy).and_return(query)
|
69
69
|
query.context(:context)
|
70
70
|
end
|
71
71
|
it "should set the correct result model class" do
|
72
|
-
query.result_model.
|
72
|
+
expect(query.result_model).to eq(Context)
|
73
73
|
end
|
74
74
|
it "sets the context parameter" do
|
75
|
-
query.transformations.
|
75
|
+
expect(query.transformations).to eq([{transformation: :context, parameter: :context}])
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -80,9 +80,9 @@ describe QueryInterface::Client::LazyQuery do
|
|
80
80
|
it "should create a new instance including additional fields" do
|
81
81
|
query = subject.new(model)
|
82
82
|
query_copy = subject.new(model)
|
83
|
-
query.
|
83
|
+
expect(query).to receive(:copy).and_return(query_copy)
|
84
84
|
query.with(:c)
|
85
|
-
query_copy.transformations.
|
85
|
+
expect(query_copy.transformations).to eq([{transformation: :with, parameter: {field: :c}}])
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -90,9 +90,9 @@ describe QueryInterface::Client::LazyQuery do
|
|
90
90
|
it "should create a new instance includuing order fields" do
|
91
91
|
query = subject.new(model)
|
92
92
|
query_copy = subject.new(model)
|
93
|
-
query.
|
93
|
+
expect(query).to receive(:copy).and_return(query_copy)
|
94
94
|
query.order("-something")
|
95
|
-
query_copy.transformations.
|
95
|
+
expect(query_copy.transformations).to eq([{transformation: :order, parameter: "-something"}])
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
@@ -100,7 +100,7 @@ describe QueryInterface::Client::LazyQuery do
|
|
100
100
|
it "allows chaining transformations in order of appearance" do
|
101
101
|
query = subject.new(model)
|
102
102
|
query_copy = query.filter(a: :b, c: :d).filter(e: :f).with(:x, :y).instance(12).context(:context)
|
103
|
-
query_copy.transformations.
|
103
|
+
expect(query_copy.transformations).to eq(
|
104
104
|
[
|
105
105
|
{transformation: :filter, parameter: {field: :a, value: :b}},
|
106
106
|
{transformation: :filter, parameter: {field: :c, value: :d}},
|
@@ -118,8 +118,8 @@ describe QueryInterface::Client::LazyQuery do
|
|
118
118
|
it 'gets the first object' do
|
119
119
|
query = subject.new(model)
|
120
120
|
result = double('result')
|
121
|
-
query.
|
122
|
-
query.first.
|
121
|
+
expect(query).to receive(:one).with(:first).and_return(result)
|
122
|
+
expect(query.first).to be(result)
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
@@ -127,8 +127,8 @@ describe QueryInterface::Client::LazyQuery do
|
|
127
127
|
it 'gets the last object' do
|
128
128
|
query = subject.new(model)
|
129
129
|
result = double('result')
|
130
|
-
query.
|
131
|
-
query.last.
|
130
|
+
expect(query).to receive(:one).with(:last).and_return(result)
|
131
|
+
expect(query.last).to be(result)
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
@@ -136,17 +136,17 @@ describe QueryInterface::Client::LazyQuery do
|
|
136
136
|
it 'gets one object' do
|
137
137
|
query = subject.new(model)
|
138
138
|
result = double('result')
|
139
|
-
query.
|
140
|
-
query.
|
141
|
-
query.result.
|
142
|
-
query.send(:one, :anyone).
|
143
|
-
query.transformations.
|
139
|
+
expect(query).to receive(:copy).and_return(query)
|
140
|
+
expect(query).to receive(:do_query).and_return(result)
|
141
|
+
expect(query.result).to be_nil
|
142
|
+
expect(query.send(:one, :anyone)).to be(result)
|
143
|
+
expect(query.transformations).to eq([{transformation: :anyone, parameter: nil}])
|
144
144
|
end
|
145
145
|
it "uses the cached result" do
|
146
146
|
query = subject.new(model)
|
147
147
|
query.result = ["a", "b", "c"]
|
148
|
-
query.
|
149
|
-
query.first.
|
148
|
+
expect(query).not_to receive(:do_query)
|
149
|
+
expect(query.first).to eq("a")
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
@@ -154,29 +154,29 @@ describe QueryInterface::Client::LazyQuery do
|
|
154
154
|
let(:transformations) {[]}
|
155
155
|
context "without instance set" do
|
156
156
|
before do
|
157
|
-
model.
|
158
|
-
.with(:query, transformations: JSON.dump(self.transformations))
|
157
|
+
expect(model).to receive(:get_raw)
|
158
|
+
.with(path: :query, params: {transformations: JSON.dump(self.transformations)})
|
159
159
|
.and_return({parsed_data: {data: ["result object"]}})
|
160
|
-
model.
|
160
|
+
allow(model).to receive(:new_collection).and_return(["result object"])
|
161
161
|
end
|
162
162
|
|
163
163
|
it "add an evaluation transformation" do
|
164
164
|
query = subject.new(model)
|
165
165
|
query.evaluate
|
166
|
-
query.transformations.
|
166
|
+
expect(query.transformations).to eq(transformations)
|
167
167
|
end
|
168
168
|
|
169
169
|
it "gets results via do_query and caches the result" do
|
170
170
|
query = subject.new(model)
|
171
|
-
query.evaluate.
|
172
|
-
query.result.
|
171
|
+
expect(query.evaluate).to eq(["result object"])
|
172
|
+
expect(query.result).to eq(["result object"])
|
173
173
|
end
|
174
174
|
|
175
175
|
it "doesn't query the api twice" do
|
176
176
|
query = subject.new(model)
|
177
177
|
result = query.evaluate
|
178
178
|
result_second = query.evaluate
|
179
|
-
result.
|
179
|
+
expect(result).to be(result_second)
|
180
180
|
end
|
181
181
|
end
|
182
182
|
end
|
@@ -186,17 +186,17 @@ describe QueryInterface::Client::LazyQuery do
|
|
186
186
|
|
187
187
|
it "adds a map_ids transformation" do
|
188
188
|
query = subject.new(model)
|
189
|
-
query.
|
190
|
-
query.
|
189
|
+
expect(query).to receive(:copy).and_return(query)
|
190
|
+
allow(query).to receive(:do_raw_query).and_return({parsed_data: {data: [1,2,3]}})
|
191
191
|
query.ids
|
192
|
-
query.transformations.
|
192
|
+
expect(query.transformations).to eq(self.transformations)
|
193
193
|
end
|
194
194
|
|
195
195
|
it "returns the data of the parsed query" do
|
196
196
|
query = subject.new(model)
|
197
|
-
query.
|
198
|
-
query.
|
199
|
-
query.ids.
|
197
|
+
expect(query).to receive(:copy).and_return(query)
|
198
|
+
expect(query).to receive(:do_raw_query).and_return({parsed_data: {data: [1,2,3]}})
|
199
|
+
expect(query.ids).to eq([1, 2, 3])
|
200
200
|
end
|
201
201
|
end
|
202
202
|
|
@@ -205,17 +205,17 @@ describe QueryInterface::Client::LazyQuery do
|
|
205
205
|
|
206
206
|
it "adds a count transformation" do
|
207
207
|
query = subject.new(model)
|
208
|
-
query.
|
209
|
-
query.
|
210
|
-
query.count.
|
211
|
-
query.transformations.
|
208
|
+
expect(query).to receive(:copy).and_return(query)
|
209
|
+
expect(query).to receive(:do_raw_query).and_return({parsed_data: {data: {count: 42}}})
|
210
|
+
expect(query.count).to eq(42)
|
211
|
+
expect(query.transformations).to eq(self.transformations)
|
212
212
|
end
|
213
213
|
|
214
214
|
it "uses cached result for counting" do
|
215
215
|
query = subject.new(model)
|
216
216
|
query.result = ["a", "b", "c"]
|
217
|
-
query.
|
218
|
-
query.count.
|
217
|
+
expect(query).not_to receive(:do_raw_query)
|
218
|
+
expect(query.count).to eq(3)
|
219
219
|
end
|
220
220
|
end
|
221
221
|
|
@@ -225,15 +225,15 @@ describe QueryInterface::Client::LazyQuery do
|
|
225
225
|
|
226
226
|
it "adds a paginate transformation" do
|
227
227
|
query = subject.new(model)
|
228
|
-
query.
|
228
|
+
expect(query).to receive(:copy).and_return(query)
|
229
229
|
objects = (1..10).to_a
|
230
|
-
model.
|
231
|
-
query.
|
230
|
+
allow(model).to receive(:new).and_return(*objects)
|
231
|
+
expect(query).to receive(:do_raw_query).and_return({parsed_data: {data: {objects: objects, total: 15}, errors: []}})
|
232
232
|
result = query.paginate
|
233
|
-
query.transformations.
|
234
|
-
result.
|
235
|
-
result.is_a?(
|
236
|
-
result.
|
233
|
+
expect(query.transformations).to eq(self.transformations)
|
234
|
+
expect(result).to eq(objects)
|
235
|
+
result.is_a?(RsPaginator::Collection)
|
236
|
+
expect(result.total).to eq(15)
|
237
237
|
end
|
238
238
|
end
|
239
239
|
|
@@ -241,8 +241,8 @@ describe QueryInterface::Client::LazyQuery do
|
|
241
241
|
it "delegates unknown methods to the result of evaluate" do
|
242
242
|
query = subject.new(model)
|
243
243
|
result = double("result")
|
244
|
-
query.
|
245
|
-
result.
|
244
|
+
expect(query).to receive(:evaluate).and_return(result)
|
245
|
+
expect(result).to receive(:frobnicate!).with("uargh!")
|
246
246
|
query.frobnicate!("uargh!")
|
247
247
|
end
|
248
248
|
end
|
@@ -250,24 +250,23 @@ describe QueryInterface::Client::LazyQuery do
|
|
250
250
|
context "do queries" do
|
251
251
|
it "queries the api raw" do
|
252
252
|
query = subject.new(model)
|
253
|
-
model.
|
253
|
+
expect(model).to receive(:get_raw).with(path: :query, params: {transformations: "[]"})
|
254
254
|
query.do_raw_query
|
255
255
|
end
|
256
256
|
|
257
257
|
it "executes the actual query and creates a collection where appropriate" do
|
258
258
|
query = subject.new(model)
|
259
259
|
data = {parsed_data: {data: [1,2,3]}}
|
260
|
-
query.
|
261
|
-
query.
|
260
|
+
expect(query).to receive(:do_raw_query).and_return(data)
|
261
|
+
expect(query).to receive(:instantiate_collection).with(data[:parsed_data])
|
262
262
|
query.do_query
|
263
263
|
end
|
264
264
|
|
265
265
|
it "executes the actual query and creates an object where appropriate" do
|
266
266
|
query = subject.new(model)
|
267
267
|
data = {parsed_data: {data: {id: 1, bunny: 'wuschel'}}}
|
268
|
-
query.
|
269
|
-
query.
|
270
|
-
query.should_receive(:instantiate).with(data[:parsed_data].merge(_metadata: nil, _errors: nil))
|
268
|
+
expect(query).to receive(:do_raw_query).and_return(data)
|
269
|
+
expect(query).to receive(:instantiate).with(data[:parsed_data][:data])
|
271
270
|
query.do_query
|
272
271
|
end
|
273
272
|
|
@@ -280,13 +279,13 @@ describe QueryInterface::Client::LazyQuery do
|
|
280
279
|
it "parses the data via result model if set" do
|
281
280
|
query = subject.new(model)
|
282
281
|
query.result_model = result_model
|
283
|
-
result_model.
|
282
|
+
expect(result_model).to receive(:parse).with(data)
|
284
283
|
query.parse(data)
|
285
284
|
end
|
286
285
|
|
287
286
|
it "parses the data via model if no result model set" do
|
288
287
|
query = subject.new(model)
|
289
|
-
model.
|
288
|
+
expect(model).to receive(:parse).with(data)
|
290
289
|
query.parse(data)
|
291
290
|
end
|
292
291
|
end
|
@@ -295,14 +294,14 @@ describe QueryInterface::Client::LazyQuery do
|
|
295
294
|
let(:transformations) {[]}
|
296
295
|
let(:result) { double("result") }
|
297
296
|
before do
|
298
|
-
model.
|
299
|
-
.with(:query, transformations: JSON.dump(self.transformations))
|
297
|
+
expect(model).to receive(:get_raw)
|
298
|
+
.with(path: :query, params: {transformations: JSON.dump(self.transformations)})
|
300
299
|
.and_return({parsed_data: {data: ["result object"]}})
|
301
|
-
model.
|
300
|
+
allow(model).to receive(:new_collection).and_return(result)
|
302
301
|
end
|
303
302
|
it "calls to_json on the evaluated result" do
|
304
303
|
query = subject.new(model)
|
305
|
-
result.
|
304
|
+
expect(result).to receive(:to_json)
|
306
305
|
query.to_json
|
307
306
|
end
|
308
307
|
end
|
@@ -311,16 +310,16 @@ describe QueryInterface::Client::LazyQuery do
|
|
311
310
|
let(:transformations) {[]}
|
312
311
|
let(:result) { double("result") }
|
313
312
|
before do
|
314
|
-
model.
|
315
|
-
.with(:query, transformations: JSON.dump(self.transformations))
|
313
|
+
expect(model).to receive(:get_raw)
|
314
|
+
.with(path: :query, params: {transformations: JSON.dump(self.transformations)})
|
316
315
|
.and_return({parsed_data: {data: ["result object"]}})
|
317
|
-
model.
|
316
|
+
allow(model).to receive(:new_collection).and_return(result)
|
318
317
|
end
|
319
318
|
it "calls to_key on the evaluated result if persisted" do
|
320
319
|
query = subject.new(model)
|
321
|
-
result.
|
322
|
-
result.
|
323
|
-
query.to_param.
|
320
|
+
expect(result).to receive(:persisted?).and_return(true)
|
321
|
+
expect(result).to receive(:to_key).and_return([5])
|
322
|
+
expect(query.to_param).to eq("5")
|
324
323
|
end
|
325
324
|
|
326
325
|
end
|
data/spec/lib/resource_spec.rb
CHANGED
@@ -8,27 +8,27 @@ describe QueryInterface::Client::Resource do
|
|
8
8
|
|
9
9
|
let(:lazy_query) { double("LazyQuery") }
|
10
10
|
before(:each) do
|
11
|
-
QueryInterface::Client::LazyQuery.
|
11
|
+
allow(QueryInterface::Client::LazyQuery).to receive_messages(new: lazy_query)
|
12
12
|
end
|
13
13
|
context "class methods" do
|
14
14
|
context ".query" do
|
15
15
|
it "returns a LazyQuery object" do
|
16
|
-
RMDummyClass.query.
|
16
|
+
expect(RMDummyClass.query).to eq(lazy_query)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
context ".first" do
|
20
20
|
it "queries the query object" do
|
21
21
|
args = double("Args")
|
22
|
-
lazy_query.
|
23
|
-
lazy_query.
|
22
|
+
expect(lazy_query).to receive(:order).with('id').and_return(lazy_query)
|
23
|
+
expect(lazy_query).to receive(:first)
|
24
24
|
RMDummyClass.first(args)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
context ".last" do
|
28
28
|
it "queries the query object" do
|
29
29
|
args = double("Args")
|
30
|
-
lazy_query.
|
31
|
-
lazy_query.
|
30
|
+
expect(lazy_query).to receive(:order).with('id').and_return(lazy_query)
|
31
|
+
expect(lazy_query).to receive(:last)
|
32
32
|
RMDummyClass.last(args)
|
33
33
|
end
|
34
34
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: query-interface-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Kopecky <andreas.kopecky@radarservices.com>
|
@@ -10,10 +10,10 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-10-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: rs_paginator
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
@@ -41,7 +41,7 @@ dependencies:
|
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '0'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
|
-
name:
|
44
|
+
name: faraday
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
@@ -96,8 +96,13 @@ files:
|
|
96
96
|
- README.md
|
97
97
|
- Rakefile
|
98
98
|
- lib/query-interface-client.rb
|
99
|
+
- lib/query-interface-client/api.rb
|
100
|
+
- lib/query-interface-client/json_middleware.rb
|
99
101
|
- lib/query-interface-client/lazy_query.rb
|
102
|
+
- lib/query-interface-client/model.rb
|
103
|
+
- lib/query-interface-client/request.rb
|
100
104
|
- lib/query-interface-client/resource.rb
|
105
|
+
- lib/query-interface-client/types.rb
|
101
106
|
- lib/query-interface-client/version.rb
|
102
107
|
- query-interface-client.gemspec
|
103
108
|
- spec/lib/lazy_query_spec.rb
|