rb-konfig 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7bffadd86f96ef3163efc25608dde8cc6b13e238687d9e5b1366afcf5ee67b56
4
+ data.tar.gz: 0fa8992ef19d0985253337af611418d20f8a1cbf74642879571d8c400e479cf4
5
+ SHA512:
6
+ metadata.gz: 4e354c93f08eba4c21fd691fc012c01769afec1dbf931da322fee7b3e46e58fa07ab0d13004e5b1c211ebeb55647656ee02816043aee9f441b3fb3c27e80a148
7
+ data.tar.gz: cbbbf864513bf6dfac4958616fd3e536962204cab81d7c1039e1832919b777f925e66dc485f3830413daabf0f24f389b2b4cb1afaef9d946110103d394219da0
data/.gitignore ADDED
@@ -0,0 +1,52 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ # Used by dotenv library to load environment variables.
14
+ # .env
15
+
16
+ ## Specific to RubyMotion:
17
+ .dat*
18
+ .repl_history
19
+ build/
20
+ *.bridgesupport
21
+ build-iPhoneOS/
22
+ build-iPhoneSimulator/
23
+
24
+ ## Specific to RubyMotion (use of CocoaPods):
25
+ #
26
+ # We recommend against adding the Pods directory to your .gitignore. However
27
+ # you should judge for yourself, the pros and cons are mentioned at:
28
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
29
+ #
30
+ # vendor/Pods/
31
+
32
+ ## Documentation cache and generated files:
33
+ /.yardoc/
34
+ /_yardoc/
35
+ /doc/
36
+ /rdoc/
37
+
38
+ ## Environment normalization:
39
+ /.bundle/
40
+ /vendor/bundle
41
+ /lib/bundler/man/
42
+
43
+ # for a library or gem, you might want to ignore these files since the code is
44
+ # intended to run in multiple environments; otherwise, check them in:
45
+ # Gemfile.lock
46
+ # .ruby-version
47
+ # .ruby-gemset
48
+
49
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
50
+ .rvmrc
51
+ /.byebug_history
52
+ /.idea
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,7 @@
1
+ require: rubocop-performance
2
+ Metrics/LineLength:
3
+ Max: 150
4
+ Metrics/BlockLength:
5
+ Max: 150
6
+ Metrics/CyclomaticComplexity:
7
+ Max: 12
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ konfig
data/.ruby-version ADDED
@@ -0,0 +1,2 @@
1
+ ruby-2.5.5
2
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in konfig.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,76 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rb-konfig (0.1.0)
5
+ activesupport
6
+ hash_dot (~> 2.4)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (5.2.3)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ ast (2.4.0)
17
+ byebug (11.0.1)
18
+ concurrent-ruby (1.1.5)
19
+ diff-lcs (1.3)
20
+ factory_bot (5.0.2)
21
+ activesupport (>= 4.2.0)
22
+ hash_dot (2.4.1)
23
+ i18n (1.6.0)
24
+ concurrent-ruby (~> 1.0)
25
+ jaro_winkler (1.5.3)
26
+ minitest (5.11.3)
27
+ parallel (1.17.0)
28
+ parser (2.6.3.0)
29
+ ast (~> 2.4.0)
30
+ rainbow (3.0.0)
31
+ rake (10.5.0)
32
+ rspec (3.8.0)
33
+ rspec-core (~> 3.8.0)
34
+ rspec-expectations (~> 3.8.0)
35
+ rspec-mocks (~> 3.8.0)
36
+ rspec-core (3.8.1)
37
+ rspec-support (~> 3.8.0)
38
+ rspec-expectations (3.8.4)
39
+ diff-lcs (>= 1.2.0, < 2.0)
40
+ rspec-support (~> 3.8.0)
41
+ rspec-mocks (3.8.1)
42
+ diff-lcs (>= 1.2.0, < 2.0)
43
+ rspec-support (~> 3.8.0)
44
+ rspec-support (3.8.2)
45
+ rubocop (0.72.0)
46
+ jaro_winkler (~> 1.5.1)
47
+ parallel (~> 1.10)
48
+ parser (>= 2.6)
49
+ rainbow (>= 2.2.2, < 4.0)
50
+ ruby-progressbar (~> 1.7)
51
+ unicode-display_width (>= 1.4.0, < 1.7)
52
+ rubocop-performance (1.4.0)
53
+ rubocop (>= 0.71.0)
54
+ ruby-progressbar (1.10.1)
55
+ rufo (0.7.0)
56
+ thread_safe (0.3.6)
57
+ tzinfo (1.2.5)
58
+ thread_safe (~> 0.1)
59
+ unicode-display_width (1.6.0)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ bundler (~> 2.0)
66
+ byebug
67
+ factory_bot (~> 5.0)
68
+ rake (~> 10.0)
69
+ rb-konfig!
70
+ rspec (~> 3.8)
71
+ rubocop (~> 0.69)
72
+ rubocop-performance (~> 1.3)
73
+ rufo (~> 0.7)
74
+
75
+ BUNDLED WITH
76
+ 2.0.2
data/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # Konfig
2
+
3
+ Konfig is a Kubernetes friendly Rails configuration file. While Rails applications can easily read YAML files to load configurations, Kubernetes is good at serving individual configuration values as files via Kubernetes Secrets. This means your Rails application needs to read the same configuration file from a YAML file in development or an individual file while running in Kubernetes. Konfig can load configuration and secrets from both YAML or folders with individual files and present them to your application the same way.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'rb-konfig'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install rb-konfig
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ Konfig.configuration.mode = :yaml
25
+ Konfig.configuration.workdir = "settings/folder"
26
+ Konfig.load
27
+ ```
28
+
29
+ or if you'd like to use it in Kubernetes:
30
+
31
+ ```ruby
32
+ Konfig.configuration.mode = :directory
33
+ Konfig.configuration.workdir = "settings/folder"
34
+ Konfig.load
35
+ ```
36
+
37
+ Now you can use Konfig anywhere in the code:
38
+
39
+ ```ruby
40
+ puts Settings.some.configuration.value
41
+ ```
42
+
43
+ In `development` mode, Konfig, looks for `development.yml` in `work_dir`. In `kubernetes` mode, it looks for a file for each one of the given configuration keys. For example:
44
+
45
+ ```yml
46
+ # development.yml
47
+ some:
48
+ configuration:
49
+ value: true
50
+ ```
51
+
52
+ ```bash
53
+ # directory mode
54
+ $ ls config/settings
55
+ -rw-r--r-- 1 khash staff 20 10 May 07:20 some.configuration.value
56
+
57
+ $ cat config/settings/some.configuration.value
58
+ true
59
+ ```
60
+
61
+ The value in `some.configuration.value` file can be `true`. Konfig tries to clean the file and coerce the value into the right type before returning. If the file or the key in yaml is missing, it will return a `Konfig::MissingConfiguration` is thrown.
62
+
63
+ ### NULL / nil values
64
+
65
+ By default YAML returns `nil` for a `null` value in a YAML file. This is also replicated in directory mode.
66
+
67
+ ### Configuration
68
+ You can change or reach the following from `Konfig.configuration`
69
+
70
+ `namespace`: Default is `Settings`
71
+ `delimiter`: Default is `.`
72
+ `default_config_file`: Default is `development.yml`
73
+ `allow_nil`: Default is `true`
74
+ `nil_word`: Default is `null`
75
+ `mode`: No default value
76
+ `workdir`: No default value
77
+
78
+ ### Data types
79
+
80
+ The directory mode, supports the following data types in files and tries to return the right type:
81
+
82
+ - Integer
83
+ - Float
84
+ - String
85
+ - Date time
86
+ - Boolean
87
+ - Null (see above)
88
+
89
+ ### ERB
90
+
91
+ YAML mode supports ERB in your YAML file, just like default Rails behavior
92
+
93
+ ## Development
94
+
95
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
96
+
97
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
98
+
99
+ ## Contributing
100
+
101
+ Bug reports and pull requests are welcome on GitHub at https://github.com/khash/konfig.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "konfig"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/konfig.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "konfig/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rb-konfig"
7
+ spec.version = Konfig::VERSION
8
+ spec.authors = ["Khash Sajadi"]
9
+ spec.email = ["khash@sajadi.co.uk"]
10
+
11
+ spec.summary = %q{Konfig is a Kubernetes friendly Rails configuration gem}
12
+ spec.homepage = "https://github.com/khash/konfig"
13
+
14
+ spec.metadata["homepage_uri"] = spec.homepage
15
+ spec.metadata["source_code_uri"] = "https://github.com/khash/konfig"
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_dependency "hash_dot", "~> 2.4"
27
+ spec.add_dependency "activesupport"
28
+
29
+ spec.add_development_dependency "bundler", "~> 2.0"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "factory_bot", "~> 5.0"
32
+ spec.add_development_dependency "rspec", "~> 3.8"
33
+ spec.add_development_dependency "rubocop", "~> 0.69"
34
+ spec.add_development_dependency "rubocop-performance", "~> 1.3"
35
+ spec.add_development_dependency "rufo", "~> 0.7"
36
+ spec.add_development_dependency "byebug"
37
+ end
data/lib/konfig.rb ADDED
@@ -0,0 +1,55 @@
1
+ require "active_support/core_ext/hash"
2
+ Dir["#{File.dirname(__FILE__)}/konfig/**/*.rb"].each { |f| load(f) }
3
+
4
+ module Konfig
5
+ def self.configuration
6
+ @config ||= Konfig::Config.new
7
+ end
8
+
9
+ def self.load
10
+ provider = ConfigProvider.provider(mode: self.configuration.mode, workdir: self.configuration.workdir)
11
+ provider.load
12
+ end
13
+
14
+ class Config
15
+ attr_writer :namespace
16
+ attr_writer :delimiter
17
+ attr_writer :default_config_file
18
+ attr_writer :allow_nil
19
+ attr_writer :nil_word
20
+ attr_writer :mode
21
+ attr_writer :workdir
22
+
23
+ def namespace
24
+ @namespace || "Settings"
25
+ end
26
+
27
+ def workdir
28
+ raise NotConfiguredError, "have you set workdir?" unless @workdir
29
+
30
+ @workdir
31
+ end
32
+
33
+ def mode
34
+ raise NotConfiguredError, "have you set mode?" unless @mode
35
+
36
+ @mode
37
+ end
38
+
39
+ def delimiter
40
+ @delimiter || "."
41
+ end
42
+
43
+ def default_config_file
44
+ @default_config_file || "development.yml"
45
+ end
46
+
47
+ def allow_nil
48
+ @allow_nil.nil? ? true : @allow_nil
49
+ end
50
+
51
+ def nil_word
52
+ @nil_word || "null"
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,28 @@
1
+ module Konfig
2
+ class ConfigProvider
3
+ attr_reader :mode
4
+ attr_reader :workdir
5
+
6
+ def initialize(mode:, workdir:)
7
+ raise ArgumentError unless workdir
8
+ raise ArgumentError unless [:yaml, :directory].include? mode
9
+ raise FileNotFound, "directory #{workdir} not found" unless Dir.exist? workdir
10
+
11
+ @mode = mode
12
+ @workdir = workdir
13
+ end
14
+
15
+ def self.provider(mode:, workdir:)
16
+ raise ArgumentError unless workdir
17
+ raise ArgumentError unless [:yaml, :directory].include? mode
18
+
19
+ if mode == :yaml
20
+ return YamlProvider.new(workdir: workdir)
21
+ elsif mode == :directory
22
+ return DirectoryProvider.new(workdir: workdir)
23
+ else
24
+ raise ArgumentError
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,76 @@
1
+ require_relative "config_provider"
2
+ require "date"
3
+
4
+ module Konfig
5
+ class NilClass; end
6
+
7
+ NIL_VALUE = NilClass.new
8
+
9
+ class DirectoryProvider < ConfigProvider
10
+ def initialize(workdir:)
11
+ super(mode: :yaml, workdir: workdir)
12
+ @files = Dir.children(@workdir)
13
+ end
14
+
15
+ def load
16
+ build_object_from_list(@files)
17
+ end
18
+
19
+ private
20
+
21
+ # deserializers. order matters here
22
+ DESERIALIZERS = [
23
+ lambda { |value| Integer(value) rescue NIL_VALUE }, # integer
24
+ lambda { |value| Float(value) rescue NIL_VALUE }, # float
25
+ lambda { |value| (["true", "false"].include?(value)) ? (value == "true") : NIL_VALUE }, # boolean
26
+ lambda { |value| DateTime.parse(value) rescue NIL_VALUE }, # date time
27
+ lambda { |value| (value == Konfig.configuration.nil_word && Konfig.configuration.allow_nil) ? nil : NIL_VALUE }, # nil value
28
+ lambda { |value| value }, # string. should always be the last one
29
+ ]
30
+
31
+ def get_value(filepath)
32
+ fullpath = File.join(@workdir, filepath)
33
+ raise FileNotFound, "key #{filepath} not found. Expecting to find it in #{fullpath}" unless File.exist? fullpath
34
+ content = File.read(fullpath).chomp
35
+ return coerce(content)
36
+ end
37
+
38
+ def coerce(value)
39
+ # assume a float first
40
+ DESERIALIZERS.each do |deseralizer|
41
+ result = deseralizer.call(value)
42
+ return result unless result == NIL_VALUE
43
+ end
44
+
45
+ raise UnsupportedValueType, "'#{value}' is unsupported type"
46
+ end
47
+
48
+ def build_hash_from_list(list)
49
+ result = []
50
+ list.each do |item|
51
+ value = get_value(item)
52
+ result << build_hash(item, value)
53
+ end
54
+
55
+ return result
56
+ end
57
+
58
+ def build_object_from_list(list)
59
+ Object.send(:remove_const, Konfig.configuration.namespace) if Object.const_defined?(Konfig.configuration.namespace)
60
+
61
+ full_hash = {}
62
+ hash_list = build_hash_from_list(list)
63
+ hash_list.each do |item|
64
+ full_hash.deep_merge!(item)
65
+ end
66
+
67
+ Object.const_set(Konfig.configuration.namespace, full_hash.to_dot)
68
+ end
69
+
70
+ def build_hash(key, value)
71
+ parts = key.split(Konfig.configuration.delimiter)
72
+ parts << value
73
+ parts.reverse.inject { |a, n| { n => a } }
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,5 @@
1
+ module Konfig
2
+ class Error < StandardError; end
3
+ class FileNotFound < Error; end
4
+ class NotConfiguredError < Error; end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Konfig
2
+ VERSION ||= "0.1.0"
3
+ end
@@ -0,0 +1,30 @@
1
+ require_relative "config_provider"
2
+ require "yaml"
3
+ require "hash_dot"
4
+ require "erb"
5
+
6
+ module Konfig
7
+ class YamlProvider < ConfigProvider
8
+ attr_reader :file
9
+ attr_reader :raw_settings
10
+
11
+ def initialize(workdir:, filename: Konfig.configuration.default_config_file)
12
+ super(mode: :yaml, workdir: workdir)
13
+ @file = File.join(workdir, filename)
14
+ raise FileNotFound, "#{@file} not found" unless File.exists? @file
15
+ end
16
+
17
+ def load
18
+ content = YAML.load(ERB.new(IO.read(@file)).result) if @file and File.exist?(@file)
19
+ content ||= {}
20
+
21
+ @raw_settings = content.to_dot
22
+ Object.send(:remove_const, Konfig.configuration.namespace) if Object.const_defined?(Konfig.configuration.namespace)
23
+ Object.const_set(Konfig.configuration.namespace, @raw_settings)
24
+ rescue Psych::SyntaxError => exc
25
+ raise "YAML syntax error occurred while parsing #{@file}. " \
26
+ "Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \
27
+ "Error: #{exc.message}"
28
+ end
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rb-konfig
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Khash Sajadi
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-06-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: hash_dot
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
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
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: factory_bot
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.69'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.69'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-performance
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rufo
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.7'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.7'
139
+ - !ruby/object:Gem::Dependency
140
+ name: byebug
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description:
154
+ email:
155
+ - khash@sajadi.co.uk
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".rspec"
162
+ - ".rubocop.yml"
163
+ - ".ruby-gemset"
164
+ - ".ruby-version"
165
+ - Gemfile
166
+ - Gemfile.lock
167
+ - README.md
168
+ - Rakefile
169
+ - bin/console
170
+ - bin/setup
171
+ - konfig.gemspec
172
+ - lib/konfig.rb
173
+ - lib/konfig/config_provider.rb
174
+ - lib/konfig/directory_provider.rb
175
+ - lib/konfig/errors.rb
176
+ - lib/konfig/version.rb
177
+ - lib/konfig/yaml_provider.rb
178
+ homepage: https://github.com/khash/konfig
179
+ licenses: []
180
+ metadata:
181
+ homepage_uri: https://github.com/khash/konfig
182
+ source_code_uri: https://github.com/khash/konfig
183
+ post_install_message:
184
+ rdoc_options: []
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ required_rubygems_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ requirements: []
198
+ rubyforge_project:
199
+ rubygems_version: 2.7.6.2
200
+ signing_key:
201
+ specification_version: 4
202
+ summary: Konfig is a Kubernetes friendly Rails configuration gem
203
+ test_files: []