fmrest 0.7.1 → 0.11.0
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/.github/workflows/ci.yml +33 -0
 - data/CHANGELOG.md +37 -0
 - data/README.md +176 -26
 - data/fmrest.gemspec +2 -2
 - data/lib/fmrest.rb +8 -3
 - data/lib/fmrest/connection_settings.rb +124 -0
 - data/lib/fmrest/errors.rb +2 -0
 - data/lib/fmrest/spyke/base.rb +2 -0
 - data/lib/fmrest/spyke/model.rb +2 -0
 - data/lib/fmrest/spyke/model/auth.rb +8 -0
 - data/lib/fmrest/spyke/model/connection.rb +88 -18
 - data/lib/fmrest/spyke/model/global_fields.rb +40 -0
 - data/lib/fmrest/spyke/model/orm.rb +2 -1
 - data/lib/fmrest/spyke/model/serialization.rb +16 -5
 - data/lib/fmrest/spyke/relation.rb +73 -0
 - data/lib/fmrest/spyke/spyke_formatter.rb +46 -9
 - data/lib/fmrest/string_date.rb +46 -7
 - data/lib/fmrest/token_store.rb +6 -0
 - data/lib/fmrest/token_store/base.rb +3 -3
 - data/lib/fmrest/v1.rb +8 -4
 - data/lib/fmrest/v1/auth.rb +30 -0
 - data/lib/fmrest/v1/connection.rb +54 -28
 - data/lib/fmrest/v1/dates.rb +81 -0
 - data/lib/fmrest/v1/raise_errors.rb +3 -1
 - data/lib/fmrest/v1/token_session.rb +41 -49
 - data/lib/fmrest/v1/type_coercer.rb +111 -36
 - data/lib/fmrest/v1/utils.rb +0 -17
 - data/lib/fmrest/version.rb +1 -1
 - metadata +18 -13
 
    
        data/lib/fmrest/string_date.rb
    CHANGED
    
    | 
         @@ -79,17 +79,24 @@ module FmRest 
     | 
|
| 
       79 
79 
     | 
    
         
             
                class InvalidDate < ArgumentError; end
         
     | 
| 
       80 
80 
     | 
    
         | 
| 
       81 
81 
     | 
    
         
             
                class << self
         
     | 
| 
       82 
     | 
    
         
            -
                   
     | 
| 
      
 82 
     | 
    
         
            +
                  def strptime(str, date_format, *_)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 84 
     | 
    
         
            +
                      date = self::DELEGATE_CLASS.strptime(str, date_format)
         
     | 
| 
      
 85 
     | 
    
         
            +
                    rescue ArgumentError
         
     | 
| 
      
 86 
     | 
    
         
            +
                      raise InvalidDate
         
     | 
| 
      
 87 
     | 
    
         
            +
                    end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                    new(str, date)
         
     | 
| 
      
 90 
     | 
    
         
            +
                  end
         
     | 
| 
       83 
91 
     | 
    
         
             
                end
         
     | 
| 
       84 
