Class: HWSSettings

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

Overview

A Rack middleware application that creates a single configuration for Helix Web Services.

Most web services are modular Sinatra applications, which does come with it's own settings mechanism. We should try to avoid those settings in most cases. Perhaps only if those settings are only relevant to the logic directly within the Sinatra app.

Many other settings, like the port setting of the associated Helix Versioning Engine, should be exposed and overridable by the client application. These settings should be defined here.

This class provides middleware that will inject an hws_settings object into each request. This hws_settings object is seeded by values declared on this class. When the system starts, our system config file is read in, and default system values are overridden. On any request, these settings can be overridden by the user.

Additionally, there are “system” settings that are only overridable from the system config file. Client classes should reference this class directly: HWSSettings.system.

Naming Conventions

Use uppercase letters, numbers, or underscores only.

HTTP Header Override Syntax

We allow per-request overrides of settings via HTTP headers.

The key format of the custom setting is:

X-PERFORCE-HELIX_WEB_SERVICES-{key}

For example:

X-PERFORCE-HELIX_WEB_SERVICES-P4HOST: perforce.mycompany.com
X-PERFORCE-HELIX_WEB_SERVICES-P4CHARSET: auto

Please note that headers will be converted by Rack to all uppercase, hence our naming conventions.

System Config File

The system configuration is stored in the /etc/perforce/helix_web_services.conf file. This is a YAML file, and we override any locally defined variables with values found in this file. ()If you specify a value in this file we do not locally define, we ignore it.)

Example values in /etc/perforce/helix_web_services.conf:

P4HOST: 'perforce.mycompany.com'
P4PORT: '9991'

Constant Summary

SYSTEM_CONFIG_PATH =
'/etc/perforce/helix_web_services.conf'

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (HWSSettings) initialize(app)

Returns a new instance of HWSSettings



158
159
160
# File 'lib/hws_settings.rb', line 158

def initialize(app)
  @app = app
end

Class Method Details

+ (Object) overrides

Return the system overrides in our system configuration file.



145
146
147
# File 'lib/hws_settings.rb', line 145

def overrides
  return @overrides ||= init_overrides
end

+ (Object) settings

Returns baseline settings with system overrides applied.

This is a copy of state. If you want to alter the default settings in code instead of via config files, use the settings_handle



107
108
109
110
111
112
113
114
115
# File 'lib/hws_settings.rb', line 107

def settings
  s = OpenStruct.new(@settings)
  s.each_pair do |key, _|
    if overrides.respond_to?(key)
      s[key] = overrides[key]
    end
  end
  s
end

+ (Object) settings_handle

You can tweak the default settings directly here in code.



118
119
120
# File 'lib/hws_settings.rb', line 118

def settings_handle
  @settings
end

+ (Object) system

Returns our system settings overridden by local configuration in overrides.

This is a copy of the class system settings, suitable for editing and passing on.

See the official guide for declared options.



128
129
130
131
132
133
134
135
136
# File 'lib/hws_settings.rb', line 128

def system
  s = OpenStruct.new(@system)
  s.each_pair do |key, _|
    if overrides.respond_to?(key)
      s[key] = overrides[key]
    end
  end
  s
end

+ (Object) system_handle

In case your code wants to edit the system classes directly. Typically used for test initialization.



140
141
142
# File 'lib/hws_settings.rb', line 140

def system_handle
  @system
end

Instance Method Details

- (Object) call(env)



162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/hws_settings.rb', line 162

def call(env)
  hws_settings = self.class.settings

  env.each do |key, value|
    match = /^HTTP_X_PERFORCE_HELIX_WEB_SERVICES_(.*)$/.match(key)
    if match
      hws_settings[match[1]] = value
    end
  end

  env['hws_settings'] = hws_settings

  @app.call(env)
end