figure 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
@@ -0,0 +1,3 @@
1
+ class Figure < Hash
2
+ VERSION = "0.0.1"
3
+ end
data/lib/figure.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'figure/store'
2
+ require 'figure/department_store'
3
+ require 'figure/figure'
4
+ require 'figure/figurine'
5
+
6
+ if defined?(Rails)
7
+ Figure.configure do |fig|
8
+ fig.env = Rails.env
9
+ end
10
+ end
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: []