typed-config 1.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +5 -0
- data/README.md +109 -0
- data/lib/generators/typed_config/install_generator.rb +36 -0
- data/lib/generators/typed_config/templates/config.rb +9 -0
- data/lib/generators/typed_config/templates/settings.local.yml +3 -0
- data/lib/generators/typed_config/templates/settings.yml +3 -0
- data/lib/generators/typed_config/templates/settings/development.yml +0 -0
- data/lib/generators/typed_config/templates/settings/production.yml +0 -0
- data/lib/generators/typed_config/templates/settings/test.yml +0 -0
- data/lib/typed-config.rb +10 -0
- data/lib/typed_config/loader.rb +20 -0
- data/lib/typed_config/railtie.rb +24 -0
- data/lib/typed_config/rbi_builder.rb +50 -0
- data/lib/typed_config/schema.rb +42 -0
- data/lib/typed_config/schema_builder.rb +77 -0
- data/lib/typed_config/setup.rb +55 -0
- data/lib/typed_config/structs.rbi.erb +12 -0
- data/lib/typed_config/structs/_structs.rb +7 -0
- data/lib/typed_config/structs/settings.rbi +9 -0
- data/lib/typed_config/tasks/typed-config/rbi.rake +12 -0
- data/lib/typed_config/version.rb +6 -0
- data/rbi/schema.rbi +15 -0
- data/rbi/schema_builder.rbi +16 -0
- metadata +183 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3551b257563c33aefb5d1da190ddc584bfb1893edc271c775d82ab3fe46c30f1
|
4
|
+
data.tar.gz: 2a7b822b9d3e22c2e4c678f4e00dd5b3618eb5d51ecd8210ff1af60c35f74d10
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1c0477d6708d339e692e504503685d4757a4d00d36b968d385cf920006993b70e529a99413b8ac958ebf9bbb15ca31bab86a80decf672aca17944f4f8089f45b
|
7
|
+
data.tar.gz: 12cc17789e2b9531a8dc05f8770c53dd0f5005af125351dd8833606137931f6a7d5615e752f84a4ea473023992f72f4dcdcda4aa16b4c95907ff2b36367c28af
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# TypedConfig
|
2
|
+
|
3
|
+
TypedConfig is a simple solution for managing multi-environment application
|
4
|
+
settings whilst maintaining type safety.
|
5
|
+
|
6
|
+
Currently, only Rails is supported out of the box.
|
7
|
+
|
8
|
+
TypedConfig is meant to run in projects using [Sorbet](https://sorbet.org/),
|
9
|
+
although it can run in projects not using it and still gain from the easy-to-configure
|
10
|
+
settings.
|
11
|
+
|
12
|
+
This project has been inspired by [Config](https://github.com/rubyconfig/config) and
|
13
|
+
it's meant to be an easy drop-in replacement with type-safety.
|
14
|
+
|
15
|
+
## Installing
|
16
|
+
|
17
|
+
Add the gem to your `Gemfile`:
|
18
|
+
```ruby
|
19
|
+
gem 'typed-config'
|
20
|
+
```
|
21
|
+
|
22
|
+
Run the install rake task to initialize the config schema and settings files:
|
23
|
+
```ruby
|
24
|
+
rails g typed_config:install
|
25
|
+
```
|
26
|
+
|
27
|
+
This will generate the schema file `config/config.rb` where the schema of the
|
28
|
+
settings should be defined, and the settings file:
|
29
|
+
```
|
30
|
+
config/settings.yml
|
31
|
+
config/settings.local.yml
|
32
|
+
config/settings/development.yml
|
33
|
+
config/settings/production.yml
|
34
|
+
config/settings/test.yml
|
35
|
+
```
|
36
|
+
It will also update the existing `.gitignore` to local settings files.
|
37
|
+
|
38
|
+
## Defining the Settings Properties
|
39
|
+
First, the schema of the Settings object must be defined in the `config/config.rb`
|
40
|
+
file, for example:
|
41
|
+
```ruby
|
42
|
+
TypedConfig::Schema.configure do |s|
|
43
|
+
s.const :env, String
|
44
|
+
s.const :app do
|
45
|
+
s.const :domain, T.nilable(String)
|
46
|
+
s.const :port, T.nilable(Integer)
|
47
|
+
end
|
48
|
+
s.const :support do
|
49
|
+
s.const :email, String
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
Now in the code, you can access any properties as a `T::Struct`. All properties will be
|
55
|
+
available across the application in a `Settings` object:
|
56
|
+
```ruby
|
57
|
+
Settings.env
|
58
|
+
Settting.support.email
|
59
|
+
|
60
|
+
# Example:
|
61
|
+
config.action_mailer.asset_host = "https://#{Settings.app.domain}"
|
62
|
+
```
|
63
|
+
|
64
|
+
## Changing the Settings
|
65
|
+
The settings are defined in YAML (with ERB support). Once the schema is defined, update
|
66
|
+
one of the settings file to load the data:
|
67
|
+
```yaml
|
68
|
+
env: <%= ENV['RACK_ENV'] %>
|
69
|
+
app:
|
70
|
+
domain: <%= ENV['APP_DOMAIN'] %>
|
71
|
+
port: <%= ENV.fetch('APP_PORT', 3000) %>
|
72
|
+
support:
|
73
|
+
email: 'support@typed-config.com
|
74
|
+
```
|
75
|
+
When loaded, `typed-config` will try to automatically coerce the values to match the ones
|
76
|
+
specified in the schema.
|
77
|
+
|
78
|
+
You may define default (or different) settings for each environment by changing the
|
79
|
+
`config/settings/#{env}.yml`. For instance, to have different defaults in the test
|
80
|
+
environment, add the settings to `config/settings/test.yml`.
|
81
|
+
|
82
|
+
In order from top to bottom - the settings in the lower files overwrite the ones higher -
|
83
|
+
these are the files loaded:
|
84
|
+
```
|
85
|
+
config/settings.yml
|
86
|
+
config/settings/#{environment}.yml
|
87
|
+
|
88
|
+
config/settings.local.yml
|
89
|
+
config/settings/#{environment}.local.yml
|
90
|
+
```
|
91
|
+
|
92
|
+
## Type Safety
|
93
|
+
To make use of the type-safety feature, you must re-generate the RBI files when the schema
|
94
|
+
is changed using a rake command:
|
95
|
+
```shell
|
96
|
+
bundle exec rake typed-config:rbi
|
97
|
+
```
|
98
|
+
|
99
|
+
Now you can run sorbet to check the types of the settings properties:
|
100
|
+
```ruby
|
101
|
+
T.reveal_type(Settings.app.domain) # Revealed type: T.nilable(String)
|
102
|
+
|
103
|
+
sig { params(server_write_key: String).void }
|
104
|
+
def configure_segment(server_write_key); end
|
105
|
+
|
106
|
+
|
107
|
+
configure_segment(server_write_key: Settings.segment.server_write_key)
|
108
|
+
# Expected String but found T.nilable(String) for argument server_write_key
|
109
|
+
```
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# typed: ignore
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module TypedConfig
|
5
|
+
module Generators
|
6
|
+
class InstallGenerator < ::Rails::Generators::Base
|
7
|
+
desc 'Generated typed-config files for Rails.'
|
8
|
+
|
9
|
+
source_root File.expand_path('templates', __dir__)
|
10
|
+
|
11
|
+
def copy_config
|
12
|
+
template 'config.rb', 'config/config.rb'
|
13
|
+
end
|
14
|
+
|
15
|
+
def copy_settings
|
16
|
+
template 'settings.yml', 'config/settings.yml'
|
17
|
+
template 'settings.local.yml', 'config/settings.local.yml'
|
18
|
+
directory 'settings', 'config/settings'
|
19
|
+
end
|
20
|
+
|
21
|
+
def modify_gitignore
|
22
|
+
create_file '.gitignore' unless File.file?('.gitignore')
|
23
|
+
|
24
|
+
append_to_file '.gitignore' do
|
25
|
+
"\nconfig/settings.local.yml\n" \
|
26
|
+
"config/settings/*.local.yml\n" \
|
27
|
+
"config/environments/*.local.yml\n"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def generate_rbi
|
32
|
+
rake 'typed-config:rbi'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/lib/typed-config.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'erb'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
module TypedConfig
|
8
|
+
class Loader
|
9
|
+
extend T::Sig
|
10
|
+
|
11
|
+
sig { params(filename: String).returns(T::Hash[String, T.untyped]) }
|
12
|
+
def load(filename)
|
13
|
+
return {} unless File.file?(filename)
|
14
|
+
|
15
|
+
contents = File.read(filename)
|
16
|
+
yaml = YAML.safe_load(ERB.new(contents).result) || {}
|
17
|
+
T.cast(yaml, T::Hash[String, T.untyped])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative 'setup'
|
5
|
+
|
6
|
+
module TypedConfig
|
7
|
+
class Railtie < ::Rails::Railtie
|
8
|
+
railtie_name :typed_config
|
9
|
+
|
10
|
+
rake_tasks do
|
11
|
+
path = File.expand_path(__dir__)
|
12
|
+
Dir.glob("#{path}/tasks/**/*.rake").each { |f| load f }
|
13
|
+
end
|
14
|
+
|
15
|
+
def preload
|
16
|
+
Setup.new.call(
|
17
|
+
config_path: ::Rails.root.join('config'),
|
18
|
+
env: ::Rails.env,
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
config.before_configuration { T.unsafe(self).preload }
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
module TypedConfig
|
7
|
+
class RBIBuilder
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig { void }
|
11
|
+
def initialize
|
12
|
+
@structs = T.let(
|
13
|
+
{},
|
14
|
+
T::Hash[
|
15
|
+
String,
|
16
|
+
T::Array[{ name: Symbol, type: String }],
|
17
|
+
],
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
sig { params(struct: Class).void }
|
22
|
+
def add_struct(struct)
|
23
|
+
@structs[T.must(struct.name)] ||= []
|
24
|
+
end
|
25
|
+
|
26
|
+
sig { params(struct: Class, name: Symbol, type: T.untyped).void }
|
27
|
+
def add_const(struct, name, type)
|
28
|
+
add_struct(struct)
|
29
|
+
T.must(@structs[T.must(struct.name)]).push({ name: name, type: type.name })
|
30
|
+
end
|
31
|
+
|
32
|
+
sig { params(schema_const_name: String).returns(String) }
|
33
|
+
def build(schema_const_name)
|
34
|
+
b = binding
|
35
|
+
b.local_variable_set(:schema_const_name, schema_const_name)
|
36
|
+
b.local_variable_set(:structs, @structs)
|
37
|
+
template_file = File.read(File.join(File.dirname(__FILE__), 'structs.rbi.erb'))
|
38
|
+
ERB.new(template_file, trim_mode: '>').result(b)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
sig { params(consts: T::Array[{ name: Symbol, type: String }]).returns(String) }
|
44
|
+
def build_consts(consts)
|
45
|
+
consts.inject('') do |prev, const|
|
46
|
+
prev + " const :#{const[:name]}, #{const[:type]}\n"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative './schema_builder'
|
5
|
+
require_relative './structs/_structs'
|
6
|
+
|
7
|
+
module TypedConfig
|
8
|
+
class Schema
|
9
|
+
@schema_builder = T.let(nil, T.nilable(SchemaBuilder))
|
10
|
+
@schema_const_name = T.let('Settings', String)
|
11
|
+
|
12
|
+
class << self
|
13
|
+
extend T::Sig
|
14
|
+
|
15
|
+
sig { returns(String) }
|
16
|
+
attr_reader :schema_const_name
|
17
|
+
|
18
|
+
sig do
|
19
|
+
params(
|
20
|
+
const_name: T.nilable(String),
|
21
|
+
_blk: T.proc.params(config: SchemaBuilder).void,
|
22
|
+
).void
|
23
|
+
end
|
24
|
+
def configure(const_name = nil, &_blk)
|
25
|
+
@schema_const_name = const_name || schema_const_name
|
26
|
+
yield schema_builder
|
27
|
+
end
|
28
|
+
|
29
|
+
sig { returns(String) }
|
30
|
+
def rbi
|
31
|
+
schema_builder.build_rbi(schema_const_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
sig { returns(SchemaBuilder) }
|
37
|
+
def schema_builder
|
38
|
+
@schema_builder ||= SchemaBuilder.new('Settings')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative './rbi_builder'
|
5
|
+
require_relative './structs/_structs'
|
6
|
+
|
7
|
+
module TypedConfig
|
8
|
+
class SchemaBuilder
|
9
|
+
extend T::Sig
|
10
|
+
|
11
|
+
sig { params(struct: String, rbi_builder: RBIBuilder).void }
|
12
|
+
def initialize(struct, rbi_builder: RBIBuilder.new)
|
13
|
+
@rbi_builder = rbi_builder
|
14
|
+
@struct = T.let(create_struct(Structs, struct), Class)
|
15
|
+
end
|
16
|
+
|
17
|
+
sig do
|
18
|
+
params(
|
19
|
+
name: Symbol,
|
20
|
+
type: T.untyped,
|
21
|
+
blk: T.nilable(T.proc.void),
|
22
|
+
).void
|
23
|
+
end
|
24
|
+
def const(name, type = nil, &blk)
|
25
|
+
clazz = retrieve_class(name: name, type: type, &blk)
|
26
|
+
raise ArgumentError, "Attribute '#{name}' must receive a type or block." if clazz.nil?
|
27
|
+
|
28
|
+
rbi_builder.add_const(struct, name, clazz)
|
29
|
+
struct.tap do |scope|
|
30
|
+
scope.const name, clazz
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
sig { params(schema_const_name: String).returns(String) }
|
35
|
+
def build_rbi(schema_const_name)
|
36
|
+
rbi_builder.build(schema_const_name)
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
sig { returns(Class) }
|
42
|
+
attr_reader :struct
|
43
|
+
|
44
|
+
sig { returns(RBIBuilder) }
|
45
|
+
attr_reader :rbi_builder
|
46
|
+
|
47
|
+
sig do
|
48
|
+
params(
|
49
|
+
name: Symbol,
|
50
|
+
type: T.untyped,
|
51
|
+
blk: T.nilable(T.proc.void),
|
52
|
+
).returns(T.untyped)
|
53
|
+
end
|
54
|
+
def retrieve_class(name:, type:, &blk)
|
55
|
+
return type unless block_given?
|
56
|
+
|
57
|
+
process_substruct(name: name, &blk)
|
58
|
+
end
|
59
|
+
|
60
|
+
sig { params(name: Symbol, blk: T.proc.void).returns(Class) }
|
61
|
+
def process_substruct(name:, &blk)
|
62
|
+
top_struct = struct
|
63
|
+
sub_struct = create_struct(struct, name.to_s)
|
64
|
+
@struct = sub_struct
|
65
|
+
instance_eval(&blk)
|
66
|
+
@struct = top_struct
|
67
|
+
sub_struct
|
68
|
+
end
|
69
|
+
|
70
|
+
sig { params(base: T.any(Module, Class), name: String).returns(Class) }
|
71
|
+
def create_struct(base, name)
|
72
|
+
new_struct = base.const_set(name.camelcase, Class.new(T::Struct))
|
73
|
+
rbi_builder.add_struct(new_struct)
|
74
|
+
new_struct
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'sorbet-coerce'
|
5
|
+
require_relative './loader'
|
6
|
+
require_relative './schema'
|
7
|
+
|
8
|
+
module TypedConfig
|
9
|
+
class Setup
|
10
|
+
extend T::Sig
|
11
|
+
|
12
|
+
sig { params(loader: Loader).void }
|
13
|
+
def initialize(loader: Loader.new)
|
14
|
+
@loader = loader
|
15
|
+
end
|
16
|
+
|
17
|
+
sig { params(config_path: T.any(Pathname, String), env: String).void }
|
18
|
+
def call(config_path:, env: T.cast(ENV['RACK_ENV'], String))
|
19
|
+
config_file = "#{config_path}/config.rb"
|
20
|
+
return unless File.file?(config_file)
|
21
|
+
|
22
|
+
require_relative config_file
|
23
|
+
|
24
|
+
settings = build_settings(config_path: config_path, env: env)
|
25
|
+
definition = TypeCoerce[Structs::Settings].new.from(settings)
|
26
|
+
Object.const_set(Schema.schema_const_name, definition)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
sig { returns(Loader) }
|
32
|
+
attr_reader :loader
|
33
|
+
|
34
|
+
sig do
|
35
|
+
params(config_path: T.any(Pathname, String), env: String)
|
36
|
+
.returns(T::Hash[String, T.untyped])
|
37
|
+
end
|
38
|
+
def build_settings(config_path:, env:)
|
39
|
+
merge_settings([
|
40
|
+
loader.load("#{config_path}/settings.yml"),
|
41
|
+
loader.load("#{config_path}/settings/#{env}.yml"),
|
42
|
+
loader.load("#{config_path}/settings.local.yml"),
|
43
|
+
loader.load("#{config_path}/settings/#{env}.local.yml"),
|
44
|
+
])
|
45
|
+
end
|
46
|
+
|
47
|
+
sig do
|
48
|
+
params(values: T::Array[T::Hash[String, T.untyped]])
|
49
|
+
.returns(T::Hash[String, T.untyped])
|
50
|
+
end
|
51
|
+
def merge_settings(values)
|
52
|
+
values.inject({}) { |prev, curr| prev.deep_merge(curr) }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# typed: strong
|
2
|
+
|
3
|
+
::<%= schema_const_name %> = T.let(nil, TypedConfig::Structs::Settings)
|
4
|
+
<% structs.each do |struct_name, consts| %>
|
5
|
+
|
6
|
+
class <%= struct_name %> < T::Struct
|
7
|
+
<% consts.each do |const| %>
|
8
|
+
const :<%= const[:name] %>, <%= const[:type] %>
|
9
|
+
|
10
|
+
<% end %>
|
11
|
+
end
|
12
|
+
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# typed: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
namespace 'typed-config' do
|
5
|
+
task rbi: :environment do
|
6
|
+
puts 'Generating RBI files...'
|
7
|
+
rbi = TypedConfig::Schema.rbi
|
8
|
+
FileUtils.mkdir_p(::Rails.root.join('sorbet', 'typed-config'))
|
9
|
+
File.write(::Rails.root.join('sorbet', 'typed-config', 'structs.rbi'), rbi)
|
10
|
+
puts 'RBI files updated in sorbet/typed-config.'
|
11
|
+
end
|
12
|
+
end
|
data/rbi/schema.rbi
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# typed: strong
|
2
|
+
|
3
|
+
module TypedConfig
|
4
|
+
class Schema
|
5
|
+
extend T::Sig
|
6
|
+
|
7
|
+
sig do
|
8
|
+
params(
|
9
|
+
const_name: T.nilable(String),
|
10
|
+
blk: T.proc.params(config: SchemaBuilder).void,
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
def self.configure(const_name = nil, &blk); end
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: typed-config
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alex Santos
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-12-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: deep_merge
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.2'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.2.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.2'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.2.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: sorbet-coerce
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.2'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0.2'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rails
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 5.2.4
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 5.2.4
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rubocop
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.84.0
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.84.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rubocop-performance
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 1.6.1
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 1.6.1
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rubocop-sorbet
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 0.4.0
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.4.0
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rubocop-rspec
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.39.0
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 1.39.0
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: sorbet-runtime
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
description: Manage multi-environment settings with type-safety in Ruby
|
132
|
+
email: hello@alexcsantos.com
|
133
|
+
executables: []
|
134
|
+
extensions: []
|
135
|
+
extra_rdoc_files: []
|
136
|
+
files:
|
137
|
+
- Gemfile
|
138
|
+
- README.md
|
139
|
+
- lib/generators/typed_config/install_generator.rb
|
140
|
+
- lib/generators/typed_config/templates/config.rb
|
141
|
+
- lib/generators/typed_config/templates/settings.local.yml
|
142
|
+
- lib/generators/typed_config/templates/settings.yml
|
143
|
+
- lib/generators/typed_config/templates/settings/development.yml
|
144
|
+
- lib/generators/typed_config/templates/settings/production.yml
|
145
|
+
- lib/generators/typed_config/templates/settings/test.yml
|
146
|
+
- lib/typed-config.rb
|
147
|
+
- lib/typed_config/loader.rb
|
148
|
+
- lib/typed_config/railtie.rb
|
149
|
+
- lib/typed_config/rbi_builder.rb
|
150
|
+
- lib/typed_config/schema.rb
|
151
|
+
- lib/typed_config/schema_builder.rb
|
152
|
+
- lib/typed_config/setup.rb
|
153
|
+
- lib/typed_config/structs.rbi.erb
|
154
|
+
- lib/typed_config/structs/_structs.rb
|
155
|
+
- lib/typed_config/structs/settings.rbi
|
156
|
+
- lib/typed_config/tasks/typed-config/rbi.rake
|
157
|
+
- lib/typed_config/version.rb
|
158
|
+
- rbi/schema.rbi
|
159
|
+
- rbi/schema_builder.rbi
|
160
|
+
homepage: https://rubygems.org/gems/typed-config
|
161
|
+
licenses:
|
162
|
+
- MIT
|
163
|
+
metadata: {}
|
164
|
+
post_install_message:
|
165
|
+
rdoc_options: []
|
166
|
+
require_paths:
|
167
|
+
- lib
|
168
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 2.4.0
|
173
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: '0'
|
178
|
+
requirements: []
|
179
|
+
rubygems_version: 3.0.6
|
180
|
+
signing_key:
|
181
|
+
specification_version: 4
|
182
|
+
summary: Type-safe settings for Rails
|
183
|
+
test_files: []
|