Creizer-Meli 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +9 -0
  3. data/README.md +137 -0
  4. data/Rakefile +10 -0
  5. data/creizer-meli.gemspec +33 -0
  6. data/docs/Attributes.md +31 -0
  7. data/docs/AttributesValueStruct.md +19 -0
  8. data/docs/AttributesValues.md +21 -0
  9. data/docs/CategoriesApi.md +150 -0
  10. data/docs/InlineObject.md +27 -0
  11. data/docs/Item.md +41 -0
  12. data/docs/ItemPictures.md +17 -0
  13. data/docs/ItemsApi.md +152 -0
  14. data/docs/ItemsHealthApi.md +150 -0
  15. data/docs/OAuth20Api.md +117 -0
  16. data/docs/RestClientApi.md +204 -0
  17. data/docs/Variations.md +25 -0
  18. data/docs/VariationsAttributeCombinations.md +21 -0
  19. data/examples/get_token.rb +21 -0
  20. data/examples/restclient_post.rb +73 -0
  21. data/lib/meli.rb +52 -0
  22. data/lib/meli/api/categories_api.rb +216 -0
  23. data/lib/meli/api/items_api.rb +226 -0
  24. data/lib/meli/api/items_health_api.rb +216 -0
  25. data/lib/meli/api/o_auth20_api.rb +178 -0
  26. data/lib/meli/api/rest_client_api.rb +306 -0
  27. data/lib/meli/api_client.rb +387 -0
  28. data/lib/meli/api_error.rb +57 -0
  29. data/lib/meli/configuration.rb +297 -0
  30. data/lib/meli/models/attributes.rb +273 -0
  31. data/lib/meli/models/attributes_value_struct.rb +215 -0
  32. data/lib/meli/models/attributes_values.rb +226 -0
  33. data/lib/meli/models/inline_object.rb +251 -0
  34. data/lib/meli/models/item.rb +375 -0
  35. data/lib/meli/models/item_pictures.rb +206 -0
  36. data/lib/meli/models/variations.rb +246 -0
  37. data/lib/meli/models/variations_attribute_combinations.rb +224 -0
  38. data/lib/meli/version.rb +15 -0
  39. data/spec/api/categories_api_spec.rb +70 -0
  40. data/spec/api/items_api_spec.rb +71 -0
  41. data/spec/api/items_health_api_spec.rb +70 -0
  42. data/spec/api/o_auth20_api_spec.rb +65 -0
  43. data/spec/api/rest_client_api_spec.rb +85 -0
  44. data/spec/api_client_spec.rb +226 -0
  45. data/spec/configuration_spec.rb +42 -0
  46. data/spec/models/attributes_spec.rb +83 -0
  47. data/spec/models/attributes_value_struct_spec.rb +47 -0
  48. data/spec/models/attributes_values_spec.rb +53 -0
  49. data/spec/models/inline_object_spec.rb +71 -0
  50. data/spec/models/item_pictures_spec.rb +41 -0
  51. data/spec/models/item_spec.rb +113 -0
  52. data/spec/models/variations_attribute_combinations_spec.rb +53 -0
  53. data/spec/models/variations_spec.rb +65 -0
  54. data/spec/spec_helper.rb +111 -0
  55. metadata +173 -0
