eco-helpers 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +3 -0
  4. data/README.md +20 -0
  5. data/eco-helpers.gemspec +34 -0
  6. data/lib/eco-helpers.rb +15 -0
  7. data/lib/eco/api.rb +13 -0
  8. data/lib/eco/api/common.rb +10 -0
  9. data/lib/eco/api/common/people.rb +17 -0
  10. data/lib/eco/api/common/people/base_parser.rb +16 -0
  11. data/lib/eco/api/common/people/default_parsers.rb +40 -0
  12. data/lib/eco/api/common/people/default_parsers/boolean_parser.rb +28 -0
  13. data/lib/eco/api/common/people/default_parsers/date_parser.rb +33 -0
  14. data/lib/eco/api/common/people/default_parsers/multi_parser.rb +33 -0
  15. data/lib/eco/api/common/people/default_parsers/numeric_parser.rb +23 -0
  16. data/lib/eco/api/common/people/default_parsers/select_parser.rb +29 -0
  17. data/lib/eco/api/common/people/entries.rb +120 -0
  18. data/lib/eco/api/common/people/person_entry.rb +380 -0
  19. data/lib/eco/api/common/people/person_factory.rb +114 -0
  20. data/lib/eco/api/common/people/person_modifier.rb +62 -0
  21. data/lib/eco/api/common/people/person_parser.rb +140 -0
  22. data/lib/eco/api/common/people/types.rb +47 -0
  23. data/lib/eco/api/common/session.rb +15 -0
  24. data/lib/eco/api/common/session/base_session.rb +46 -0
  25. data/lib/eco/api/common/session/environment.rb +47 -0
  26. data/lib/eco/api/common/session/file_manager.rb +90 -0
  27. data/lib/eco/api/common/session/logger.rb +105 -0
  28. data/lib/eco/api/common/session/mailer.rb +92 -0
  29. data/lib/eco/api/common/session/s3_uploader.rb +110 -0
  30. data/lib/eco/api/common/version_patches.rb +11 -0
  31. data/lib/eco/api/common/version_patches/external_person.rb +11 -0
  32. data/lib/eco/api/eco_faker.rb +59 -0
  33. data/lib/eco/api/organization.rb +13 -0
  34. data/lib/eco/api/organization/account.rb +23 -0
  35. data/lib/eco/api/organization/people.rb +118 -0
  36. data/lib/eco/api/organization/policy_groups.rb +51 -0
  37. data/lib/eco/api/organization/preferences.rb +28 -0
  38. data/lib/eco/api/organization/preferences_reference.json +23 -0
  39. data/lib/eco/api/organization/presets.rb +138 -0
  40. data/lib/eco/api/organization/presets_backup.rb +220 -0
  41. data/lib/eco/api/organization/presets_values.json +10 -0
  42. data/lib/eco/api/organization/tag_tree.rb +134 -0
  43. data/lib/eco/api/organization_old.rb +73 -0
  44. data/lib/eco/api/session.rb +180 -0
  45. data/lib/eco/api/session/batch.rb +132 -0
  46. data/lib/eco/api/session/batch_job.rb +152 -0
  47. data/lib/eco/api/session/batch_jobs.rb +131 -0
  48. data/lib/eco/api/session/batch_status.rb +138 -0
  49. data/lib/eco/api/session/task.rb +92 -0
  50. data/lib/eco/api/session_config.rb +179 -0
  51. data/lib/eco/api/session_config/api.rb +47 -0
  52. data/lib/eco/api/session_config/apis.rb +78 -0
  53. data/lib/eco/api/session_config/files.rb +30 -0
  54. data/lib/eco/api/session_config/logger.rb +54 -0
  55. data/lib/eco/api/session_config/mailer.rb +65 -0
  56. data/lib/eco/api/session_config/people.rb +89 -0
  57. data/lib/eco/api/session_config/s3_bucket.rb +62 -0
  58. data/lib/eco/api/session_config/use_cases.rb +30 -0
  59. data/lib/eco/api/usecases.rb +12 -0
  60. data/lib/eco/api/usecases/base_case.rb +14 -0
  61. data/lib/eco/api/usecases/case_data.rb +13 -0
  62. data/lib/eco/api/usecases/default_cases.rb +53 -0
  63. data/lib/eco/api/usecases/default_cases/change_email_case.rb +47 -0
  64. data/lib/eco/api/usecases/default_cases/create_details_case.rb +29 -0
  65. data/lib/eco/api/usecases/default_cases/create_details_with_supervisor_case.rb +49 -0
  66. data/lib/eco/api/usecases/default_cases/delete_case.rb +20 -0
  67. data/lib/eco/api/usecases/default_cases/email_as_id_case.rb +24 -0
  68. data/lib/eco/api/usecases/default_cases/hris_case.rb +67 -0
  69. data/lib/eco/api/usecases/default_cases/new_email_case.rb +26 -0
  70. data/lib/eco/api/usecases/default_cases/new_id_case.rb +26 -0
  71. data/lib/eco/api/usecases/default_cases/refresh_presets.rb +25 -0
  72. data/lib/eco/api/usecases/default_cases/reinvite_case.rb +22 -0
  73. data/lib/eco/api/usecases/default_cases/remove_account_case.rb +36 -0
  74. data/lib/eco/api/usecases/default_cases/reset_landing_page_case.rb +24 -0
  75. data/lib/eco/api/usecases/default_cases/set_default_tag_case.rb +44 -0
  76. data/lib/eco/api/usecases/default_cases/set_supervisor_case.rb +39 -0
  77. data/lib/eco/api/usecases/default_cases/to_csv_case.rb +36 -0
  78. data/lib/eco/api/usecases/default_cases/update_details_case.rb +30 -0
  79. data/lib/eco/api/usecases/default_cases/upsert_account_case.rb +35 -0
  80. data/lib/eco/api/usecases/use_case.rb +177 -0
  81. data/lib/eco/api/usecases/use_group.rb +104 -0
  82. data/lib/eco/cli.rb +9 -0
  83. data/lib/eco/cli/input.rb +109 -0
  84. data/lib/eco/cli/input_multi.rb +137 -0
  85. data/lib/eco/cli/root.rb +8 -0
  86. data/lib/eco/cli/session.rb +9 -0
  87. data/lib/eco/cli/session/batch.rb +9 -0
  88. data/lib/eco/common.rb +7 -0
  89. data/lib/eco/common/base_cli.rb +116 -0
  90. data/lib/eco/common/language.rb +9 -0
  91. data/lib/eco/data.rb +9 -0
  92. data/lib/eco/data/crypto.rb +7 -0
  93. data/lib/eco/data/crypto/encryption.rb +318 -0
  94. data/lib/eco/data/files.rb +10 -0
  95. data/lib/eco/data/files/directory.rb +93 -0
  96. data/lib/eco/data/files/file_pattern.rb +32 -0
  97. data/lib/eco/data/files/helpers.rb +90 -0
  98. data/lib/eco/data/mapper.rb +54 -0
  99. data/lib/eco/data/random.rb +10 -0
  100. data/lib/eco/data/random/distribution.rb +133 -0
  101. data/lib/eco/data/random/fake.rb +320 -0
  102. data/lib/eco/data/random/values.rb +80 -0
  103. data/lib/eco/language.rb +12 -0
  104. data/lib/eco/language/curry.rb +28 -0
  105. data/lib/eco/language/hash_transform.rb +68 -0
  106. data/lib/eco/language/hash_transform_modifier.rb +114 -0
  107. data/lib/eco/language/match.rb +30 -0
  108. data/lib/eco/language/match_modifier.rb +190 -0
  109. data/lib/eco/language/models.rb +11 -0
  110. data/lib/eco/language/models/attribute_parser.rb +38 -0
  111. data/lib/eco/language/models/collection.rb +181 -0
  112. data/lib/eco/language/models/modifier.rb +68 -0
  113. data/lib/eco/language/models/wrap.rb +114 -0
  114. data/lib/eco/language/values_at.rb +159 -0
  115. data/lib/eco/lexic/dictionary.rb +33 -0
  116. data/lib/eco/lexic/dictionary/dictionary.txt +355484 -0
  117. data/lib/eco/lexic/dictionary/tags.json +38 -0
  118. data/lib/eco/scripting.rb +30 -0
  119. data/lib/eco/scripting/README.md +11 -0
  120. data/lib/eco/scripting/arguments.rb +40 -0
  121. data/lib/eco/tester.rb +97 -0
  122. data/lib/eco/version.rb +3 -0
  123. metadata +325 -0
