ecoportal-api 0.10.1 → 0.10.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -0
- data/CHANGELOG.md +22 -6
- data/ecoportal-api.gemspec +19 -10
- data/lib/ecoportal/api/common/batch_operation.rb +4 -0
- data/lib/ecoportal/api/common/doc_helpers.rb +1 -1
- data/lib/ecoportal/api/common/time_out.rb +26 -0
- data/lib/ecoportal/api/common.rb +1 -0
- data/lib/ecoportal/api/v1/job_status.rb +33 -0
- data/lib/ecoportal/api/v1/people.rb +26 -18
- data/lib/ecoportal/api/v1.rb +1 -0
- data/lib/ecoportal/api/version.rb +1 -1
- metadata +51 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cc0547ca88715ad6b0f2d3bc7ed4661bab0f9259117ce28aa5d43aab0761d02
|
4
|
+
data.tar.gz: 1e109b427a0e71bd91edf1d4e9ce6e7cf9ac2df998662c97746df30b8e07998b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44eba3743e30beff3c04e71b1191900b8477d81af1371f1a5003cb6847384e384d535e51390e4f8db39e8aa81a0cbf7fc200a87ac18036c45e56530b72b09342
|
7
|
+
data.tar.gz: 1749045310b0748e8935027cd0d1b9d69e7a84c4534b27017bd1581848d579c6359e59dedfe19e3cbe451038e2a4c70fb82150a01ca4c9260eadde64bfac5a92
|
data/.rubocop.yml
CHANGED
@@ -30,6 +30,11 @@ Style/ConditionalAssignment:
|
|
30
30
|
Style/BlockDelimiters:
|
31
31
|
BracesRequiredMethods: ['log']
|
32
32
|
AllowedPatterns: ['proc', 'new']
|
33
|
+
Style/HashSyntax:
|
34
|
+
EnforcedShorthandSyntax: either
|
35
|
+
EnforcedStyle: no_mixed_keys
|
36
|
+
Style/ArgumentsForwarding:
|
37
|
+
UseAnonymousForwarding: false
|
33
38
|
Style/ClassAndModuleChildren:
|
34
39
|
Enabled: false
|
35
40
|
Style/FrozenStringLiteralComment:
|
@@ -93,3 +98,5 @@ Naming/MethodParameterName:
|
|
93
98
|
AllowedNames: ['x', 'y', 'i', 'j', 'id', 'io', 'to']
|
94
99
|
Naming/RescuedExceptionsVariableName:
|
95
100
|
Enabled: false
|
101
|
+
Naming/BlockForwarding:
|
102
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -2,19 +2,37 @@
|
|
2
2
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
|
5
|
+
## [0.10.3] - 2024-09-xx
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
## [0.10.2] - 2024-09-27
|
14
|
+
|
15
|
+
### Added
|
16
|
+
|
17
|
+
- `Ecoportal::API::Common::TimeOut` to calculate adaptive time outs.
|
18
|
+
|
19
|
+
### Changed
|
20
|
+
|
21
|
+
- `Ecoportal::API::V1::Person#job`
|
22
|
+
- added **adaptative await**
|
23
|
+
- evaluate `true` to `complete?` if `progress` is that of total count.
|
24
|
+
|
5
25
|
## [0.10.1] - 2024-08-01
|
6
26
|
|
7
27
|
### Added
|
8
28
|
|
9
|
-
- `Ecoportal::V1::Person#brand_id`
|
10
|
-
- `Ecoportal::V1::Person#archived`
|
29
|
+
- `Ecoportal::API::V1::Person#brand_id`
|
30
|
+
- `Ecoportal::API::V1::Person#archived`
|
11
31
|
|
12
32
|
### Changed
|
13
33
|
|
14
34
|
- require `ruby 3`
|
15
35
|
|
16
|
-
### Fixed
|
17
|
-
|
18
36
|
## [0.9.8] - 2024-05-15
|
19
37
|
|
20
38
|
### Added
|
@@ -344,5 +362,3 @@ All notable changes to this project will be documented in this file.
|
|
344
362
|
|
345
363
|
- this `CHANGELOG.md` file
|
346
364
|
- person model: `freemium` core property
|
347
|
-
|
348
|
-
|
data/ecoportal-api.gemspec
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
+
# rubocop:disable Gemspec/DevelopmentDependencies
|
1
2
|
lib = File.expand_path('lib', __dir__)
|
2
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
|
4
|
+
|
5
|
+
require 'ecoportal/api/version'
|
4
6
|
|
5
7
|
Gem::Specification.new do |spec|
|
6
8
|
spec.name = "ecoportal-api"
|
7
9
|
spec.version = Ecoportal::API::VERSION
|
8
|
-
spec.authors = [
|
9
|
-
spec.email = [
|
10
|
+
spec.authors = ['Tapio Saarinen']
|
11
|
+
spec.email = [
|
12
|
+
'tapio@ecoportal.co.nz',
|
13
|
+
'oscar@ecoportal.co.nz'
|
14
|
+
]
|
10
15
|
|
11
16
|
spec.summary = %q{A collection of helpers for interacting with the ecoPortal MS's various APIs}
|
12
17
|
spec.homepage = "https://www.ecoportal.com"
|
@@ -19,17 +24,21 @@ Gem::Specification.new do |spec|
|
|
19
24
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
20
25
|
f.match(%r{^(test|spec|features)/})
|
21
26
|
end
|
22
|
-
spec.bindir =
|
27
|
+
spec.bindir = 'exe'
|
23
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
-
spec.require_paths = [
|
29
|
+
spec.require_paths = ['lib']
|
25
30
|
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
+
spec.add_development_dependency 'pry' , '~> 0.14'
|
32
|
+
spec.add_development_dependency 'rake', '>= 13.0.3', '< 14'
|
33
|
+
spec.add_development_dependency 'redcarpet', '>= 3.6.0', '< 4'
|
34
|
+
spec.add_development_dependency 'rspec', '>= 3.12.0', '< 4'
|
35
|
+
spec.add_development_dependency 'rubocop', '~> 1'
|
36
|
+
spec.add_development_dependency 'rubocop-rake', '~> 0'
|
37
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
31
38
|
|
32
39
|
spec.add_dependency 'dotenv', '~> 3'
|
33
40
|
spec.add_dependency 'elastic-apm', '>= 4.7', "< 5"
|
34
41
|
spec.add_dependency 'http', '~> 5.1', "< 6"
|
35
42
|
end
|
43
|
+
|
44
|
+
# rubocop:enable Gemspec/DevelopmentDependencies
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
module Common
|
4
|
+
module TimeOut
|
5
|
+
MIN_THROUGHPUT = 0.2 # people per second
|
6
|
+
MIN_SIZE = 10
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def min_throughput
|
11
|
+
self.class::MIN_THROUGHPUT
|
12
|
+
end
|
13
|
+
|
14
|
+
def min_size
|
15
|
+
self.class::MIN_SIZE
|
16
|
+
end
|
17
|
+
|
18
|
+
def timeout_for(count)
|
19
|
+
count = 1 unless count&.positive?
|
20
|
+
count = min_size if count < min_size
|
21
|
+
(count.ceil / min_throughput).ceil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/ecoportal/api/common.rb
CHANGED
@@ -11,6 +11,7 @@ require 'ecoportal/api/common/base_model'
|
|
11
11
|
require 'ecoportal/api/common/doc_helpers'
|
12
12
|
require 'ecoportal/api/common/logging'
|
13
13
|
require 'ecoportal/api/common/elastic_apm_integration'
|
14
|
+
require 'ecoportal/api/common/time_out'
|
14
15
|
require 'ecoportal/api/common/client'
|
15
16
|
require 'ecoportal/api/common/response'
|
16
17
|
require 'ecoportal/api/common/wrapped_response'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
class V1
|
4
|
+
class JobStatus
|
5
|
+
attr_reader :id, :progress
|
6
|
+
|
7
|
+
def initialize(id, complete, errored, progress)
|
8
|
+
@id = id
|
9
|
+
@complete = complete
|
10
|
+
@errored = errored
|
11
|
+
@progress = progress
|
12
|
+
end
|
13
|
+
|
14
|
+
def complete?(total = nil)
|
15
|
+
return @complete if total.nil?
|
16
|
+
|
17
|
+
progress >= total
|
18
|
+
end
|
19
|
+
|
20
|
+
def errored?
|
21
|
+
@errored
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
msg = complete? ? "Completed" : "In progress"
|
26
|
+
msg = "Errored" if errored?
|
27
|
+
msg << " with #{progress} done."
|
28
|
+
msg
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -6,9 +6,9 @@ module Ecoportal
|
|
6
6
|
class People
|
7
7
|
extend Common::BaseClass
|
8
8
|
include Common::DocHelpers
|
9
|
+
include Common::TimeOut
|
9
10
|
include Enumerable
|
10
11
|
|
11
|
-
JOB_TIMEOUT = 240
|
12
12
|
DELAY_STATUS_CHECK = 5
|
13
13
|
|
14
14
|
class_resolver :person_class, "Ecoportal::API::V1::Person"
|
@@ -169,15 +169,20 @@ module Ecoportal
|
|
169
169
|
|
170
170
|
yield operation
|
171
171
|
|
172
|
-
|
173
|
-
|
172
|
+
total = operation.count
|
173
|
+
timeout = timeout_for(total)
|
174
174
|
|
175
|
-
|
175
|
+
job_id = create_job(operation)
|
176
|
+
status = wait_for_job_completion(job_id, timeout: timeout, total: total)
|
177
|
+
|
178
|
+
# @todo
|
179
|
+
# if total == status.progress
|
180
|
+
if status&.complete?(total)
|
176
181
|
job_result(job_id, operation)
|
177
182
|
else
|
178
|
-
msg = "Job
|
179
|
-
msg << "Probably timeout after #{
|
180
|
-
msg << "Current status: #{status}"
|
183
|
+
msg = "Job '#{job_id}' not complete (size: #{total}).\n"
|
184
|
+
msg << " Probably timeout after #{timeout} seconds.\n"
|
185
|
+
msg << " Current status: #{status}"
|
181
186
|
|
182
187
|
raise API::Errors::TimeOut, msg
|
183
188
|
end
|
@@ -191,8 +196,6 @@ module Ecoportal
|
|
191
196
|
|
192
197
|
private
|
193
198
|
|
194
|
-
JobStatus = Struct.new(:id, :complete?, :errored?, :progress)
|
195
|
-
|
196
199
|
def job_status(job_id)
|
197
200
|
response = client.get("/people/job/#{CGI.escape(job_id)}/status")
|
198
201
|
body = response && body_data(response.body)
|
@@ -201,12 +204,7 @@ module Ecoportal
|
|
201
204
|
msg << "Errors: #{body}"
|
202
205
|
raise msg unless response.success?
|
203
206
|
|
204
|
-
JobStatus.new(
|
205
|
-
body["id"],
|
206
|
-
body["complete"],
|
207
|
-
body["errored"],
|
208
|
-
body["progress"]
|
209
|
-
)
|
207
|
+
JobStatus.new(*body.values_at(*%w[id complete errored progress]))
|
210
208
|
end
|
211
209
|
|
212
210
|
# @return [Ecoportal::API::Common::Response] the results of the batch job
|
@@ -216,15 +214,25 @@ module Ecoportal
|
|
216
214
|
end
|
217
215
|
end
|
218
216
|
|
219
|
-
def wait_for_job_completion(job_id)
|
217
|
+
def wait_for_job_completion(job_id, timeout:, total:)
|
220
218
|
# timeout library is evil. So we make poor-man timeout.
|
221
219
|
# https://jvns.ca/blog/2015/11/27/why-rubys-timeout-is-dangerous-and-thread-dot-raise-is-terrifying/
|
222
220
|
before = Time.now
|
223
221
|
|
224
222
|
loop do
|
225
223
|
status = job_status(job_id)
|
226
|
-
break status if status.complete?
|
227
|
-
|
224
|
+
break status if status.complete?(total)
|
225
|
+
|
226
|
+
left = (before + timeout) - Time.now
|
227
|
+
break status unless left.positive?
|
228
|
+
# break status if Time.now >= before + timeout
|
229
|
+
|
230
|
+
msg = " ... Await job "
|
231
|
+
msg << "('#{job_id}'; done: #{status.progress}): "
|
232
|
+
msg << "#{left.ceil} sec. \r"
|
233
|
+
|
234
|
+
print msg
|
235
|
+
$stdout.flush
|
228
236
|
|
229
237
|
sleep(DELAY_STATUS_CHECK)
|
230
238
|
status
|
data/lib/ecoportal/api/v1.rb
CHANGED
metadata
CHANGED
@@ -1,42 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ecoportal-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.2
|
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-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: pry
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 3.12.0
|
20
|
-
- - "<"
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
19
|
+
version: '0.14'
|
23
20
|
type: :development
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 3.12.0
|
30
|
-
- - "<"
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
26
|
+
version: '0.14'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: rake
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
31
|
- - ">="
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version: 13.
|
33
|
+
version: 13.0.3
|
40
34
|
- - "<"
|
41
35
|
- !ruby/object:Gem::Version
|
42
36
|
version: '14'
|
@@ -46,37 +40,37 @@ dependencies:
|
|
46
40
|
requirements:
|
47
41
|
- - ">="
|
48
42
|
- !ruby/object:Gem::Version
|
49
|
-
version: 13.
|
43
|
+
version: 13.0.3
|
50
44
|
- - "<"
|
51
45
|
- !ruby/object:Gem::Version
|
52
46
|
version: '14'
|
53
47
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
48
|
+
name: redcarpet
|
55
49
|
requirement: !ruby/object:Gem::Requirement
|
56
50
|
requirements:
|
57
51
|
- - ">="
|
58
52
|
- !ruby/object:Gem::Version
|
59
|
-
version:
|
53
|
+
version: 3.6.0
|
60
54
|
- - "<"
|
61
55
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
56
|
+
version: '4'
|
63
57
|
type: :development
|
64
58
|
prerelease: false
|
65
59
|
version_requirements: !ruby/object:Gem::Requirement
|
66
60
|
requirements:
|
67
61
|
- - ">="
|
68
62
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
63
|
+
version: 3.6.0
|
70
64
|
- - "<"
|
71
65
|
- !ruby/object:Gem::Version
|
72
|
-
version: '
|
66
|
+
version: '4'
|
73
67
|
- !ruby/object:Gem::Dependency
|
74
|
-
name:
|
68
|
+
name: rspec
|
75
69
|
requirement: !ruby/object:Gem::Requirement
|
76
70
|
requirements:
|
77
71
|
- - ">="
|
78
72
|
- !ruby/object:Gem::Version
|
79
|
-
version: 3.
|
73
|
+
version: 3.12.0
|
80
74
|
- - "<"
|
81
75
|
- !ruby/object:Gem::Version
|
82
76
|
version: '4'
|
@@ -86,24 +80,52 @@ dependencies:
|
|
86
80
|
requirements:
|
87
81
|
- - ">="
|
88
82
|
- !ruby/object:Gem::Version
|
89
|
-
version: 3.
|
83
|
+
version: 3.12.0
|
90
84
|
- - "<"
|
91
85
|
- !ruby/object:Gem::Version
|
92
86
|
version: '4'
|
93
87
|
- !ruby/object:Gem::Dependency
|
94
|
-
name:
|
88
|
+
name: rubocop
|
95
89
|
requirement: !ruby/object:Gem::Requirement
|
96
90
|
requirements:
|
97
91
|
- - "~>"
|
98
92
|
- !ruby/object:Gem::Version
|
99
|
-
version: '
|
93
|
+
version: '1'
|
100
94
|
type: :development
|
101
95
|
prerelease: false
|
102
96
|
version_requirements: !ruby/object:Gem::Requirement
|
103
97
|
requirements:
|
104
98
|
- - "~>"
|
105
99
|
- !ruby/object:Gem::Version
|
106
|
-
version: '
|
100
|
+
version: '1'
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: rubocop-rake
|
103
|
+
requirement: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - "~>"
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
type: :development
|
109
|
+
prerelease: false
|
110
|
+
version_requirements: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - "~>"
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
name: yard
|
117
|
+
requirement: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - "~>"
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0.9'
|
122
|
+
type: :development
|
123
|
+
prerelease: false
|
124
|
+
version_requirements: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - "~>"
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0.9'
|
107
129
|
- !ruby/object:Gem::Dependency
|
108
130
|
name: dotenv
|
109
131
|
requirement: !ruby/object:Gem::Requirement
|
@@ -161,9 +183,7 @@ dependencies:
|
|
161
183
|
description:
|
162
184
|
email:
|
163
185
|
- tapio@ecoportal.co.nz
|
164
|
-
- rien@ecoportal.co.nz
|
165
186
|
- oscar@ecoportal.co.nz
|
166
|
-
- bozydar@ecoportal.co.nz
|
167
187
|
executables: []
|
168
188
|
extensions: []
|
169
189
|
extra_rdoc_files: []
|
@@ -194,6 +214,7 @@ files:
|
|
194
214
|
- lib/ecoportal/api/common/hash_diff.rb
|
195
215
|
- lib/ecoportal/api/common/logging.rb
|
196
216
|
- lib/ecoportal/api/common/response.rb
|
217
|
+
- lib/ecoportal/api/common/time_out.rb
|
197
218
|
- lib/ecoportal/api/common/wrapped_response.rb
|
198
219
|
- lib/ecoportal/api/errors.rb
|
199
220
|
- lib/ecoportal/api/errors/base.rb
|
@@ -215,6 +236,7 @@ files:
|
|
215
236
|
- lib/ecoportal/api/internal/schema_field_value.rb
|
216
237
|
- lib/ecoportal/api/logger.rb
|
217
238
|
- lib/ecoportal/api/v1.rb
|
239
|
+
- lib/ecoportal/api/v1/job_status.rb
|
218
240
|
- lib/ecoportal/api/v1/people.rb
|
219
241
|
- lib/ecoportal/api/v1/person.rb
|
220
242
|
- lib/ecoportal/api/v1/person_details.rb
|
@@ -243,7 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
243
265
|
- !ruby/object:Gem::Version
|
244
266
|
version: '0'
|
245
267
|
requirements: []
|
246
|
-
rubygems_version: 3.5.
|
268
|
+
rubygems_version: 3.5.18
|
247
269
|
signing_key:
|
248
270
|
specification_version: 4
|
249
271
|
summary: A collection of helpers for interacting with the ecoPortal MS's various APIs
|