persey 0.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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +95 -0
- data/Rakefile +10 -0
- data/lib/persey.rb +21 -0
- data/lib/persey/adapters/json.rb +18 -0
- data/lib/persey/adapters/yaml.rb +29 -0
- data/lib/persey/builder.rb +64 -0
- data/lib/persey/inspector.rb +26 -0
- data/lib/persey/loader.rb +35 -0
- data/lib/persey/version.rb +3 -0
- data/persey.gemspec +24 -0
- data/test/fixtures/yaml_config.yml +5 -0
- data/test/fixtures/yaml_config_with_envs.yml +17 -0
- data/test/lib/persey_test.rb +31 -0
- data/test/test_helper.rb +21 -0
- metadata +108 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a197cddff1bf86a95882b1e4b660567231d373f1
|
4
|
+
data.tar.gz: 59991233039e755972297e0f1a6236a07423c158
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 50ad4f17a8e692de2019aa7cd409892f7ee5d434643605dab9efca89c08b61f6ae76be84548143a163c0c0e5f18a247b5c228af7becae3ca6bd934b7ccffadb6
|
7
|
+
data.tar.gz: 31384243cb7765b28400fe5e96952143fd2d3d1a372e46a9ea268d4bd7eb92ae8ef79a8930a52882c870c1b92552fdb3350ebbd4b00abe97148a56723844cd82
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Andrey Kumanyaev
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# Persey
|
2
|
+
|
3
|
+
## Summary
|
4
|
+
|
5
|
+
Perseus help you easily manage the configuration, depending on the environment.
|
6
|
+
The main objective is to provide opportunities to reuse the
|
7
|
+
configuration provided by the project, as the default configuration.
|
8
|
+
|
9
|
+
## Installing
|
10
|
+
|
11
|
+
Add this to your `Gemfile`:
|
12
|
+
|
13
|
+
gem "persey"
|
14
|
+
|
15
|
+
## Examples
|
16
|
+
|
17
|
+
### Definition
|
18
|
+
|
19
|
+
``` ruby
|
20
|
+
redis_config = File.join(Rails.root, 'config', redis.yml.example)
|
21
|
+
project_config = File.join(Rails.root, 'config', project.yml.example)
|
22
|
+
awesome_gem_config = File.join(Rails.root, 'config', awesome_gem_config.yml)
|
23
|
+
my_secret_key_config = '/home/user/secret/keys.yml'
|
24
|
+
|
25
|
+
Persey.init :development do # set current environment
|
26
|
+
sourse :yaml, redis_config, :redis # set specific namespace for settings
|
27
|
+
project :yaml, project_config
|
28
|
+
project :yaml, awesome_gem_config
|
29
|
+
project :yaml, my_secret_key_config
|
30
|
+
|
31
|
+
env :production do
|
32
|
+
site_name 'Example'
|
33
|
+
web do
|
34
|
+
domain 'example.com'
|
35
|
+
protocol 'https'
|
36
|
+
port 80
|
37
|
+
uri -> { "#{protocol}://#{domain}:#{port}" }
|
38
|
+
end
|
39
|
+
site_uri -> { web.uri }
|
40
|
+
email do
|
41
|
+
pop do
|
42
|
+
address 'pop.example.com'
|
43
|
+
port 110
|
44
|
+
end
|
45
|
+
smtp do
|
46
|
+
address 'smtp.example.com'
|
47
|
+
port 25
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
env :development, :parent => :production do
|
53
|
+
web do
|
54
|
+
domain 'localhost'
|
55
|
+
protocol 'http'
|
56
|
+
port 9292
|
57
|
+
end
|
58
|
+
email do
|
59
|
+
smtp do
|
60
|
+
address 'smpt.text.example.com'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
```
|
66
|
+
|
67
|
+
### Usage
|
68
|
+
|
69
|
+
config = Persey.config
|
70
|
+
|
71
|
+
config.site_name # => 'Example'
|
72
|
+
config.web.uri # => 'https://example.com:80'
|
73
|
+
config.site_uri # => 'https://example.com:80'
|
74
|
+
config.email.pop.port # => 110
|
75
|
+
|
76
|
+
### Rails
|
77
|
+
|
78
|
+
define your config in `lib/config.rb`
|
79
|
+
|
80
|
+
Persey.init Rails.env do
|
81
|
+
# settings
|
82
|
+
end
|
83
|
+
|
84
|
+
reload
|
85
|
+
|
86
|
+
# config/environments/development.rb
|
87
|
+
ActionDispatch::Reloader.to_prepare do
|
88
|
+
load Rails.root.join('lib/config.rb')
|
89
|
+
end
|
90
|
+
|
91
|
+
## Similar
|
92
|
+
|
93
|
+
* https://github.com/kaize/configus (this gem based on configus)
|
94
|
+
* https://github.com/markbates/configatron
|
95
|
+
* https://github.com/railsjedi/rails_config
|
data/Rakefile
ADDED
data/lib/persey.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "persey/version"
|
2
|
+
require "persey/builder"
|
3
|
+
require "persey/inspector"
|
4
|
+
require "persey/loader"
|
5
|
+
require "persey/adapters/yaml"
|
6
|
+
|
7
|
+
module Persey
|
8
|
+
class << self
|
9
|
+
def init(environment, &block)
|
10
|
+
configs = Inspector.analize(&block)
|
11
|
+
defaults = Loader.load(configs, environment)
|
12
|
+
@config = Builder.build(environment, defaults, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def config
|
16
|
+
raise RuntimeError, "Please, init config before usage" if @config.nil?
|
17
|
+
|
18
|
+
@config
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Persey
|
4
|
+
module Adapters
|
5
|
+
class Yaml
|
6
|
+
class << self
|
7
|
+
def load(file, env)
|
8
|
+
begin
|
9
|
+
raw_hash = YAML.load_file(file)
|
10
|
+
symbolize_keys(raw_hash)
|
11
|
+
rescue
|
12
|
+
binding.pry
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def symbolize_keys(hash)
|
19
|
+
hash.inject({}){|res, (k, v)|
|
20
|
+
n_k = k.is_a?(String) ? k.to_sym : k
|
21
|
+
n_v = v.is_a?(Hash) ? symbolize_keys(v) : v
|
22
|
+
res[n_k] = n_v
|
23
|
+
res
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Persey
|
2
|
+
class Builder
|
3
|
+
class << self
|
4
|
+
def build(environment, defaults, &block)
|
5
|
+
b = new(environment, defaults, block)
|
6
|
+
Configus::Config.new(b.result)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(environment, defaults, block)
|
11
|
+
@current_env = environment.to_sym
|
12
|
+
@config = defaults
|
13
|
+
@envs = {}
|
14
|
+
instance_eval(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def result(env = nil)
|
18
|
+
e = env || @current_env
|
19
|
+
edata = @envs[e]
|
20
|
+
|
21
|
+
raise ArgumentError, "Undefined environment '#{ env }" if edata.nil?
|
22
|
+
|
23
|
+
current_config = {}
|
24
|
+
if edata[:block]
|
25
|
+
current_config = expand(edata[:block])
|
26
|
+
end
|
27
|
+
|
28
|
+
parent = edata[:options][:parent]
|
29
|
+
if parent
|
30
|
+
parent_config = result(parent)
|
31
|
+
current_config = deep_merge(parent_config, current_config)
|
32
|
+
end
|
33
|
+
|
34
|
+
current_config = @config.merge(current_config)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def env(env, options = {}, &block)
|
40
|
+
env = env.to_sym
|
41
|
+
|
42
|
+
raise ArgumentError, "Double definition of environment '#{ env }'" if @envs.has_key?(env)
|
43
|
+
|
44
|
+
@envs[env] = { options: options }
|
45
|
+
@envs[env][:block] = block if block_given?
|
46
|
+
end
|
47
|
+
|
48
|
+
def deep_merge(target, source)
|
49
|
+
source.each_pair do |k,v|
|
50
|
+
tv = target[k]
|
51
|
+
target[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? deep_merge(tv, v) : v
|
52
|
+
end
|
53
|
+
target
|
54
|
+
end
|
55
|
+
|
56
|
+
def source(*args)
|
57
|
+
# Nothing. It's Inspector method
|
58
|
+
end
|
59
|
+
|
60
|
+
def expand(block)
|
61
|
+
Configus::Proxy.generate(block)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
|
3
|
+
module Persey
|
4
|
+
class Inspector
|
5
|
+
class << self
|
6
|
+
def analize(&block)
|
7
|
+
@sources = []
|
8
|
+
instance_eval(&block)
|
9
|
+
@sources
|
10
|
+
end
|
11
|
+
|
12
|
+
def source(source_type, config_file, namespace = nil)
|
13
|
+
begin
|
14
|
+
klass = "persey/adapters/#{source_type}".camelize.constantize
|
15
|
+
@sources << { class: klass, file: config_file, namespace: namespace } if File.exists?(config_file)
|
16
|
+
rescue
|
17
|
+
binding.pry
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def env(*args)
|
22
|
+
# Nithing. I do not want call method_missing
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Persey
|
2
|
+
class Loader
|
3
|
+
attr_accessor :configs
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def load(configs, env)
|
7
|
+
l = new(configs)
|
8
|
+
l.load(env)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(configs)
|
13
|
+
@configs = configs
|
14
|
+
end
|
15
|
+
|
16
|
+
def load(env)
|
17
|
+
@defaults = {}
|
18
|
+
|
19
|
+
configs.each do |pdc|
|
20
|
+
klass = pdc[:class]
|
21
|
+
raw_config = klass.load(pdc[:file], env)
|
22
|
+
env_config = raw_config[env].nil? ? raw_config : raw_config[env]
|
23
|
+
|
24
|
+
n = pdc[:namespace]
|
25
|
+
if n.nil?
|
26
|
+
@defaults.merge!(env_config)
|
27
|
+
else
|
28
|
+
@defaults[n].is_a?(Hash) ? @defaults[n].merge!(env_config) : @defaults[n] = env_config
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
@defaults
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/persey.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'persey/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "persey"
|
8
|
+
spec.version = Persey::VERSION
|
9
|
+
spec.authors = ["Andrey Kumanyaev"]
|
10
|
+
spec.email = ["me@zzet.org"]
|
11
|
+
spec.summary = %q{Helps you easily manage environment specific settings}
|
12
|
+
spec.description = %q{Persey helps you easily load configs from different files and use them from one variable. Based on Configus.}
|
13
|
+
spec.homepage = "https://github.com/zzet/persey"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "pry"
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
defaults: &defaults
|
3
|
+
another_option: value
|
4
|
+
another_key: another key value
|
5
|
+
first:
|
6
|
+
second: value
|
7
|
+
second:
|
8
|
+
another_second: another_value
|
9
|
+
|
10
|
+
production:
|
11
|
+
<<: *defaults
|
12
|
+
|
13
|
+
development:
|
14
|
+
<<: *defaults
|
15
|
+
|
16
|
+
test:
|
17
|
+
<<: *defaults
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class PerseyTest < TestCase
|
4
|
+
def setup
|
5
|
+
plain_config = File.join(fixtures_path, 'yaml_config.yml')
|
6
|
+
env_config = File.join(fixtures_path, 'yaml_config_with_envs.yml')
|
7
|
+
|
8
|
+
Persey.init :production do
|
9
|
+
source :yaml, plain_config
|
10
|
+
source :yaml, env_config, :namespace
|
11
|
+
|
12
|
+
env :production do
|
13
|
+
option do
|
14
|
+
first "first value"
|
15
|
+
second "second value"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_load_config
|
22
|
+
assert { Persey.config }
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_correct_config
|
26
|
+
@config = Persey.config
|
27
|
+
assert { @config.option.first == "first value" }
|
28
|
+
assert { @config.namespace.another_key == "another key value" }
|
29
|
+
assert { @config.key == "key value" }
|
30
|
+
end
|
31
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
Bundler.require
|
6
|
+
|
7
|
+
require 'wrong/adapters/minitest'
|
8
|
+
|
9
|
+
PROJECT_ROOT = File.join(Dir.pwd)
|
10
|
+
|
11
|
+
Wrong.config.color
|
12
|
+
|
13
|
+
Minitest.autorun
|
14
|
+
|
15
|
+
class TestCase < Minitest::Test
|
16
|
+
include Wrong
|
17
|
+
|
18
|
+
def fixtures_path
|
19
|
+
@path ||= File.expand_path(File.join(__FILE__, "../fixtures"))
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: persey
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrey Kumanyaev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
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: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Persey helps you easily load configs from different files and use them
|
56
|
+
from one variable. Based on Configus.
|
57
|
+
email:
|
58
|
+
- me@zzet.org
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- .gitignore
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE.txt
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- lib/persey.rb
|
69
|
+
- lib/persey/adapters/json.rb
|
70
|
+
- lib/persey/adapters/yaml.rb
|
71
|
+
- lib/persey/builder.rb
|
72
|
+
- lib/persey/inspector.rb
|
73
|
+
- lib/persey/loader.rb
|
74
|
+
- lib/persey/version.rb
|
75
|
+
- persey.gemspec
|
76
|
+
- test/fixtures/yaml_config.yml
|
77
|
+
- test/fixtures/yaml_config_with_envs.yml
|
78
|
+
- test/lib/persey_test.rb
|
79
|
+
- test/test_helper.rb
|
80
|
+
homepage: https://github.com/zzet/persey
|
81
|
+
licenses:
|
82
|
+
- MIT
|
83
|
+
metadata: {}
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 2.0.3
|
101
|
+
signing_key:
|
102
|
+
specification_version: 4
|
103
|
+
summary: Helps you easily manage environment specific settings
|
104
|
+
test_files:
|
105
|
+
- test/fixtures/yaml_config.yml
|
106
|
+
- test/fixtures/yaml_config_with_envs.yml
|
107
|
+
- test/lib/persey_test.rb
|
108
|
+
- test/test_helper.rb
|