app_config 0.7.1 → 1.0.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/.gitignore +3 -0
- data/.rspec +1 -0
- data/Gemfile.lock +25 -13
- data/README.md +97 -0
- data/Rakefile +16 -18
- data/app_config.gemspec +9 -5
- data/lib/app_config/base.rb +16 -53
- data/lib/app_config/storage/base.rb +16 -6
- data/lib/app_config/storage/mongo.rb +7 -13
- data/lib/app_config/storage/yaml.rb +5 -10
- data/lib/app_config/storage.rb +0 -1
- data/lib/app_config.rb +18 -16
- data/lib/core_ext/hashish.rb +17 -21
- data/spec/app_config/storage/mongo_spec.rb +11 -3
- data/spec/app_config/storage/yaml_spec.rb +2 -7
- data/spec/app_config/storage_spec.rb +0 -5
- data/spec/app_config_spec.rb +1 -3
- data/spec/core_ext/hashish_spec.rb +1 -1
- data/spec/spec_helper.rb +12 -12
- metadata +84 -22
- data/README.rdoc +0 -119
- data/doc/js/darkfish.js +0 -116
- data/doc/js/jquery.js +0 -32
- data/doc/js/quicksearch.js +0 -114
- data/doc/js/thickbox-compressed.js +0 -10
- data/lib/app_config/storage/sqlite.rb +0 -62
- data/spec/watchr.rb +0 -28
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile.lock
CHANGED
@@ -1,25 +1,34 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
app_config (0.7.
|
4
|
+
app_config (0.7.1)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: http://rubygems.org/
|
8
8
|
specs:
|
9
9
|
bson (1.3.1)
|
10
10
|
bson_ext (1.3.1)
|
11
|
-
diff-lcs (1.1.
|
11
|
+
diff-lcs (1.1.3)
|
12
|
+
maruku (0.6.0)
|
13
|
+
syntax (>= 1.0.0)
|
12
14
|
mongo (1.3.1)
|
13
15
|
bson (>= 1.3.1)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
rspec-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
rspec-
|
22
|
-
|
16
|
+
multi_json (1.3.6)
|
17
|
+
rake (0.9.2.2)
|
18
|
+
rspec (2.10.0)
|
19
|
+
rspec-core (~> 2.10.0)
|
20
|
+
rspec-expectations (~> 2.10.0)
|
21
|
+
rspec-mocks (~> 2.10.0)
|
22
|
+
rspec-core (2.10.1)
|
23
|
+
rspec-expectations (2.10.0)
|
24
|
+
diff-lcs (~> 1.1.3)
|
25
|
+
rspec-mocks (2.10.1)
|
26
|
+
simplecov (0.6.4)
|
27
|
+
multi_json (~> 1.0)
|
28
|
+
simplecov-html (~> 0.5.3)
|
29
|
+
simplecov-html (0.5.3)
|
30
|
+
syntax (1.0.0)
|
31
|
+
yard (0.8.2)
|
23
32
|
|
24
33
|
PLATFORMS
|
25
34
|
ruby
|
@@ -27,6 +36,9 @@ PLATFORMS
|
|
27
36
|
DEPENDENCIES
|
28
37
|
app_config!
|
29
38
|
bson_ext
|
39
|
+
maruku
|
30
40
|
mongo
|
31
|
-
|
32
|
-
|
41
|
+
rake
|
42
|
+
rspec (~> 2.10.0)
|
43
|
+
simplecov
|
44
|
+
yard
|
data/README.md
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# AppConfig
|
2
|
+
|
3
|
+
An easy to use, customizable library to easily store and retrieve application
|
4
|
+
(or library) configuration, API keys or basically anything in 'key/value' pairs.
|
5
|
+
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
Usage is simple. Just pass either a hash of options, or a block, to {AppConfig.setup}.
|
10
|
+
|
11
|
+
In it's simplest form, you can use it like so:
|
12
|
+
|
13
|
+
AppConfig.setup(:admin_email => 'admin@example.com')
|
14
|
+
# ..or..
|
15
|
+
AppConfig.setup do |config|
|
16
|
+
config[:admin_email] = 'admin@example.com'
|
17
|
+
end
|
18
|
+
|
19
|
+
# Strings or symbols as keys.
|
20
|
+
AppConfig[:admin_email] # => 'admin@example.com'
|
21
|
+
|
22
|
+
You may also specify the storage method along with options specific to that storage method.
|
23
|
+
Check the [wiki](https://github.com/Oshuma/app_config/wiki) for more usage examples.
|
24
|
+
|
25
|
+
|
26
|
+
## AppConfig::Storage::YAML
|
27
|
+
|
28
|
+
Given this YAML file:
|
29
|
+
|
30
|
+
---
|
31
|
+
admin_email: 'admin@example.com'
|
32
|
+
api_name: 'Supr Webz 2.0'
|
33
|
+
api_key: 'SUPERAWESOMESERVICE'
|
34
|
+
|
35
|
+
Use it like so:
|
36
|
+
|
37
|
+
AppConfig.setup(:yaml => '/path/to/app_config.yml')
|
38
|
+
|
39
|
+
# Later on...
|
40
|
+
# Strings or symbols as keys.
|
41
|
+
AppConfig['admin_email'] # => 'admin@example.com'
|
42
|
+
AppConfig[:api_name] # => 'Supr Webz 2.0'
|
43
|
+
AppConfig[:api_key] # => 'SUPERAWESOMESERVICE'
|
44
|
+
|
45
|
+
|
46
|
+
## AppConfig::Storage::Mongo
|
47
|
+
|
48
|
+
You can pass a `:mongo` options hash to {AppConfig.setup} which should contain
|
49
|
+
configuration values for a Mongo database. Check the {AppConfig::Storage::Mongo::DEFAULTS}
|
50
|
+
constant for the default Mongo connection options.
|
51
|
+
|
52
|
+
mongo_opts = {
|
53
|
+
:host => 'localhost', # default
|
54
|
+
:database => 'app_config', # default
|
55
|
+
:collection => 'app_config' # default
|
56
|
+
}
|
57
|
+
|
58
|
+
AppConfig.setup(:mongo => mongo_opts)
|
59
|
+
|
60
|
+
AppConfig[:admin_email]
|
61
|
+
# => 'admin@example.com'
|
62
|
+
|
63
|
+
# Override an existing value (saves to the database):
|
64
|
+
AppConfig[:admin_email] = 'other_admin@example.com'
|
65
|
+
|
66
|
+
The values are read/saved (by default) to the `app_config` database and
|
67
|
+
`app_config` collection. These defaults can be overridden, however, which
|
68
|
+
might lend well to versioned configurations; collection names such as
|
69
|
+
`app_config_v1`, `app_config_v2`, etc.
|
70
|
+
|
71
|
+
AppConfig.setup(:mongo => { :collection => 'app_config_v2' })
|
72
|
+
|
73
|
+
|
74
|
+
## Environment Mode
|
75
|
+
|
76
|
+
There's also an 'environment mode' where you can organize the config
|
77
|
+
sort of like the Rails database config. Given this YAML file:
|
78
|
+
|
79
|
+
# Rails.root/config/app_config.yml
|
80
|
+
development:
|
81
|
+
title: 'Development Mode'
|
82
|
+
|
83
|
+
production:
|
84
|
+
title: 'Production Mode'
|
85
|
+
|
86
|
+
Set the `:env` option to your desired environment.
|
87
|
+
|
88
|
+
# Rails.root/config/initializers/app_config.rb
|
89
|
+
AppConfig.setup({
|
90
|
+
:yaml => "#{Rails.root}/config/app_config.yml",
|
91
|
+
:env => Rails.env # or any string
|
92
|
+
})
|
93
|
+
|
94
|
+
# Uses the given environment section of the config.
|
95
|
+
AppConfig[:title]
|
96
|
+
# => 'Production Mode'
|
97
|
+
|
data/Rakefile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'bundler'
|
2
|
-
require '
|
2
|
+
require 'rdoc/task'
|
3
3
|
require 'rspec/core/rake_task'
|
4
4
|
|
5
5
|
Bundler::GemHelper.install_tasks
|
@@ -12,24 +12,22 @@ task :console do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
desc 'Run the specs'
|
15
|
-
RSpec::Core::RakeTask.new(:spec)
|
16
|
-
|
17
|
-
|
15
|
+
RSpec::Core::RakeTask.new(:spec)
|
16
|
+
|
17
|
+
task :doc => [ 'doc:clean', 'doc:api' ]
|
18
18
|
|
19
|
-
namespace :
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
namespace :doc do
|
20
|
+
require 'yard'
|
21
|
+
YARD::Rake::YardocTask.new(:api) do |t|
|
22
|
+
t.files = ['README.rdoc', 'lib/**/*.rb']
|
23
|
+
t.options = [
|
24
|
+
'--output-dir', 'doc/api',
|
25
|
+
'--markup', 'markdown'
|
26
|
+
]
|
26
27
|
end
|
27
|
-
end
|
28
28
|
|
29
|
-
desc '
|
30
|
-
task :
|
31
|
-
|
32
|
-
|
33
|
-
doc_root = "#{File.dirname(__FILE__)}/doc"
|
34
|
-
system("cp -r #{doc_root}/js #{doc_root}/api/")
|
29
|
+
desc 'Remove YARD Documentation'
|
30
|
+
task :clean do
|
31
|
+
system("rm -rf #{File.dirname(__FILE__)}/doc/api")
|
32
|
+
end
|
35
33
|
end
|
data/app_config.gemspec
CHANGED
@@ -12,15 +12,19 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.summary = %q{Quick and easy application configuration.}
|
13
13
|
s.description = %q{An easy to use, customizable library to easily store and retrieve application configuration.}
|
14
14
|
|
15
|
-
s.add_development_dependency
|
16
|
-
s.add_development_dependency
|
17
|
-
s.add_development_dependency
|
18
|
-
s.add_development_dependency
|
15
|
+
s.add_development_dependency 'bson_ext'
|
16
|
+
s.add_development_dependency 'maruku'
|
17
|
+
s.add_development_dependency 'mongo'
|
18
|
+
s.add_development_dependency 'rake'
|
19
|
+
s.add_development_dependency 'rspec', '~> 2.10.0'
|
20
|
+
s.add_development_dependency 'simplecov'
|
21
|
+
s.add_development_dependency 'yard'
|
19
22
|
|
20
23
|
s.has_rdoc = true
|
21
24
|
s.rdoc_options = ["--inline-source", "--charset=UTF-8"]
|
22
25
|
|
26
|
+
s.require_paths = ["lib"]
|
23
27
|
s.files = `git ls-files`.split("\n")
|
28
|
+
|
24
29
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
25
|
-
s.require_paths = ["lib"]
|
26
30
|
end
|
data/lib/app_config/base.rb
CHANGED
@@ -1,38 +1,32 @@
|
|
1
1
|
module AppConfig
|
2
2
|
|
3
|
-
require 'uri'
|
4
|
-
|
5
3
|
# The Base storage class.
|
6
4
|
# Acts as a wrapper for the different storage methods.
|
7
5
|
#
|
8
6
|
# See each storage method's documentation for their specific options.
|
9
7
|
#
|
10
8
|
# Valid storage methods:
|
11
|
-
# *
|
12
|
-
# *
|
13
|
-
# *
|
14
|
-
# * :yaml (AppConfig::Storage::YAML)
|
15
|
-
#
|
16
|
-
# TODO: Purge AppConfig options (ie, those not related to the user-end).
|
9
|
+
# * `:memory` - {AppConfig::Storage::Memory AppConfig::Storage::Memory}
|
10
|
+
# * `:mongo` - {AppConfig::Storage::Mongo AppConfig::Storage::Mongo}
|
11
|
+
# * `:yaml` - {AppConfig::Storage::YAML AppConfig::Storage::YAML}
|
17
12
|
class Base
|
18
13
|
|
19
|
-
#
|
20
|
-
DEFAULTS = {
|
21
|
-
:storage_method => :memory,
|
22
|
-
}
|
23
|
-
|
24
|
-
# Accepts either a hash of +options+ or a block (which overrides
|
25
|
-
# any options passed in the hash).
|
14
|
+
# Accepts either a hash of `options` or a block (which overrides any options passed in the hash).
|
26
15
|
def initialize(options = {}, &block)
|
27
|
-
@options =
|
28
|
-
yield @options if block_given?
|
16
|
+
@options = options
|
29
17
|
|
30
|
-
|
31
|
-
|
32
|
-
|
18
|
+
if @options[:yaml]
|
19
|
+
@storage = AppConfig::Storage::YAML.new(@options.delete(:yaml))
|
20
|
+
elsif @options[:mongo]
|
21
|
+
@storage = AppConfig::Storage::Mongo.new(@options.delete(:mongo))
|
22
|
+
else
|
23
|
+
@storage = AppConfig::Storage::Memory.new(@options)
|
24
|
+
end
|
25
|
+
|
26
|
+
yield @storage if block_given?
|
33
27
|
end
|
34
28
|
|
35
|
-
# Access the
|
29
|
+
# Access the `key`'s value in storage.
|
36
30
|
def [](key)
|
37
31
|
if storage.respond_to?(:[])
|
38
32
|
storage[key]
|
@@ -62,7 +56,7 @@ module AppConfig
|
|
62
56
|
end
|
63
57
|
alias_method :env, :environment
|
64
58
|
|
65
|
-
# Returns the
|
59
|
+
# Returns the `@storage` contents, which is what is exposed
|
66
60
|
# as the configuration.
|
67
61
|
def storage
|
68
62
|
environment ? @storage[environment] : @storage
|
@@ -72,36 +66,5 @@ module AppConfig
|
|
72
66
|
storage.to_hash
|
73
67
|
end
|
74
68
|
|
75
|
-
private
|
76
|
-
|
77
|
-
# Sets the storage_method depending on the URI given.
|
78
|
-
def determine_storage_method
|
79
|
-
uri = URI.parse(@options.delete(:uri))
|
80
|
-
case uri.scheme
|
81
|
-
when 'sqlite'
|
82
|
-
@options[:storage_method] = :sqlite
|
83
|
-
@options[:database] = uri.path
|
84
|
-
when 'yaml'
|
85
|
-
@options[:storage_method] = :yaml
|
86
|
-
@options[:path] = uri.path
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
# This decides how to load the data, based on the +storage_method+.
|
91
|
-
def initialize_storage_method
|
92
|
-
@storage_method = case @options[:storage_method]
|
93
|
-
when :memory
|
94
|
-
AppConfig::Storage::Memory.new(@options)
|
95
|
-
when :mongo
|
96
|
-
AppConfig::Storage::Mongo.new(@options)
|
97
|
-
when :sqlite
|
98
|
-
AppConfig::Storage::Sqlite.new(@options)
|
99
|
-
when :yaml
|
100
|
-
AppConfig::Storage::YAML.new(@options)
|
101
|
-
else
|
102
|
-
raise AppConfig::Error::UnknownStorageMethod
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
69
|
end # Base
|
107
70
|
end # AppConfig
|
@@ -4,16 +4,26 @@ module AppConfig
|
|
4
4
|
|
5
5
|
attr_reader :data
|
6
6
|
|
7
|
-
# DEPRECATED
|
8
|
-
def self.load(options)
|
9
|
-
STDERR.puts("DEPRECATED: AppConfig::Storage::Base.load() has been deprecated")
|
10
|
-
new(options).data
|
11
|
-
end
|
12
|
-
|
13
7
|
def initialize(options)
|
14
8
|
@options = options
|
15
9
|
end
|
16
10
|
|
11
|
+
def [](key)
|
12
|
+
@data[key]
|
13
|
+
end
|
14
|
+
|
15
|
+
def []=(key, value)
|
16
|
+
@data[key] = value
|
17
|
+
end
|
18
|
+
|
19
|
+
def empty?
|
20
|
+
@data.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_hash
|
24
|
+
@data.to_hash
|
25
|
+
end
|
26
|
+
|
17
27
|
end # BaseStorage
|
18
28
|
end # Storage
|
19
29
|
end # AppConfig
|
@@ -1,24 +1,18 @@
|
|
1
|
-
begin
|
2
|
-
require 'mongo'
|
3
|
-
rescue LoadError
|
4
|
-
require 'rubygems'
|
5
|
-
require 'mongo'
|
6
|
-
end
|
7
|
-
|
8
1
|
module AppConfig
|
9
2
|
module Storage
|
10
3
|
|
4
|
+
require 'mongo'
|
5
|
+
|
11
6
|
# Mongo storage method.
|
12
|
-
# FIXME: Come up with a way of removing stale config entries.
|
13
7
|
class Mongo < Storage::Base
|
14
8
|
|
15
9
|
DEFAULTS = {
|
16
|
-
:host
|
17
|
-
:port
|
18
|
-
:database
|
10
|
+
:host => 'localhost',
|
11
|
+
:port => '27017',
|
12
|
+
:database => 'app_config',
|
19
13
|
:collection => 'app_config',
|
20
|
-
:user
|
21
|
-
:password
|
14
|
+
:user => nil,
|
15
|
+
:password => nil
|
22
16
|
}
|
23
17
|
|
24
18
|
def initialize(options)
|
@@ -6,18 +6,13 @@ module AppConfig
|
|
6
6
|
# YAML storage method.
|
7
7
|
class YAML < Storage::Base
|
8
8
|
|
9
|
-
|
10
|
-
:path => File.expand_path(File.join(ENV['HOME'], '.app_config.yml'))
|
11
|
-
}
|
9
|
+
DEFAULT_PATH = File.expand_path(File.join(ENV['HOME'], '.app_config.yml'))
|
12
10
|
|
13
|
-
# Loads
|
14
|
-
#
|
11
|
+
# Loads `@data` with the YAML file located at `path`.
|
12
|
+
# `@data` will be the Hashish that is accessed with `AppConfig[:key]`.
|
15
13
|
#
|
16
|
-
# Defaults to
|
17
|
-
def initialize(
|
18
|
-
super(DEFAULTS.merge(options))
|
19
|
-
path = @options[:path] || DEFAULTS[:path]
|
20
|
-
|
14
|
+
# Defaults to `$HOME/.app_config.yml`
|
15
|
+
def initialize(path = DEFAULT_PATH)
|
21
16
|
# Make sure to use the top-level YAML module here.
|
22
17
|
@data = Hashish.new(::YAML.load_file(path))
|
23
18
|
end
|
data/lib/app_config/storage.rb
CHANGED
data/lib/app_config.rb
CHANGED
@@ -1,47 +1,49 @@
|
|
1
|
-
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
|
-
|
3
|
-
# AppConfig stuff.
|
4
1
|
require 'core_ext/hashish'
|
5
2
|
|
6
3
|
module AppConfig
|
7
|
-
VERSION = '0.
|
4
|
+
VERSION = '1.0.0'
|
8
5
|
|
9
|
-
autoload :Base,
|
10
|
-
autoload :Error,
|
6
|
+
autoload :Base, 'app_config/base'
|
7
|
+
autoload :Error, 'app_config/error'
|
11
8
|
autoload :Storage, 'app_config/storage'
|
12
9
|
|
13
10
|
class << self
|
14
11
|
|
15
|
-
# Accepts an
|
16
|
-
# See AppConfig::Base for valid storage methods.
|
17
|
-
# TODO: This should probably return true/false.
|
12
|
+
# Accepts an `options` hash or a block.
|
13
|
+
# See {AppConfig::Base AppConfig::Base} for valid storage methods.
|
18
14
|
def setup(options = {}, &block)
|
19
15
|
@@storage = AppConfig::Base.new(options, &block)
|
20
16
|
end
|
21
17
|
|
22
|
-
# Returns
|
18
|
+
# Returns `true` if {AppConfig.setup AppConfig.setup} has been called.
|
23
19
|
def setup?
|
24
|
-
defined?(@@storage) && !@@storage.empty?
|
20
|
+
!!(defined?(@@storage) && !@@storage.empty?)
|
25
21
|
end
|
26
22
|
|
27
|
-
# Clears the
|
23
|
+
# Clears the `@@storage`.
|
28
24
|
def reset!
|
29
|
-
@@storage
|
25
|
+
if defined?(@@storage)
|
26
|
+
remove_class_variable(:@@storage)
|
27
|
+
true
|
28
|
+
else
|
29
|
+
false
|
30
|
+
end
|
30
31
|
end
|
31
32
|
|
32
|
-
# Access the configured
|
33
|
+
# Access the configured `key`'s value.
|
33
34
|
def [](key)
|
34
35
|
setup unless setup?
|
35
36
|
@@storage[key]
|
36
37
|
end
|
37
38
|
|
38
|
-
# Set a new
|
39
|
+
# Set a new `value` for `key` (persistence depends on the type of Storage).
|
39
40
|
def []=(key, value)
|
41
|
+
setup unless setup?
|
40
42
|
@@storage[key] = value
|
41
43
|
end
|
42
44
|
|
43
45
|
def to_hash
|
44
|
-
@@storage.to_hash
|
46
|
+
setup? ? @@storage.to_hash : Hashish.new
|
45
47
|
end
|
46
48
|
|
47
49
|
end # self
|
data/lib/core_ext/hashish.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Stolen from Rails Active Support and renamed to Hashish.
|
2
2
|
#
|
3
3
|
# This class has dubious semantics and we only have it so that
|
4
|
-
# people can write params[:key] instead of params['key']
|
4
|
+
# people can write `params[:key]` instead of `params['key']`
|
5
5
|
# and they get the same value for both keys.
|
6
6
|
class Hashish < Hash
|
7
7
|
def initialize(constructor = {})
|
@@ -26,23 +26,21 @@ class Hashish < Hash
|
|
26
26
|
|
27
27
|
# Assigns a new value to the hash:
|
28
28
|
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
29
|
+
# hash = HashWithIndifferentAccess.new
|
30
|
+
# hash[:key] = "value"
|
32
31
|
def []=(key, value)
|
33
32
|
regular_writer(convert_key(key), convert_value(value))
|
34
33
|
end
|
35
34
|
|
36
35
|
# Updates the instantized hash with values from the second:
|
37
36
|
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
# hash_2 = HashWithIndifferentAccess.new
|
42
|
-
# hash_2[:key] = "New Value!"
|
37
|
+
# hash_1 = HashWithIndifferentAccess.new
|
38
|
+
# hash_1[:key] = "value"
|
43
39
|
#
|
44
|
-
#
|
40
|
+
# hash_2 = HashWithIndifferentAccess.new
|
41
|
+
# hash_2[:key] = "New Value!"
|
45
42
|
#
|
43
|
+
# hash_1.update(hash_2) # => {"key"=>"New Value!"}
|
46
44
|
def update(other_hash)
|
47
45
|
other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) }
|
48
46
|
self
|
@@ -52,11 +50,10 @@ class Hashish < Hash
|
|
52
50
|
|
53
51
|
# Checks the hash for a key matching the argument passed in:
|
54
52
|
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
53
|
+
# hash = HashWithIndifferentAccess.new
|
54
|
+
# hash["key"] = "value"
|
55
|
+
# hash.key? :key # => true
|
56
|
+
# hash.key? "key" # => true
|
60
57
|
def key?(key)
|
61
58
|
super(convert_key(key))
|
62
59
|
end
|
@@ -65,18 +62,17 @@ class Hashish < Hash
|
|
65
62
|
alias_method :has_key?, :key?
|
66
63
|
alias_method :member?, :key?
|
67
64
|
|
68
|
-
# Fetches the value for the specified key, same as doing hash[key]
|
65
|
+
# Fetches the value for the specified key, same as doing `hash[key]`.
|
69
66
|
def fetch(key, *extras)
|
70
67
|
super(convert_key(key), *extras)
|
71
68
|
end
|
72
69
|
|
73
70
|
# Returns an array of the values at the specified indices:
|
74
71
|
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
72
|
+
# hash = HashWithIndifferentAccess.new
|
73
|
+
# hash[:a] = "x"
|
74
|
+
# hash[:b] = "y"
|
75
|
+
# hash.values_at("a", "b") # => ["x", "y"]
|
80
76
|
def values_at(*indices)
|
81
77
|
indices.collect {|key| self[convert_key(key)]}
|
82
78
|
end
|
@@ -1,10 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
+
# TODO: Drop the Mongo test db before running specs.
|
3
4
|
describe AppConfig::Storage::Mongo do
|
4
5
|
|
5
|
-
before(:
|
6
|
+
before(:all) do
|
6
7
|
AppConfig.reset!
|
7
|
-
config_for_mongo
|
8
|
+
config_for_mongo
|
8
9
|
end
|
9
10
|
|
10
11
|
it 'should have some values' do
|
@@ -12,7 +13,14 @@ describe AppConfig::Storage::Mongo do
|
|
12
13
|
end
|
13
14
|
|
14
15
|
it 'should update the values' do
|
16
|
+
pending 'Needs a little work...'
|
17
|
+
AppConfig.class_variable_get(:@@storage).
|
18
|
+
instance_variable_get(:@storage).should_receive(:save!)
|
15
19
|
AppConfig[:api_key] = 'SOME_NEW_API_KEY'
|
20
|
+
|
21
|
+
# now reload the config options and check the value
|
22
|
+
AppConfig.reset!
|
23
|
+
config_for_mongo({}, false) # use default options and do not load test data
|
16
24
|
AppConfig[:api_key].should == 'SOME_NEW_API_KEY'
|
17
25
|
end
|
18
26
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe AppConfig::Storage::YAML do
|
4
4
|
|
@@ -9,15 +9,10 @@ describe AppConfig::Storage::YAML do
|
|
9
9
|
|
10
10
|
it 'should raise file not found' do
|
11
11
|
lambda do
|
12
|
-
config_for_yaml(:
|
12
|
+
config_for_yaml(:yaml => 'not/a/real/file.yml')
|
13
13
|
end.should raise_error(Errno::ENOENT)
|
14
14
|
end
|
15
15
|
|
16
|
-
it 'parses the URI properly' do
|
17
|
-
AppConfig.setup(:uri => "yaml://#{fixture('app_config.yml')}")
|
18
|
-
AppConfig[:api_key].should_not be_nil
|
19
|
-
end
|
20
|
-
|
21
16
|
it 'saves the new value in memory' do
|
22
17
|
config_for_yaml
|
23
18
|
AppConfig[:new_key] = 'new value'
|
data/spec/app_config_spec.rb
CHANGED
@@ -32,15 +32,13 @@ describe AppConfig do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'to_hash() returns an empty hash if storage not set' do
|
35
|
-
# # First, reset the storage variable.
|
36
|
-
# AppConfig.send(:class_variable_set, :@@storage, nil)
|
37
35
|
AppConfig.reset!
|
38
36
|
AppConfig.to_hash.should == {}
|
39
37
|
end
|
40
38
|
|
41
39
|
describe 'environment mode' do
|
42
40
|
it 'should load the proper environment' do
|
43
|
-
config_for_yaml(:
|
41
|
+
config_for_yaml(:yaml => fixture('env_app_config.yml'),
|
44
42
|
:env => 'development')
|
45
43
|
AppConfig[:api_key].should_not be_nil
|
46
44
|
end
|