Class: Ecfr::ClientConfiguration

Inherits:
Object
  • Object
show all
Defined in:
lib/ecfr/client_configuration.rb

Overview

Configures the Ecfr gem from a consuming application's settings and credentials. Lives in the gem (rather than each app) so the contract between app config and the gem is defined and validated in one place.

Everything the gem can't assume exists is passed in explicitly:

- settings:    the app's Settings object (duck-typed; dotted/[] access)
- env:         the app environment, used in the user_agent string
- credentials: optional; anything responding to #dig (e.g. Rails credentials)

An optional block is yielded the config last, after every settings-derived assignment, so the app can override any value (request hooks, timeouts, urls, ...) without the gem depending on app-level constants.

Defined Under Namespace

Classes: InvalidCredentials, InvalidSettings

Constant Summary collapse

REQUIRED_SETTINGS =

Settings with no gem-side default must be present. Everything else has a default in Ecfr::Configuration::CONFIG_DEFAULTS and is therefore optional.

[
  %i[container process],
  %i[container role],
  %i[container hostname]
].freeze

Class Method Summary collapse

Class Method Details

.initialize_for(service, settings, env, credentials = nil) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ecfr/client_configuration.rb', line 28

def self.initialize_for(service, settings, env, credentials = nil)
  validate_settings!(settings)
  validate_credentials!(credentials)

  Ecfr.configure do |config|
    config.user_agent = [
      "ecfr", service, env,
      dig_setting(settings, :container, :process),
      dig_setting(settings, :container, :role),
      dig_setting(settings, :container, :hostname)
    ].join("-")

    log_http_requests = dig_setting(settings, :services, :ecfr, :log_http_requests)
    config.log_http_requests = log_http_requests unless log_http_requests.nil?

    cache_responses = dig_setting(settings, :services, :ecfr, :cache_responses)
    config.cache_responses = cache_responses unless cache_responses.nil?

    # prefer internal urls when setting up gem
    base_url = dig_setting(settings, :services, :ecfr, :internal_base_url) ||
      dig_setting(settings, :services, :ecfr, :base_url)
    config.base_url = base_url if base_url.present?

    profile_base_url = dig_setting(settings, :services, :ofr, :profile, :internal_base_url) ||
      dig_setting(settings, :services, :ofr, :profile, :base_url)
    config.ofr_profile_service_base_url = profile_base_url if profile_base_url.present?

    profile_path = dig_setting(settings, :services, :ofr, :profile, :path)
    config.ofr_profile_service_path = profile_path if profile_path.present?

    # configure services according to settings
    service_keys = Ecfr.services.filter_map do |service_module|
      # ofr profile is configured separately above
      next if service_module::Base.service_name == "OFR Profile"

      service_module::Base.service_name.downcase.tr(" ", "_")
    end

    service_keys.each do |service_key|
      url = dig_setting(settings, :services, :ecfr, service_key, :url)
      config.send(:"#{service_key}_url=", url) if url.present?

      path = dig_setting(settings, :services, :ecfr, service_key, :path)
      config.send(:"#{service_key}_path=", path) if path.present?
    end

    open_timeout = dig_setting(settings, :services, :ecfr, :open_timeout)
    config.open_timeout = open_timeout unless open_timeout.nil?

    pdf_timeout = dig_setting(settings, :app, :timeouts, :pdf_timeout)
    config.prince_xml_service_pdf_timeout = pdf_timeout unless pdf_timeout.nil?

    # basic auth - some endpoints require auth (optional)
    config.ecfr_basic_auth_username = credentials&.dig(:services, :ecfr, :http_basic, :username)
    config.ecfr_basic_auth_password = credentials&.dig(:services, :ecfr, :http_basic, :password)

    # let the app override any of the above (request hooks, urls, timeouts)
    yield config if block_given?
  end
end