app_config 0.1.0 → 0.2.0
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/README +7 -7
- data/lib/app_config.rb +16 -5
- data/lib/app_config/base.rb +7 -12
- data/lib/app_config/storage.rb +2 -1
- data/lib/app_config/storage/sqlite.rb +61 -0
- data/lib/app_config/storage/yaml.rb +7 -1
- data/spec/app_config/base_spec.rb +4 -5
- data/spec/app_config/storage/sqlite_spec.rb +15 -0
- data/spec/fixtures/app_config.sqlite3 +0 -0
- data/spec/spec_helper.rb +24 -4
- metadata +13 -6
data/README
CHANGED
@@ -7,7 +7,7 @@ configuration, API keys or basically anything in 'key => value' pairs.
|
|
7
7
|
== Usage
|
8
8
|
|
9
9
|
Usage is simple. Just pass either a hash of options, or a block, to
|
10
|
-
AppConfig.
|
10
|
+
AppConfig.setup. See AppConfig::Base for a list of valid storage methods.
|
11
11
|
|
12
12
|
For example, given this YAML file:
|
13
13
|
|
@@ -20,9 +20,9 @@ Use it like so:
|
|
20
20
|
|
21
21
|
require 'app_config'
|
22
22
|
|
23
|
-
AppConfig.
|
24
|
-
config
|
25
|
-
config
|
23
|
+
AppConfig.setup do |config|
|
24
|
+
config[:storage_method] = :yaml
|
25
|
+
config[:path] = '/path/to/app_config.yml'
|
26
26
|
end
|
27
27
|
|
28
28
|
AppConfig[admin_email] # => 'admin@example.com'
|
@@ -31,9 +31,9 @@ Use it like so:
|
|
31
31
|
|
32
32
|
Want SQLite3 support? No problem!
|
33
33
|
|
34
|
-
AppConfig.
|
35
|
-
config
|
36
|
-
config
|
34
|
+
AppConfig.setup do |config|
|
35
|
+
config[:storage_method] = :sqlite
|
36
|
+
config[:database] = '/path/to/database.sqlite3'
|
37
37
|
end
|
38
38
|
|
39
39
|
AppConfig[:column] # => 'value'
|
data/lib/app_config.rb
CHANGED
@@ -1,15 +1,26 @@
|
|
1
1
|
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
2
|
|
3
|
-
|
3
|
+
libs = %w{ sqlite3 yaml }
|
4
|
+
|
5
|
+
begin
|
6
|
+
libs.each { |lib| require lib }
|
7
|
+
rescue LoadError
|
8
|
+
require 'rubygems'
|
9
|
+
libs.each { |lib| require lib }
|
10
|
+
end
|
4
11
|
|
5
12
|
require 'core_ext/hashish'
|
6
13
|
|
14
|
+
# TODO: Move these to their own file.
|
15
|
+
class UnknownStorageMethod < Exception; end
|
16
|
+
|
7
17
|
module AppConfig
|
8
|
-
VERSION = '0.
|
18
|
+
VERSION = '0.2.0'
|
9
19
|
|
10
20
|
autoload :Base, 'app_config/base'
|
11
21
|
autoload :Storage, 'app_config/storage'
|
12
22
|
|
23
|
+
# Returns the AppConfig version string.
|
13
24
|
def self.to_version
|
14
25
|
"#{self.class} v#{VERSION}"
|
15
26
|
end
|
@@ -21,9 +32,9 @@ module AppConfig
|
|
21
32
|
@@storage[key]
|
22
33
|
end
|
23
34
|
|
24
|
-
# Accepts an +options+ hash or
|
25
|
-
# See AppConfig::Base for valid
|
26
|
-
def self.
|
35
|
+
# Accepts an +options+ hash or a block.
|
36
|
+
# See AppConfig::Base for valid storage methods.
|
37
|
+
def self.setup(options = {}, &block)
|
27
38
|
@@storage = AppConfig::Base.new(options, &block)
|
28
39
|
end
|
29
40
|
|
data/lib/app_config/base.rb
CHANGED
@@ -6,11 +6,8 @@ module AppConfig
|
|
6
6
|
# See each storage method's documentation for their specific options.
|
7
7
|
class Base
|
8
8
|
|
9
|
-
attr_accessor :storage_method, :path
|
10
|
-
|
11
9
|
DEFAULTS = {
|
12
|
-
:storage_method => :yaml
|
13
|
-
:path => File.expand_path(File.join(ENV['HOME'], '.app_config.yml'))
|
10
|
+
:storage_method => :yaml
|
14
11
|
}
|
15
12
|
|
16
13
|
# Accepts either a hash of +options+ or a block (which overrides
|
@@ -20,10 +17,8 @@ module AppConfig
|
|
20
17
|
# * :sqlite
|
21
18
|
# * :yaml
|
22
19
|
def initialize(options = {}, &block)
|
23
|
-
DEFAULTS.merge(options)
|
24
|
-
|
25
|
-
end
|
26
|
-
yield self if block_given?
|
20
|
+
@options = DEFAULTS.merge(options)
|
21
|
+
yield @options if block_given?
|
27
22
|
@storage = initialize_storage
|
28
23
|
end
|
29
24
|
|
@@ -36,13 +31,13 @@ module AppConfig
|
|
36
31
|
|
37
32
|
# This decides how to load the data, based on the +storage_method+.
|
38
33
|
def initialize_storage
|
39
|
-
case storage_method
|
34
|
+
case @options[:storage_method]
|
40
35
|
when :sqlite
|
41
|
-
|
36
|
+
AppConfig::Storage::Sqlite.load(@options)
|
42
37
|
when :yaml
|
43
|
-
AppConfig::Storage::Yaml.load(
|
38
|
+
AppConfig::Storage::Yaml.load(@options)
|
44
39
|
else
|
45
|
-
raise
|
40
|
+
raise UnknownStorageMethod
|
46
41
|
end
|
47
42
|
end
|
48
43
|
|
data/lib/app_config/storage.rb
CHANGED
@@ -0,0 +1,61 @@
|
|
1
|
+
module AppConfig
|
2
|
+
module Storage
|
3
|
+
|
4
|
+
# SQLite3 storage method.
|
5
|
+
class Sqlite
|
6
|
+
attr_accessor :data
|
7
|
+
|
8
|
+
DEFAULTS = {
|
9
|
+
:database => File.expand_path(File.join(ENV['HOME'], '.app_config.sqlite3')),
|
10
|
+
:table => 'app_config'
|
11
|
+
}
|
12
|
+
|
13
|
+
# Loads @data with the SQLite3 database located at +path+.
|
14
|
+
# @data will be the Hashish that is accessed like AppConfig[:key].
|
15
|
+
#
|
16
|
+
# Defaults to $HOME/.app_config.sqlite3
|
17
|
+
def initialize(options)
|
18
|
+
@options = DEFAULTS.merge(options)
|
19
|
+
@db = SQLite3::Database.open(@options[:database])
|
20
|
+
@data = load_from_database
|
21
|
+
end
|
22
|
+
|
23
|
+
# Creates a new Sqlite storage with the given +path+ and returns the data.
|
24
|
+
def self.load(path)
|
25
|
+
new(path).data
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# Returns a Hashish that looks something like {:column => value}.
|
31
|
+
def load_from_database
|
32
|
+
query = ["SELECT * FROM sqlite_master",
|
33
|
+
"WHERE type == 'table' AND name == '#{@options[:table]}'",
|
34
|
+
"AND name != 'sqlite_sequence'"].join(' ')
|
35
|
+
table = @db.get_first_row(query).last
|
36
|
+
get_columns_from(table)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Gets the column names for +table+.
|
40
|
+
def get_columns_from(table)
|
41
|
+
columns = table.split(', ')
|
42
|
+
# Trip the first element, since it's the SQL CREATE statement.
|
43
|
+
columns = columns[1, columns.size]
|
44
|
+
# Yes, Ruby is 'elegant', but this is fucking disgusting. There *must* be a better way.
|
45
|
+
columns.map! {|c| c.split('"').reject {|e| e.empty? }.reject {|e| e.include? '('}}.flatten!
|
46
|
+
values_for(columns)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns a Hashish mapping of the +columns+ and their values.
|
50
|
+
def values_for(columns)
|
51
|
+
data = Hashish.new
|
52
|
+
query = "SELECT #{columns.join(', ')} FROM #{@options[:table]}"
|
53
|
+
@db.get_first_row(query).each_with_index do |value, index|
|
54
|
+
data[columns[index]] = value
|
55
|
+
end
|
56
|
+
data
|
57
|
+
end
|
58
|
+
end # Sqlite
|
59
|
+
|
60
|
+
end # Storage
|
61
|
+
end # AppConfig
|
@@ -5,10 +5,16 @@ module AppConfig
|
|
5
5
|
class Yaml
|
6
6
|
attr_reader :data
|
7
7
|
|
8
|
+
DEFAULTS = {
|
9
|
+
:path => File.expand_path(File.join(ENV['HOME'], '.app_config.yml'))
|
10
|
+
}
|
11
|
+
|
8
12
|
# Loads @data with the YAML file located at +path+.
|
13
|
+
# @data will be the Hashish that is accessed with AppConfig[:key].
|
9
14
|
#
|
10
15
|
# Defaults to $HOME/.app_config.yml
|
11
|
-
def initialize(
|
16
|
+
def initialize(options)
|
17
|
+
path = options[:path] || DEFAULTS[:path]
|
12
18
|
@data = Hashish.new(YAML.load_file(path))
|
13
19
|
end
|
14
20
|
|
@@ -2,10 +2,10 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
2
|
|
3
3
|
describe Base do
|
4
4
|
|
5
|
-
it 'should raise
|
5
|
+
it 'should raise UnknownStorageMethod' do
|
6
6
|
lambda do
|
7
|
-
Base.new(:
|
8
|
-
end.should raise_error(
|
7
|
+
Base.new(:storage_method => 'not_a_real_storage_method')
|
8
|
+
end.should raise_error(UnknownStorageMethod)
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'should have default options' do
|
@@ -13,8 +13,7 @@ describe Base do
|
|
13
13
|
# mock up the YAML stuff, so it won't puke
|
14
14
|
YAML.should_receive(:load_file).with(default_path).and_return({:api => 'key'})
|
15
15
|
base = Base.new
|
16
|
-
base.storage_method.should == :yaml
|
17
|
-
base.path.should == default_path
|
16
|
+
base.instance_variable_get(:@options)[:storage_method].should == :yaml
|
18
17
|
end
|
19
18
|
|
20
19
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include AppConfig::Storage
|
4
|
+
describe Sqlite do
|
5
|
+
it 'should not find the database' do
|
6
|
+
lambda do
|
7
|
+
config_for_sqlite(:database => 'not/a/real/database.sqlite3')
|
8
|
+
end.should raise_error(SQLite3::CantOpenException)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should have some values' do
|
12
|
+
config_for_sqlite
|
13
|
+
AppConfig[:api_key].should_not be_nil
|
14
|
+
end
|
15
|
+
end
|
Binary file
|
data/spec/spec_helper.rb
CHANGED
@@ -6,12 +6,32 @@ Spec::Runner.configure do |config|
|
|
6
6
|
include AppConfig
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
# Returns the full path to the +name+ fixture file.
|
10
|
+
def fixture(name)
|
11
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', name))
|
12
|
+
end
|
13
|
+
|
14
|
+
# AppConfig.configure wrapper. Accepts a hash of +options+.
|
15
|
+
def config_for(options)
|
16
|
+
AppConfig.setup(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Setup Yaml options and pass to config_for().
|
10
20
|
def config_for_yaml(opts = {})
|
11
|
-
path = opts[:path] ||
|
12
|
-
|
21
|
+
path = opts[:path] || fixture('app_config.yml')
|
22
|
+
yaml = {
|
13
23
|
:storage_method => :yaml,
|
14
24
|
:path => path,
|
15
25
|
}
|
16
|
-
|
26
|
+
config_for(yaml.merge(opts))
|
27
|
+
end
|
28
|
+
|
29
|
+
# Setup Sqlite options and pass to config_for().
|
30
|
+
def config_for_sqlite(opts = {})
|
31
|
+
database = opts[:database] || fixture('app_config.sqlite3')
|
32
|
+
sqlite = {
|
33
|
+
:storage_method => :sqlite,
|
34
|
+
:database => database
|
35
|
+
}
|
36
|
+
config_for(sqlite.merge(opts))
|
17
37
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: app_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dale Campbell
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-15 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -26,6 +26,7 @@ files:
|
|
26
26
|
- README
|
27
27
|
- Rakefile
|
28
28
|
- lib/app_config/base.rb
|
29
|
+
- lib/app_config/storage/sqlite.rb
|
29
30
|
- lib/app_config/storage/yaml.rb
|
30
31
|
- lib/app_config/storage.rb
|
31
32
|
- lib/app_config.rb
|
@@ -33,20 +34,26 @@ files:
|
|
33
34
|
- spec/app_config
|
34
35
|
- spec/app_config/base_spec.rb
|
35
36
|
- spec/app_config/storage
|
37
|
+
- spec/app_config/storage/sqlite_spec.rb
|
36
38
|
- spec/app_config/storage/yaml_spec.rb
|
37
39
|
- spec/app_config_spec.rb
|
38
40
|
- spec/core_ext
|
39
41
|
- spec/core_ext/hashish_spec.rb
|
40
42
|
- spec/fixtures
|
43
|
+
- spec/fixtures/app_config.sqlite3
|
41
44
|
- spec/fixtures/app_config.yml
|
42
45
|
- spec/rcov.opts
|
43
46
|
- spec/spec.opts
|
44
47
|
- spec/spec_helper.rb
|
45
|
-
has_rdoc:
|
48
|
+
has_rdoc: true
|
46
49
|
homepage: http://oshuma.github.com/app_config
|
47
50
|
post_install_message:
|
48
|
-
rdoc_options:
|
49
|
-
|
51
|
+
rdoc_options:
|
52
|
+
- --title "AppConfig"
|
53
|
+
- --all
|
54
|
+
- --inline-source
|
55
|
+
- --line-numbers
|
56
|
+
- --main README
|
50
57
|
require_paths:
|
51
58
|
- lib
|
52
59
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -63,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
70
|
version:
|
64
71
|
requirements: []
|
65
72
|
|
66
|
-
rubyforge_project:
|
73
|
+
rubyforge_project: app-config
|
67
74
|
rubygems_version: 1.3.1
|
68
75
|
signing_key:
|
69
76
|
specification_version: 2
|