ecoportal-api 0.10.8 → 0.10.9
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/CHANGELOG.md +19 -2
- data/lib/ecoportal/api/common/base_class.rb +11 -12
- data/lib/ecoportal/api/common/base_model.rb +3 -3
- data/lib/ecoportal/api/common/batch_operation.rb +10 -10
- data/lib/ecoportal/api/common/batch_response.rb +1 -1
- data/lib/ecoportal/api/common/client/elastic_apm_integration.rb +9 -9
- data/lib/ecoportal/api/common/client/error/checks.rb +1 -1
- data/lib/ecoportal/api/common/client/with_retry.rb +1 -1
- data/lib/ecoportal/api/common/client.rb +13 -13
- data/lib/ecoportal/api/common/doc_helpers.rb +7 -6
- data/lib/ecoportal/api/common/hash_diff.rb +8 -5
- data/lib/ecoportal/api/common/logging.rb +1 -0
- data/lib/ecoportal/api/common/response.rb +1 -1
- data/lib/ecoportal/api/common/wrapped_response.rb +1 -1
- data/lib/ecoportal/api/internal/account.rb +18 -18
- data/lib/ecoportal/api/internal/people.rb +1 -1
- data/lib/ecoportal/api/internal/person.rb +24 -18
- data/lib/ecoportal/api/internal/person_details.rb +1 -1
- data/lib/ecoportal/api/internal/person_schema.rb +1 -1
- data/lib/ecoportal/api/internal/person_schemas.rb +1 -1
- data/lib/ecoportal/api/internal/policy_groups.rb +3 -2
- data/lib/ecoportal/api/internal/preferences.rb +13 -10
- data/lib/ecoportal/api/internal.rb +5 -5
- data/lib/ecoportal/api/logger.rb +8 -7
- data/lib/ecoportal/api/v1/job/awaiter/timer.rb +1 -0
- data/lib/ecoportal/api/v1/job/status.rb +2 -2
- data/lib/ecoportal/api/v1/job.rb +4 -4
- data/lib/ecoportal/api/v1/people.rb +12 -10
- data/lib/ecoportal/api/v1/person.rb +27 -15
- data/lib/ecoportal/api/v1/person_details.rb +7 -7
- data/lib/ecoportal/api/v1/person_schema.rb +5 -4
- data/lib/ecoportal/api/v1/person_schemas.rb +9 -6
- data/lib/ecoportal/api/v1/schema_field.rb +8 -8
- data/lib/ecoportal/api/v1/schema_field_value.rb +15 -15
- data/lib/ecoportal/api/v1.rb +4 -4
- data/lib/ecoportal/api/version.rb +1 -1
- data/lib/ecoportal/api.rb +9 -9
- metadata +2 -2
| @@ -15,13 +15,14 @@ module Ecoportal | |
| 15 15 |  | 
| 16 16 | 
             
                    # Gets all the policy groups via api request.
         | 
| 17 17 | 
             
                    # @return [Enumerable<PolicyGroup>] an `Enumerable` with all the policy groups already wrapped as `PolicyGroup` objects.
         | 
| 18 | 
            -
                    def get_all
         | 
