padrino-core 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,16 +1,15 @@
1
1
  module Padrino
2
2
  # Represents a particular mounted padrino application
3
3
  # Stores the name of the application (app folder name) and url mount path
4
- # @example Mounter.new("blog_app").to("/blog")
5
- # @example Mounter.new("blog_app", :app_file => "/path/to/root/app.rb").to("/blog")
6
4
  # @example Mounter.new("blog_app", :app_class => "Blog").to("/blog")
5
+ # @example Mounter.new("blog_app", :app_file => "/path/to/blog/app.rb").to("/blog")
7
6
  class Mounter
8
- attr_accessor :name, :uri_root, :app_file, :app_klass, :app_root
7
+ attr_accessor :name, :uri_root, :app_file, :app_class, :app_root
9
8
  def initialize(name, options={})
10
- @name = name
11
- @app_klass = options[:app_class] || name.classify
12
- @app_file = options[:app_file] || Padrino.mounted_root(name, 'app.rb')
13
- @app_root = options[:app_root] if options[:app_root]
9
+ @name = name.downcase
10
+ @app_class = options[:app_class] || name.classify
11
+ @app_file = options[:app_file] || locate_app_file
12
+ @app_root = options[:app_root]
14
13
  end
15
14
 
16
15
  # Registers the mounted application onto Padrino
@@ -18,33 +17,37 @@ module Padrino
18
17
  def to(mount_url)
19
18
  @uri_root = mount_url
20
19
  Padrino.mounted_apps << self
20
+ self
21
21
  end
22
22
 
23
23
  # Maps Padrino application onto a Rack::Builder
24
24
  # For use in constructing a Rack application
25
25
  # @example @app.map_onto(@builder)
26
26
  def map_onto(builder)
27
- require(self.app_file)
28
- app_data, app_klass = self, self.app_klass.constantize
27
+ self.app_class.constantize rescue require(self.app_file)
28
+ app_data, app_class = self, self.app_class.constantize
29
29
  builder.map self.uri_root do
30
- app_klass.set :uri_root, app_data.uri_root
31
- app_klass.set :app_file, app_data.app_file
32
- app_klass.set :root, app_data.app_root if app_data.app_root
33
- run app_klass
30
+ app_class.set :uri_root, app_data.uri_root
31
+ app_class.set :app_file, app_data.app_file
32
+ app_class.set :app_name, app_data.name
33
+ app_class.set :root, app_data.app_root if app_data.app_root
34
+ run app_class
34
35
  end
35
36
  end
37
+
38
+ # Returns the determined location of the mounted application main file
39
+ def locate_app_file
40
+ callers_are_identical = File.identical?(Padrino.first_caller.to_s, Padrino.called_from.to_s)
41
+ callers_are_identical ? Padrino.first_caller : Padrino.mounted_root(name, "app.rb")
42
+ end
36
43
  end
37
44
 
38
45
  class << self
46
+ attr_writer :mounted_root # Set root directory where padrino searches mounted apps
47
+
39
48
  # Returns the root to the mounted apps base directory
40
49
  def mounted_root(*args)
41
- @mounted_root ||= "apps" # Other apps
42
- File.join(Padrino.root, @mounted_root, *args)
43
- end
44
-
45
- # Set the root directory where padrino search mounted apps
46
- def mounted_root=(value)
47
- @mounted_root = value
50
+ File.join(Padrino.root, @mounted_root ||= "apps", *args)
48
51
  end
49
52
 
50
53
  # Returns the mounted padrino applications (MountedApp objects)
@@ -52,17 +55,20 @@ module Padrino
52
55
  @mounted_apps ||= []
53
56
  end
54
57
 
58
+ # Mounts the core application onto Padrino project with given app settings (file, class, root)
59
+ # @example Padrino.mount_core("Blog")
60
+ # @example Padrino.mount_core(:app_file => "/path/to/file", :app_class => "Blog")
61
+ def mount_core(*args)
62
+ options = args.extract_options!
63
+ app_class = args.size > 0 ? args.first.to_s.camelize : nil
64
+ options.reverse_merge!(:app_class => app_class, :app_file => Padrino.root('app/app.rb'), :app_root => Padrino.root)
65
+ mount("core", options).to("/")
66
+ end
67
+
55
68
  # Mounts a new sub-application onto Padrino project
