bragi-app 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/History.rdoc ADDED
@@ -0,0 +1,53 @@
1
+ === 0.2.3 / 2009-06-02
2
+
3
+ * 2 minor enhancements
4
+
5
+ * Non existing nested keys are ignored and null is returned
6
+ * Generator uses existing app.yml.example file when it exists in application
7
+
8
+ === 0.2.2 / 2009-04-17
9
+
10
+ * 2 minor enhancements
11
+
12
+ * Remember to better ensure immutability.
13
+ * Include "README.rdoc" in gemspec.
14
+
15
+
16
+ === 0.2.1 / 2009-04-17
17
+
18
+ * 1 minor enhancement
19
+
20
+ * Configuration files no longer require scoping to environments.
21
+
22
+
23
+ === 0.2.0 / 2009-04-17
24
+
25
+ * 2 major enhancements
26
+
27
+ * Option to modular configuration files (from "config/app/**/*.yml").
28
+ * App.name is now App.to_s (overriding the name is cool, but dangerous).
29
+
30
+ * 1 minor enhancement
31
+
32
+ * Removed superfluous "init" and "uninstall" files (handle load errors more
33
+ gracefully in "app", and let "script/destroy" do its thing).
34
+
35
+ === 0.1.2 / 2009-04-02
36
+
37
+ * 1 minor enhancement
38
+
39
+ * Change README.txt to README.rdoc in gem specification.
40
+
41
+
42
+ === 0.1.1 / 2009-04-02
43
+
44
+ * 1 major enhancement
45
+
46
+ * Gemified!
47
+
48
+
49
+ === 0.1.0 / 2009-04-02
50
+
51
+ * 1 major enhancement
52
+
53
+ * Birthday!
data/Manifest.txt ADDED
@@ -0,0 +1,12 @@
1
+ History.rdoc
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ generators/app_config/app_config_generator.rb
6
+ generators/app_config/templates/app.yml
7
+ install.rb
8
+ lib/app.rb
9
+ test/app_test.rb
10
+ test/fixtures/app/authenticate/basic/config.yml
11
+ test/fixtures/app/authenticate.yml
12
+ test/fixtures/app.yml
data/README.rdoc ADDED
@@ -0,0 +1,136 @@
1
+ = App
2
+
3
+ http://github.com/stephencelis/app
4
+
5
+
6
+ == DESCRIPTION
7
+
8
+ Move the config out of your app, and into App.
9
+
10
+ Sure, it's been done before, and others will do it again, but this is my way,
11
+ and I like it.
12
+
13
+
14
+ == FEATURES/PROBLEMS
15
+
16
+ * Easy, environmentally-friendly configuration access.
17
+
18
+
19
+ For mutability, try acts_as_singleton or KVC:
20
+
21
+ * http://github.com/stephencelis/acts_as_singleton
22
+ * http://github.com/stephencelis/kvc
23
+
24
+
25
+ == SYNOPSIS
26
+
27
+ App looks for and loads configuration from "config/app.yml", providing a
28
+ namespaced API for access.
29
+
30
+ App.config # => {"apis"=>{"flickr"=>{ ... }}
31
+
32
+
33
+ Sugar is always sweeter:
34
+
35
+ App.config("apis", "flickr") # => App.config["apis"]["flickr"]
36
+
37
+
38
+ Who doesn't like sugar?
39
+
40
+ App["apis", "flickr"]
41
+
42
+
43
+ Sugar, sugar, sugar.
44
+
45
+ App.apis("flickr")
46
+
47
+
48
+ Let's not overdo it, though. <tt>App.apis.flickr</tt> just doesn't look right.
49
+
50
+
51
+ == REQUIREMENTS
52
+
53
+ * Rails 2.3.2 or greater.
54
+
55
+
56
+ == INSTALL
57
+
58
+ === With a template:
59
+
60
+ In existing projects:
61
+
62
+ % rake rails:template LOCATION=http://gist.github.com/97629.txt
63
+
64
+
65
+ For new projects:
66
+
67
+ % rails newapp -m http://gist.github.com/97629.txt
68
+
69
+
70
+ === Or as a gem:
71
+
72
+ Configure:
73
+
74
+ # config/environment.rb
75
+ config.gem "stephencelis-app", :lib => "app",
76
+ :source => "http://gems.github.com",
77
+ :version => ">= 0.2.2"
78
+
79
+ And install:
80
+
81
+ % sudo rake gems:install
82
+
83
+
84
+ === Or as a plugin:
85
+
86
+ Install:
87
+
88
+ % script/plugin install git://github.com/stephencelis/app.git
89
+
90
+
91
+ Or submodule:
92
+
93
+ % git submodule add git://github.com/stephencelis/app.git vendor/plugins/app
94
+
95
+
96
+ === Finally, generate:
97
+
98
+ % script/generate app_config
99
+
100
+
101
+ If your "app.yml" gets out of hand, modularize, like in this heavy-handed
102
+ example:
103
+
104
+ % script/generate app_config apis/twitter
105
+ create config/app/apis
106
+ create config/app/apis/twitter.yml # Configure me!
107
+
108
+
109
+ Namespaces avoid collisions:
110
+
111
+ App::Apis::Twitter.username
112
+
113
+
114
+ == LICENSE
115
+
116
+ (The MIT License)
117
+
118
+ (c) 2009-* Stephen Celis, stephen@stephencelis.com.
119
+
120
+ Permission is hereby granted, free of charge, to any person obtaining a copy
121
+ of this software and associated documentation files (the "Software"), to deal
122
+ in the Software without restriction, including without limitation the rights
123
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
124
+ copies of the Software, and to permit persons to whom the Software is
125
+ furnished to do so, subject to the following conditions:
126
+
127
+ The above copyright notice and this permission notice shall be included in all
128
+ copies or substantial portions of the Software.
129
+
130
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
131
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
132
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
133
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
134
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
135
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
136
+ SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the app plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
15
+
16
+ desc 'Generate documentation for the app plugin.'
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'App'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README.rdoc')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
@@ -0,0 +1,37 @@
1
+ require "fileutils"
2
+
3
+ class AppConfigGenerator < Rails::Generator::Base
4
+ def manifest
5
+ record do |m|
6
+ if ARGV.empty?
7
+ if File.exist? Rails.root.join("config", "app.yml")
8
+ show_banner
9
+ elsif File.exist? Rails.root.join("config", "app.yml.example")
10
+ FileUtils.cp(Rails.root.join("config", "app.yml.example"),
11
+ Rails.root.join("config", "app.yml"))
12
+ else
13
+ m.file "app.yml", "config/app.yml"
14
+ end
15
+ else
16
+ ARGV.each do |arg|
17
+ path = "config/app/#{arg.underscore}"
18
+ m.directory File.dirname(path)
19
+ m.file "app.yml", "#{path}.yml"
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def show_banner
28
+ puts "App: you already have an app.yml!"
29
+ puts
30
+ puts " Remember to pass arguments to generate new configurations:"
31
+ puts " script/generate app_config apis/twitter"
32
+ puts
33
+ puts " Generates:"
34
+ puts " config/app/apis"
35
+ puts " config/app/apis/twitter.yml"
36
+ end
37
+ end
@@ -0,0 +1,15 @@
1
+ # An app config, provided by App: http://github.com/stephencelis/app
2
+ ---
3
+ development: &development
4
+ loaded_at: <%= Time.zone.now.iso8601 %>
5
+ # Example of nested data:
6
+ # apis:
7
+ # braintree:
8
+ # :login: testapi
9
+ # :password: password1
10
+
11
+ test:
12
+ <<: *development
13
+
14
+ production:
15
+ loaded_at: <%= Time.zone.now.iso8601 %>
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ $stdout.puts 'Run `script/generate app_config` to generate "config/app.yml".'
data/lib/app.rb ADDED
@@ -0,0 +1,74 @@
1
+ # App is your app.
2
+ #
3
+ # What would your app be without it? Still an app, but without App.
4
+ module App
5
+ VERSION = "0.2.2"
6
+
7
+ @@config = {} # Initialize.
8
+ class << self
9
+ # Returns the application configuration hash, as defined in
10
+ # "config/app.yml".
11
+ #
12
+ # Follows args through the hash tree. E.g.:
13
+ #
14
+ # App.config("apis", "flickr") # => config_hash["apis"]["flickr"]
15
+ #
16
+ # <tt>App.config</tt> is aliased to <tt>App.[]</tt>, so shorten things up:
17
+ #
18
+ # App["apis", "flickr"]
19
+ #
20
+ # Or rely on +method_missing+ to make it even shorter (and sweeter):
21
+ #
22
+ # App.apis("flickr")
23
+ def config(*args)
24
+ @@config if args.empty?
25
+ args.inject(@@config) { |config, arg| config && config[arg] }
26
+ end
27
+ alias [] config
28
+
29
+ def inspect
30
+ "#<#{name}: #{config.inspect}>"
31
+ end
32
+
33
+ private
34
+
35
+ def method_missing(method, *args)
36
+ self[method.to_s, *args] || self[method, *args]
37
+ end
38
+ end
39
+
40
+ begin
41
+ raw = File.read Rails.root.join("config", "#{name.underscore}.yml")
42
+ all = YAML.load ERB.new(raw).result
43
+ @@config = all[Rails.env] || all
44
+ @@config.freeze
45
+ rescue Errno::ENOENT => e
46
+
47
+ puts '** App: no file "config/app.yml". Run `script/generate app_config`.'
48
+ end
49
+ end
50
+
51
+ unless __FILE__ == "(eval)"
52
+ module App
53
+ class << self
54
+ # Returns the name of the web application.
55
+ def to_s
56
+ File.basename Rails.root
57
+ end
58
+ end
59
+ end
60
+
61
+ # Iterate through other App configs and namespace them.
62
+ Dir[Rails.root.join("config", "app", "**/*.yml")].sort.each do |config|
63
+ name = config.gsub(/#{Rails.root.join("config")}\/|\.yml/) {}.classify
64
+
65
+ # Recognize all parents.
66
+ line = name.split "::"
67
+ line.inject line.shift do |parentage, descendant|
68
+ eval "module #{parentage}; end"
69
+ "#{parentage}::#{descendant}"
70
+ end
71
+
72
+ eval File.read(__FILE__).sub("module App", "module #{name}")
73
+ end
74
+ end
data/test/app_test.rb ADDED
@@ -0,0 +1,68 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'active_support'
4
+ require 'active_support/test_case'
5
+ require 'mocha'
6
+ require 'erb'
7
+
8
+ # Mock!
9
+ module Rails
10
+ def self.root
11
+ self
12
+ end
13
+ def self.join(*args)
14
+ args.shift # No "config" dir, OK?
15
+ File.expand_path File.join(File.dirname(__FILE__), "fixtures", *args)
16
+ end
17
+ def self.env
18
+ "development"
19
+ end
20
+ end
21
+
22
+ # And load!
23
+ require 'app'
24
+
25
+ class AppTest < ActiveSupport::TestCase
26
+ test "should access many ways" do
27
+ assert_equal "Welcome!", App.config["welcome_message"]
28
+ assert_equal "Welcome!", App.config("welcome_message")
29
+ assert_equal "Welcome!", App["welcome_message"]
30
+ assert_equal "Welcome!", App.welcome_message
31
+
32
+ assert_equal "testapi", App.config["apis"]["braintree"][:login]
33
+ assert_equal "testapi", App.config("apis", "braintree", :login)
34
+ assert_equal "testapi", App["apis", "braintree", :login]
35
+ assert_equal "testapi", App.apis("braintree", :login)
36
+ end
37
+
38
+ test "should parse ERB" do
39
+ assert_instance_of Time, App.loaded_at
40
+ end
41
+
42
+ test "should accept boolean keys" do
43
+ assert !App.process_payments?
44
+ end
45
+
46
+ test "should infer App.name" do
47
+ File.stubs(:basename).returns "root"
48
+ assert_equal "root", App.to_s
49
+ end
50
+
51
+ test "should namespace configs" do
52
+ assert_instance_of Module, App::Authenticate
53
+ assert_equal "frobozz", App::Authenticate["Stephen"]
54
+ end
55
+
56
+ test "should nest multiple levels of configs" do
57
+ assert_instance_of Module, App::Authenticate::Basic::Config
58
+ assert_equal :basic, App::Authenticate::Basic::Config.authentication_type
59
+ end
60
+
61
+ test "should be frozen" do
62
+ assert_raise(TypeError) { App.config["loaded_at"] = Time.now }
63
+ end
64
+
65
+ test "should ignore null nested keys" do
66
+ assert_nil App.config("missing_scope", "nested_missing_key")
67
+ end
68
+ end
@@ -0,0 +1,2 @@
1
+ ---
2
+ authentication_type: :basic
@@ -0,0 +1,4 @@
1
+ ---
2
+ development:
3
+ Stephen: frobozz
4
+ housemd: God
@@ -0,0 +1,9 @@
1
+ ---
2
+ development:
3
+ loaded_at: <%= Time.now.iso8601 %>
4
+ welcome_message: Welcome!
5
+ process_payments?: false
6
+ apis:
7
+ braintree:
8
+ :login: testapi
9
+ :password: password1
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bragi-app
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.3
5
+ platform: ruby
6
+ authors:
7
+ - Stephen Celis
8
+ - "\xC5\x81ukasz Piestrzeniewicz"
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-06-02 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: hoe
18
+ type: :development
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 1.12.0
25
+ version:
26
+ description: Move the config out of your app, and into App. Sure, it's been done before, and others will do it again, but this is my way, and I like it.
27
+ email:
28
+ - stephen@stephencelis.com
29
+ - bragi@ragnarson.com
30
+ executables: []
31
+
32
+ extensions: []
33
+
34
+ extra_rdoc_files:
35
+ - History.rdoc
36
+ - Manifest.txt
37
+ - README.rdoc
38
+ files:
39
+ - History.rdoc
40
+ - Manifest.txt
41
+ - README.rdoc
42
+ - Rakefile
43
+ - generators/app_config/app_config_generator.rb
44
+ - generators/app_config/templates/app.yml
45
+ - install.rb
46
+ - lib/app.rb
47
+ - test/app_test.rb
48
+ - test/fixtures/app/authenticate/basic/config.yml
49
+ - test/fixtures/app/authenticate.yml
50
+ - test/fixtures/app.yml
51
+ has_rdoc: true
52
+ homepage: http://github.com/stephencelis/app
53
+ post_install_message:
54
+ rdoc_options:
55
+ - --main
56
+ - README.rdoc
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ version:
71
+ requirements: []
72
+
73
+ rubyforge_project: app
74
+ rubygems_version: 1.2.0
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: Move the config out of your app, and into App
78
+ test_files: []
79
+