figure 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/figure/department_store.rb +9 -9
- data/lib/figure/figure.rb +35 -29
- data/lib/figure/figurine.rb +38 -7
- data/lib/figure/store.rb +35 -5
- data/lib/figure/version.rb +1 -1
- data/lib/figure.rb +36 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9972d1c3f3dd2eafef6edb8751e0202ec491e3eb
|
4
|
+
data.tar.gz: ba196d3f86c814c6bc14aea263ed1fab0e8c0cb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a48e290863bef90ab667f95bcd9a806f058be3e6159260a854cc62dfc821febb9aad7effedb70ae02b1a8e9af815a170d27dfa68c7b55835cefbd3ba1a6994ea
|
7
|
+
data.tar.gz: f033eed1b9464548dd257a22aad1d9946f7c4a752736742b355b13d31111174103792e8c5a82568414c429d8c11a23b5152c2024df69e18a8dd32c39e3459a2c
|
@@ -5,22 +5,22 @@ class Figure < Hash
|
|
5
5
|
private
|
6
6
|
|
7
7
|
def new_store(k, v={}, parent_klass=Figure::Figurine)
|
8
|
-
store_klass(parent_klass, k.to_s.capitalize).with(v).instance
|
8
|
+
store_klass(parent_klass, k.to_s.capitalize).with(data: v).instance
|
9
9
|
end
|
10
10
|
|
11
11
|
def store_klass(parent_klass, name)
|
12
|
-
|
13
|
-
|
12
|
+
label = parent_klass.label.to_s + '::' + name
|
13
|
+
|
14
|
+
Class.new( default_klass(label) || parent_klass ).tap do |klass|
|
15
|
+
klass.label = label
|
14
16
|
Figure.stores[klass.pattern] = klass if klass.default_type
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
|
-
def default_klass(
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
Figure.stores[default_match] || parent_klass
|
20
|
+
def default_klass(label)
|
21
|
+
Figure.stores[
|
22
|
+
Figure.stores.keys.reverse.detect { |k| label =~ /^#{k}$/ }
|
23
|
+
]
|
24
24
|
end
|
25
25
|
|
26
26
|
end
|
data/lib/figure/figure.rb
CHANGED
@@ -10,9 +10,20 @@ class Figure < Hash
|
|
10
10
|
|
11
11
|
class << self
|
12
12
|
|
13
|
-
attr_reader :config_directory
|
14
13
|
attr_accessor :env
|
15
14
|
|
15
|
+
def initializers
|
16
|
+
@initializers ||= []
|
17
|
+
end
|
18
|
+
|
19
|
+
def config_directories
|
20
|
+
@config_directories ||= []
|
21
|
+
end
|
22
|
+
|
23
|
+
def responders
|
24
|
+
@responders ||= []
|
25
|
+
end
|
26
|
+
|
16
27
|
def stores
|
17
28
|
@stores ||= {}
|
18
29
|
end
|
@@ -21,10 +32,6 @@ class Figure < Hash
|
|
21
32
|
yield self
|
22
33
|
end
|
23
34
|
|
24
|
-
def config_directory=(path)
|
25
|
-
@config_directory = Pathname.new path
|
26
|
-
end
|
27
|
-
|
28
35
|
def method_missing(*args, m)
|
29
36
|
if @instantiated
|
30
37
|
super
|
@@ -39,26 +46,14 @@ class Figure < Hash
|
|
39
46
|
CONFIG_GLOBS = %w|**/*figure.yml **/figure/*.yml **/gaston/*.yml|
|
40
47
|
|
41
48
|
def initialize
|
42
|
-
|
49
|
+
self.class.initializers.each &:initialize!
|
50
|
+
@config_directories = self.class.config_directories.map { |path| Pathname.new path }
|
43
51
|
store!
|
44
52
|
end
|
45
53
|
|
46
54
|
def store!
|
47
|
-
config_files
|
48
|
-
name =
|
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
|
55
|
+
config_files do |name, conf|
|
56
|
+
self[name.to_sym] = new_store name, YAML.load(conf.read)
|
62
57
|
end
|
63
58
|
end
|
64
59
|
|
@@ -70,22 +65,33 @@ class Figure < Hash
|
|
70
65
|
end
|
71
66
|
end
|
72
67
|
|
68
|
+
def config_files
|
69
|
+
Dir[ *all_config_directories_globs ].map do |file|
|
70
|
+
path = Pathname.new file
|
71
|
+
name = path.basename.to_s.sub('.yml', '').sub('.figure', '')
|
72
|
+
|
73
|
+
yield name, path if block_given?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
73
77
|
private
|
74
78
|
|
75
|
-
def
|
76
|
-
@
|
79
|
+
def config_directories
|
80
|
+
@config_directories ||= [ ascend_path ]
|
77
81
|
end
|
78
82
|
|
79
|
-
def
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
+
def all_config_directories_globs
|
84
|
+
config_directories.map do |dir|
|
85
|
+
CONFIG_GLOBS.map do |glob|
|
86
|
+
dir.join glob
|
87
|
+
end
|
88
|
+
end.flatten
|
83
89
|
end
|
84
90
|
|
85
91
|
def ascend_path
|
86
92
|
Pathname.new(__FILE__).ascend do |path|
|
87
|
-
@
|
88
|
-
@
|
93
|
+
@config_directories << path.join('config') if path.join('config').exist?
|
94
|
+
@config_directories << path if path.join('figure.yml').exist?
|
89
95
|
end
|
90
96
|
end
|
91
97
|
|
data/lib/figure/figurine.rb
CHANGED
@@ -21,22 +21,53 @@ class Figure < Hash
|
|
21
21
|
@pattern ||= label.gsub 'Default', '[^:]+'
|
22
22
|
end
|
23
23
|
|
24
|
-
def with(
|
25
|
-
|
24
|
+
def with(options)
|
25
|
+
tap do |f|
|
26
|
+
options.each do |k, v|
|
27
|
+
f.send "with_#{k}=", v
|
28
|
+
end
|
29
|
+
end
|
26
30
|
end
|
27
31
|
|
28
32
|
end
|
29
33
|
|
30
34
|
def initialize
|
31
35
|
h = self.class.with_data || {}
|
36
|
+
default_h, @forward = find_default h
|
32
37
|
|
33
|
-
|
34
|
-
self[:default] = new_store :default, data, self.class if data
|
35
|
-
end
|
36
|
-
|
38
|
+
self[:default] = new_store :default, default_h, self.class if default_h
|
37
39
|
merge! h
|
40
|
+
complete_defaults
|
38
41
|
end
|
39
42
|
|
40
|
-
|
43
|
+
def forward!
|
44
|
+
self[ has_key? forward_response ]
|
45
|
+
end
|
41
46
|
|
47
|
+
def can_forward?
|
48
|
+
!!@forward
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def find_default(h)
|
54
|
+
key = h.keys.detect { |k| k.to_s =~ /^(default|gaston)(_.+)?$/ }
|
55
|
+
forward = $1.to_s == 'gaston' ? 'env' : ($2 && $2[1..-1])
|
56
|
+
|
57
|
+
[h.delete(key), forward]
|
58
|
+
end
|
59
|
+
|
60
|
+
def forward_response
|
61
|
+
(r = responder) && r.send(@forward)
|
62
|
+
end
|
63
|
+
|
64
|
+
def responder
|
65
|
+
responders.detect { |s| s.respond_to?(@forward) && s.send(@forward)}
|
66
|
+
end
|
67
|
+
|
68
|
+
def responders
|
69
|
+
Figure.responders.dup.concat [self, self.class, Figure]
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
42
73
|
end
|
data/lib/figure/store.rb
CHANGED
@@ -3,39 +3,69 @@ class Figure < Hash
|
|
3
3
|
module Store
|
4
4
|
|
5
5
|
def []=(k, v)
|
6
|
-
unless respond_to? k
|
7
|
-
self.class.send :define_method, k, Proc.new { self[k] }
|
8
|
-
end
|
9
|
-
|
6
|
+
self.class.send :define_method, k, -> { custom_fetch k } unless respond_to? k
|
10
7
|
super
|
11
8
|
end
|
12
9
|
|
13
10
|
def default(k=nil)
|
14
|
-
|
11
|
+
if k && !default_store.has_key?(k) && can_forward?
|
12
|
+
self[:default]
|
13
|
+
|
14
|
+
elsif default_store && k
|
15
|
+
default_store[k]
|
16
|
+
|
17
|
+
elsif has_key? :default
|
18
|
+
self[:default]
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
22
|
def merge!(h)
|
18
23
|
h.each do |k, v|
|
19
24
|
self[k] = if v.is_a? Hash
|
20
25
|
new_store k, v, self.class
|
26
|
+
|
21
27
|
elsif v.is_a? Array
|
22
28
|
v.map do |i|
|
23
29
|
i.is_a?(Hash) ? new_store(k, i, self.class) : i
|
24
30
|
end
|
31
|
+
|
25
32
|
else
|
26
33
|
v
|
27
34
|
end
|
28
35
|
end
|
29
36
|
end
|
30
37
|
|
38
|
+
def complete_defaults
|
39
|
+
if default_store && default_store.can_forward? && (default_store.forward! rescue false)
|
40
|
+
default_store.forward!.figures.reject { |l| respond_to?(l) }.each do |l|
|
41
|
+
self.class.send :define_method, l, -> { default_store.forward![l] }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
31
46
|
def has_key?(key)
|
32
47
|
[key.to_s, key.to_sym].detect { |k| super(k) }
|
33
48
|
end
|
34
49
|
|
50
|
+
def figures
|
51
|
+
keys.tap { |f| f.concat default_store.figures if default_store }.uniq
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
35
56
|
def default_store
|
36
57
|
@default_store ||= self.class.ancestors[1].instance rescue nil
|
37
58
|
end
|
38
59
|
|
60
|
+
def custom_fetch(k)
|
61
|
+
if self[k].respond_to?(:can_forward?) && self[k].can_forward?
|
62
|
+
self[k].forward!
|
63
|
+
|
64
|
+
else
|
65
|
+
self[k]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
39
69
|
end
|
40
70
|
|
41
71
|
end
|
data/lib/figure/version.rb
CHANGED
data/lib/figure.rb
CHANGED
@@ -3,8 +3,41 @@ require 'figure/department_store'
|
|
3
3
|
require 'figure/figure'
|
4
4
|
require 'figure/figurine'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
class Figure < Hash
|
7
|
+
class GastonInitializer
|
8
|
+
def self.initialize!
|
9
|
+
gaston = Class.new do
|
10
|
+
class << self
|
11
|
+
def method_missing(*args, m)
|
12
|
+
if root = telephon_is_a_ringin(m)
|
13
|
+
Figure.send(root).send(m)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def telephon_is_a_ringin(m)
|
20
|
+
Figure.instance.keys.detect { |root| Figure.send(root).respond_to? m }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Object.const_set 'Gaston', gaston
|
26
|
+
end
|
9
27
|
end
|
10
28
|
end
|
29
|
+
|
30
|
+
class Figure < Hash
|
31
|
+
class RailsInitializer
|
32
|
+
def self.initialize!
|
33
|
+
Figure.configure do |config|
|
34
|
+
config.responders << Rails
|
35
|
+
config.config_directories << Rails.root.join('config')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
if defined? Rails
|
42
|
+
Figure.initializers << Figure::RailsInitializer
|
43
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: figure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lacravate
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
description: A classic configuration store, that turns out Hash definitions to methods,
|
28
|
-
with a
|
28
|
+
with a management of environment (and Rails environment)
|
29
29
|
email:
|
30
30
|
- david.elbaz@af83.com
|
31
31
|
executables: []
|