Class: Eco::API::Session

Inherits:
Common::Session::BaseSession show all
Defined in:
lib/eco/api/session.rb,
lib/eco/api/session/batch.rb,
lib/eco/api/session/config.rb,
lib/eco/api/session/batch/job.rb,
lib/eco/api/session/batch/jobs.rb,
lib/eco/api/session/config/api.rb,
lib/eco/api/session/config/apis.rb,
lib/eco/api/session/config/sftp.rb,
lib/eco/api/session/batch/errors.rb,
lib/eco/api/session/batch/status.rb,
lib/eco/api/session/config/files.rb,
lib/eco/api/session/config/logger.rb,
lib/eco/api/session/config/mailer.rb,
lib/eco/api/session/config/people.rb,
lib/eco/api/session/batch/feedback.rb,
lib/eco/api/session/batch/policies.rb,
lib/eco/api/session/config/tagtree.rb,
lib/eco/api/session/config/workflow.rb,
lib/eco/api/session/batch/base_policy.rb,
lib/eco/api/session/batch/jobs_groups.rb,
lib/eco/api/session/config/s3_storage.rb,
lib/eco/api/session/config/base_config.rb,
lib/eco/api/session/config/post_launch.rb,
lib/eco/api/session/batch/request_stats.rb

Overview

Class to manage the current session. Central helper of resources.

Defined Under Namespace

Classes: Batch, Config

Instance Attribute Summary

Attributes inherited from Common::Session::BaseSession

#api, #config, #environment, #file_manager, #logger, #session

Pure organization helpers collapse

People and Input entries helpers collapse

Session workflow and batch job launces collapse

Additional resources collapse

Instance Method Summary collapse

Methods inherited from Common::Session::BaseSession

#api?, #enviro=, #fatal, #fm, #mailer, #mailer?, #s3uploader, #s3uploader?, #sftp, #sftp?

Constructor Details

#initialize(init = {}) ⇒ Session

Returns a new instance of Session.

Parameters:



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/eco/api/session.rb', line 7

def initialize(init = {})
  e = init
  msg = "Expected object Eco::API::Session::Config or Eco::API::Common::Session::Environment. Given: #{init}"
  raise msg  unless e.is_a?(Session::Config) || e.is_a?(Eco::API::Common::Session::Environment)
  e = Eco::API::Common::Session::Environment.new(init, session: self) if !e.is_a?(Eco::API::Common::Session::Environment)
  super(e)

  @entry_factories  = {}
  @person_factories = {}

  logger.debug("LINE COMMAND: #{$0} #{ARGV.join(" ")}")
end

Instance Method Details

#batchEco::API::Session::Batch

Returns provides helper to launch batch operations.

Returns:



26
27
28
# File 'lib/eco/api/session.rb', line 26

def batch
  @batch  ||= Batch.new(enviro)
end

#csv_entries(file, **kargs) ⇒ Eco::API::Common::People::Entries

Generates an entries collection from a csv input file.

Parameters:

  • file (String)

    file to generate the entries from.

  • data (Array<Hash>)

    data to be parsed. It cannot be used alongside with file:

  • file (String)

    absolute or relative path to the input file. It cannot be used alongside with data:.

  • format (Symbol)

    it must be used when you use the option file: (i.e. :xml, :csv), as it specifies the format of the input file:.

  • options (Hash)

    further options.

Returns:

See Also:



183
184
185
186
187
188
189
# File 'lib/eco/api/session.rb', line 183

def csv_entries(file, **kargs)
  kargs.merge!({
    file: file,
    format: :csv
  })
  return entries(**kargs)
end

#discarded_entriesEco::API::Common::People::Entries

Note:

requires session.config.people.discarded_file to be defined.

Generates the collection of entries that should be discarded from an update.

Returns:



194
195
196
197
198
199
# File 'lib/eco/api/session.rb', line 194

def discarded_entries
  return @discarded_entries if instance_variable_defined?(:@discarded_entries)
  file = config.people.discarded_file
  fatal("You have not specified the 'discarded_people_file'") unless file = file_manager.dir.file(file)
  @discarded_entries = csv_entries(file)
end

#entries(*args, **kargs) ⇒ Eco::API::Common::People::Entries

Returns collection of entries.

