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 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: []