56
69
  # @example Padrino.mount("blog_app").to("/blog")
57
70
  def mount(name, options={})
58
71
  Mounter.new(name, options)
59
72
  end
60
-
61
- # Mounts the core application onto Padrino project
62
- # @example Padrino.mount_core(:app_file => "/path/to/file", :app_class => "Blog")
63
- def mount_core(options={})
64
- options.reverse_merge!(:app_file => Padrino.root('app/app.rb'), :app_root => Padrino.root)
65
- Mounter.new("core", options).to("/")
66
- end
67
73
  end
68
- end
74
+ end
@@ -1,9 +1,24 @@
1
- # This is for adding specific methods that are required by padrino if activesupport isn't required
2
- unless String.method_defined?(:titleize) && Hash.method_defined?(:slice)
3
- require 'active_support/inflector'
4
- require 'active_support/core_ext/blank'
5
- require 'active_support/core_ext/class/attribute_accessors'
6
- require 'active_support/core_ext/hash'
7
- require 'active_support/core_ext/array'
8
- require 'active_support/core_ext/module'
9
- end
1
+ =begin
2
+
3
+ This file determines if extlib or activesupport are already loaded, and then ensures
4
+ the required objects and methods exist for Padrino to use.
5
+
6
+ Required for Padrino to run:
7
+
8
+ * Class#cattr_accessor
9
+ * Module#alias_method_chain
10
+ * String#inflectors (classify, underscore, camelize, etc)
11
+ * Array#extract_options!
12
+ * Object#blank?
13
+ * Object#present?
14
+ * Hash#symbolize_keys
15
+ * Hash#reverse_merge, Hash#reverse_merge!
16
+ * SupportLite::OrderedHash
17
+
18
+ =end
19
+
20
+ if defined?(Extlib) # load if already using extlib
21
+ require File.dirname(__FILE__) + '/support_lite/extlib_support'
22
+ else # load active support by default
23
+ require File.dirname(__FILE__) + '/support_lite/as_support'
24
+ end
@@ -0,0 +1,21 @@
1
+ # This requires necessary pieces of ActiveSupport for the dependencies required by Padrino
2
+
3
+ ## Class#cattr_accessor
4
+ require 'active_support/core_ext/class/attribute_accessors' unless Class.method_defined?(:cattr_accessor)
5
+ ## Hash#symbolize_keys, Hash#reverse_merge, Hash#reverse_merge!, Hash#extract_options!
6
+ require 'active_support/core_ext/hash' unless Hash.method_defined?(:reverse_merge)
7
+ ## String#inflectors
8
+ require 'active_support/inflector' unless String.method_defined?(:constantize)
9
+ ## Object#blank?, Object#present?
10
+ require 'active_support/core_ext/blank' unless Object.method_defined?(:blank?)
11
+ ## Array#extract_options!
12
+ require 'active_support/core_ext/array' unless Array.method_defined?(:extract_options!)
13
+ ## Module#alias_method_chain
14
+ require 'active_support/core_ext/module' unless Module.method_defined?(:alias_method_chain)
15
+ ## SupportLite::OrderedHash
16
+ require 'active_support/ordered_hash' unless defined?(ActiveSupport::OrderedHash)
17
+ unless defined?(SupportLite::OrderedHash)
18
+ module SupportLite
19
+ OrderedHash = ::ActiveSupport::OrderedHash
20
+ end
21
+ end
@@ -0,0 +1,96 @@
1
+ # This helps extlib to act like ActiveSupport for use with Padrino
2
+
3
+ ## Class#cattr_accessor
4
+ unless Class.method_defined?(:cattr_accessor)
5
+ require 'extlib/class'
6
+ end
7
+
8
+ ## SupportLite::OrderedHash
9
+ unless defined?(SupportLite::OrderedHash)
10
+ require 'extlib/dictionary'
11
+ module SupportLite
12
+ OrderedHash = ::Dictionary
13
+ end
14
+ end
15
+
16
+ ## Hash#symbolize_keys
17
+ unless Hash.method_defined?(:symbolize_keys)
18
+ require 'extlib/hash'
19
+ require 'extlib/mash'
20
+ class Hash
21
+ def symbolize_keys
22
+ Mash.new(self).symbolize_keys
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+ ## Hash#reverse_merge, Hash#reverse_merge!
29
+ unless Hash.method_defined?(:present?)
30
+ class Hash
31
+ def reverse_merge(other_hash)
32
+ other_hash.merge(self)
33
+ end
34
+
35
+ def reverse_merge!(other_hash)
36
+ replace(reverse_merge(other_hash))
37
+ end
38
+ end
39
+ end
40
+
41
+ ## Array#extract_options!
42
+ unless Array.method_defined?(:extract_options!)
43
+ class Array
44
+ def extract_options!
45
+ last.is_a?(::Hash) ? pop : {}
46
+ end
47
+ end
48
+ end
49
+
50
+ ## String#inflectors
51
+ unless String.method_defined?(:constantize)
52
+ require 'extlib/inflection'
53
+ class String
54
+ def classify; Extlib::Inflection.classify(self); end
55
+ def underscore; Extlib::Inflection.underscore(self); end
56
+ def constantize; Extlib::Inflection.constantize(self); end
57
+ end
58
+ end
59
+
60
+ ## Object#blank?
61
+ unless Array.method_defined?(:blank?)
62
+ require 'extlib/blank'
63
+ end
64
+
65
+ ## Object#present?
66
+ unless Array.method_defined?(:present?)
67
+ class Object
68
+ def present?
69
+ !blank?
70
+ end
71
+ end
72
+ end
73
+
74
+ ## Module#alias_method_chain
75
+ unless Module.method_defined?(:alias_method_chain)
76
+ def alias_method_chain(target, feature)
77
+ # Strip out punctuation on predicates or bang methods since
78
+ # e.g. target?_without_feature is not a valid method name.
79
+ aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
80
+ yield(aliased_target, punctuation) if block_given?
81
+
82
+ with_method, without_method = "#{aliased_target}_with_#{feature}#{punctuation}", "#{aliased_target}_without_#{feature}#{punctuation}"
83
+
84
+ alias_method without_method, target
85
+ alias_method target, with_method
86
+
87
+ case
88
+ when public_method_defined?(without_method)
89
+ public target
90
+ when protected_method_defined?(without_method)
91
+ protected target
92
+ when private_method_defined?(without_method)
93
+ private target
94
+ end
95
+ end
96
+ end
@@ -2,23 +2,20 @@ require 'thor'
2
2
  require File.dirname(__FILE__) + "/tasks/helpers"