Parameters:

  • data (Array<Hash>)

    data to be parsed. It cannot be used alongside with file:

  • file (String)

    absolute or relative path to the input file. It cannot be used alongside with data:.

  • format (Symbol)

    it must be used when you use the option file: (i.e. :xml, :csv), as it specifies the format of the input file:.

  • options (Hash)

    further options.

Returns:

See Also:



172
173
174
175
176
# File 'lib/eco/api/session.rb', line 172

def entries(*args, **kargs)
  entry_factory.entries(*args, **kargs).tap do |collection|
    logger.info("Loaded #{collection.length} input entries.")
  end
end

#entry_factory(schema: nil) ⇒ Eco::API::Common::People::EntryFactory

Helper to obtain a EntryFactory

Parameters:

  • schema (String, Ecoportal::API::V1::PersonSchema) (defaults to: nil)

    schema to which associate the EntryFactory, where String can be the name or the id of the schema.

Returns:



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/eco/api/session.rb', line 109

def entry_factory(schema: nil)
  schema = to_schema(schema) || self.schema
  return @entry_factories[schema&.id] if @entry_factories.key?(schema&.id)
  unless @entry_factories.empty?
    @entry_factories[schema&.id] = @entry_factories.values.first.newFactory(schema: schema)
    return @entry_factories[schema&.id]
  end

  @entry_factories[schema&.id] = Eco::API::Common::People::EntryFactory.new(
    enviro,
    schema:        schema,
    person_parser: config.people.parser,
    attr_map:      fields_mapper
  )
end

#enviro_nameObject



21
22
23
# File 'lib/eco/api/session.rb', line 21

def enviro_name
  config.active_enviro
end

#export(*args) ⇒ Object

Parameters:

  • data (Eco::API::Organization::People)

    data to be parsed.

  • file (String)

    absolute or relative path to the ouput file.

  • format (Symbol)

    it specifies the format of the output file: (i.e. :xml, :csv). There must be a parser/serializer defined for it.

  • encoding (String)

    optional parameter to geneate file: content by unsing certain encoding.

See Also:



151
152
153
# File 'lib/eco/api/session.rb', line 151

def export(*args)
  entry_factory.export(*args)
end

#fields_mapperEco::Data::Mapper

Returns the mappings between the internal and external attribute/property names.

Returns:

  • (Eco::Data::Mapper)

    the mappings between the internal and external attribute/property names.



95
96
97
98
99
100
101
102
# File 'lib/eco/api/session.rb', line 95

def fields_mapper
  return @fields_mapper if instance_variable_defined?(:@fields_mapper)
  mappings = []
  if map_file = config.people.fields_mapper
    mappings = map_file ? file_manager.load_json(map_file) : []
  end
  @fields_mapper = Eco::Data::Mapper.new(mappings)
end

#job_group(name, order: :last) ⇒ Eco::API::Session::Batch::Jobs

It retrives the group of Batch::Jobs named name. It creates it if it doesn't exist.



257
258
259
260
261
262
263
264
# File 'lib/eco/api/session.rb', line 257

def job_group(name, order: :last)
  case
  when job_groups.exists?(name)
    job_groups[name]
  else
    job_groups.new(name, order: order)
  end
end

#job_groupsEco::API::Session::Batch::JobsGroups



251
252
253
# File 'lib/eco/api/session.rb', line 251

def job_groups
  @job_groups ||= Batch::JobsGroups.new(enviro)
end

#jobs_launch(simulate: false) ⇒ Object



274
275
276
# File 'lib/eco/api/session.rb', line 274

def jobs_launch(simulate: false)
  job_groups.launch(simulate: simulate)
end

#live_tree(id: nil, include_archived: false, **kargs, &block) ⇒ Eco::API::Organization::TagTree



58
59
60
# File 'lib/eco/api/session.rb', line 58

def live_tree(id: nil, include_archived: false, **kargs, &block)
  config.live_tree(id: id, include_archived: include_archived, enviro: enviro, **kargs, &block)
end

#live_trees(include_archived: false, **kargs, &block) ⇒ Object



63
64
65
# File 'lib/eco/api/session.rb', line 63

def live_trees(include_archived: false, **kargs, &block)
  config.live_trees(include_archived: include_archived, **kargs, &block)
end

#login_providersObject



38
39
40
# File 'lib/eco/api/session.rb', line 38

def 
  config.
end

#mail(**kargs) ⇒ Object

