eco-helpers 2.5.10 → 2.6.0
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/.gitignore +2 -2
- data/CHANGELOG.md +64 -4
- data/eco-helpers.gemspec +20 -16
- data/lib/eco/api/common/loaders/base.rb +2 -9
- data/lib/eco/api/common/loaders/use_case.rb +27 -1
- data/lib/eco/api/common/people/default_parsers.rb +2 -2
- data/lib/eco/api/common/people/person_entry.rb +3 -0
- data/lib/eco/api/common/people/person_entry_attribute_mapper.rb +111 -16
- data/lib/eco/api/common/session/base_session.rb +4 -0
- data/lib/eco/api/common/session/environment.rb +4 -0
- data/lib/eco/api/common/session/sftp.rb +1 -1
- data/lib/eco/api/organization/tag_tree.rb +20 -23
- data/lib/eco/api/session/batch/job.rb +4 -4
- data/lib/eco/api/session/batch/jobs.rb +2 -2
- data/lib/eco/api/session/batch/jobs_groups.rb +2 -2
- data/lib/eco/api/session/config/files.rb +2 -2
- data/lib/eco/api/session/config/people.rb +2 -2
- data/lib/eco/api/session/config/sftp.rb +4 -0
- data/lib/eco/api/session/config/tagtree.rb +9 -8
- data/lib/eco/api/session/config/workflow.rb +3 -2
- data/lib/eco/api/session/config.rb +7 -0
- data/lib/eco/api/session.rb +17 -2
- data/lib/eco/api/usecases/cli/dsl.rb +84 -0
- data/lib/eco/api/usecases/cli/option.rb +19 -0
- data/lib/eco/api/usecases/cli.rb +13 -0
- data/lib/eco/api/usecases/default/locations/cli/tagtree_extract_cli.rb +24 -0
- data/lib/eco/api/usecases/{default_cases → default/locations}/codes_to_tags_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/locations}/create_tag_paths_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/locations}/csv_to_tree_case.rb +1 -1
- data/lib/eco/api/usecases/default/locations/tagtree_extract_case.rb +173 -0
- data/lib/eco/api/usecases/default/locations.rb +15 -0
- data/lib/eco/api/usecases/{default_cases → default/people}/analyse_people_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/change_email_case.rb +1 -1
- data/lib/eco/api/usecases/default/people/clean_unknown_tags_case.rb +66 -0
- data/lib/eco/api/usecases/{default_cases → default/people}/clear_abilities_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/org_data_convert_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/refresh_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/reinvite_sync_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/reinvite_trans_case.rb +1 -1
- data/lib/eco/api/usecases/default/people/reinvite_trans_cli.rb +5 -0
- data/lib/eco/api/usecases/{default_cases → default/people}/restore_db_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/set_default_tag_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/supers_cyclic_identify_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/supers_hierarchy_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/switch_supervisor_case.rb +1 -1
- data/lib/eco/api/usecases/{default_cases → default/people}/transfer_account_case.rb +1 -1
- data/lib/eco/api/usecases/default/people.rb +25 -0
- data/lib/eco/api/usecases/default.rb +16 -0
- data/lib/eco/api/usecases/default_cases/samples/cli/sftp_cli.rb +46 -0
- data/lib/eco/api/usecases/default_cases/samples/sftp_case.rb +21 -9
- data/lib/eco/api/usecases/default_cases.rb +2 -30
- data/lib/eco/api/usecases/graphql/utils/sftp.rb +1 -1
- data/lib/eco/api/usecases/use_case.rb +21 -7
- data/lib/eco/api/usecases/use_case_chain.rb +2 -2
- data/lib/eco/api/usecases.rb +4 -1
- data/lib/eco/assets.rb +1 -3
- data/lib/eco/cli/config/filters/people_filters.rb +0 -1
- data/lib/eco/cli/config/filters.rb +2 -6
- data/lib/eco/cli/config/help.rb +0 -1
- data/lib/eco/cli/config/input.rb +0 -1
- data/lib/eco/cli/config/options_set.rb +3 -4
- data/lib/eco/cli/config/use_cases.rb +13 -6
- data/lib/eco/cli/config.rb +4 -5
- data/lib/eco/cli/scripting/args_helpers.rb +1 -1
- data/lib/eco/cli/scripting/argument.rb +0 -1
- data/lib/eco/cli/scripting/arguments.rb +0 -2
- data/lib/eco/cli.rb +0 -1
- data/lib/eco/{cli/config/default → cli_default}/input_filters.rb +0 -1
- data/lib/eco/{cli/config/default → cli_default}/people_filters.rb +0 -1
- data/lib/eco/{cli/config/default → cli_default}/usecases.rb +2 -52
- data/lib/eco/{cli/config/default → cli_default}/workflow.rb +3 -2
- data/lib/eco/cli_default.rb +13 -0
- data/lib/eco/csv/table.rb +0 -1
- data/lib/eco/data/files/encoding.rb +1 -1
- data/lib/eco/data/files/helpers.rb +1 -1
- data/lib/eco/data/locations/convert.rb +8 -4
- data/lib/eco/data/locations/node_base/csv_convert.rb +4 -4
- data/lib/eco/data/mapper.rb +6 -1
- data/lib/eco/version.rb +1 -1
- metadata +156 -79
- data/lib/eco/api/usecases/default_cases/abstract_policygroup_abilities_case.rb +0 -160
- data/lib/eco/api/usecases/default_cases/append_usergroups_case.rb +0 -14
- data/lib/eco/api/usecases/default_cases/clean_unknown_tags_case.rb +0 -74
- data/lib/eco/api/usecases/default_cases/create_details_case.rb +0 -20
- data/lib/eco/api/usecases/default_cases/create_details_with_supervisor_case.rb +0 -21
- data/lib/eco/api/usecases/default_cases/email_as_id_case.rb +0 -12
- data/lib/eco/api/usecases/default_cases/new_email_case.rb +0 -13
- data/lib/eco/api/usecases/default_cases/new_id_case.rb +0 -12
- data/lib/eco/api/usecases/default_cases/remove_account_sync_case.rb +0 -10
- data/lib/eco/api/usecases/default_cases/remove_account_trans_case.rb +0 -16
- data/lib/eco/api/usecases/default_cases/reset_landing_page_case.rb +0 -18
- data/lib/eco/api/usecases/default_cases/set_supervisor_case.rb +0 -16
- data/lib/eco/api/usecases/default_cases/tagtree_case.rb +0 -42
- data/lib/eco/api/usecases/default_cases/update_details_case.rb +0 -15
- data/lib/eco/cli/config/default.rb +0 -16
- /data/lib/eco/{cli/config/default → cli_default}/input.rb +0 -0
- /data/lib/eco/{cli/config/default → cli_default}/options.rb +0 -0
- /data/lib/eco/{cli/config/default → cli_default}/people.rb +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 796d1fc03564d9e1bd9389954b164c7d8e1469793871191390824a6e32fabc67
|
|
4
|
+
data.tar.gz: 7d820fb01377374aca6059f8df28f9bb596c1fa023f7ebbfdc4f94d011e703a7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c89c374aa377818d82d85eba913ffb9392343276373fbca166b53471dc2c70cdd3caa29c7050b7f2547ff3191d5078848238b11a6fe3264171ffc968bb38afb1
|
|
7
|
+
data.tar.gz: 98f7acfa91c4dd78b2c63340b620a2be5d7407bd074a23ea6908594ac79e126e6e3b1b837e5391acbd64dda59978ca380089f9b8d0b513563ca0c345b1d2b59a
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,72 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
|
3
3
|
|
|
4
|
-
## [2.
|
|
4
|
+
## [2.6.1] - 2024-02-xx
|
|
5
|
+
|
|
6
|
+
### Added
|
|
7
|
+
### Changed
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## [2.6.0] - 2024-02-03
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- `Eco::API::UseCases::UseCase`
|
|
15
|
+
- added `#classed_definition` to expose the original class definition
|
|
16
|
+
- injected further parameter as instance variables to the original class definition on run-time.
|
|
17
|
+
- Expose `live_trees` retrieval:
|
|
18
|
+
- `Eco::API::Session#live_trees`
|
|
19
|
+
- `Eco::API::Session::Config#live_trees`
|
|
20
|
+
- Ability to CLI-integrate use cases and their options via class
|
|
21
|
+
- `Eco::API::UseCases::Cli`
|
|
22
|
+
- Added use case to extract live locations structure (`-export-tree`)
|
|
23
|
+
- `Eco::API::UseCases::GraphQL::Cases::TagtreeExtract`
|
|
24
|
+
- `#api?` method to check if an API version is available
|
|
25
|
+
- `Eco::API::Common::Session::Environment#api?`
|
|
26
|
+
- `Eco::API::Common::Session::BaseSession#api?`
|
|
27
|
+
- `Eco::API::Organization::TagTree#merge` the merge method for tagtrees
|
|
28
|
+
- It allows to have all structure nodes available to check if a tag belongs to them
|
|
29
|
+
- `Eco::API::Session::Config::Workflow`
|
|
30
|
+
- **added** `open` alias method for `for`
|
|
31
|
+
- `Eco::Data::Mapper#self_mapped?` to check if a value maps to itself
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
- upgrade `ecoportal-api-graphql`, `ecoportal-api-v2` and `ecoportal-api`
|
|
35
|
+
- `Eco::API::Session#tagtree`: added parameters to be able to obtain:
|
|
36
|
+
- `:live` live trees if graphql api is available on the enviro
|
|
37
|
+
- `:merge` to merge all live trees if there isn't just one
|
|
38
|
+
- Tagtree retrieval: remove `enviro` param where there's no caching
|
|
39
|
+
- Removed also from `Eco::API::Organization::TagTree::new`
|
|
40
|
+
- Removed some use cases:
|
|
41
|
+
- `Eco::API::UseCases::DefaultCases::AbstractPolicyGroupAbilities`
|
|
42
|
+
- `Eco::API::UseCases::DefaultCases::AppendUsergroupsCase`
|
|
43
|
+
- `Eco::API::UseCases::DefaultCases::CreateDetailsCase`
|
|
44
|
+
- `Eco::API::UseCases::DefaultCases::CreateDetailsWithSupervisorCase`
|
|
45
|
+
- `Eco::API::UseCases::DefaultCases::EmailAsIdCase`
|
|
46
|
+
- `Eco::API::UseCases::DefaultCases::NewIdCase`
|
|
47
|
+
- `Eco::API::UseCases::DefaultCases::RemoveAccountSyncCase`
|
|
48
|
+
- `Eco::API::UseCases::DefaultCases::RemoveAccountTransCase`
|
|
49
|
+
- `Eco::API::UseCases::DefaultCases::NewEmailCase`
|
|
50
|
+
- `Eco::API::UseCases::DefaultCases::SetSupervisorCase`
|
|
51
|
+
- `Eco::API::UseCases::DefaultCases::TagTree`
|
|
52
|
+
- `Eco::API::UseCases::DefaultCases::UpdateDetailsCase`
|
|
53
|
+
- `Eco::API::UseCases::DefaultCases::ResetLandingPageCase`
|
|
54
|
+
- Moved some default use cases to new namespace `Eco::API::UseCases::Default`
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
- Compatibility with `ruby 3`
|
|
58
|
+
- replaced `Proc.new` (with no block) by `block` in methods
|
|
59
|
+
- replaced `File#exists?` by `File#exist?`
|
|
60
|
+
- call to method's `super` not specifying args, no longer passes keyed/named args via simple splat `*` (but only double splat `**`)
|
|
61
|
+
- limit `nokogiri` gem to prev `1.16` (as it requires ruby 3 from thereon)
|
|
62
|
+
- `Eco::API::Common::People::PersonEntryAttributeMapper`
|
|
63
|
+
- `#aliased_attrs` was missing internal attrs that have been mapped directly as external attrs (same ext attr name as int attr name)
|
|
64
|
+
|
|
65
|
+
## [2.5.10] - 2023-11-22
|
|
5
66
|
|
|
6
|
-
### Added
|
|
7
|
-
### Changed
|
|
8
67
|
### Fixed
|
|
9
|
-
|
|
68
|
+
- `Eco::API::UseCases::DefaultCases::ReinviteSyncCase` remove unnecessary additional parameters on call.
|
|
69
|
+
- `Eco::API::Session::Config::SFTP#enviro_subpaths` provided that a current workaround can be skipped
|
|
10
70
|
|
|
11
71
|
## [2.5.9] - 2023-09-05
|
|
12
72
|
|
data/eco-helpers.gemspec
CHANGED
|
@@ -24,24 +24,28 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
#spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
25
25
|
spec.require_paths = ["lib"]
|
|
26
26
|
|
|
27
|
-
spec.add_development_dependency "bundler", ">= 2.4.
|
|
28
|
-
spec.add_development_dependency "rspec", ">= 3.
|
|
27
|
+
spec.add_development_dependency "bundler", ">= 2.4.12", "< 3"
|
|
28
|
+
spec.add_development_dependency "rspec", ">= 3.12.0", "< 4"
|
|
29
29
|
spec.add_development_dependency "rake", ">= 13.0.3", "< 14"
|
|
30
|
-
spec.add_development_dependency "yard", ">= 0.9.
|
|
31
|
-
spec.add_development_dependency "redcarpet", ">= 3.
|
|
30
|
+
spec.add_development_dependency "yard", ">= 0.9.34", "< 1"
|
|
31
|
+
spec.add_development_dependency "redcarpet", ">= 3.6.0", "< 4"
|
|
32
32
|
|
|
33
|
-
spec.add_dependency 'ecoportal-api',
|
|
34
|
-
spec.add_dependency 'ecoportal-api-v2',
|
|
35
|
-
spec.add_dependency 'ecoportal-api-graphql', '>= 0.3.
|
|
36
|
-
spec.add_dependency 'aws-sdk-s3', '>= 1.
|
|
37
|
-
spec.add_dependency 'aws-sdk-ses', '>= 1.
|
|
38
|
-
spec.add_dependency 'dotenv', '>= 2.
|
|
39
|
-
spec.add_dependency 'net-
|
|
40
|
-
spec.add_dependency '
|
|
33
|
+
spec.add_dependency 'ecoportal-api', '>= 0.9.6', '< 0.10'
|
|
34
|
+
spec.add_dependency 'ecoportal-api-v2', '>= 1.1.5', '< 1.2'
|
|
35
|
+
spec.add_dependency 'ecoportal-api-graphql', '>= 0.3.13', '< 0.4'
|
|
36
|
+
spec.add_dependency 'aws-sdk-s3', '>= 1.142.0', '< 2'
|
|
37
|
+
spec.add_dependency 'aws-sdk-ses', '>= 1.58.0', '< 2'
|
|
38
|
+
spec.add_dependency 'dotenv', '>= 2.8.1', '< 3'
|
|
39
|
+
spec.add_dependency 'net-ssh', '>= 7.2.1', '< 8'
|
|
40
|
+
spec.add_dependency 'net-sftp', '>= 4.0.0', '< 5'
|
|
41
|
+
spec.add_dependency 'hashdiff', '>= 1.1.0', '< 1.2'
|
|
41
42
|
spec.add_dependency 'fuzzy_match', '>= 2.1.0', '< 2.2'
|
|
42
|
-
spec.add_dependency 'amatch', '>= 0.4.
|
|
43
|
-
spec.add_dependency 'jaro_winkler', '>= 1.5.
|
|
44
|
-
spec.add_dependency '
|
|
43
|
+
spec.add_dependency 'amatch', '>= 0.4.1', '< 0.5'
|
|
44
|
+
spec.add_dependency 'jaro_winkler', '>= 1.5.6', '< 1.6'
|
|
45
|
+
spec.add_dependency 'nokogiri', '>= 1.13', '< 1.16'
|
|
46
|
+
spec.add_dependency 'roo', '>= 2.10.1', '< 2.11'
|
|
45
47
|
spec.add_dependency 'roo-xls', '>= 1.2.0', '< 1.3'
|
|
46
|
-
spec.add_dependency '
|
|
48
|
+
spec.add_dependency 'fast_excel', '>= 0.5.0', '< 0.6'
|
|
49
|
+
spec.add_dependency 'docx', '>= 0.8.0', '< 0.9'
|
|
50
|
+
spec.add_dependency 'rubyzip', '>= 2.3.2', '< 2.4'
|
|
47
51
|
end
|
|
@@ -30,10 +30,6 @@ module Eco
|
|
|
30
30
|
raise "You should implement this method"
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
def name
|
|
34
|
-
self.class.name
|
|
35
|
-
end
|
|
36
|
-
|
|
37
33
|
private
|
|
38
34
|
|
|
39
35
|
def session
|
|
@@ -54,11 +50,8 @@ module Eco
|
|
|
54
50
|
|
|
55
51
|
def abort(msg, raising: true)
|
|
56
52
|
logger.error(msg)
|
|
57
|
-
if raising
|
|
58
|
-
|
|
59
|
-
else
|
|
60
|
-
exit(1)
|
|
61
|
-
end
|
|
53
|
+
raise msg if raising
|
|
54
|
+
exit 1
|
|
62
55
|
end
|
|
63
56
|
end
|
|
64
57
|
end
|
|
@@ -11,9 +11,31 @@ module Eco
|
|
|
11
11
|
end
|
|
12
12
|
@type = value
|
|
13
13
|
end
|
|
14
|
+
|
|
15
|
+
def cli!
|
|
16
|
+
cli&.apply!
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def cli(cli_class = nil)
|
|
20
|
+
if cli_class.is_a?(Class)
|
|
21
|
+
raise ArgumentError, "cli_class should inherit from Eco::API::UseCases::Cli" unless cli_class < Eco::API::UseCases::Cli
|
|
22
|
+
@cli = cli_class
|
|
23
|
+
elsif cli_class.nil?
|
|
24
|
+
return @cli if instance_variable_defined?(:@cli) && !@cli.nil?
|
|
25
|
+
# try to see if it's namespaced after the use case it provisions cli integration
|
|
26
|
+
begin
|
|
27
|
+
try_class = [self.to_s, 'Cli'].join('::')
|
|
28
|
+
@cli = Kernel.const_get(try_class)
|
|
29
|
+
rescue NameError
|
|
30
|
+
nil
|
|
31
|
+
end
|
|
32
|
+
else
|
|
33
|
+
raise ArgumentError, "Expecting a class. Given: #{cli_class.class} object"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
14
36
|
end
|
|
15
37
|
|
|
16
|
-
inheritable_class_vars :type
|
|
38
|
+
inheritable_class_vars :type, :cli
|
|
17
39
|
|
|
18
40
|
def initialize(usecases)
|
|
19
41
|
raise "Expected Eco::API::UseCases. Given #{usecases.class}" unless usecases.is_a?(Eco::API::UseCases)
|
|
@@ -33,6 +55,10 @@ module Eco
|
|
|
33
55
|
def type
|
|
34
56
|
self.class.type
|
|
35
57
|
end
|
|
58
|
+
|
|
59
|
+
def cli_apply!
|
|
60
|
+
self.class.cli!
|
|
61
|
+
end
|
|
36
62
|
end
|
|
37
63
|
end
|
|
38
64
|
end
|
|
@@ -3,6 +3,7 @@ module Eco
|
|
|
3
3
|
module Common
|
|
4
4
|
module People
|
|
5
5
|
class PersonEntry
|
|
6
|
+
DEBUG = false
|
|
6
7
|
|
|
7
8
|
# This class is meant to provide a common interface to access entries of source data that come in different formats.
|
|
8
9
|
# @note
|
|
@@ -37,6 +38,8 @@ module Eco
|
|
|
37
38
|
@mapped_entry = __mapped_entry(@internal_entry)
|
|
38
39
|
@external_entry = __external_entry(@mapped_entry)
|
|
39
40
|
end
|
|
41
|
+
|
|
42
|
+
(print_models; exit(1)) if DEBUG
|
|
40
43
|
end
|
|
41
44
|
|
|
42
45
|
# Generates a new entry
|
|
@@ -4,6 +4,7 @@ module Eco
|
|
|
4
4
|
module People
|
|
5
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.
|
|
6
6
|
class PersonEntryAttributeMapper
|
|
7
|
+
DEBUG = false
|
|
7
8
|
@@cached_warnings = {}
|
|
8
9
|
|
|
9
10
|
attr_reader :aliased_attrs, :direct_attrs
|
|
@@ -182,22 +183,59 @@ module Eco
|
|
|
182
183
|
|
|
183
184
|
private
|
|
184
185
|
|
|
186
|
+
# Whether the maps include this `attr` as mapped to itself
|
|
187
|
+
def self_mapped_attr?(attr)
|
|
188
|
+
return false if !@attr_map
|
|
189
|
+
@attr_map.self_mapped?(attr)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Whether the maps include this `attr` as mapped from to some other or itself
|
|
193
|
+
def external_attr?(attr)
|
|
194
|
+
return false if !@attr_map
|
|
195
|
+
@attr_map.external?(attr)
|
|
196
|
+
end
|
|
197
|
+
|
|
185
198
|
# when parsing:
|
|
186
199
|
def init_attr_trackers
|
|
187
200
|
# (def) all internal attributes we can expect
|
|
188
201
|
def_all_attrs = @person_parser.all_model_attrs
|
|
189
202
|
# (def) internal attrs with no aliasing nor parser definition (expected to be direct)
|
|
190
203
|
def_unlinked = @person_parser.undefined_model_attrs.select { |attr| !to_external(attr) }
|
|
191
|
-
|
|
192
|
-
|
|
204
|
+
|
|
205
|
+
debug(
|
|
206
|
+
def_unlinked,
|
|
207
|
+
"(def_unlinked) expected to be direct (not parser defined nor aliased)"
|
|
208
|
+
)
|
|
209
|
+
|
|
193
210
|
# (data) data attributes (actual attributes of the entry)
|
|
194
211
|
data_attrs = attributes(@external_entry)
|
|
212
|
+
# (data) attributes of the data that COULD come directly as internal attribute names
|
|
213
|
+
# => WARNING: this includes ext direct attrs that may be aliased to other int attrs
|
|
214
|
+
data_direct_attrs_raw = data_attrs & def_all_attrs
|
|
215
|
+
# (data) direct (int) ext data attrs mapped
|
|
216
|
+
data_direct_mapped = data_direct_attrs_raw.select { |attr| external_attr?(attr) }
|
|
217
|
+
# (data) direct (int) ext data attrs mapped to themselves
|
|
218
|
+
data_direct_self_mapped = data_direct_attrs_raw.select { |attr| self_mapped_attr?(attr) }
|
|
219
|
+
# (data) direct (int) ext data attrs mapped only to another attr
|
|
220
|
+
data_direct_renamed = data_direct_mapped - data_direct_self_mapped
|
|
195
221
|
# (data) attributes of the data that come directly as internal attribute names
|
|
196
|
-
data_direct_attrs
|
|
222
|
+
data_direct_attrs = data_direct_attrs_raw - data_direct_renamed
|
|
223
|
+
|
|
224
|
+
debug(
|
|
225
|
+
data_direct_attrs,
|
|
226
|
+
"(data_direct_attrs) attributes of the data that come directly as internal attribute names (data_direct_attrs_raw - data_direct_renamed)"
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# (def) configured as alised (int <-> ext attrs) + accept/include int attrs as ext attrs
|
|
230
|
+
def_int_aliased_raw = def_all_attrs.select { |attr| to_external(attr) }
|
|
231
|
+
# (def) aliasable int attrs of the input data (excludes int attrs direct as ext attrs that got renamed)
|
|
232
|
+
def_int_aliased = def_int_aliased_raw - data_direct_renamed
|
|
233
|
+
# (def) ext attrs of the data's aliasable int attrs (def_int_aliased)
|
|
234
|
+
def_ext_alias = def_int_aliased.map { |attr| to_external(attr) }
|
|
235
|
+
# (def) those ext attrs that map to multiple int attrs
|
|
236
|
+
def_ext_multi_alias = def_ext_alias.detect { |attr| def_ext_alias.count(attr) > 1 }
|
|
237
|
+
# (def) those ext attrs that are direct, mapt to themselves and some other
|
|
197
238
|
|
|
198
|
-
# (def) configured as alised (internal <-> external attributes)
|
|
199
|
-
def_int_aliased = def_all_attrs.select { |attr| to_external(attr) }
|
|
200
|
-
def_ext_alias = def_int_aliased.map { |attr| to_external(attr) }
|
|
201
239
|
|
|
202
240
|
# (data) virtual attrs (external alias of non native internal attr in data):
|
|
203
241
|
data_vi_ext_alias = data_attrs.select do |attr|
|
|
@@ -210,27 +248,78 @@ module Eco
|
|
|
210
248
|
@attr_map.to_internal(attr)
|
|
211
249
|
end.compact
|
|
212
250
|
|
|
213
|
-
# (data) attrs that
|
|
251
|
+
# (data) int attrs that come aliased in the current data
|
|
214
252
|
# => modify aliased based on those that came directly as internal attrs in the entry
|
|
215
|
-
data_def_int_aliased = def_int_aliased - data_direct_attrs
|
|
253
|
+
data_def_int_aliased = (def_int_aliased - data_direct_attrs) | data_direct_self_mapped
|
|
216
254
|
data_def_ext_alias = data_def_int_aliased.map { |attr| to_external(attr) }
|
|
217
|
-
# (data)
|
|
255
|
+
# (data) ext attrs of the data that come aliased
|
|
218
256
|
data_ext_alias = data_def_ext_alias & data_attrs
|
|
257
|
+
# (data) all internal attributes that come aliased, with given the entry
|
|
258
|
+
aliased_attrs = data_def_int_aliased | data_vi_int_aliased
|
|
259
|
+
|
|
260
|
+
# render in the order that defines the model
|
|
261
|
+
@aliased_attrs = (def_all_attrs & aliased_attrs) | (aliased_attrs - def_all_attrs)
|
|
262
|
+
|
|
263
|
+
debug(
|
|
264
|
+
data_vi_int_aliased,
|
|
265
|
+
"(data_vi_int_aliased) virtual internal attrs (internal names of those virtual attrs)"
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
debug(
|
|
269
|
+
def_int_aliased,
|
|
270
|
+
"(def_int_aliased) aliasable int attrs of the input data (excludes int attrs direct as ext attrs that got renamed)"
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
debug(
|
|
274
|
+
def_ext_alias,
|
|
275
|
+
"(def_ext_alias) ext attrs of the data's aliasable int attrs (def_int_aliased)"
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
debug(
|
|
279
|
+
data_def_int_aliased,
|
|
280
|
+
"(data_def_int_aliased) int attrs that come aliased in the current data ((def_int_aliased - data_direct_attrs) | data_direct_self_mapped)"
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
debug(
|
|
284
|
+
data_ext_alias,
|
|
285
|
+
"(data_ext_alias) ext attrs of the data that come aliased (data_def_ext_alias & data_attrs)"
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
debug(
|
|
289
|
+
aliased_attrs,
|
|
290
|
+
"(aliased_attrs) all internal attributes that come aliased, with given the entry (data_def_int_aliased | data_vi_int_aliased)"
|
|
291
|
+
)
|
|
219
292
|
|
|
220
|
-
# (data) all internal attributes that could come aliased, with given the entry
|
|
221
|
-
@aliased_attrs = data_def_int_aliased + data_vi_int_aliased
|
|
222
293
|
# (data) all those ext attrs present that will require aliasing
|
|
223
294
|
#data_ext_alias_all = data_def_ext_alias + data_vi_ext_alias
|
|
224
|
-
data_ext_alias_all = data_ext_alias
|
|
295
|
+
data_ext_alias_all = data_ext_alias | data_vi_ext_alias
|
|
296
|
+
|
|
297
|
+
debug(
|
|
298
|
+
data_ext_alias_all,
|
|
299
|
+
"(data_ext_alias_all) all those ext attrs present that will require aliasing (data_ext_alias | data_vi_ext_alias)"
|
|
300
|
+
)
|
|
225
301
|
|
|
226
302
|
# those that are direct external to internal:
|
|
227
303
|
data_ext_direct = data_attrs - data_ext_alias_all
|
|
228
|
-
|
|
229
304
|
# (data) attributes that do not require aliasing
|
|
230
305
|
# to avoid collisions between internal names:
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
@
|
|
306
|
+
direct_attrs = data_ext_direct
|
|
307
|
+
# render in the order that defines the model
|
|
308
|
+
@direct_attrs = (def_all_attrs & direct_attrs) | (direct_attrs - def_all_attrs)
|
|
309
|
+
|
|
310
|
+
# (data) attributes that are being aliased
|
|
311
|
+
internal_attrs = @aliased_attrs | @direct_attrs
|
|
312
|
+
# render in the order that defines the model
|
|
313
|
+
@internal_attrs = (def_all_attrs & internal_attrs) | (internal_attrs - def_all_attrs)
|
|
314
|
+
|
|
315
|
+
debug(
|
|
316
|
+
@direct_attrs,
|
|
317
|
+
"(@direct_attrs) attributes that do not require aliasing (data_attrs - data_ext_alias_all)"
|
|
318
|
+
)
|
|
319
|
+
debug(
|
|
320
|
+
@internal_attrs,
|
|
321
|
+
"(@internal_attrs) aliased_attrs | @direct_attrs"
|
|
322
|
+
)
|
|
234
323
|
end
|
|
235
324
|
|
|
236
325
|
def attributes(value)
|
|
@@ -265,6 +354,12 @@ module Eco
|
|
|
265
354
|
logger.fatal(msg)
|
|
266
355
|
raise msg
|
|
267
356
|
end
|
|
357
|
+
|
|
358
|
+
def debug(var, msg)
|
|
359
|
+
return unless DEBUG
|
|
360
|
+
puts "\n • #{msg}:"
|
|
361
|
+
pp var
|
|
362
|
+
end
|
|
268
363
|
end
|
|
269
364
|
end
|
|
270
365
|
end
|
|
@@ -19,7 +19,6 @@ module Eco
|
|
|
19
19
|
attr_reader :parent
|
|
20
20
|
attr_reader :nodes, :children_count
|
|
21
21
|
attr_reader :depth, :path
|
|
22
|
-
attr_reader :enviro
|
|
23
22
|
|
|
24
23
|
attr_reader :source
|
|
25
24
|
|
|
@@ -35,7 +34,7 @@ module Eco
|
|
|
35
34
|
# ]}]
|
|
36
35
|
# tree = TagTree.new(tree.to_json)
|
|
37
36
|
# @param tagtree [String] representation of the tagtree in json.
|
|
38
|
-
def initialize(tagtree = [], name: nil, id: nil, depth: -1, path: [], parent: nil, _weight: nil
|
|
37
|
+
def initialize(tagtree = [], name: nil, id: nil, depth: -1, path: [], parent: nil, _weight: nil)
|
|
39
38
|
@depth = depth
|
|
40
39
|
@parent = parent
|
|
41
40
|
|
|
@@ -45,9 +44,7 @@ module Eco
|
|
|
45
44
|
else
|
|
46
45
|
@source = tagtree
|
|
47
46
|
end
|
|
48
|
-
|
|
49
|
-
fatal("Expecting Environment object. Given: #{enviro}") if enviro && !enviro.is_a?(API::Common::Session::Environment)
|
|
50
|
-
@enviro = enviro
|
|
47
|
+
raise ArgumentError, "You are trying to initialize a TagTree with a null tagtree" if !@source
|
|
51
48
|
|
|
52
49
|
if @source.is_a?(Array)
|
|
53
50
|
@id = id
|
|
@@ -66,7 +63,7 @@ module Eco
|
|
|
66
63
|
@path.push(@id) unless top?
|
|
67
64
|
|
|
68
65
|
@nodes = @raw_nodes.map.with_index do |cnode, idx|
|
|
69
|
-
|
|
66
|
+
self.class.new(cnode, depth: depth + 1, path: @path.dup, parent: self, _weight: idx)
|
|
70
67
|
end
|
|
71
68
|
|
|
72
69
|
init_hashes
|
|
@@ -80,11 +77,28 @@ module Eco
|
|
|
80
77
|
!archived?
|
|
81
78
|
end
|
|
82
79
|
|
|
80
|
+
# @note that archived nodes will also be passed over to the copy
|
|
83
81
|
# @return [Eco::API::Organization::TagTree]
|
|
84
82
|
def dup
|
|
85
83
|
self.class.new(as_json, name: name, id: id)
|
|
86
84
|
end
|
|
87
85
|
|
|
86
|
+
# @return [Array] with the differences
|
|
87
|
+
def diff(tagtree, differences: {}, level: 0, **options)
|
|
88
|
+
require 'hashdiff'
|
|
89
|
+
Hashdiff.diff(self.as_json, tagtree.as_json, **options.slice(:array_path, :similarity, :use_lcs))
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# It generates a merged tagtree out of two sources
|
|
93
|
+
# @note it merges the first level nodes (and their children) as it comes
|
|
94
|
+
# @return [Eco::API::Organization::TagTree] result of merging both trees
|
|
95
|
+
def merge(other)
|
|
96
|
+
raise ArgumentError, "Expecting Eco::API::Organization::TagTree. Given: #{other.class}" unless other.is_a?(Eco::API::Organization::TagTree)
|
|
97
|
+
mid = [self.id, other.id].join('|')
|
|
98
|
+
mname = [self.name, other.name].join('|')
|
|
99
|
+
self.class.new(as_json | other.as_json, id: mid, name: mname)
|
|
100
|
+
end
|
|
101
|
+
|
|
88
102
|
# @return [Eco::API::Organization::TagTree] with **non** `archived` nodes only
|
|
89
103
|
def active_tree
|
|
90
104
|
self.class.new(as_json(include_archived: false), name: name, id: id)
|
|
@@ -162,12 +176,6 @@ module Eco
|
|
|
162
176
|
parent.name unless parent.top?
|
|
163
177
|
end
|
|
164
178
|
|
|
165
|
-
# @return [Array] with the differences
|
|
166
|
-
def diff(tagtree, differences: {}, level: 0, **options)
|
|
167
|
-
require 'hashdiff'
|
|
168
|
-
Hashdiff.diff(self.as_json, tagtree.as_json, **options.slice(:array_path, :similarity, :use_lcs))
|
|
169
|
-
end
|
|
170
|
-
|
|
171
179
|
def top?
|
|
172
180
|
depth == -1
|
|
173
181
|
end
|
|
@@ -410,17 +418,6 @@ module Eco
|
|
|
410
418
|
h.merge(n.hash_paths)
|
|
411
419
|
end
|
|
412
420
|
end
|
|
413
|
-
|
|
414
|
-
def fatal(msg)
|
|
415
|
-
raise msg if !@enviro
|
|
416
|
-
@enviro.logger.fatal(msg)
|
|
417
|
-
raise msg
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
def warn(msg)
|
|
421
|
-
raise msg if !@enviro
|
|
422
|
-
@enviro.logger.warn(msg)
|
|
423
|
-
end
|
|
424
421
|
end
|
|
425
422
|
end
|
|
426
423
|
end
|
|
@@ -105,7 +105,7 @@ module Eco
|
|
|
105
105
|
unless unique && @queue_hash.key?(entry)
|
|
106
106
|
@queue_hash[entry] = true
|
|
107
107
|
@queue.push(entry)
|
|
108
|
-
@callbacks[entry] =
|
|
108
|
+
@callbacks[entry] = block if block_given?
|
|
109
109
|
end
|
|
110
110
|
end
|
|
111
111
|
end
|
|
@@ -230,13 +230,13 @@ module Eco
|
|
|
230
230
|
end.join("\n")
|
|
231
231
|
end
|
|
232
232
|
|
|
233
|
-
def as_update(data,
|
|
233
|
+
def as_update(data, **kargs)
|
|
234
234
|
if data.is_a?(Array)
|
|
235
235
|
data.map do |e|
|
|
236
|
-
feedback.as_update(e,
|
|
236
|
+
feedback.as_update(e, **kargs)
|
|
237
237
|
end.compact.select {|e| e && !e.empty?}
|
|
238
238
|
else
|
|
239
|
-
feedback.as_update(data,
|
|
239
|
+
feedback.as_update(data, **kargs)
|
|
240
240
|
end
|
|
241
241
|
end
|
|
242
242
|
|
|
@@ -74,10 +74,10 @@ module Eco
|
|
|
74
74
|
# @yieldparam job [Eco::API::Session::Batch::Job] the job we have launched against the server.
|
|
75
75
|
# @yieldparam status [Eco::API::Session::Batch::Status] the status of the batch job launch.
|
|
76
76
|
# @return [Eco::API::Session::Batch::Job]
|
|
77
|
-
def add(job)
|
|
77
|
+
def add(job, &block)
|
|
78
78
|
fatal "Expected Eco::API::Session::Batch::Job object. Given #{job.class}" unless job.is_a?(Eco::API::Session::Batch::Job)
|
|
79
79
|
@jobs[job.name] = job
|
|
80
|
-
@callbacks[job] =
|
|
80
|
+
@callbacks[job] = block if block_given?
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
def pending?
|
|
@@ -63,7 +63,7 @@ module Eco
|
|
|
63
63
|
# @yieldparam group [Eco::API::Session::Batch::Jobs] the group of jobs we have launched against the server.
|
|
64
64
|
# @yieldparam group_status [Hash<Eco::API::Session::Batch::Job, Eco::API::Session::Batch::Status>] the status of the launched batch jobs.
|
|
65
65
|
# @return [Eco::API::Session::Batch::Jobs] the group of jobs.
|
|
66
|
-
def new(name, order: :last)
|
|
66
|
+
def new(name, order: :last, &block)
|
|
67
67
|
fatal "Can't create job group named '#{name}' because it already exists." if exists?(name)
|
|
68
68
|
|
|
69
69
|
Batch::Jobs.new(enviro, name: name).tap do |group|
|
|
@@ -75,7 +75,7 @@ module Eco
|
|
|
75
75
|
@order.unshift(group)
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
-
@callbacks[group] =
|
|
78
|
+
@callbacks[group] = block if block_given?
|
|
79
79
|
end
|
|
80
80
|
end
|
|
81
81
|
|
|
@@ -26,9 +26,9 @@ module Eco
|
|
|
26
26
|
|
|
27
27
|
attr_key :timestamp_pattern
|
|
28
28
|
|
|
29
|
-
def add_validation(format)
|
|
29
|
+
def add_validation(format, &block)
|
|
30
30
|
raise "Block must be given" unless block_given?
|
|
31
|
-
@validations[format] =
|
|
31
|
+
@validations[format] = block
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
def validate(format, input)
|
|
@@ -48,9 +48,9 @@ module Eco
|
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
# with given a person what is the criteria of exclusion
|
|
51
|
-
def api_excluded
|
|
51
|
+
def api_excluded(&block)
|
|
52
52
|
return self["api_excluded"] unless block_given?
|
|
53
|
-
self["api_excluded"] =
|
|
53
|
+
self["api_excluded"] = block
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
# internal-external fields map
|