lib/eco/api/common/people/entry_factory.rb in eco-helpers-2.0.18 vs lib/eco/api/common/people/entry_factory.rb in eco-helpers-2.0.19
- old
+ new
@@ -1,37 +1,52 @@
module Eco
module API
module Common
module People
+ # TODO: EntryFactory should suppport multiple schemas itself
+ # => currently, it's through session.entry_factory(schema: id), but this is wrong
+ # => This way, Entries and PersonEntry will be able to refer to attr_map and person_parser linked to schema_id
+ # => "schema_id" should be an optional column in the input file, or parsable via a custom parser to scope the schema
# Helper factory class to generate entries (input entries).
# @attr_reader schema [Ecoportal::API::V1::PersonSchema] person schema to be used in this entry factory
class EntryFactory < Eco::API::Common::Session::BaseSession
attr_reader :schema, :person_parser
# @param e [Eco::API::Common::Session::Environment] requires a session environment, as any child of `Eco::API::Common::Session::BaseSession`
# @param schema [Ecoportal::API::V1::PersonSchema] schema of person details that the parser will be based upon.
# @param person_parser [nil, Eco::API::Common::People::PersonParser] set of attribute, type and format parsers/serializers.
# @param attr_map [nil, Eco::Data::Mapper] attribute names mapper to translate external names into internal ones and _vice versa_.
- def initialize(e, schema:, person_parser: nil, attr_map: nil)
+ def initialize(e, schema:, person_parser: nil, default_parser: nil, attr_map: nil)
fatal "Constructor needs a PersonSchema. Given: #{schema}" if !schema.is_a?(Ecoportal::API::V1::PersonSchema)
fatal "Expecting PersonParser. Given: #{person_parser}" if person_parser && !person_parser.is_a?(Eco::API::Common::People::PersonParser)
fatal "Expecting Mapper object. Given: #{fields_mapper}" if attr_map && !attr_map.is_a?(Eco::Data::Mapper)
super(e)
@schema = Ecoportal::API::V1::PersonSchema.new(JSON.parse(schema.doc.to_json))
@source_person_parser = person_parser
# load default parser + custom parsers
- base_parser = Eco::API::Common::People::DefaultParsers.new(schema: @schema).merge(@source_person_parser)
+ @default_parser = default_parser&.new(schema: @schema) || Eco::API::Common::People::DefaultParsers.new(schema: @schema)
+ base_parser = @default_parser.merge(@source_person_parser)
# new parser with linked schema
@person_parser = @source_person_parser.new(schema: @schema).merge(base_parser)
@person_parser_patch_version = @source_person_parser.patch_version
-
@attr_map = attr_map
end
+ def newFactory(schema: nil)
+ self.class.new(
+ environment,
+ schema: schema,
+ person_parser: @source_person_parser,
+ default_parser: @default_parser,
+ attr_map: @attr_map
+ )
+ end
+
+
# provides with a Eco::API::Common::People::PersonParser object (collection of attribute parsers)
# @note if the custom person parser has changed, it updates the copy of this EntryFactory instance
# @return [Eco::API::Common::People::PersonParser] set of attribute, type and format parsers/serializers.
def person_parser
if @person_parser_patch_version < @source_person_parser.patch_version
@@ -41,11 +56,11 @@
@person_parser
end
# key method to generate objects of `PersonEntry` that share dependencies via this `EntryFactory` environment.
# @note this method is necessary to make the factory object work as a if it was a class `PersonEntry` you can call `new` on.
- # @param data [Array<Hash>] data to be parsed. The external hashed entry.
+ # @param data [Hash, Person] data to be parsed/serialized. Parsed: the external hashed entry. Serialized: a Person object.
# @return [Eco::API::Common::People::PersonEntry]
def new(data, dependencies: {})
PersonEntry.new(
data,
person_parser: person_parser,
@@ -102,27 +117,29 @@
# @param data [Eco::API::Organization::People] data to be parsed.
# @param file [String] absolute or relative path to the ouput file.
# @param format [Symbol] it specifies the format of the output `file:` (i.e. `:xml`, `:csv`). There must be a parser/serializer defined for it.
# @param encoding [String] optional parameter to geneate `file:` content by unsing certain encoding.
# @return [Void].
- def export(data:, file: "export", format: :csv, encoding: "utf-8")
+ def export(data:, file: "export", format: :csv, encoding: "utf-8", internal_names: false)
fatal("data: Expected Eco::API::Organization::People object. Given: #{data.class}") unless data.is_a?(Eco::API::Organization::People)
fatal("A file should be specified.") unless !file.to_s.strip.empty?
fatal("Format should be a Symbol. Given '#{format}'") if format && !format.is_a?(Symbol)
fatal("There is no parser/serializer for format ':#{format.to_s}'") unless @person_parser.defined?(format)
run = true
if Eco::API::Common::Session::FileManager.file_exists?(file)
- print "The file '#{file}' already exists. Do you want to overwrite it? (Y/n): "
- res = STDIN.gets.strip
- run = ["y", "Y", ""].include?(res)
+ prompt_user("The file '#{file}' already exists. Do you want to overwrite it? (Y/n):", default: "Y") do |response|
+ run = (response == "") || reponse.upcase.start_with?("Y")
+ end
end
if run
deps = {"supervisor_id" => {people: data}}
data_entries = data.map do |person|
- self.new(person, dependencies: deps).external_entry
+ self.new(person, dependencies: deps).yield_self do |entry|
+ internal_names ? entry.mapped_entry : entry.external_entry
+ end
end
File.open(file, "w", enconding: encoding) do |fd|
fd.write(person_parser.serialize(format, data_entries))
end