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,10 @@
1
+ {
2
+ "files": [null, "download", "upload", "browse", "administrate"],
3
+ "data": [null, "view", "update", "administrate", "implement"],
4
+ "reports": [null, "view", "edit", "administrate"],
5
+ "organization": [null, "view", "administrate", "implement"],
6
+ "people": [null, "attach", "view", "view_private", "edit"],
7
+ "pages": [null, "view", "update", "create", "administrate"],
8
+ "page_editor": [null, "basic", "intermediate", "advanced", "implement"],
9
+ "registers": [null, "view", "dashboard", "administrate", "implement"]
10
+ }
@@ -0,0 +1,134 @@
1
+ module Eco
2
+ module API
3
+ module Organization
4
+
5
+ class TagTree
6
+ attr_reader :tag, :nodes
7
+ attr_reader :depth, :path
8
+
9
+ def initialize(tagtree = [], depth: -1, path: [], enviro: nil)
10
+ case tagtree
11
+ when String
12
+ @source = JSON.parse(tagtree)
13
+ else
14
+ @source = tagtree
15
+ end
16
+ fatal("You are trying to initialize a TagTree with a null tagtree") if !@source
17
+ fatal("Expecting Environment object. Given: #{enviro}") if enviro && !enviro.is_a?(API::Common::Session::Environment)
18
+ @enviro = enviro
19
+
20
+ @depth = depth
21
+ @tag = @source.is_a?(Array) ? nil : @source.dig('tag')&.upcase
22
+
23
+ @path = path || []
24
+ @path.push(@tag) unless !@tag
25
+
26
+ nodes = @source.is_a?(Array) ? @source : @source.dig('nodes') || []
27
+ @nodes = nodes.map {|node| TagTree.new(node, depth: @depth + 1, path: @path.dup, enviro: @enviro)}
28
+
29
+ init_hashes
30
+ end
31
+
32
+ def tags
33
+ @hash_tags.keys
34
+ end
35
+
36
+ def tag?(key)
37
+ @hash_tags.key?(key.upcase)
38
+ end
39
+
40
+ def get_node(key)
41
+ return nil unless tag?(key)
42
+ @hash_tags[key.upcase]
43
+ end
44
+
45
+ def filter_tags(list)
46
+ return [] unless list && list.is_a?(Array)
47
+ list.select {|str| tag?(str)}
48
+ end
49
+
50
+ def path(key = nil)
51
+ return @path if !key
52
+ @hash_paths[key.upcase]
53
+ end
54
+
55
+ def user_tags(initial: [], final: [], preserve_custom: true, add_custom: false)
56
+ initial ||= [initial].flatten.compact
57
+ final ||= [final].flatten.compact
58
+ raise "Expected Array for initial: and final:" unless initial.is_a?(Array) && final.is_a?(Array)
59
+ final = filter_tags(final) unless add_custom
60
+ custom = initial - filter_tags(initial)
61
+ final = final + custom if preserve_custom
62
+ new_tags = final - initial
63
+ # keep same order as they where
64
+ (initial & final) + new_tags
65
+ end
66
+
67
+ # take the deepest tag (the one that is further down in the tree)
68
+ # different options (several nodes at the same depth):
69
+ # => take the common node between them (i.e. you have Hamilton and Auckland -> take New Zealand)
70
+ # => if there's no common node between them, take the `first` (unless they are at top level of the tree)
71
+ def default_tag(*values)
72
+ values = filter_tags(values)
73
+ nodes = []; depth = -1
74
+ values.each do |tag|
75
+ raise("Couldn't find the node of #{tag} in the tag-tree definition") unless node = get_node(tag)
76
+
77
+ if node.depth > depth
78
+ nodes = [node]
79
+ depth = node.depth
80
+ elsif node.depth == depth
81
+ nodes.push(node)
82
+ end
83
+ end
84
+
85
+ default_tag = nil
86
+ if nodes.length > 1
87
+ common = nodes.reduce(self.tags.reverse) {|com, node| com & node.path.reverse}
88
+ default_tag = common.first if common.length > 0 && depth > 0
89
+ end
90
+ default_tag = nodes.first&.tag if !default_tag && depth > 0
91
+ default_tag
92
+ end
93
+
94
+ protected
95
+
96
+ def hash
97
+ @hash_tags
98
+ end
99
+
100
+ def hash_paths
101
+ @hash_paths
102
+ end
103
+
104
+ private
105
+
106
+ def init_hashes
107
+ @hash_tags = {}
108
+ @hash_tags[@tag] = self unless !@tag
109
+ @hash_tags = @nodes.reduce(@hash_tags) do |h,n|
110
+ h.merge(n.hash)
111
+ end
112
+ @hash_paths = {}
113
+ @hash_paths[@tag] = @path
114
+ @hash_paths = @nodes.reduce(@hash_paths) do |h,n|
115
+ h.merge(n.hash_paths)
116
+ end
117
+ end
118
+
119
+ def fatal(msg)
120
+ raise msg if !@enviro
121
+ @enviro.logger.fatal(msg)
122
+ exit
123
+ end
124
+
125
+ def warn(msg)
126
+ raise msg if !@enviro
127
+ @enviro.logger.warn(msg)
128
+ end
129
+
130
+ end
131
+
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,73 @@
1
+ module Eco
2
+ module API
3
+ #TODO move as part of API::Session and inherit from < API::Common::Session::BaseModel
4
+ #TODO boost autoconfiguration (via file <- FileManager.dir)
5
+ class Organization
6
+
7
+ DUMMY_USER_EXTERNAL_ID = 'dummy'
8
+
9
+ attr_reader :tag_tree, :policy_groups, :person_schemas
10
+ attr_reader :default_person, :default_schema, :default_schema_id
11
+ attr_reader :default_policy_group_ids, :default_filter_tags, :default_login_provider_ids
12
+ attr_reader :login_providers
13
+ attr_reader :account_presets, :account_preferences
14
+
15
+ def initialize(init = {})
16
+ api = init.fetch('api', nil)
17
+ @@api = api&.instance_of?(Ecoportal::API::Internal) && api
18
+ # todo: maps { 'policy_group' : 'preset'}
19
+ set_settings(init, override: true)
20
+ end
21
+
22
+ def set_settings(init = {}, override: false)
23
+ set_defaults(init)
24
+ @login_providers = init['login_providers'] || @@api&.login_providers&.to_a || \
25
+ @login_providers || [] if (!@login_providers || :override)
26
+ @tag_tree = init['tag_tree'] || @default_filter_tags || @tag_tree || [] if (!@tag_tree || :override)
27
+ @policy_groups = init['policy_groups'] || @@api&.policy_groups&.to_a || \
28
+ @policy_groups || [] if (!@policy_groups || :override)
29
+
30
+ @person_schemas = init['person_schemas'] || @@api&.person_schemas&.to_a || @person_schemas || \
31
+ [@default_schema] || [] if (!@person_schemas || :override)
32
+ end
33
+
34
+ def default_schema=(value)
35
+ @default_schema = value || @person_schemas&.first
36
+ self.default_schema_id = @default_schema&.id || @default_schema&.schema_id || @default_schema_id
37
+ end
38
+
39
+ def default_schema_id=(value)
40
+ @default_schema_id = value
41
+ end
42
+
43
+ private
44
+
45
+ def set_defaults(init = {})
46
+ @account_presets = Account::Presets.new(init.fetch('presets', nil))
47
+ @account_preferences = Account::Preferences.new
48
+
49
+ @default_person = get_default_person(init)
50
+ @default_policy_group_ids = init['default_policy_group_ids'] || @default_person&.account&.policy_group_ids || []
51
+ @default_filter_tags = init['default_filter_tags'] || @default_person&.account&.filter_tags || []
52
+ @default_login_provider_ids = init['default_login_provider_ids'] || @default_person&.account&.login_provider_ids || []
53
+ default_schema = get_schema_from_person(@default_person)
54
+ self.default_schema = init['default_schema'] || default_schema
55
+ end
56
+
57
+ def get_default_person(init = {})
58
+ return nil if !@@api
59
+ return init.fetch('default_person', (@@api && @@api.people.get(DUMMY_USER_EXTERNAL_ID)).result || nil)
60
+ end
61
+
62
+ def get_schema_from_person(person)
63
+ return nil if !person
64
+ doc = person.details.doc
65
+ doc['id'] = doc['schema_id']
66
+ doc.delete('schema_id')
67
+ schema = Ecoportal::API::Internal::PersonSchema.new(doc)
68
+ return schema
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,180 @@
1
+ module Eco
2
+ module API
3
+ class Session < Common::Session::BaseSession
4
+
5
+ attr_reader :batch, :policy_groups
6
+ attr_accessor :schema, :schemas_hash
7
+ attr_reader :tagtree
8
+ attr_reader :job_groups
9
+
10
+ #attr_reader :organization
11
+ #alias_method :org, :organization
12
+
13
+ def initialize(init = {})
14
+ super(init)
15
+ logger.debug("LINE COMMAND: #{$0} #{ARGV.join(" ")}")
16
+
17
+ @batch = Batch.new(enviro)
18
+ @task = Task.new(self, enviro)
19
+ @job_groups = JobGroups.new(session: self)
20
+
21
+ @use_cases = Eco::API::UseCases::DefaultCases.new.merge(config.usecases.use_group)
22
+
23
+ @schemas = api&.person_schemas.to_a
24
+ @schemas_hash = @schemas.map do |sch|
25
+ [[sch.id, sch], [sch.name.downcase, sch]]
26
+ end.flatten(1).to_h
27
+
28
+ self.schema = config.people.default_schema || @schemas.first
29
+ @policy_groups = nil
30
+
31
+ @tagtree = nil
32
+ if tree_file = config.dig('org', 'tagtree')
33
+ tree = file_manager.load_json(tree_file) unless !tree_file
34
+ @tagtree = Eco::API::Organization::TagTree.new(tree, enviro: enviro)
35
+ end
36
+
37
+ presets_custom_file = config.people.presets_custom
38
+ presets_map_file = config.people.presets_map
39
+
40
+ @presets_factory = Eco::API::Organization::PresetsFactory.new({
41
+ #policy_groups: @policy_groups,
42
+ presets_custom: file_manager.dir.file(presets_custom_file, should_exist: true),
43
+ presets_map: file_manager.dir.file(presets_map_file, should_exist: true),
44
+ enviro: enviro
45
+ })
46
+ end
47
+
48
+ def self.configure
49
+ #SessionConfig.new.tap
50
+ conf = SessionConfig.new
51
+ yield(conf) if block_given?
52
+ conf
53
+ end
54
+
55
+ def config
56
+ enviro.config
57
+ end
58
+
59
+ # TASKS & JOBS
60
+ def do
61
+ @task
62
+ end
63
+
64
+ def mail_to(**kargs)
65
+ @mailer ||= Eco::API::Common::Session::Mailer.new(enviro: enviro)
66
+ @mailer.mail(**kargs)
67
+ end
68
+
69
+ def s3upload(content: nil, file: nil, directory: nil)
70
+ @s3uploader ||= Eco::API::Common::Session::S3Uploader.new(enviro: enviro)
71
+ if content && file
72
+ @s3uploader.upload(file, content)
73
+ elsif file
74
+ @s3uploader.upload_file(file)
75
+ elsif directory
76
+ @s3uploader.upload_directory(directory)
77
+ else
78
+ logger.error("To use Session.s3upload, you must specify either directory, file or content and file name")
79
+ end
80
+ end
81
+
82
+ def job_group(name, order: :last)
83
+ case
84
+ when job_groups.exists?(name)
85
+ job_groups[name]
86
+ else
87
+ job_groups.new(name, order: order)
88
+ end
89
+ end
90
+
91
+ def jobs_launch(simulate: false)
92
+ job_groups.launch(simulate: simulate)
93
+ end
94
+
95
+ def policy_groups
96
+ @policy_groups ||= config.policy_groups
97
+ end
98
+
99
+ def schema=(value)
100
+ case value
101
+ when String
102
+ sch = @schemas_hash[value.downcase]
103
+ raise "The schema with id or name '#{value}' does not exist" if !sch
104
+ @schema = sch
105
+ when Ecoportal::API::V1::PersonSchema
106
+ @schema = value
107
+ else
108
+ logger.error("Session: Missuse of 'schema=' method. Given: #{value}")
109
+ return
110
+ end
111
+
112
+ @person_factory = Eco::API::Common::People::PersonFactory.new(schema: @schema)
113
+
114
+ fields_mapper_file = config.people.fields_mapper
115
+ fields_mapper = Eco::Data::Mapper.new(file_manager.load_json(fields_mapper_file))
116
+ @entry_factory = Eco::API::Common::People::EntryFactory.new({
117
+ schema: @schema,
118
+ person_parser: config.people.parser,
119
+ fields_mapper: fields_mapper,
120
+ logger: logger
121
+ })
122
+ end
123
+
124
+ def new_preset(input)
125
+ case input
126
+ when Ecoportal::API::Internal::Person
127
+ @presets_factory.new(*input&.account&.policy_group_ids)
128
+ when Array
129
+ @presets_factory.new(*input)
130
+ else
131
+ @presets_factory.new(input)
132
+ end
133
+ end
134
+
135
+ def new_person(**keyed_args)
136
+ @person_factory.new(**keyed_args)
137
+ end
138
+
139
+ def new_entry(data, dependencies: {})
140
+ @entry_factory.new(data, dependencies: dependencies)
141
+ end
142
+
143
+ def csv_entries(file)
144
+ rows = []
145
+ if Eco::API::Common::Session::FileManager.file_exists?(file)
146
+ CSV.foreach(file, headers: true, encoding: Eco::API::Common::Session::FileManager.encoding(file)).with_index do |row, i|
147
+ rows.push(row)
148
+ end
149
+ end
150
+ @entry_factory.entries(rows)
151
+ end
152
+
153
+ def discarded_entries
154
+ file = config.people.discarded_file
155
+ file = file_manager.dir.file(file)
156
+ csv_entries(file)
157
+ end
158
+
159
+ def process_case(name, type: nil, **params)
160
+ args = { session: self }.merge(params)
161
+ fatal("Undefined usecase '#{name}' of type '#{type.to_s}'") if !@use_cases.defined?(name, type: type)
162
+ @use_cases.case(name, type: type).process(**args)
163
+ end
164
+
165
+ private
166
+
167
+ def fatal(msg)
168
+ logger.fatal(msg)
169
+ raise msg
170
+ end
171
+
172
+ end
173
+ end
174
+ end
175
+
176
+ require_relative 'session/batch'
177
+ require_relative 'session/batch_status'
178
+ require_relative 'session/task'
179
+ require_relative 'session/batch_job'
180
+ require_relative 'session/batch_jobs'
@@ -0,0 +1,132 @@
1
+ module Eco
2
+ module API
3
+ class Session
4
+ # important! the handler should probably only create logs and save the update with same timestamp
5
+ class Batch < Common::Session::BaseSession
6
+
7
+ DEFAULT_BATCH_BLOCK = 100
8
+ VALID_METHODS = ['get', 'create', 'update', 'upsert', 'delete']
9
+
10
+ # people can be: empty, an api object, a people object, or an array with id's or persons
11
+ def get_people(people = nil, api: nil, params: {per_page: DEFAULT_BATCH_BLOCK})
12
+ api = api || self.api
13
+ return batch_from(people, 'get', api, params: params) if people.is_a?(Array)
14
+ return batch_get(api, params: params)
15
+ end
16
+
17
+ def launch(people = nil, method:, api: nil, params: {per_page: DEFAULT_BATCH_BLOCK})
18
+ if !valid_method?(method)
19
+ msg = "Invalid batch method: #{method}."
20
+ logger.fatal(msg)
21
+ raise msg
22
+ end
23
+ return nil if !people || !people.is_a?(Array)
24
+ batch_from(people, method, api || self.api, params: params)
25
+ end
26
+
27
+ def valid_methods
28
+ VALID_METHODS
29
+ end
30
+
31
+ def valid_method?(value)
32
+ VALID_METHODS.include?(value)
33
+ end
34
+
35
+
36
+ private
37
+
38
+ def new_status(queue, method)
39
+ BatchStatus.new(enviro, queue: queue, method: method)
40
+ end
41
+
42
+ def batch_get(api, params: {})
43
+ unless people_api = api&.people
44
+ msg = "cannot batch get without api connnection, please provide a valid api connection!"
45
+ logger.fatal(msg)
46
+ raise msg
47
+ end
48
+
49
+ params = {per_page: DEFAULT_BATCH_BLOCK}.merge(params)
50
+ client = people_api.client
51
+ people = [];
52
+ if (page = params.fetch(:page, false))
53
+ res, response = get(client, params: params)
54
+ people +=res
55
+ logger.info("page number: #{page}, got num people #{people.length}")
56
+ else
57
+ page = 1
58
+ loop do
59
+ params = params.merge({page: page})
60
+ people_res, response = get(client, params: params)
61
+ people += people_res
62
+
63
+ total_pages = response.body["total_pages"]
64
+ logger.info("page number: #{page}/#{total_pages}, got num people #{people_res.length}, with total #{people.length} people got")
65
+ break if page >= total_pages
66
+ page += 1
67
+ end
68
+ end
69
+ return people
70
+ end
71
+
72
+ def get(client, params:)
73
+ response = client.get("/people", params: params)
74
+ unless response.success?
75
+ msg = "Request failed - params: #{params}"
76
+ msg += "\n Error message: - Status #{response.status}: #{response.body}"
77
+ logger.fatal(msg)
78
+ raise msg
79
+ end
80
+ people = []
81
+ response.body["results"].each do |person_hash|
82
+ person = INTERNAL::Person.new(person_hash)
83
+ yield person if block_given?
84
+ people.push(person)
85
+ end
86
+ [people, response]
87
+ end
88
+
89
+ def batch_from(people, method, api, params: {})
90
+ return nil if !people || !people.is_a?(Array)
91
+ unless people_api = api&.people
92
+ msg = "cannot batch #{method} without api connnection, please provide a valid api connection!"
93
+ logger.fatal(msg)
94
+ raise msg
95
+ end
96
+
97
+ # batch Status
98
+ status = new_status(people, method)
99
+
100
+ # param q does not make sense here, even for GET method
101
+ params = {per_page: DEFAULT_BATCH_BLOCK}.merge(params)
102
+ per_page = params.fetch(:per_page)
103
+
104
+ iteration = 1; done = 0
105
+
106
+ people.each_slice(per_page) do |slice|
107
+ msg = "starting batch '#{method}' iteration #{iteration}, which has #{slice.length} entries of #{people.length} -- #{done} done"
108
+ logger.info(msg)
109
+
110
+ people_api.batch do |batch|
111
+ slice.each do |person|
112
+ # valid method checked before
113
+ batch.public_send(method, person) do |response|
114
+ status[person] = response
115
+ #status.print_error(person)
116
+ end # current person
117
+ end # next person
118
+ end # next batch
119
+
120
+ iteration += 1
121
+ done += slice.length
122
+ end # next slice
123
+
124
+ status.print_errors
125
+
126
+ return status
127
+ end
128
+
129
+ end
130
+ end
131
+ end
132
+ end