eco-helpers 2.0.8 → 2.0.13
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/CHANGELOG.md +42 -65
- data/lib/eco/api/common/loaders/use_case.rb +1 -1
- data/lib/eco/api/common/people/person_entry.rb +1 -1
- data/lib/eco/api/common/people/person_entry_attribute_mapper.rb +8 -8
- data/lib/eco/api/common/people/person_parser.rb +22 -11
- data/lib/eco/api/organization/tag_tree.rb +20 -3
- data/lib/eco/api/session/batch.rb +19 -3
- data/lib/eco/api/session/batch/errors.rb +6 -6
- data/lib/eco/api/session/batch/feedback.rb +6 -9
- data/lib/eco/api/session/batch/job.rb +3 -2
- data/lib/eco/api/usecases.rb +2 -0
- data/lib/eco/api/usecases/default_cases/hris_case.rb +14 -8
- data/lib/eco/cli.rb +11 -10
- data/lib/eco/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 726f5a5930889b9fd59b4acc4ce7b938e3c6011909c2f5a5bb1a105a36df4d9b
|
|
4
|
+
data.tar.gz: 804bc3ae796491543ec3615e9f11308333e7ea6fc9a10f943778f66922aa4a25
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f2e1c852b4660ae1bdc3e94bab274f3d4b7168c6affef57315b370af102b71cff19cdb0c2de0b59899f82b7f2f8b0478688cf018f3c52f26c1f1d891ed19cd65
|
|
7
|
+
data.tar.gz: 032a93267eb45f7550fbdad7805d0f472a0ea1a98353b089147bd71de785cdeaa4933b233bdd22d4ab69f7a85bfa65ec1f0850fe82e446dcf4d5f503ba1f191b
|
data/CHANGELOG.md
CHANGED
|
@@ -1,24 +1,61 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
|
3
3
|
|
|
4
|
-
## [2.0.
|
|
4
|
+
## [2.0.13] - 2021-03-31
|
|
5
5
|
|
|
6
6
|
### Added
|
|
7
|
+
- Stats on the `Eco::API::Session::Batch`
|
|
8
|
+
- Allow to inherit and re-use the `Eco::API::UseCases::DefaultCase::HrisCase`
|
|
9
|
+
|
|
7
10
|
### Changed
|
|
11
|
+
|
|
8
12
|
### Fixed
|
|
9
|
-
- `
|
|
10
|
-
|
|
11
|
-
## [2.0.
|
|
13
|
+
- Ensure auto-loading for `Eco::API::UseCases`
|
|
14
|
+
|
|
15
|
+
## [2.0.12] - 2021-03-29
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- `Eco::CLI#run` it does include any defined states on the workflow
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## [2.0.11] - 2021-03-29
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- `Eco::API::Session::Batch:Errors#errors` changed `Array#filter` call to `Array#select` call
|
|
25
|
+
|
|
26
|
+
## [2.0.10] - 2021-03-26
|
|
12
27
|
|
|
13
28
|
### Added
|
|
29
|
+
- `Eco::API::Common::People::PersonParser`
|
|
30
|
+
- `#defined_attrs`: list of all attribute defined parsers (regardless they belong to the model)
|
|
31
|
+
- `Eco::API::Organization::TagTree` methods
|
|
32
|
+
- `#total_depth` to know the total depth of a tree
|
|
33
|
+
- `#flat?` to know if the tagtree has only 1 level
|
|
34
|
+
|
|
14
35
|
### Changed
|
|
36
|
+
- `Eco::API::Common::People::PersonParser`
|
|
37
|
+
- Renamed `#all_attrs` to `#all_model_attrs`
|
|
38
|
+
- Ranamed `#defined_attrs` to `#defined_model_attrs`
|
|
39
|
+
- Ranamed `#undefined_attrs` to `#undefined_model_attrs`
|
|
40
|
+
|
|
41
|
+
## [2.0.9] - 2021-03-19
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
- `Eco::API::Session::Batch:Errors#person_ref` moved to the public method
|
|
45
|
+
|
|
46
|
+
## [2.0.8] - 2021-03-09
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
- `Ecoportal::API::V1::Person#identity` adjust behavior
|
|
50
|
+
|
|
51
|
+
## [2.0.7] - 2021-03-09
|
|
52
|
+
|
|
15
53
|
### Fixed
|
|
16
54
|
- `Eco::API::Session::Batch::JobsGroups` and `Eco::API::Session::Batch::Jobs`: when new `Batch::Job`s are creating during launch, they remained unlaunched
|
|
17
55
|
- this fix makes `#launch` method to iterate until there are no pending
|
|
18
56
|
|
|
19
57
|
## [2.0.6] - 2021-03-08
|
|
20
58
|
|
|
21
|
-
### Added
|
|
22
59
|
### Changed
|
|
23
60
|
- `Eco::API::Session::Batch:Errors` moved some methods to be private
|
|
24
61
|
### Fixed
|
|
@@ -26,46 +63,33 @@ All notable changes to this project will be documented in this file.
|
|
|
26
63
|
|
|
27
64
|
## [2.0.5] - 2021-02-24
|
|
28
65
|
|
|
29
|
-
### Added
|
|
30
|
-
### Changed
|
|
31
66
|
### Fixed
|
|
32
67
|
- `Eco::API::Common::People::PersonParser#symbol_keys` to use `Array#select`
|
|
33
68
|
- as `Array#filter` was introduced in ruby `2.5.5`
|
|
34
69
|
|
|
35
70
|
## [2.0.4] - 2021-02-23
|
|
36
71
|
|
|
37
|
-
### Added
|
|
38
72
|
### Changed
|
|
39
73
|
- `Eco::API::Common::People::PersonParser#defined_attrs` to include virtual attributes
|
|
40
74
|
|
|
41
|
-
### Fixed
|
|
42
|
-
|
|
43
75
|
## [2.0.3] - 2021-02-23
|
|
44
76
|
|
|
45
77
|
### Added
|
|
46
78
|
- `Eco::API::UseCases::OozeSamples::OozeUpdateCase`: added integration to update page instances (non-templates)
|
|
47
79
|
|
|
48
|
-
### Changed
|
|
49
80
|
### Fixed
|
|
50
81
|
- `Eco::API::Policies::DefaultPolicies::UserAccess` complete default policy code.
|
|
51
82
|
|
|
52
83
|
## [2.0.2] - 2021-02-22
|
|
53
84
|
|
|
54
|
-
### Added
|
|
55
85
|
### Changed
|
|
56
86
|
- upgraded dependencies with `ecoportal-api`
|
|
57
87
|
|
|
58
|
-
### Fixed
|
|
59
|
-
|
|
60
|
-
|
|
61
88
|
## [2.0.1] - 2021-02-22
|
|
62
89
|
|
|
63
|
-
### Added
|
|
64
90
|
### Changed
|
|
65
91
|
- upgraded dependencies with `ecoportal-api-oozes` to `ecoportal-api-v2`
|
|
66
92
|
|
|
67
|
-
### Fixed
|
|
68
|
-
|
|
69
93
|
## [1.5.15] - 2021-02-17
|
|
70
94
|
|
|
71
95
|
### Added
|
|
@@ -79,7 +103,6 @@ All notable changes to this project will be documented in this file.
|
|
|
79
103
|
- `Eco::API::MicroCases#people_search`
|
|
80
104
|
- `Eco::API::MicroCases#refresh`
|
|
81
105
|
|
|
82
|
-
### Changed
|
|
83
106
|
### Fixed
|
|
84
107
|
- `Eco::API::Policies::DefaultPolicies::UserAccess` typos in default api policy
|
|
85
108
|
|
|
@@ -101,11 +124,8 @@ All notable changes to this project will be documented in this file.
|
|
|
101
124
|
- `Eco::API::Common::People::PersonEntry` add error log when wrong email error is detected
|
|
102
125
|
- previously it would have crashed
|
|
103
126
|
|
|
104
|
-
### Fixed
|
|
105
|
-
|
|
106
127
|
## [1.5.13] - 2021-02-01
|
|
107
128
|
|
|
108
|
-
### Added
|
|
109
129
|
### Changed
|
|
110
130
|
- upgraded dependency with `ecoportal-api-oozes`
|
|
111
131
|
|
|
@@ -121,23 +141,16 @@ All notable changes to this project will be documented in this file.
|
|
|
121
141
|
### Changed
|
|
122
142
|
- upgraded `ecoportal-api` dependency
|
|
123
143
|
|
|
124
|
-
### Fixed
|
|
125
|
-
|
|
126
|
-
|
|
127
144
|
## [1.5.11] - 2021-01-25
|
|
128
145
|
|
|
129
146
|
### Added
|
|
130
147
|
- `Eco::API::Organization::TagTree#subtag?` to check if the tag is in any subtree.
|
|
131
148
|
|
|
132
|
-
### Changed
|
|
133
|
-
|
|
134
149
|
### Fixed
|
|
135
150
|
- `Eco::API::MicroCases#set_supervisor` shouldn't set it if the entry does not have it.
|
|
136
151
|
|
|
137
152
|
## [1.5.10] - 2021-01-19
|
|
138
153
|
|
|
139
|
-
### Added
|
|
140
|
-
### Changed
|
|
141
154
|
### Fixed
|
|
142
155
|
- `Eco::API::Session::Batch::Errors#print` show the row number of the input data.
|
|
143
156
|
|
|
@@ -146,14 +159,8 @@ All notable changes to this project will be documented in this file.
|
|
|
146
159
|
### Added
|
|
147
160
|
- `Eco::API::Organization::TagTree#subtags` to get all the tags but those of the highest level.
|
|
148
161
|
|
|
149
|
-
### Changed
|
|
150
|
-
### Fixed
|
|
151
|
-
|
|
152
|
-
|
|
153
162
|
## [1.5.8] - 2021-01-05
|
|
154
163
|
|
|
155
|
-
### Added
|
|
156
|
-
### Changed
|
|
157
164
|
### Fixed
|
|
158
165
|
- `Eco::API::Session::Batch::Jobs#job` shouldn't be calling the post-launch callback function on creation.
|
|
159
166
|
- `Eco::API::Session#new_job` should include a `&block` parameter.
|
|
@@ -161,15 +168,11 @@ All notable changes to this project will be documented in this file.
|
|
|
161
168
|
|
|
162
169
|
## [1.5.7] - 2020-12-17
|
|
163
170
|
|
|
164
|
-
### Added
|
|
165
|
-
### Changed
|
|
166
171
|
### Fixed
|
|
167
172
|
- `Eco::API::Sesssion#parse_attribute` was not using phase argument
|
|
168
173
|
|
|
169
174
|
## [1.5.6] - 2020-12-04
|
|
170
175
|
|
|
171
|
-
### Added
|
|
172
|
-
### Changed
|
|
173
176
|
### Fixed
|
|
174
177
|
- `Eco::API::UseCases::DefaultCases::RestoreDBCase` fixed typo and slightly improved
|
|
175
178
|
- fixed some back-end errors when chaining usecases
|
|
@@ -177,8 +180,6 @@ All notable changes to this project will be documented in this file.
|
|
|
177
180
|
|
|
178
181
|
## [1.5.5] - 2020-12-03
|
|
179
182
|
|
|
180
|
-
### Added
|
|
181
|
-
### Changed
|
|
182
183
|
### Fixed
|
|
183
184
|
- rubies previous to `2.5` do not have `yield_self`
|
|
184
185
|
|
|
@@ -186,14 +187,11 @@ All notable changes to this project will be documented in this file.
|
|
|
186
187
|
|
|
187
188
|
### Added
|
|
188
189
|
- update `ecoportal-api` dependency
|
|
189
|
-
### Changed
|
|
190
190
|
### Fixed
|
|
191
191
|
- `Eco::API::MicroCases#people_refresh` typo
|
|
192
192
|
|
|
193
193
|
## [1.5.3] - 2020-11-30
|
|
194
194
|
|
|
195
|
-
### Added
|
|
196
|
-
### Changed
|
|
197
195
|
### Fixed
|
|
198
196
|
- `Eco::API::Session::Batch::RequestStats#blanked_value?` better blank detection
|
|
199
197
|
- `Eco::API::MicroCases#with_each_starter` rectified typo
|
|
@@ -334,14 +332,11 @@ All notable changes to this project will be documented in this file.
|
|
|
334
332
|
|
|
335
333
|
## [1.4.2] - 2020-07-23
|
|
336
334
|
|
|
337
|
-
### Added
|
|
338
|
-
### Changed
|
|
339
335
|
### Fixed
|
|
340
336
|
- preserve backtrace on logging
|
|
341
337
|
|
|
342
338
|
## [1.4.0] - 2020-07-14
|
|
343
339
|
|
|
344
|
-
### Added
|
|
345
340
|
### Changed
|
|
346
341
|
- change abilities to align with ecoPortal release `1.5.0`
|
|
347
342
|
- remove some patches on `ecoportal-api`
|
|
@@ -351,22 +346,17 @@ All notable changes to this project will be documented in this file.
|
|
|
351
346
|
|
|
352
347
|
## [1.3.19] - 2020-07-23
|
|
353
348
|
|
|
354
|
-
### Added
|
|
355
|
-
### Changed
|
|
356
349
|
### Fixed
|
|
357
350
|
- preserve backtrace on logging
|
|
358
351
|
|
|
359
352
|
## [1.3.18] - 2020-07-08
|
|
360
353
|
|
|
361
|
-
### Added
|
|
362
|
-
### Changed
|
|
363
354
|
### Fixed
|
|
364
355
|
- the `update` case was missing the code to use the `default_usergroup`
|
|
365
356
|
|
|
366
357
|
|
|
367
358
|
## [1.3.17] - 2020-07-06
|
|
368
359
|
|
|
369
|
-
### Added
|
|
370
360
|
### Changed
|
|
371
361
|
- the `hris` case should not only include as `leavers` those that have account, but anyone that leaves
|
|
372
362
|
* as we could have active people with no account
|
|
@@ -389,7 +379,6 @@ All notable changes to this project will be documented in this file.
|
|
|
389
379
|
### Added
|
|
390
380
|
- default usecase to export to `csv` (`-detailed`) now includes `"Supervisor Name"` column
|
|
391
381
|
### Changed
|
|
392
|
-
### Fixed
|
|
393
382
|
|
|
394
383
|
## [1.3.14] - 2020-06-10
|
|
395
384
|
|
|
@@ -397,33 +386,24 @@ All notable changes to this project will be documented in this file.
|
|
|
397
386
|
- `Eco::API::Common::People::SupervisorHelpers` now has its methods as class methods
|
|
398
387
|
### Changed
|
|
399
388
|
- upgraded `ecoportal-api` gem dependency to minimum version `0.5.6`
|
|
400
|
-
### Fixed
|
|
401
389
|
|
|
402
390
|
|
|
403
391
|
## [1.3.13] - 2020-05-29
|
|
404
392
|
|
|
405
|
-
### Added
|
|
406
|
-
### Changed
|
|
407
393
|
### Fixed
|
|
408
394
|
- `Eco::API::Organization::TagTree#tag?` to accept `nil` by returning `false`
|
|
409
395
|
- `Eco::API::Common::People::DefaultParsers::DateParser` will parse to `Date` class
|
|
410
396
|
* it was parsing to `Time` class, while the native gem `ecoportal-api` parses as `Date` ([reference](https://gitlab.com/ecoPortal/ecoportal-api/-/blob/master/lib/ecoportal/api/v1/schema_field.rb))
|
|
411
397
|
## [1.3.12] - 2020-05-19
|
|
412
398
|
|
|
413
|
-
### Added
|
|
414
399
|
### Changed
|
|
415
400
|
- stop using `email` as `external_id` on `People#person` & `People#find`
|
|
416
401
|
* this should result in more accurate searches when using `:strict` options
|
|
417
|
-
### Fixed
|
|
418
|
-
|
|
419
402
|
|
|
420
403
|
## [1.3.11] - 2020-05-12
|
|
421
404
|
|
|
422
|
-
### Added
|
|
423
405
|
### Changed
|
|
424
406
|
- remove popping up comments on `Eco::API::Organization::PolicyGroups#`
|
|
425
|
-
### Fixed
|
|
426
|
-
|
|
427
407
|
|
|
428
408
|
## [1.3.10] - 2020-05-12
|
|
429
409
|
|
|
@@ -432,14 +412,11 @@ All notable changes to this project will be documented in this file.
|
|
|
432
412
|
- `config.people.default_usergroup`, when defined, will have effect on usecases: `update` (this case was missing the change)
|
|
433
413
|
* on account creation, if the input file did not specify `policy_group_ids`
|
|
434
414
|
|
|
435
|
-
### Changed
|
|
436
415
|
### Fixed
|
|
437
416
|
- `upsert`, `hris` and `create` usecases: fixed condition for use of default_usergroup
|
|
438
417
|
|
|
439
418
|
## [1.3.9] - 2020-05-12
|
|
440
419
|
|
|
441
|
-
### Added
|
|
442
|
-
### Changed
|
|
443
420
|
### Fixed
|
|
444
421
|
|
|
445
422
|
- `usecase` callback was not receiving `usecase` paramater
|
|
@@ -8,7 +8,7 @@ module Eco
|
|
|
8
8
|
# @return [Symbol] the `type` of usecase (i.e. `:sync`, `:transform`, `:import`, `:other`)
|
|
9
9
|
def type(value = nil)
|
|
10
10
|
unless value
|
|
11
|
-
return @type || raise("You should specify a type of case [:sync, :transform, :import, :other] for #{self
|
|
11
|
+
return @type || raise("You should specify a type of case [:sync, :transform, :import, :other] for #{self}")
|
|
12
12
|
end
|
|
13
13
|
@type = value
|
|
14
14
|
end
|
|
@@ -256,7 +256,7 @@ module Eco
|
|
|
256
256
|
# @param mapped_entry [Hash] that with **internal** names but **external** values and types.
|
|
257
257
|
# @return [Hash] with **external** names, values and types.
|
|
258
258
|
def _external_serializing(mapped_entry)
|
|
259
|
-
target_attrs = @emap.
|
|
259
|
+
target_attrs = @emap.all_model_attrs | @emap.aliased_attrs
|
|
260
260
|
rest_keys = mapped_entry.keys - target_attrs
|
|
261
261
|
target_attrs -= ["send_invites"]
|
|
262
262
|
external_entry = target_attrs.each_with_object({}) do |attr, hash|
|
|
@@ -6,14 +6,14 @@ module Eco
|
|
|
6
6
|
# @attr_reader core_attrs [Array<String>] core attributes that are present in the person entry.
|
|
7
7
|
# @attr_reader details_attrs [Array<String>] schema details attributes that are present in the person entry.
|
|
8
8
|
# @attr_reader account_attrs [Array<String>] account attributes that are present in the person entry.
|
|
9
|
-
# @attr_reader
|
|
9
|
+
# @attr_reader all_model_attrs [Array<String>] all the attrs that are present in the person entry.
|
|
10
10
|
# @attr_reader internal_attrs [Array<String>] all the internally named attributes that the person entry has.
|
|
11
11
|
# @attr_reader aliased_attrs [Array<String>] only those internal attributes present in the person entry that have an internal/external name mapping.
|
|
12
12
|
# @attr_reader direct_attrs [Array<String>] only those internal attributes present in the person entry that do **not** have an internal/external name mapping.
|
|
13
13
|
class PersonEntryAttributeMapper
|
|
14
14
|
@@cached_warnings = {}
|
|
15
15
|
|
|
16
|
-
attr_reader :core_attrs, :details_attrs, :account_attrs, :
|
|
16
|
+
attr_reader :core_attrs, :details_attrs, :account_attrs, :all_model_attrs
|
|
17
17
|
attr_reader :internal_attrs, :aliased_attrs, :direct_attrs
|
|
18
18
|
|
|
19
19
|
# Helper class tied to `PersonEntry` that allows to track which attributes of a person entry are present
|
|
@@ -41,14 +41,14 @@ module Eco
|
|
|
41
41
|
init_attr_trackers
|
|
42
42
|
else # SERIALIZING
|
|
43
43
|
@person = data
|
|
44
|
-
@internal_attrs = @person_parser.
|
|
44
|
+
@internal_attrs = @person_parser.all_model_attrs
|
|
45
45
|
@aliased_attrs = @attr_map.list(:internal)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
@core_attrs = @person_parser.target_attrs_core(@internal_attrs)
|
|
49
49
|
@details_attrs = @person_parser.target_attrs_details(@internal_attrs)
|
|
50
50
|
@account_attrs = @person_parser.target_attrs_account(@internal_attrs)
|
|
51
|
-
@
|
|
51
|
+
@all_model_attrs = @core_attrs | @account_attrs | @details_attrs
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
# To know if currently the object is in parse or serialize mode.
|
|
@@ -98,7 +98,7 @@ module Eco
|
|
|
98
98
|
end
|
|
99
99
|
end
|
|
100
100
|
|
|
101
|
-
return nil unless @person_parser.
|
|
101
|
+
return nil unless @person_parser.all_model_attrs.include?(attr)
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
# Serializing helper also used to do a reverse mapping when parsing:
|
|
@@ -146,9 +146,9 @@ module Eco
|
|
|
146
146
|
# when parsing:
|
|
147
147
|
def init_attr_trackers
|
|
148
148
|
# (def) all internal attributes we can expect
|
|
149
|
-
def_all_attrs = @person_parser.
|
|
149
|
+
def_all_attrs = @person_parser.all_model_attrs
|
|
150
150
|
# (def) internal attrs with no aliasing nor parser definition (expected to be direct)
|
|
151
|
-
def_unlinked = @person_parser.
|
|
151
|
+
def_unlinked = @person_parser.undefined_model_attrs.select { |attr| !to_external(attr) }
|
|
152
152
|
# (def) those with parser or alias:
|
|
153
153
|
def_linked = def_all_attrs - def_unlinked
|
|
154
154
|
|
|
@@ -168,7 +168,7 @@ module Eco
|
|
|
168
168
|
# (data) virtual internal attrs (the internal names of those virtual attrs)
|
|
169
169
|
data_vi_int_aliased = data_vi_ext_alias.map do |attr|
|
|
170
170
|
# to_internal(attr) can't be used here, becauase virtual fields would get filtered out,
|
|
171
|
-
# as they are not recognized by @parser.
|
|
171
|
+
# as they are not recognized by @parser.all_model_attrs.include?(attr)
|
|
172
172
|
@attr_map.to_internal(attr)
|
|
173
173
|
end.compact
|
|
174
174
|
|
|
@@ -7,7 +7,7 @@ module Eco
|
|
|
7
7
|
#
|
|
8
8
|
# @attr_reader schema [Ecoportal::API::V1::PersonSchema, nil] schema of person details that this parser will be based upon.
|
|
9
9
|
# @attr_reader details_attrs [Array<String>] internal names of schema details attributes.
|
|
10
|
-
# @attr_reader
|
|
10
|
+
# @attr_reader all_model_attrs [Array<String>] all the internal name attributes, including _core_, _account_ and _details_.
|
|
11
11
|
class PersonParser
|
|
12
12
|
extend Eco::API::Common::ClassAutoLoader
|
|
13
13
|
autoloads_children_of "Eco::API::Common::Loaders::Parser"
|
|
@@ -19,8 +19,7 @@ module Eco
|
|
|
19
19
|
FORMAT = [:csv, :xml, :json]
|
|
20
20
|
|
|
21
21
|
attr_reader :schema
|
|
22
|
-
attr_reader :details_attrs, :
|
|
23
|
-
attr_reader :defined_attrs
|
|
22
|
+
attr_reader :details_attrs, :all_model_attrs
|
|
24
23
|
attr_reader :patch_version
|
|
25
24
|
|
|
26
25
|
# @example Example of usage:
|
|
@@ -46,7 +45,7 @@ module Eco
|
|
|
46
45
|
@details_attrs = @schema&.fields.map { |fld| fld.alt_id }
|
|
47
46
|
end
|
|
48
47
|
|
|
49
|
-
@
|
|
48
|
+
@all_model_attrs = CORE_ATTRS + ACCOUNT_ATTRS + @details_attrs
|
|
50
49
|
self.class.autoload_children(self)
|
|
51
50
|
end
|
|
52
51
|
|
|
@@ -60,6 +59,11 @@ module Eco
|
|
|
60
59
|
|
|
61
60
|
# @!group Scopping attributes (identifying, presence & active)
|
|
62
61
|
|
|
62
|
+
# All the internal name attributes, including _core_, _account_ and _details_.
|
|
63
|
+
def all_attrs(include_defined_parsers: false)
|
|
64
|
+
all_model_attrs | defined_model_attrs
|
|
65
|
+
end
|
|
66
|
+
|
|
63
67
|
# Scopes `source_attrs` using the _**core** attributes_.
|
|
64
68
|
# @note use this helper to know which among your attributes are **core** ones.
|
|
65
69
|
# @param source_attrs [Array<String>]
|
|
@@ -93,14 +97,21 @@ module Eco
|
|
|
93
97
|
@parsers.keys
|
|
94
98
|
end
|
|
95
99
|
|
|
100
|
+
# Returns a list of all the internal attributes that have a parser defined.
|
|
101
|
+
# @note These attributes do not necessarily belong to the model. They could be virtual attributes
|
|
102
|
+
# @return [Array<String>] list of all attribute defined parsers.
|
|
103
|
+
def defined_attrs
|
|
104
|
+
defined_list - symbol_keys
|
|
105
|
+
end
|
|
106
|
+
|
|
96
107
|
# Returns a list of all the internal attributes of the model that have a parser defined.
|
|
97
108
|
# @note
|
|
98
109
|
# - it excludes any parser that is not in the model, such as type parsers (i.e. `:boolean`, `:multiple`)
|
|
99
110
|
# - the list is sorted according `CORE_ATTRS` + `ACCOUNT_ATTRS` + schema attrs
|
|
100
|
-
# @return [Array<String>] list of all attribute defined parsers.
|
|
101
|
-
def
|
|
111
|
+
# @return [Array<String>] list of all attribute defined parsers in the model.
|
|
112
|
+
def defined_model_attrs
|
|
102
113
|
defined = @parsers.keys
|
|
103
|
-
defined = (
|
|
114
|
+
defined = (all_model_attrs | defined) & defined
|
|
104
115
|
defined - symbol_keys
|
|
105
116
|
end
|
|
106
117
|
|
|
@@ -118,7 +129,7 @@ module Eco
|
|
|
118
129
|
# @param process [Symbol] either `:parse` or `:serialize`, depending if we want to parse or serialize the `attr`.
|
|
119
130
|
# @return [Array<String>] list of all attribute defined parsers that should be active for the given `source_data`.
|
|
120
131
|
def active_attrs(source_data, phase = :any, process: :parse)
|
|
121
|
-
|
|
132
|
+
defined_model_attrs.select do |attr|
|
|
122
133
|
if process == :serialize
|
|
123
134
|
@parsers[attr].serializer_active?(phase)
|
|
124
135
|
else
|
|
@@ -130,8 +141,8 @@ module Eco
|
|
|
130
141
|
# Returns a list of all the internal attributes of the model that do **not** have a parser defined.
|
|
131
142
|
# @note it excludes any parser that is **not** in the model, such as type parsers (i.e. :boolean, :multiple)
|
|
132
143
|
# @return [Array<String>] list of all attributes without a defined parser.
|
|
133
|
-
def
|
|
134
|
-
|
|
144
|
+
def undefined_model_attrs
|
|
145
|
+
all_model_attrs - defined_model_attrs
|
|
135
146
|
end
|
|
136
147
|
|
|
137
148
|
# @param attr [String] internal name of an attribute.
|
|
@@ -238,7 +249,7 @@ module Eco
|
|
|
238
249
|
end
|
|
239
250
|
|
|
240
251
|
def valid_attr?(attr)
|
|
241
|
-
attr.is_a?(String) && (!@schema || @
|
|
252
|
+
attr.is_a?(String) && (!@schema || @all_model_attrs.include?(attr))
|
|
242
253
|
end
|
|
243
254
|
|
|
244
255
|
def valid_type?(attr)
|
|
@@ -4,7 +4,7 @@ module Eco
|
|
|
4
4
|
|
|
5
5
|
# Provides helpers to deal with tagtrees.
|
|
6
6
|
class TagTree
|
|
7
|
-
attr_reader :tag, :nodes
|
|
7
|
+
attr_reader :tag, :nodes, :children_count
|
|
8
8
|
attr_reader :depth, :path
|
|
9
9
|
attr_reader :enviro
|
|
10
10
|
|
|
@@ -37,6 +37,7 @@ module Eco
|
|
|
37
37
|
|
|
38
38
|
nodes = @source.is_a?(Array) ? @source : @source.dig('nodes') || []
|
|
39
39
|
@nodes = nodes.map {|cnode| TagTree.new(cnode, depth: @depth + 1, path: @path.dup, enviro: @enviro)}
|
|
40
|
+
@children_count = @nodes.count
|
|
40
41
|
|
|
41
42
|
init_hashes
|
|
42
43
|
end
|
|
@@ -46,6 +47,21 @@ module Eco
|
|
|
46
47
|
@has_tags.empty?
|
|
47
48
|
end
|
|
48
49
|
|
|
50
|
+
# @return [Integer] the highest `depth` of all the children.
|
|
51
|
+
def total_depth
|
|
52
|
+
@total_depth ||= if children_count > 0
|
|
53
|
+
deepest_node = nodes.max_by {|node| node.total_depth}
|
|
54
|
+
deepest_node.depth
|
|
55
|
+
else
|
|
56
|
+
depth
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @return [Integer] if there's only top level.
|
|
61
|
+
def flat?
|
|
62
|
+
self.total_depth <= 0
|
|
63
|
+
end
|
|
64
|
+
|
|
49
65
|
# Gets all the tags of the current node tree.
|
|
50
66
|
# @note
|
|
51
67
|
# - this will include the upper level tag(s) as well
|
|
@@ -147,7 +163,8 @@ module Eco
|
|
|
147
163
|
# * take the deepest tag (the one that is further down in the tree)
|
|
148
164
|
# * if there are different options (several nodes at the same depth):
|
|
149
165
|
# * take the common node between them (i.e. you have Hamilton and Auckland -> take New Zealand)
|
|
150
|
-
# * if there's no common node between them, take the `first
|
|
166
|
+
# * if there's no common node between them, take the `first`, unless they are at top level of the tree
|
|
167
|
+
# * to the above, take the `first` also on top level, but only if there's 1 level for the entire tree
|
|
151
168
|
# @param [Array<String>] values list of tags.
|
|
152
169
|
# @return [String] default tag.
|
|
153
170
|
def default_tag(*values)
|
|
@@ -169,7 +186,7 @@ module Eco
|
|
|
169
186
|
common = nodes.reduce(self.tags.reverse) {|com, cnode| com & cnode.path.reverse}
|
|
170
187
|
default_tag = common.first if common.length > 0 && depth > 0
|
|
171
188
|
end
|
|
172
|
-
default_tag = nodes.first&.tag
|
|
189
|
+
default_tag = nodes.first&.tag if !default_tag && ( (depth > 0) || flat?)
|
|
173
190
|
default_tag
|
|
174
191
|
end
|
|
175
192
|
|
|
@@ -105,10 +105,15 @@ module Eco
|
|
|
105
105
|
iterations = (data.length.to_f / per_page).ceil
|
|
106
106
|
|
|
107
107
|
Eco::API::Session::Batch::Status.new(enviro, queue: data, method: method).tap do |status|
|
|
108
|
+
start_time = Time.now
|
|
109
|
+
start_slice = Time.now; slice = []
|
|
108
110
|
data.each_slice(per_page) do |slice|
|
|
109
|
-
msg
|
|
111
|
+
msg = "starting batch '#{method}' iteration #{iteration}/#{iterations},"
|
|
112
|
+
msg += " with #{slice.length} entries of #{data.length} -- #{done} done"
|
|
113
|
+
msg += " (last: #{str_stats(start_slice, slice.length)}; total: #{str_stats(start_time, done)})"
|
|
110
114
|
logger.info(msg) unless silent
|
|
111
115
|
|
|
116
|
+
start_slice = Time.now
|
|
112
117
|
people_api.batch do |batch|
|
|
113
118
|
slice.each do |person|
|
|
114
119
|
batch.public_send(method, person) do |response|
|
|
@@ -118,12 +123,23 @@ module Eco
|
|
|
118
123
|
end
|
|
119
124
|
end # next batch
|
|
120
125
|
|
|
121
|
-
iteration
|
|
122
|
-
done
|
|
126
|
+
iteration += 1
|
|
127
|
+
done += slice.length
|
|
123
128
|
end # next slice
|
|
124
129
|
end
|
|
125
130
|
end
|
|
126
131
|
|
|
132
|
+
def str_stats(start, count)
|
|
133
|
+
now = Time.now
|
|
134
|
+
secs = (now - start).round(3)
|
|
135
|
+
if secs > 0.0
|
|
136
|
+
per_sec = (count.to_f / secs).round(2)
|
|
137
|
+
"#{secs}s -> #{per_sec} people/s"
|
|
138
|
+
else
|
|
139
|
+
" -- "
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
127
143
|
end
|
|
128
144
|
end
|
|
129
145
|
end
|
|
@@ -111,6 +111,11 @@ module Eco
|
|
|
111
111
|
end
|
|
112
112
|
# @!endgroup
|
|
113
113
|
|
|
114
|
+
def person_ref(entry)
|
|
115
|
+
row_str = (row = get_row(entry)) ? "(row: #{row}) " : nil
|
|
116
|
+
"#{row_str}(id: '#{get_attr(entry, :id)}') '#{get_attr(entry, :name)}' ('#{get_attr(entry, :external_id)}': '#{get_attr(entry, :email)}')"
|
|
117
|
+
end
|
|
118
|
+
|
|
114
119
|
private
|
|
115
120
|
|
|
116
121
|
# Input entries that got **error** response from the _Server_.
|
|
@@ -119,7 +124,7 @@ module Eco
|
|
|
119
124
|
# - please, observe that this can only happen if there were repeated entries in the `source_queue`
|
|
120
125
|
# @return [Array<Hash>, Array<Ecoportal::API::V1::Person>, Array<Ecoportal::API::Internal::Person>]
|
|
121
126
|
def entries
|
|
122
|
-
queue.
|
|
127
|
+
queue.select.with_index do |query, i|
|
|
123
128
|
unless response = status[i]
|
|
124
129
|
msg = "Error: query with no response. You might have duplicated entries in your queue.\n"
|
|
125
130
|
msg += "Queue length: #{queue.length}; Queue elements class: #{queue.first.class}\n"
|
|
@@ -136,11 +141,6 @@ module Eco
|
|
|
136
141
|
end
|
|
137
142
|
end
|
|
138
143
|
|
|
139
|
-
def person_ref(entry)
|
|
140
|
-
row_str = (row = get_row(entry)) ? "(row: #{row}) " : nil
|
|
141
|
-
"#{row_str}(id: '#{get_attr(entry, :id)}') '#{get_attr(entry, :name)}' ('#{get_attr(entry, :external_id)}': '#{get_attr(entry, :email)}')"
|
|
142
|
-
end
|
|
143
|
-
|
|
144
144
|
def get_attr(entry, attr)
|
|
145
145
|
if entry.respond_to?(attr.to_sym)
|
|
146
146
|
entry.public_send(attr.to_sym)
|
|
@@ -45,25 +45,22 @@ module Eco
|
|
|
45
45
|
# @!group Pure feedback methods
|
|
46
46
|
|
|
47
47
|
# Slightly modifies the behaviour of `Ecoportal::API::Common::BaseModel#as_update`, so schema details fields show the `alt_id`
|
|
48
|
+
# It also fixes possible patch updates that are incomplete or unnecessary.
|
|
48
49
|
# @note for better feedback
|
|
49
50
|
# @param entry [Hash, Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person]
|
|
50
|
-
|
|
51
|
+
# @param add_feedback [Boolean] if `true` it tweak the hash update with additional data.
|
|
52
|
+
def as_update(entry, add_feedback: true)
|
|
51
53
|
case
|
|
52
54
|
when entry.is_a?(Hash)
|
|
53
55
|
hash = entry
|
|
54
56
|
else #entry.is_a?(Ecoportal::API::V1::Person)
|
|
55
57
|
if only_ids?
|
|
56
|
-
hash = {
|
|
57
|
-
"id" => entry.id,
|
|
58
|
-
"external_id" => entry.external_id,
|
|
59
|
-
"email" => entry.email
|
|
60
|
-
}
|
|
61
58
|
hash = entry.as_json.slice("id", "external_id", "email")
|
|
62
59
|
else
|
|
63
60
|
hash = entry.as_update
|
|
64
|
-
|
|
65
|
-
if hash["details"]
|
|
66
|
-
if hfields =
|
|
61
|
+
|
|
62
|
+
if add_feedback && details = hash["details"]
|
|
63
|
+
if hfields = details["fields"]
|
|
67
64
|
hfields.each do |fld|
|
|
68
65
|
fld.merge!("alt_id" => entry.details.get_field(fld["id"]).alt_id)
|
|
69
66
|
end
|
|
@@ -169,7 +169,8 @@ module Eco
|
|
|
169
169
|
|
|
170
170
|
unless simulate
|
|
171
171
|
if pqueue.length > 0
|
|
172
|
-
|
|
172
|
+
req_backup = pqueue.map {|e| as_update(e, add_feedback: false)}
|
|
173
|
+
backup_update(req_backup)
|
|
173
174
|
session.batch.launch(pqueue, method: type).tap do |job_status|
|
|
174
175
|
@status = job_status
|
|
175
176
|
status.root = self
|
|
@@ -217,7 +218,7 @@ module Eco
|
|
|
217
218
|
[].tap do |msg|
|
|
218
219
|
subjobs.map {|subjob| msg << subjob.summary}
|
|
219
220
|
end.join("\n")
|
|
220
|
-
end
|
|
221
|
+
end
|
|
221
222
|
|
|
222
223
|
def as_update(*args)
|
|
223
224
|
feedback.as_update(*args)
|
data/lib/eco/api/usecases.rb
CHANGED
|
@@ -30,6 +30,7 @@ module Eco
|
|
|
30
30
|
@usecases = {}
|
|
31
31
|
@cache_init = false
|
|
32
32
|
@cases_by_name = {}
|
|
33
|
+
init_caches
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
def length
|
|
@@ -79,6 +80,7 @@ module Eco
|
|
|
79
80
|
|
|
80
81
|
# @return [Eco::API::UseCases] a copy of instance object of `self`.
|
|
81
82
|
def dup
|
|
83
|
+
init_caches
|
|
82
84
|
self.class.new.merge(self)
|
|
83
85
|
end
|
|
84
86
|
|
|
@@ -2,18 +2,17 @@ class Eco::API::UseCases::DefaultCases::HrisCase < Eco::API::Common::Loaders::Us
|
|
|
2
2
|
name "hris"
|
|
3
3
|
type :sync
|
|
4
4
|
|
|
5
|
+
attr_reader :creation, :update, :supers, :leavers
|
|
6
|
+
|
|
5
7
|
def main(entries, people, session, options, usecase)
|
|
6
8
|
micro = session.micro
|
|
7
|
-
creation = session.new_job("main", "create", :create, usecase)
|
|
8
|
-
update = session.new_job("main", "update", :update, usecase)
|
|
9
|
-
supers = session.new_job("post", "supers", :update, usecase, :core)
|
|
10
|
-
leavers = session.new_job("post", "leavers", :update, usecase, :account)
|
|
9
|
+
@creation = session.new_job("main", "create", :create, usecase)
|
|
10
|
+
@update = session.new_job("main", "update", :update, usecase)
|
|
11
|
+
@supers = session.new_job("post", "supers", :update, usecase, :core)
|
|
12
|
+
@leavers = session.new_job("post", "leavers", :update, usecase, :account)
|
|
11
13
|
|
|
12
14
|
micro.with_each_leaver(entries, people, options) do |person|
|
|
13
|
-
leavers.add(person)
|
|
14
|
-
person.supervisor_id = nil
|
|
15
|
-
person.account = nil if person.account
|
|
16
|
-
end
|
|
15
|
+
leavers.add(person, &method(:leavers_callback))
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
micro.with_each(entries, people, options) do |entry, person|
|
|
@@ -24,4 +23,11 @@ class Eco::API::UseCases::DefaultCases::HrisCase < Eco::API::Common::Loaders::Us
|
|
|
24
23
|
end
|
|
25
24
|
end
|
|
26
25
|
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def leavers_callback(person)
|
|
29
|
+
person.supervisor_id = nil
|
|
30
|
+
person.account = nil if person.account
|
|
31
|
+
end
|
|
32
|
+
|
|
27
33
|
end
|
data/lib/eco/cli.rb
CHANGED
|
@@ -22,16 +22,17 @@ module Eco
|
|
|
22
22
|
|
|
23
23
|
def run(session:)
|
|
24
24
|
io = Eco::API::UseCases::BaseIO.new(session: session, options: options)
|
|
25
|
-
|
|
26
|
-
session.workflow(io: io) do |wf, io|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
session.workflow(io: io).run(io: io)
|
|
26
|
+
#session.workflow(io: io) do |wf, io|
|
|
27
|
+
# io = wf.run(:options, io: io)
|
|
28
|
+
# io = wf.run(:load, io: io)
|
|
29
|
+
# io = wf.run(:usecases, io: io)
|
|
30
|
+
# io = wf.run(:launch_jobs, io: io)
|
|
31
|
+
# io = wf.run(:post_launch, io: io)
|
|
32
|
+
# io = wf.run(:report, io: io)
|
|
33
|
+
# io = wf.run(:end, io: io)
|
|
34
|
+
# io = wf.run(:close, io: io)
|
|
35
|
+
#end
|
|
35
36
|
end
|
|
36
37
|
|
|
37
38
|
end
|
data/lib/eco/version.rb
CHANGED