plate_api 1.2.4 → 1.2.5
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 +4 -4
- data/Dockerfile +6 -0
- data/README.md +6 -0
- data/lib/plate_api/object_handler.rb +52 -23
- data/lib/plate_api/plate_object/base.rb +74 -52
- data/lib/plate_api/response_error.rb +5 -0
- data/lib/plate_api/version.rb +1 -1
- data/lib/plate_api.rb +1 -1
- metadata +3 -2
- data/lib/plate_api/error.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 503eedbe972dc1af57701afbafd35a6ad76e106d86b94ad32093a40d5c63d1da
|
4
|
+
data.tar.gz: 4df9c933309cfe2217882548fa88f525e45852a7356229b3488b7ea8f6759dee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 775b16afb1ea5c15e5203a241bb74509e04a1a573539f498c3a612c91b90b094dfbe8304d2d2158b5fd10d18d0949acbcf1f1cddcffe82edea5cc75aba73bfc8
|
7
|
+
data.tar.gz: 464e4c82997c7d0177f19bc39b351ff77fbb2584aada96aab67e6e5ec4a39ee482130c150f3322f3054309f343c9b80e2e7f169388aede15e6084dada4b6d4fc
|
data/Dockerfile
ADDED
data/README.md
CHANGED
@@ -145,6 +145,12 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
145
145
|
|
146
146
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
147
147
|
|
148
|
+
## Run Specs with Docker
|
149
|
+
```bash
|
150
|
+
docker build -t plate_api_gem .
|
151
|
+
docker run --rm -it plate_api_gem rspec
|
152
|
+
```
|
153
|
+
|
148
154
|
## License
|
149
155
|
|
150
156
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -7,38 +7,42 @@ module PlateApi
|
|
7
7
|
def initialize(handling_class, api_connector)
|
8
8
|
raise ArgumentError, "`handling_class` given for #new is not valid" unless handling_class
|
9
9
|
raise ArgumentError, "`api_connector` given for #new is not valid" unless api_connector
|
10
|
+
|
10
11
|
@handling_class = handling_class
|
11
12
|
@api_connector = api_connector
|
12
13
|
end
|
13
14
|
|
14
15
|
def find(id)
|
15
16
|
raise ArgumentError, "`id` given for #find is not valid" unless id
|
17
|
+
|
16
18
|
result = @api_connector.get(resource_path(id))
|
17
19
|
if result["data"]
|
18
|
-
|
20
|
+
new_object(result["data"])
|
19
21
|
else
|
20
|
-
raise
|
22
|
+
raise ResponseError, result
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
26
|
def update(id, attributes)
|
25
27
|
raise ArgumentError, "`id` given for #update is not valid" unless id
|
26
|
-
raise ArgumentError, "`attributes` given for #update is not valid" unless attributes.is_a?
|
27
|
-
|
28
|
+
raise ArgumentError, "`attributes` given for #update is not valid" unless attributes.is_a?(Hash)
|
29
|
+
|
30
|
+
result = @api_connector.put(resource_path(id), { "data" => attributes })
|
28
31
|
|
29
32
|
if result["data"]
|
30
|
-
|
33
|
+
new_object(result["data"])
|
31
34
|
else
|
32
|
-
raise
|
35
|
+
raise ResponseError, result
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
36
|
-
def create(parent, attributes, create_method
|
39
|
+
def create(parent, attributes, create_method = :post)
|
37
40
|
raise ArgumentError, "`parent` given for #create is not valid" unless parent
|
38
|
-
raise ArgumentError, "`attributes` given for #create is not valid" unless attributes.is_a?
|
41
|
+
raise ArgumentError, "`attributes` given for #create is not valid" unless attributes.is_a?(Hash)
|
42
|
+
|
39
43
|
parameters = case create_method
|
40
44
|
when :post
|
41
|
-
{"data" => attributes}
|
45
|
+
{ "data" => attributes }
|
42
46
|
when :post_multipart
|
43
47
|
attributes
|
44
48
|
end
|
@@ -46,45 +50,70 @@ module PlateApi
|
|
46
50
|
result = @api_connector.send(create_method, collection_path(parent.class, parent.id), parameters)
|
47
51
|
|
48
52
|
if result["data"]
|
49
|
-
|
53
|
+
new_object(result["data"])
|
50
54
|
else
|
51
|
-
raise
|
55
|
+
raise ResponseError, result
|
52
56
|
end
|
53
57
|
end
|
54
58
|
|
55
59
|
def delete(id)
|
56
60
|
raise ArgumentError, "`id` given for #find is not valid" unless id
|
61
|
+
|
57
62
|
result = @api_connector.delete(resource_path(id))
|
58
63
|
if result["data"]
|
59
|
-
|
64
|
+
new_object(result["data"])
|
60
65
|
else
|
61
|
-
raise
|
66
|
+
raise ResponseError, result
|
62
67
|
end
|
63
68
|
end
|
64
69
|
|
65
|
-
def index(parent_class, parent_id, extra_params={})
|
70
|
+
def index(parent_class, parent_id, extra_params = {}, return_raw = false)
|
66
71
|
raise ArgumentError, "`parent_id` given for #index is not valid" unless parent_id
|
67
72
|
raise ArgumentError, "`parent_class` given for #index is not valid" unless parent_class
|
68
73
|
|
69
74
|
result = @api_connector.get(collection_path(parent_class, parent_id), extra_params)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
75
|
+
raise ResponseError, result unless result["data"]
|
76
|
+
return result if return_raw
|
77
|
+
|
78
|
+
result["data"].map { |x| new_object(x) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def index_block(parent_class, parent_id, extra_params = {}, &block)
|
82
|
+
extra_params[:page] = extra_params.delete("page") if extra_params["page"]
|
83
|
+
extra_params[:page] = 1 unless extra_params[:page]
|
84
|
+
|
85
|
+
pagination = index_block_iteration(parent_class, parent_id, extra_params, &block)
|
86
|
+
return unless pagination
|
87
|
+
|
88
|
+
while pagination["page"] < pagination["total_pages"]
|
89
|
+
extra_params.merge!(page: (pagination["page"] + 1))
|
90
|
+
pagination = index_block_iteration(parent_class, parent_id, extra_params, &block)
|
91
|
+
break unless pagination
|
74
92
|
end
|
75
93
|
end
|
76
94
|
|
77
95
|
def index_total_count(parent)
|
78
96
|
result = @api_connector.get(collection_path(parent.class, parent.id), per_page: 1)
|
79
97
|
if result["meta"]
|
80
|
-
|
98
|
+
result["meta"]["pagination"]["total_records"]
|
81
99
|
else
|
82
|
-
raise
|
100
|
+
raise ResponseError, result
|
83
101
|
end
|
84
102
|
end
|
85
103
|
|
86
104
|
private
|
87
105
|
|
106
|
+
def index_block_iteration(parent_class, parent_id, params)
|
107
|
+
result = index(parent_class, parent_id, params, true)
|
108
|
+
objects = result["data"].map { |x| new_object(x) }
|
109
|
+
meta = result["meta"]
|
110
|
+
yield(objects, meta)
|
111
|
+
|
112
|
+
# Returns pagination metadata so it can be used to
|
113
|
+
# iterate through the pages.
|
114
|
+
meta["pagination"] if meta
|
115
|
+
end
|
116
|
+
|
88
117
|
# Construct a new object of @handling_class, given a succesful api_response
|
89
118
|
def new_object(api_response)
|
90
119
|
@handling_class.new(
|
@@ -99,15 +128,15 @@ module PlateApi
|
|
99
128
|
"#{@handling_class.api_name}/#{id}"
|
100
129
|
end
|
101
130
|
|
102
|
-
def collection_path(parent_class=nil, parent_id=nil)
|
103
|
-
if (parent_class
|
131
|
+
def collection_path(parent_class = nil, parent_id = nil)
|
132
|
+
if (!parent_class.nil?) ^ (!parent_id.nil?)
|
104
133
|
raise ArgumentError, "An invalid combination `parent_class` and `parent_id` is given. Provide both or none."
|
105
134
|
end
|
106
135
|
|
107
136
|
if parent_class
|
108
137
|
"#{parent_class.api_name}/#{parent_id}/#{@handling_class.api_name}"
|
109
138
|
else
|
110
|
-
|
139
|
+
@handling_class.api_name.to_s
|
111
140
|
end
|
112
141
|
end
|
113
142
|
end
|
@@ -6,7 +6,7 @@ module PlateApi::PlateObject
|
|
6
6
|
HasOneRelations = {}
|
7
7
|
HasManyRelations = {}
|
8
8
|
|
9
|
-
def initialize(id, attributes, relations, object_handler=nil)
|
9
|
+
def initialize(id, attributes, relations, object_handler = nil)
|
10
10
|
@id = id
|
11
11
|
@object_handler = object_handler
|
12
12
|
initialize_state(attributes, relations)
|
@@ -17,24 +17,27 @@ module PlateApi::PlateObject
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def reload
|
20
|
-
raise ArgumentError
|
20
|
+
raise ArgumentError, "No object_handler is set." unless @object_handler
|
21
|
+
|
21
22
|
reinitialize(@object_handler.find(@id))
|
22
|
-
|
23
|
+
self
|
23
24
|
end
|
24
25
|
|
25
26
|
def update(attributes)
|
26
|
-
raise ArgumentError
|
27
|
-
raise ArgumentError
|
27
|
+
raise ArgumentError, "Input `attributes` is not a Hash" unless attributes.is_a?(Hash)
|
28
|
+
raise ArgumentError, "No object_handler is attached to this object" unless @object_handler
|
29
|
+
|
28
30
|
if new_object = @object_handler.update(@id, attributes)
|
29
31
|
reinitialize(new_object)
|
30
32
|
else
|
31
|
-
raise ArgumentError
|
33
|
+
raise ArgumentError, "The update was unsuccesful."
|
32
34
|
end
|
33
|
-
|
35
|
+
self
|
34
36
|
end
|
35
37
|
|
36
38
|
def delete
|
37
|
-
raise ArgumentError
|
39
|
+
raise ArgumentError, "No object_handler is attached to this object" unless @object_handler
|
40
|
+
|
38
41
|
@object_handler.delete(@id)
|
39
42
|
end
|
40
43
|
|
@@ -46,18 +49,25 @@ module PlateApi::PlateObject
|
|
46
49
|
to_s
|
47
50
|
end
|
48
51
|
|
49
|
-
def method_missing(
|
50
|
-
if attributes[
|
51
|
-
|
52
|
-
elsif attributes["content"] && attributes["content"][
|
53
|
-
|
52
|
+
def method_missing(method_name, *args, &block)
|
53
|
+
if attributes[method_name.to_s]
|
54
|
+
attributes[method_name.to_s]
|
55
|
+
elsif attributes["content"] && attributes["content"][method_name.to_s]
|
56
|
+
attributes["content"][method_name.to_s]["value"]
|
54
57
|
else
|
55
58
|
super
|
56
59
|
end
|
57
60
|
end
|
58
61
|
|
62
|
+
def respond_to_missing?(method_name, include_private = false)
|
63
|
+
return true if attributes[method_name.to_s]
|
64
|
+
return true if attributes["content"] && attributes["content"][method_name.to_s]
|
65
|
+
|
66
|
+
super
|
67
|
+
end
|
68
|
+
|
59
69
|
def ==(other)
|
60
|
-
|
70
|
+
other.id == @id && other.class == self.class
|
61
71
|
end
|
62
72
|
|
63
73
|
private
|
@@ -72,56 +82,68 @@ module PlateApi::PlateObject
|
|
72
82
|
@relations = relations
|
73
83
|
end
|
74
84
|
|
75
|
-
def
|
76
|
-
HasOneRelations[self.name] ||= {}
|
77
|
-
self.attr_accessor "#{name}_id"
|
78
|
-
HasOneRelations[self.name][name.to_s] = klass
|
79
|
-
define_has_one_method(name, klass)
|
80
|
-
end
|
85
|
+
def set_relation_ids(relations_attributes)
|
86
|
+
HasOneRelations[self.class.name] ||= {}
|
81
87
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
88
|
+
return unless relations_attributes
|
89
|
+
|
90
|
+
self.class::HasOneRelations[self.class.name].keys.each do |relation_name|
|
91
|
+
val = relations_attributes["#{relation_name}_id"]
|
92
|
+
if val
|
93
|
+
send("#{relation_name}_id=", val)
|
94
|
+
end
|
87
95
|
end
|
88
96
|
end
|
89
97
|
|
90
|
-
|
91
|
-
|
92
|
-
HasManyRelations[self.name][plural_name.to_s] = klass
|
93
|
-
define_has_many_methods(plural_name, klass)
|
94
|
-
define_create_method(singular_name, klass) if define_create_method
|
95
|
-
end
|
98
|
+
class << self
|
99
|
+
private
|
96
100
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
101
|
+
def has_one(name, klass)
|
102
|
+
HasOneRelations[self.name] ||= {}
|
103
|
+
attr_accessor("#{name}_id")
|
104
|
+
HasOneRelations[self.name][name.to_s] = klass
|
105
|
+
define_has_one_method(name, klass)
|
102
106
|
end
|
103
107
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
+
def define_has_one_method(name, klass)
|
109
|
+
define_method(name.to_s) do
|
110
|
+
id = send("#{name}_id")
|
111
|
+
return nil unless id
|
112
|
+
|
113
|
+
@object_handler.api_connector.handler(Object.const_get(klass)).find(id)
|
114
|
+
end
|
108
115
|
end
|
109
|
-
end
|
110
116
|
|
111
|
-
|
112
|
-
|
113
|
-
|
117
|
+
def has_many(plural_name, singular_name, klass, define_create_method = false)
|
118
|
+
HasManyRelations[name] ||= {}
|
119
|
+
HasManyRelations[name][plural_name.to_s] = klass
|
120
|
+
define_has_many_methods(plural_name, klass)
|
121
|
+
define_create_method(singular_name, klass) if define_create_method
|
114
122
|
end
|
115
|
-
end
|
116
123
|
|
117
|
-
|
118
|
-
|
124
|
+
def define_has_many_methods(plural_name, klass)
|
125
|
+
define_method(plural_name.to_s) do |params = {}|
|
126
|
+
@object_handler.api_connector.handler(
|
127
|
+
Object.const_get(klass)
|
128
|
+
).index(self.class, @id, params)
|
129
|
+
end
|
119
130
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
131
|
+
define_method("#{plural_name}_total_count") do
|
132
|
+
@object_handler.api_connector.handler(
|
133
|
+
Object.const_get(klass)
|
134
|
+
).index_total_count(self)
|
135
|
+
end
|
136
|
+
|
137
|
+
define_method("all_#{plural_name}") do |params = {}, &block|
|
138
|
+
@object_handler.api_connector.handler(
|
139
|
+
Object.const_get(klass)
|
140
|
+
).index_block(self.class, @id, params, &block)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def define_create_method(singular_name, klass)
|
145
|
+
define_method("create_#{singular_name}") do |create_attributes|
|
146
|
+
@object_handler.api_connector.handler(Object.const_get(klass)).create(self, create_attributes)
|
125
147
|
end
|
126
148
|
end
|
127
149
|
end
|
data/lib/plate_api/version.rb
CHANGED
data/lib/plate_api.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plate_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Kortleven
|
@@ -165,6 +165,7 @@ files:
|
|
165
165
|
- ".gitignore"
|
166
166
|
- ".rspec"
|
167
167
|
- ".travis.yml"
|
168
|
+
- Dockerfile
|
168
169
|
- Gemfile
|
169
170
|
- Gemfile.lock
|
170
171
|
- LICENSE.txt
|
@@ -175,7 +176,6 @@ files:
|
|
175
176
|
- lib/plate_api.rb
|
176
177
|
- lib/plate_api/connector.rb
|
177
178
|
- lib/plate_api/delete_request.rb
|
178
|
-
- lib/plate_api/error.rb
|
179
179
|
- lib/plate_api/get_request.rb
|
180
180
|
- lib/plate_api/object_handler.rb
|
181
181
|
- lib/plate_api/plate_object/attachment.rb
|
@@ -196,6 +196,7 @@ files:
|
|
196
196
|
- lib/plate_api/post_request.rb
|
197
197
|
- lib/plate_api/put_request.rb
|
198
198
|
- lib/plate_api/request.rb
|
199
|
+
- lib/plate_api/response_error.rb
|
199
200
|
- lib/plate_api/version.rb
|
200
201
|
- plate_api.gemspec
|
201
202
|
homepage:
|