app-config 0.1.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.
@@ -0,0 +1,4 @@
1
+ require 'app-config/version'
2
+ require 'app-config/errors'
3
+ require 'app-config/processor'
4
+ require 'app-config/app-config'
@@ -0,0 +1,84 @@
1
+ module AppConfig
2
+ extend AppConfig::Processor
3
+
4
+ FORMATS = ['string', 'array', 'hash', 'boolean']
5
+ @@options = {}
6
+ @@records = {}
7
+
8
+ # Configure app config
9
+ def self.configure(opts={})
10
+ @@options[:model] = opts[:model] || Setting
11
+ @@options[:key] = opts[:key] || 'keyname'
12
+ @@options[:value] = opts[:value] || 'value'
13
+ @@options[:format] = opts[:format] || 'value_format'
14
+ end
15
+
16
+ # Load and process application settings
17
+ def self.load
18
+ @@records = fetch
19
+ end
20
+
21
+ # Delete all settings
22
+ def self.flush
23
+ @@records.clear
24
+ end
25
+
26
+ # Safe method to reload new settings
27
+ def self.reload
28
+ records = fetch rescue nil
29
+ @@records = records || {}
30
+ end
31
+
32
+ # Manually set (or add) a key
33
+ def self.set_key(keyname, value, format='string')
34
+ raise InvalidKeyName, "Invalid key name: #{keyname}" if self.respond_to?(keyname)
35
+ @@records[keyname] = process(value, format)
36
+ end
37
+
38
+ # Returns all configuration keys
39
+ def self.keys
40
+ @@records.keys
41
+ end
42
+
43
+ # Returns true if there are no settings available
44
+ def self.empty?
45
+ @@records.empty?
46
+ end
47
+
48
+ # Get configuration option
49
+ def self.[](key)
50
+ @@records[key.to_s]
51
+ end
52
+
53
+ # Get configuration option by attribute
54
+ def self.method_missing(method, *args)
55
+ @@records[method.to_s]
56
+ end
57
+
58
+ # Returns true if configuration key exists
59
+ def self.exist?(key)
60
+ @@records.key?(key)
61
+ end
62
+
63
+ protected
64
+
65
+ # Fetch data from model
66
+ def self.fetch
67
+ raise InvalidSource, 'Model is not defined!' if @@options[:model].nil?
68
+ raise InvalidSource, 'Model was not found!' unless @@options[:model].superclass == ActiveRecord::Base
69
+
70
+ records = {}
71
+
72
+ begin
73
+ @@options[:model].send(:all).map do |c|
74
+ records[c.send(@@options[:key].to_sym)] = process(
75
+ c.send(@@options[:value].to_sym),
76
+ c.send(@@options[:format].to_sym)
77
+ )
78
+ end
79
+ records
80
+ rescue ActiveRecord::StatementInvalid => ex
81
+ raise InvalidSource, ex.message
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,6 @@
1
+ module AppConfig
2
+ class InvalidType < Exception ; end
3
+ class InvalidKeyName < Exception ; end
4
+ class InvalidSource < Exception ; end
5
+ class UndefinedKey < Exception ; end
6
+ end
@@ -0,0 +1,38 @@
1
+ module AppConfig
2
+ module Processor
3
+ # Process string value
4
+ def process_string(value)
5
+ value.strip
6
+ end
7
+
8
+ # Process array of strings
9
+ def process_array(value)
10
+ value.split("\n").map { |s| s.to_s.strip }.compact.select { |s| !s.empty? }
11
+ end
12
+
13
+ # Parse boolean string
14
+ def process_boolean(value)
15
+ ['true', 'on', 'yes', 'y', '1'].include?(value.to_s.downcase)
16
+ end
17
+
18
+ # Parse hash string
19
+ # value should be in the following format:
20
+ # "keyname: value, key2: value2"
21
+ def process_hash(value)
22
+ result = {}
23
+ unless value.empty?
24
+ value.split(",").each do |s|
25
+ k,v = s.split(':').compact.map { |i| i.to_s.strip }
26
+ result[k] = v.to_s
27
+ end
28
+ end
29
+ result
30
+ end
31
+
32
+ # Process data value for the format
33
+ def process(data, type)
34
+ raise InvalidType, 'Type is invalid!' unless FORMATS.include?(type)
35
+ send("process_#{type}".to_sym, data.to_s)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module AppConfig
2
+ VERSION = '0.1.0'.freeze
3
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: app-config
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Dan Sosedoff
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-02-11 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: activerecord
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 3
32
+ - 0
33
+ - 0
34
+ version: 3.0.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ description: Flexible and simple configuration settings for your Rails/Sinatra applications
38
+ email: dan.sosedoff@gmail.com
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files: []
44
+
45
+ files:
46
+ - lib/app-config.rb
47
+ - lib/app-config/version.rb
48
+ - lib/app-config/errors.rb
49
+ - lib/app-config/processor.rb
50
+ - lib/app-config/app-config.rb
51
+ has_rdoc: true
52
+ homepage: http://github.com/sosedoff/app-config
53
+ licenses:
54
+ - MIT
55
+ post_install_message:
56
+ rdoc_options: []
57
+
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 3
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ requirements: []
79
+
80
+ rubyforge_project:
81
+ rubygems_version: 1.4.1
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: Configurable application settings
85
+ test_files: []
86
+