figure 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/lib/figure/department_store.rb +28 -0
- data/lib/figure/figure.rb +92 -0
- data/lib/figure/figurine.rb +42 -0
- data/lib/figure/store.rb +41 -0
- data/lib/figure/version.rb +3 -0
- data/lib/figure.rb +10 -0
- metadata +64 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d27c3aa9f1058c085e49b60fac8871f78191238a
|
4
|
+
data.tar.gz: fb1e1df6cb7918cc1f61e5b7ffffc91f00ee03c6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4157ca36f93b5a56c3f64f7963bcc07a44e7a5f61ad660969bdc18f733278c5f9dc008b41625f691ea96ac17549b01553ffd395d5172a7c43ae1b771acd19b4a
|
7
|
+
data.tar.gz: 512afd50f01cd55e38252a283968e42b359d4dce8b6151873e3161f63fbf049b31861090e37be0d72d7cff33a36004a4ef9093b24f10d975c62a789b2a63a13e
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Figure < Hash
|
2
|
+
|
3
|
+
module DepartmentStore
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def new_store(k, v={}, parent_klass=Figure::Figurine)
|
8
|
+
store_klass(parent_klass, k.to_s.capitalize).with(v).instance
|
9
|
+
end
|
10
|
+
|
11
|
+
def store_klass(parent_klass, name)
|
12
|
+
Class.new(default_klass(parent_klass, name)).tap do |klass|
|
13
|
+
klass.label = "#{parent_klass.label}::#{name}"
|
14
|
+
Figure.stores[klass.pattern] = klass if klass.default_type
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_klass(parent_klass, name)
|
19
|
+
default_match = Figure.stores.keys.select do |k|
|
20
|
+
"#{parent_klass.label}::#{name}" =~ /^#{k}$/
|
21
|
+
end.reverse.first
|
22
|
+
|
23
|
+
Figure.stores[default_match] || parent_klass
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
class Figure < Hash
|
5
|
+
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
include DepartmentStore
|
9
|
+
include Store
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
attr_reader :config_directory
|
14
|
+
attr_accessor :env
|
15
|
+
|
16
|
+
def stores
|
17
|
+
@stores ||= {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def configure
|
21
|
+
yield self
|
22
|
+
end
|
23
|
+
|
24
|
+
def config_directory=(path)
|
25
|
+
@config_directory = Pathname.new path
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_missing(*args, m)
|
29
|
+
if @instantiated
|
30
|
+
super
|
31
|
+
else
|
32
|
+
@instantiated = instance
|
33
|
+
send m
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
CONFIG_GLOBS = %w|**/*figure.yml **/figure/*.yml **/gaston/*.yml|
|
40
|
+
|
41
|
+
def initialize
|
42
|
+
@config_directory = self.class.config_directory
|
43
|
+
store!
|
44
|
+
end
|
45
|
+
|
46
|
+
def store!
|
47
|
+
config_files.each do |conf|
|
48
|
+
name = conf.basename.to_s.sub('.yml', '').sub('.figure', '')
|
49
|
+
|
50
|
+
store = new_store name, YAML.load(conf.read)
|
51
|
+
|
52
|
+
self[name] = if self.class.env
|
53
|
+
if store.respond_to? self.class.env
|
54
|
+
store.send self.class.env
|
55
|
+
else
|
56
|
+
store.merge! self.class.env => {}
|
57
|
+
store[self.class.env]
|
58
|
+
end
|
59
|
+
else
|
60
|
+
store
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def []=(k, v)
|
66
|
+
super.tap do |value|
|
67
|
+
self.class.define_singleton_method k.to_sym do
|
68
|
+
instance.send k
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def config_directory
|
76
|
+
@config_directory ||= defined?(Rails) ? Rails.root.join('config') : ascend_path
|
77
|
+
end
|
78
|
+
|
79
|
+
def config_files
|
80
|
+
Dir[ *CONFIG_GLOBS.map { |glob| config_directory.join(glob) } ].map do |file|
|
81
|
+
Pathname.new file
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def ascend_path
|
86
|
+
Pathname.new(__FILE__).ascend do |path|
|
87
|
+
@config_directory ||= path.join('config') if path.join('config').exist?
|
88
|
+
@config_directory ||= path if path.join('figure.yml').exist?
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
class Figure < Hash
|
4
|
+
|
5
|
+
class Figurine < Hash
|
6
|
+
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
include DepartmentStore
|
10
|
+
include Store
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
attr_accessor :with_data, :label
|
15
|
+
|
16
|
+
def default_type
|
17
|
+
@default_type ||= label.include? 'Default'
|
18
|
+
end
|
19
|
+
|
20
|
+
def pattern
|
21
|
+
@pattern ||= label.gsub 'Default', '[^:]+'
|
22
|
+
end
|
23
|
+
|
24
|
+
def with(data)
|
25
|
+
self.tap { |s| s.with_data = data }
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize
|
31
|
+
h = self.class.with_data || {}
|
32
|
+
|
33
|
+
(h.delete(:default) || h.delete(:gaston)).tap do |data|
|
34
|
+
self[:default] = new_store :default, data, self.class if data
|
35
|
+
end
|
36
|
+
|
37
|
+
merge! h
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/lib/figure/store.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
class Figure < Hash
|
2
|
+
|
3
|
+
module Store
|
4
|
+
|
5
|
+
def []=(k, v)
|
6
|
+
unless respond_to? k
|
7
|
+
self.class.send :define_method, k, Proc.new { self[k] }
|
8
|
+
end
|
9
|
+
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
def default(k=nil)
|
14
|
+
default_store && k ? default_store[k] : self[:default]
|
15
|
+
end
|
16
|
+
|
17
|
+
def merge!(h)
|
18
|
+
h.each do |k, v|
|
19
|
+
self[k] = if v.is_a? Hash
|
20
|
+
new_store k, v, self.class
|
21
|
+
elsif v.is_a? Array
|
22
|
+
v.map do |i|
|
23
|
+
i.is_a?(Hash) ? new_store(k, i, self.class) : i
|
24
|
+
end
|
25
|
+
else
|
26
|
+
v
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def has_key?(key)
|
32
|
+
[key.to_s, key.to_sym].detect { |k| super(k) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def default_store
|
36
|
+
@default_store ||= self.class.ancestors[1].instance rescue nil
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/lib/figure.rb
ADDED
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: figure
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- lacravate
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
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
|
+
description: A classic configuration store, that turns out Hash definitions to methods,
|
28
|
+
with a (so far very unsatisfactory) management of environment (and Rails environment)
|
29
|
+
email:
|
30
|
+
- david.elbaz@af83.com
|
31
|
+
executables: []
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- lib/figure.rb
|
36
|
+
- lib/figure/department_store.rb
|
37
|
+
- lib/figure/figure.rb
|
38
|
+
- lib/figure/figurine.rb
|
39
|
+
- lib/figure/store.rb
|
40
|
+
- lib/figure/version.rb
|
41
|
+
homepage: https://github.com/lacravate/figure
|
42
|
+
licenses: []
|
43
|
+
metadata: {}
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project: "[none]"
|
60
|
+
rubygems_version: 2.2.2
|
61
|
+
signing_key:
|
62
|
+
specification_version: 4
|
63
|
+
summary: Figure...'s out configuration from YAML files
|
64
|
+
test_files: []
|