merb-plugins-app-config 0.3

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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 YOUR NAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,83 @@
1
+ == Summary
2
+ Application level configuration.
3
+
4
+ == Original Author
5
+ Christopher J. Bottaro
6
+
7
+ == Merb Port
8
+ Jacques Crocker
9
+
10
+ === Accessing the AppConfig object
11
+ After installing this plugin, the AppConfig object will be global available. Entries are accessed via object member notation:
12
+ AppConfig.my_config_entry
13
+ Nested entries are supported:
14
+ AppConfig.my_section.some_entr
15
+
16
+ === Common config file
17
+ Config entries defined in
18
+ Merb.root/config/app_config/settings.yml
19
+ will be available to all environments.
20
+
21
+ === Environment specific config files
22
+ You can have environment specific config files. Environment specific config entries take precedence over common config entries.
23
+
24
+ Example development environment config file:
25
+ Merb.root/config/app_config/development.yml
26
+
27
+ Example production environment config file:
28
+ Merb.root/config/app_config/production.yml
29
+
30
+ === Embedded Ruby (ERB)
31
+ Embedded Ruby is allowed in the configuration files. See examples below.
32
+
33
+ == Easy Stylesheets and Javascripts
34
+ You can also define your javascripts and stylesheets using AppConfig
35
+
36
+ Merb.root/config/javascripts.yml
37
+ Merb.root/config/stylesheets.yml
38
+
39
+ prototype:
40
+ - prototype
41
+ - scriptaculous
42
+
43
+ jquery:
44
+ - jquery
45
+ - jquery.ui/tabs
46
+
47
+ components:
48
+ - components/blah
49
+ - components/blah2
50
+
51
+ This will include all the javasciprt files listed when running the helper "javascripts", and on prod, it will bundle them up by key (prototype-bundle.js, jquery-bundle.js, components-bundle.js)
52
+
53
+ In your application layout, just include the calls to
54
+ <%= stylesheets %>
55
+ <%= javascripts %>
56
+
57
+ === Examples
58
+ Consider the two following config files.
59
+
60
+ Merb.root/config/app_config.yml:
61
+ size: 1
62
+ server: google.com
63
+
64
+ Merb.root/config/app_config/development.yml:
65
+ size: 2
66
+ computed: <%= 1 + 2 + 3 %>
67
+ section:
68
+ size: 3
69
+ servers: [ {name: yahoo.com}, {name: amazon.com} ]
70
+
71
+ Notice that the environment specific config entries overwrite the common entries.
72
+ AppConfig.size -> 2
73
+ AppConfig.server -> google.com
74
+
75
+ Notice the embedded Ruby.
76
+ AppConfig.computed -> 6
77
+
78
+ Notice that object member notation is maintained even in nested entries.
79
+ AppConfig.section.size -> 3
80
+
81
+ Notice array notation and object member notation is maintained.
82
+ AppConfig.section.servers[0].name -> yahoo.com
83
+ AppConfig.section.servers[1].name -> amazon.com
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+
4
+ require 'merb-core'
5
+ require 'merb-core/tasks/merb'
6
+
7
+ GEM_NAME = "merb-plugins-app-config"
8
+ GEM_VERSION = "0.3"
9
+ AUTHOR = "Jacques Crocker"
10
+ EMAIL = "merbjedi@gmail.com"
11
+ HOMEPAGE = "http://www.merbjedi.com/"
12
+ SUMMARY = "Merb plugin that provides easy to use Application Configurations via YAML"
13
+
14
+ spec = Gem::Specification.new do |s|
15
+ s.rubyforge_project = 'merb'
16
+ s.name = GEM_NAME
17
+ s.version = GEM_VERSION
18
+ s.platform = Gem::Platform::RUBY
19
+ s.has_rdoc = true
20
+ s.extra_rdoc_files = ["README", "LICENSE"]
21
+ s.summary = SUMMARY
22
+ s.description = s.summary
23
+ s.author = AUTHOR
24
+ s.email = EMAIL
25
+ s.homepage = HOMEPAGE
26
+ s.add_dependency('merb', '>= 1.0')
27
+ s.add_dependency('merb-assets', '>= 1.0')
28
+ s.require_path = 'lib'
29
+ s.files = %w(LICENSE README Rakefile) + Dir.glob("{lib,spec}/**/*")
30
+ end
31
+
32
+ Rake::GemPackageTask.new(spec) do |pkg|
33
+ pkg.gem_spec = spec
34
+ end
35
+
36
+ desc "install the plugin as a gem"
37
+ task :install do
38
+ Merb::RakeHelper.install(GEM_NAME, :version => GEM_VERSION)
39
+ end
40
+
41
+ desc "Uninstall the gem"
42
+ task :uninstall do
43
+ Merb::RakeHelper.uninstall(GEM_NAME, :version => GEM_VERSION)
44
+ end
45
+
46
+ desc "Create a gemspec file"
47
+ task :gemspec do
48
+ File.open("#{GEM_NAME}.gemspec", "w") do |file|
49
+ file.puts spec.to_ruby
50
+ end
51
+ end
52
+
53
+ require 'lib/merbtasks'
@@ -0,0 +1,45 @@
1
+ require 'ostruct'
2
+ require 'yaml'
3
+ require 'erb'
4
+
5
+ module ApplicationConfig
6
+ # == Summary
7
+ # This is API documentation, NOT documentation on how to use this plugin. For that, see the README.
8
+ class ConfigBuilder
9
+
10
+ # Create a config object (OpenStruct) from a yaml file. If a second yaml file is given, then the sections of that file will overwrite the sections
11
+ # if the first file if they exist in the first file.
12
+ def self.load_files(*conf_load_paths)
13
+ @@conf_paths = []
14
+ @@conf_paths << conf_load_paths
15
+ @@conf_paths.flatten!.uniq!
16
+ return reload
17
+ end
18
+
19
+ def self.reload
20
+ conf = {}
21
+ @@conf_paths.to_a.each do |path|
22
+ new_conf = YAML.load(ERB.new(IO.read(path)).result) if path and File.exists?(path)
23
+ conf.merge!(new_conf) if new_conf
24
+ end
25
+ return convert(conf)
26
+ end
27
+
28
+ # Recursively converts Hashes to OpenStructs (including Hashes inside Arrays)
29
+ def self.convert(h) #:nodoc:
30
+ s = OpenStruct.new
31
+ h.each do |k, v|
32
+ s.new_ostruct_member(k)
33
+ if v.instance_of?(Hash)
34
+ s.send( (k+'=').to_sym, convert(v))
35
+ elsif v.instance_of?(Array)
36
+ converted_array = v.collect { |e| e.instance_of?(Hash) ? convert(e) : e }
37
+ s.send("#{k}=".to_sym, converted_array)
38
+ else
39
+ s.send("#{k}=".to_sym, v)
40
+ end
41
+ end
42
+ s
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,20 @@
1
+ module ApplicationConfig
2
+ module ViewHelpers
3
+ def javascripts
4
+ js_hash = AppConfigJavascripts.marshal_dump
5
+ js_hash.each do |key, val|
6
+ require_js val, :bundle => key.to_sym
7
+ end
8
+ include_required_js
9
+ end
10
+
11
+ def stylesheets
12
+ style_hash = AppConfigStylesheets.marshal_dump
13
+ style_hash.each do |key, val|
14
+ require_css val, :bundle => key.to_sym
15
+ end
16
+
17
+ include_required_css
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,36 @@
1
+ require 'application_config/config_builder'
2
+ require 'application_config/view_helpers'
3
+
4
+ # make sure we're running inside Merb
5
+ if defined?(Merb::Plugins)
6
+ # Merb gives you a Merb::Plugins.config hash...feel free to put your stuff in your piece of it
7
+ Merb::Plugins.config[:app_config] = {
8
+ :auto_reload => false,
9
+ :include_viewhelpers => true
10
+ }
11
+
12
+ Merb::BootLoader.before_app_loads do
13
+ ::AppConfig = ApplicationConfig::ConfigBuilder.load_files(Merb.root+"/config/app_config/settings.yml",
14
+ Merb.root+"/config/app_config/#{Merb.env}.yml")
15
+
16
+ if Merb::Plugins.config[:app_config][:include_viewhelpers]
17
+ ::AppConfigStylesheets = ApplicationConfig::ConfigBuilder.load_files(Merb.root+"/config/app_config/stylesheets.yml")
18
+ ::AppConfigJavascripts = ApplicationConfig::ConfigBuilder.load_files(Merb.root+"/config/app_config/javascripts.yml")
19
+ end
20
+
21
+ # add reload method to our ostruct
22
+ def AppConfig.reload!
23
+ AppConfig.marshal_load(ApplicationConfig::ConfigBuilder.reload.marshal_dump)
24
+ return AppConfig
25
+ end
26
+
27
+ if Merb::Plugins.config[:app_config][:include_viewhelpers]
28
+ Merb::Controller.send(:include, ApplicationConfig::ViewHelpers)
29
+ end
30
+ end
31
+
32
+ # Merb::BootLoader.after_app_loads do
33
+ # end
34
+
35
+ Merb::Plugins.add_rakefiles "merbtasks"
36
+ end
data/lib/merbtasks.rb ADDED
@@ -0,0 +1,17 @@
1
+ namespace :app_config do
2
+ desc "Create a blank config/app_config.yml file"
3
+ task :init do
4
+ puts "Setting up AppConfig files..."
5
+ `mkdir -p config/app_config`
6
+
7
+ ["config/app_config/settings.yml",
8
+ "config/app_config/development.yml",
9
+ "config/app_config/production.yml"
10
+ ].each do |path|
11
+ `touch #{path}`
12
+ puts "Created: #{path}"
13
+ end
14
+ puts "Complete!"
15
+ puts "Add key/value pairs to your yaml file,\nthen access them in your Merb project via AppConfig.[key]"
16
+ end
17
+ end
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+ require 'merb-plugins-app-config'
3
+
4
+ describe "AppConfig Plugin" do
5
+ before(:each) do
6
+ @settings_path = "spec/test_configs"
7
+ end
8
+
9
+ it "should load a common app config with simple settings" do
10
+ config = ApplicationConfig::ConfigBuilder.load_files("#{@settings_path}/app_config.yml")
11
+ config.size.should == 1
12
+ config.server.should == "google.com"
13
+ end
14
+
15
+ it "should allow environment overrides" do
16
+ config = ApplicationConfig::ConfigBuilder.load_files("#{@settings_path}/app_config.yml", "#{@settings_path}/development.yml")
17
+ config.size.should == 2
18
+ config.server.should == "google.com"
19
+ end
20
+
21
+ it "should allow nested sets of configurations" do
22
+ config = ApplicationConfig::ConfigBuilder.load_files("#{@settings_path}/development.yml")
23
+ config.section.size.should == 3
24
+ end
25
+
26
+ it "should allow array definitions in settings" do
27
+ config = ApplicationConfig::ConfigBuilder.load_files("#{@settings_path}/development.yml")
28
+ config.section.servers[0].name.should == "yahoo.com"
29
+ config.section.servers[1].name.should == "amazon.com"
30
+ end
31
+
32
+ it "should not crash on missing files" do
33
+ config = ApplicationConfig::ConfigBuilder.load_files("#{@settings_path}/nothing_here.yml", "#{@settings_path}/nothing_here2.yml")
34
+ config.should == OpenStruct.new
35
+ end
36
+
37
+ it "should allow erb in settings" do
38
+ config = ApplicationConfig::ConfigBuilder.load_files("#{@settings_path}/development.yml")
39
+ config.computed.should == 6
40
+ end
41
+
42
+ it "should not crash on empty files" do
43
+ config = ApplicationConfig::ConfigBuilder.load_files("#{@settings_path}/empty1.yml", "#{@settings_path}/empty2.yml")
44
+ config.should == OpenStruct.new
45
+ end
46
+ end
@@ -0,0 +1 @@
1
+ $:.push File.join(File.dirname(__FILE__), '..', 'lib')
@@ -0,0 +1,2 @@
1
+ size: 1
2
+ server: google.com
@@ -0,0 +1,5 @@
1
+ size: 2
2
+ computed: <%= 1 + 2 + 3 %>
3
+ section:
4
+ size: 3
5
+ servers: [ {name: yahoo.com}, {name: amazon.com} ]
File without changes
File without changes
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: merb-plugins-app-config
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.3"
5
+ platform: ruby
6
+ authors:
7
+ - Jacques Crocker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-11-15 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: merb
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "1.0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: merb-assets
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "1.0"
34
+ version:
35
+ description: Merb plugin that provides easy to use Application Configurations via YAML
36
+ email: merbjedi@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README
43
+ - LICENSE
44
+ files:
45
+ - LICENSE
46
+ - README
47
+ - Rakefile
48
+ - lib/application_config
49
+ - lib/application_config/config_builder.rb
50
+ - lib/application_config/view_helpers.rb
51
+ - lib/merb-plugins-app-config.rb
52
+ - lib/merbtasks.rb
53
+ - spec/app_config_spec.rb
54
+ - spec/spec_helper.rb
55
+ - spec/test_configs
56
+ - spec/test_configs/app_config.yml
57
+ - spec/test_configs/development.yml
58
+ - spec/test_configs/empty1.yml
59
+ - spec/test_configs/empty2.yml
60
+ has_rdoc: true
61
+ homepage: http://www.merbjedi.com/
62
+ post_install_message:
63
+ rdoc_options: []
64
+
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: "0"
72
+ version:
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
+ version:
79
+ requirements: []
80
+
81
+ rubyforge_project: merb
82
+ rubygems_version: 1.3.1
83
+ signing_key:
84
+ specification_version: 2
85
+ summary: Merb plugin that provides easy to use Application Configurations via YAML
86
+ test_files: []
87
+