stephencelis-app 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,15 @@
1
+ === 0.2.0 / 2009-04-17
2
+
3
+ * 2 major enhancements
4
+
5
+ * Option to modular configuration files (from "config/app/**/*.yml").
6
+ * App.name is now App.to_s (overriding the name is cool, but dangerous).
7
+
8
+ * 1 minor enhancement
9
+
10
+ * Removed superfluous "init" and "uninstall" files (handle load errors more
11
+ gracefully in "app", and let "script/destroy" do its thing).
12
+
1
13
  === 0.1.2 / 2009-04-02
2
14
 
3
15
  * 1 minor enhancement
data/Manifest.txt CHANGED
@@ -4,8 +4,9 @@ README.rdoc
4
4
  Rakefile
5
5
  generators/app_config/app_config_generator.rb
6
6
  generators/app_config/templates/app.yml
7
- init.rb
8
7
  install.rb
9
8
  lib/app.rb
10
9
  test/app_test.rb
11
- uninstall.rb
10
+ test/fixtures/app/authenticate/basic/config.yml
11
+ test/fixtures/app/authenticate.yml
12
+ test/fixtures/app.yml
data/README.rdoc CHANGED
@@ -47,6 +47,18 @@ Sugar, sugar, sugar.
47
47
 
48
48
  Let's not overdo it, though. <tt>App.apis.flickr</tt> just doesn't look right.
49
49
 
50
+ If your "app.yml" gets out of hand, modularize:
51
+
52
+ # config/app/authenticate.yml
53
+ ---
54
+ username: password
55
+
56
+ # (elsewhere)
57
+ App::Authenticate["username"] # => "password"
58
+
59
+
60
+ Namespaces avoid collisions.
61
+
50
62
 
51
63
  == REQUIREMENTS
52
64
 
@@ -1,7 +1,32 @@
1
1
  class AppConfigGenerator < Rails::Generator::Base
2
2
  def manifest
3
3
  record do |m|
4
- m.file "app.yml", "config/app.yml"
4
+ if ARGV.empty?
5
+ if File.exist? Rails.root.join("config", "app.yml")
6
+ show_banner
7
+ else
8
+ m.file "app.yml", "config/app.yml"
9
+ end
10
+ else
11
+ ARGV.each do |arg|
12
+ path = "config/app/#{arg.underscore}"
13
+ m.directory File.dirname(path)
14
+ m.file "app.yml", "#{path}.yml"
15
+ end
16
+ end
5
17
  end
6
18
  end
19
+
20
+ private
21
+
22
+ def show_banner
23
+ puts "App: you already have an app.yml!"
24
+ puts
25
+ puts " Remember to pass arguments to generate new configurations:"
26
+ puts " script/generate app_config apis/twitter"
27
+ puts
28
+ puts " Generates:"
29
+ puts " config/app/apis"
30
+ puts " config/app/apis/twitter.yml"
31
+ end
7
32
  end
@@ -1,6 +1,4 @@
1
- # Your app config, provided by the App plugin.
2
- #
3
- # See "vendor/plugins/app/README.txt" for details.
1
+ # An app config, provided by App: http://github.com/stephencelis/app
4
2
  ---
5
3
  development: &development
6
4
  loaded_at: <%= Time.zone.now.iso8601 %>
data/install.rb CHANGED
@@ -1 +1 @@
1
- STDOUT.puts 'Run `script/generate app_config` to generate "config/app.yml".'
1
+ $stdout.puts 'Run `script/generate app_config` to generate "config/app.yml".'
data/lib/app.rb CHANGED
@@ -1,12 +1,10 @@
1
1
  # App is your app.
2
2
  #
3
- # What would your app be without it? Still an app, but without the App.
3
+ # What would your app be without it? Still an app, but without App.
4
4
  module App
5
- VERSION = "0.1.2"
6
-
7
- raw_config = File.read Rails.root.join("config", "app.yml")
8
- @@config = YAML.load(ERB.new(raw_config).result)[Rails.env].freeze
5
+ VERSION = "0.2.0"
9
6
 
7
+ @@config = {} # Initialize.
10
8
  class << self
11
9
  # Returns the application configuration hash, as defined in
12
10
  # "config/app.yml".
@@ -26,20 +24,10 @@ module App
26
24
  @@config if args.empty?
27
25
  args.inject(@@config) { |config, arg| config[arg] }
28
26
  end
29
-
30
- alias [] config
31
- alias __name__ name
32
-
33
- # Returns the name of the web application, which can be overridden in
34
- # "config/app.yml".
35
- #
36
- # To return the name of the module, use <tt>App.__name__</tt>.
37
- def name
38
- @@name ||= method_missing(:name) || File.basename(Rails.root)
39
- end
27
+ alias [] config
40
28
 
41
29
  def inspect
42
- "#<App: #{config.inspect}>"
30
+ "#<#{name}: #{config.inspect}>"
43
31
  end
44
32
 
45
33
  private
@@ -48,4 +36,37 @@ module App
48
36
  self[method.to_s, *args] || self[method, *args]
49
37
  end
50
38
  end
