ultra_settings 2.1.0 → 2.2.0
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 +6 -0
- data/README.md +21 -1
- data/VERSION +1 -1
- data/app/configuration.html.erb +15 -8
- data/lib/ultra_settings/configuration.rb +21 -18
- data/lib/ultra_settings.rb +20 -0
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: a34c970ed06134a778e29f09ef7640a255a82f45bbf74e703963a7d9b911b598
         | 
| 4 | 
            +
              data.tar.gz: 8065a6941af25b2d18b0e6617af074443c4de7da24541fad0d062f562a640c4d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d740cea45e6d52bf0392f9c867661b24b55f01ed0b3bb557f9730876af973d08036a47197539cee655a584a11b07b3ecb7ffcbd51cf4a6032605c9ab59b9277b
         | 
| 7 | 
            +
              data.tar.gz: f11544c978f8b17790d9fe50b5fb03338a680da9dd4e045cc6e45cad2ab5e6910b51c737fd2735052eb835232023707dbd93bb6460627376765c01779c1f099f
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. | |
| 4 4 | 
             
            The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
         | 
| 5 5 | 
             
            and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
         | 
| 6 6 |  | 
| 7 | 
            +
            ## 2.2.0
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            ### Added
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            - Added option for `UltraSettings.runtime_settings_url` to allow configuring a link for editing runtime settings from the web UI.
         | 
| 12 | 
            +
             | 
| 7 13 | 
             
            ## 2.1.0
         | 
| 8 14 |  | 
| 9 15 | 
             
            ### Added
         | 
    
        data/README.md
    CHANGED
    
    | @@ -10,6 +10,24 @@ UltraSettings is a Ruby gem designed for managing application settings from vari | |
