figure 0.0.1

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