better_settings 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 838170a01ea177f40b02a01a7e7308c6b1cf6528
4
- data.tar.gz: 94ddb23c277b6ae2ba9c9eb12cfab77635163d87
2
+ SHA256:
3
+ metadata.gz: 34fa70db51a53b69111e00f5a879b0b88a77bf1b8bf8f407d2e6c892396867fb
4
+ data.tar.gz: bb872caccae378615c55100c464f4eb2ddf15cd732dc7a230cb703ccb743d6c6
5
5
  SHA512:
6
- metadata.gz: 0241b28bfe8bdc7d143c21dbf7526b88142bae2e958c4a9c85a8369ff14c390383a3db14abff98122fc7e2593384d2b0ca3b52fc6a3471700476f9eba173c161
7
- data.tar.gz: 254487a597d7e78ca6569d2df82634c48551dfa2715a49533d29bfcd11ade1472df41eebf5cc5d7661fa3a1ba5dfd6610759e21663dc3b8da2ffa03e3aa68f41
6
+ metadata.gz: cd721daa3d8b187d4ddf15b7757e8376c92c09289dea815d3b47234d7da0fceec3acb3a55f15df1d616de3c4b637d386388499e0882e4f07c59ab1d2aff31b42
7
+ data.tar.gz: e3a8e901ae7f28b40a6c60b16266e7e4da2a32262ea88f3b9238826d0d01b8a29a058e3db713a53dd343be14853503a8d9b2c898a8aa2fe3d8bdca09484b027e
data/README.md CHANGED
@@ -1,9 +1,38 @@
1
- BetterSettings [![Gem Version](https://img.shields.io/gem/v/better_settings.svg?colorB=e9573f)](https://rubygems.org/gems/better_settings) [![Build Status](https://travis-ci.org/ElMassimo/better_settings.svg)](https://travis-ci.org/ElMassimo/better_settings) [![Coverage Status](https://coveralls.io/repos/github/ElMassimo/better_settings/badge.svg?branch=master)](https://coveralls.io/github/ElMassimo/better_settings?branch=master) [![Inline docs](http://inch-ci.org/github/ElMassimo/better_settings.svg)](http://inch-ci.org/github/ElMassimo/better_settings) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/ElMassimo/better_settings/blob/master/LICENSE.txt)
2
- =======================================
3
-
4
- A robust settings library that can read YML files and provide an immutable object allowing to access settings through method calls. Can be used in __any Ruby app__, __not just Rails__.
5
-
6
- ### Installation
1
+ <h1 align="center">
2
+ Better Settings
3
+ <p align="center">
4
+ <a href="https://github.com/ElMassimo/better_settings/actions">
5
+ <img alt="Build Status" src="https://github.com/ElMassimo/better_settings/workflows/build/badge.svg"/>
6
+ </a>
7
+ <a href="https://codeclimate.com/github/ElMassimo/better_settings">
8
+ <img alt="Maintainability" src="https://codeclimate.com/github/ElMassimo/better_settings/badges/gpa.svg"/>
9
+ </a>
10
+ <a href="https://codeclimate.com/github/ElMassimo/better_settings">
11
+ <img alt="Test Coverage" src="https://codeclimate.com/github/ElMassimo/better_settings/badges/coverage.svg"/>
12
+ </a>
13
+ <a href="https://rubygems.org/gems/better_settings">
14
+ <img alt="Gem Version" src="https://img.shields.io/gem/v/better_settings.svg?colorB=e9573f"/>
15
+ </a>
16
+ <a href="https://github.com/ElMassimo/better_settings/blob/master/LICENSE.txt">
17
+ <img alt="License" src="https://img.shields.io/badge/license-MIT-428F7E.svg"/>
18
+ </a>
19
+ </p>
20
+ </h1>
21
+
22
+ A robust settings library for Ruby. Access your settings by calling methods on a safe immutable object.
23
+
24
+ ## Features ⚡️
25
+
26
+ - 🚀 __Light and Performant:__ settings are eagerly loaded, no `method_missing` tricks, no dependencies.
27
+ - 💬 __Useful Error Messages:__ when trying to access a setting that does not exist.
28
+ - 💎 __Immutability:__ once created settings can't be modified.
29
+ - 🗂 __Multiple Files:__ useful to create multiple environment-specific source files.
30
+ - ❕ __No Optional Setings:__ since it encourages unsafe access patterns.
31
+
32
+ You can read more about it in [the blog announcement](https://maximomussini.com/posts/better-settings/).
33
+
34
+
35
+ ## Installation 💿
7
36
 
8
37
  Add this line to your application's Gemfile:
9
38
 
@@ -19,12 +48,11 @@ Or install it yourself as:
19
48
 
20
49
  $ gem install better_settings
21
50
 
22
- ### Usage
51
+ ## Usage 🚀
23
52
 
24
- #### 1. Define a class
53
+ ### 1. Define a class
25
54
 
26
- Instead of defining a Settings constant for you, that task is left to you. Simply create a class in your application
27
- that looks like:
55
+ Create a class in your application that extends `BetterSettings`:
28
56
 
29
57
  ```ruby
30
58
  # app/models/settings.rb
@@ -33,12 +61,16 @@ class Settings < BetterSettings
33
61
  end
34
62
  ```
35
63
 
36
- #### 2. Create your settings
64
+ We use `Rails.root` in this example to obtain an absolute path to a plain YML file,
65
+ but when using other Ruby frameworks you can use `File.expand_path` with `__dir__` instead.
66
+
67
+ Also, we specified a `namespace` with the current environment. You can provide
68
+ any value that corresponds to a key in the YAML file that you want to use.
69
+ This allows to target different environments with the same file.
37
70
 
38
- Notice above we specified an absolute path to our settings file called `application.yml`. This is just a typical YAML file.
39
- Also notice above that we specified a namespace for our environment. A namespace is just an optional string that corresponds to a key in the YAML file.
71
+ ### 2. Create your settings
40
72
 
41
- Using a namespace allows us to change our configuration depending on our environment:
73
+ Now, create a YAML file that contains all the possible namespaces:
42
74
 
43
75
  ```yaml
44
76
  # config/application.yml
@@ -59,43 +91,56 @@ production:
59
91
  <<: *defaults
60
92
  ```
61
93
 
62
- #### 3. Access your settings
94
+ The `defaults` group in this example won't be used directly, we are using YAML's
95
+ syntax to reuse those values when we use `<<: *defaults`, allowing us to share
96
+ these values across environments.
63
97
 
64
- >> Rails.env
65
- => "development"
98
+ ### 3. Access your settings
66
99
 
67
- >> Settings.mailer
68
- => "#<Settings ... >"
100
+ You can use these settings anywhere, for example in a model:
69
101
 
70
- >> Settings.mailer.root
71
- => "www.example.com
102
+ ```ruby
103
+ class Post < ActiveRecord::Base
104
+ self.per_page = Settings.pagination.posts_per_page
105
+ end
106
+ ```
72
107
 
73
- >> Settings.port
74
- => 3000
108
+ or in the console:
75
109
 
76
- >> Settings.dynamic
77
- => "Did you know you can use ERB inside the YML file? Env is development."
110
+ ```
111
+ >> Rails.env
112
+ => "development"
78
113
 
79
- You can use these settings anywhere, for example in a model:
114
+ >> Settings.mailer
115
+ => "#<Settings ... >"
80
116
 
81
- class Post < ActiveRecord::Base
82
- self.per_page = Settings.pagination.posts_per_page
83
- end
117
+ >> Settings.mailer.root
118
+ => "www.example.com
84
119
 
85
- ### Advanced Setup ⚙
86
- Name it `Settings`, name it `Config`, name it whatever you want. Add as many or as few as you like, read from as many files as necessary (nested keys will be merged).
120
+ >> Settings.port
121
+ => 3000
87
122
 
88
- We usually read a few optional files for the `development` and `test` environment, which allows each developer to override some settings in their own local environment (we git ignore `development.yml` and `test.yml`).
123
+ >> Settings.dynamic
124
+ => "Did you know you can use ERB inside the YML file? Env is development."
125
+ ```
126
+
127
+ ## Advanced Setup ⚙
128
+
129
+ You can create as many setting classes as you need, and name them in different ways, and read from as many files as necessary (nested keys will be merged).
130
+
131
+ The way I like to use it, is by reading a few optional files for the _development_ and _test_ environments, which allows each developer to override some settings in their own local environment (and git ignoring `development.yml` and `test.yml`).
89
132
 
90
133
  ```ruby
91
134
  # app/models/settings.rb
92
135
  class Settings < BetterSettings
93
- source Rails.root.join('config', 'application.yml'), namespace: Rails.env
94
- source Rails.root.join('config', 'development.yml'), namespace: Rails.env, optional: true if Rails.env.development?
95
- source Rails.root.join('config', 'test.yml'), namespace: Rails.env, optional: true if Rails.env.test?
136
+ source Rails.root.join('config/application.yml'), namespace: Rails.env
137
+ source Rails.root.join('config/development.yml'), namespace: Rails.env, optional: true if Rails.env.development?
138
+ source Rails.root.join('config/test.yml'), namespace: Rails.env, optional: true if Rails.env.test?
96
139
  end
97
140
  ```
98
- Our `application.yml` looks like this:
141
+
142
+ Then `application.yml` looks like this:
143
+
99
144
  ```yaml
100
145
  # application.yml
101
146
  defaults: &defaults
@@ -123,15 +168,12 @@ production:
123
168
  <<: *server_defaults
124
169
  host: 'example.com'
125
170
  ```
171
+
126
172
  A developer might want to override some settings by defining a `development.yml` such as:
173
+
127
174
  ```yaml
128
175
  development:
129
176
  auto_logout: true
130
177
  ````
131
- The main advantage is that those changes won't be tracked by source control :smiley:
132
178
 
133
- ## Opinionated Design
134
- After using [settingslogic](https://github.com/settingslogic/settingslogic) for a long time, we learned some lessons, which are distilled in the following decisions:
135
- - __Immutability:__ Once created settings can't be modified.
136
- - __No Optional Setings:__ Any optional setting can be modeled in a safer way, this library doesn't allow them.
137
- - __Not Tied to a Source File:__ Useful to create multiple environment-specific files.
179
+ The main advantage is that those changes won't be tracked in source control :smiley:
@@ -17,6 +17,7 @@ class BetterSettings
17
17
  ]
18
18
 
19
19
  attr_reader :settings
20
+
20
21
  def_delegators :settings, :to_h, :to_hash
21
22
 
22
23
  # Public: Initializes a new settings object from a Hash or compatible object.
@@ -34,7 +35,6 @@ class BetterSettings
34
35
  end
35
36
 
36
37
  # Internal: Display explicit errors for typos and missing settings.
37
- # rubocop:disable Style/MethodMissing
38
38
  def method_missing(name, *)
39
39
  raise MissingSetting, "Missing setting '#{ name }' in #{ @parent }"
40
40
  end
@@ -53,13 +53,14 @@ private
53
53
  # Internal: Defines a getter for the specified setting.
54
54
  def create_accessor(key, value)
55
55
  raise InvalidSettingKey if !key.is_a?(String) || key !~ VALID_SETTING_NAME || RESERVED_METHODS.include?(key)
56
+
56
57
  instance_variable_set("@#{ key }", auto_wrap(key, value))
57
58
  singleton_class.send(:attr_reader, key)
58
59
  end
59
60
 
60
61
  # Internal: Recursively merges two hashes (in case ActiveSupport is not available).
61
62
  def deep_merge(this_hash, other_hash)
62
- this_hash.merge(other_hash) do |key, this_val, other_val|
63
+ this_hash.merge(other_hash) do |_key, this_val, other_val|
63
64
  if this_val.is_a?(Hash) && other_val.is_a?(Hash)
64
65
  deep_merge(this_val, other_val)
65
66
  else
@@ -69,6 +70,7 @@ private
69
70
  end
70
71
 
71
72
  class MissingSetting < StandardError; end
73
+
72
74
  class InvalidSettingKey < StandardError; end
73
75
 
74
76
  class << self
@@ -98,12 +100,14 @@ private
98
100
  # Internal: Methods called at the class level are delegated to this instance.
99
101
  def root_settings
100
102
  raise ArgumentError, '`source` must be specified for the settings' unless defined?(@root_settings)
103
+
101
104
  @root_settings
102
105
  end
103
106
 
104
107
  # Internal: Parses a yml file that can optionally use ERB templating.
105
108
  def yaml_to_hash(file_name)
106
- return {} if (content = open(file_name).read).empty?
109
+ return {} if (content = File.open(file_name).read).empty?
110
+
107
111
  YAML.load(ERB.new(content).result).to_hash
108
112
  end
109
113
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class BetterSettings
4
- VERSION = '1.0.0'
4
+ VERSION = '1.0.1'
5
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'support/settings'
3
5
 
@@ -6,47 +8,47 @@ describe BetterSettings do
6
8
  Settings.new(value, parent: 'new_settings')
7
9
  end
8
10
 
9
- it 'should access settings' do
11
+ it 'accesses settings' do
10
12
  expect(Settings.setting2).to eq 5
11
13
  end
12
14
 
13
- it 'should access nested settings' do
15
+ it 'accesses nested settings' do
14
16
  expect(Settings.setting1.setting1_child).to eq 'saweet'
15
17
  end
16
18
 
17
- it 'should access settings in nested arrays' do
19
+ it 'accesses settings in nested arrays' do
18
20
  expect(Settings.array.first.name).to eq 'first'
19
21
  end
20
22
 
21
- it 'should access deep nested settings' do
23
+ it 'accesses deep nested settings' do
22
24
  expect(Settings.setting1.deep.another).to eq 'my value'
23
25
  end
24
26
 
25
- it 'should access extra deep nested settings' do
27
+ it 'accesses extra deep nested settings' do
26
28
  expect(Settings.setting1.deep.child.value).to eq 2
27
29
  end
28
30
 
29
- it 'should enable erb' do
31
+ it 'enables erb' do
30
32
  expect(Settings.setting3).to eq 25
31
33
  end
32
34
 
33
- it 'should namespace settings' do
35
+ it 'namespaces settings' do
34
36
  expect(DevSettings.language.haskell.paradigm).to eq 'functional'
35
37
  expect(DevSettings.language.smalltalk.paradigm).to eq 'object-oriented'
36
38
  expect(DevSettings.environment).to eq 'development'
37
39
  end
38
40
 
39
- it 'should distinguish nested keys' do
41
+ it 'distinguishes nested keys' do
40
42
  expect(Settings.language.haskell.paradigm).to eq 'functional'
41
43
  expect(Settings.language.smalltalk.paradigm).to eq 'object oriented'
42
44
  end
43
45
 
44
- it 'should not override global methods' do
46
+ it 'does not override global methods' do
45
47
  expect(Settings.global).to eq 'GLOBAL'
46
48
  expect(Settings.custom).to eq 'CUSTOM'
47
49
  end
48
50
 
49
- it 'should raise a helpful error message' do
51
+ it 'raises a helpful error message' do
50
52
  expect {
51
53
  Settings.missing
52
54
  }.to raise_error(BetterSettings::MissingSetting, /Missing setting 'missing' in/)
@@ -55,56 +57,56 @@ describe BetterSettings do
55
57
  }.to raise_error(BetterSettings::MissingSetting, /Missing setting 'missing' in 'language' section/)
56
58
  end
57
59
 
58
- it 'should raise an error on a nil source argument' do
60
+ it 'raises an error on a nil source argument' do
59
61
  expect { NoSource.foo.bar }.to raise_error(ArgumentError, '`source` must be specified for the settings')
60
62
  end
61
63
 
62
- it 'should support instance usage as well' do
64
+ it 'supports instance usage as well' do
63
65
  expect(new_settings(Settings.setting1).setting1_child).to eq 'saweet'
64
66
  end
65
67
 
66
- it 'should handle invalid name settings' do
68
+ it 'handles invalid name settings' do
67
69
  expect {
68
70
  new_settings('some-dash-setting#' => 'dashtastic')
69
71
  }.to raise_error(BetterSettings::InvalidSettingKey)
70
72
  end
71
73
 
72
- it 'should handle settings with nil value' do
74
+ it 'handles settings with nil value' do
73
75
  expect(Settings.nil).to eq nil
74
76
  end
75
77
 
76
- it 'should handle settings with false value' do
78
+ it 'handles settings with false value' do
77
79
  expect(Settings.false).to eq false
78
80
  end
79
81
 
80
82
  # If .name is called on BetterSettings itself, handle appropriately
81
83
  # by delegating to Hash
82
- it 'should have the parent class always respond with Module.name' do
83
- expect(BetterSettings.name).to eq 'BetterSettings'
84
+ it 'has the parent class always respond with Module.name' do
85
+ expect(described_class.name).to eq 'BetterSettings'
84
86
  end
85
87
 
86
88
  # If .name is not a property, delegate to superclass
87
- it 'should respond with Module.name' do
89
+ it 'responds with Module.name' do
88
90
  expect(DevSettings.name).to eq 'DevSettings'
89
91
  end
90
92
 
91
93
  # If .name is a property, respond with that instead of delegating to superclass
92
- it 'should allow a name setting to be overriden' do
94
+ it 'allows a name setting to be overriden' do
93
95
  expect(Settings.name).to eq 'test'
94
96
  end
95
97
 
96
98
  describe 'to_h' do
97
- it 'should handle empty file' do
99
+ it 'handles empty file' do
98
100
  expect(NoSettings.to_h).to be_empty
99
101
  end
100
102
 
101
- it 'should be similar to the internal representation' do
103
+ it 'is similar to the internal representation' do
102
104
  expect(settings = Settings.send(:root_settings)).to be_is_a(Settings)
103
105
  expect(hash = settings.send(:settings)).to be_is_a(Hash)
104
106
  expect(Settings.to_h).to eq hash
105
107
  end
106
108
 
107
- it 'should not mutate the original when getting a copy' do
109
+ it 'does not mutate the original when getting a copy' do
108
110
  result = Settings.language.to_h.merge('haskell' => 'awesome')
109
111
  expect(result.class).to eq Hash
110
112
  expect(result).to eq(
@@ -117,7 +119,7 @@ describe BetterSettings do
117
119
  end
118
120
 
119
121
  describe '#to_hash' do
120
- it 'should return a new instance of a Hash object' do
122
+ it 'returns a new instance of a Hash object' do
121
123
  expect(Settings.to_hash).to be_kind_of(Hash)
122
124
  expect(Settings.to_hash.class.name).to eq 'Hash'
123
125
  expect(Settings.to_hash.object_id).not_to eq Settings.object_id
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'simplecov'
2
- require 'coveralls'
3
4
  SimpleCov.start { add_filter '/spec/' }
4
- Coveralls.wear!
5
5
 
6
6
  require 'better_settings'
7
7
  require 'rspec/given'
8
- require 'pry-byebug'
8
+ require 'pry-byebug' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Settings < BetterSettings
2
4
  source "#{ File.dirname(__FILE__) }/settings.yml"
3
- source "#{File.dirname(__FILE__)}/settings_empty.yml"
5
+ source "#{ File.dirname(__FILE__) }/settings_empty.yml"
4
6
 
5
7
  def self.custom
6
8
  'CUSTOM'
@@ -17,8 +19,8 @@ class DevSettings < BetterSettings
17
19
  end
18
20
 
19
21
  class NoSettings < BetterSettings
20
- source "#{File.dirname(__FILE__)}/settings_empty.yml", optional: true
21
- source "#{File.dirname(__FILE__)}/settings_none.yml", optional: true
22
+ source "#{ File.dirname(__FILE__) }/settings_empty.yml", optional: true
23
+ source "#{ File.dirname(__FILE__) }/settings_none.yml", optional: true
22
24
  end
23
25
 
24
26
  class NoSource < BetterSettings
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_settings
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Máximo Mussini
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-29 00:00:00.000000000 Z
11
+ date: 2021-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: coveralls
14
+ name: pry-byebug
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: pry-byebug
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,21 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: rspec-given
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
@@ -53,21 +67,35 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: rspec-given
70
+ name: rubocop-rspec
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - "~>"
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
- version: '3.0'
75
+ version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - "~>"
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
- version: '3.0'
69
- description: Settings solution for Rails applications that can read YAML files (ERB-enabled)
70
- and allows to access using method calls.
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "<"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.18'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "<"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.18'
97
+ description: Settings solution for Ruby or Rails applications that can read ERB-enabled
98
+ YAML files. Safe, performant, with friendly error messages, and no dependencies.
71
99
  email:
72
100
  - maximomussini@gmail.com
73
101
  executables: []
@@ -85,26 +113,25 @@ homepage: https://github.com/ElMassimo/better_settings
85
113
  licenses:
86
114
  - MIT
87
115
  metadata: {}
88
- post_install_message:
116
+ post_install_message:
89
117
  rdoc_options: []
90
118
  require_paths:
91
119
  - lib
92
120
  required_ruby_version: !ruby/object:Gem::Requirement
93
121
  requirements:
94
- - - "~>"
122
+ - - ">="
95
123
  - !ruby/object:Gem::Version
96
- version: '2.2'
124
+ version: 2.3.0
97
125
  required_rubygems_version: !ruby/object:Gem::Requirement
98
126
  requirements:
99
127
  - - ">="
100
128
  - !ruby/object:Gem::Version
101
129
  version: '0'
102
130
  requirements: []
103
- rubyforge_project:
104
- rubygems_version: 2.6.11
105
- signing_key:
131
+ rubygems_version: 3.2.3
132
+ signing_key:
106
133
  specification_version: 4
107
- summary: 'Settings for Rails applications: simple, immutable, better.'
134
+ summary: 'Settings for Ruby applications: fast, immutable, better.'
108
135
  test_files:
109
136
  - spec/better_settings/better_settings_spec.rb
110
137
  - spec/spec_helper.rb