@@ -0,0 +1,62 @@
1
+ module Eco
2
+ module API
3
+ module Common
4
+ module People
5
+ class PersonModifier < Eco::Language::Models::Modifier
6
+
7
+ WITH_DETAILS = [:contact, :details, :with_details, :schema, :with_schema]
8
+ NO_DETAILS = [:no_details, :only_account]
9
+
10
+ WITH_ACCOUNT = [:user, :account, :with_account]
11
+ NO_ACCOUNT = [:no_account, :only_details]
12
+
13
+ INTERNAL_PERSON = [:internal, :v0]
14
+ EXTERNAL_PERSON = [:external, :v1]
15
+
16
+ def reset_add_account
17
+ self < self.mode - (WITH_ACCOUNT | NO_ACCOUNT)
18
+ end
19
+
20
+ def no_details
21
+ self.push(:no_details)
22
+ end
23
+
24
+ def add_account?
25
+ mode.any? { |m| WITH_ACCOUNT.include?(m) }
26
+ end
27
+
28
+ def no_account?
29
+ mode.any? { |m| NO_ACCOUNT.include?(m) }
30
+ end
31
+
32
+ def add_details?
33
+ mode.any? { |m| WITH_DETAILS.include?(m) }
34
+ end
35
+
36
+ def no_details?
37
+ mode.any? { |m| NO_DETAILS.include?(m) }
38
+ end
39
+
40
+ def internal?
41
+ bool = mode.any? { |m| INTERNAL_PERSON.include?(m) }
42
+ bool || !external?
43
+ end
44
+
45
+ def external?
46
+ mode.any? { |m| EXTERNAL_PERSON.include?(m) }
47
+ end
48
+
49
+ protected
50
+
51
+ def resolve_mode
52
+ modifiers = self.to_a
53
+ modifiers = resolve(modifiers, WITH_DETAILS | NO_DETAILS)
54
+ modifiers = resolve(modifiers, WITH_ACCOUNT | NO_ACCOUNT)
55
+ modifiers = resolve(modifiers, INTERNAL_PERSON | EXTERNAL_PERSON)
56
+ modifiers
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,140 @@
1
+ module Eco
2
+ module API
3
+ module Common
4
+ module People
5
+ class PersonParser
6
+ CORE_ATTRS = ["id", "external_id", "email", "name", "supervisor_id"]
7
+ ACCOUNT_ATTRS = ["policy_group_ids", "filter_tags", "default_tag"]
8
+ TYPE = [:select, :text, :date, :number, :phone_number, :boolean, :multiple]
9
+
10
+ attr_reader :schema
11
+ attr_reader :details_attrs, :all_attrs
12
+ attr_reader :defined_attrs
13
+
14
+ def initialize(schema: nil) #), logger: nil)
15
+ #self.schema = schema
16
+ raise "Constructor needs a PersonSchema. Given: #{schema}" if schema && !schema.is_a?(Ecoportal::API::V1::PersonSchema)
17
+ @details_attrs = []
18
+ @parsers = {}
19
+
20
+ if schema
21
+ @schema = Ecoportal::API::Internal::PersonSchema.new(JSON.parse(schema.doc.to_json))
22
+ @details_attrs = @schema&.fields.map { |fld| fld.alt_id }
23
+ end
24
+
25
+ @all_attrs = CORE_ATTRS + ACCOUNT_ATTRS + @details_attrs
26
+ #init_default_parsers if @schema
27
+ end
28
+
29
+ def target_attrs_core(source_attrs = nil)
30
+ return CORE_ATTRS if !source_attrs
31
+ scoped_attrs(source_attrs, CORE_ATTRS)
32
+ end
33
+
34
+ def target_attrs_details(source_attrs = nil)
35
+ return @details_attrs if ! source_attrs
36
+ scoped_attrs(source_attrs, @details_attrs)
37
+ end
38
+
39
+ def target_attrs_account(source_attrs = nil)
40
+ return ACCOUNT_ATTRS if !source_attrs
41
+ scoped_attrs(source_attrs, ACCOUNT_ATTRS)
42
+ end
43
+
44
+ def defined
45
+ @parsers.keys
46
+ end
47
+
48
+ def list
49
+ @parsers.keys
50
+ end
51
+
52
+ def defined_attrs
53
+ defined - (defined - all_attrs)
54
+ end
55
+
56
+ def undefined_attrs
57
+ all_attrs - defined_attrs
58
+ end
59
+
60
+ def defined?(attr)
61
+ !!@parsers[attr]
62
+ end
63
+
64
+ #def append(attr, dependencies: {}, &bloc)
65
+ # @parsers[attr] = into_a(parsers[attr]).push(define_parser(attr, dependencies, &bloc))
66
+ #end
67
+
68
+ # merges parser overriding self for exisint parsers
69
+ def merge(parser)
70
+ return self if !parser
71
+ raise "Expected a PersonParser object. Given #{parser}" if !parser.is_a?(PersonParser)
72
+ @parsers.merge!(parser.hash)
73
+ self
74
+ end
75
+
76
+ def define_attribute(attr, dependencies: {}, &bloc)
77
+ @parsers[attr] = define_parser(attr, dependencies, &bloc)
78
+ self
79
+ end
80
+
81
+ def parse(attr, source, deps: {})
82
+ raise "There is no parser for attribute '#{attr}'" if !self.defined?(attr)
83
+ @parsers[attr].parse(source, dependencies: deps)
84
+ end
85
+
86
+ def serialize(attr, object, deps: {})
87
+ raise "There is no parser for attribute '#{attr}'" if !self.defined?(attr)
88
+ @parsers[attr].serialize(object, dependencies: deps)
89
+ end
90
+
91
+ protected
92
+
93
+ def hash
94
+ @parsers
95
+ end
96
+
97
+ private
98
+
99
+ def scoped_attrs(source_attrs, section_attrs)
100
+ direct_attrs = source_attrs & section_attrs
101
+ parsed_attrs = @parsers.keys & section_attrs
102
+ (source_attrs + parsed_attrs) & (direct_attrs + parsed_attrs)
103
+ end
104
+
105
+ def define_parser(attr, dependencies = {}, &definition)
106
+ if !valid?(attr)
107
+ str_attr = (attr.is_a?(Symbol) ? ":" : "") + attr.to_s
108
+ msg = "The attribute '#{str_attr}' is not part of core, account or target schema, or does not match any type: #{@details_attrs}"
109
+ raise msg
110
+ end
111
+ parser = Eco::Language::Models::AttributeParser.new(attr, dependencies: dependencies)
112
+ #yield(parser)
113
+ definition.call(parser)
114
+ parser
115
+ end
116
+
117
+ def valid?(attr)
118
+ (attr.is_a?(Symbol) && valid_type?(attr)) ||
119
+ (attr.is_a?(String) && (!@schema || valid_attr?(attr)))
120
+ end
121
+
122
+ def valid_attr?(attr)
123
+ @all_attrs.include?(attr)
124
+ end
125
+
126
+ def valid_type?(attr)
127
+ TYPE.include?(attr)
128
+ end
129
+
130
+ def into_a(value)
131
+ value = [] if value == nil
132
+ value = [].push(value) unless value.is_a?(Array)
133
+ value
134
+ end
135
+
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,47 @@
1
+ module Eco
2
+ module API
3
+ module Common
4
+ module People
5
+
6
+ EAPI = Ecoportal::API
7
+ LAST = EAPI::V1
8
+ EXTERNAL = LAST
9
+ INTERNAL = EAPI::Internal
10
+ COMMON_API = EAPI::Common
11
+
12
+ def is_internal_person?(object)
13
+ object.is_a?(INTERNAL::Person)
14
+ end
15
+
16
+ def is_person?(object)
17
+ object.is_a?(EXTERNAL::Person)
18
+ end
19
+
20
+ def is_internal?(object)
21
+ object.is_a?(INTERNAL)
22
+ end
23
+
24
+ def is_external?(object)
25
+ object.is_a?(EXTERNAL)
26
+ end
27
+
28
+ def is_api?(object)
29
+ is_internal?(object) || is_external?(object)
30
+ end
31
+
32
+ def is_internal_people?(object)
33
+ object.is_a?(INTERNAL::People)
34
+ end
35
+
36
+ def is_people?(object)
37
+ object.is_a?(EXTERNAL::People)
38
+ end
39
+
40
+ def is_batch_operation(object)
41
+ object.is_a?(COMMON_API::BatchOperation)
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ module Eco
2
+ module API
3
+ module Common
4
+ module Session
5
+ end
6
+ end
7
+ end
8
+ end
9
+
10
+ require_relative 'session/logger'
11
+ require_relative 'session/mailer'
12
+ require_relative 'session/s3_uploader'
13
+ require_relative 'session/file_manager'
14
+ require_relative 'session/environment'
15
+ require_relative 'session/base_session'
@@ -0,0 +1,46 @@
1
+ module Eco
2
+ module API
3
+ module Common
4
+ module Session
5
+ class BaseSession
6
+
7
+ include Common::People
8
+
9
+ attr_accessor :environment, :config
10
+ alias_method :enviro, :environment
11
+ alias_method :enviro=, :environment=
12
+
13
+ attr_reader :api, :file_manager, :logger
14
+ alias_method :fm, :file_manager
15
+
16
+ def initialize(e)
17
+ e = Environment.new(e) if !e.is_a?(Environment)
18
+ self.environment = e if e.is_a?(Environment)
19
+ end
20
+
21
+ def environment=(value)
22
+ @environment = nil
23
+ @environment = value if value.is_a?(Environment)
24
+ end
25
+
26
+ def config
27
+ enviro.config
28
+ end
29
+
30
+ def api
31
+ enviro.api
32
+ end
33
+
34
+ def file_manager
35
+ enviro.file_manager
36
+ end
37
+
38
+ def logger
39
+ enviro.logger
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,47 @@
1
+ module Eco
2
+ module API
3
+ module Common
4
+ module Session
5
+ class Environment
6
+
7
+ include Common::People
8
+
9
+ attr_reader :config
10
+ attr_reader :api #, :host, :version
11
+ attr_reader :file_manager, :logger
12
+
13
+ alias_method :fm, :file_manager
14
+
15
+ def initialize(init = {})
16
+ init = init.conf if init.is_a?(Environment)
17
+ msg = "Wrong Session::Environment initializer. Expected Hash or Environment object. Given: #{init}"
18
+ raise msg unless init.is_a?(SessionConfig)
19
+
20
+ @config = init
21
+ @file_manager = Eco::API::Common::Session::FileManager.new(enviro: self)
22
+ @logger = Session::Logger.new(enviro: self)
23
+ new_api
24
+ end
25
+
26
+ def new_api
27
+ return nil unless config.apis.active_api
28
+
29
+ log_connection = config.logger.log_connection?
30
+ log = log_connection ? @logger : ::Logger.new(IO::NULL)
31
+
32
+ api = config.api(log)
33
+
34
+ unless log_connection
35
+ logger.info("Created connection pointing to '#{config.apis.active_api.host}'")
36
+ api.logger.level = ::Logger::UNKNOWN
37
+ end
38
+
39
+ @api = api
40
+ api
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,90 @@
1
+ module Eco
2
+ module API
3
+ module Common
4
+ module Session
5
+ class FileManager
6
+
7
+ include Eco::Data::Files
8
+
9
+ attr_reader :dir, :dir_path
10
+ attr_accessor :timestamp_pattern
11
+
12
+ def initialize(init = {}, enviro: nil)
13
+ @enviro = enviro
14
+ init = @enviro.config if @enviro && init.empty?
15
+ @timestamp_pattern = init.files.timestamp_pattern || DEFAULT_TIMESTAMP_PATTERN
16
+ self.dir_path = init.files.working_directory || Dir.pwd
17
+ end
18
+
19
+ def dir_path=(value)
20
+ begin
21
+ @dir = Eco::Data::Files::Directory.new(value)
22
+ @dir_path = @dir.create
23
+ rescue
24
+ logger.error("could not create or make any sense of directory '#{value}'")
25
+ end
26
+ end
27
+
28
+ def logger
29
+ @enviro&.logger || ::Logger.new(IO::NULL)
30
+ end
31
+
32
+ ##### FILE #####
33
+ def file(filename, should_exist: false)
34
+ dir.file(filename, should_exist: should_exit)
35
+ end
36
+
37
+ def newest(filename)
38
+ dir.newest_file(file: filename)
39
+ end
40
+
41
+ def file_content(filename)
42
+ file = dir.file(filename, should_exist: true)
43
+ if !file
44
+ logger.error("Can't read from file '#{filename}' because it does not exist.")
45
+ return nil
46
+ end
47
+ logger.debug("Reading from file '#{file}'")
48
+ File.read(file)
49
+ end
50
+
51
+ def load_json(filename)
52
+ content = file_content(filename)
53
+ return content && JSON.parse(content)
54
+ end
55
+
56
+ def touch(filename, modifier = :no_stamp, mode: :string)
57
+ save("", filename, modifier, mode: mode)
58
+ end
59
+
60
+ def save(content, filename, modifier = :no_stamp, mode: :string)
61
+ file = dir.file(filename)
62
+ file = FileManager.timestamp_file(file) if modifier == :timestamp
63
+ mode = (mode == :binary) ? 'wb' : 'w'
64
+
65
+ FileManager.create_directory(FileManager.file_fullpath(file))
66
+
67
+ logger.debug("Writting to file '#{file}'")
68
+ File.open(file, mode) { |fd| fd << content }
69
+ return file
70
+ end
71
+
72
+ def save_json(data, filename, modifier = :no_stamp)
73
+ return save(data.to_json, filename, modifier)
74
+ end
75
+
76
+ # if the file does not exist, it creates it
77
+ def append(content, filename, mode: :string)
78
+ file = dir.file(filename)
79
+ mode = (mode == :binary) ? 'ab' : 'a'
80
+
81
+ logger.debug("Appending to file '#{file}'")
82
+ File.open(file, mode) { |fd| fd << content + "\n" } # '\n' won't add line
83
+ return file
84
+ end
85
+
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end