Sends an email

Parameters:

  • to (String)

    destination email address

  • subject (String)

    subject of the email

  • body (String)

    html or plain text message

See Also:



289
290
291
292
293
294
295
296
# File 'lib/eco/api/session.rb', line 289

def mail(**kargs)
  if mailer?
    mailer.mail(**kargs)
  else
    logger.error("You are trying to use the mailer, but it's not configured")
    nil
  end
end

#microEco::API::MicroCases

Set of helpers to simplify your code

Returns:

See Also:



236
237
238
# File 'lib/eco/api/session.rb', line 236

def micro
  @micro    ||= Eco::API::MicroCases.new(enviro)
end

#new_entry(data, dependencies: {}) ⇒ Eco::API::Common::People::PersonEntry

Builds the entry for the given data.



165
166
167
# File 'lib/eco/api/session.rb', line 165

def new_entry(data, dependencies: {})
  entry_factory(schema: data&.details&.schema_id).new(data, dependencies: dependencies)
end

#new_job(group, name, type, usecase, sets = [:core, :details, :account], accept_update_with_no_id = false, &block) ⇒ Eco::API::Session::Batch::Job

Shortcut to create a job of certain type within a group



269
270
271
# File 'lib/eco/api/session.rb', line 269

def new_job(group, name, type, usecase, sets = [:core, :details, :account], accept_update_with_no_id = false, &block)
  job_group(group).new(name, usecase: usecase, type: type, sets: sets, accept_update_with_no_id: accept_update_with_no_id, &block)
end

#new_person(**keyed_args) ⇒ Ecoportal::API::Internal::Person

Parameters:

  • data (Hash, Person)

    data to be parsed/serialized. Parsed: the external hashed entry. Serialized: a Person object.

Returns:

  • (Ecoportal::API::Internal::Person)

See Also:



158
159
160
# File 'lib/eco/api/session.rb', line 158

def new_person(**keyed_args)
  person_factory.new(**keyed_args)
end

#parse_attribute(attr, source, phase = :internal, deps: {}) ⇒ Object

Note:

the use of these method requires to know which is the expected format of source

Allows to use the defined parsers

Parameters:

  • attr (String)

    type (Symbol) or attribute (String) to target a specific parser.

  • source (Any)

    source value to be parsed.

  • phase (Symbol) (defaults to: :internal)

    the phase when this parser should be active.

  • phase (Symbol) (defaults to: :internal)

    the phase when this parser should be active.

Returns:

  • (Object)

    the parsed attribute.



142
143
144
145
146
147
# File 'lib/eco/api/session.rb', line 142

def parse_attribute(attr, source, phase = :internal, deps: {})
  unless parsers = entry_factory.person_parser
    raise "There are no parsers defined"
  end
  parsers.parse(attr, source, phase, deps: deps)
end

#person_factory(schema: nil) ⇒ Eco::API::Common::People::PersonFactory

Helper to obtain a PersonFactory

Parameters:

  • schema (String, Ecoportal::API::V1::PersonSchema) (defaults to: nil)

    schema to which associate the PersonFactory, where String can be the name or the id of the schema.

Returns:



130
131
132
133
# File 'lib/eco/api/session.rb', line 130

def person_factory(schema: nil)
  schema = to_schema(schema) || self.schema
  @person_factories[schema&.id] ||= Eco::API::Common::People::PersonFactory.new(schema: schema)
end

#policiesEco::API::Policies

Note:
  • the default policies are added at the end (meaning they will run after the custom policies)

Does merge Eco::API::Policies::DefaultPolicies with the custom policies.

Returns:



226
227
228
229
230
231
# File 'lib/eco/api/session.rb', line 226

def policies
  @policies ||= config.policies.dup.tap do |policies|
    default_policies = Eco::API::Policies::DefaultPolicies.new
    policies.merge(default_policies)
  end
end

#policy_groupsObject



33
34
35
# File 'lib/eco/api/session.rb', line 33

def policy_groups
  config.policy_groups
end

#post_launchObject



240
241
242
# File 'lib/eco/api/session.rb', line 240

def post_launch
  @post_launch ||= config.post_launch.select(usecases)
end

#presets_factoryObject

Helper to state the abilities that a person should have with given their usergroups



90
91
92
# File 'lib/eco/api/session.rb', line 90

