Class: Rhales::Configuration

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

Overview

Configuration management for Rhales library

Provides a clean, testable alternative to global configuration access. Supports block-based configuration typical of Ruby gems and dependency injection.

Usage: Rhales.configure do |config| config.default_locale = ‘en’ config.template_paths = [‘app/templates’, ‘lib/templates’] config.features = { account_creation: true } end

Defined Under Namespace

Classes: ConfigurationError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConfiguration

Returns a new instance of Configuration.



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/rhales/configuration.rb', line 146

def initialize
  # Set sensible defaults
  @default_locale         = 'en'
  @app_environment        = 'development'
  @development_enabled    = false
  @template_paths         = []
  @cache_templates        = true
  @csrf_token_name        = 'csrf_token'
  @nonce_header_name      = 'nonce'
  @csp_enabled            = true
  @auto_nonce             = true
  @csp_policy             = default_csp_policy
  @features               = {}
  @site_ssl_enabled       = false
  @cache_parsed_templates = true
  @cache_ttl              = 3600 # 1 hour
  @hydration              = HydrationConfiguration.new
end

Instance Attribute Details

#api_base_urlObject

Build API base URL from site configuration



138
139
140
# File 'lib/rhales/configuration.rb', line 138

def api_base_url
  @api_base_url
end

#app_environmentObject

Core application settings



126
127
128
# File 'lib/rhales/configuration.rb', line 126

def app_environment
  @app_environment
end

#auto_nonceObject

Security settings



132
133
134
# File 'lib/rhales/configuration.rb', line 132

def auto_nonce
  @auto_nonce
end

#cache_parsed_templatesObject

Performance settings



141
142
143
# File 'lib/rhales/configuration.rb', line 141

def cache_parsed_templates
  @cache_parsed_templates
end

#cache_templatesObject

Template settings



129
130
131
# File 'lib/rhales/configuration.rb', line 129

def cache_templates
  @cache_templates
end

#cache_ttlObject

Performance settings



141
142
143
# File 'lib/rhales/configuration.rb', line 141

def cache_ttl
  @cache_ttl
end

#csp_enabledObject

Security settings



132
133
134
# File 'lib/rhales/configuration.rb', line 132

def csp_enabled
  @csp_enabled
end

#csp_policyObject

Security settings



132
133
134
# File 'lib/rhales/configuration.rb', line 132

def csp_policy
  @csp_policy
end

#csrf_token_nameObject

Security settings



132
133
134
# File 'lib/rhales/configuration.rb', line 132

def csrf_token_name
  @csrf_token_name
end

#default_localeObject

Core application settings



126
127
128
# File 'lib/rhales/configuration.rb', line 126

def default_locale
  @default_locale
end

#development_enabledObject

Core application settings



126
127
128
# File 'lib/rhales/configuration.rb', line 126

def development_enabled
  @development_enabled
end

#featuresObject

Feature flags



135
136
137
# File 'lib/rhales/configuration.rb', line 135

def features
  @features
end

#hydrationObject

Hydration settings



144
145
146
# File 'lib/rhales/configuration.rb', line 144

def hydration
  @hydration
end

#nonce_header_nameObject

Security settings



132
133
134
# File 'lib/rhales/configuration.rb', line 132

def nonce_header_name
  @nonce_header_name
end

#site_hostObject

Site configuration



138
139
140
# File 'lib/rhales/configuration.rb', line 138

def site_host
  @site_host
end

#site_ssl_enabledObject

Site configuration



138
139
140
# File 'lib/rhales/configuration.rb', line 138

def site_ssl_enabled
  @site_ssl_enabled
end

#template_pathsObject

Template settings



129
130
131
# File 'lib/rhales/configuration.rb', line 129

def template_paths
  @template_paths
end

#template_rootObject

Template settings



129
130
131
# File 'lib/rhales/configuration.rb', line 129

def template_root
  @template_root
end

Instance Method Details

#default_csp_policyObject

Default CSP policy with secure defaults



186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# File 'lib/rhales/configuration.rb', line 186

def default_csp_policy
  {
    'default-src' => ["'self'"],
    'script-src' => ["'self'", "'nonce-{{nonce}}'"],
    'style-src' => ["'self'", "'nonce-{{nonce}}'", "'unsafe-hashes'"],
    'img-src' => ["'self'", 'data:'],
    'font-src' => ["'self'"],
    'connect-src' => ["'self'"],
    'base-uri' => ["'self'"],
    'form-action' => ["'self'"],
    'frame-ancestors' => ["'none'"],
    'object-src' => ["'none'"],
    'media-src' => ["'self'"],
    'worker-src' => ["'self'"],
    'manifest-src' => ["'self'"],
    'prefetch-src' => ["'self'"],
    'upgrade-insecure-requests' => [],
  }.freeze
end

#development?Boolean

Check if development mode is enabled

Returns:

  • (Boolean)


176
177
178
# File 'lib/rhales/configuration.rb', line 176

def development?
  @development_enabled || @app_environment == 'development'
end

#feature_enabled?(feature_name) ⇒ Boolean

Get feature flag value

Returns:

  • (Boolean)


207
208
209
# File 'lib/rhales/configuration.rb', line 207

def feature_enabled?(feature_name)
  @features[feature_name] || @features[feature_name.to_s] || false
end

#freeze!Object

Deep freeze configuration to prevent modification after setup



236
237
238
239
240
# File 'lib/rhales/configuration.rb', line 236

def freeze!
  @features.freeze
  @template_paths.freeze
  freeze
end

#production?Boolean

Check if production mode

Returns:

  • (Boolean)


181
182
183
# File 'lib/rhales/configuration.rb', line 181

def production?
  @app_environment == 'production'
end

#validate!Object

Validate configuration

Raises:



212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# File 'lib/rhales/configuration.rb', line 212

def validate!
  errors = []

  # Validate locale
  if @default_locale.nil? || @default_locale.empty?
    errors << 'default_locale cannot be empty'
  end

  # Validate template paths exist if specified
  @template_paths.each do |path|
    unless Dir.exist?(path)
      errors << "Template path does not exist: #{path}"
    end
  end

  # Validate cache TTL
  if @cache_ttl && @cache_ttl <= 0
    errors << 'cache_ttl must be positive'
  end

  raise ConfigurationError, "Configuration errors: #{errors.join(', ')}" unless errors.empty?
end