3
3
 
4
4
  module Padrino
5
- module Tasks
5
+ module Tasks
6
6
  class Base < Thor
7
7
  include Thor::Actions
8
8
  include Padrino::Tasks::Helpers
9
9
 
10
10
  class_option :chdir, :type => :string, :aliases => "-c"
11
11
 
12
- desc "start ", "Starts the Padrino application"
13
-
12
+ desc "start", "Starts the Padrino application"
14
13
  method_option :environment, :type => :string, :aliases => "-e", :required => true, :default => :development
15
14
  method_option :adapter, :type => :string, :aliases => "-a", :required => true, :default => :thin
16
15
  method_option :host, :type => :string, :aliases => "-h", :required => true, :default => "localhost"
17
16
  method_option :port, :type => :numeric, :aliases => "-p", :required => true, :default => 3000
18
17
  method_option :boot, :type => :string, :aliases => "-b", :required => true, :default => "config/boot.rb"
19
18
  method_option :daemonize, :type => :boolean, :aliases => "-d"
20
-
21
- desc "start", "Start the Padrino application"
22
19
  def start
23
20
  require File.dirname(__FILE__) + "/tasks/adapter"
24
21
  chdir(options.chdir)
@@ -45,7 +42,7 @@ module Padrino
45
42
  require File.dirname(__FILE__) + "/version"
