kb-config 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/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # Usage
2
+
3
+ #### Open command prompt
4
+
5
+ $> gem install kb-config
6
+ $> irb
7
+
8
+ #### From irb
9
+
10
+ $> require 'config'
11
+ $> CONFIG = Config::Base.load_config(<path to settings file>, <array of overrides>)
12
+
13
+ ##### Example calls and expected results
14
+
15
+ $> CONFIG.common.paid_users_size_limit
16
+ # returns 2147483648
17
+
18
+ $> CONFIG.ftp.name
19
+ # returns “hello there, ftp uploading”
20
+
21
+ $> CONFIG.http.params
22
+ # returns [“array”, “of”, “values”]
23
+
24
+ $> CONFIG.ftp.lastname
25
+ # returns nil
26
+
27
+ $> CONFIG.ftp.enabled
28
+ # returns false
29
+
30
+ $> CONFIG.ftp[:path]
31
+ # returns “/etc/var/uploads”
32
+
33
+ $> CONFIG.ftp
34
+ # returns {:name => “http uploading”, :path => “/etc/var/uploads”, :enabled => false}
data/config.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ require 'config/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'kb-config'
9
+ s.platform = Gem::Platform::RUBY
10
+ s.version = Config::VERSION
11
+ s.authors = ['Kyle Bolton']
12
+ s.email = ['kyle.bolton@gmail.com']
13
+ s.homepage = 'http://github.com/kb/config'
14
+ s.description = "Configure things. Like a boss."
15
+ s.summary = 'Library to hold configuration items for your application'
16
+ s.date = Date.today.to_s
17
+
18
+ s.rubygems_version = '>= 1.3.7'
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.require_paths = ['lib']
23
+ end
@@ -0,0 +1,25 @@
1
+ module Config
2
+ class Base
3
+ def self.load_config(file_path, overrides=[])
4
+ this = self.new(file_path, overrides)
5
+ this.add_getters
6
+ this
7
+ end
8
+
9
+ def initialize(file_path, overrides)
10
+ @config_hash = Config::Parser.settings(file_path, overrides)
11
+ end
12
+
13
+ def add_getters
14
+ @config_hash.keys.each do |key|
15
+ self.class.instance_eval do
16
+ define_method(key, lambda { @config_hash[key] })
17
+ end
18
+ end
19
+ end
20
+
21
+ def method_missing(meth, *args)
22
+ nil
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ class Hash
2
+ def method_missing(method, *args)
3
+ self[method.to_s] || self[method] || nil
4
+ end
5
+
6
+ def respond_to?(sym)
7
+ if self[sym.to_s] || self[sym]
8
+ true
9
+ else
10
+ super(sym)
11
+ end
12
+ end
13
+
14
+ def symbolize_keys!
15
+ keys.each do |key|
16
+ self[(key.to_sym rescue key) || key] = delete(key)
17
+ end
18
+ self
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ # This has some drawbacks, but its quick and easy to get nil returned
2
+ class NilClass
3
+ def method_missing *_
4
+ nil
5
+ end
6
+ end
@@ -0,0 +1,39 @@
1
+ module Config
2
+ module Parser
3
+ class << self
4
+ def settings(file_path, overrides)
5
+ config_hash = { }
6
+ overrides = overrides.map { |o| o.to_sym }
7
+ begin
8
+ File.open(file_path).each do |line|
9
+ group = line.match(/^\[(\S+)\]/)
10
+ kv = line.match(/(\w+)\s*=\s*["|']*([^"'\r\n]*)["|']*/)
11
+ override = line.match(/(\w+)<(\w+)>\s*=\s*["|']*([^"'\r\n]*)["|']*/)
12
+
13
+ # TODO: Should do a check for nils on matches and throw exception = malformed
14
+ if !group.nil?
15
+ config_hash[group[1]] = {}
16
+ elsif !kv.nil?
17
+ config_hash[config_hash.keys.last][kv[1]] = convert(kv[2])
18
+ elsif !override.nil?
19
+ if overrides.include? override[2].to_sym
20
+ config_hash[config_hash.keys.last][override[1].to_sym] = convert(override[3])
21
+ end
22
+ end
23
+ config_hash[config_hash.keys.last].symbolize_keys!
24
+ end
25
+ config_hash.symbolize_keys!
26
+ rescue Exception => e
27
+ puts "Caught exception: #{e}, unable to load configuration file"
28
+ end
29
+ end
30
+
31
+ def convert(value)
32
+ return value.split(",") unless value.match(/(,[^\s])/).nil?
33
+ return true unless value.match(/^yes$|^true$|^1{1}[^\w]/).nil?
34
+ return false unless value.match(/^no$|^false$|^0{1}[^\w]/).nil?
35
+ return value
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ module Config
2
+ VERSION = '1.0.0'
3
+ end
data/lib/config.rb ADDED
@@ -0,0 +1,5 @@
1
+ require File.join(File.dirname(__FILE__), 'config', 'base')
2
+ require File.join(File.dirname(__FILE__), 'config', 'parser')
3
+ require File.join(File.dirname(__FILE__), 'config', 'hash_extension')
4
+ require File.join(File.dirname(__FILE__), 'config', 'nil_extension')
5
+ require File.join(File.dirname(__FILE__), 'config', 'version')
data/settings.conf ADDED
@@ -0,0 +1,21 @@
1
+ [common]
2
+ basic_size_limit = 26214400
3
+ student_size_limit = 52428800
4
+ paid_users_size_limit = 2147483648
5
+ path = /srv/var/tmp/
6
+ path<itscript> = /srv/tmp/
7
+
8
+ [ftp]
9
+ name = "hello there, ftp uploading"
10
+ path<production> = /srv/var/tmp/
11
+ path<staging> = /srv/uploads/
12
+ path<ubuntu> = /etc/var/uploads
13
+ enabled = no
14
+
15
+ ;This is a comment
16
+ [http]
17
+ name = "http uploading"
18
+ path = /tmp/
19
+ path<production> = /srv/var/tmp/
20
+ path<staging> = /srv/uploads/; This is another comment
21
+ params = array,of,value
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kb-config
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.0.0
6
+ platform: ruby
7
+ authors:
8
+ - Kyle Bolton
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-09-16 00:00:00 -04:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: Configure things. Like a boss.
18
+ email:
19
+ - kyle.bolton@gmail.com
20
+ executables: []
21
+
22
+ extensions: []
23
+
24
+ extra_rdoc_files: []
25
+
26
+ files:
27
+ - README.md
28
+ - config.gemspec
29
+ - lib/config.rb
30
+ - lib/config/base.rb
31
+ - lib/config/hash_extension.rb
32
+ - lib/config/nil_extension.rb
33
+ - lib/config/parser.rb
34
+ - lib/config/version.rb
35
+ - settings.conf
36
+ has_rdoc: true
37
+ homepage: http://github.com/kb/config
38
+ licenses: []
39
+
40
+ post_install_message:
41
+ rdoc_options: []
42
+
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ requirements: []
58
+
59
+ rubyforge_project:
60
+ rubygems_version: 1.6.2
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: Library to hold configuration items for your application
64
+ test_files: []
65
+