ecoportal-api 0.9.8 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.markdownlint.json +4 -0
- data/.rubocop.yml +1 -1
- data/.ruby-version +1 -0
- data/CHANGELOG.md +218 -174
- data/ecoportal-api.gemspec +7 -7
- data/lib/ecoportal/api/common/base_model.rb +36 -25
- data/lib/ecoportal/api/common/batch_operation.rb +18 -15
- data/lib/ecoportal/api/common/batch_response.rb +2 -5
- data/lib/ecoportal/api/common/client.rb +31 -18
- data/lib/ecoportal/api/common/response.rb +1 -1
- data/lib/ecoportal/api/common/wrapped_response.rb +14 -19
- data/lib/ecoportal/api/internal/account.rb +11 -10
- data/lib/ecoportal/api/internal.rb +5 -5
- data/lib/ecoportal/api/logger.rb +11 -9
- data/lib/ecoportal/api/v1/people.rb +59 -21
- data/lib/ecoportal/api/v1/person.rb +16 -13
- data/lib/ecoportal/api/v1/person_details.rb +10 -9
- data/lib/ecoportal/api/v1/person_schema.rb +1 -1
- data/lib/ecoportal/api/v1/person_schemas.rb +0 -2
- data/lib/ecoportal/api/v1/schema_field.rb +4 -5
- data/lib/ecoportal/api/v1/schema_field_value.rb +23 -24
- data/lib/ecoportal/api/v1.rb +4 -3
- data/lib/ecoportal/api/version.rb +1 -1
- metadata +23 -46
@@ -1,13 +1,14 @@
|
|
1
1
|
module Ecoportal
|
2
2
|
module API
|
3
3
|
class V1
|
4
|
-
# @attr_reader client [Common::Client] a `Common::Client` object that
|
4
|
+
# @attr_reader client [Common::Client] a `Common::Client` object that
|
5
|
+
# holds the configuration of the api connection.
|
5
6
|
class People
|
6
7
|
extend Common::BaseClass
|
7
|
-
include Enumerable
|
8
8
|
include Common::DocHelpers
|
9
|
+
include Enumerable
|
9
10
|
|
10
|
-
JOB_TIMEOUT
|
11
|
+
JOB_TIMEOUT = 240
|
11
12
|
DELAY_STATUS_CHECK = 5
|
12
13
|
|
13
14
|
class_resolver :person_class, "Ecoportal::API::V1::Person"
|
@@ -30,35 +31,49 @@ module Ecoportal
|
|
30
31
|
# @param silent [Boolean] `false` to show percentage of progress.
|
31
32
|
# @yield [person] does some stuff with the person.
|
32
33
|
# @yieldparam person [Person]
|
33
|
-
def each(params: {}, silent: false
|
34
|
-
return to_enum(:each, params: params, silent: silent) unless
|
35
|
-
|
34
|
+
def each(params: {}, silent: false) # rubocop:disable Metrics/AbcSize
|
35
|
+
return to_enum(:each, params: params, silent: silent) unless block_given?
|
36
|
+
|
37
|
+
cursor_id = nil
|
38
|
+
results = 0
|
39
|
+
|
36
40
|
puts "\n" unless silent
|
41
|
+
|
37
42
|
loop do
|
38
43
|
params.update(cursor_id: cursor_id) if cursor_id
|
39
|
-
|
44
|
+
|
45
|
+
body = nil
|
46
|
+
response = nil
|
47
|
+
count = 5
|
48
|
+
|
40
49
|
loop do
|
41
50
|
response = client.get("/people", params: params)
|
42
51
|
body = response && body_data(response.body)
|
43
52
|
break if response.success? || count <= 0
|
53
|
+
|
44
54
|
puts "Request failed - Status #{response.status}: #{body}"
|
45
55
|
count -= 1
|
56
|
+
|
46
57
|
sleep(0.5)
|
47
58
|
end
|
59
|
+
|
48
60
|
raise "Request failed - Status #{response.status}: #{body}" unless response.success?
|
49
61
|
|
50
|
-
unless silent || (total = body["total_results"])
|
62
|
+
unless silent || (total = body["total_results"])&.zero?
|
51
63
|
results += body["results"].length
|
52
64
|
percent = results * 100 / total
|
65
|
+
|
53
66
|
msg = "People GET"
|
54
|
-
msg
|
55
|
-
|
67
|
+
msg << " (search=#{params[:q]})" if params.key?(:q)
|
68
|
+
|
69
|
+
print "#{msg}: #{percent.round}% (of #{total}): #{results}\r"
|
56
70
|
$stdout.flush
|
57
71
|
end
|
58
72
|
|
59
73
|
body["results"].each do |person|
|
60
74
|
yield person_class.new(person)
|
61
75
|
end
|
76
|
+
|
62
77
|
break unless (cursor_id = body["cursor_id"])
|
63
78
|
end
|
64
79
|
self
|
@@ -81,9 +96,10 @@ module Ecoportal
|
|
81
96
|
# @return [Person] the person with `id` (internal or external) contained in `doc`.
|
82
97
|
def get(doc)
|
83
98
|
id = get_id(doc)
|
84
|
-
response = client.get("/people
|
99
|
+
response = client.get("/people/#{CGI.escape(id)}")
|
85
100
|
body = body_data(response.body)
|
86
101
|
return person_class.new(body) if response.success?
|
102
|
+
|
87
103
|
raise "Could not get person #{id} - Error #{response.status}: #{body}"
|
88
104
|
end
|
89
105
|
|
@@ -93,7 +109,7 @@ module Ecoportal
|
|
93
109
|
def update(doc)
|
94
110
|
body = get_body(doc)
|
95
111
|
id = get_id(doc)
|
96
|
-
client.patch("/people
|
112
|
+
client.patch("/people/#{CGI.escape(id)}", data: body)
|
97
113
|
end
|
98
114
|
|
99
115
|
# Requests to create a person via api.
|
@@ -110,7 +126,7 @@ module Ecoportal
|
|
110
126
|
def upsert(doc)
|
111
127
|
body = get_body(doc)
|
112
128
|
id = get_id(doc)
|
113
|
-
client.post("/people
|
129
|
+
client.post("/people/#{CGI.escape(id)}", data: body)
|
114
130
|
end
|
115
131
|
|
116
132
|
# Requests to completelly remove from an organization an existing person via api.
|
@@ -118,7 +134,7 @@ module Ecoportal
|
|
118
134
|
# @return [Response] an object with the api response.
|
119
135
|
def delete(doc)
|
120
136
|
id = get_id(doc)
|
121
|
-
client.delete("/people
|
137
|
+
client.delete("/people/#{CGI.escape(id)}")
|
122
138
|
end
|
123
139
|
|
124
140
|
# Creates a `BatchOperation` and yields it to the given bock.
|
@@ -128,8 +144,15 @@ module Ecoportal
|
|
128
144
|
# @return [Ecoportal::API::Common::Response] the results of the batch
|
129
145
|
def batch(job_mode: true, &block)
|
130
146
|
return job(&block) if job_mode
|
131
|
-
|
147
|
+
|
148
|
+
operation = Common::BatchOperation.new(
|
149
|
+
"/people",
|
150
|
+
person_class,
|
151
|
+
logger: client.logger
|
152
|
+
)
|
153
|
+
|
132
154
|
yield operation
|
155
|
+
|
133
156
|
# The batch operation is responsible for logging the output
|
134
157
|
client.post("/people/batch", data: operation.as_json).tap do |response|
|
135
158
|
operation.process_response(response)
|
@@ -138,16 +161,25 @@ module Ecoportal
|
|
138
161
|
|
139
162
|
# @return [Ecoportal::API::Common::Response] the results of the batch job
|
140
163
|
def job
|
141
|
-
operation = Common::BatchOperation.new(
|
164
|
+
operation = Common::BatchOperation.new(
|
165
|
+
"/people",
|
166
|
+
person_class,
|
167
|
+
logger: client.logger
|
168
|
+
)
|
169
|
+
|
142
170
|
yield operation
|
171
|
+
|
143
172
|
job_id = create_job(operation)
|
144
173
|
status = wait_for_job_completion(job_id)
|
145
174
|
|
146
175
|
if status&.complete?
|
147
176
|
job_result(job_id, operation)
|
148
177
|
else
|
149
|
-
msg
|
150
|
-
|
178
|
+
msg = "Job `#{job_id}` not complete. "
|
179
|
+
msg << "Probably timeout after #{JOB_TIMEOUT} seconds. "
|
180
|
+
msg << "Current status: #{status}"
|
181
|
+
|
182
|
+
raise API::Errors::TimeOut, msg
|
151
183
|
end
|
152
184
|
end
|
153
185
|
|
@@ -160,10 +192,15 @@ module Ecoportal
|
|
160
192
|
private
|
161
193
|
|
162
194
|
JobStatus = Struct.new(:id, :complete?, :errored?, :progress)
|
195
|
+
|
163
196
|
def job_status(job_id)
|
164
197
|
response = client.get("/people/job/#{CGI.escape(job_id)}/status")
|
165
198
|
body = response && body_data(response.body)
|
166
|
-
|
199
|
+
|
200
|
+
msg = "Status error (#{response.status}) - "
|
201
|
+
msg << "Errors: #{body}"
|
202
|
+
raise msg unless response.success?
|
203
|
+
|
167
204
|
JobStatus.new(
|
168
205
|
body["id"],
|
169
206
|
body["complete"],
|
@@ -183,10 +220,12 @@ module Ecoportal
|
|
183
220
|
# timeout library is evil. So we make poor-man timeout.
|
184
221
|
# https://jvns.ca/blog/2015/11/27/why-rubys-timeout-is-dangerous-and-thread-dot-raise-is-terrifying/
|
185
222
|
before = Time.now
|
186
|
-
|
223
|
+
|
224
|
+
loop do
|
187
225
|
status = job_status(job_id)
|
188
226
|
break status if status.complete?
|
189
227
|
break status if Time.now >= before + JOB_TIMEOUT
|
228
|
+
|
190
229
|
sleep(DELAY_STATUS_CHECK)
|
191
230
|
status
|
192
231
|
end
|
@@ -207,7 +246,6 @@ module Ecoportal
|
|
207
246
|
def body_data(body)
|
208
247
|
body
|
209
248
|
end
|
210
|
-
|
211
249
|
end
|
212
250
|
end
|
213
251
|
end
|
@@ -9,14 +9,16 @@ module Ecoportal
|
|
9
9
|
# @attr details [PersonDetails, nil] the details of the person or `nil` if missing.
|
10
10
|
class Person < Common::BaseModel
|
11
11
|
passthrough :id, :external_id, :name, :email, :filter_tags
|
12
|
+
passthrough :archived
|
12
13
|
passthrough :supervisor_id, :contractor_organization_id
|
14
|
+
passthrough :brand_id
|
13
15
|
passthrough :freemium
|
14
16
|
|
15
17
|
class_resolver :person_schema_class, "Ecoportal::API::V1::PersonSchema"
|
16
18
|
class_resolver :person_details_class, "Ecoportal::API::V1::PersonDetails"
|
17
19
|
embeds_one :details, nullable: true, klass: :person_details_class
|
18
20
|
|
19
|
-
VALID_TAG_REGEX
|
21
|
+
VALID_TAG_REGEX = /^[A-Za-z0-9 &_'\/.-]+$/
|
20
22
|
VALID_EMAIL_REGEX = /^[^@\s]+@[^@\s]+\.[^@\s]+$/
|
21
23
|
|
22
24
|
# Gets the supervisor (`Person`) of this person, with given his `supervisor_id`.
|
@@ -47,9 +49,8 @@ module Ecoportal
|
|
47
49
|
# Sets the email of a person.
|
48
50
|
# @param value [String, nil] the email of this person.
|
49
51
|
def email=(value)
|
50
|
-
|
51
|
-
|
52
|
-
end
|
52
|
+
raise "Invalid email #{value.inspect}" if value && !value.match(VALID_EMAIL_REGEX)
|
53
|
+
|
53
54
|
doc["email"] = value&.downcase
|
54
55
|
end
|
55
56
|
|
@@ -58,15 +59,16 @@ module Ecoportal
|
|
58
59
|
# @raise [Exception] if there was any invalid string tag.
|
59
60
|
# @param value [Array<String>] array of tags.
|
60
61
|
def filter_tags=(value)
|
61
|
-
|
62
|
-
|
63
|
-
|
62
|
+
msg = "filter_tags= needs to be passed an Array, got #{value.class}"
|
63
|
+
raise ArgumentError, msg unless value.is_a?(Array)
|
64
|
+
|
64
65
|
end_tags = value.compact.map do |tag|
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
msg = "Invalid filter tag #{tag.inspect}"
|
67
|
+
raise ArgumentError, msg unless tag.match(VALID_TAG_REGEX)
|
68
|
+
|
68
69
|
tag.upcase
|
69
70
|
end
|
71
|
+
|
70
72
|
set_uniq_array_keep_order("filter_tags", end_tags)
|
71
73
|
end
|
72
74
|
|
@@ -105,8 +107,10 @@ module Ecoportal
|
|
105
107
|
end
|
106
108
|
|
107
109
|
# Sets the PersonDetails to the person, depending on the parameter received:
|
108
|
-
# - `PersonSchema`: initializes the `PersonDetails` as per the schema specified
|
109
|
-
#
|
110
|
+
# - `PersonSchema`: initializes the `PersonDetails` as per the schema specified
|
111
|
+
# (`schema_id` and `fields`).
|
112
|
+
# - `String`: it just sets the `schema_id` on the `PersonDetails`
|
113
|
+
# (as `fields` is not include, `details[key]=` will throw error).
|
110
114
|
# (see #details=)
|
111
115
|
# @note
|
112
116
|
# - this method alone only sets the internal structure of the details.
|
@@ -130,7 +134,6 @@ module Ecoportal
|
|
130
134
|
}
|
131
135
|
end
|
132
136
|
end
|
133
|
-
|
134
137
|
end
|
135
138
|
end
|
136
139
|
end
|
@@ -40,7 +40,8 @@ module Ecoportal
|
|
40
40
|
|
41
41
|
# Gets the value of one specific field of the PersonDetails.
|
42
42
|
# @param id [String] the `id` or the `alt_id` of the target field.
|
43
|
-
# @return [String, Array<String>, Boolean, Array<Boolean>, Date, Array<Date>, Numberic, Array<Numeric>]
|
43
|
+
# @return [String, Array<String>, Boolean, Array<Boolean>, Date, Array<Date>, Numberic, Array<Numeric>]
|
44
|
+
# the value of field or `nil` if missing.
|
44
45
|
def [](id)
|
45
46
|
get_field(id)&.value
|
46
47
|
end
|
@@ -50,11 +51,10 @@ module Ecoportal
|
|
50
51
|
# @param id [String] the `id` or the `alt_id` of the target field.
|
51
52
|
# @return [void]
|
52
53
|
def []=(id, value)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
54
|
+
msg = "details[#{id.inspect}] is missing. Did you forget to load the schema?"
|
55
|
+
raise MissingId, msg unless (field = get_field(id))
|
56
|
+
|
57
|
+
field.value = value
|
58
58
|
end
|
59
59
|
|
60
60
|
# Checks if an `id` or `alt_id` exists
|
@@ -67,12 +67,14 @@ module Ecoportal
|
|
67
67
|
|
68
68
|
# @return [Boolean] `true` if `id` exists and `value` has changed, `false` otherwise
|
69
69
|
def changed?(id, doc = :original)
|
70
|
-
return false unless field = get_field(id)
|
70
|
+
return false unless (field = get_field(id))
|
71
|
+
|
71
72
|
field.as_update.key?("value")
|
72
73
|
end
|
73
74
|
|
74
75
|
def original_value(id)
|
75
|
-
return nil unless field = get_field(id)
|
76
|
+
return nil unless (field = get_field(id))
|
77
|
+
|
76
78
|
field.original_doc["value"]
|
77
79
|
end
|
78
80
|
|
@@ -87,7 +89,6 @@ module Ecoportal
|
|
87
89
|
@fields_by_alt_id[wrapped.alt_id] = wrapped
|
88
90
|
end
|
89
91
|
end
|
90
|
-
|
91
92
|
end
|
92
93
|
end
|
93
94
|
end
|
@@ -30,6 +30,7 @@ module Ecoportal
|
|
30
30
|
def index_fields
|
31
31
|
@fields_by_id = {}
|
32
32
|
@fields_by_alt_id = {}
|
33
|
+
|
33
34
|
doc["fields"].each do |field|
|
34
35
|
wrapped = schema_field_class.new(field)
|
35
36
|
@fields_by_id[wrapped.id] = wrapped
|
@@ -45,7 +46,6 @@ module Ecoportal
|
|
45
46
|
)
|
46
47
|
end
|
47
48
|
end
|
48
|
-
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -22,11 +22,10 @@ module Ecoportal
|
|
22
22
|
Date.parse(line) rescue return nil, false
|
23
23
|
end
|
24
24
|
end.compact
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
25
|
+
|
26
|
+
out = values
|
27
|
+
out = values.first unless multiple
|
28
|
+
[out, true]
|
30
29
|
end
|
31
30
|
end
|
32
31
|
end
|
@@ -6,29 +6,27 @@ module Ecoportal
|
|
6
6
|
passthrough :id, :alt_id, :type, :name, :shared, :multiple
|
7
7
|
|
8
8
|
def clear
|
9
|
-
if multiple
|
10
|
-
|
11
|
-
|
12
|
-
doc["value"] = nil
|
13
|
-
end
|
9
|
+
return doc["value"] = [] if multiple
|
10
|
+
|
11
|
+
doc["value"] = nil
|
14
12
|
end
|
15
13
|
|
16
14
|
def value
|
17
15
|
case type
|
18
16
|
when "text", "phone_number", "number", "boolean", "select"
|
19
|
-
|
17
|
+
doc["value"]
|
20
18
|
when "date"
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
if doc["value"]
|
20
|
+
maybe_multiple(doc["value"]) do |v|
|
21
|
+
Date.iso8601(v)
|
22
|
+
end
|
23
|
+
end
|
26
24
|
else
|
27
|
-
|
25
|
+
raise "Unknown type #{type}"
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
|
-
def value=(value)
|
29
|
+
def value=(value) # rubocop:disable Metrics/AbcSize
|
32
30
|
case type
|
33
31
|
when "text", "phone_number", "select"
|
34
32
|
doc["value"] = maybe_multiple(value) do |v|
|
@@ -36,19 +34,21 @@ module Ecoportal
|
|
36
34
|
end
|
37
35
|
when "number"
|
38
36
|
maybe_multiple(value) do |v|
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
next if v.nil? || v.is_a?(Numeric)
|
38
|
+
|
39
|
+
raise "Invalid number type #{v.class}"
|
42
40
|
end
|
41
|
+
|
43
42
|
doc["value"] = value
|
44
43
|
when "boolean"
|
45
44
|
doc["value"] = !!value
|
46
45
|
when "date"
|
47
46
|
maybe_multiple(value) do |v|
|
48
|
-
|
49
|
-
|
50
|
-
|
47
|
+
next if v.nil? || v.respond_to?(:to_date)
|
48
|
+
|
49
|
+
raise "Invalid date type #{v.class}"
|
51
50
|
end
|
51
|
+
|
52
52
|
doc["value"] = maybe_multiple(value) do |v|
|
53
53
|
v&.to_date&.to_s
|
54
54
|
end
|
@@ -57,12 +57,11 @@ module Ecoportal
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
def maybe_multiple(value)
|
60
|
+
def maybe_multiple(value, &block)
|
61
61
|
if multiple
|
62
|
-
unless value.is_a?(Array)
|
63
|
-
|
64
|
-
|
65
|
-
value.map {|v| yield v }
|
62
|
+
raise "Expected Array, got #{value.class}" unless value.is_a?(Array)
|
63
|
+
|
64
|
+
value.map(&block)
|
66
65
|
else
|
67
66
|
yield value
|
68
67
|
end
|
data/lib/ecoportal/api/v1.rb
CHANGED
@@ -6,9 +6,10 @@ module Ecoportal
|
|
6
6
|
extend Common::BaseClass
|
7
7
|
include Common::Logging
|
8
8
|
|
9
|
-
VERSION = "v1"
|
10
|
-
|
11
|
-
class_resolver :
|
9
|
+
VERSION = "v1".freeze
|
10
|
+
|
11
|
+
class_resolver :people_class, "Ecoportal::API::V1::People"
|
12
|
+
class_resolver :person_schemas_class, "Ecoportal::API::V1::PersonSchemas"
|
12
13
|
|
13
14
|
attr_reader :client, :logger
|
14
15
|
|
metadata
CHANGED
@@ -1,35 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ecoportal-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tapio Saarinen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 2.4.12
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '3'
|
23
|
-
type: :development
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 2.4.12
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '3'
|
33
13
|
- !ruby/object:Gem::Dependency
|
34
14
|
name: rspec
|
35
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,65 +105,59 @@ dependencies:
|
|
125
105
|
- !ruby/object:Gem::Version
|
126
106
|
version: '0.14'
|
127
107
|
- !ruby/object:Gem::Dependency
|
128
|
-
name:
|
108
|
+
name: dotenv
|
129
109
|
requirement: !ruby/object:Gem::Requirement
|
130
110
|
requirements:
|
131
111
|
- - "~>"
|
132
112
|
- !ruby/object:Gem::Version
|
133
|
-
version: '
|
134
|
-
- - "<"
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
version: '6'
|
113
|
+
version: '3'
|
137
114
|
type: :runtime
|
138
115
|
prerelease: false
|
139
116
|
version_requirements: !ruby/object:Gem::Requirement
|
140
117
|
requirements:
|
141
118
|
- - "~>"
|
142
119
|
- !ruby/object:Gem::Version
|
143
|
-
version: '
|
144
|
-
- - "<"
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
version: '6'
|
120
|
+
version: '3'
|
147
121
|
- !ruby/object:Gem::Dependency
|
148
|
-
name:
|
122
|
+
name: elastic-apm
|
149
123
|
requirement: !ruby/object:Gem::Requirement
|
150
124
|
requirements:
|
151
125
|
- - ">="
|
152
126
|
- !ruby/object:Gem::Version
|
153
|
-
version: '
|
127
|
+
version: '4.7'
|
154
128
|
- - "<"
|
155
129
|
- !ruby/object:Gem::Version
|
156
|
-
version: '
|
130
|
+
version: '5'
|
157
131
|
type: :runtime
|
158
132
|
prerelease: false
|
159
133
|
version_requirements: !ruby/object:Gem::Requirement
|
160
134
|
requirements:
|
161
135
|
- - ">="
|
162
136
|
- !ruby/object:Gem::Version
|
163
|
-
version: '
|
137
|
+
version: '4.7'
|
164
138
|
- - "<"
|
165
139
|
- !ruby/object:Gem::Version
|
166
|
-
version: '
|
140
|
+
version: '5'
|
167
141
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
142
|
+
name: http
|
169
143
|
requirement: !ruby/object:Gem::Requirement
|
170
144
|
requirements:
|
171
|
-
- - "
|
145
|
+
- - "~>"
|
172
146
|
- !ruby/object:Gem::Version
|
173
|
-
version: '
|
147
|
+
version: '5.1'
|
174
148
|
- - "<"
|
175
149
|
- !ruby/object:Gem::Version
|
176
|
-
version: '
|
150
|
+
version: '6'
|
177
151
|
type: :runtime
|
178
152
|
prerelease: false
|
179
153
|
version_requirements: !ruby/object:Gem::Requirement
|
180
154
|
requirements:
|
181
|
-
- - "
|
155
|
+
- - "~>"
|
182
156
|
- !ruby/object:Gem::Version
|
183
|
-
version: '
|
157
|
+
version: '5.1'
|
184
158
|
- - "<"
|
185
159
|
- !ruby/object:Gem::Version
|
186
|
-
version: '
|
160
|
+
version: '6'
|
187
161
|
description:
|
188
162
|
email:
|
189
163
|
- tapio@ecoportal.co.nz
|
@@ -195,8 +169,10 @@ extensions: []
|
|
195
169
|
extra_rdoc_files: []
|
196
170
|
files:
|
197
171
|
- ".gitignore"
|
172
|
+
- ".markdownlint.json"
|
198
173
|
- ".rspec"
|
199
174
|
- ".rubocop.yml"
|
175
|
+
- ".ruby-version"
|
200
176
|
- ".yardopts"
|
201
177
|
- CHANGELOG.md
|
202
178
|
- Gemfile
|
@@ -250,7 +226,8 @@ files:
|
|
250
226
|
homepage: https://www.ecoportal.com
|
251
227
|
licenses:
|
252
228
|
- MIT
|
253
|
-
metadata:
|
229
|
+
metadata:
|
230
|
+
rubygems_mfa_required: 'true'
|
254
231
|
post_install_message:
|
255
232
|
rdoc_options: []
|
256
233
|
require_paths:
|
@@ -259,14 +236,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
259
236
|
requirements:
|
260
237
|
- - ">="
|
261
238
|
- !ruby/object:Gem::Version
|
262
|
-
version: 2.
|
239
|
+
version: 3.2.2
|
263
240
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
264
241
|
requirements:
|
265
242
|
- - ">="
|
266
243
|
- !ruby/object:Gem::Version
|
267
244
|
version: '0'
|
268
245
|
requirements: []
|
269
|
-
rubygems_version: 3.
|
246
|
+
rubygems_version: 3.5.6
|
270
247
|
signing_key:
|
271
248
|
specification_version: 4
|
272
249
|
summary: A collection of helpers for interacting with the ecoPortal MS's various APIs
|