hopsoft-fig 0.8.3 → 0.8.4
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.
- data/Rakefile +1 -1
- data/fig.gemspec +4 -4
- data/lib/hopsoft/fig.rb +134 -0
- data/test/fig_test.rb +2 -2
- metadata +4 -4
- data/lib/fig.rb +0 -132
data/Rakefile
CHANGED
data/fig.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{fig}
|
5
|
-
s.version = "0.8.
|
5
|
+
s.version = "0.8.4"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Nathan Hopkins, Hopsoft LLC"]
|
9
|
-
s.date = %q{2009-03-
|
9
|
+
s.date = %q{2009-03-16}
|
10
10
|
s.description = %q{The smart way to manage configuration settings for your Ruby applications.}
|
11
11
|
s.email = %q{natehop@gmail.com}
|
12
|
-
s.extra_rdoc_files = ["README.rdoc", "lib/fig.rb", "lib/string.rb", "tasks/fig_tasks.rake"]
|
13
|
-
s.files = ["README.rdoc", "install.rb", "MIT-LICENSE", "test/test.yml", "test/test2.yml", "test/string_test.rb", "test/fig_test.rb", "Manifest", "uninstall.rb", "Rakefile", "init.rb", "lib/fig.rb", "lib/string.rb", "tasks/fig_tasks.rake", "fig.gemspec"]
|
12
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/hopsoft/fig.rb", "lib/string.rb", "tasks/fig_tasks.rake"]
|
13
|
+
s.files = ["README.rdoc", "install.rb", "MIT-LICENSE", "test/test.yml", "test/test2.yml", "test/string_test.rb", "test/fig_test.rb", "Manifest", "uninstall.rb", "Rakefile", "init.rb", "lib/hopsoft/fig.rb", "lib/string.rb", "tasks/fig_tasks.rake", "fig.gemspec"]
|
14
14
|
s.has_rdoc = true
|
15
15
|
s.homepage = %q{http://github.com/hopsoft/fig}
|
16
16
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Fig", "--main", "README.rdoc"]
|
data/lib/hopsoft/fig.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'thread'
|
4
|
+
require File.dirname(__FILE__) + '/../string'
|
5
|
+
|
6
|
+
module Hopsoft
|
7
|
+
class Fig
|
8
|
+
|
9
|
+
# Constructor...
|
10
|
+
#
|
11
|
+
# ===Params
|
12
|
+
# * *file_path* - Path to the config file that should be loaded.
|
13
|
+
def initialize(file_path)
|
14
|
+
@lock = Mutex.new
|
15
|
+
@file_path = file_path
|
16
|
+
load
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the config file file as a YAML Hash.
|
20
|
+
def yaml
|
21
|
+
copy = {}
|
22
|
+
@lock.synchronize do
|
23
|
+
copy.merge!(@yaml)
|
24
|
+
end
|
25
|
+
copy
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Returns an OpenStruct object representation of the config file.
|
30
|
+
# This allows you to access config settings with dot notation.
|
31
|
+
def settings
|
32
|
+
copy = OpenStruct.new
|
33
|
+
@lock.synchronize do
|
34
|
+
copy.marshal_load(@settings.marshal_dump)
|
35
|
+
end
|
36
|
+
copy
|
37
|
+
end
|
38
|
+
|
39
|
+
# The safest way to get a config setting.
|
40
|
+
# Requesting a non-exsisting key, will simply return a nil value instead of raising an error.
|
41
|
+
#
|
42
|
+
# Examples:
|
43
|
+
# Fig.get_setting('some.nested.setting')
|
44
|
+
#
|
45
|
+
# ===Params
|
46
|
+
# * *key* - A case insensivie config key
|
47
|
+
#
|
48
|
+
# *Returns* The value of the config setting requested.
|
49
|
+
# This may be the value itself or an OpenStruct containing child args
|
50
|
+
def get_setting(key)
|
51
|
+
setting = nil
|
52
|
+
|
53
|
+
@lock.synchronize do
|
54
|
+
setting = @settings
|
55
|
+
keys = key.to_s.downcase.split(/\./)
|
56
|
+
|
57
|
+
keys.each do |k|
|
58
|
+
item = eval("setting.#{k}")
|
59
|
+
return nil unless item
|
60
|
+
setting = item
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
setting
|
65
|
+
end
|
66
|
+
|
67
|
+
# Loads the config file and builds the internal Fig objects.
|
68
|
+
# Can be used to reload the file when changes have been made.
|
69
|
+
def load
|
70
|
+
yaml = YAML.load_file(@file_path)
|
71
|
+
yaml.each {|k, v| interpolate_setting(yaml, v)}
|
72
|
+
settings = OpenStruct.new
|
73
|
+
add_hash(settings, yaml)
|
74
|
+
|
75
|
+
@lock.synchronize do
|
76
|
+
@yaml = yaml
|
77
|
+
@settings = settings
|
78
|
+
end
|
79
|
+
rescue
|
80
|
+
puts "Failed to load file: #{@file_path}\n#{$!}"
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
# Invoked recursively to implicitly interpolate all settings for the passed value.
|
86
|
+
# Config values that contain the pattern /{fig:/ are implicitly interpolated,
|
87
|
+
# replacing the "fig" placeholder with the actual value from elsewhere in the config file.
|
88
|
+
#
|
89
|
+
# Example:
|
90
|
+
# name: Nathan Hopkins
|
91
|
+
# message: "This is a test! Hello #{fig:example.name}"
|
92
|
+
#
|
93
|
+
# ===Params
|
94
|
+
# * *value* [_Object_] The value to interpolate.
|
95
|
+
def interpolate_setting(yaml, value)
|
96
|
+
if value.is_a?(Hash)
|
97
|
+
value.each {|k,v| interpolate_setting(yaml, v) }
|
98
|
+
elsif value.is_a?(String)
|
99
|
+
pattern = /\{fig:/i
|
100
|
+
start = value.index(pattern, 0)
|
101
|
+
replace = {}
|
102
|
+
|
103
|
+
while start
|
104
|
+
finish = value.index(/\}/, start)
|
105
|
+
key = value[(start + 1)..(finish - 1)]
|
106
|
+
replace[key] = eval("yaml['#{key.sub(/^fig:/i, "").gsub(/\./, "']['")}'].to_s")
|
107
|
+
start = value.index(pattern, finish)
|
108
|
+
end
|
109
|
+
|
110
|
+
value.interpolate(replace, true)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Recursively adds a hash to an OpenStruct object, ultimately creating a complete OpenStruct object with attributes
|
115
|
+
# for all key/value pairs in the Hash.
|
116
|
+
#
|
117
|
+
# ===Params
|
118
|
+
# * *obj* - The OpenStruct object to add Hash args to.
|
119
|
+
# * *hash* - The Hash to pull args from.
|
120
|
+
def add_hash(obj, hash)
|
121
|
+
return unless hash
|
122
|
+
|
123
|
+
hash.each do |key, value|
|
124
|
+
if value.class == Hash
|
125
|
+
eval "obj.#{key} = OpenStruct.new"
|
126
|
+
add_hash(eval("obj.#{key}"), value)
|
127
|
+
else
|
128
|
+
eval "obj.#{key.downcase} = value"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
data/test/fig_test.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'fileutils'
|
3
|
-
require File.dirname(__FILE__) + '/../lib/fig'
|
3
|
+
require File.dirname(__FILE__) + '/../lib/hopsoft/fig'
|
4
4
|
|
5
5
|
class FigTest < Test::Unit::TestCase
|
6
|
-
@@fig = Fig.new(File.dirname(__FILE__) + '/test.yml')
|
6
|
+
@@fig = Hopsoft::Fig.new(File.dirname(__FILE__) + '/test.yml')
|
7
7
|
|
8
8
|
def test_yaml_values
|
9
9
|
assert @@fig.yaml
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hopsoft-fig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Hopkins, Hopsoft LLC
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-16 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -21,7 +21,7 @@ extensions: []
|
|
21
21
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- README.rdoc
|
24
|
-
- lib/fig.rb
|
24
|
+
- lib/hopsoft/fig.rb
|
25
25
|
- lib/string.rb
|
26
26
|
- tasks/fig_tasks.rake
|
27
27
|
files:
|
@@ -36,7 +36,7 @@ files:
|
|
36
36
|
- uninstall.rb
|
37
37
|
- Rakefile
|
38
38
|
- init.rb
|
39
|
-
- lib/fig.rb
|
39
|
+
- lib/hopsoft/fig.rb
|
40
40
|
- lib/string.rb
|
41
41
|
- tasks/fig_tasks.rake
|
42
42
|
- fig.gemspec
|
data/lib/fig.rb
DELETED
@@ -1,132 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'ostruct'
|
3
|
-
require 'thread'
|
4
|
-
require File.dirname(__FILE__) + '/string'
|
5
|
-
|
6
|
-
class Fig
|
7
|
-
|
8
|
-
# Constructor...
|
9
|
-
#
|
10
|
-
# ===Params
|
11
|
-
# * *file_path* - Path to the config file that should be loaded.
|
12
|
-
def initialize(file_path)
|
13
|
-
@lock = Mutex.new
|
14
|
-
@file_path = file_path
|
15
|
-
load
|
16
|
-
end
|
17
|
-
|
18
|
-
# Returns the config file file as a YAML Hash.
|
19
|
-
def yaml
|
20
|
-
copy = {}
|
21
|
-
@lock.synchronize do
|
22
|
-
copy.merge!(@yaml)
|
23
|
-
end
|
24
|
-
copy
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
# Returns an OpenStruct object representation of the config file.
|
29
|
-
# This allows you to access config settings with dot notation.
|
30
|
-
def settings
|
31
|
-
copy = OpenStruct.new
|
32
|
-
@lock.synchronize do
|
33
|
-
copy.marshal_load(@settings.marshal_dump)
|
34
|
-
end
|
35
|
-
copy
|
36
|
-
end
|
37
|
-
|
38
|
-
# The safest way to get a config setting.
|
39
|
-
# Requesting a non-exsisting key, will simply return a nil value instead of raising an error.
|
40
|
-
#
|
41
|
-
# Examples:
|
42
|
-
# Fig.get_setting('some.nested.setting')
|
43
|
-
#
|
44
|
-
# ===Params
|
45
|
-
# * *key* - A case insensivie config key
|
46
|
-
#
|
47
|
-
# *Returns* The value of the config setting requested.
|
48
|
-
# This may be the value itself or an OpenStruct containing child args
|
49
|
-
def get_setting(key)
|
50
|
-
setting = nil
|
51
|
-
|
52
|
-
@lock.synchronize do
|
53
|
-
setting = @settings
|
54
|
-
keys = key.to_s.downcase.split(/\./)
|
55
|
-
|
56
|
-
keys.each do |k|
|
57
|
-
item = eval("setting.#{k}")
|
58
|
-
return nil unless item
|
59
|
-
setting = item
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
setting
|
64
|
-
end
|
65
|
-
|
66
|
-
# Loads the config file and builds the internal Fig objects.
|
67
|
-
# Can be used to reload the file when changes have been made.
|
68
|
-
def load
|
69
|
-
yaml = YAML.load_file(@file_path)
|
70
|
-
yaml.each {|k, v| interpolate_setting(yaml, v)}
|
71
|
-
settings = OpenStruct.new
|
72
|
-
add_hash(settings, yaml)
|
73
|
-
|
74
|
-
@lock.synchronize do
|
75
|
-
@yaml = yaml
|
76
|
-
@settings = settings
|
77
|
-
end
|
78
|
-
rescue
|
79
|
-
puts "Failed to load file: #{@file_path}\n#{$!}"
|
80
|
-
end
|
81
|
-
|
82
|
-
private
|
83
|
-
|
84
|
-
# Invoked recursively to implicitly interpolate all settings for the passed value.
|
85
|
-
# Config values that contain the pattern /{fig:/ are implicitly interpolated,
|
86
|
-
# replacing the "fig" placeholder with the actual value from elsewhere in the config file.
|
87
|
-
#
|
88
|
-
# Example:
|
89
|
-
# name: Nathan Hopkins
|
90
|
-
# message: "This is a test! Hello #{fig:example.name}"
|
91
|
-
#
|
92
|
-
# ===Params
|
93
|
-
# * *value* [_Object_] The value to interpolate.
|
94
|
-
def interpolate_setting(yaml, value)
|
95
|
-
if value.is_a?(Hash)
|
96
|
-
value.each {|k,v| interpolate_setting(yaml, v) }
|
97
|
-
elsif value.is_a?(String)
|
98
|
-
pattern = /\{fig:/i
|
99
|
-
start = value.index(pattern, 0)
|
100
|
-
replace = {}
|
101
|
-
|
102
|
-
while start
|
103
|
-
finish = value.index(/\}/, start)
|
104
|
-
key = value[(start + 1)..(finish - 1)]
|
105
|
-
replace[key] = eval("yaml['#{key.sub(/^fig:/i, "").gsub(/\./, "']['")}'].to_s")
|
106
|
-
start = value.index(pattern, finish)
|
107
|
-
end
|
108
|
-
|
109
|
-
value.interpolate(replace, true)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
# Recursively adds a hash to an OpenStruct object, ultimately creating a complete OpenStruct object with attributes
|
114
|
-
# for all key/value pairs in the Hash.
|
115
|
-
#
|
116
|
-
# ===Params
|
117
|
-
# * *obj* - The OpenStruct object to add Hash args to.
|
118
|
-
# * *hash* - The Hash to pull args from.
|
119
|
-
def add_hash(obj, hash)
|
120
|
-
return unless hash
|
121
|
-
|
122
|
-
hash.each do |key, value|
|
123
|
-
if value.class == Hash
|
124
|
-
eval "obj.#{key} = OpenStruct.new"
|
125
|
-
add_hash(eval("obj.#{key}"), value)
|
126
|
-
else
|
127
|
-
eval "obj.#{key.downcase} = value"
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|