92 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
                def initialize(str,  
     | 
| 
      
 93 
     | 
    
         
            +
                def initialize(str, date, **str_args)
         
     | 
| 
      
 94 
     | 
    
         
            +
                  raise ArgumentError, "str must be of class String" unless str.is_a?(String)
         
     | 
| 
      
 95 
     | 
    
         
            +
                  raise ArgumentError, "date must be of class #{self.class::DELEGATE_CLASS.name}" unless date.is_a?(self.class::DELEGATE_CLASS)
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
       86 
97 
     | 
    
         
             
                  super(str, **str_args)
         
     | 
| 
       87 
98 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
                   
     | 
| 
       89 
     | 
    
         
            -
                    @delegate = self.class::DELEGATE_CLASS.strptime(str, date_format)
         
     | 
| 
       90 
     | 
    
         
            -
                  rescue ArgumentError
         
     | 
| 
       91 
     | 
    
         
            -
                    raise InvalidDate
         
     | 
| 
       92 
     | 
    
         
            -
                  end
         
     | 
| 
      
 99 
     | 
    
         
            +
                  @delegate = date
         
     | 
| 
       93 
100 
     | 
    
         | 
| 
       94 
101 
     | 
    
         
             
                  freeze
         
     | 
| 
       95 
102 
     | 
    
         
             
                end
         
     | 
| 
         @@ -178,4 +185,36 @@ module FmRest 
     | 
|
| 
       178 
185 
     | 
    
         
             
                  @delegate
         
     | 
| 
       179 
186 
     | 
    
         
             
                end
         
     | 
| 
       180 
187 
     | 
    
         
             
              end
         
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
      
 189 
     | 
    
         
            +
              module StringDateAwareness
         
     | 
| 
      
 190 
     | 
    
         
            +
                def _parse(v, *_)
         
     | 
| 
      
 191 
     | 
    
         
            +
                  if v.is_a?(StringDateTime)
         
     | 
| 
      
 192 
     | 
    
         
            +
                    return { year: v.year, mon: v.month, mday: v.mday, hour: v.hour, min: v.min, sec: v.sec, sec_fraction: v.sec_fraction, offset: v.offset }
         
     | 
| 
      
 193 
     | 
    
         
            +
                  end
         
     | 
| 
      
 194 
     | 
    
         
            +
                  if v.is_a?(StringDate)
         
     | 
| 
      
 195 
     | 
    
         
            +
                    return { year: v.year, mon: v.month, mday: v.mday }
         
     | 
| 
      
 196 
     | 
    
         
            +
                  end
         
     | 
| 
      
 197 
     | 
    
         
            +
                  super
         
     | 
| 
      
 198 
     | 
    
         
            +
                end
         
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
      
 200 
     | 
    
         
            +
                def parse(v, *_)
         
     | 
| 
      
 201 
     | 
    
         
            +
                  if v.is_a?(StringDate)
         
     | 
| 
      
 202 
     | 
    
         
            +
                    return self == ::DateTime ? v.to_datetime : v.to_date
         
     | 
| 
      
 203 
     | 
    
         
            +
                  end
         
     | 
| 
      
 204 
     | 
    
         
            +
                  super
         
     | 
| 
      
 205 
     | 
    
         
            +
                end
         
     | 
| 
      
 206 
     | 
    
         
            +
             
     | 
| 
      
 207 
     | 
    
         
            +
                # Overriding case equality method so that it returns true for
         
     | 
| 
      
 208 
     | 
    
         
            +
                # `FmRest::StringDate` instances
         
     | 
| 
      
 209 
     | 
    
         
            +
                #
         
     | 
| 
      
 210 
     | 
    
         
            +
                # Calls superclass method
         
     | 
| 
      
 211 
     | 
    
         
            +
                #
         
     | 
| 
      
 212 
     | 
    
         
            +
                def ===(other)
         
     | 
| 
      
 213 
     | 
    
         
            +
                  super || other.is_a?(StringDate)
         
     | 
| 
      
 214 
     | 
    
         
            +
                end
         
     | 
| 
      
 215 
     | 
    
         
            +
             
     | 
| 
      
 216 
     | 
    
         
            +
                def self.enable(classes: [Date, DateTime])
         
     | 
| 
      
 217 
     | 
    
         
            +
                  classes.each { |klass| klass.singleton_class.prepend(self) }
         
     | 
| 
      
 218 
     | 
    
         
            +
                end
         
     | 
| 
      
 219 
     | 
    
         
            +
              end
         
     | 
| 
       181 
220 
     | 
    
         
             
            end
         
     | 
    
        data/lib/fmrest/token_store.rb
    CHANGED
    
    | 
         @@ -2,5 +2,11 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module FmRest
         
     | 
| 
       4 
4 
     | 
    
         
             
              module TokenStore
         
     | 
| 
      
 5 
     | 
    
         
            +
                autoload :Base,         "fmrest/token_store/base"
         
     | 
| 
      
 6 
     | 
    
         
            +
                autoload :Memory,       "fmrest/token_store/memory"
         
     | 
| 
      
 7 
     | 
    
         
            +
                autoload :Null,         "fmrest/token_store/null"
         
     | 
| 
      
 8 
     | 
    
         
            +
                autoload :ActiveRecord, "fmrest/token_store/active_record"
         
     | 
| 
      
 9 
     | 
    
         
            +
                autoload :Moneta,       "fmrest/token_store/moneta"
         
     | 
| 
      
 10 
     | 
    
         
            +
                autoload :Redis,        "fmrest/token_store/redis"
         
     | 
| 
       5 
11 
     | 
    
         
             
              end
         
     | 
| 
       6 
12 
     | 
    
         
             
            end
         
     | 
| 
         @@ -10,15 +10,15 @@ module FmRest 
     | 
|
| 
       10 
10 
     | 
    
         
             
                  end
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                  def load(key)
         
     | 
| 
       13 
     | 
    
         
            -
                    raise  
     | 
| 
      
 13 
     | 
    
         
            +
                    raise NotImplementedError
         
     | 
| 
       14 
14 
     | 
    
         
             
                  end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                  def store(key, value)
         
     | 
| 
       17 
     | 
    
         
            -
                    raise  
     | 
| 
      
 17 
     | 
    
         
            +
                    raise NotImplementedError
         
     | 
| 
       18 
18 
     | 
    
         
             
                  end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                  def delete(key)
         
     | 
| 
       21 
     | 
    
         
            -
                    raise  
     | 
| 
      
 21 
     | 
    
         
            +
                    raise NotImplementedError
         
     | 
| 
       22 
22 
     | 
    
         
             
                  end
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
       24 
24 
     | 
    
         
             
              end
         
     | 
    
        data/lib/fmrest/v1.rb
    CHANGED
    
    | 
         @@ -4,16 +4,20 @@ require "fmrest/v1/connection" 
     | 
|
| 
       4 
4 
     | 
    
         
             
            require "fmrest/v1/paths"
         
     | 
| 
       5 
5 
     | 
    
         
             
            require "fmrest/v1/container_fields"
         
     | 
| 
       6 
6 
     | 
    
         
             
            require "fmrest/v1/utils"
         
     | 
| 
      
 7 
     | 
    
         
            +
            require "fmrest/v1/dates"
         
     | 
| 
      
 8 
     | 
    
         
            +
            require "fmrest/v1/auth"
         
     | 
| 
       7 
9 
     | 
    
         | 
| 
       8 
10 
     | 
    
         
             
            module FmRest
         
     | 
| 
       9 
11 
     | 
    
         
             
              module V1
         
     | 
| 
       10 
     | 
    
         
            -
                DEFAULT_DATE_FORMAT = "MM/dd/yyyy"
         
     | 
| 
       11 
     | 
    
         
            -
                DEFAULT_TIME_FORMAT = "HH:mm:ss"
         
     | 
| 
       12 
     | 
    
         
            -
                DEFAULT_TIMESTAMP_FORMAT = "#{DEFAULT_DATE_FORMAT} #{DEFAULT_TIME_FORMAT}"
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
12 
     | 
    
         
             
                extend Connection
         
     | 
| 
       15 
13 
     | 
    
         
             
                extend Paths
         
     | 
| 
       16 
14 
     | 
    
         
             
                extend ContainerFields
         
     | 
| 
       17 
15 
     | 
    
         
             
                extend Utils
         
     | 
| 
      
 16 
     | 
    
         
            +
                extend Dates
         
     | 
| 
      
 17 
     | 
    
         
            +
                extend Auth
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                autoload :TokenSession, "fmrest/v1/token_session"
         
     | 
| 
      
 20 
     | 
    
         
            +
                autoload :RaiseErrors, "fmrest/v1/raise_errors"
         
     | 
| 
      
 21 
     | 
    
         
            +
                autoload :TypeCoercer, "fmrest/v1/type_coercer"
         
     | 
| 
       18 
22 
     | 
    
         
             
              end
         
     | 
| 
       19 
23 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module FmRest
         
     | 
| 
      
 4 
     | 
    
         
            +
              module V1
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Auth
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # Requests a token through basic auth
         
     | 
| 
      
 7 
     | 
    
         
            +
                  #
         
     | 
| 
      
 8 
     | 
    
         
            +
                  # @param connection [Faraday] the auth connection to use for
         
     | 
| 
      
 9 
     | 
    
         
            +
                  #   the request
         
     | 
| 
      
 10 
     | 
    
         
            +
                  # @return The token if successful
         
     | 
| 
      
 11 
     | 
    
         
            +
                  # @return `false` if authentication failed
         
     | 
| 
      
 12 
     | 
    
         
            +
                  def request_auth_token(connection = FmRest::V1.auth_connection)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    request_auth_token!(connection)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  rescue FmRest::APIError::AccountError
         
     | 
| 
      
 15 
     | 
    
         
            +
                    false
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  # Requests a token through basic auth, raising
         
     | 
| 
      
 19 
     | 
    
         
            +
                  # `FmRest::APIError::AccountError` if auth fails
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # @param (see #request_auth_token)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  # @return The token if successful
         
     | 
| 
      
 23 
     | 
    
         
            +
                  # @raise [FmRest::APIError::AccountError] if authentication failed
         
     | 
| 
      
 24 
     | 
    
         
            +
                  def request_auth_token!(connection = FmRest.V1.auth_connection)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    resp = connection.post(V1.session_path)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    resp.body["response"]["token"]
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/fmrest/v1/connection.rb
    CHANGED
    
    | 
         @@ -7,21 +7,21 @@ module FmRest 
     | 
|
| 
       7 
7 
     | 
    
         
             
                module Connection
         
     | 
| 
       8 
8 
     | 
    
         
             
                  BASE_PATH = "/fmi/data/v1/databases"
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
      
 10 
     | 
    
         
            +
                  AUTH_HEADERS = { "Content-Type" => "application/json" }.freeze
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       10 
12 
     | 
    
         
             
                  # Builds a complete DAPI Faraday connection with middleware already
         
     | 
| 
       11 
13 
     | 
    
         
             
                  # configured to handle authentication, JSON parsing, logging and DAPI
         
     | 
| 
       12 
14 
     | 
    
         
             
                  # error handling. A block can be optionally given for additional
         
     | 
| 
       13 
15 
     | 
    
         
             
                  # middleware configuration
         
     | 
| 
       14 
16 
     | 
    
         
             
                  #
         
     | 
| 
       15 
     | 
    
         
            -
                  # @option options [String] :username The username for DAPI authentication
         
     | 
| 
       16 
     | 
    
         
            -
                  # @option options [String] :account_name Alias of :username for
         
     | 
| 
       17 
     | 
    
         
            -
                  #   compatibility with Rfm gem
         
     | 
| 
       18 
     | 
    
         
            -
                  # @option options [String] :password The password for DAPI authentication
         
     | 
| 
       19 
17 
     | 
    
         
             
                  # @option (see #base_connection)
         
     | 
| 
       20 
18 
     | 
    
         
             
                  # @return (see #base_connection)
         
     | 
| 
       21 
     | 
    
         
            -
                  def build_connection( 
     | 
| 
       22 
     | 
    
         
            -
                     
     | 
| 
      
 19 
     | 
    
         
            +
                  def build_connection(settings = FmRest.default_connection_settings, &block)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    settings = ConnectionSettings.wrap(settings)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    base_connection(settings) do |conn|
         
     | 
| 
       23 
23 
     | 
    
         
             
                      conn.use RaiseErrors
         
     | 
| 
       24 
     | 
    
         
            -
                      conn.use TokenSession,  
     | 
| 
      
 24 
     | 
    
         
            +
                      conn.use TokenSession, settings
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                      # The EncodeJson and Multipart middlewares only encode the request
         
     | 
| 
       27 
27 
     | 
    
         
             
                      # when the content type matches, so we can have them both here and
         
     | 
| 
         @@ -31,34 +31,62 @@ module FmRest 
     | 
|
| 
       31 
31 
     | 
    
         
             
                      conn.request :multipart
         
     | 
| 
       32 
32 
     | 
    
         
             
                      conn.request :json
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
     | 
    
         
            -
                      if options[:log]
         
     | 
| 
       35 
     | 
    
         
            -
                        conn.response :logger, nil, bodies: true, headers: true
         
     | 
| 
       36 
     | 
    
         
            -
                      end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
34 
     | 
    
         
             
                      # Allow overriding the default response middleware
         
     | 
| 
       39 
35 
     | 
    
         
             
                      if block_given?
         
     | 
| 
       40 
     | 
    
         
            -
                        yield conn,  
     | 
| 
      
 36 
     | 
    
         
            +
                        yield conn, settings
         
     | 
| 
       41 
37 
     | 
    
         
             
                      else
         
     | 
| 
       42 
     | 
    
         
            -
                        conn.use TypeCoercer,  
     | 
| 
      
 38 
     | 
    
         
            +
                        conn.use TypeCoercer, settings
         
     | 
| 
       43 
39 
     | 
    
         
             
                        conn.response :json
         
     | 
| 
       44 
40 
     | 
    
         
             
                      end
         
     | 
| 
       45 
41 
     | 
    
         | 
| 
      
 42 
     | 
    
         
            +
                      if settings.log
         
     | 
| 
      
 43 
     | 
    
         
            +
                        conn.response :logger, nil, bodies: true, headers: true
         
     | 
| 
      
 44 
     | 
    
         
            +
                      end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                      conn.adapter Faraday.default_adapter
         
     | 
| 
      
 47 
     | 
    
         
            +
                    end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  # Builds a Faraday connection to use for DAPI basic auth login
         
     | 
| 
      
 51 
     | 
    
         
            +
                  #
         
     | 
| 
      
 52 
     | 
    
         
            +
                  # @option (see #base_connection)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # @return (see #base_connection)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  def auth_connection(settings = FmRest.default_connection_settings)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    settings = ConnectionSettings.wrap(settings)
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                    base_connection(settings, { headers: AUTH_HEADERS }) do |conn|
         
     | 
| 
      
 58 
     | 
    
         
            +
                      conn.use RaiseErrors
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                      conn.basic_auth settings.username!, settings.password!
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                      if settings.log
         
     | 
| 
      
 63 
     | 
    
         
            +
                        conn.response :logger, nil, bodies: true, headers: true
         
     | 
| 
      
 64 
     | 
    
         
            +
                      end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                      conn.response :json
         
     | 
| 
       46 
67 
     | 
    
         
             
                      conn.adapter Faraday.default_adapter
         
     | 
| 
       47 
68 
     | 
    
         
             
                    end
         
     | 
| 
       48 
69 
     | 
    
         
             
                  end
         
     | 
| 
       49 
70 
     | 
    
         | 
| 
       50 
71 
     | 
    
         
             
                  # Builds a base Faraday connection with base URL constructed from
         
     | 
| 
       51 
     | 
    
         
            -
                  # connection  
     | 
| 
      
 72 
     | 
    
         
            +
                  # connection settings and passes it the given block
         
     | 
| 
       52 
73 
     | 
    
         
             
                  #
         
     | 
| 
       53 
     | 
    
         
            -
                  # @option  
     | 
| 
       54 
     | 
    
         
            -
                  # @option  
     | 
| 
       55 
     | 
    
         
            -
                  # @option  
     | 
| 
      
 74 
     | 
    
         
            +
                  # @option settings [String] :host The hostname for the FM server
         
     | 
| 
      
 75 
     | 
    
         
            +
                  # @option settings [String] :database The FM database name
         
     | 
| 
      
 76 
     | 
    
         
            +
                  # @option settings [String] :username The username for DAPI authentication
         
     | 
| 
      
 77 
     | 
    
         
            +
                  # @option settings [String] :account_name Alias of :username for
         
     | 
| 
      
 78 
     | 
    
         
            +
                  #   compatibility with Rfm gem
         
     | 
| 
      
 79 
     | 
    
         
            +
                  # @option settings [String] :password The password for DAPI authentication
         
     | 
| 
      
 80 
     | 
    
         
            +
                  # @option settings [String] :ssl SSL settings to forward to the Faraday
         
     | 
| 
       56 
81 
     | 
    
         
             
                  #   connection
         
     | 
| 
       57 
     | 
    
         
            -
                  # @option  
     | 
| 
      
 82 
     | 
    
         
            +
                  # @option settings [String] :proxy Proxy options to forward to the Faraday
         
     | 
| 
       58 
83 
     | 
    
         
             
                  #   connection
         
     | 
| 
      
 84 
     | 
    
         
            +
                  # @param faraday_options [Hash] additional options for Faraday object
         
     | 
| 
       59 
85 
     | 
    
         
             
                  # @return [Faraday] The new Faraday connection
         
     | 
| 
       60 
     | 
    
         
            -
                  def base_connection( 
     | 
| 
       61 
     | 
    
         
            -
                     
     | 
| 
      
 86 
     | 
    
         
            +
                  def base_connection(settings = FmRest.default_connection_settings, faraday_options = nil, &block)
         
     | 
| 
      
 87 
     | 
    
         
            +
                    settings = ConnectionSettings.wrap(settings)
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                    host = settings.host!
         
     | 
| 
       62 
90 
     | 
    
         | 
| 
       63 
91 
     | 
    
         
             
                    # Default to HTTPS
         
     | 
| 
       64 
92 
     | 
    
         
             
                    scheme = "https"
         
     | 
| 
         @@ -70,12 +98,14 @@ module FmRest 
     | 
|
| 
       70 
98 
     | 
    
         
             
                      scheme = uri.scheme
         
     | 
| 
       71 
99 
     | 
    
         
             
                    end
         
     | 
| 
       72 
100 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
                    faraday_options = {}
         
     | 
| 
       74 
     | 
    
         
            -
                    faraday_options[:ssl] =  
     | 
| 
       75 
     | 
    
         
            -
                    faraday_options[:proxy] =  
     | 
| 
      
 101 
     | 
    
         
            +
                    faraday_options = (faraday_options || {}).dup
         
     | 
| 
      
 102 
     | 
    
         
            +
                    faraday_options[:ssl] = settings.ssl if settings.ssl?
         
     | 
| 
      
 103 
     | 
    
         
            +
                    faraday_options[:proxy] = settings.proxy if settings.proxy?
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                    database = URI.encode_www_form_component(settings.database!)
         
     | 
| 
       76 
106 
     | 
    
         | 
| 
       77 
107 
     | 
    
         
             
                    Faraday.new(
         
     | 
| 
       78 
     | 
    
         
            -
                      "#{scheme}://#{host}#{BASE_PATH}/#{ 
     | 
| 
      
 108 
     | 
    
         
            +
                      "#{scheme}://#{host}#{BASE_PATH}/#{database}/".freeze,
         
     | 
| 
       79 
109 
     | 
    
         
             
                      faraday_options,
         
     | 
| 
       80 
110 
     | 
    
         
             
                      &block
         
     | 
| 
       81 
111 
     | 
    
         
             
                    )
         
     | 
| 
         @@ -83,7 +113,3 @@ module FmRest 
     | 
|
| 
       83 
113 
     | 
    
         
             
                end
         
     | 
| 
       84 
114 
     | 
    
         
             
              end
         
     | 
| 
       85 
115 
     | 
    
         
             
            end
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
            require "fmrest/v1/token_session"
         
     | 
| 
       88 
     | 
    
         
            -
            require "fmrest/v1/raise_errors"
         
     | 
| 
       89 
     | 
    
         
            -
            require "fmrest/v1/type_coercer"
         
     | 
| 
         @@ -0,0 +1,81 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module FmRest
         
     | 
| 
      
 4 
     | 
    
         
            +
              module V1
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Dates
         
     | 
| 
      
 6 
     | 
    
         
            +
                  FM_DATETIME_FORMAT_MATCHER = /MM|mm|dd|HH|ss|yyyy/.freeze
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  FM_DATE_TO_STRPTIME_SUBSTITUTIONS = {
         
     | 
| 
      
 9 
     | 
    
         
            +
                    "MM"   => "%m",
         
     | 
| 
      
 10 
     | 
    
         
            +
                    "dd"   => "%d",
         
     | 
| 
      
 11 
     | 
    
         
            +
                    "yyyy" => "%Y",
         
     | 
| 
      
 12 
     | 
    
         
            +
                    "HH"   => "%H",
         
     | 
| 
      
 13 
     | 
    
         
            +
                    "mm"   => "%M",
         
     | 
| 
      
 14 
     | 
    
         
            +
                    "ss"   => "%S"
         
     | 
| 
      
 15 
     | 
    
         
            +
                  }.freeze
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                  FM_DATE_TO_REGEXP_SUBSTITUTIONS = {
         
     | 
| 
      
 18 
     | 
    
         
            +
                    "MM"   => '(?:0[1-9]|1[012])',
         
     | 
| 
      
 19 
     | 
    
         
            +
                    "dd"   => '(?:0[1-9]|[12][0-9]|3[01])',
         
     | 
| 
      
 20 
     | 
    
         
            +
                    "yyyy" => '\d{4}',
         
     | 
| 
      
 21 
     | 
    
         
            +
                    "HH"   => '(?:[01]\d|2[0123])',
         
     | 
| 
      
 22 
     | 
    
         
            +
                    "mm"   => '[0-5]\d',
         
     | 
| 
      
 23 
     | 
    
         
            +
                    "ss"   => '[0-5]\d'
         
     | 
| 
      
 24 
     | 
    
         
            +
                  }.freeze
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  def self.extended(mod)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    mod.instance_eval do
         
     | 
| 
      
 28 
     | 
    
         
            +
                      @date_strptime = {}
         
     | 
| 
      
 29 
     | 
    
         
            +
                      @date_regexp = {}
         
     | 
| 
      
 30 
     | 
    
         
            +
                    end
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  # Converts a FM date-time format to `DateTime.strptime` format
         
     | 
| 
      
 34 
     | 
    
         
            +
                  #
         
     | 
| 
      
 35 
     | 
    
         
            +
                  # @param fm_format [String] The FileMaker date-time format
         
     | 
| 
      
 36 
     | 
    
         
            +
                  # @return [String] The `DateTime.strpdate` equivalent of the given FM
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #   date-time format
         
     | 
| 
      
 38 
     | 
    
         
            +
                  def fm_date_to_strptime_format(fm_format)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    @date_strptime[fm_format] ||=
         
     | 
| 
      
 40 
     | 
    
         
            +
                      fm_format.gsub(FM_DATETIME_FORMAT_MATCHER, FM_DATE_TO_STRPTIME_SUBSTITUTIONS).freeze
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  # Converts a FM date-time format to a Regexp. This is mostly used a
         
     | 
| 
      
 44 
     | 
    
         
            +
                  # quicker way of checking whether a FM field is a date field than
         
     | 
| 
      
 45 
     | 
    
         
            +
                  # Date|DateTime.strptime
         
     | 
| 
      
 46 
     | 
    
         
            +
                  #
         
     | 
| 
      
 47 
     | 
    
         
            +
                  # @param fm_format [String] The FileMaker date-time format
         
     | 
| 
      
 48 
     | 
    
         
            +
                  # @return [Regexp] A reegular expression matching strings in the given FM
         
     | 
| 
      
 49 
     | 
    
         
            +
                  #   date-time format
         
     | 
| 
      
 50 
     | 
    
         
            +
                  def fm_date_to_regexp(fm_format)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    @date_regexp[fm_format] ||= 
         
     | 
| 
      
 52 
     | 
    
         
            +
                      Regexp.new('\A' + fm_format.gsub(FM_DATETIME_FORMAT_MATCHER, FM_DATE_TO_REGEXP_SUBSTITUTIONS) + '\Z').freeze
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  # Takes a DateTime dt, and returns the correct local offset for that dt,
         
     | 
| 
      
 56 
     | 
    
         
            +
                  # daylight savings included, in fraction of a day.
         
     | 
| 
      
 57 
     | 
    
         
            +
                  #
         
     | 
| 
      
 58 
     | 
    
         
            +
                  # By default, if ActiveSupport's Time.zone is set it will be used instead
         
     | 
| 
      
 59 
     | 
    
         
            +
                  # of the system timezone.
         
     | 
| 
      
 60 
     | 
    
         
            +
                  #
         
     | 
| 
      
 61 
     | 
    
         
            +
                  # @param dt [DateTime] The DateTime to get the offset for
         
     | 
| 
      
 62 
     | 
    
         
            +
                  # @param zone [nil, String, TimeZone] The timezone to use to calculate
         
     | 
| 
      
 63 
     | 
    
         
            +
                  #   the offset (defaults to system timezone, or ActiveSupport's Time.zone
         
     | 
| 
      
 64 
     | 
    
         
            +
                  #   if set)
         
     | 
| 
      
 65 
     | 
    
         
            +
                  # @return [Rational] The offset in fraction of a day
         
     | 
| 
      
 66 
     | 
    
         
            +
                  def local_offset_for_datetime(dt, zone = nil)
         
     | 
| 
      
 67 
     | 
    
         
            +
                    dt = dt.new_offset(0)
         
     | 
| 
      
 68 
     | 
    
         
            +
                    time = ::Time.utc(dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec)
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                    # Do we have ActiveSupport's TimeZone?
         
     | 
| 
      
 71 
     | 
    
         
            +
                    time = if time.respond_to?(:in_time_zone)
         
     | 
| 
      
 72 
     | 
    
         
            +
                             time.in_time_zone(zone || ::Time.zone)
         
     | 
| 
      
 73 
     | 
    
         
            +
                           else
         
     | 
| 
      
 74 
     | 
    
         
            +
                             time.localtime
         
     | 
| 
      
 75 
     | 
    
         
            +
                           end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                    Rational(time.utc_offset, 86400) # seconds in one day (24*60*60)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  end
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
      
 80 
     | 
    
         
            +
              end
         
     | 
| 
      
 81 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -23,9 +23,11 @@ module FmRest 
     | 
|
| 
       23 
23 
     | 
    
         
             
                    402..499   => APIError::ParameterError,
         
     | 
| 
       24 
24 
     | 
    
         
             
                    500..599   => APIError::ValidationError,
         
     | 
| 
       25 
25 
     | 
    
         
             
                    800..899   => APIError::SystemError,
         
     | 
| 
      
 26 
     | 
    
         
            +
                    952        => APIError::InvalidToken,
         
     | 
| 
      
 27 
     | 
    
         
            +
                    953        => APIError::MaximumDataAPICallsExceeded,
         
     | 
| 
       26 
28 
     | 
    
         
             
                    1200..1299 => APIError::ScriptError,
         
     | 
| 
       27 
29 
     | 
    
         
             
                    1400..1499 => APIError::ODBCError
         
     | 
| 
       28 
     | 
    
         
            -
                  }
         
     | 
| 
      
 30 
     | 
    
         
            +
                  }.freeze
         
     | 
| 
       29 
31 
     | 
    
         | 
| 
       30 
32 
     | 
    
         
             
                  def on_complete(env)
         
     | 
| 
       31 
33 
     | 
    
         
             
                    # Sniff for either straight JSON parsing or Spyke's format
         
     | 
| 
         @@ -10,15 +10,15 @@ module FmRest 
     | 
|
| 
       10 
10 
     | 
    
         
             
                class TokenSession < Faraday::Middleware
         
     | 
| 
       11 
11 
     | 
    
         
             
                  class NoSessionTokenSet < FmRest::Error; end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                  HEADER_KEY = "Authorization" 
     | 
| 
      
 13 
     | 
    
         
            +
                  HEADER_KEY = "Authorization"
         
     | 
| 
       14 
14 
     | 
    
         
             
                  TOKEN_STORE_INTERFACE = [:load, :store, :delete].freeze
         
     | 
| 
       15 
15 
     | 
    
         
             
                  LOGOUT_PATH_MATCHER = %r{\A(#{FmRest::V1::Connection::BASE_PATH}/[^/]+/sessions/)[^/]+\Z}.freeze
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
17 
     | 
    
         
             
                  # @param app [#call]
         
     | 
| 
       18 
     | 
    
         
            -
                  # @param  
     | 
| 
       19 
     | 
    
         
            -
                  def initialize(app,  
     | 
| 
      
 18 
     | 
    
         
            +
                  # @param settings [FmRest::ConnectionSettings]
         
     | 
| 
      
 19 
     | 
    
         
            +
                  def initialize(app, settings)
         
     | 
| 
       20 
20 
     | 
    
         
             
                    super(app)
         
     | 
| 
       21 
     | 
    
         
            -
                    @ 
     | 
| 
      
 21 
     | 
    
         
            +
                    @settings = settings
         
     | 
| 
       22 
22 
     | 
    
         
             
                  end
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
                  # Entry point for the middleware when sending a request
         
     | 
| 
         @@ -32,27 +32,37 @@ module FmRest 
     | 
|
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                    @app.call(env).on_complete do |response_env|
         
     | 
| 
       34 
34 
     | 
    
         
             
                      if response_env[:status] == 401 # Unauthorized
         
     | 
| 
       35 
     | 
    
         
            -
                         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
      
 35 
     | 
    
         
            +
                        delete_token_store_key
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                        if @settings.autologin
         
     | 
| 
      
 38 
     | 
    
         
            +
                          env[:body] = request_body
         
     | 
| 
      
 39 
     | 
    
         
            +
                          set_auth_header(env)
         
     | 
| 
      
 40 
     | 
    
         
            +
                          return @app.call(env)
         
     | 
| 
      
 41 
     | 
    
         
            +
                        end
         
     | 
| 
       39 
42 
     | 
    
         
             
                      end
         
     | 
| 
       40 
43 
     | 
    
         
             
                    end
         
     | 
| 
       41 
44 
     | 
    
         
             
                  end
         
     | 
| 
       42 
45 
     | 
    
         | 
| 
       43 
46 
     | 
    
         
             
                  private
         
     | 
| 
       44 
47 
     | 
    
         | 
| 
      
 48 
     | 
    
         
            +
                  def delete_token_store_key
         
     | 
| 
      
 49 
     | 
    
         
            +
                    token_store.delete(token_store_key)
         
     | 
| 
      
 50 
     | 
    
         
            +
                    # Sometimes we may want to pass the :token in settings manually, and
         
     | 
| 
      
 51 
     | 
    
         
            +
                    # refrain from passing a :username. In that case the call to
         
     | 
| 
      
 52 
     | 
    
         
            +
                    # #token_store_key above would fail as it tries to fetch :username, so
         
     | 
| 
      
 53 
     | 
    
         
            +
                    # we purposely ignore that error.
         
     | 
| 
      
 54 
     | 
    
         
            +
                  rescue FmRest::ConnectionSettings::MissingSetting
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
       45 
57 
     | 
    
         
             
                  def handle_logout(env)
         
     | 
| 
       46 
     | 
    
         
            -
                    token = token_store.load(token_store_key)
         
     | 
| 
      
 58 
     | 
    
         
            +
                    token = @settings.token? ? @settings.token : token_store.load(token_store_key)
         
     | 
| 
       47 
59 
     | 
    
         | 
| 
       48 
60 
     | 
    
         
             
                    raise NoSessionTokenSet, "Couldn't send logout request because no session token was set" unless token
         
     | 
| 
       49 
61 
     | 
    
         | 
| 
       50 
62 
     | 
    
         
             
                    env.url.path = env.url.path.gsub(LOGOUT_PATH_MATCHER, "\\1#{token}")
         
     | 
| 
       51 
63 
     | 
    
         | 
| 
       52 
64 
     | 
    
         
             
                    @app.call(env).on_complete do |response_env|
         
     | 
| 
       53 
     | 
    
         
            -
                      if response_env[:status] == 200
         
     | 
| 
       54 
     | 
    
         
            -
                        token_store.delete(token_store_key)
         
     | 
| 
       55 
     | 
    
         
            -
                      end
         
     | 
| 
      
 65 
     | 
    
         
            +
                      delete_token_store_key if response_env[:status] == 200
         
     | 
| 
       56 
66 
     | 
    
         
             
                    end
         
     | 
| 
       57 
67 
     | 
    
         
             
                  end
         
     | 
| 
       58 
68 
     | 
    
         | 
| 
         @@ -65,43 +75,33 @@ module FmRest 
     | 
|
| 
       65 
75 
     | 
    
         
             
                    env.request_headers[HEADER_KEY] = "Bearer #{token}"
         
     | 
| 
       66 
76 
     | 
    
         
             
                  end
         
     | 
| 
       67 
77 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
                  #  
     | 
| 
      
 78 
     | 
    
         
            +
                  # Uses the token given in connection settings if available,
         
     | 
| 
      
 79 
     | 
    
         
            +
                  # otherwisek tries to get an existing token from the token store,
         
     | 
| 
       69 
80 
     | 
    
         
             
                  # otherwise requests one through basic auth,
         
     | 
| 
       70 
81 
     | 
    
         
             
                  # otherwise raises an exception.
         
     | 
| 
       71 
82 
     | 
    
         
             
                  #
         
     | 
| 
       72 
83 
     | 
    
         
             
                  def token
         
     | 
| 
      
 84 
     | 
    
         
            +
                    return @settings.token if @settings.token?
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
       73 
86 
     | 
    
         
             
                    token = token_store.load(token_store_key)
         
     | 
| 
       74 
87 
     | 
    
         
             
                    return token if token
         
     | 
| 
       75 
88 
     | 
    
         | 
| 
       76 
     | 
    
         
            -
                     
     | 
| 
       77 
     | 
    
         
            -
                      token_store.store(token_store_key, token)
         
     | 
| 
       78 
     | 
    
         
            -
                      return token
         
     | 
| 
       79 
     | 
    
         
            -
                    end
         
     | 
| 
      
 89 
     | 
    
         
            +
                    return nil unless @settings.autologin
         
     | 
| 
       80 
90 
     | 
    
         | 
| 
       81 
     | 
    
         
            -
                     
     | 
| 
       82 
     | 
    
         
            -
                     
     | 
| 
      
 91 
     | 
    
         
            +
                    token = V1.request_auth_token!(auth_connection)
         
     | 
| 
      
 92 
     | 
    
         
            +
                    token_store.store(token_store_key, token)
         
     | 
| 
      
 93 
     | 
    
         
            +
                    token
         
     | 
| 
       83 
94 
     | 
    
         
             
                  end
         
     | 
| 
       84 
95 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
                  #  
     | 
| 
       86 
     | 
    
         
            -
                  #
         
     | 
| 
       87 
     | 
    
         
            -
                  def request_token
         
     | 
| 
       88 
     | 
    
         
            -
                    resp = auth_connection.post do |req|
         
     | 
| 
       89 
     | 
    
         
            -
                      req.url V1.session_path
         
     | 
| 
       90 
     | 
    
         
            -
                      req.headers["Content-Type"] = "application/json"
         
     | 
| 
       91 
     | 
    
         
            -
                    end
         
     | 
| 
       92 
     | 
    
         
            -
                    return resp.body["response"]["token"] if resp.success?
         
     | 
| 
       93 
     | 
    
         
            -
                    false
         
     | 
| 
       94 
     | 
    
         
            -
                  end
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
                  # The key to use to store a token, uses the format host:database
         
     | 
| 
      
 96 
     | 
    
         
            +
                  # The key to use to store a token, uses the format host:database:username
         
     | 
| 
       97 
97 
     | 
    
         
             
                  #
         
     | 
| 
       98 
98 
     | 
    
         
             
                  def token_store_key
         
     | 
| 
       99 
99 
     | 
    
         
             
                    @token_store_key ||=
         
     | 
| 
       100 
100 
     | 
    
         
             
                      begin
         
     | 
| 
       101 
101 
     | 
    
         
             
                        # Strip the host part to just the hostname (i.e. no scheme or port)
         
     | 
| 
       102 
     | 
    
         
            -
                        host = @ 
     | 
| 
      
 102 
     | 
    
         
            +
                        host = @settings.host!
         
     | 
| 
       103 
103 
     | 
    
         
             
                        host = URI(host).hostname if host =~ /\Ahttps?:\/\//
         
     | 
| 
       104 
     | 
    
         
            -
                        "#{host}:#{@ 
     | 
| 
      
 104 
     | 
    
         
            +
                        "#{host}:#{@settings.database!}:#{@settings.username!}"
         
     | 
| 
       105 
105 
     | 
    
         
             
                      end
         
     | 
| 
       106 
106 
     | 
    
         
             
                  end
         
     | 
| 
       107 
107 
     | 
    
         | 
| 
         @@ -111,31 +111,23 @@ module FmRest 
     | 
|
| 
       111 
111 
     | 
    
         
             
                        if TOKEN_STORE_INTERFACE.all? { |method| token_store_option.respond_to?(method) }
         
     | 
| 
       112 
112 
     | 
    
         
             
                          token_store_option
         
     | 
| 
       113 
113 
     | 
    
         
             
                        elsif token_store_option.kind_of?(Class)
         
     | 
| 
       114 
     | 
    
         
            -
                          token_store_option. 
     | 
| 
      
 114 
     | 
    
         
            +
                          if token_store_option.respond_to?(:instance)
         
     | 
| 
      
 115 
     | 
    
         
            +
                            token_store_option.instance
         
     | 
| 
      
 116 
     | 
    
         
            +
                          else
         
     | 
| 
      
 117 
     | 
    
         
            +
                            token_store_option.new
         
     | 
| 
      
 118 
     | 
    
         
            +
                          end
         
     | 
| 
       115 
119 
     | 
    
         
             
                        else
         
     | 
| 
       116 
     | 
    
         
            -
                           
     | 
| 
       117 
     | 
    
         
            -
                          TokenStore::Memory.new
         
     | 
| 
      
 120 
     | 
    
         
            +
                          FmRest::TokenStore::Memory.new
         
     | 
| 
       118 
121 
     | 
    
         
             
                        end
         
     | 
| 
       119 
122 
     | 
    
         
             
                      end
         
     | 
| 
       120 
123 
     | 
    
         
             
                  end
         
     | 
| 
       121 
124 
     | 
    
         | 
| 
       122 
125 
     | 
    
         
             
                  def token_store_option
         
     | 
| 
       123 
     | 
    
         
            -
                    @ 
     | 
| 
      
 126 
     | 
    
         
            +
                    @settings.token_store || FmRest.token_store
         
     | 
| 
       124 
127 
     | 
    
         
             
                  end
         
     | 
| 
       125 
128 
     | 
    
         | 
| 
       126 
129 
     | 
    
         
             
                  def auth_connection
         
     | 
| 
       127 
     | 
    
         
            -
                    @auth_connection ||= V1. 
     | 
| 
       128 
     | 
    
         
            -
                      username = @options.fetch(:account_name) { @options.fetch(:username) }
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
                      conn.basic_auth username, @options.fetch(:password)
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
                      if @options[:log]
         
     | 
| 
       133 
     | 
    
         
            -
                        conn.response :logger, nil, bodies: true, headers: true
         
     | 
| 
       134 
     | 
    
         
            -
                      end
         
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
                      conn.response :json
         
     | 
| 
       137 
     | 
    
         
            -
                      conn.adapter Faraday.default_adapter
         
     | 
| 
       138 
     | 
    
         
            -
                    end
         
     | 
| 
      
 130 
     | 
    
         
            +
                    @auth_connection ||= V1.auth_connection(@settings)
         
     | 
| 
       139 
131 
     | 
    
         
             
                  end
         
     | 
| 
       140 
132 
     | 
    
         
             
                end
         
     | 
| 
       141 
133 
     | 
    
         
             
              end
         
     |