ultra_settings 0.0.1.rc1 → 1.0.1
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/CHANGELOG.md +5 -0
- data/README.md +321 -2
- data/VERSION +1 -1
- data/app/application.css +85 -0
- data/app/application.js +19 -0
- data/app/index.html.erb +93 -0
- data/app/layout.css +27 -0
- data/app/layout.html.erb +21 -0
- data/lib/ultra_settings/coerce.rb +98 -0
- data/lib/ultra_settings/configuration.rb +379 -79
- data/lib/ultra_settings/field.rb +57 -88
- data/lib/ultra_settings/rack_app.rb +25 -0
- data/lib/ultra_settings/railtie.rb +33 -0
- data/lib/ultra_settings/version.rb +5 -0
- data/lib/ultra_settings/web_view.rb +38 -0
- data/lib/ultra_settings/yaml_config.rb +78 -0
- data/lib/ultra_settings.rb +168 -74
- data/ultra_settings.gemspec +3 -4
- metadata +18 -35
data/lib/ultra_settings.rb
CHANGED
@@ -1,9 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "erb"
|
4
|
+
require "yaml"
|
5
|
+
require "time"
|
6
|
+
require "pathname"
|
7
|
+
require "singleton"
|
4
8
|
|
5
9
|
require_relative "ultra_settings/configuration"
|
10
|
+
require_relative "ultra_settings/coerce"
|
6
11
|
require_relative "ultra_settings/field"
|
12
|
+
require_relative "ultra_settings/rack_app"
|
13
|
+
require_relative "ultra_settings/web_view"
|
14
|
+
require_relative "ultra_settings/yaml_config"
|
15
|
+
require_relative "ultra_settings/version"
|
16
|
+
|
17
|
+
if defined?(Rails::Railtie)
|
18
|
+
require_relative "ultra_settings/railtie"
|
19
|
+
end
|
7
20
|
|
8
21
|
# This is the root namespace for UltraSettings. You can add configurations to
|
9
22
|
# this namespace using the add method.
|
@@ -12,11 +25,11 @@ require_relative "ultra_settings/field"
|
|
12
25
|
# UltraSettings.add(:test)
|
13
26
|
# UltraSettings.test # => TestConfiguration.instance
|
14
27
|
module UltraSettings
|
28
|
+
VALID_NAME__PATTERN = /\A[a-z_][a-zA-Z0-9_]*\z/
|
29
|
+
|
15
30
|
@configurations = {}
|
16
31
|
@mutex = Mutex.new
|
17
|
-
|
18
|
-
class NonStaticValueError < StandardError
|
19
|
-
end
|
32
|
+
@runtime_settings = nil
|
20
33
|
|
21
34
|
class << self
|
22
35
|
# Adds a configuration to the root namespace. The configuration will be
|
@@ -29,15 +42,15 @@ module UltraSettings
|
|
29
42
|
# @return [void]
|
30
43
|
def add(name, klass = nil)
|
31
44
|
name = name.to_s
|
32
|
-
unless name.match?(
|
45
|
+
unless name.match?(VALID_NAME__PATTERN)
|
33
46
|
raise ArgementError.new("Invalid configuration name: #{name.inspect}")
|
34
47
|
end
|
35
48
|
|
36
49
|
class_name = klass&.to_s
|
37
|
-
class_name ||= "#{name
|
50
|
+
class_name ||= "#{classify(name)}Configuration"
|
38
51
|
|
39
52
|
@mutex.synchronize do
|
40
|
-
@configurations
|
53
|
+
@configurations[name] = class_name
|
41
54
|
|
42
55
|
eval <<-RUBY, binding, __FILE__, __LINE__ + 1 # rubocop:disable Security/Eval
|
43
56
|
def #{name}
|
@@ -45,93 +58,158 @@ module UltraSettings
|
|
45
58
|
end
|
46
59
|
RUBY
|
47
60
|
end
|
61
|
+
end
|
48
62
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
Configuration.environment_variables_disabled = !!value
|
57
|
-
end
|
63
|
+
# Returns true if the provided class has been added as a configuration.
|
64
|
+
#
|
65
|
+
# @param class_name [Class, String] The name of the configuration class.
|
66
|
+
# @return [Boolean]
|
67
|
+
def include?(class_name)
|
68
|
+
@configurations.values.collect(&:to_s).include?(class_name.to_s)
|
69
|
+
end
|
58
70
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
71
|
+
# Control if settings can be loaded from environment variables. By default
|
72
|
+
# environment variables are enabled. This can also be disabled on
|
73
|
+
# individual Configuration classes.
|
74
|
+
#
|
75
|
+
# @param value [Boolean] Whether or not to load settings from environment variables.
|
76
|
+
# @return [void]
|
77
|
+
def environment_variables_disabled=(value)
|
78
|
+
Configuration.environment_variables_disabled = !!value
|
79
|
+
end
|
68
80
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
81
|
+
# Control if settings can be loaded from runtime settings. By default
|
82
|
+
# runtime settings are enabled. This can also be disabled on individual
|
83
|
+
# Configuration classes.
|
84
|
+
#
|
85
|
+
# @param value [Boolean] Whether or not to load settings from runtime settings.
|
86
|
+
# @return [void]
|
87
|
+
def runtime_settings_disabled=(value)
|
88
|
+
Configuration.runtime_settings_disabled = !!value
|
89
|
+
end
|
78
90
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
91
|
+
# Control if settings can be loaded from YAML configuration files. By
|
92
|
+
# default YAML configuration is enabled. This can also be disabled on
|
93
|
+
# individual Configuration classes.
|
94
|
+
#
|
95
|
+
# @param value [Boolean] Whether or not to load settings from YAML configuration.
|
96
|
+
# @return [void]
|
97
|
+
def yaml_config_disabled=(value)
|
98
|
+
Configuration.yaml_config_disabled = !!value
|
99
|
+
end
|
87
100
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
101
|
+
# Set the environment to use when loading YAML configuration files.
|
102
|
+
# In a Rails application this will be the current Rails environment.
|
103
|
+
# Defaults to "development".
|
104
|
+
#
|
105
|
+
# @param value [String] The environment name to use.
|
106
|
+
def yaml_config_env=(value)
|
107
|
+
Configuration.yaml_config_env = value
|
108
|
+
end
|
95
109
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
110
|
+
# Set the delimiter to use when determining environment variable names.
|
111
|
+
# By default this is an underscore.
|
112
|
+
#
|
113
|
+
# @param value [String] The delimiter to use.
|
114
|
+
# @return [void]
|
115
|
+
def env_var_delimiter=(value)
|
116
|
+
Configuration.env_var_delimiter = value.to_s
|
117
|
+
end
|
118
|
+
|
119
|
+
# Set the delimiter to use when determining setting names. By default
|
120
|
+
# this is a period.
|
121
|
+
#
|
122
|
+
# @param value [String] The delimiter to use.
|
123
|
+
def runtime_setting_delimiter=(value)
|
124
|
+
Configuration.runtime_setting_delimiter = value.to_s
|
125
|
+
end
|
126
|
+
|
127
|
+
# Control if environment variable names should be upcased. By default
|
128
|
+
# this is true.
|
129
|
+
#
|
130
|
+
# @param value [Boolean] Whether or not to upcase environment variable names.
|
131
|
+
# @return [void]
|
132
|
+
def env_var_upcase=(value)
|
133
|
+
Configuration.env_var_upcase = !!value
|
134
|
+
end
|
135
|
+
|
136
|
+
# Control if setting names should be upcased. By default this is false.
|
137
|
+
#
|
138
|
+
# @param value [Boolean] Whether or not to upcase setting names.
|
139
|
+
# @return [void]
|
140
|
+
def runtime_setting_upcase=(value)
|
141
|
+
Configuration.runtime_setting_upcase = !!value
|
142
|
+
end
|
143
|
+
|
144
|
+
# Set the directory to use when loading YAML configuration files.
|
145
|
+
# In a Rails application this will be the config directory.
|
146
|
+
# Otherwise it will be the current working directory.
|
147
|
+
#
|
148
|
+
# @param value [String, Pathname] The directory to use.
|
149
|
+
# @return [void]
|
150
|
+
def yaml_config_path=(value)
|
151
|
+
Configuration.yaml_config_path = value.to_s
|
152
|
+
end
|
153
|
+
|
154
|
+
# Set the object to use for runtime settings. This can be any object that
|
155
|
+
# responds to the [] method. If you are using the `super_settings` gem,
|
156
|
+
# you can set this to `SuperSettings`.
|
157
|
+
attr_writer :runtime_settings
|
104
158
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
159
|
+
# Get the object to use for runtime settings.
|
160
|
+
#
|
161
|
+
# @return [Object, nil]
|
162
|
+
# @api private
|
163
|
+
def __runtime_settings__
|
164
|
+
@runtime_settings
|
165
|
+
end
|
166
|
+
|
167
|
+
# Explicitly set setting values within a block. This is useful for testing
|
168
|
+
# or other situations where you want hard code a specific set of values.
|
169
|
+
#
|
170
|
+
# @param settings [Hash] The settings to set.
|
171
|
+
# @return [Object] The result of the block.
|
172
|
+
def override!(settings, &block)
|
173
|
+
settings = settings.to_a
|
174
|
+
config_name, values = settings.first
|
175
|
+
config_name = config_name.to_s
|
176
|
+
other_settings = settings[1..-1]
|
177
|
+
|
178
|
+
unless @configurations.include?(config_name)
|
179
|
+
raise ArgumentError.new("Unknown configuration: #{config_name.inspect}")
|
111
180
|
end
|
112
181
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
182
|
+
config = send(config_name)
|
183
|
+
config.override!(values) do
|
184
|
+
if other_settings.empty?
|
185
|
+
yield
|
186
|
+
else
|
187
|
+
override!(other_settings, &block)
|
188
|
+
end
|
120
189
|
end
|
121
190
|
end
|
122
191
|
|
192
|
+
# Get the names of all of the configurations that have been added.
|
193
|
+
#
|
194
|
+
# @return [Array<String>] The names of the configurations.
|
195
|
+
# @api private
|
196
|
+
def __configuration_names__
|
197
|
+
@configurations.keys
|
198
|
+
end
|
199
|
+
|
123
200
|
private
|
124
201
|
|
125
202
|
# Load a configuration class.
|
126
203
|
def __load_config__(name, class_name)
|
127
204
|
klass = @configurations[name]
|
128
205
|
|
129
|
-
|
130
|
-
|
206
|
+
# Hook for Rails development mode to reload the configuration class.
|
207
|
+
if klass && defined?(Rails.configuration.cache_classes) && !Rails.configuration.cache_classes
|
208
|
+
klass = class_name if klass != constantize(class_name)
|
131
209
|
end
|
132
210
|
|
133
|
-
|
134
|
-
klass = class_name
|
211
|
+
if klass.is_a?(String)
|
212
|
+
klass = constantize(class_name)
|
135
213
|
@mutex.synchronize do
|
136
214
|
unless klass < Configuration
|
137
215
|
raise TypeError.new("Configuration class #{class_name} does not inherit from UltraSettings::Configuration")
|
@@ -142,5 +220,21 @@ module UltraSettings
|
|
142
220
|
|
143
221
|
klass.instance
|
144
222
|
end
|
223
|
+
|
224
|
+
def classify(name)
|
225
|
+
# Use the Rails classify method if it is available since it will
|
226
|
+
# handle custom inflections.
|
227
|
+
if name.respond_to?(:classify)
|
228
|
+
name.classify
|
229
|
+
else
|
230
|
+
name.split("_").map(&:capitalize).join.gsub("/", "::")
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
def constantize(class_name)
|
235
|
+
class_name.split("::").reduce(Object) do |mod, name|
|
236
|
+
mod.const_get(name)
|
237
|
+
end
|
238
|
+
end
|
145
239
|
end
|
146
240
|
end
|
data/ultra_settings.gemspec
CHANGED
@@ -4,7 +4,7 @@ Gem::Specification.new do |spec|
|
|
4
4
|
spec.authors = ["Brian Durand"]
|
5
5
|
spec.email = ["bbdurand@gmail.com"]
|
6
6
|
|
7
|
-
spec.summary = "Unified configuration
|
7
|
+
spec.summary = "Unified application configuration that allows for configuration via environment variables, YAML files, and dynamic runtime setting."
|
8
8
|
|
9
9
|
spec.homepage = "https://github.com/bdurand/ultra_settings"
|
10
10
|
spec.license = "MIT"
|
@@ -17,6 +17,8 @@ Gem::Specification.new do |spec|
|
|
17
17
|
Gemfile
|
18
18
|
Gemfile.lock
|
19
19
|
Rakefile
|
20
|
+
config.ru
|
21
|
+
assets/
|
20
22
|
bin/
|
21
23
|
gemfiles/
|
22
24
|
spec/
|
@@ -29,8 +31,5 @@ Gem::Specification.new do |spec|
|
|
29
31
|
|
30
32
|
spec.required_ruby_version = ">= 2.5"
|
31
33
|
|
32
|
-
spec.add_dependency "rails", ">= 5"
|
33
|
-
spec.add_dependency "super_settings"
|
34
|
-
|
35
34
|
spec.add_development_dependency "bundler"
|
36
35
|
end
|
metadata
CHANGED
@@ -1,43 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ultra_settings
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Durand
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rails
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '5'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '5'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: super_settings
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
13
|
- !ruby/object:Gem::Dependency
|
42
14
|
name: bundler
|
43
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -63,9 +35,20 @@ files:
|
|
63
35
|
- MIT-LICENSE
|
64
36
|
- README.md
|
65
37
|
- VERSION
|
38
|
+
- app/application.css
|
39
|
+
- app/application.js
|
40
|
+
- app/index.html.erb
|
41
|
+
- app/layout.css
|
42
|
+
- app/layout.html.erb
|
66
43
|
- lib/ultra_settings.rb
|
44
|
+
- lib/ultra_settings/coerce.rb
|
67
45
|
- lib/ultra_settings/configuration.rb
|
68
46
|
- lib/ultra_settings/field.rb
|
47
|
+
- lib/ultra_settings/rack_app.rb
|
48
|
+
- lib/ultra_settings/railtie.rb
|
49
|
+
- lib/ultra_settings/version.rb
|
50
|
+
- lib/ultra_settings/web_view.rb
|
51
|
+
- lib/ultra_settings/yaml_config.rb
|
69
52
|
- ultra_settings.gemspec
|
70
53
|
homepage: https://github.com/bdurand/ultra_settings
|
71
54
|
licenses:
|
@@ -82,13 +65,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
65
|
version: '2.5'
|
83
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
67
|
requirements:
|
85
|
-
- - "
|
68
|
+
- - ">="
|
86
69
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
70
|
+
version: '0'
|
88
71
|
requirements: []
|
89
|
-
rubygems_version: 3.
|
72
|
+
rubygems_version: 3.4.12
|
90
73
|
signing_key:
|
91
74
|
specification_version: 4
|
92
|
-
summary: Unified configuration
|
93
|
-
|
75
|
+
summary: Unified application configuration that allows for configuration via environment
|
76
|
+
variables, YAML files, and dynamic runtime setting.
|
94
77
|
test_files: []
|