konfig 0.2.0 → 0.3.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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{konfig}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Starr Horne"]
12
- s.date = %q{2010-05-28}
12
+ s.date = %q{2010-06-01}
13
13
  s.description = %q{ Automatically loads yaml config files and makes them available to your rails app.}
14
14
  s.email = %q{starr@chromahq.com}
15
15
  s.extra_rdoc_files = [
@@ -24,8 +24,12 @@ Gem::Specification.new do |s|
24
24
  "Rakefile",
25
25
  "VERSION",
26
26
  "konfig.gemspec",
27
+ "lib/generators/konfig/USAGE",
28
+ "lib/generators/konfig/konfig_generator.rb",
29
+ "lib/generators/konfig/templates/konfig.tt",
27
30
  "lib/konfig.rb",
28
31
  "lib/konfig/adapter.rb",
32
+ "lib/konfig/child_class_manager.rb",
29
33
  "lib/konfig/evaluator.rb",
30
34
  "lib/konfig/helpers.rb",
31
35
  "lib/konfig/rails/adapters/asset_expansion_adapter.rb",
@@ -34,6 +38,7 @@ Gem::Specification.new do |s|
34
38
  "lib/konfig/store.rb",
35
39
  "test/fixtures/dynamic.yml",
36
40
  "test/fixtures/static.yml",
41
+ "test/fixtures/template.yml",
37
42
  "test/helper.rb",
38
43
  "test/test_adapter.rb",
39
44
  "test/test_evaluator.rb",
@@ -0,0 +1,21 @@
1
+ How to Use Konfig Generator
2
+ ===========================
3
+
4
+ This generator can be used to create Konfig files for a number
5
+ of plugins, as well as internal rails settings like SMTP, Javascript
6
+ Expansions, etc...
7
+
8
+ Usage
9
+ -----
10
+
11
+ To generate a konfig template:
12
+
13
+ rails generate konfig [template_name]
14
+
15
+ Example
16
+ -------
17
+
18
+ Here's how you would add some smtp settings
19
+
20
+ rails generate konfig smtp
21
+
@@ -0,0 +1,31 @@
1
+ require 'rails/generators'
2
+
3
+ class KonfigGenerator < Rails::Generators::Base
4
+
5
+ desc "Generates Konfig files"
6
+ argument :name, :type => :string, :required => false, :desc => "Name of konfig template"
7
+
8
+ def generate
9
+ self.name ? render_template : show_instructions
10
+ end
11
+
12
+ def self.source_root
13
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
14
+ end
15
+
16
+ private
17
+
18
+ def show_instructions
19
+ print File.read(File.join(File.dirname(__FILE__), 'USAGE'))
20
+ end
21
+
22
+ def render_template
23
+ if Konfig::Adapter.template_for(self.name).present?
24
+ template('konfig.tt', File.join(Konfig.path, "#{ self.name }.yml"))
25
+ else
26
+ print("Invalid Template Name: #{ self.name }\n")
27
+ end
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,2 @@
1
+ # <%= self.name %>.yml
2
+ <%= Konfig::Adapter.template_for(self.name) %>
@@ -1,3 +1,4 @@
1
+ require 'konfig/child_class_manager'
1
2
  require 'konfig/evaluator'
2
3
  require 'konfig/store'
3
4
  require 'konfig/adapter'
@@ -1,39 +1,76 @@
1
-
2
1
  module Konfig
3
2
 
3
+
4
4
  # All adapters are subclassed from Konfig::Adapter
5
5
  class Adapter
6
6
 
7
+ include ChildClassManager
8
+
9
+ attr_reader :data
10
+
11
+ def initialize(data)
12
+ @data = data
13
+ end
14
+
7
15
  class << self
8
16
 
9
- def inherited(child_class)
10
- children << child_class
17
+ def has_template(key, options = {})
18
+ if block_given?
19
+ content = yield
20
+ else
21
+ content = options[:file] && File.read(options[:file])
22
+ unless content
23
+ content = options[:content]
24
+ content = adjust_whitespace(content) unless options[:preserve_indentation]
25
+ end
26
+ end
27
+
28
+ Adapter.templates[key] = content
29
+ end
30
+
31
+ def template_for(key)
32
+ Adapter.templates[key]
11
33
  end
12
34
 
13
- # Get all child classes
14
- # @return [Array] an array of child classes
15
- def children
16
- @children ||= []
35
+ def templates
36
+ @templates ||= HashWithIndifferentAccess.new
17
37
  end
18
38
 
19
- # Remove child classes from registry
20
- def clear_children
21
- @children = []
39
+ def adjust_whitespace(content)
40
+ content.gsub!(/\t/, " ")
41
+ adjustment = content.lines.map { |l| l =~ /^( *)\S+$/; $1 && $1.size }.compact.min
42
+ content.lines.map { |l| l =~ /^[ ]{#{ adjustment }}(.*)$/; $1.to_s }.join("\n")
22
43
  end
23
44
 
24
- # Evokes the send method on all child classes,
25
- # and passes the args along
26
- def send_to_children(*args)
27
- children.each { |c| c.send(*args) }
45
+ end
46
+
47
+ protected
48
+
49
+
50
+ def ok(key)
51
+ data[key][:_status] = :ok
52
+ log("Loaded #{key}")
28
53
  end
29
54
 
30
- # Instanciates all child classes and envokes
31
- # a method via obj.send
32
- def create_and_send_to_children(*args)
33
- children.each { |c| c.new.send(*args) }
55
+ def error(key)
56
+ data[key][:_status] = :error
57
+ log("Error Loading #{key}")
34
58
  end
35
59
 
60
+ def log(message)
61
+ m = "[Konfig] #{ message }"
62
+ defined?(Rails) ? Rails.logger.info(m) : puts(m)
63
+ m
64
+ end
36
65
 
37
- end
66
+ def using(key, options={})
67
+ if !data[key]
68
+ raise(log("Required Konfig key #{key} is missing")) if options[:required]
69
+ return
70
+ end
71
+
72
+ yield(data[key])
73
+ ok(key) unless data[key][:_status]
74
+ end
38
75
  end
39
76
  end
@@ -0,0 +1,51 @@
1
+ module Konfig
2
+
3
+ # Provides tools for keeping track of a Class's descendents
4
+
5
+ module ChildClassManager
6
+
7
+ def self.included(base)
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+
13
+ # Should not be called directly.
14
+ def inherited(child_class)
15
+ child_classes << child_class
16
+ end
17
+
18
+ # Get all child classes
19
+ # @return [Array] an array of child classes
20
+ def child_classes
21
+ @child_classes ||= []
22
+ end
23
+
24
+ # Remove child classes from registry
25
+ def clear_child_classes
26
+ @child_classes = []
27
+ end
28
+
29
+ # Instanciates all child classes
30
+ # @return [Array] Instances of all child classes
31
+ def create_child_instances(*params)
32
+ @child_instances = child_classes.map { |c| c.new(*params) }
33
+ end
34
+
35
+ # Invoke 'send' on all child instances
36
+ # @param params Parameters for 'send'
37
+ def send_to_child_instances(*params)
38
+ @child_instances.each { |c| c.send(*params) }
39
+ end
40
+
41
+ # Instanciates all child classes
42
+ # @return [Array] Instances of all child classes
43
+ def child_instances
44
+ @child_instances || []
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -1,22 +1,15 @@
1
1
  module Konfig
2
2
  class AssetExpansionAdapter < Adapter
3
- def adapt(data)
4
- javascripts(data)
5
- stylesheets(data)
6
- end
7
3
 
8
- def javascripts(data)
9
- return unless (d = data[:_javascript_expansions])
10
- ActionView::Helpers::AssetTagHelper.register_javascript_expansion(d)
11
- c = d[:_adapted] = true
12
- Rails.logger.info "[Konfig] Loaded javascript expansions"
13
- end
4
+ def adapt
5
+ using(:_javascript_expansions) do |data|
6
+ ActionView::Helpers::AssetTagHelper.register_javascript_expansion(data)
7
+ end
14
8
 
15
- def stylesheets(data)
16
- return unless (d = data[:_stylesheet_expansions])
17
- ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion(d)
18
- c = d[:_adapted] = true
19
- Rails.logger.info "[Konfig] Loaded stylesheet expansions"
9
+ using(:_stylesheet_expansions) do |data|
10
+ ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion(data)
11
+ end
20
12
  end
13
+
21
14
  end
22
15
  end
@@ -1,14 +1,42 @@
1
1
  module Konfig
2
2
  class SmtpAdapter < Adapter
3
- def adapt(data)
4
- begin
5
- c = data[:_smtp][Rails.env]
6
- ActionMailer::Base.smtp_settings = c.symbolize_keys
7
-
8
- c = data[:_smtp][:_adapted] = true
9
- Rails.logger.info "[Konfig] Loaded SMTP setting"
10
- rescue
3
+
4
+ def adapt
5
+ using(:_smtp) do |data|
6
+ ActionMailer::Base.smtp_settings = data[Rails.env]
11
7
  end
12
8
  end
9
+
10
+ # TODO: Implement something like this
11
+ # configures :smtp do |data|
12
+ # ActionMailer::Base.smtp_settings = data[Rails.env]
13
+ # end
14
+
15
+ has_template :smtp, :content => %[
16
+
17
+ # SMTP Configuration
18
+ # For more information: http://guides.rails.info/action_mailer_basics.html
19
+
20
+ development:
21
+ enable_starttls_auto: true
22
+ address: smtp.gmail.com
23
+ port: 587
24
+ domain: example.com
25
+ authentication: :login
26
+ user_name: example@example.com
27
+ password: password
28
+
29
+ production:
30
+ enable_starttls_auto: true
31
+ address: smtp.gmail.com
32
+ port: 587
33
+ domain: example.com
34
+ authentication: :login
35
+ user_name: example@example.com
36
+ password: password
37
+
38
+ test:
39
+ ]
40
+
13
41
  end
14
42
  end
@@ -38,7 +38,8 @@ module Konfig
38
38
  require_all user_adapters
39
39
 
40
40
  # Apply the adapters to the data
41
- Adapter.create_and_send_to_children :adapt, Konfig.default_store.data
41
+ Adapter.create_child_instances(Konfig.default_store.data)
42
+ Adapter.send_to_child_instances :adapt
42
43
  end
43
44
 
44
45
  def require_all(path)
@@ -0,0 +1,5 @@
1
+ - this
2
+ - is
3
+ - a
4
+ - sample
5
+ - template
@@ -2,10 +2,10 @@ require 'helper'
2
2
 
3
3
  class TestEvaluator < Test::Unit::TestCase
4
4
 
5
- Konfig::Adapter.clear_children
6
-
7
5
  context "Adapter with two subclasses" do
8
6
 
7
+ Konfig::Adapter.clear_child_classes
8
+
9
9
  setup do
10
10
 
11
11
  class FirstAdapter < Konfig::Adapter
@@ -32,29 +32,81 @@ class TestEvaluator < Test::Unit::TestCase
32
32
  end
33
33
 
34
34
  should "have two registered subclasses" do
35
- assert_equal 2, Konfig::Adapter.children.size
35
+ assert_equal 2, Konfig::Adapter.child_classes.size
36
36
  end
37
37
 
38
38
  should "have the correct subclasses in registry" do
39
- assert_equal FirstAdapter, Konfig::Adapter.children[0]
40
- assert_equal SecondAdapter, Konfig::Adapter.children[1]
39
+ assert_equal FirstAdapter, Konfig::Adapter.child_classes[0]
40
+ assert_equal SecondAdapter, Konfig::Adapter.child_classes[1]
41
41
  end
42
42
 
43
43
  should "not have bleed over to child classes" do
44
- assert_equal 0, FirstAdapter.children.size
45
- assert_equal 0, SecondAdapter.children.size
44
+ assert_equal 0, FirstAdapter.child_classes.size
45
+ assert_equal 0, SecondAdapter.child_classes.size
46
+ end
47
+
48
+ context "and create_childeren called" do
49
+ setup do
50
+ @data = { :a => 1, :b => 2 }
51
+ @child_instances = Konfig::Adapter.create_child_instances(@data)
52
+ end
53
+
54
+ should "create 2 instances" do
55
+ assert_equal 2, @child_instances.size
56
+ end
57
+
58
+ should "make instances available through accessor" do
59
+ assert_equal @child_instances, Konfig::Adapter.child_instances
60
+ end
61
+
62
+ should "create the correct instances" do
63
+ assert @child_instances[0].is_a?(FirstAdapter)
64
+ assert @child_instances[1].is_a?(SecondAdapter)
65
+ end
66
+
67
+ should "assign the correct data to child instances" do
68
+ assert_equal @data, @child_instances[0].data
69
+ assert_equal @data, @child_instances[1].data
70
+ end
71
+
72
+ should "be able to send method calls to chld instances" do
73
+ r = []
74
+ Konfig::Adapter.send_to_child_instances(:instance_append, r)
75
+ assert_equal [9, 8], r
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+
82
+ context "User adapter with 3 templates" do
83
+
84
+ setup do
85
+
86
+ class TemplateAdapter < Konfig::Adapter
87
+ has_template :inline, :content => "inline"
88
+ has_template :file, :file => "./test/fixtures/template.yml"
89
+ has_template :block do
90
+ "block"
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ should "register 3 templates" do
97
+ assert_equal 3, Konfig::Adapter.templates.size
98
+ end
99
+
100
+ should "return correct value for inline template" do
101
+ assert_equal "inline", Konfig::Adapter.templates[:inline]
46
102
  end
47
103
 
48
- should "be able to send method calls to children" do
49
- values = []
50
- Konfig::Adapter.send_to_children(:append, values)
51
- assert_equal [2, 4], values
104
+ should "return correct value for file template" do
105
+ assert_equal File.read("./test/fixtures/template.yml"), Konfig::Adapter.templates[:file]
52
106
  end
53
107
 
54
- should "be able to instanciate all children, and send" do
55
- values = []
56
- Konfig::Adapter.create_and_send_to_children(:instance_append, values)
57
- assert_equal [9, 8], values
108
+ should "return correct value for block template" do
109
+ assert_equal "block", Konfig::Adapter.templates[:block]
58
110
  end
59
111
 
60
112
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
7
+ - 3
8
8
  - 0
9
- version: 0.2.0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Starr Horne
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-28 00:00:00 -05:00
17
+ date: 2010-06-01 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -46,8 +46,12 @@ files:
46
46
  - Rakefile
47
47
  - VERSION
48
48
  - konfig.gemspec
49
+ - lib/generators/konfig/USAGE
50
+ - lib/generators/konfig/konfig_generator.rb
51
+ - lib/generators/konfig/templates/konfig.tt
49
52
  - lib/konfig.rb
50
53
  - lib/konfig/adapter.rb
54
+ - lib/konfig/child_class_manager.rb
51
55
  - lib/konfig/evaluator.rb
52
56
  - lib/konfig/helpers.rb
53
57
  - lib/konfig/rails/adapters/asset_expansion_adapter.rb
@@ -56,6 +60,7 @@ files:
56
60
  - lib/konfig/store.rb
57
61
  - test/fixtures/dynamic.yml
58
62
  - test/fixtures/static.yml
63
+ - test/fixtures/template.yml
59
64
  - test/helper.rb
60
65
  - test/test_adapter.rb
61
66
  - test/test_evaluator.rb