tcravit_ruby_lib 0.0.3 → 0.0.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/lib/tcravit_ruby_lib/app_config.rb +70 -0
- data/lib/tcravit_ruby_lib/config_searcher.rb +8 -1
- data/lib/tcravit_ruby_lib/version.rb +1 -1
- data/lib/tcravit_ruby_lib.rb +1 -0
- data/spec/tcravit_ruby_lib/app_config_spec.rb +49 -0
- data/spec/tcravit_ruby_lib/config_searcher_spec.rb +44 -46
- metadata +9 -6
@@ -0,0 +1,70 @@
|
|
1
|
+
module TcravitRubyLib #:nodoc:
|
2
|
+
|
3
|
+
# Simple and Flexible Configuration Data Storage.
|
4
|
+
#
|
5
|
+
# AppConfig provides a simple facility for storing configuration data in
|
6
|
+
# an application. It does this using metaprogramming techniques to define
|
7
|
+
# accessor methods dynamically when the configuration file is loaded.
|
8
|
+
#
|
9
|
+
# This is far from the best way to do this, and was written as an exercise
|
10
|
+
# in metaprogramming as much as anything else.
|
11
|
+
#
|
12
|
+
# === Example
|
13
|
+
#
|
14
|
+
# TcravitRubyLib::AppConfig.configure do
|
15
|
+
# some_value 1023
|
16
|
+
# another_value "Foo"
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# TcravitRubyLib::AppConfig.some_value # => 1023
|
20
|
+
# TcravitRubyLib::AppConfig.some_value = 2048
|
21
|
+
# TcravitRubyLib::AppConfig.some_value # => 2048
|
22
|
+
#
|
23
|
+
# Author:: Tammy Cravit (mailto:tammy@tammycravit.com)
|
24
|
+
# Copyright:: Copyright (c) 2011, Tammy Cravit. All rights reserved.
|
25
|
+
# License:: This program is free software: you can redistribute it and/or modify
|
26
|
+
# it under the terms of the GNU General Public License as published by
|
27
|
+
# the Free Software Foundation, either version 3 of the License, or
|
28
|
+
# (at your option) any later version.
|
29
|
+
|
30
|
+
module AppConfig
|
31
|
+
extend self
|
32
|
+
|
33
|
+
def configure(&block)
|
34
|
+
@definitions ||= Hash.new
|
35
|
+
|
36
|
+
# The method_missing auto-trigger should only run when we're inside
|
37
|
+
# a configure block
|
38
|
+
@in_config = true
|
39
|
+
instance_eval &block
|
40
|
+
@in_config = false
|
41
|
+
end
|
42
|
+
|
43
|
+
def remove!(key)
|
44
|
+
the_sym = key.to_sym
|
45
|
+
@definitions.delete(the_sym)
|
46
|
+
send :undef_method, the_sym
|
47
|
+
send :undef_method, "#{the_sym.to_s}=".to_sym
|
48
|
+
end
|
49
|
+
|
50
|
+
def method_missing(methname, *args)
|
51
|
+
if (methname.to_s =~ /^([A-Za-z0-9][A-Za-z0-9\-\_]+)$/)
|
52
|
+
if @in_config
|
53
|
+
getter_method_name = methname.to_s.to_sym
|
54
|
+
setter_method_name = "#{methname}=".to_s.to_sym
|
55
|
+
send :define_method, getter_method_name do
|
56
|
+
@definitions[getter_method_name]
|
57
|
+
end
|
58
|
+
send :define_method, setter_method_name do |new_value|
|
59
|
+
@definitions[getter_method_name] = new_value
|
60
|
+
end
|
61
|
+
send setter_method_name, (args.count > 0 ? args.first : nil)
|
62
|
+
else
|
63
|
+
super
|
64
|
+
end
|
65
|
+
else
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -3,7 +3,7 @@ require 'pathname'
|
|
3
3
|
module TcravitRubyLib #:nodoc:
|
4
4
|
|
5
5
|
# Utilities for locating a configuration directory within a tree.
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# Unix utilities such as +git+ will look for the .git directory in a
|
8
8
|
# project by starting with the current directory and traversing upward
|
9
9
|
# until a .git folder is found. This allows local configuration in a
|
@@ -11,6 +11,13 @@ module TcravitRubyLib #:nodoc:
|
|
11
11
|
#
|
12
12
|
# This module, inspired by a post on Practicing Ruby, implements that
|
13
13
|
# kind of traversal for Ruby applications.
|
14
|
+
#
|
15
|
+
# Author:: Tammy Cravit (mailto:tammy@tammycravit.com)
|
16
|
+
# Copyright:: Copyright (c) 2011, Tammy Cravit. All rights reserved.
|
17
|
+
# License:: This program is free software: you can redistribute it and/or modify
|
18
|
+
# it under the terms of the GNU General Public License as published by
|
19
|
+
# the Free Software Foundation, either version 3 of the License, or
|
20
|
+
# (at your option) any later version.
|
14
21
|
module ConfigSearcher
|
15
22
|
|
16
23
|
# Locate a configuration folder by starting in the specified directory
|
data/lib/tcravit_ruby_lib.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe "TcravitRubyLib::AppConfig" do
|
5
|
+
|
6
|
+
STRING_VAL = "string"
|
7
|
+
NUMERIC_VAL = 18293
|
8
|
+
SYMBOLIC_VAL = :squid
|
9
|
+
|
10
|
+
before(:all) do
|
11
|
+
TcravitRubyLib::AppConfig.configure do
|
12
|
+
string_value STRING_VAL
|
13
|
+
numeric_value NUMERIC_VAL
|
14
|
+
symbol_value SYMBOLIC_VAL
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return the values for defined properties" do
|
19
|
+
TcravitRubyLib::AppConfig.string_value.should == STRING_VAL
|
20
|
+
TcravitRubyLib::AppConfig.numeric_value.should == NUMERIC_VAL
|
21
|
+
TcravitRubyLib::AppConfig.symbol_value.should == SYMBOLIC_VAL
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should raise an error for undefined properties" do
|
25
|
+
lambda { TcravitRubyLib::AppConfig.fishpaste_value }.should raise_error
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should allow me to change a configuration property" do
|
29
|
+
TcravitRubyLib::AppConfig.string_value = "new value"
|
30
|
+
TcravitRubyLib::AppConfig.string_value.should == "new value"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should allow me to remove a configuration property" do
|
34
|
+
TcravitRubyLib::AppConfig.remove!(:string_value)
|
35
|
+
lambda { TcravitRubyLib::AppConfig.string_value }.should raise_error
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should allow additional properties to be added" do
|
39
|
+
TcravitRubyLib::AppConfig.configure do
|
40
|
+
another_value 192
|
41
|
+
end
|
42
|
+
TcravitRubyLib::AppConfig.configure do
|
43
|
+
and_another_value 384
|
44
|
+
end
|
45
|
+
TcravitRubyLib::AppConfig.another_value.should == 192
|
46
|
+
TcravitRubyLib::AppConfig.and_another_value.should == 384
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -1,56 +1,54 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
|
-
describe "TcravitRubyLib" do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
4
|
+
describe "TcravitRubyLib::ConfigSearcher" do
|
5
|
+
|
6
|
+
BASE_DIR = '/tmp/config_searcher_test'
|
7
|
+
DEEP_DIR = "#{BASE_DIR}/foo/bar/baz"
|
8
|
+
CONFIG_DIR = "#{BASE_DIR}/.config"
|
9
|
+
|
10
|
+
before(:all) do
|
11
|
+
FileUtils.mkdir_p DEEP_DIR
|
12
|
+
FileUtils.mkdir_p CONFIG_DIR
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:all) do
|
16
|
+
FileUtils.remove_dir BASE_DIR, true
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should successfully find a directory which exists" do
|
20
|
+
dir_path = TcravitRubyLib::ConfigSearcher.locate_config_dir(start_in: DEEP_DIR, look_for: ".config")
|
21
|
+
dir_path.to_s.should_not be_nil
|
22
|
+
dir_path.to_s.should == CONFIG_DIR
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not find a directory when one doesn't exist" do
|
26
|
+
dir_path = TcravitRubyLib::ConfigSearcher.locate_config_dir(start_in: DEEP_DIR, look_for: ".snausages")
|
27
|
+
dir_path.to_s.should == ""
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return the container dir when the only_container_dir option is provided" do
|
31
|
+
dir_path = TcravitRubyLib::ConfigSearcher.locate_config_dir(start_in: DEEP_DIR, look_for: ".config", only_container_dir: true)
|
32
|
+
dir_path.to_s.should == BASE_DIR
|
33
|
+
end
|
25
34
|
|
26
|
-
|
27
|
-
|
28
|
-
dir_path.to_s.should == ""
|
29
|
-
end
|
35
|
+
it "should raise an exception when the start_in directory doesn't exist" do
|
36
|
+
an_exception = nil
|
30
37
|
|
31
|
-
|
32
|
-
dir_path = TcravitRubyLib::ConfigSearcher.locate_config_dir(start_in: DEEP_DIR, look_for: ".
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
it "should raise an exception when the start_in directory doesn't exist" do
|
37
|
-
an_exception = nil
|
38
|
-
|
39
|
-
begin
|
40
|
-
dir_path = TcravitRubyLib::ConfigSearcher.locate_config_dir(start_in: "#{DEEP_DIR}xxxxxxx", look_for: ".snausages")
|
41
|
-
rescue => e
|
42
|
-
an_exception = e
|
43
|
-
end
|
44
|
-
|
45
|
-
an_exception.should_not be_nil
|
46
|
-
an_exception.message.should == "No such file or directory - #{DEEP_DIR}xxxxxxx"
|
38
|
+
begin
|
39
|
+
dir_path = TcravitRubyLib::ConfigSearcher.locate_config_dir(start_in: "#{DEEP_DIR}xxxxxxx", look_for: ".snausages")
|
40
|
+
rescue => e
|
41
|
+
an_exception = e
|
47
42
|
end
|
48
43
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
44
|
+
an_exception.should_not be_nil
|
45
|
+
an_exception.message.should == "No such file or directory - #{DEEP_DIR}xxxxxxx"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should behave the same for the alternative option names" do
|
49
|
+
dir_path = TcravitRubyLib::ConfigSearcher.locate_config_dir(start_dir: DEEP_DIR, config_dir: ".config")
|
50
|
+
dir_path.to_s.should_not be_nil
|
51
|
+
dir_path.to_s.should == CONFIG_DIR
|
54
52
|
end
|
55
53
|
|
56
54
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcravit_ruby_lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
12
|
+
date: 2011-12-03 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70216638519080 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70216638519080
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &70216638518460 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70216638518460
|
36
36
|
description:
|
37
37
|
email:
|
38
38
|
- tcravit@taylored-software.com
|
@@ -47,9 +47,11 @@ files:
|
|
47
47
|
- README.md
|
48
48
|
- Rakefile
|
49
49
|
- lib/tcravit_ruby_lib.rb
|
50
|
+
- lib/tcravit_ruby_lib/app_config.rb
|
50
51
|
- lib/tcravit_ruby_lib/config_searcher.rb
|
51
52
|
- lib/tcravit_ruby_lib/version.rb
|
52
53
|
- spec/spec_helper.rb
|
54
|
+
- spec/tcravit_ruby_lib/app_config_spec.rb
|
53
55
|
- spec/tcravit_ruby_lib/config_searcher_spec.rb
|
54
56
|
- tcravit_ruby_lib.gemspec
|
55
57
|
homepage: ''
|
@@ -78,5 +80,6 @@ specification_version: 3
|
|
78
80
|
summary: Random reusable ruby stuff
|
79
81
|
test_files:
|
80
82
|
- spec/spec_helper.rb
|
83
|
+
- spec/tcravit_ruby_lib/app_config_spec.rb
|
81
84
|
- spec/tcravit_ruby_lib/config_searcher_spec.rb
|
82
85
|
has_rdoc:
|