eco-helpers 2.5.2 → 2.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +62 -2
- data/eco-helpers.gemspec +2 -2
- data/lib/eco/api/common/loaders/use_case.rb +0 -2
- data/lib/eco/api/common/people/person_entry_attribute_mapper.rb +0 -2
- data/lib/eco/api/common/session/logger.rb +22 -77
- data/lib/eco/api/microcases/with_each.rb +0 -1
- data/lib/eco/api/organization/tag_tree.rb +64 -15
- data/lib/eco/api/session/config/tagtree.rb +32 -10
- data/lib/eco/api/session/config/workflow.rb +0 -1
- data/lib/eco/api/session/config.rb +6 -2
- data/lib/eco/api/session.rb +2 -2
- data/lib/eco/api/usecases/default_cases/abstract_policygroup_abilities_case.rb +2 -3
- data/lib/eco/api/usecases/default_cases/analyse_people_case.rb +2 -3
- data/lib/eco/api/usecases/default_cases/append_usergroups_case.rb +0 -1
- data/lib/eco/api/usecases/default_cases/change_email_case.rb +1 -2
- data/lib/eco/api/usecases/default_cases/clean_unknown_tags_case.rb +0 -5
- data/lib/eco/api/usecases/default_cases/clear_abilities_case.rb +2 -2
- data/lib/eco/api/usecases/default_cases/codes_to_tags_case.rb +5 -7
- data/lib/eco/api/usecases/default_cases/create_case.rb +0 -5
- data/lib/eco/api/usecases/default_cases/create_details_case.rb +0 -5
- data/lib/eco/api/usecases/default_cases/create_details_with_supervisor_case.rb +0 -5
- data/lib/eco/api/usecases/default_cases/csv_to_tree_case/helper.rb +1 -1
- data/lib/eco/api/usecases/default_cases/csv_to_tree_case.rb +0 -4
- data/lib/eco/api/usecases/default_cases/delete_sync_case.rb +2 -4
- data/lib/eco/api/usecases/default_cases/delete_trans_case.rb +2 -3
- data/lib/eco/api/usecases/default_cases/email_as_id_case.rb +0 -1
- data/lib/eco/api/usecases/default_cases/entries_to_csv_case.rb +0 -4
- data/lib/eco/api/usecases/default_cases/hris_case.rb +2 -3
- data/lib/eco/api/usecases/default_cases/new_email_case.rb +0 -2
- data/lib/eco/api/usecases/default_cases/new_id_case.rb +0 -2
- data/lib/eco/api/usecases/default_cases/org_data_convert_case.rb +0 -5
- data/lib/eco/api/usecases/default_cases/refresh_case.rb +0 -1
- data/lib/eco/api/usecases/default_cases/reinvite_sync_case.rb +1 -3
- data/lib/eco/api/usecases/default_cases/reinvite_trans_case.rb +2 -2
- data/lib/eco/api/usecases/default_cases/remove_account_sync_case.rb +1 -2
- data/lib/eco/api/usecases/default_cases/remove_account_trans_case.rb +2 -3
- data/lib/eco/api/usecases/default_cases/reset_landing_page_case.rb +1 -7
- data/lib/eco/api/usecases/default_cases/restore_db_case.rb +0 -10
- data/lib/eco/api/usecases/default_cases/set_default_tag_case.rb +0 -1
- data/lib/eco/api/usecases/default_cases/set_supervisor_case.rb +0 -1
- data/lib/eco/api/usecases/default_cases/supers_cyclic_identify_case.rb +2 -3
- data/lib/eco/api/usecases/default_cases/supers_hierarchy_case.rb +2 -3
- data/lib/eco/api/usecases/default_cases/switch_supervisor_case.rb +2 -4
- data/lib/eco/api/usecases/default_cases/tagtree_case.rb +0 -2
- data/lib/eco/api/usecases/default_cases/to_csv_case.rb +4 -5
- data/lib/eco/api/usecases/default_cases/to_csv_detailed_case.rb +0 -1
- data/lib/eco/api/usecases/default_cases/transfer_account_case.rb +0 -2
- data/lib/eco/api/usecases/default_cases/update_case.rb +0 -2
- data/lib/eco/api/usecases/default_cases/update_details_case.rb +0 -2
- data/lib/eco/api/usecases/default_cases/upsert_case.rb +0 -4
- data/lib/eco/api/usecases/graphql/base.rb +6 -18
- data/lib/eco/api/usecases/graphql/helpers/base/case_env.rb +15 -0
- data/lib/eco/api/usecases/graphql/helpers/base.rb +23 -0
- data/lib/eco/api/usecases/graphql/helpers/location/base.rb +87 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command/result.rb +69 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command/results.rb +126 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command.rb +92 -0
- data/lib/eco/api/usecases/graphql/helpers/location.rb +7 -0
- data/lib/eco/api/usecases/graphql/helpers.rb +2 -1
- data/lib/eco/api/usecases/graphql/samples/location/command/dsl.rb +54 -0
- data/lib/eco/api/usecases/graphql/samples/location/command/results.rb +125 -0
- data/lib/eco/api/usecases/graphql/samples/location/command.rb +10 -0
- data/lib/eco/api/usecases/graphql/samples/location/dsl.rb +6 -0
- data/lib/eco/api/usecases/graphql/samples/location.rb +10 -0
- data/lib/eco/api/usecases/graphql/samples.rb +6 -0
- data/lib/eco/api/usecases/graphql/utils/sftp.rb +74 -0
- data/lib/eco/api/usecases/graphql/utils.rb +6 -0
- data/lib/eco/api/usecases/graphql.rb +3 -1
- data/lib/eco/api/usecases/ooze_cases/export_register_case.rb +0 -1
- data/lib/eco/api/usecases/ooze_samples/ooze_base_case.rb +0 -2
- data/lib/eco/api/usecases/ooze_samples/register_migration_case.rb +0 -2
- data/lib/eco/api/usecases/use_case.rb +2 -2
- data/lib/eco/cli/config/default/workflow.rb +2 -4
- data/lib/eco/cli/scripting/args_helpers.rb +0 -2
- data/lib/eco/csv/table.rb +39 -3
- data/lib/eco/data/files/helpers.rb +4 -3
- data/lib/eco/data/hashes/array_diff.rb +21 -61
- data/lib/eco/data/hashes/diff_meta.rb +52 -0
- data/lib/eco/data/hashes/diff_result.rb +36 -25
- data/lib/eco/data/hashes.rb +1 -0
- data/lib/eco/data/locations/convert.rb +92 -0
- data/lib/eco/data/locations/dsl.rb +35 -0
- data/lib/eco/data/locations/node_base/builder.rb +26 -0
- data/lib/eco/data/locations/node_base/csv_convert.rb +57 -0
- data/lib/eco/data/locations/node_base/parsing.rb +30 -0
- data/lib/eco/data/locations/node_base/serial.rb +26 -0
- data/lib/eco/data/locations/node_base/tag_validations.rb +52 -0
- data/lib/eco/data/locations/node_base/treeify.rb +150 -0
- data/lib/eco/data/locations/node_base.rb +48 -0
- data/lib/eco/data/locations/node_diff/accessors.rb +46 -0
- data/lib/eco/data/locations/node_diff/nodes_diff.rb +90 -0
- data/lib/eco/data/locations/node_diff/selectors.rb +20 -0
- data/lib/eco/data/locations/node_diff.rb +55 -0
- data/lib/eco/data/locations/node_level/builder.rb +6 -0
- data/lib/eco/data/locations/node_level/cleaner.rb +74 -0
- data/lib/eco/data/locations/node_level/parsing.rb +63 -0
- data/lib/eco/data/locations/node_level/serial.rb +37 -0
- data/lib/eco/data/locations/node_level.rb +153 -0
- data/lib/eco/data/locations/node_plain/builder.rb +6 -0
- data/lib/eco/data/locations/node_plain/parsing.rb +36 -0
- data/lib/eco/data/locations/node_plain/serial.rb +14 -0
- data/lib/eco/data/locations/node_plain.rb +31 -0
- data/lib/eco/data/locations.rb +13 -0
- data/lib/eco/data.rb +1 -0
- data/lib/eco/language/auxiliar_logger.rb +9 -1
- data/lib/eco/language/basic_logger.rb +74 -0
- data/lib/eco/language.rb +2 -1
- data/lib/eco/version.rb +1 -1
- metadata +45 -8
- data/lib/eco/api/usecases/default_cases/new_id_case0.rb +0 -14
- data/lib/eco/api/usecases/graphql/helpers/locations/commands.rb +0 -4
- data/lib/eco/api/usecases/graphql/helpers/locations.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 444bec4cd18402a38eff718340932ca7d72c9959b865805964b0ec9787d94636
|
4
|
+
data.tar.gz: 97291544f70b525781d81f168ffc86c1d960151e53535a540ac1b7824b9eaf28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02360de987395d801aa1b1fb659dd4b6011c317a21058be33c3283b3a2856c69db519baf6eb85a022f7a2c7c4e826861b108c2cf09aefad3ca57b32d53b45c72
|
7
|
+
data.tar.gz: 402c880d701446c072f6534d4df35b2a104704dc79480e37e5033101df63a8b10baa25257911af1cc84994efe05744b15c608798dbc1637ad268811ca2d7d926
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,73 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
-
## [2.5.
|
4
|
+
## [2.5.5] - 2023-07-xx
|
5
|
+
|
6
|
+
### Added
|
7
|
+
### Changed
|
8
|
+
### Fixed
|
9
|
+
|
10
|
+
## [2.5.4] - 2023-07-27
|
11
|
+
|
12
|
+
### Added
|
13
|
+
- SFTP case helpers: `Eco::API::UseCases::GraphQL::Utils::Sftp`
|
14
|
+
- `Eco::Data::Locations::NodeDiff` and `Eco::Data::Locations::NodeDiff::NodeDiffs`
|
15
|
+
- Aim to identify changes in the locations structure
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
- Some internal tidy up in `Eco::API::UseCases::GraphQL`
|
19
|
+
|
20
|
+
## [2.5.3] - 2023-07-19
|
21
|
+
|
22
|
+
### Added
|
23
|
+
- _GraphQL base case_ for **locations structure update**.
|
24
|
+
- Refer to `Eco::API::UseCases::GraphQL::Samples::LocationCommands`
|
25
|
+
- See also `Eco::API::UseCases::GraphQL`. **Added** `Helpers` and `Samples`
|
26
|
+
- `Eco::Data::Locations` helpers
|
27
|
+
- **Converters**: it offers a `DSL` (see `Eco::Data::Locations::DSL`) manage as input/output:
|
28
|
+
1. CSV files with locations in two basic formats (list of nodes and hierarchy of locations)
|
29
|
+
2. This comes with integrity checkers to ensure the input data files are correct (warnings)
|
30
|
+
3. It also allows to convert to/from an organization locations structure and csv files.
|
31
|
+
- Making generic the helpers of `Eco::API::UseCases::DefaultCases::CsvToTree`
|
32
|
+
- The prospect is to move to the new/reviewed helpers at some stage (so remove the old helpers)
|
33
|
+
- This comes with a series of **converters** and **parsers** to allow two basic forms of input/output:
|
34
|
+
- CSV with list of nodes (`id`, `name`, `parent_id`)
|
35
|
+
- CSV of the actual tree (each column is one level of the tree)
|
36
|
+
- `Eco::API::Organization::TagTree` - **added/improved methods**
|
37
|
+
- **added** shortcuts: `parent_id`, `parent_name`
|
38
|
+
- **added** filters: `select`, `reject`
|
39
|
+
- **improved** `as_json`:
|
40
|
+
1. new parameter `include_children`
|
41
|
+
2. Hash keys | Header names to `HEADER` column
|
42
|
+
- **added** `as_nodes_json` to obtain a plain list (rather than hierarchical `as_json`)
|
43
|
+
- `Eco::CSV::Table`
|
44
|
+
- **added** `#add_index_column` to numerate the rows in a new column
|
45
|
+
- **improved** `#add_column` with new parameter `pos`
|
46
|
+
- **added** `#nil_blank_cells` and `#nil_blank_cells!`
|
47
|
+
- `Eco::Language::BasicLogger` brief extensible logger.
|
48
|
+
|
49
|
+
### Changed
|
50
|
+
- Refactored `Eco::API::Session::Logger` inheriting from `Eco::Language::BasicLogger`
|
51
|
+
|
52
|
+
### Fixed
|
53
|
+
- Live tree retrieval. Allow to specify locations structure `id`, `kargs` & `block`.
|
54
|
+
- `Eco::API::Session#live_tree` allow `id`, `kargs` & `block`, **fix** pass `include_archived`
|
55
|
+
- `Eco::API::Session::Config#live_tree` allow `id`, `kargs` & `block`
|
56
|
+
- When `id` is given, it uses `tagtree_config#live_tree_get`
|
57
|
+
- **fixed** neither `kargs` nor `include_archived` where defined
|
58
|
+
- `Eco::API::Session::Config::Tagtree` methods
|
59
|
+
- `#live_trees` allow `kargs`
|
60
|
+
- `#live_tree_get` **added**: it does not memoize
|
61
|
+
- `#live_tree` allow `id` and `kargs`
|
62
|
+
- **fixed** `include_archived` nodes should not be redirected to `live_trees` as in the latter this parameter has a different meaning (it refers to archived structures).
|
63
|
+
- **Important note**: the `ecoportal-api-graphql` gem, at the moment always retrieves archived nodes. This makes the `include_archived` argument non-functional. However, at some stage this will be changed and everything should be sorted out by then.
|
64
|
+
|
65
|
+
## [2.5.2] - 2023-06-23
|
5
66
|
|
6
67
|
### Added
|
7
68
|
- `Eco::API::Session::Config::Workflow#exit_handle`
|
8
69
|
- Allows to define a callback on `SystemExit` (`exit` call).
|
9
70
|
|
10
|
-
### Changed
|
11
71
|
### Fixed
|
12
72
|
- `Eco::API::Session::Config::Workflow` on `SystemExit` preserve original exit `status` value (i.e. `0`, `1`)
|
13
73
|
- It was changing an `exit 1` to be an `exit 0`
|
data/eco-helpers.gemspec
CHANGED
@@ -31,8 +31,8 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "redcarpet", ">= 3.5.1", "< 4"
|
32
32
|
|
33
33
|
spec.add_dependency 'ecoportal-api', '>= 0.9.4', '< 0.10'
|
34
|
-
spec.add_dependency 'ecoportal-api-v2', '>= 1.1.
|
35
|
-
spec.add_dependency 'ecoportal-api-graphql', '>= 0.3.
|
34
|
+
spec.add_dependency 'ecoportal-api-v2', '>= 1.1.3', '< 1.2'
|
35
|
+
spec.add_dependency 'ecoportal-api-graphql', '>= 0.3.8', '< 0.4'
|
36
36
|
spec.add_dependency 'aws-sdk-s3', '>= 1.83.0', '< 2'
|
37
37
|
spec.add_dependency 'aws-sdk-ses', '>= 1.36.0', '< 2'
|
38
38
|
spec.add_dependency 'dotenv', '>= 2.7.6', '< 3'
|
@@ -3,7 +3,6 @@ module Eco
|
|
3
3
|
module Common
|
4
4
|
module Loaders
|
5
5
|
class UseCase < Eco::API::Common::Loaders::CaseBase
|
6
|
-
|
7
6
|
class << self
|
8
7
|
# @return [Symbol] the `type` of usecase (i.e. `:sync`, `:transform`, `:import`, `:other`)
|
9
8
|
def type(value = nil)
|
@@ -34,7 +33,6 @@ module Eco
|
|
34
33
|
def type
|
35
34
|
self.class.type
|
36
35
|
end
|
37
|
-
|
38
36
|
end
|
39
37
|
end
|
40
38
|
end
|
@@ -2,7 +2,6 @@ module Eco
|
|
2
2
|
module API
|
3
3
|
module Common
|
4
4
|
module People
|
5
|
-
|
6
5
|
# @attr_reader direct_attrs [Array<String>] only those internal attributes present in the person entry that do **not** have an internal/external name mapping.
|
7
6
|
class PersonEntryAttributeMapper
|
8
7
|
@@cached_warnings = {}
|
@@ -266,7 +265,6 @@ module Eco
|
|
266
265
|
logger.fatal(msg)
|
267
266
|
raise msg
|
268
267
|
end
|
269
|
-
|
270
268
|
end
|
271
269
|
end
|
272
270
|
end
|
@@ -2,111 +2,56 @@ module Eco
|
|
2
2
|
module API
|
3
3
|
module Common
|
4
4
|
module Session
|
5
|
-
class Logger
|
6
|
-
|
5
|
+
class Logger < Eco::Language::BasicLogger
|
6
|
+
TIMESTAMP_PATTERN = '%Y-%m-%dT%H:%M:%S'
|
7
7
|
|
8
8
|
attr_reader :cache
|
9
9
|
|
10
|
-
def initialize(
|
10
|
+
def initialize(file_level: ::Logger::DEBUG, log_file: nil, enviro: nil, **kargs)
|
11
|
+
super(**kargs)
|
11
12
|
raise "Required Environment object (enviro:). Given: #{enviro}" if enviro && !enviro.is_a?(Eco::API::Common::Session::Environment)
|
12
13
|
@enviro = enviro
|
13
14
|
@cache = Logger::Cache.new
|
14
15
|
|
15
|
-
timestamp_console = fetch_timestamp_console(timestamp_console)
|
16
|
-
@console_logger = ::Logger.new(STDOUT).tap do |_logger|
|
17
|
-
_logger.formatter = proc do |severity, datetime, progname, msg|
|
18
|
-
str_timestamp = timestamp_console ? "#{datetime.strftime(DEFAULT_TIMESTAMP_PATTERN)} >" : ""
|
19
|
-
"#{severity.to_s[0]}: #{str_timestamp} #{msg}\n"
|
20
|
-
end
|
21
|
-
_logger.level = fetch_console_level(console_level)
|
22
|
-
end
|
23
|
-
|
24
16
|
if log_file = fetch_log_file(log_file)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
cache.add(severity, datetime, msg, formatted)
|
29
|
-
end
|
17
|
+
loggers[:file] = ::Logger.new(log_file).tap do |logger|
|
18
|
+
logger.formatter = format_proc(console: false) do |severity, datetime, msg, formatted_msg|
|
19
|
+
cache.add(severity, datetime, msg, formatted_msg)
|
30
20
|
end
|
31
|
-
|
21
|
+
logger.level = file_level
|
32
22
|
end
|
33
23
|
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def level=(value)
|
37
|
-
@console_logger.level = value
|
38
|
-
end
|
39
|
-
|
40
|
-
def debug(*args, &block)
|
41
|
-
log(:debug, *args, &block)
|
42
|
-
end
|
43
|
-
|
44
|
-
def info(*args, &block)
|
45
|
-
log(:info, *args, &block)
|
46
|
-
end
|
47
|
-
|
48
|
-
def warn(*args, &block)
|
49
|
-
return log(:warn, *args, &block)
|
50
|
-
end
|
51
|
-
|
52
|
-
def error(*args, &block)
|
53
|
-
return log(:error, *args, &block)
|
54
|
-
end
|
55
24
|
|
56
|
-
|
57
|
-
|
25
|
+
if_config(:timestamp_console) { |value| self.timestamp = value }
|
26
|
+
if_config(:console_level) { |value| self.level = value }
|
27
|
+
if_config(:file_level) { |value| self.file_level = value }
|
58
28
|
end
|
59
29
|
|
60
|
-
def
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
def << (msg)
|
65
|
-
@console_logger << msg unless !@console_logger
|
66
|
-
@file_logger << msg unless !@file_logger
|
67
|
-
end
|
68
|
-
|
69
|
-
def close()
|
70
|
-
@console_logger.close unless !@console_logger
|
71
|
-
@file_logger.close unless !@file_logger
|
72
|
-
end
|
73
|
-
|
74
|
-
def add(*args)
|
75
|
-
@console_logger.add(*args) unless !@console_logger
|
76
|
-
@file_logger.add(*args) unless !@file_logger
|
30
|
+
def file_level=(value)
|
31
|
+
loggers[:file]&.level = value
|
77
32
|
end
|
78
33
|
|
79
34
|
private
|
80
35
|
|
81
|
-
def
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
def config
|
87
|
-
@enviro.config || {}
|
88
|
-
end
|
89
|
-
|
90
|
-
def fetch_timestamp_console(value)
|
91
|
-
value || config.logger.timestamp_console
|
36
|
+
def config(attr)
|
37
|
+
return nil unless cnf = @enviro&.config&.logger
|
38
|
+
cnf.send(attr) if cnf.respond_to?(attr)
|
92
39
|
end
|
93
40
|
|
94
|
-
def
|
95
|
-
value
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
value || config.logger.file_level || ::Logger::DEBUG
|
41
|
+
def if_config(attr)
|
42
|
+
unless (value = config(attr)).nil?
|
43
|
+
yield(value) if block_given?
|
44
|
+
value
|
45
|
+
end
|
100
46
|
end
|
101
47
|
|
102
48
|
def fetch_log_file(log_file)
|
103
|
-
if log_file ||= config
|
49
|
+
if log_file ||= config(:file)
|
104
50
|
log_file = @enviro.file_manager.dir.file(log_file) if @enviro
|
105
51
|
FileManager.create_directory(log_file, includes_file: true)
|
106
52
|
end
|
107
53
|
log_file
|
108
54
|
end
|
109
|
-
|
110
55
|
end
|
111
56
|
end
|
112
57
|
end
|
@@ -2,7 +2,15 @@ module Eco
|
|
2
2
|
module API
|
3
3
|
module Organization
|
4
4
|
# Provides helpers to deal with tagtrees.
|
5
|
+
# @note that currenlty the parsing assumes top level to be array.
|
6
|
+
# This does not allow to capture the `name` and `id` of the locations
|
7
|
+
# structure itself into the json storing model.
|
5
8
|
class TagTree
|
9
|
+
HEADER = [
|
10
|
+
'id', 'name', 'weight', 'parent_id',
|
11
|
+
'archived', 'archived_token'
|
12
|
+
].freeze
|
13
|
+
|
6
14
|
attr_accessor :id
|
7
15
|
alias_method :tag, :id
|
8
16
|
attr_accessor :name, :weight
|
@@ -82,6 +90,27 @@ module Eco
|
|
82
90
|
all_nodes.each(&block)
|
83
91
|
end
|
84
92
|
|
93
|
+
# @note rejected nodes will not include their children nodes
|
94
|
+
# @return [Array<TagTree>] plain list of nodes
|
95
|
+
def select(when_is: true, &block)
|
96
|
+
raise ArgumentError, "Missing block" unless block_given?
|
97
|
+
[].tap do |out_nodes|
|
98
|
+
selected = false
|
99
|
+
selected = (yield(self) == when_is) unless top?
|
100
|
+
out_nodes.push(self) if selected
|
101
|
+
next unless selected || top?
|
102
|
+
nodes.each do |nd|
|
103
|
+
out_nodes.concat(nd.select(when_is: when_is, &block))
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# @note rejected nodes will not include their children nodes
|
109
|
+
# @return [Array<TagTree>] plain list of nodes
|
110
|
+
def reject(&block)
|
111
|
+
select(when_is: false, &block)
|
112
|
+
end
|
113
|
+
|
85
114
|
# All actual nodes of this tree
|
86
115
|
# @note order is that of the parent to child relationships
|
87
116
|
# @return [Array<TagTree>]
|
@@ -91,8 +120,8 @@ module Eco
|
|
91
120
|
out_nodes.push(self)
|
92
121
|
yield(self) if block_given?
|
93
122
|
end
|
94
|
-
nodes.each do |
|
95
|
-
out_nodes.concat(
|
123
|
+
nodes.each do |nd|
|
124
|
+
out_nodes.concat(nd.all_nodes(&block))
|
96
125
|
end
|
97
126
|
end
|
98
127
|
end
|
@@ -109,6 +138,16 @@ module Eco
|
|
109
138
|
end
|
110
139
|
end
|
111
140
|
|
141
|
+
# @return [String] the `id` of the parent (unless we are on a top level node)
|
142
|
+
def parent_id
|
143
|
+
parent.id unless parent.top?
|
144
|
+
end
|
145
|
+
|
146
|
+
# @return [String] the `name` of the parent (unless we are on a top level node)
|
147
|
+
def parent_name
|
148
|
+
parent.name unless parent.top?
|
149
|
+
end
|
150
|
+
|
112
151
|
# @return [Array] with the differences
|
113
152
|
def diff(tagtree, differences: {}, level: 0, **options)
|
114
153
|
require 'hashdiff'
|
@@ -119,22 +158,32 @@ module Eco
|
|
119
158
|
depth == -1
|
120
159
|
end
|
121
160
|
|
122
|
-
#
|
123
|
-
|
124
|
-
|
161
|
+
# Returns a tree of Hashes form nested via `nodes` (or just a list of hash nodes)
|
162
|
+
# @yield [node_json, node] block for custom output json model
|
163
|
+
# @yiledreturn [Hash] the custom json model.
|
164
|
+
# @include_children [Boolean] whether it should return a tree hash or just a list of hash nodes.
|
165
|
+
# @return [Array[Hash]] where `Hash` is a `node` (i.e. `{"tag" => TAG, "nodes": Array[Hash]}`)
|
166
|
+
def as_json(include_children: true, &block)
|
167
|
+
return [] if top? && !include_children
|
168
|
+
children_json = nodes.map {|nd| nd.as_json(include_children: true, &block)} if include_children
|
169
|
+
|
125
170
|
if top?
|
126
|
-
|
171
|
+
children_json
|
127
172
|
else
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
"nodes" => nodes_json
|
134
|
-
}
|
173
|
+
values = [id, name, weight, parent_id, archived, archived_token]
|
174
|
+
node_json = self.class::HEADER.zip(values).to_h
|
175
|
+
node_json["nodes"] = children_json if include_children
|
176
|
+
node_json = yield(node_json, self) if block_given?
|
177
|
+
node_json
|
135
178
|
end
|
136
179
|
end
|
137
180
|
|
181
|
+
# Returns a plain list form of hash nodes.
|
182
|
+
# @return [Array[Hash]] where `Hash` is a plain `node`
|
183
|
+
def as_nodes_json(&block)
|
184
|
+
all_nodes.map {|nd| nd.as_json(include_children: false, &block)}
|
185
|
+
end
|
186
|
+
|
138
187
|
# @return [Boolean] `true` if there are tags in the node, `false` otherwise.
|
139
188
|
def empty?
|
140
189
|
count <= 1
|
@@ -148,8 +197,8 @@ module Eco
|
|
148
197
|
# @return [Integer] the highest `depth` of all the children.
|
149
198
|
def total_depth
|
150
199
|
@total_depth ||= if has_children?
|
151
|
-
deepest_node = nodes.max_by do |
|
152
|
-
|
200
|
+
deepest_node = nodes.max_by do |nd|
|
201
|
+
nd.total_depth
|
153
202
|
end
|
154
203
|
deepest_node.total_depth
|
155
204
|
else
|
@@ -20,33 +20,55 @@ module Eco
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# Among all the locations structures it selects the one with more location nodes
|
23
|
-
|
23
|
+
# If `id` is provided, it only retrieves this locations structure.
|
24
|
+
def live_tree(id: nil, enviro: nil, include_archived: false, **kargs, &block)
|
24
25
|
return @live_tree if instance_variable_defined?(:@live_tree) && @live_tree.enviro == enviro
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
if id
|
27
|
+
args = {id: id, enviro: enviro, include_archived: include_archived}.merge(kargs)
|
28
|
+
@live_tree = live_tree_get(**args, &block)
|
29
|
+
else
|
30
|
+
# note that `include_archived` nodes is NOT the same as including archived structures
|
31
|
+
# => In `live_tree` the paramter refers to nodes
|
32
|
+
trees = live_trees(enviro: enviro, &block)
|
33
|
+
@live_tree = trees.reject do |tree|
|
34
|
+
tree.empty?
|
35
|
+
end.max do |a,b|
|
36
|
+
a.count <=> b.count
|
37
|
+
end
|
30
38
|
end.tap do |tree|
|
31
39
|
if tree
|
32
|
-
msg ="Using LIVE LOCATIONS Structure: '#{tree.name}' (#{tree.count} nodes)"
|
40
|
+
msg = "Using LIVE LOCATIONS Structure: '#{tree.name}' (#{tree.count} nodes)"
|
33
41
|
session_logger.info(msg)
|
34
42
|
end
|
35
43
|
end
|
36
44
|
end
|
37
45
|
|
46
|
+
# Gets a single locations structure
|
47
|
+
# @note it does not memoize
|
48
|
+
def live_tree_get(id: nil, enviro: nil, include_archived: false, **kargs, &block)
|
49
|
+
return nil unless apis.active_api.version_available?(:graphql)
|
50
|
+
return nil unless graphql = apis.api(version: :graphql)
|
51
|
+
#kargs = { includeArchived: include_archived }.merge(kargs).slice(:includeArchived)
|
52
|
+
# For now, this endpoint only accepts `id` as a parameter. It is pending to
|
53
|
+
# expose further parameters via query
|
54
|
+
return nil unless tree = graphql.currentOrganization.locationStructure(id: id, &block)
|
55
|
+
args = { enviro: enviro, id: tree.id, name: tree.name }
|
56
|
+
Eco::API::Organization::TagTree.new(tree.treeify, **args)
|
57
|
+
end
|
58
|
+
|
38
59
|
# Retrieves all the location structures of the organisation
|
39
|
-
def live_trees(enviro: nil, include_archived: false, &block)
|
60
|
+
def live_trees(enviro: nil, include_archived: false, **kargs, &block)
|
40
61
|
[].tap do |eco_trees|
|
41
62
|
next unless apis.active_api.version_available?(:graphql)
|
42
63
|
next unless graphql = apis.api(version: :graphql)
|
43
64
|
kargs = {
|
44
65
|
includeArchived: include_archived,
|
45
66
|
includeUnpublished: false
|
46
|
-
}
|
67
|
+
}.merge(kargs).slice(:includeArchived, :includeUnpublished)
|
68
|
+
|
47
69
|
next unless trees = graphql.currentOrganization.locationStructures(**kargs, &block)
|
48
70
|
trees.each do |tree|
|
49
|
-
args
|
71
|
+
args = { enviro: enviro, id: tree.id, name: tree.name }
|
50
72
|
eco_tree = Eco::API::Organization::TagTree.new(tree.treeify, **args)
|
51
73
|
eco_trees.push(eco_tree)
|
52
74
|
end
|
@@ -243,8 +243,12 @@ module Eco
|
|
243
243
|
# It obtains the first of the live tagtree in the org
|
244
244
|
# @note it requires graphql connection configuration parameters
|
245
245
|
# @return [Eco::API::Organization::TagTree]
|
246
|
-
def live_tree(enviro: nil)
|
247
|
-
|
246
|
+
def live_tree(id: nil, enviro: nil, **kargs, &block)
|
247
|
+
if id
|
248
|
+
tagtree_config.live_tree_get(id: id, enviro: enviro, **kargs, &block)
|
249
|
+
else
|
250
|
+
tagtree_config.live_tree(enviro: enviro, **kargs, &block)
|
251
|
+
end
|
248
252
|
end
|
249
253
|
|
250
254
|
# @return [Eco::API::Organization::PolicyGroups]
|
data/lib/eco/api/session.rb
CHANGED
@@ -45,8 +45,8 @@ module Eco
|
|
45
45
|
end
|
46
46
|
|
47
47
|
# @see Eco::API::Session::Config#live_tree
|
48
|
-
def live_tree(include_archived: false, &block)
|
49
|
-
config.live_tree(enviro: enviro, &block)
|
48
|
+
def live_tree(id: nil, include_archived: false, **kargs, &block)
|
49
|
+
config.live_tree(id: nil, include_archived: include_archived, enviro: enviro, **kargs, &block)
|
50
50
|
end
|
51
51
|
|
52
52
|
# @see Eco::API::Session::Config#schemas
|
@@ -2,11 +2,11 @@ class Eco::API::UseCases::DefaultCases::AbstractPolicyGroupAbilities < Eco::API:
|
|
2
2
|
name "abstract-policygroup-abilities"
|
3
3
|
type :export
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :people
|
6
6
|
|
7
7
|
def main(people, session, options, usecase)
|
8
8
|
options[:end_get] = false
|
9
|
-
@
|
9
|
+
@people = people
|
10
10
|
|
11
11
|
generate_csv!
|
12
12
|
end
|
@@ -157,5 +157,4 @@ class Eco::API::UseCases::DefaultCases::AbstractPolicyGroupAbilities < Eco::API:
|
|
157
157
|
def percent(num, total)
|
158
158
|
(100 * num.to_f / total).round(2)
|
159
159
|
end
|
160
|
-
|
161
160
|
end
|
@@ -2,11 +2,11 @@ class Eco::API::UseCases::DefaultCases::AnalysePeople < Eco::API::Common::Loader
|
|
2
2
|
name "analyse-people"
|
3
3
|
type :export
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :people
|
6
6
|
|
7
7
|
def main(people, session, options, usecase)
|
8
8
|
options[:end_get] = false
|
9
|
-
@
|
9
|
+
@people = people
|
10
10
|
|
11
11
|
case
|
12
12
|
when case_options[:identify_duplicates]
|
@@ -219,5 +219,4 @@ class Eco::API::UseCases::DefaultCases::AnalysePeople < Eco::API::Common::Loader
|
|
219
219
|
raise "Review your expression. Cannot recognize '#{part}' as part of '#{obj.class}'"
|
220
220
|
end
|
221
221
|
end
|
222
|
-
|
223
222
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Eco::API::UseCases::DefaultCases::ChangeEMailCase < Eco::API::Common::Loaders::UseCase
|
2
2
|
name "change-email"
|
3
3
|
type :sync
|
4
|
-
|
4
|
+
|
5
5
|
# Target people with non-up-to-date emails will be updated to the new email
|
6
6
|
def main(entries, people, session, options, usecase)
|
7
7
|
micro = session.micro
|
@@ -24,5 +24,4 @@ class Eco::API::UseCases::DefaultCases::ChangeEMailCase < Eco::API::Common::Load
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
28
27
|
end
|
@@ -13,11 +13,7 @@ class Eco::API::UseCases::DefaultCases::CleanUnknownTags < Eco::API::Common::Loa
|
|
13
13
|
"POLICY", "IDEA", "REPORTS"
|
14
14
|
]
|
15
15
|
|
16
|
-
attr_reader :session, :options
|
17
|
-
|
18
16
|
def main(people, session, options, usecase)
|
19
|
-
@session = session; @options = options
|
20
|
-
|
21
17
|
update = session.new_job("main", "update", :update, usecase)
|
22
18
|
people.each do |person|
|
23
19
|
unknown_tags = person.filter_tags.select {|tag| !tag?(tag)}
|
@@ -75,5 +71,4 @@ class Eco::API::UseCases::DefaultCases::CleanUnknownTags < Eco::API::Common::Loa
|
|
75
71
|
def clean_register_tags?
|
76
72
|
!options.dig(:usecase, :include_register_tags)
|
77
73
|
end
|
78
|
-
|
79
74
|
end
|
@@ -3,12 +3,12 @@ class Eco::API::UseCases::DefaultCases::ClearAbilitiesTransCase < Eco::API::Comm
|
|
3
3
|
type :transform
|
4
4
|
|
5
5
|
def main(people, session, options, usecase)
|
6
|
-
clear_abilities(people.users
|
6
|
+
clear_abilities(people.users)
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
|
-
def clear_abilities(users
|
11
|
+
def clear_abilities(users)
|
12
12
|
update = session.new_job("main", "clear-abilities", :update, usecase, :account)
|
13
13
|
users.each do |person|
|
14
14
|
person.account.permissions_custom = nil_abilities.dup
|
@@ -17,7 +17,6 @@ class Eco::API::UseCases::DefaultCases::CodesToTagsCase < Eco::API::Common::Load
|
|
17
17
|
|
18
18
|
def main(session, options, usecase)
|
19
19
|
options[:end_get] = false
|
20
|
-
@session = session; @options = options
|
21
20
|
codes_to_tags
|
22
21
|
end
|
23
22
|
|
@@ -26,26 +25,26 @@ class Eco::API::UseCases::DefaultCases::CodesToTagsCase < Eco::API::Common::Load
|
|
26
25
|
def to_tag(code)
|
27
26
|
if mapper.external?(code)
|
28
27
|
mapper.to_internal(code)
|
29
|
-
elsif
|
28
|
+
elsif session.tagtree.tag?(code)
|
30
29
|
code.upcase
|
31
30
|
else
|
32
|
-
|
31
|
+
logger.warn("Unknown Location Code: '#{code}'")
|
33
32
|
nil
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
37
36
|
def mapper
|
38
|
-
unless mapper ||=
|
37
|
+
unless mapper ||= session.config.location_codes && session.config.locations_mapper
|
39
38
|
raise "No filter_tags parser, nor location mappings are present"
|
40
39
|
end
|
41
40
|
end
|
42
41
|
|
43
42
|
def codes_column
|
44
|
-
@codes_column ||=
|
43
|
+
@codes_column ||= options.dig(:other, :file, :codes_column)
|
45
44
|
end
|
46
45
|
|
47
46
|
def input_file
|
48
|
-
@input_file
|
47
|
+
@input_file ||= options.dig(:other, :file, :name)
|
49
48
|
end
|
50
49
|
|
51
50
|
def output_file
|
@@ -55,5 +54,4 @@ class Eco::API::UseCases::DefaultCases::CodesToTagsCase < Eco::API::Common::Load
|
|
55
54
|
def clean_file_name(filename)
|
56
55
|
File.basename(filename).gsub(/\s/, "")
|
57
56
|
end
|
58
|
-
|
59
57
|
end
|