| 19 | 
            -
                      response = client.get( | 
| 18 | 
            +
                    def get_all # rubocop:disable Naming/AccessorMethodName
         | 
| 19 | 
            +
                      response = client.get('/policy_groups')
         | 
| 20 20 | 
             
                      Common::WrappedResponse.new(response, Internal::PolicyGroup)
         | 
| 21 21 | 
             
                    end
         | 
| 22 22 |  | 
| 23 23 | 
             
                    def each(&block)
         | 
| 24 24 | 
             
                      return to_enum(:each) unless block
         | 
| 25 | 
            +
             | 
| 25 26 | 
             
                      get_all.each(&block)
         | 
| 26 27 | 
             
                    end
         | 
| 27 28 | 
             
                  end
         | 
| @@ -2,17 +2,19 @@ module Ecoportal | |
| 2 2 | 
             
              module API
         | 
| 3 3 | 
             
                class Internal
         | 
| 4 4 | 
             
                  class Preferences < Common::BaseModel
         | 
| 5 | 
            -
                    passthrough | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 5 | 
            +
                    passthrough(
         | 
| 6 | 
            +
                      :kiosk_enabled, :kiosk_workflow_message, :kiosk_create_button_label,
         | 
| 7 | 
            +
                      :kiosk_create_button_help, :kiosk_return_button_label, :kiosk_return_button_help,
         | 
| 8 | 
            +
                      :kiosk_dashboard_button_label, :kiosk_dashboard_button_help
         | 
| 9 | 
            +
                    )
         | 
| 8 10 |  | 
| 9 | 
            -
                    [
         | 
| 10 | 
            -
                       | 
| 11 | 
            -
                       | 
| 12 | 
            -
                       | 
| 13 | 
            -
                       | 
| 14 | 
            -
                       | 
| 15 | 
            -
                       | 
| 11 | 
            +
                    %i[
         | 
| 12 | 
            +
                      show_sidebar
         | 
| 13 | 
            +
                      show_shortcuts
         | 
| 14 | 
            +
                      show_coming_soon
         | 
| 15 | 
            +
                      show_recently_visited_forms
         | 
| 16 | 
            +
                      show_tasks
         | 
| 17 | 
            +
                      show_task_bubbles
         | 
| 16 18 | 
             
                    ].map(&:to_s).each do |field|
         | 
| 17 19 | 
             
                      define_method(field) do
         | 
| 18 20 | 
             
                        if doc.key?(field)
         | 
| @@ -21,6 +23,7 @@ module Ecoportal | |
| 21 23 | 
             
                          true
         | 
| 22 24 | 
             
                        end
         | 
| 23 25 | 
             
                      end
         | 
| 26 | 
            +
             | 
| 24 27 | 
             
                      define_method("#{field}=") do |value|
         | 
| 25 28 | 
             
                        doc[field] = !!value
         | 
| 26 29 | 
             
                      end
         | 
| @@ -3,12 +3,12 @@ module Ecoportal | |
| 3 3 | 
             
                class Internal < V1
         | 
| 4 4 | 
             
                  include Common::Logging
         | 
| 5 5 |  | 
| 6 | 
            -
                  VERSION =  | 
| 7 | 
            -
                  class_resolver :people_class,  | 
| 8 | 
            -
                  class_resolver :person_schemas_class,  | 
| 6 | 
            +
                  VERSION = 'v0'.freeze
         | 
| 7 | 
            +
                  class_resolver :people_class, 'Ecoportal::API::Internal::People'
         | 
| 8 | 
            +
                  class_resolver :person_schemas_class, 'Ecoportal::API::Internal::PersonSchemas'
         | 
| 9 9 |  | 
| 10 | 
            -
                  class_resolver :policy_groups_class,  | 
| 11 | 
            -
                  class_resolver :login_providers_class,  | 
| 10 | 
            +
                  class_resolver :policy_groups_class, 'Ecoportal::API::Internal::PolicyGroups'
         | 
| 11 | 
            +
                  class_resolver :login_providers_class, 'Ecoportal::API::Internal::LoginProviders'
         | 
| 12 12 |  | 
| 13 13 | 
             
                  # Obtain specific object for policy groups api requests.
         | 
| 14 14 | 
             
                  # @return [PolicyGroups] an instance object ready to make policy groups api requests.
         | 
    
        data/lib/ecoportal/api/logger.rb
    CHANGED
    
    | @@ -1,26 +1,27 @@ | |
| 1 1 | 
             
            module Ecoportal
         | 
| 2 2 | 
             
              module API
         | 
| 3 3 | 
             
                class Logger
         | 
| 4 | 
            -
                  TIMESTAMP_PATTERN  =  | 
| 4 | 
            +
                  TIMESTAMP_PATTERN  = '%Y-%m-%dT%H:%M:%S'.freeze
         | 
| 5 5 |  | 
| 6 6 | 
             
                  STDOUT_FORMAT_PROC = proc do |severity, _datetime, _progname, msg|
         | 
| 7 7 | 
             
                    prefix = "%5s > " % severity # rubocop:disable Style/FormatString
         | 
| 8 | 
            -
                    msg.lines.map.with_index do |line, idx|
         | 
| 8 | 
            +
                    msg.lines.map.with_index do |line, idx| # rubocop:disable Style/StringConcatenation
         | 
| 9 9 | 
             
                      if idx.zero?
         | 
| 10 10 | 
             
                        prefix + line.chomp
         | 
| 11 11 | 
             
                      else
         | 
| 12 | 
            -
                        ( | 
| 12 | 
            +
                        (' ' * prefix.length) + line.chomp
         | 
| 13 13 | 
             
                      end
         | 
| 14 14 | 
             
                    end.join("\n")+"\n"
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 |  | 
| 17 17 | 
             
                  FILE_FORMAT_PROC = proc do |severity, datetime, _progname, msg|
         | 
| 18 18 | 
             
                    prefix = "%5s(%s) > " % [severity, datetime.strftime(TIMESTAMP_PATTERN)] # rubocop:disable Style/FormatString, Style/FormatStringToken
         | 
| 19 | 
            -
             | 
| 19 | 
            +
             | 
| 20 | 
            +
                    msg.lines.map.with_index do |line, idx| # rubocop:disable Style/StringConcatenation
         | 
| 20 21 | 
             
                      if idx.zero?
         | 
| 21 22 | 
             
                        prefix + line.chomp
         | 
| 22 23 | 
             
                      else
         | 
| 23 | 
            -
                        ( | 
| 24 | 
            +
                        (' ' * prefix.length) + line.chomp
         | 
| 24 25 | 
             
                      end
         | 
| 25 26 | 
             
                    end.join("\n")+"\n"
         | 
| 26 27 | 
             
                  end
         | 
| @@ -30,7 +31,7 @@ module Ecoportal | |
| 30 31 | 
             
                  def initialize(
         | 
| 31 32 | 
             
                    console_level: ::Logger::INFO,
         | 
| 32 33 | 
             
                    file_level:   ::Logger::DEBUG,
         | 
| 33 | 
            -
                    output_file:  File.join(Dir.getwd, "API_Log-#{Time.now.strftime( | 
| 34 | 
            +
                    output_file:  File.join(Dir.getwd, "API_Log-#{Time.now.strftime('%Y-%m-%dT%H%M')}.txt")
         | 
| 34 35 | 
             
                  )
         | 
| 35 36 | 
             
                    @console = make_stdout_logger(console_level)
         | 
| 36 37 | 
             
                    @file    = make_file_logger(file_level, output_file)
         | 
| @@ -54,7 +55,7 @@ module Ecoportal | |
| 54 55 |  | 
| 55 56 | 
             
                  def make_file_logger(level, output_file)
         | 
| 56 57 | 
             
                    return unless output_file
         | 
| 57 | 
            -
                    ::Logger.new(File.open(output_file,  | 
| 58 | 
            +
                    ::Logger.new(File.open(output_file, 'a')).tap do |logger|
         | 
| 58 59 | 
             
                      logger.formatter = FILE_FORMAT_PROC
         | 
| 59 60 | 
             
                      logger.level     = level
         | 
| 60 61 | 
             
                    end
         | 
    
        data/lib/ecoportal/api/v1/job.rb
    CHANGED
    
    | @@ -31,7 +31,7 @@ module Ecoportal | |
| 31 31 | 
             
                      raise_if_already_launched! unless recover
         | 
| 32 32 |  | 
| 33 33 | 
             
                      @operation ||= Common::BatchOperation.new(
         | 
| 34 | 
            -
                         | 
| 34 | 
            +
                        '/people',
         | 
| 35 35 | 
             
                        person_class,
         | 
| 36 36 | 
             
                        logger: client.logger
         | 
| 37 37 | 
             
                      )
         | 
| @@ -84,7 +84,7 @@ module Ecoportal | |
| 84 84 | 
             
                    def raise_if_already_launched!
         | 
| 85 85 | 
             
                      return unless created?
         | 
| 86 86 |  | 
| 87 | 
            -
                      msg  =  | 
| 87 | 
            +
                      msg  = 'Missusage: job was already created.'
         | 
| 88 88 | 
             
                      msg << " Can't call batch more than once"
         | 
| 89 89 | 
             
                      raise msg
         | 
| 90 90 | 
             
                    end
         | 
| @@ -102,8 +102,8 @@ module Ecoportal | |
| 102 102 |  | 
| 103 103 | 
             
                      job_id = nil
         | 
| 104 104 |  | 
| 105 | 
            -
                      client.post( | 
| 106 | 
            -
                        job_id = body_data(response.body)[ | 
| 105 | 
            +
                      client.post('/people/job', data: operation.as_json).tap do |response|
         | 
| 106 | 
            +
                        job_id = body_data(response.body)['id'] if response.success?
         | 
| 107 107 |  | 
| 108 108 | 
             
                        next if job_id
         | 
| 109 109 |  | 
| @@ -8,7 +8,7 @@ module Ecoportal | |
| 8 8 | 
             
                    include Common::DocHelpers
         | 
| 9 9 | 
             
                    include Enumerable
         | 
| 10 10 |  | 
| 11 | 
            -
                    class_resolver :person_class,  | 
| 11 | 
            +
                    class_resolver :person_class, 'Ecoportal::API::V1::Person'
         | 
| 12 12 |  | 
| 13 13 | 
             
                    attr_reader :client
         | 
| 14 14 |  | 
| @@ -44,7 +44,7 @@ module Ecoportal | |
| 44 44 | 
             
                        count    = 5
         | 
| 45 45 |  | 
| 46 46 | 
             
                        loop do
         | 
| 47 | 
            -
                          response = client.get( | 
| 47 | 
            +
                          response = client.get('/people', params: params)
         | 
| 48 48 | 
             
                          body     = response && body_data(response.body)
         | 
| 49 49 | 
             
                          break if response.success? || count <= 0
         | 
| 50 50 |  | 
| @@ -56,22 +56,22 @@ module Ecoportal | |
| 56 56 |  | 
| 57 57 | 
             
                        raise "Request failed - Status #{response.status}: #{body}" unless response.success?
         | 
| 58 58 |  | 
| 59 | 
            -
                        unless silent || (total = body[ | 
| 60 | 
            -
                          results += body[ | 
| 59 | 
            +
                        unless silent || (total = body['total_results'])&.zero?
         | 
| 60 | 
            +
                          results += body['results'].length
         | 
| 61 61 | 
             
                          percent  = results * 100 / total
         | 
| 62 62 |  | 
| 63 | 
            -
                          msg      =  | 
| 63 | 
            +
                          msg      = 'People GET'
         | 
| 64 64 | 
             
                          msg     << " (search=#{params[:q]})" if params.key?(:q)
         | 
| 65 65 |  | 
| 66 66 | 
             
                          print "#{msg}: #{percent.round}% (of #{total}): #{results}\r"
         | 
| 67 67 | 
             
                          $stdout.flush
         | 
| 68 68 | 
             
                        end
         | 
| 69 69 |  | 
| 70 | 
            -
                        body[ | 
| 70 | 
            +
                        body['results'].each do |person|
         | 
| 71 71 | 
             
                          yield person_class.new(person)
         | 
| 72 72 | 
             
                        end
         | 
| 73 73 |  | 
| 74 | 
            -
                        break unless (cursor_id = body[ | 
| 74 | 
            +
                        break unless (cursor_id = body['cursor_id'])
         | 
| 75 75 | 
             
                      end
         | 
| 76 76 | 
             
                      self
         | 
| 77 77 | 
             
                    end
         | 
| @@ -106,6 +106,7 @@ module Ecoportal | |
| 106 106 | 
             
                    def update(doc)
         | 
| 107 107 | 
             
                      body = get_body(doc)
         | 
| 108 108 | 
             
                      id   = get_id(doc)
         | 
| 109 | 
            +
             | 
| 109 110 | 
             
                      client.patch("/people/#{CGI.escape(id)}", data: body)
         | 
| 110 111 | 
             
                    end
         | 
| 111 112 |  | 
| @@ -114,7 +115,8 @@ module Ecoportal | |
| 114 115 | 
             
                    # @return [Response] an object with the api response.
         | 
| 115 116 | 
             
                    def create(doc)
         | 
| 116 117 | 
             
                      body = get_body(doc)
         | 
| 117 | 
            -
             | 
| 118 | 
            +
             | 
| 119 | 
            +
                      client.post('/people', data: body)
         | 
| 118 120 | 
             
                    end
         | 
| 119 121 |  | 
| 120 122 | 
             
                    # Requests to update an existing person or if it does not exist, to create it, via api.
         | 
| @@ -143,7 +145,7 @@ module Ecoportal | |
| 143 145 | 
             
                      return job.batch(&block) if job_mode
         | 
| 144 146 |  | 
| 145 147 | 
             
                      operation = Common::BatchOperation.new(
         | 
| 146 | 
            -
                         | 
| 148 | 
            +
                        '/people',
         | 
| 147 149 | 
             
                        person_class,
         | 
| 148 150 | 
             
                        logger: client.logger
         | 
| 149 151 | 
             
                      )
         | 
| @@ -151,7 +153,7 @@ module Ecoportal | |
| 151 153 | 
             
                      yield operation
         | 
| 152 154 |  | 
| 153 155 | 
             
                      # The batch operation is responsible for logging the output
         | 
| 154 | 
            -
                      client.post( | 
| 156 | 
            +
                      client.post('/people/batch', data: operation.as_json).tap do |response|
         | 
| 155 157 | 
             
                        operation.process_response(response)
         | 
| 156 158 | 
             
                      end
         | 
| 157 159 | 
             
                    end
         | 
| @@ -10,25 +10,35 @@ module Ecoportal | |
| 10 10 | 
             
                  class Person < Common::BaseModel
         | 
| 11 11 | 
             
                    passthrough :id, :external_id, :name, :email, :filter_tags
         | 
| 12 12 | 
             
                    passthrough :archived
         | 
| 13 | 
            +
                    alias_method :archived?, :archived
         | 
| 14 | 
            +
             | 
| 13 15 | 
             
                    passthrough :supervisor_id, :contractor_organization_id
         | 
| 14 16 | 
             
                    passthrough :brand_id
         | 
| 15 17 | 
             
                    passthrough :freemium
         | 
| 16 18 |  | 
| 17 | 
            -
                    class_resolver :person_schema_class,   | 
| 18 | 
            -
                    class_resolver :person_details_class,  | 
| 19 | 
            +
                    class_resolver :person_schema_class,  'Ecoportal::API::V1::PersonSchema'
         | 
| 20 | 
            +
                    class_resolver :person_details_class, 'Ecoportal::API::V1::PersonDetails'
         | 
| 19 21 | 
             
                    embeds_one :details, nullable: true, klass: :person_details_class
         | 
| 20 22 |  | 
| 21 23 | 
             
                    VALID_TAG_REGEX   = /^[A-Za-z0-9 &_'\/.-]+$/
         | 
| 22 24 | 
             
                    VALID_EMAIL_REGEX = /^[^@\s]+@[^@\s]+\.[^@\s]+$/
         | 
| 23 25 |  | 
| 26 | 
            +
                    def unarchive!
         | 
| 27 | 
            +
                      self.archived = false
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def archive!
         | 
| 31 | 
            +
                      self.archived = true
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 24 34 | 
             
                    # Gets the supervisor (`Person`) of this person, with given his `supervisor_id`.
         | 
| 25 35 | 
             
                    #
         | 
| 26 36 | 
             
                    # **Example Usage**:
         | 
| 27 37 | 
             
                    # ```ruby
         | 
| 28 38 | 
             
                    # API_KEY = 'some-private-api-key-version'
         | 
| 29 | 
            -
                    # HOST    =  | 
| 39 | 
            +
                    # HOST    = 'live.ecoportal.com'
         | 
| 30 40 | 
             
                    # api     = Ecoportal::API::Internal.new(API_KEY, host: HOST)
         | 
| 31 | 
            -
                    # person  = api.people.get({ | 
| 41 | 
            +
                    # person  = api.people.get({'id': 'my-dummy-user'})
         | 
| 32 42 | 
             
                    # super   = person.supervisor(api.client)
         | 
| 33 43 | 
             
                    # pp "#{person.name}'s supervisor is #{super.name}."
         | 
| 34 44 | 
             
                    # ```
         | 
| @@ -37,6 +47,7 @@ module Ecoportal | |
| 37 47 | 
             
                    def supervisor(client)
         | 
| 38 48 | 
             
                      return @supervisor if defined?(@supervisor)
         | 
| 39 49 | 
             
                      return @supervisor = nil if supervisor_id.nil?
         | 
| 50 | 
            +
             | 
| 40 51 | 
             
                      @supervisor = client.people.get(supervisor_id).result
         | 
| 41 52 | 
             
                    end
         | 
| 42 53 |  | 
| @@ -51,7 +62,7 @@ module Ecoportal | |
| 51 62 | 
             
                    def email=(value)
         | 
| 52 63 | 
             
                      raise "Invalid email #{value.inspect}" if value && !value.match(VALID_EMAIL_REGEX)
         | 
| 53 64 |  | 
| 54 | 
            -
                      doc[ | 
| 65 | 
            +
                      doc['email'] = value&.downcase
         | 
| 55 66 | 
             
                    end
         | 
| 56 67 |  | 
| 57 68 | 
             
                    # Validates the string tags of the array, and sets the `filter_tags` property of the account.
         | 
| @@ -69,20 +80,20 @@ module Ecoportal | |
| 69 80 | 
             
                        tag.upcase
         | 
| 70 81 | 
             
                      end
         | 
| 71 82 |  | 
| 72 | 
            -
                      set_uniq_array_keep_order( | 
| 83 | 
            +
                      set_uniq_array_keep_order('filter_tags', end_tags)
         | 
| 73 84 | 
             
                    end
         | 
| 74 85 |  | 
| 75 86 | 
             
                    # @return [Array<String>] the filter tags of this person.
         | 
| 76 87 | 
             
                    def filter_tags
         | 
| 77 | 
            -
                      doc[ | 
| 88 | 
            +
                      doc['filter_tags'] ||= []
         | 
| 78 89 | 
             
                    end
         | 
| 79 90 |  | 
| 80 91 | 
             
                    def as_json
         | 
| 81 | 
            -
                      super.merge  | 
| 92 | 
            +
                      super.merge 'details' => details&.as_json
         | 
| 82 93 | 
             
                    end
         | 
| 83 94 |  | 
| 84 95 | 
             
                    def as_update(ref = :last, ignore: [])
         | 
| 85 | 
            -
                      super | 
| 96 | 
            +
                      super
         | 
| 86 97 | 
             
                    end
         | 
| 87 98 |  | 
| 88 99 | 
             
                    # Sets the PersonDetails to the person, depending on the paramter received:
         | 
| @@ -95,15 +106,15 @@ module Ecoportal | |
| 95 106 | 
             
                    def details=(value)
         | 
| 96 107 | 
             
                      case value
         | 
| 97 108 | 
             
                      when NilClass
         | 
| 98 | 
            -
                        doc[ | 
| 109 | 
            +
                        doc['details'] = nil
         | 
| 99 110 | 
             
                      when person_details_class
         | 
| 100 | 
            -
                        doc[ | 
| 111 | 
            +
                        doc['details'] = value.as_json
         | 
| 101 112 | 
             
                      when Hash
         | 
| 102 | 
            -
                        doc[ | 
| 113 | 
            +
                        doc['details'] = value.slice('schema_id', 'fields')
         | 
| 103 114 | 
             
                      else
         | 
| 104 115 | 
             
                        raise "Invalid type set on details. Required nil, PersonDetails or Hash; got #{value.class}"
         | 
| 105 116 | 
             
                      end
         | 
| 106 | 
            -
                      remove_instance_variable( | 
| 117 | 
            +
                      remove_instance_variable('@details') if defined?(@details)
         | 
| 107 118 | 
             
                    end
         | 
| 108 119 |  | 
| 109 120 | 
             
                    # Sets the PersonDetails to the person, depending on the parameter received:
         | 
| @@ -127,10 +138,11 @@ module Ecoportal | |
| 127 138 | 
             
                        else
         | 
| 128 139 | 
             
                          raise "Invalid set on details: Requierd PersonSchema or String; got #{schema_or_id.class}"
         | 
| 129 140 | 
             
                        end
         | 
| 141 | 
            +
             | 
| 130 142 | 
             
                        self.details = new_details
         | 
| 131 143 | 
             
                        # Patch out static data from as_update
         | 
| 132 | 
            -
                        original_doc[ | 
| 133 | 
            -
                           | 
| 144 | 
            +
                        original_doc['details'] = {
         | 
| 145 | 
            +
                          'fields' => JSON.parse(doc['details']['fields'].to_json)
         | 
| 134 146 | 
             
                        }
         | 
| 135 147 | 
             
                      end
         | 
| 136 148 | 
             
                    end
         | 
| @@ -7,10 +7,10 @@ module Ecoportal | |
| 7 7 |  | 
| 8 8 | 
             
                    passthrough :schema_id
         | 
| 9 9 |  | 
| 10 | 
            -
                    class_resolver :schema_field_value_class,  | 
| 10 | 
            +
                    class_resolver :schema_field_value_class, 'Ecoportal::API::V1::SchemaFieldValue'
         | 
| 11 11 |  | 
| 12 12 | 
             
                    def as_json
         | 
| 13 | 
            -
                      super.merge  | 
| 13 | 
            +
                      super.merge 'fields' => fields.map(&:as_json)
         | 
| 14 14 | 
             
                    end
         | 
| 15 15 |  | 
| 16 16 | 
             
                    # Sets the `id` of the PersonDetails.
         | 
| @@ -18,15 +18,15 @@ module Ecoportal | |
| 18 18 | 
             
                    # @param value [nil, String] the id of the schema.
         | 
| 19 19 | 
             
                    def schema_id=(value)
         | 
| 20 20 | 
             
                      @fields          = [] if value.nil?
         | 
| 21 | 
            -
                      doc[ | 
| 21 | 
            +
                      doc['schema_id'] = value
         | 
| 22 22 | 
             
                    end
         | 
| 23 23 |  | 
| 24 24 | 
             
                    # Gets all the fields of the PersonDetails.
         | 
| 25 25 | 
             
                    # @return [Array<SchemaFieldValue>] the array of fields of the schema.
         | 
| 26 26 | 
             
                    def fields
         | 
| 27 27 | 
             
                      return @fields if defined?(@fields)
         | 
| 28 | 
            -
                      @fields = (doc[ | 
| 29 | 
            -
                        schema_field_value_class.new(field, parent: self, key: [ | 
| 28 | 
            +
                      @fields = (doc['fields'] || []).each_with_index.map do |field, i|
         | 
| 29 | 
            +
                        schema_field_value_class.new(field, parent: self, key: ['fields', i])
         | 
| 30 30 | 
             
                      end
         | 
| 31 31 | 
             
                    end
         | 
| 32 32 |  | 
| @@ -69,13 +69,13 @@ module Ecoportal | |
| 69 69 | 
             
                    def changed?(id, doc = :original)
         | 
| 70 70 | 
             
                      return false unless (field = get_field(id))
         | 
| 71 71 |  | 
| 72 | 
            -
                      field.as_update.key?( | 
| 72 | 
            +
                      field.as_update.key?('value')
         | 
| 73 73 | 
             
                    end
         | 
| 74 74 |  | 
| 75 75 | 
             
                    def original_value(id)
         | 
| 76 76 | 
             
                      return nil unless (field = get_field(id))
         | 
| 77 77 |  | 
| 78 | 
            -
                      field.original_doc[ | 
| 78 | 
            +
                      field.original_doc['value']
         | 
| 79 79 | 
             
                    end
         | 
| 80 80 |  | 
| 81 81 | 
             
                    protected
         | 
| @@ -5,7 +5,7 @@ module Ecoportal | |
| 5 5 | 
             
                    passthrough :id, :name
         | 
| 6 6 | 
             
                    passthrough :enable_tags, :tags
         | 
| 7 7 |  | 
| 8 | 
            -
                    class_resolver :schema_field_class,  | 
| 8 | 
            +
                    class_resolver :schema_field_class, 'Ecoportal::API::V1::SchemaField'
         | 
| 9 9 |  | 
| 10 10 | 
             
                    def fields
         | 
| 11 11 | 
             
                      @fields_by_id or index_fields
         | 
| @@ -31,7 +31,7 @@ module Ecoportal | |
| 31 31 | 
             
                      @fields_by_id     = {}
         | 
| 32 32 | 
             
                      @fields_by_alt_id = {}
         | 
| 33 33 |  | 
| 34 | 
            -
                      doc[ | 
| 34 | 
            +
                      doc['fields'].each do |field|
         | 
| 35 35 | 
             
                        wrapped = schema_field_class.new(field)
         | 
| 36 36 | 
             
                        @fields_by_id[wrapped.id] = wrapped
         | 
| 37 37 | 
             
                        @fields_by_alt_id[wrapped.alt_id] = wrapped
         | 
| @@ -40,9 +40,9 @@ module Ecoportal | |
| 40 40 |  | 
| 41 41 | 
             
                    def initialize_details(details)
         | 
| 42 42 | 
             
                      details.schema_id = id
         | 
| 43 | 
            -
                      details.doc[ | 
| 43 | 
            +
                      details.doc['fields'] = fields.map do |field|
         | 
| 44 44 | 
             
                        field.doc.slice(*%w[id alt_id name multiple type shared]).merge(
         | 
| 45 | 
            -
                           | 
| 45 | 
            +
                          'value' => field.multiple ? [] : nil
         | 
| 46 46 | 
             
                        )
         | 
| 47 47 | 
             
                      end
         | 
| 48 48 | 
             
                    end
         | 
| @@ -50,4 +50,5 @@ module Ecoportal | |
| 50 50 | 
             
                end
         | 
| 51 51 | 
             
              end
         | 
| 52 52 | 
             
            end
         | 
| 53 | 
            +
             | 
| 53 54 | 
             
            require 'ecoportal/api/v1/schema_field'
         | 
| @@ -1,12 +1,13 @@ | |
| 1 1 | 
             
            module Ecoportal
         | 
| 2 2 | 
             
              module API
         | 
| 3 3 | 
             
                class V1
         | 
| 4 | 
            -
                  # @attr_reader client [Common::Client] a `Common::Client` object that holds | 
| 4 | 
            +
                  # @attr_reader client [Common::Client] a `Common::Client` object that holds
         | 
| 5 | 
            +
                  #   the configuration of the api connection.
         | 
| 5 6 | 
             
                  class PersonSchemas
         | 
| 6 7 | 
             
                    extend Common::BaseClass
         | 
| 7 8 | 
             
                    include Enumerable
         | 
| 8 9 |  | 
| 9 | 
            -
                    class_resolver :person_schema_class, | 
| 10 | 
            +
                    class_resolver :person_schema_class, 'Ecoportal::API::V1::PersonSchema'
         | 
| 10 11 |  | 
| 11 12 | 
             
                    attr_reader :client
         | 
| 12 13 |  | 
| @@ -18,8 +19,8 @@ module Ecoportal | |
| 18 19 |  | 
| 19 20 | 
             
                    # Gets all the schemas via api request.
         | 
| 20 21 | 
             
                    # @return [Enumerable<PersonSchema>] an `Enumerable` with all schemas already wrapped as `PersonSchema` objects.
         | 
| 21 | 
            -
                    def get_all
         | 
| 22 | 
            -
                      response = client.get( | 
| 22 | 
            +
                    def get_all # rubocop:disable Naming/AccessorMethodName
         | 
| 23 | 
            +
                      response = client.get('/person_schemas')
         | 
| 23 24 | 
             
                      Common::WrappedResponse.new(response, person_schema_class)
         | 
| 24 25 | 
             
                    end
         | 
| 25 26 |  | 
| @@ -29,13 +30,15 @@ module Ecoportal | |
| 29 30 | 
             
                    #   - `:params` doesn't really do anything.
         | 
| 30 31 | 
             
                    #   - same as #get_all but with block :)
         | 
| 31 32 | 
             
                    #   - `to_a` will call `each` (see this [detailed explanation](https://stackoverflow.com/a/45201663/4352306))
         | 
| 32 | 
            -
                    #     - however, as far as you have an iterator, such as `each`, | 
| 33 | 
            +
                    #     - however, as far as you have an iterator, such as `each`,
         | 
| 34 | 
            +
                    #       `to_a` should be last resource (see [this explanation](https://stackoverflow.com/a/44186921/4352306))
         | 
| 33 35 | 
             
                    # @yield [schema] does some stuff with the schema.
         | 
| 34 36 | 
             
                    # @yieldparam schema [PersonSchema]
         | 
| 35 37 | 
             
                    # @yieldreturn [PersonSchema]
         | 
| 36 38 | 
             
                    # @return [Enumerable<PersonSchema>] an `Enumerable` with all the person schema objects.
         | 
| 37 39 | 
             
                    def each(params: {}, &block)
         | 
| 38 | 
            -
                      return to_enum(:each) unless block
         | 
| 40 | 
            +
                      return to_enum(:each, params: params) unless block
         | 
| 41 | 
            +
             | 
| 39 42 | 
             
                      get_all.each(&block)
         | 
| 40 43 | 
             
                    end
         | 
| 41 44 | 
             
                  end
         | 
| @@ -7,19 +7,19 @@ module Ecoportal | |
| 7 7 | 
             
                    def parse_text(value)
         | 
| 8 8 | 
             
                      values = [*value.to_s.lines].map do |line|
         | 
| 9 9 | 
             
                        line = line.chomp
         | 
| 10 | 
            -
                        next if line ==  | 
| 10 | 
            +
                        next if line == ''
         | 
| 11 11 | 
             
                        case type
         | 
| 12 | 
            -
                        when  | 
| 12 | 
            +
                        when 'text', 'phone_number'
         | 
| 13 13 | 
             
                          line
         | 
| 14 | 
            -
                        when  | 
| 15 | 
            -
                          Float(line) rescue return nil, false
         | 
| 16 | 
            -
                        when  | 
| 14 | 
            +
                        when 'number'
         | 
| 15 | 
            +
                          Float(line) rescue return nil, false # rubocop:disable Style/RescueModifier
         | 
| 16 | 
            +
                        when 'boolean'
         | 
| 17 17 | 
             
                          %w[true TRUE True Y y YES X x].include?(line)
         | 
| 18 | 
            -
                        when  | 
| 18 | 
            +
                        when 'select'
         | 
| 19 19 | 
             
                          return nil, false unless options.include?(line)
         | 
| 20 20 | 
             
                          line
         | 
| 21 | 
            -
                        when  | 
| 22 | 
            -
                          Date.parse(line) rescue return nil, false
         | 
| 21 | 
            +
                        when 'date'
         | 
| 22 | 
            +
                          Date.parse(line) rescue return nil, false # rubocop:disable Style/RescueModifier
         | 
| 23 23 | 
             
                        end
         | 
| 24 24 | 
             
                      end.compact
         | 
| 25 25 |  | 
| @@ -6,18 +6,18 @@ module Ecoportal | |
| 6 6 | 
             
                    passthrough :id, :alt_id, :type, :name, :shared, :multiple
         | 
| 7 7 |  | 
| 8 8 | 
             
                    def clear
         | 
| 9 | 
            -
                      return doc[ | 
| 9 | 
            +
                      return doc['value'] = [] if multiple
         | 
| 10 10 |  | 
| 11 | 
            -
                      doc[ | 
| 11 | 
            +
                      doc['value'] = nil
         | 
| 12 12 | 
             
                    end
         | 
| 13 13 |  | 
| 14 14 | 
             
                    def value
         | 
| 15 15 | 
             
                      case type
         | 
| 16 | 
            -
                      when  | 
| 17 | 
            -
                        doc[ | 
| 18 | 
            -
                      when  | 
| 19 | 
            -
                        if doc[ | 
| 20 | 
            -
                          maybe_multiple(doc[ | 
| 16 | 
            +
                      when 'text', 'phone_number', 'number', 'boolean', 'select'
         | 
| 17 | 
            +
                        doc['value']
         | 
| 18 | 
            +
                      when 'date'
         | 
| 19 | 
            +
                        if doc['value']
         | 
| 20 | 
            +
                          maybe_multiple(doc['value']) do |v|
         | 
| 21 21 | 
             
                            Date.iso8601(v)
         | 
| 22 22 | 
             
                          end
         | 
| 23 23 | 
             
                        end
         | 
| @@ -28,28 +28,28 @@ module Ecoportal | |
| 28 28 |  | 
| 29 29 | 
             
                    def value=(value) # rubocop:disable Metrics/AbcSize
         | 
| 30 30 | 
             
                      case type
         | 
| 31 | 
            -
                      when  | 
| 32 | 
            -
                        doc[ | 
| 31 | 
            +
                      when 'text', 'phone_number', 'select'
         | 
| 32 | 
            +
                        doc['value'] = maybe_multiple(value) do |v|
         | 
| 33 33 | 
             
                          v&.to_s
         | 
| 34 34 | 
             
                        end
         | 
| 35 | 
            -
                      when  | 
| 35 | 
            +
                      when 'number'
         | 
| 36 36 | 
             
                        maybe_multiple(value) do |v|
         | 
| 37 37 | 
             
                          next if v.nil? || v.is_a?(Numeric)
         | 
| 38 38 |  | 
| 39 39 | 
             
                          raise "Invalid number type #{v.class}"
         | 
| 40 40 | 
             
                        end
         | 
| 41 41 |  | 
| 42 | 
            -
                        doc[ | 
| 43 | 
            -
                      when  | 
| 44 | 
            -
                        doc[ | 
| 45 | 
            -
                      when  | 
| 42 | 
            +
                        doc['value'] = value
         | 
| 43 | 
            +
                      when 'boolean'
         | 
| 44 | 
            +
                        doc['value'] = !!value
         | 
| 45 | 
            +
                      when 'date'
         | 
| 46 46 | 
             
                        maybe_multiple(value) do |v|
         | 
| 47 47 | 
             
                          next if v.nil? || v.respond_to?(:to_date)
         | 
| 48 48 |  | 
| 49 49 | 
             
                          raise "Invalid date type #{v.class}"
         | 
| 50 50 | 
             
                        end
         | 
| 51 51 |  | 
| 52 | 
            -
                        doc[ | 
| 52 | 
            +
                        doc['value'] = maybe_multiple(value) do |v|
         | 
| 53 53 | 
             
                          v&.to_date&.to_s
         | 
| 54 54 | 
             
                        end
         | 
| 55 55 | 
             
                      else
         | 
    
        data/lib/ecoportal/api/v1.rb
    CHANGED
    
    | @@ -6,10 +6,10 @@ module Ecoportal | |
| 6 6 | 
             
                  extend Common::BaseClass
         | 
| 7 7 | 
             
                  include Common::Logging
         | 
| 8 8 |  | 
| 9 | 
            -
                  VERSION =  | 
| 9 | 
            +
                  VERSION = 'v1'.freeze
         | 
| 10 10 |  | 
| 11 | 
            -
                  class_resolver :people_class,  | 
| 12 | 
            -
                  class_resolver :person_schemas_class,  | 
| 11 | 
            +
                  class_resolver :people_class, 'Ecoportal::API::V1::People'
         | 
| 12 | 
            +
                  class_resolver :person_schemas_class, 'Ecoportal::API::V1::PersonSchemas'
         | 
| 13 13 |  | 
| 14 14 | 
             
                  attr_reader :client, :logger
         | 
| 15 15 |  | 
| @@ -21,7 +21,7 @@ module Ecoportal | |
| 21 21 | 
             
                  # @param host [String] api server domain.
         | 
| 22 22 | 
             
                  # @param logger [Logger] an object with `Logger` interface to generate logs.
         | 
| 23 23 | 
             
                  # @return [V1] an object with the api version suit.
         | 
| 24 | 
            -
                  def initialize(api_key, host:  | 
| 24 | 
            +
                  def initialize(api_key, host: 'live.ecoportal.com', logger: default_logger)
         | 
| 25 25 | 
             
                    @logger = logger
         | 
| 26 26 | 
             
                    @client = Common::Client.new(
         | 
| 27 27 | 
             
                      api_key: api_key,
         |