46
43
  boot = options.chdir ? File.join(options.chdir, options.boot) : options.boot
47
44
  unless File.exist?(boot)
48
- puts "=> We didn't find boot file: #{boot} !!!"
45
+ puts "=> Could not find boot file: #{boot.inspect} !!!"
49
46
  exit
50
47
  end
51
48
  ENV["PADRINO_ENV"] ||= environment
@@ -4,11 +4,12 @@ module Padrino
4
4
 
5
5
  class << self
6
6
 
7
- # This metod start testing for the given app.
8
- # It look for any test/test_*.rb file in your app root.
7
+ # This method executes tests found for the given app.
8
+ # It look for any spec/*_spec.rb and test/test_*.rb files in your app root.
9
9
  def start
10
- puts "=> Starting Test"
11
- tests = Dir['test/**/test_*.rb'] - ['test/test_helper.rb']
10
+ puts "=> Executing Tests..."
11
+ tests = Dir['test/**/test_*.rb'] - ['test/test_helper.rb']
12
+ tests << Dir['spec/**/*_spec.rb'] - Dir['spec/**/spec_helper.rb']
12
13
  cmd = "ruby -rubygems -I.:lib -e'%w( #{tests.join(' ')} ).each { |file| require file }'"
13
14
  system cmd
14
15
  end
@@ -4,4 +4,4 @@ module Padrino
4
4
  def self.version
5
5
  @version ||= File.read(File.dirname(__FILE__) + '/../../VERSION').chomp
6
6
  end
7
- end
7
+ end
@@ -5,36 +5,36 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{padrino-core}
8
- s.version = "0.1.3"
8
+ s.version = "0.1.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
12
- s.date = %q{2009-11-20}
12
+ s.date = %q{2009-11-23}
13
13
  s.default_executable = %q{padrino}
14
14
  s.description = %q{The Padrino core gem required for use of this framework}
15
15
  s.email = %q{nesquena@gmail.com}
16
16
  s.executables = ["padrino"]
17
17
  s.extra_rdoc_files = [
18
- "LICENSE",
19
- "README.rdoc"
18
+ "README.rdoc"
20
19
  ]
21
20
  s.files = [
22
21
  ".document",
23
22
  ".gitignore",
24
23
  "LICENSE",
25
24
  "README.rdoc",
26
- "README.rdoc",
27
- "Rakefile",
28
25
  "Rakefile",
29
26
  "VERSION",
30
27
  "bin/padrino",
31
28
  "lib/padrino-core.rb",
32
29
  "lib/padrino-core/application.rb",
30
+ "lib/padrino-core/caller.rb",
33
31
  "lib/padrino-core/loader.rb",
34
32
  "lib/padrino-core/mounter.rb",
35
33
  "lib/padrino-core/reloader.rb",
36
34
  "lib/padrino-core/stat.rb",
37
35
  "lib/padrino-core/support_lite.rb",
36
+ "lib/padrino-core/support_lite/as_support.rb",
37
+ "lib/padrino-core/support_lite/extlib_support.rb",
38
38
  "lib/padrino-core/tasks.rb",
39
39
  "lib/padrino-core/tasks/adapter.rb",
40
40
  "lib/padrino-core/tasks/console.rb",
@@ -42,17 +42,15 @@ Gem::Specification.new do |s|
42
42
  "lib/padrino-core/tasks/test.rb",
43
43
  "lib/padrino-core/version.rb",
44
44
  "padrino-core.gemspec",
45
- "test/active_support_helpers.rb",
46
- "test/fixtures/simple_app/.components",
47
- "test/fixtures/simple_app/.gitignore",
48
- "test/fixtures/simple_app/Gemfile",
49
- "test/fixtures/simple_app/app.rb",
45
+ "test/fixtures/apps/.components",
46
+ "test/fixtures/apps/.gitignore",
47
+ "test/fixtures/apps/app.rb",
48
+ "test/fixtures/apps/multi.rb",
50
49
  "test/helper.rb",
51
- "test/test_padrino_application.rb",
52
50
  "test/test_padrino_core.rb",
53
51
  "test/test_padrino_mounter.rb"
54
52
  ]