@@ -0,0 +1,57 @@
1
+ =begin
2
+ #MELI Markeplace SDK
3
+
4
+ #This is a the codebase to generate a SDK for Open Platform Marketplace
5
+
6
+ The version of the OpenAPI document: 3.0.0
7
+
8
+ Generated by: https://openapi-generator.tech
9
+ OpenAPI Generator version: 4.3.1
10
+
11
+ =end
12
+
13
+ module Meli
14
+ class ApiError < StandardError
15
+ attr_reader :code, :response_headers, :response_body
16
+
17
+ # Usage examples:
18
+ # ApiError.new
19
+ # ApiError.new("message")
20
+ # ApiError.new(:code => 500, :response_headers => {}, :response_body => "")
21
+ # ApiError.new(:code => 404, :message => "Not Found")
22
+ def initialize(arg = nil)
23
+ if arg.is_a? Hash
24
+ if arg.key?(:message) || arg.key?('message')
25
+ super(arg[:message] || arg['message'])
26
+ else
27
+ super arg
28
+ end
29
+
30
+ arg.each do |k, v|
31
+ instance_variable_set "@#{k}", v
32
+ end
33
+ else
34
+ super arg
35
+ end
36
+ end
37
+
38
+ # Override to_s to display a friendly error message
39
+ def to_s
40
+ message
41
+ end
42
+
43
+ def message
44
+ if @message.nil?
45
+ msg = "Error message: the server returns an error"
46
+ else
47
+ msg = @message
48
+ end
49
+
50
+ msg += "\nHTTP status code: #{code}" if code
51
+ msg += "\nResponse headers: #{response_headers}" if response_headers
52
+ msg += "\nResponse body: #{response_body}" if response_body
53
+
54
+ msg
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,297 @@
1
+ =begin
2
+ #MELI Markeplace SDK
3
+
4
+ #This is a the codebase to generate a SDK for Open Platform Marketplace
5
+
6
+ The version of the OpenAPI document: 3.0.0
7
+
8
+ Generated by: https://openapi-generator.tech
9
+ OpenAPI Generator version: 4.3.1
10
+
11
+ =end
12
+
13
+ module Meli
14
+ class Configuration
15
+ # Defines url scheme
16
+ attr_accessor :scheme
17
+
18
+ # Defines url host
19
+ attr_accessor :host
20
+
21
+ # Defines url base path
22
+ attr_accessor :base_path
23
+
24
+ # Defines API keys used with API Key authentications.
25
+ #
26
+ # @return [Hash] key: parameter name, value: parameter value (API key)
27
+ #
28
+ # @example parameter name is "api_key", API key is "xxx" (e.g. "api_key=xxx" in query string)
29
+ # config.api_key['api_key'] = 'xxx'
30
+ attr_accessor :api_key
31
+
32
+ # Defines API key prefixes used with API Key authentications.
33
+ #
34
+ # @return [Hash] key: parameter name, value: API key prefix
35
+ #
36
+ # @example parameter name is "Authorization", API key prefix is "Token" (e.g. "Authorization: Token xxx" in headers)
37
+ # config.api_key_prefix['api_key'] = 'Token'
38
+ attr_accessor :api_key_prefix
39
+
40
+ # Defines the username used with HTTP basic authentication.
41
+ #
42
+ # @return [String]
43
+ attr_accessor :username
44
+
45
+ # Defines the password used with HTTP basic authentication.
46
+ #
47
+ # @return [String]
48
+ attr_accessor :password
49
+
50
+ # Defines the access token (Bearer) used with OAuth2.
51
+ attr_accessor :access_token
52
+
53
+ # Set this to enable/disable debugging. When enabled (set to true), HTTP request/response
54
+ # details will be logged with `logger.debug` (see the `logger` attribute).
55
+ # Default to false.
56
+ #
57
+ # @return [true, false]
58
+ attr_accessor :debugging
59
+
60
+ # Defines the logger used for debugging.
61
+ # Default to `Rails.logger` (when in Rails) or logging to STDOUT.
62
+ #
63
+ # @return [#debug]
64
+ attr_accessor :logger
65
+
66
+ # Defines the temporary folder to store downloaded files
67
+ # (for API endpoints that have file response).
68
+ # Default to use `Tempfile`.
69
+ #
70
+ # @return [String]
71
+ attr_accessor :temp_folder_path
72
+
73
+ # The time limit for HTTP request in seconds.
74
+ # Default to 0 (never times out).
75
+ attr_accessor :timeout
76
+
77
+ # Set this to false to skip client side validation in the operation.
78
+ # Default to true.
79
+ # @return [true, false]
80
+ attr_accessor :client_side_validation
81
+
82
+ ### TLS/SSL setting
83
+ # Set this to false to skip verifying SSL certificate when calling API from https server.
84
+ # Default to true.
85
+ #
86
+ # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
87
+ #
88
+ # @return [true, false]
89
+ attr_accessor :verify_ssl
90
+
91
+ ### TLS/SSL setting
92
+ # Set this to false to skip verifying SSL host name
93
+ # Default to true.
94
+ #
95
+ # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
96
+ #
97
+ # @return [true, false]
98
+ attr_accessor :verify_ssl_host
99
+
100
+ ### TLS/SSL setting
101
+ # Set this to customize the certificate file to verify the peer.
102
+ #
103
+ # @return [String] the path to the certificate file
104
+ #
105
+ # @see The `cainfo` option of Typhoeus, `--cert` option of libcurl. Related source code:
106
+ # https://github.com/typhoeus/typhoeus/blob/master/lib/typhoeus/easy_factory.rb#L145
107
+ attr_accessor :ssl_ca_cert
108
+
109
+ ### TLS/SSL setting
110
+ # Client certificate file (for client certificate)
111
+ attr_accessor :cert_file
112
+
113
+ ### TLS/SSL setting
114
+ # Client private key file (for client certificate)
115
+ attr_accessor :key_file
116
+
117
+ # Set this to customize parameters encoding of array parameter with multi collectionFormat.
118
+ # Default to nil.
119
+ #
120
+ # @see The params_encoding option of Ethon. Related source code:
121
+ # https://github.com/typhoeus/ethon/blob/master/lib/ethon/easy/queryable.rb#L96
122
+ attr_accessor :params_encoding
123
+
124
+ attr_accessor :inject_format
125
+
126
+ attr_accessor :force_ending_format
127
+
128
+ def initialize
129
+ @scheme = 'https'
130
+ @host = 'api.mercadolibre.com'
131
+ @base_path = ''
132
+ @api_key = {}
133
+ @api_key_prefix = {}
134
+ @timeout = 0
135
+ @client_side_validation = true
136
+ @verify_ssl = true
137
+ @verify_ssl_host = true
138
+ @params_encoding = nil
139
+ @cert_file = nil
140
+ @key_file = nil
141
+ @debugging = false
142
+ @inject_format = false
143
+ @force_ending_format = false
144
+ @logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
145
+
146
+ yield(self) if block_given?
147
+ end
148
+
149
+ # The default Configuration object.
150
+ def self.default
151
+ @@default ||= Configuration.new
152
+ end
153
+
154
+ def configure
155
+ yield(self) if block_given?
156
+ end
157
+
158
+ def scheme=(scheme)
159
+ # remove :// from scheme
160
+ @scheme = scheme.sub(/:\/\//, '')
161
+ end
162
+
163
+ def host=(host)
164
+ # remove http(s):// and anything after a slash
165
+ @host = host.sub(/https?:\/\//, '').split('/').first
166
+ end
167
+
168
+ def base_path=(base_path)
169
+ # Add leading and trailing slashes to base_path
170
+ @base_path = "/#{base_path}".gsub(/\/+/, '/')
171
+ @base_path = '' if @base_path == '/'
172
+ end
173
+
174
+ def base_url
175
+ "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '')
176
+ end
177
+
178
+ # Gets API key (with prefix if set).
179
+ # @param [String] param_name the parameter name of API key auth
180
+ def api_key_with_prefix(param_name)
181
+ if @api_key_prefix[param_name]
182
+ "#{@api_key_prefix[param_name]} #{@api_key[param_name]}"
183
+ else
184
+ @api_key[param_name]
185
+ end
186
+ end
187
+
188
+ # Gets Basic Auth token string
189
+ def basic_auth_token
190
+ 'Basic ' + ["#{username}:#{password}"].pack('m').delete("\r\n")
191
+ end
192
+
193
+ # Returns Auth Settings hash for api client.
194
+ def auth_settings
195
+ {
196
+ }
197
+ end
198
+
199
+ # Returns an array of Server setting
200
+ def server_settings
201
+ [
202
+ {
203
+ url: "https://api.mercadolibre.com",
204
+ description: "The Marketplace API Endpoint",
205
+ },
206
+ {
207
+ url: "https://auth.mercadolibre.com.ar",
208
+ description: "Authorization EndPoint for MLA",
209
+ },
210
+ {
211
+ url: "https://auth.mercadolivre.com.br",
212
+ description: "Authorization EndPoint for MLB",
213
+ },
214
+ {
215
+ url: "https://auth.mercadolibre.com.co",
216
+ description: "Authorization EndPoint for MCO",
217
+ },
218
+ {
219
+ url: "https://auth.mercadolibre.com.mx",
220
+ description: "Authorization EndPoint for MLM",
221
+ },
222
+ {
223
+ url: "https://auth.mercadolibre.com.uy",
224
+ description: "Authorization EndPoint for MLU",
225
+ },
226
+ {
227
+ url: "https://auth.mercadolibre.cl",
228
+ description: "Authorization EndPoint for MLC",
229
+ },
230
+ {
231
+ url: "https://auth.mercadolibre.com.cr",
232
+ description: "Authorization EndPoint for MCR",
233
+ },
234
+ {
235
+ url: "https://auth.mercadolibre.com.ec",
236
+ description: "Authorization EndPoint for MEC",
237
+ },
238
+ {
239
+ url: "https://auth.mercadolibre.com.ve",
240
+ description: "Authorization EndPoint for MLV",
241
+ },
242
+ {
243
+ url: "https://auth.mercadolibre.com.pa",
244
+ description: "Authorization EndPoint for MPA",
245
+ },
246
+ {
247
+ url: "https://auth.mercadolibre.com.pe",
248
+ description: "Authorization EndPoint for MLP",
249
+ },
250
+ {
251
+ url: "https://auth.mercadolibre.com.do",
252
+ description: "Authorization EndPoint for MRD",
253
+ },
254
+ {
255
+ url: "https://auth.mercadolibre.com.bo",
256
+ description: "Authorization EndPoint for MBO",
257
+ },
258
+ {
259
+ url: "https://auth.mercadolibre.com.py",
260
+ description: "Authorization EndPoint for MPY",
261
+ }
262
+ ]
263
+ end
264
+
265
+ # Returns URL based on server settings
266
+ #
267
+ # @param index array index of the server settings
268
+ # @param variables hash of variable and the corresponding value
269
+ def server_url(index, variables = {})
270
+ servers = server_settings
271
+
272
+ # check array index out of bound
273
+ if (index < 0 || index >= servers.size)
274
+ fail ArgumentError, "Invalid index #{index} when selecting the server. Must be less than #{servers.size}"
275
+ end
276
+
277
+ server = servers[index]
278
+ url = server[:url]
279
+
280
+ # go through variable and assign a value
281
+ server[:variables].each do |name, variable|
282
+ if variables.key?(name)
283
+ if (server[:variables][name][:enum_values].include? variables[name])
284
+ url.gsub! "{" + name.to_s + "}", variables[name]
285
+ else
286
+ fail ArgumentError, "The variable `#{name}` in the server URL has invalid value #{variables[name]}. Must be #{server[:variables][name][:enum_values]}."
287
+ end
288
+ else
289
+ # use default value
290
+ url.gsub! "{" + name.to_s + "}", server[:variables][name][:default_value]
291
+ end
292
+ end
293
+
294
+ url
295
+ end
296
+ end
297
+ end
@@ -0,0 +1,273 @@
1
+ =begin
2
+ #MELI Markeplace SDK
3
+
4
+ #This is a the codebase to generate a SDK for Open Platform Marketplace
5
+
6
+ The version of the OpenAPI document: 3.0.0
7
+
8
+ Generated by: https://openapi-generator.tech
9
+ OpenAPI Generator version: 4.3.1
10
+
11
+ =end
12
+
13
+ require 'date'
14
+
15
+ module Meli
16
+ class Attributes
17
+ attr_accessor :id
18
+
19
+ attr_accessor :name
20
+
21
+ attr_accessor :value_id
22
+
23
+ attr_accessor :value_name
24
+
25
+ attr_accessor :value_struct
26
+
27
+ attr_accessor :values
28
+
29
+ attr_accessor :attribute_group_id
30
+
31
+ attr_accessor :attribute_group_name
32
+
33
+ # Attribute mapping from ruby-style variable name to JSON key.
34
+ def self.attribute_map
35
+ {
36
+ :'id' => :'id',
37
+ :'name' => :'name',
38
+ :'value_id' => :'value_id',
39
+ :'value_name' => :'value_name',
40
+ :'value_struct' => :'value_struct',
41
+ :'values' => :'values',
42
+ :'attribute_group_id' => :'attribute_group_id',
43
+ :'attribute_group_name' => :'attribute_group_name'
44
+ }
45
+ end
46
+
47
+ # Attribute type mapping.
48
+ def self.openapi_types
49
+ {
50
+ :'id' => :'String',
51
+ :'name' => :'String',
52
+ :'value_id' => :'String',
53
+ :'value_name' => :'String',
54
+ :'value_struct' => :'AttributesValueStruct',
55
+ :'values' => :'Array<AttributesValues>',
56
+ :'attribute_group_id' => :'String',
57
+ :'attribute_group_name' => :'String'
58
+ }
59
+ end
60
+
61
+ # List of attributes with nullable: true
62
+ def self.openapi_nullable
63
+ Set.new([
64
+ :'value_id',
65
+ :'value_struct',
66
+ ])
67
+ end
68
+
69
+ # Initializes the object
70
+ # @param [Hash] attributes Model attributes in the form of hash
71
+ def initialize(attributes = {})
72
+ if (!attributes.is_a?(Hash))
73
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Meli::Attributes` initialize method"
74
+ end
75
+
76
+ # check to see if the attribute exists and convert string to symbol for hash key
77
+ attributes = attributes.each_with_object({}) { |(k, v), h|
78
+ if (!self.class.attribute_map.key?(k.to_sym))
79
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Meli::Attributes`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
80
+ end
81
+ h[k.to_sym] = v
82
+ }
83
+
84
+ if attributes.key?(:'id')
85
+ self.id = attributes[:'id']
86
+ end
87
+
88
+ if attributes.key?(:'name')
89
+ self.name = attributes[:'name']
90
+ end
91
+
92
+ if attributes.key?(:'value_id')
93
+ self.value_id = attributes[:'value_id']
94
+ end
95
+
96
+ if attributes.key?(:'value_name')
97
+ self.value_name = attributes[:'value_name']
98
+ end
99
+
100
+ if attributes.key?(:'value_struct')
101
+ self.value_struct = attributes[:'value_struct']
102
+ end
103
+
104
+ if attributes.key?(:'values')
105
+ if (value = attributes[:'values']).is_a?(Array)
106
+ self.values = value
107
+ end
108
+ end
109
+
110
+ if attributes.key?(:'attribute_group_id')
111
+ self.attribute_group_id = attributes[:'attribute_group_id']
112
+ end
113
+
114
+ if attributes.key?(:'attribute_group_name')
115
+ self.attribute_group_name = attributes[:'attribute_group_name']
116
+ end
117
+ end
118
+
119
+ # Show invalid properties with the reasons. Usually used together with valid?
120
+ # @return Array for valid properties with the reasons
121
+ def list_invalid_properties
122
+ invalid_properties = Array.new
123
+ invalid_properties
124
+ end
125
+
126
+ # Check to see if the all the properties in the model are valid
127
+ # @return true if the model is valid
128
+ def valid?
129
+ true
130
+ end
131
+
132
+ # Checks equality by comparing each attribute.
133
+ # @param [Object] Object to be compared
134
+ def ==(o)
135
+ return true if self.equal?(o)
136
+ self.class == o.class &&
137
+ id == o.id &&
138
+ name == o.name &&
139
+ value_id == o.value_id &&
140
+ value_name == o.value_name &&
141
+ value_struct == o.value_struct &&
142
+ values == o.values &&
143
+ attribute_group_id == o.attribute_group_id &&
144
+ attribute_group_name == o.attribute_group_name
145
+ end
146
+
147
+ # @see the `==` method
148
+ # @param [Object] Object to be compared
149
+ def eql?(o)
150
+ self == o
151
+ end
152
+
153
+ # Calculates hash code according to all attributes.
154
+ # @return [Integer] Hash code
155
+ def hash
156
+ [id, name, value_id, value_name, value_struct, values, attribute_group_id, attribute_group_name].hash
157
+ end
158
+
159
+ # Builds the object from hash
160
+ # @param [Hash] attributes Model attributes in the form of hash
161
+ # @return [Object] Returns the model itself
162
+ def self.build_from_hash(attributes)
163
+ new.build_from_hash(attributes)
164
+ end
165
+
166
+ # Builds the object from hash
167
+ # @param [Hash] attributes Model attributes in the form of hash
168
+ # @return [Object] Returns the model itself
169
+ def build_from_hash(attributes)
170
+ return nil unless attributes.is_a?(Hash)
171
+ self.class.openapi_types.each_pair do |key, type|
172
+ if type =~ /\AArray<(.*)>/i
173
+ # check to ensure the input is an array given that the attribute
174
+ # is documented as an array but the input is not
175
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
176
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
177
+ end
178
+ elsif !attributes[self.class.attribute_map[key]].nil?
179
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
180
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
181
+ end
182
+
183
+ self
184
+ end
185
+
186
+ # Deserializes the data based on type
187
+ # @param string type Data type
188
+ # @param string value Value to be deserialized
189
+ # @return [Object] Deserialized data
190
+ def _deserialize(type, value)
191
+ case type.to_sym
192
+ when :DateTime
193
+ DateTime.parse(value)
194
+ when :Date
195
+ Date.parse(value)
196
+ when :String
197
+ value.to_s
198
+ when :Integer
199
+ value.to_i
200
+ when :Float
201
+ value.to_f
202
+ when :Boolean
203
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
204
+ true
205
+ else
206
+ false
207
+ end
208
+ when :Object
209
+ # generic object (usually a Hash), return directly
210
+ value
211
+ when /\AArray<(?<inner_type>.+)>\z/
212
+ inner_type = Regexp.last_match[:inner_type]
213
+ value.map { |v| _deserialize(inner_type, v) }
214
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
215
+ k_type = Regexp.last_match[:k_type]
216
+ v_type = Regexp.last_match[:v_type]
217
+ {}.tap do |hash|
218
+ value.each do |k, v|
219
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
220
+ end
221
+ end
222
+ else # model
223
+ Meli.const_get(type).build_from_hash(value)
224
+ end
225
+ end
226
+
227
+ # Returns the string representation of the object
228
+ # @return [String] String presentation of the object
229
+ def to_s
230
+ to_hash.to_s
231
+ end
232
+
233
+ # to_body is an alias to to_hash (backward compatibility)
234
+ # @return [Hash] Returns the object in the form of hash
235
+ def to_body
236
+ to_hash
237
+ end
238
+
239
+ # Returns the object in the form of hash
240
+ # @return [Hash] Returns the object in the form of hash
241
+ def to_hash
242
+ hash = {}
243
+ self.class.attribute_map.each_pair do |attr, param|
244
+ value = self.send(attr)
245
+ if value.nil?
246
+ is_nullable = self.class.openapi_nullable.include?(attr)
247
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
248
+ end
249
+
250
+ hash[param] = _to_hash(value)
251
+ end
252
+ hash
253
+ end
254
+
255
+ # Outputs non-array value in the form of hash
256
+ # For object, use to_hash. Otherwise, just return the value
257
+ # @param [Object] value Any valid value
258
+ # @return [Hash] Returns the value in the form of hash
259
+ def _to_hash(value)
260
+ if value.is_a?(Array)
261
+ value.compact.map { |v| _to_hash(v) }
262
+ elsif value.is_a?(Hash)
263
+ {}.tap do |hash|
264
+ value.each { |k, v| hash[k] = _to_hash(v) }
265
+ end
266
+ elsif value.respond_to? :to_hash
267
+ value.to_hash
268
+ else
269
+ value
270
+ end
271
+ end
272
+ end
273
+ end