plate_api 1.2.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 947c12da1663740de9378f1c065f158630eef3a7cccc901b728f523db3777194
4
- data.tar.gz: 9c5e26eb8a8e70a7eca3b9511e38e649be72933a52975bcc793d6d79e4268d93
3
+ metadata.gz: 503eedbe972dc1af57701afbafd35a6ad76e106d86b94ad32093a40d5c63d1da
4
+ data.tar.gz: 4df9c933309cfe2217882548fa88f525e45852a7356229b3488b7ea8f6759dee
5
5
  SHA512:
6
- metadata.gz: 7f0e809ce4944a826e2c4ddf3e085e87ceb96e76a7cf96fa9261e24e27da78d3773abea76c93a8e24ee89fb6a9ba28bd8efa9249d5289248a3fd5df2f6796280
7
- data.tar.gz: 736048b6087f9c42f0d246d0dc6f5b39d9c09f3dc08957056a47ca2f4c4079c11574691387dace9428fb692c829d7df3c30c41a0880b6b314ba7dfec2896a681
6
+ metadata.gz: 775b16afb1ea5c15e5203a241bb74509e04a1a573539f498c3a612c91b90b094dfbe8304d2d2158b5fd10d18d0949acbcf1f1cddcffe82edea5cc75aba73bfc8
7
+ data.tar.gz: 464e4c82997c7d0177f19bc39b351ff77fbb2584aada96aab67e6e5ec4a39ee482130c150f3322f3054309f343c9b80e2e7f169388aede15e6084dada4b6d4fc
data/Dockerfile ADDED
@@ -0,0 +1,6 @@
1
+ FROM ruby:2.7
2
+
3
+ RUN mkdir /plate_api
4
+ WORKDIR /plate_api
5
+ COPY . /plate_api
6
+ RUN bin/setup
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
- return new_object(result["data"])
20
+ new_object(result["data"])
19
21
  else
20
- raise Error::Response, result
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? Hash
27
- result = @api_connector.put(resource_path(id), {"data" => attributes})
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
- return new_object(result["data"])
33
+ new_object(result["data"])
31
34
  else
32
- raise Error::Response, result
35
+ raise ResponseError, result
33
36
  end
34
37
  end
35
38
 
36
- def create(parent, attributes, create_method=:post)
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? Hash
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
- return new_object(result["data"])
53
+ new_object(result["data"])
50
54
  else
51
- raise Error::Response, result
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
- return new_object(result["data"])
64
+ new_object(result["data"])
60
65
  else
61
- raise Error::Response, result
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
- if result["data"]
71
- return result["data"].map{|x| new_object(x)}
72
- else
73
- raise Error::Response, result
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
- return result["meta"]["pagination"]["total_records"]
98
+ result["meta"]["pagination"]["total_records"]
81
99
  else
82
- raise Error::Response, result
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 != nil) ^ (parent_id != nil)
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
- "#{@handling_class.api_name}"
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.new("No object_handler is set.") unless @object_handler
20
+ raise ArgumentError, "No object_handler is set." unless @object_handler
21
+
21
22
  reinitialize(@object_handler.find(@id))
22
- return self
23
+ self
23
24
  end
24
25
 
25
26
  def update(attributes)
26
- raise ArgumentError.new("Input `attributes` is not a Hash") unless attributes.is_a? Hash
27
- raise ArgumentError.new("No object_handler is attached to this object") unless @object_handler
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.new("The update was unsuccesful.")
33
+ raise ArgumentError, "The update was unsuccesful."
32
34
  end
33
- return self
35
+ self
34
36
  end
35
37
 
36
38
  def delete
37
- raise ArgumentError.new("No object_handler is attached to this object") unless @object_handler
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(m, *args, &block)
50
- if attributes[m.to_s]
51
- return attributes[m.to_s]
52
- elsif attributes["content"] && attributes["content"][m.to_s]
53
- return attributes["content"][m.to_s]["value"]
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
- return other.id == @id && other.class == self.class
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 self.has_one(name, klass)
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
- def self.define_has_one_method(name, klass)
83
- define_method(name.to_s) do
84
- id = self.send("#{name}_id")
85
- return nil unless id
86
- @object_handler.api_connector.handler(Object.const_get(klass)).find(id)
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
- def self.has_many(plural_name, singular_name, klass, define_create_method=false)
91
- HasManyRelations[self.name] ||= {}
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
- def self.define_has_many_methods(plural_name, klass)
98
- define_method(plural_name.to_s) do |params={}|
99
- @object_handler.api_connector.handler(
100
- Object.const_get(klass)
101
- ).index(self.class, @id, params)
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
- define_method("#{plural_name}_total_count") do
105
- @object_handler.api_connector.handler(
106
- Object.const_get(klass)
107
- ).index_total_count(self)
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
- def self.define_create_method(singular_name, klass)
112
- define_method("create_#{singular_name}") do |create_attributes|
113
- @object_handler.api_connector.handler(Object.const_get(klass)).create(self, create_attributes)
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
- def set_relation_ids(relations_attributes)
118
- HasOneRelations[self.class.name] ||= {}
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
- return unless relations_attributes
121
- self.class::HasOneRelations[self.class.name].keys.each do |relation_name|
122
- val = relations_attributes["#{relation_name}_id"]
123
- if val
124
- send("#{relation_name}_id=", val)
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
@@ -0,0 +1,5 @@
1
+ module PlateApi
2
+ class ResponseError < StandardError
3
+
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module PlateApi
2
- VERSION = "1.2.4"
2
+ VERSION = "1.2.5"
3
3
  end
data/lib/plate_api.rb CHANGED
@@ -9,7 +9,7 @@ require "plate_api/delete_request"
9
9
  require "plate_api/post_request"
10
10
  require "plate_api/post_multipart_request"
11
11
  require "plate_api/put_request"
12
- require "plate_api/error"
12
+ require "plate_api/response_error"
13
13
 
14
14
 
15
15
  module PlateApi
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
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:
@@ -1,5 +0,0 @@
1
- module Error
2
- class Response < StandardError
3
-
4
- end
5
- end