syspro.rb 3.47 KB
# frozen_string_literal: true

require 'cgi'
require 'faraday'
require 'json'
require 'logger'
require 'openssl'

require 'syspro/api_resource'
require 'syspro/errors'
require 'syspro/get_logon_profile'
require 'syspro/get_version'
require 'syspro/logoff'
require 'syspro/logon'
require 'syspro/syspro_client'
require 'syspro/singleton_api_resource'
require 'syspro/syspro_object'
require 'syspro/syspro_response'
require 'syspro/util'
require 'syspro/version'

require 'syspro/api_operations/request'
require 'syspro/api_operations/query'
require 'syspro/api_operations/transaction'

require 'syspro/business_objects/combrw'
require 'syspro/business_objects/comfch'
require 'syspro/business_objects/comfnd'
require 'syspro/business_objects/sorqry'
require 'syspro/business_objects/portor'
require 'syspro/business_objects/porqry'

require 'syspro/business_objects/models/sor'
require 'syspro/business_objects/models/sor_detail'
require 'syspro/business_objects/models/por_detail'

require 'syspro/business_objects/parsers/combrw_parser'
require 'syspro/business_objects/parsers/comfch_parser'
require 'syspro/business_objects/parsers/comfnd_parser'
require 'syspro/business_objects/parsers/sorqry_parser'
require 'syspro/business_objects/parsers/portor_parser'

# Main Module
module Syspro
  @api_base = 'http://syspro.wildlandlabs.com:90/SYSPROWCFService/Rest'

  @open_timeout = 30
  @read_timeout = 80

  @log_level = nil
  @logger = nil

  @max_network_retries = 0
  @max_network_retry_delay = 2
  @initial_network_retry_delay = 0.5

  class << self
    attr_accessor :api_base, :open_timeout, :read_timeout
  end

  # Options that should be persisted between API requests. This includes
  # client, which is an object containing an HTTP client to reuse.
  OPTS_PERSISTABLE = (
    Set[:client]
  ).freeze

  # map to the same values as the standard library's logger
  LEVEL_DEBUG = Logger::DEBUG
  LEVEL_ERROR = Logger::ERROR
  LEVEL_INFO = Logger::INFO

  # When set prompts the library to log some extra information to $stdout and
  # $stderr about what it's doing. For example, it'll produce information about
  # requests, responses, and errors that are received. Valid log levels are
  # `debug` and `info`, with `debug` being a little more verbose in places.
  #
  # Use of this configuration is only useful when `.logger` is _not_ set. When
  # it is, the decision what levels to print is entirely deferred to the logger.
  def self.log_level
    @log_level
  end

  def self.log_level=(val)
    # Backwards compatibility for values that we briefly allowed
    val = LEVEL_DEBUG if val == 'debug'
    val = LEVEL_INFO if val == 'info'
    if !val.nil? && ![LEVEL_DEBUG, LEVEL_ERROR, LEVEL_INFO].include?(val)
      raise(
        ArgumentError,
        'log_level should only be set to `nil`, `debug` or `info`'
      )
    end
    @log_level = val
  end

  # Sets a logger to which logging output will be sent. The logger should
  # support the same interface as the `Logger` class that's part of Ruby's
  # standard library (hint, anything in `Rails.logger` will likely be
  # suitable).
  #
  # If `.logger` is set, the value of `.log_level` is ignored. The decision on
  # what levels to print is entirely deferred to the logger.
  def self.logger
    @logger
  end

  def self.logger=(val)
    @logger = val
  end

  def self.max_network_retries
    @max_network_retries
  end

  def self.max_network_retries=(val)
    @max_network_retries = val.to_i
  end

  Syspro.log_level = ENV['SYSPRO_LOG'] unless ENV['SYSPRO_LOG'].nil?
end