| 10 10 |  | 
| 11 11 | 
             
            UltraSettings emphasizes well-documented configuration. You can include documentation directly in the configuration code. The gem also includes a [web UI](#web-ui) that can be mounted as a Rack app or embedded in other views allowing admin users to easily view configuration settings and documentation.
         | 
| 12 12 |  | 
| 13 | 
            +
            ## Table Of Contents
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            - [Key Features](#key-features)
         | 
| 16 | 
            +
            - [Usage](#usage)
         | 
| 17 | 
            +
              - [Defining Configurations](#defining-configurations)
         | 
| 18 | 
            +
              - [Field Options](#field-options)
         | 
| 19 | 
            +
              - [Environment Variables](#environment-variables)
         | 
| 20 | 
            +
              - [Runtime Settings](#runtime-settings)
         | 
| 21 | 
            +
              - [YAML Files](#yaml-files)
         | 
| 22 | 
            +
              - [Removing The Hierarchy](#removing-the-hierarchy)
         | 
| 23 | 
            +
              - [Accessing Settings](#accessing-settings)
         | 
| 24 | 
            +
            - [Web UI](#web-ui)
         | 
| 25 | 
            +
            - [Testing With UltraSettings](#testing-with-ultrasettings)
         | 
| 26 | 
            +
            - [Rollout Percentages](#rollout-percentages)
         | 
| 27 | 
            +
            - [Installation](#installation)
         | 
| 28 | 
            +
            - [Contributing](#contributing)
         | 
| 29 | 
            +
            - [License](#license)
         | 
| 30 | 
            +
             | 
| 13 31 | 
             
            ## Key Features
         | 
| 14 32 |  | 
| 15 33 | 
             
            This gem supports a three-layer hierarchy for defining configuration sources:
         | 
| @@ -176,6 +194,8 @@ You can customize the behavior of runtime setting names with the following optio | |
| 176 194 |  | 
| 177 195 | 
             
            - **Disabling Runtime Settings:** You can disable runtime settings as a default source for fields by setting `runtime_settings_disabled` to `true` in your configuration class. You can disable runtime settings on individual fields by setting `runtime_setting` on the field to `false`.
         | 
| 178 196 |  | 
| 197 | 
            +
            - **Editing Links** You can specify a URL for editing runtime settings from the web UI by setting `UltraSettings.runtime_settings_url` to the desired URL. This will add links to the runtime settings in the web UI. You can use the placeholder `${name}` in the URL which will be replaced with the name of the runtime setting. If you are using the `super_settings` gem for runtime settings, then you can target a setting by adding `#edit=${name}` to the root URL where `super_settings` is mounted.
         | 
| 198 | 
            +
             | 
| 179 199 | 
             
            If a setting value cannot be loaded from the runtime settings, then it's value will attempt to be loaded from a YAML file.
         | 
| 180 200 |  | 
| 181 201 | 
             
            ### YAML Files
         | 
| @@ -480,7 +500,7 @@ bundle exec rackup | |
| 480 500 | 
             
            You can test with some setting set by setting environment variable used in the test configuration.
         | 
| 481 501 |  | 
| 482 502 | 
             
            ```bash
         | 
| 483 | 
            -
            MY_SERVICE_HOST=host.example.com MY_SERVICE_TOKEN=secret bundle exec  | 
| 503 | 
            +
            MY_SERVICE_HOST=host.example.com MY_SERVICE_TOKEN=secret bundle exec rackup
         | 
| 484 504 | 
             
            ```
         | 
| 485 505 |  | 
| 486 506 | 
             
            You can test dark mode by setting the `COLOR_SCHEME` environment variable.
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            2. | 
| 1 | 
            +
            2.2.0
         | 
    
        data/app/configuration.html.erb
    CHANGED
    
    | @@ -52,14 +52,14 @@ | |
| 52 52 | 
             
                        <% end %>
         | 
| 53 53 | 
             
                      </td>
         | 
| 54 54 |  | 
| 55 | 
            -
                      <td>
         | 
| 55 | 
            +
                      <td style="word-wrap: break-word;">
         | 
| 56 56 | 
             
                        <% unless field.description.to_s.empty? %>
         | 
| 57 57 | 
             
                          <div>
         | 
| 58 58 | 
             
                            <%= html_escape(field.description) %>
         | 
| 59 59 | 
             
                          </div>
         | 
| 60 60 | 
             
                        <% end %>
         | 
| 61 61 |  | 
| 62 | 
            -
                        <ul style="margin: 0; padding: 0;list-style-type: disc; list-style-position:  | 
| 62 | 
            +
                        <ul style="margin: 0 0 0 1rem; padding: 0; list-style-type: disc; list-style-position: outside;">
         | 
| 63 63 | 
             
                          <% if field.env_var && !configuration.class.environment_variables_disabled? %>
         | 
| 64 64 | 
             
                            <li>
         | 
| 65 65 | 
             
                              <% if source == :env %>
         | 
| @@ -68,9 +68,8 @@ | |
| 68 68 | 
             
                              <% else %>
         | 
| 69 69 | 
             
                                Can be
         | 
| 70 70 | 
             
                              <% end %>
         | 
| 71 | 
            -
                              set with the
         | 
| 71 | 
            +
                              set with the environment variable
         | 
| 72 72 | 
             
                              <code><%= show_defined_value(field.env_var, configuration.__value_from_source__(field.name, :env), field.secret?) %></code>
         | 
| 73 | 
            -
                              environment variable.
         | 
| 74 73 | 
             
                              <% if source == :env %>
         | 
| 75 74 | 
             
                                </strong>
         | 
| 76 75 | 
             
                              <% end %>
         | 
| @@ -84,12 +83,21 @@ | |
| 84 83 | 
             
                              <% else %>
         | 
| 85 84 | 
             
                                Can be
         | 
| 86 85 | 
             
                              <% end %>
         | 
| 87 | 
            -
                              set with the
         | 
| 86 | 
            +
                              set with the runtime setting
         | 
| 88 87 | 
             
                              <code><%= show_defined_value(field.runtime_setting, configuration.__value_from_source__(field.name, :settings), field.secret?) %></code>
         | 
| 89 | 
            -
                              runtime setting.
         | 
| 90 88 | 
             
                              <% if source == :settings %>
         | 
| 91 89 | 
             
                                </strong>
         | 
| 92 90 | 
             
                              <% end %>
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                              <% edit_url = UltraSettings.runtime_settings_url(field.runtime_setting) %>
         | 
| 93 | 
            +
                              <% if edit_url %>
         | 
| 94 | 
            +
                                <a href="<%= html_escape(edit_url) %>" title="Edit <%= html_escape(field.runtime_setting) %>" style="text-decoration: none; color: inherit; vertical-align: middle;">
         | 
| 95 | 
            +
                                  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-pencil-square" viewBox="0 0 16 16">
         | 
| 96 | 
            +
                                    <path d="M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z"/>
         | 
| 97 | 
            +
                                    <path fill-rule="evenodd" d="M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5z"/>
         | 
| 98 | 
            +
                                  </svg>
         | 
| 99 | 
            +
                                </a>
         | 
| 100 | 
            +
                              <% end %>
         | 
| 93 101 | 
             
                            </li>
         | 
| 94 102 | 
             
                          <% end %>
         | 
| 95 103 | 
             
                          <% if field.yaml_key && !configuration.class.yaml_config_disabled? %>
         | 
| @@ -100,9 +108,8 @@ | |
| 100 108 | 
             
                              <% else %>
         | 
| 101 109 | 
             
                                Can be
         | 
| 102 110 | 
             
                              <% end %>
         | 
| 103 | 
            -
                              set with the
         | 
| 111 | 
            +
                              set with the configuration file key
         | 
| 104 112 | 
             
                              <code><%= show_defined_value(field.yaml_key, configuration.__value_from_source__(field.name, :yaml), field.secret?) %></code>
         | 
| 105 | 
            -
                              key in the configuration file.
         | 
| 106 113 | 
             
                              <% if source == :yaml %>
         | 
| 107 114 | 
             
                                </strong>
         | 
| 108 115 | 
             
                              <% end %>
         | 
| @@ -7,6 +7,9 @@ module UltraSettings | |
| 7 7 | 
             
                ALLOWED_NAME_PATTERN = /\A[a-z_][a-zA-Z0-9_]*\z/
         | 
| 8 8 | 
             
                ALLOWED_TYPES = [:string, :symbol, :integer, :float, :boolean, :datetime, :array].freeze
         | 
| 9 9 |  | 
| 10 | 
            +
                @env_var_prefix = nil
         | 
| 11 | 
            +
                @runtime_setting_prefix = nil
         | 
| 12 | 
            +
             | 
| 10 13 | 
             
                class << self
         | 
| 11 14 | 
             
                  # Define a field on the configuration. This will create a getter method for the field.
         | 
| 12 15 | 
             
                  # The field value will be read from the environment, runtime settings, or a YAML file
         | 
| @@ -435,10 +438,10 @@ module UltraSettings | |
| 435 438 | 
             
                end
         | 
| 436 439 |  | 
| 437 440 | 
             
                def initialize
         | 
| 438 | 
            -
                  @ | 
| 439 | 
            -
                  @ | 
| 440 | 
            -
                  @ | 
| 441 | 
            -
                  @ | 
| 441 | 
            +
                  @ultra_settings_mutex = Mutex.new
         | 
| 442 | 
            +
                  @ultra_settings_memoized_values = {}
         | 
| 443 | 
            +
                  @ultra_settings_override_values = {}
         | 
| 444 | 
            +
                  @ultra_settings_yaml_config = nil
         | 
| 442 445 | 
             
                end
         | 
| 443 446 |  | 
| 444 447 | 
             
                def [](name)
         | 
| @@ -450,7 +453,7 @@ module UltraSettings | |
| 450 453 | 
             
                end
         | 
| 451 454 |  | 
| 452 455 | 
             
                def override!(values, &block)
         | 
| 453 | 
            -
                  save_val = @ | 
| 456 | 
            +
                  save_val = @ultra_settings_override_values[Thread.current.object_id]
         | 
| 454 457 |  | 
| 455 458 | 
             
                  temp_values = (save_val || {}).dup
         | 
| 456 459 | 
             
                  values.each do |key, value|
         | 
| @@ -458,13 +461,13 @@ module UltraSettings | |
| 458 461 | 
             
                  end
         | 
| 459 462 |  | 
| 460 463 | 
             
                  begin
         | 
| 461 | 
            -
                    @ | 
| 462 | 
            -
                      @ | 
| 464 | 
            +
                    @ultra_settings_mutex.synchronize do
         | 
| 465 | 
            +
                      @ultra_settings_override_values[Thread.current.object_id] = temp_values
         | 
| 463 466 | 
             
                    end
         | 
| 464 467 | 
             
                    yield
         | 
| 465 468 | 
             
                  ensure
         | 
| 466 | 
            -
                    @ | 
| 467 | 
            -
                      @ | 
| 469 | 
            +
                    @ultra_settings_mutex.synchronize do
         | 
| 470 | 
            +
                      @ultra_settings_override_values[Thread.current.object_id] = save_val
         | 
| 468 471 | 
             
                    end
         | 
| 469 472 | 
             
                  end
         | 
| 470 473 | 
             
                end
         | 
| @@ -530,12 +533,12 @@ module UltraSettings | |
| 530 533 | 
             
                  field = self.class.send(:defined_fields)[name]
         | 
| 531 534 | 
             
                  return nil unless field
         | 
| 532 535 |  | 
| 533 | 
            -
                  if field.static? && @ | 
| 534 | 
            -
                    return @ | 
| 536 | 
            +
                  if field.static? && @ultra_settings_memoized_values.include?(name)
         | 
| 537 | 
            +
                    return @ultra_settings_memoized_values[name]
         | 
| 535 538 | 
             
                  end
         | 
| 536 539 |  | 
| 537 | 
            -
                  if @ | 
| 538 | 
            -
                    value = field.coerce(@ | 
| 540 | 
            +
                  if @ultra_settings_override_values[Thread.current.object_id]&.include?(name)
         | 
| 541 | 
            +
                    value = field.coerce(@ultra_settings_override_values[Thread.current.object_id][name])
         | 
| 539 542 | 
             
                  else
         | 
| 540 543 | 
             
                    env = ENV if field.env_var
         | 
| 541 544 | 
             
                    settings = UltraSettings.__runtime_settings__ if field.runtime_setting
         | 
| @@ -549,11 +552,11 @@ module UltraSettings | |
| 549 552 | 
             
                  end
         | 
| 550 553 |  | 
| 551 554 | 
             
                  if field.static?
         | 
| 552 | 
            -
                    @ | 
| 553 | 
            -
                      if @ | 
| 554 | 
            -
                        value = @ | 
| 555 | 
            +
                    @ultra_settings_mutex.synchronize do
         | 
| 556 | 
            +
                      if @ultra_settings_memoized_values.include?(name)
         | 
| 557 | 
            +
                        value = @ultra_settings_memoized_values[name]
         | 
| 555 558 | 
             
                      else
         | 
| 556 | 
            -
                        @ | 
| 559 | 
            +
                        @ultra_settings_memoized_values[name] = value
         | 
| 557 560 | 
             
                      end
         | 
| 558 561 | 
             
                    end
         | 
| 559 562 | 
             
                  end
         | 
| @@ -578,7 +581,7 @@ module UltraSettings | |
| 578 581 | 
             
                end
         | 
| 579 582 |  | 
| 580 583 | 
             
                def __yaml_config__
         | 
| 581 | 
            -
                  @ | 
| 584 | 
            +
                  @ultra_settings_yaml_config ||= self.class.load_yaml_config || {}
         | 
| 582 585 | 
             
                end
         | 
| 583 586 | 
             
              end
         | 
| 584 587 | 
             
            end
         | 
    
        data/lib/ultra_settings.rb
    CHANGED
    
    | @@ -6,6 +6,7 @@ require "time" | |
| 6 6 | 
             
            require "pathname"
         | 
| 7 7 | 
             
            require "singleton"
         | 
| 8 8 | 
             
            require "digest"
         | 
| 9 | 
            +
            require "uri"
         | 
| 9 10 |  | 
| 10 11 | 
             
            require_relative "ultra_settings/configuration"
         | 
| 11 12 | 
             
            require_relative "ultra_settings/coerce"
         | 
| @@ -33,6 +34,7 @@ module UltraSettings | |
| 33 34 | 
             
              @configurations = {}
         | 
| 34 35 | 
             
              @mutex = Mutex.new
         | 
| 35 36 | 
             
              @runtime_settings = nil
         | 
| 37 | 
            +
              @runtime_settings_url = nil
         | 
| 36 38 |  | 
| 37 39 | 
             
              class << self
         | 
| 38 40 | 
             
                # Adds a configuration to the root namespace. The configuration will be
         | 
| @@ -167,6 +169,24 @@ module UltraSettings | |
| 167 169 | 
             
                  @runtime_settings
         | 
| 168 170 | 
             
                end
         | 
| 169 171 |  | 
| 172 | 
            +
                # Set the URL for changing runtime settings. If this is set, then a link to the
         | 
| 173 | 
            +
                # URL will be displayed in the web view for fields that support runtime settings.
         | 
| 174 | 
            +
                # The URL may contain a `${name}` placeholder that will be replaced with the name
         | 
| 175 | 
            +
                # of the setting.
         | 
| 176 | 
            +
                attr_writer :runtime_settings_url
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                # Get the URL for changing runtime settings.
         | 
| 179 | 
            +
                #
         | 
| 180 | 
            +
                # @param name [String] The name of the setting.
         | 
| 181 | 
            +
                # @return [String, nil]
         | 
| 182 | 
            +
                # @api private
         | 
| 183 | 
            +
                def runtime_settings_url(name)
         | 
| 184 | 
            +
                  url = @runtime_settings_url.to_s
         | 
| 185 | 
            +
                  return nil if url.empty?
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                  url.gsub("${name}", URI.encode_www_form_component(name))
         | 
| 188 | 
            +
                end
         | 
| 189 | 
            +
             | 
| 170 190 | 
             
                def fields_secret_by_default=(value)
         | 
| 171 191 | 
             
                  Configuration.fields_secret_by_default = value
         | 
| 172 192 | 
             
                end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: ultra_settings
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Brian Durand
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024-10- | 
| 11 | 
            +
            date: 2024-10-28 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         |