figure 0.0.1 → 0.0.2
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 +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: []
|