39
+
40
+ begin
41
+ raw = File.read Rails.root.join("config", "#{name.underscore}.yml")
42
+ @@config = YAML.load(ERB.new(raw).result)[Rails.env]
43
+ rescue Errno::ENOENT => e
44
+ puts '** App: no file "config/app.yml". Run `script/generate app_config`.'
45
+ end
46
+ end
47
+
48
+ unless __FILE__ == "(eval)"
49
+ module App
50
+ class << self
51
+ # Returns the name of the web application, which can be overridden in
52
+ # "config/app.yml".
53
+ def to_s
54
+ File.basename(Rails.root)
55
+ end
56
+ end
57
+ end
58
+
59
+ # Iterate through other App configs and namespace them.
60
+ Dir[Rails.root.join("config", "app", "**/*.yml")].sort.each do |config|
61
+ name = config.gsub(/#{Rails.root.join("config")}\/|\.yml/) {}.classify
62
+
63
+ # Recognize all parents.
64
+ line = name.split("::")
65
+ line.inject(line.shift) do |parentage, descendant|
66
+ eval "module #{parentage}; end"
67
+ "#{parentage}::#{descendant}"
68
+ end
69
+
70
+ eval File.read(__FILE__).sub "module App", "module #{name}"
71
+ end
51
72
  end
data/test/app_test.rb CHANGED
@@ -5,38 +5,29 @@ require 'active_support/test_case'
5
5
  require 'mocha'
6
6
  require 'erb'
7
7
 
8
- # Mock
9
- module App
10
- module Rails
11
- def self.root
12
- File
13
- end
14
- def self.env
15
- "development"
16
- end
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"
17
19
  end
18
20
  end
19
21
 
20
- File.stubs(:read).returns <<-YAML
21
- ---
22
- development:
23
- loaded_at: <%= Time.now.iso8601 %>
24
- username: Stephen
25
- password: frobozz
26
- apis:
27
- braintree:
28
- :login: testapi
29
- :password: password1
30
- YAML
31
-
22
+ # And load!
32
23
  require 'app'
33
24
 
34
25
  class AppTest < ActiveSupport::TestCase
35
- test "different ways of access should return same values" do
36
- assert_equal "Stephen", App.config["username"]
37
- assert_equal "Stephen", App.config("username")
38
- assert_equal "Stephen", App["username"]
39
- assert_equal "Stephen", App.username
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
40
31
 
41
32
  assert_equal "testapi", App.config["apis"]["braintree"][:login]
42
33
  assert_equal "testapi", App.config("apis", "braintree", :login)
@@ -44,12 +35,26 @@ class AppTest < ActiveSupport::TestCase
44
35
  assert_equal "testapi", App.apis("braintree", :login)
45
36
  end
46
37
 
47
- test "ERB should be parsed" do
38
+ test "should parse ERB" do
48
39
  assert_instance_of Time, App.loaded_at
49
40
  end
50
41
 
51
- test "App.name should be inferred" do
42
+ test "should accept boolean keys" do
43
+ assert !App.process_payments?
44
+ end
45
+
46
+ test "should infer App.name" do
52
47
  File.stubs(:basename).returns "root"
53
- assert_equal "root", App.name
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
54
59
  end
55
60
  end
@@ -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
@@ -0,0 +1,4 @@
1
+ ---
2
+ development:
3
+ Stephen: frobozz
4
+ housemd: God
@@ -0,0 +1,3 @@
1
+ ---
2
+ development:
3
+ authentication_type: :basic
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stephencelis-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Celis
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-02 00:00:00 -07:00
12
+ date: 2009-04-17 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.11.0
23
+ version: 1.12.0
24
24
  version:
25
25
  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.
26
26
  email:
@@ -39,11 +39,12 @@ files:
39
39
  - Rakefile
40
40
  - generators/app_config/app_config_generator.rb
41
41
  - generators/app_config/templates/app.yml
42
- - init.rb
43
42
  - install.rb
44
43
  - lib/app.rb
45
44
  - test/app_test.rb
46
- - uninstall.rb
45
+ - test/fixtures/app/authenticate/basic/config.yml
46
+ - test/fixtures/app/authenticate.yml
47
+ - test/fixtures/app.yml
47
48
  has_rdoc: true
48
49
  homepage:
49
50
  post_install_message:
@@ -69,7 +70,7 @@ requirements: []
69
70
  rubyforge_project: app
70
71
  rubygems_version: 1.2.0
71
72
  signing_key:
72
- specification_version: 2
73
+ specification_version: 3
73
74
  summary: Move the config out of your app, and into App
74
75
  test_files: []
75
76
 
data/init.rb DELETED
@@ -1,3 +0,0 @@
1
- if !File.exist? Rails.root.join("config", "app.yml")
2
- puts '** App: "config/app.yml" not found. Run `script/generate app_config`.'
3
- end
data/uninstall.rb DELETED
@@ -1,7 +0,0 @@
1
- app_yaml = Rails.root.join("config", "app.yml")
2
- if File.exist? app_yaml
3
- print 'Also remove "config/app.yml"? [yN] '
4
- if STDIN.gets.chomp =~ /^y)/i
5
- File.delete app_yaml
6
- end
7
- end