55
- s.homepage = %q{http://github.com/padrino/padrino-core}
53
+ s.homepage = %q{http://github.com/padrino/padrino-framework/tree/master/padrino-core}
56
54
  s.rdoc_options = ["--charset=UTF-8"]
57
55
  s.require_paths = ["lib"]
58
56
  s.rubygems_version = %q{1.3.5}
@@ -66,6 +64,7 @@ Gem::Specification.new do |s|
66
64
  s.add_runtime_dependency(%q<sinatra>, [">= 0.9.2"])
67
65
  s.add_runtime_dependency(%q<thor>, [">= 0.11.8"])
68
66
  s.add_development_dependency(%q<haml>, [">= 2.2.1"])
67
+ s.add_runtime_dependency(%q<bundler>, [">= 0.5.0"])
69
68
  s.add_development_dependency(%q<shoulda>, [">= 0"])
70
69
  s.add_development_dependency(%q<mocha>, [">= 0.9.7"])
71
70
  s.add_development_dependency(%q<rack-test>, [">= 0.5.0"])
@@ -74,6 +73,7 @@ Gem::Specification.new do |s|
74
73
  s.add_dependency(%q<sinatra>, [">= 0.9.2"])
75
74
  s.add_dependency(%q<thor>, [">= 0.11.8"])
76
75
  s.add_dependency(%q<haml>, [">= 2.2.1"])
76
+ s.add_dependency(%q<bundler>, [">= 0.5.0"])
77
77
  s.add_dependency(%q<shoulda>, [">= 0"])
78
78
  s.add_dependency(%q<mocha>, [">= 0.9.7"])
79
79
  s.add_dependency(%q<rack-test>, [">= 0.5.0"])
@@ -83,6 +83,7 @@ Gem::Specification.new do |s|
83
83
  s.add_dependency(%q<sinatra>, [">= 0.9.2"])
84
84
  s.add_dependency(%q<thor>, [">= 0.11.8"])
85
85
  s.add_dependency(%q<haml>, [">= 2.2.1"])
86
+ s.add_dependency(%q<bundler>, [">= 0.5.0"])
86
87
  s.add_dependency(%q<shoulda>, [">= 0"])
87
88
  s.add_dependency(%q<mocha>, [">= 0.9.7"])
88
89
  s.add_dependency(%q<rack-test>, [">= 0.5.0"])
@@ -0,0 +1,15 @@
1
+ PADRINO_ROOT = File.dirname(__FILE__) unless defined? PADRINO_ROOT
2
+ require 'rubygems'
3
+ require 'sinatra/base'
4
+ require 'lib/padrino-core'
5
+
6
+ class SingleDemo < Padrino::Application; end
7
+
8
+ SingleDemo.controllers do
9
+ get "/test" do
10
+ 'This should work'
11
+ end
12
+ end
13
+
14
+ Padrino.mount_core("single_demo")
15
+ Padrino.load!
@@ -0,0 +1,27 @@
1
+ PADRINO_ROOT = File.dirname(__FILE__) unless defined? PADRINO_ROOT
2
+ require 'sinatra/base'
3
+ require 'padrino-core'
4
+
5
+ class Multi1Demo < Padrino::Application
6
+ disable :padrino_routing
7
+ disable :padrino_mailer
8
+ disable :padrino_helpers
9
+
10
+ get "" do
11
+ "Im Core1Demo"
12
+ end
13
+ end
14
+
15
+ class Mutli2Demo < Padrino::Application
16
+ disable :padrino_routing
17
+ disable :padrino_mailer
18
+ disable :padrino_helpers
19
+
20
+ get "" do
21
+ "Im Core2Demo"
22
+ end
23
+ end
24
+
25
+ Padrino.mount("multi_1_demo").to("/multi_1_demo")
26
+ Padrino.mount("multi_2_demo").to("/multi_2_demo")
27
+ Padrino.load!