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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d27c3aa9f1058c085e49b60fac8871f78191238a
4
- data.tar.gz: fb1e1df6cb7918cc1f61e5b7ffffc91f00ee03c6
3
+ metadata.gz: 9972d1c3f3dd2eafef6edb8751e0202ec491e3eb
4
+ data.tar.gz: ba196d3f86c814c6bc14aea263ed1fab0e8c0cb0
5
5
  SHA512:
6
- metadata.gz: 4157ca36f93b5a56c3f64f7963bcc07a44e7a5f61ad660969bdc18f733278c5f9dc008b41625f691ea96ac17549b01553ffd395d5172a7c43ae1b771acd19b4a
7
- data.tar.gz: 512afd50f01cd55e38252a283968e42b359d4dce8b6151873e3161f63fbf049b31861090e37be0d72d7cff33a36004a4ef9093b24f10d975c62a789b2a63a13e
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
- Class.new(default_klass(parent_klass, name)).tap do |klass|
13
- klass.label = "#{parent_klass.label}::#{name}"
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(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
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
- @config_directory = self.class.config_directory
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.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
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 config_directory
76
- @config_directory ||= defined?(Rails) ? Rails.root.join('config') : ascend_path
79
+ def config_directories
80
+ @config_directories ||= [ ascend_path ]
77
81
  end
78
82
 
79
- def config_files
80
- Dir[ *CONFIG_GLOBS.map { |glob| config_directory.join(glob) } ].map do |file|
81
- Pathname.new file
82
- end
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
- @config_directory ||= path.join('config') if path.join('config').exist?
88
- @config_directory ||= path if path.join('figure.yml').exist?
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
 
@@ -21,22 +21,53 @@ class Figure < Hash
21
21
  @pattern ||= label.gsub 'Default', '[^:]+'
22
22
  end
23
23
 
24
- def with(data)
25
- self.tap { |s| s.with_data = data }
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
- (h.delete(:default) || h.delete(:gaston)).tap do |data|
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
- end
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
- default_store && k ? default_store[k] : self[:default]
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
@@ -1,3 +1,3 @@
1
1
  class Figure < Hash
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
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
- if defined?(Rails)
7
- Figure.configure do |fig|
8
- fig.env = Rails.env
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.1
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-01-06 00:00:00.000000000 Z
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 (so far very unsatisfactory) management of environment (and Rails environment)
28
+ with a management of environment (and Rails environment)
29
29
  email:
30
30
  - david.elbaz@af83.com
31
31
  executables: []