def presets_factory
  @presets_factory ||= Eco::API::Organization::PresetsFactory.new(enviro: enviro)
end

#process_case(name, io: nil, type: nil, **params) ⇒ Object

See Also:

  • UseCases::Case#launch


245
246
247
248
# File 'lib/eco/api/session.rb', line 245

def process_case(name, io: nil, type: nil, **params)
  args = { session: self }.merge(params)
  usecases.case(name, type: type).launch(io: io, **args)
end

#s3upload(content: nil, file: nil, directory: nil, recurse: false, link: false) ⇒ String+

Uploads content into a file, a file or a directory to S3

Parameters:

  • content (String) (defaults to: nil)

    content to be uploaded (requires file)

  • file (String) (defaults to: nil)

    name of the file to be uploaded

  • directory (String) (defaults to: nil)

    name of source directory to be uploaded

  • recurse (Boolean) (defaults to: false)

    used with directory: deepen in the folder structure? (false: default)

  • link (Boolean) (defaults to: false)

    return link(s) (true) or path(s) (false: default)

Returns:

  • (String, Array<String>)

    either paths to S3 objects if link is false, or link otherwise

See Also:



308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/eco/api/session.rb', line 308

def s3upload(content: nil, file: nil, directory: nil, recurse: false, link: false)
  if s3uploader?
    if content == :target
      path = micro.s3upload_targets
    elsif content && file
      path = s3uploader.upload(file, content)
    elsif file
      path = s3uploader.upload_file(file)
    elsif directory
      path = s3uploader.upload_directory(directory, recurse: recurse)
    else
      logger.error("To use Session.s3upload, you must specify either directory, file or content and file name")
    end
    return path unless link
    s3uploader.link(path)
  else
    logger.error("You are trying to use S3 uploader, but it's not configured")
    nil
  end
end

#schemaString, Ecoportal::API::V1::PersonSchema

Returns current active session's schema.

Returns:

  • (String, Ecoportal::API::V1::PersonSchema)

    current active session's schema



76
77
78
79
# File 'lib/eco/api/session.rb', line 76

def schema
  self.schema = config.people.default_schema || schemas.first unless @schema
  @schema
end

#schema=(value) ⇒ Object

Note:

observe that it is essential for the parsers/serialisers to identify target/present attributes.

Sets the current target PersonSchema of this session.

Parameters:

  • value (String, Ecoportal::API::V1::PersonSchema)

    where String can be the name or the id of the schema.



84
85
86
87
# File 'lib/eco/api/session.rb', line 84

def schema=(value)
  @schema = to_schema(value)
  self
end

#schemasObject



68
69
70
# File 'lib/eco/api/session.rb', line 68

def schemas
  config.schemas
end

#summaryObject



279
280
281
# File 'lib/eco/api/session.rb', line 279

def summary
  job_groups.summary
end

#tagtree(live: false, merge: false, include_archived: false, **kargs, &block) ⇒ Eco::API::Organization::TagTree

Parameters:

  • live (Boolean) (defaults to: false)

    states preference of live tree if available over file.

  • merge (Boolean) (defaults to: false)

    when in live mode, if mulitple trees, merge into one.

Returns:

See Also:



47
48
49
50
51
52
53
54
# File 'lib/eco/api/session.rb', line 47

def tagtree(live: false, merge: false, include_archived: false, **kargs, &block)
  if live && api?(version: :graphql)
    return live_tree(include_archived: include_archived, **kargs, &block) unless merge
    live_trees(include_archived: include_archived, **kargs, &block).inject(&:merge)
  else
    config.tagtree(enviro: enviro)
  end
end

#usecasesEco::API::UseCases

Note:
  • the order matters, as a default usecase can be redefined by a custom one with same name

Does merge Eco::API::UseCases::DefaultCases with the custom cases.

Returns:



215
216
217
218
219
220
# File 'lib/eco/api/session.rb', line 215

def usecases
  @usecases ||= config.usecases.dup.tap do |cases|
    all_cases = Eco::API::UseCases::DefaultCases.new.merge(config.usecases)
    cases.merge(all_cases)
  end
end

#workflow(io:) ⇒ Object

Opens up the workflow configuration



205
206
207
208
209
# File 'lib/eco/api/session.rb', line 205

def workflow(io:)
  config.workflow.tap do |wf|
    yield(wf, io) if block_given?
  end
end