padrino-core 0.2.9 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/bin/padrino +0 -1
- data/lib/padrino-core/application.rb +130 -64
- data/lib/padrino-core/caller.rb +1 -1
- data/lib/padrino-core/loader.rb +12 -21
- data/lib/padrino-core/locale/en.yml +33 -0
- data/lib/padrino-core/logger.rb +1 -1
- data/lib/padrino-core/mounter.rb +2 -2
- data/lib/padrino-core/stat.rb +2 -0
- data/lib/padrino-core/support_lite.rb +15 -2
- data/lib/padrino-core/support_lite/as_support.rb +3 -1
- data/lib/padrino-core/support_lite/extlib_support.rb +76 -5
- data/lib/padrino-core/tasks.rb +5 -0
- data/padrino-core.gemspec +8 -4
- data/test/fixtures/apps/complex.rb +1 -3
- data/test/helper.rb +4 -13
- data/test/test_application.rb +152 -1
- data/test/{test_padrino_core.rb → test_core.rb} +1 -1
- data/test/{test_padrino_mounter.rb → test_mounter.rb} +4 -4
- metadata +15 -4
data/Rakefile
CHANGED
@@ -12,6 +12,7 @@ begin
|
|
12
12
|
gem.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
|
13
13
|
gem.executables = ["padrino"]
|
14
14
|
gem.add_runtime_dependency "sinatra", ">= 0.9.2"
|
15
|
+
gem.add_runtime_dependency "i18n", ">= 0.3.2"
|
15
16
|
gem.add_runtime_dependency "thor", ">= 0.11.8"
|
16
17
|
gem.add_development_dependency "haml", ">= 2.2.1"
|
17
18
|
gem.add_runtime_dependency "bundler", ">= 0.5.0"
|
@@ -28,7 +29,7 @@ end
|
|
28
29
|
|
29
30
|
require 'rake/testtask'
|
30
31
|
Rake::TestTask.new(:test) do |test|
|
31
|
-
test.libs << '
|
32
|
+
test.libs << 'test'
|
32
33
|
test.pattern = 'test/**/test_*.rb'
|
33
34
|
test.verbose = true
|
34
35
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.5
|
data/bin/padrino
CHANGED
@@ -28,16 +28,29 @@ module Padrino
|
|
28
28
|
include(*extensions) if extensions.any?
|
29
29
|
end
|
30
30
|
|
31
|
+
# With this method we can use layout like rails do or if a block given like sinatra
|
32
|
+
# By default we look in your/app/views/layouts/application.(haml|erb|etc)
|
33
|
+
#
|
34
|
+
# If you define:
|
35
|
+
#
|
36
|
+
# layout :custom
|
37
|
+
#
|
38
|
+
# Padrino look for your/app/views/layouts/custom.(haml|erb|etc)
|
39
|
+
def layout(name=:layout, &block)
|
40
|
+
return super if block_given?
|
41
|
+
@_layout = name
|
42
|
+
end
|
43
|
+
|
31
44
|
# Reloads the application files from all defined load paths
|
32
45
|
def reload!
|
33
46
|
reset_routes! # remove all existing user-defined application routes
|
34
47
|
Padrino.load_dependency(self.app_file) # reload the app file
|
35
|
-
load_paths.each { |path| Padrino.load_dependencies(File.join(self.root, path)) }
|
48
|
+
load_paths.each { |path| Padrino.load_dependencies(File.join(self.root, path)) } # reload dependencies
|
36
49
|
end
|
37
50
|
|
38
51
|
# Resets application routes to only routes not defined by the user
|
39
52
|
def reset_routes!
|
40
|
-
@routes = Padrino::Application.dupe_routes
|
53
|
+
@routes = Padrino::Application.respond_to?(:dupe_routes) ? Padrino::Application.dupe_routes : {}
|
41
54
|
end
|
42
55
|
|
43
56
|
# Setup the application by registering initializers, load paths and logger
|
@@ -49,81 +62,134 @@ module Padrino
|
|
49
62
|
self.register_initializers
|
50
63
|
self.require_load_paths
|
51
64
|
self.disable :logging # We need do that as default because Sinatra use commonlogger.
|
65
|
+
I18n.locale = self.locale
|
66
|
+
I18n.load_path += self.translations
|
67
|
+
self.get(""){ redirect("#{options.uri_root}/") } if self.uri_root != "/"
|
52
68
|
@_configured = true
|
53
69
|
end
|
54
70
|
|
55
71
|
protected
|
72
|
+
# Defines default settings for Padrino application
|
73
|
+
def default_configuration!
|
74
|
+
# Overwriting Sinatra defaults
|
75
|
+
set :app_file, caller_files.first || $0 # Assume app file is first caller
|
76
|
+
set :environment, PADRINO_ENV.to_sym
|
77
|
+
set :raise_errors, true if development?
|
78
|
+
set :logging, false # !test?
|
79
|
+
set :sessions, true
|
80
|
+
# Padrino specific
|
81
|
+
set :uri_root, "/"
|
82
|
+
set :reload, development?
|
83
|
+
set :app_name, self.to_s.underscore.to_sym
|
84
|
+
set :default_builder, 'StandardFormBuilder'
|
85
|
+
set :flash, defined?(Rack::Flash)
|
86
|
+
set :authentication, false
|
87
|
+
# Padrino locale
|
88
|
+
set :locale, :en
|
89
|
+
set :translations, Proc.new { Dir[File.join(self.root, "/locale/**/*.{rb,yml}")] }
|
90
|
+
set :auto_locale, false
|
91
|
+
# Plugin specific
|
92
|
+
set :padrino_mailer, defined?(Padrino::Mailer)
|
93
|
+
set :padrino_helpers, defined?(Padrino::Helpers)
|
94
|
+
end
|
56
95
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
set :sessions, true
|
65
|
-
# Padrino specific
|
66
|
-
set :reload, development?
|
67
|
-
set :app_name, self.to_s.underscore.to_sym
|
68
|
-
set :default_builder, 'StandardFormBuilder'
|
69
|
-
set :flash, defined?(Rack::Flash)
|
70
|
-
# Plugin specific
|
71
|
-
set :padrino_mailer, defined?(Padrino::Mailer)
|
72
|
-
set :padrino_helpers, defined?(Padrino::Helpers)
|
73
|
-
end
|
96
|
+
# Calculates any required paths after app_file and root have been properly configured
|
97
|
+
# Executes as part of the setup_application! method
|
98
|
+
def calculate_paths
|
99
|
+
raise ApplicationSetupError.new("Please define 'app_file' option for #{self.name} app!") unless self.app_file
|
100
|
+
set :views, find_view_path if find_view_path
|
101
|
+
set :images_path, File.join(self.public, "/images") unless self.respond_to?(:images_path)
|
102
|
+
end
|
74
103
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
104
|
+
# Requires the middleware and initializer modules to configure components
|
105
|
+
def register_initializers
|
106
|
+
use Padrino::RackLogger
|
107
|
+
use Padrino::Reloader if reload?
|
108
|
+
use Rack::Flash if flash?
|
109
|
+
register DatabaseSetup if defined?(DatabaseSetup)
|
110
|
+
@initializer_path ||= Padrino.root + '/config/initializers/*.rb'
|
111
|
+
Dir[@initializer_path].each { |file| register_initializer(file) }
|
112
|
+
end
|
82
113
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
@initializer_path ||= Padrino.root + '/config/initializers/*.rb'
|
90
|
-
Dir[@initializer_path].each { |file| register_initializer(file) }
|
91
|
-
end
|
114
|
+
# Registers all desired padrino extension helpers/routing
|
115
|
+
def register_framework_extensions
|
116
|
+
register Padrino::Mailer if padrino_mailer?
|
117
|
+
register Padrino::Helpers if padrino_helpers?
|
118
|
+
register Padrino::AccessControl if authentication?
|
119
|
+
end
|
92
120
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
121
|
+
# Returns the load_paths for the application (relative to the application root)
|
122
|
+
def load_paths
|
123
|
+
@load_paths ||= ["urls.rb", "config/urls.rb", "models/*.rb", "mailers/*.rb", "controllers/**/*.rb", "helpers/*.rb"]
|
124
|
+
end
|
98
125
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
126
|
+
# Requires all files within the application load paths
|
127
|
+
def require_load_paths
|
128
|
+
load_paths.each { |path| Padrino.require_dependencies(File.join(self.root, path)) }
|
129
|
+
end
|
130
|
+
|
131
|
+
# Returns the path to the views directory from root by returning the first that is found
|
132
|
+
def find_view_path
|
133
|
+
@view_paths = ["views"].collect { |path| File.join(self.root, path) }
|
134
|
+
@view_paths.find { |path| Dir[File.join(path, '/**/*')].any? }
|
135
|
+
end
|
103
136
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
137
|
+
# Registers an initializer with the application
|
138
|
+
# register_initializer('/path/to/initializer')
|
139
|
+
def register_initializer(file_path)
|
140
|
+
Padrino.require_dependencies(file_path)
|
141
|
+
file_class = File.basename(file_path, '.rb').camelize
|
142
|
+
register "#{file_class}Initializer".constantize
|
143
|
+
rescue NameError => e
|
144
|
+
logger.error "The module '#{file_class}Initializer' (#{file_path}) didn't loaded properly!"
|
145
|
+
logger.error " Initializer error was '#{e.message}'"
|
146
|
+
end
|
109
147
|
end
|
110
148
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
149
|
+
private
|
150
|
+
# Hijacking the sinatra render for do two thing:
|
151
|
+
#
|
152
|
+
# * Use layout like rails do
|
153
|
+
# * Use render 'path/to/my/template'
|
154
|
+
#
|
155
|
+
def render(engine, data=nil, options={}, locals={}, &block)
|
156
|
+
@template_cache.clear if Padrino.env != :production && @template_cache && @template_cache.respond_to?(:clear)
|
157
|
+
# If an engine is a string probably is a path so we try to resolve them
|
158
|
+
if data.nil?
|
159
|
+
data = engine.to_sym
|
160
|
+
engine = resolve_template_engine(engine)
|
161
|
+
end
|
162
|
+
# Use layout as rails do
|
163
|
+
if (options[:layout].nil? || options[:layout] == true) && !self.class.templates.has_key?(:layout)
|
164
|
+
layout = self.class.instance_variable_defined?(:@_layout) ? self.class.instance_variable_get(:@_layout) : :application
|
165
|
+
if layout
|
166
|
+
options[:layout] = File.join('layouts', layout.to_s).to_sym
|
167
|
+
logger.debug "Rendering layout #{options[:layout]}"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
super
|
115
171
|
end
|
116
172
|
|
117
|
-
#
|
118
|
-
#
|
119
|
-
def
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
173
|
+
# Returns the template engine (i.e haml) to use for a given template_path
|
174
|
+
# resolve_template_engine('users/new') => :haml
|
175
|
+
def resolve_template_engine(template_path)
|
176
|
+
resolved_template_path = File.join(self.options.views, template_path.to_s + ".*")
|
177
|
+
template_file = Dir[resolved_template_path].first
|
178
|
+
raise "Template path '#{template_path}' could not be located in views!" unless template_file
|
179
|
+
template_engine = File.extname(template_file)[1..-1].to_sym
|
180
|
+
end
|
181
|
+
|
182
|
+
# When we set :auto_locale, true then:
|
183
|
+
#
|
184
|
+
# * if we pass "/:locale/some/foo" we automatically set teh I18n locale to params[:locale]
|
185
|
+
# * if params[:locale] is empty we use the first HTTP_ACCEPT_LANGUAGE
|
186
|
+
def route_eval(&block)
|
187
|
+
if options.auto_locale
|
188
|
+
if params[:locale]
|
189
|
+
I18n.locale = params[:locale].to_sym rescue options.locale
|
190
|
+
end
|
191
|
+
end
|
192
|
+
super
|
126
193
|
end
|
127
|
-
end
|
128
194
|
end
|
129
|
-
end
|
195
|
+
end
|
data/lib/padrino-core/caller.rb
CHANGED
data/lib/padrino-core/loader.rb
CHANGED
@@ -28,12 +28,6 @@ module Padrino
|
|
28
28
|
Thread.current[:padrino_loaded]
|
29
29
|
end
|
30
30
|
|
31
|
-
# Attempts to require all dependencies with bundler; if this fails, uses system wide gems
|
32
|
-
def load_required_gems
|
33
|
-
load_bundler_manifest
|
34
|
-
require_vendored_gems
|
35
|
-
end
|
36
|
-
|
37
31
|
# Attempts to require all dependency libs that we need.
|
38
32
|
# If you use this method we can perform correctly a Padrino.reload!
|
39
33
|
#
|
@@ -64,22 +58,19 @@ module Padrino
|
|
64
58
|
|
65
59
|
protected
|
66
60
|
|
67
|
-
# Loads the
|
68
|
-
def
|
61
|
+
# Loads the vendored gems or system wide gems through Gemfile
|
62
|
+
def load_required_gems
|
63
|
+
require root('vendor', 'gems', 'environment')
|
64
|
+
Bundler.require_env(Padrino.env)
|
65
|
+
say! "=> Loaded bundled gems for #{Padrino.env} with #{Padrino.support.to_s.humanize}"
|
66
|
+
rescue LoadError
|
69
67
|
require 'bundler'
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
# Require bundled gems if they exist
|
78
|
-
def require_vendored_gems
|
79
|
-
require_dependencies(root('/../vendor', 'gems', PADRINO_ENV))
|
80
|
-
say! " (Loading bundled gems)"
|
81
|
-
rescue LoadError => e
|
82
|
-
say! " (Loading system gems)"
|
68
|
+
if File.exist?(root("Gemfile"))
|
69
|
+
Bundler::Dsl.load_gemfile(root("Gemfile")).require_env(Padrino.env)
|
70
|
+
say! "=> Located Gemfile for #{Padrino.env} with #{Padrino.support.to_s.humanize}"
|
71
|
+
else
|
72
|
+
say! "=> Gemfile for #{Padrino.env} not found!"
|
73
|
+
end
|
83
74
|
end
|
84
75
|
|
85
76
|
# Prints out a message to the stdout if not in test environment
|
@@ -0,0 +1,33 @@
|
|
1
|
+
en:
|
2
|
+
date:
|
3
|
+
formats:
|
4
|
+
# Use the strftime parameters for formats.
|
5
|
+
# When no format has been given, it uses default.
|
6
|
+
# You can provide other formats here if you like!
|
7
|
+
default: "%Y-%m-%d"
|
8
|
+
short: "%b %d"
|
9
|
+
long: "%B %d, %Y"
|
10
|
+
|
11
|
+
day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
|
12
|
+
abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
|
13
|
+
|
14
|
+
# Don't forget the nil at the beginning; there's no such thing as a 0th month
|
15
|
+
month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
|
16
|
+
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
|
17
|
+
# Used in date_select and datime_select.
|
18
|
+
order: [ :year, :month, :day ]
|
19
|
+
|
20
|
+
time:
|
21
|
+
formats:
|
22
|
+
default: "%a, %d %b %Y %H:%M:%S %z"
|
23
|
+
short: "%d %b %H:%M"
|
24
|
+
long: "%B %d, %Y %H:%M"
|
25
|
+
am: "am"
|
26
|
+
pm: "pm"
|
27
|
+
|
28
|
+
# Used in array.to_sentence.
|
29
|
+
support:
|
30
|
+
array:
|
31
|
+
words_connector: ", "
|
32
|
+
two_words_connector: " and "
|
33
|
+
last_word_connector: ", and "
|
data/lib/padrino-core/logger.rb
CHANGED
@@ -102,7 +102,7 @@ module Padrino
|
|
102
102
|
@log.sync = true
|
103
103
|
@mutex = @@mutex[@log] ||= Mutex.new
|
104
104
|
@format_datetime = options[:format_datetime] || "%d/%b/%Y %H:%M:%S"
|
105
|
-
@format_message = options[:format_message] || "
|
105
|
+
@format_message = options[:format_message] || "%-5s - [%s] \"%s\""
|
106
106
|
end
|
107
107
|
|
108
108
|
# Flush the entire buffer to the log object.
|
data/lib/padrino-core/mounter.rb
CHANGED
@@ -59,7 +59,7 @@ module Padrino
|
|
59
59
|
|
60
60
|
# Returns the root to the mounted apps base directory
|
61
61
|
def mounted_root(*args)
|
62
|
-
|
62
|
+
Padrino.root(@mounted_root ||= "", *args)
|
63
63
|
end
|
64
64
|
|
65
65
|
# Returns the mounted padrino applications (MountedApp objects)
|
@@ -79,7 +79,7 @@ module Padrino
|
|
79
79
|
def mount_core(*args)
|
80
80
|
options = args.extract_options!
|
81
81
|
app_class = args.size > 0 ? args.first.to_s.camelize : nil
|
82
|
-
options.reverse_merge!(:app_class => app_class, :app_file => Padrino.root(
|
82
|
+
options.reverse_merge!(:app_class => app_class, :app_file => Padrino.root("app", "app.rb"))
|
83
83
|
mount("core", options).to("/")
|
84
84
|
end
|
85
85
|
|
data/lib/padrino-core/stat.rb
CHANGED
@@ -13,14 +13,27 @@ Required for Padrino to run:
|
|
13
13
|
* Object#present?
|
14
14
|
* Hash#slice, Hash#slice!
|
15
15
|
* Hash#to_params
|
16
|
-
* Hash#symbolize_keys
|
16
|
+
* Hash#symbolize_keys, Hash.symbolize_keys!
|
17
17
|
* Hash#reverse_merge, Hash#reverse_merge!
|
18
18
|
* SupportLite::OrderedHash
|
19
19
|
|
20
20
|
=end
|
21
|
+
require 'i18n'
|
22
|
+
# Load our locales
|
23
|
+
I18n.load_path += Dir["#{File.dirname(__FILE__)}/padrino-core/locale/*.yml"]
|
24
|
+
|
25
|
+
module Padrino
|
26
|
+
# Return the current support used.
|
27
|
+
# Can be one of: :extlib, :active_support
|
28
|
+
def self.support
|
29
|
+
@_padrino_support
|
30
|
+
end
|
31
|
+
end
|
21
32
|
|
22
33
|
if defined?(Extlib) # load if already using extlib
|
34
|
+
Padrino.instance_variable_set(:@_padrino_support, :extlib)
|
23
35
|
require File.dirname(__FILE__) + '/support_lite/extlib_support'
|
24
36
|
else # load active support by default
|
37
|
+
Padrino.instance_variable_set(:@_padrino_support, :active_support)
|
25
38
|
require File.dirname(__FILE__) + '/support_lite/as_support'
|
26
|
-
end
|
39
|
+
end
|
@@ -12,7 +12,9 @@ require 'active_support/core_ext/class/attribute_accessors' unless Class.method_
|
|
12
12
|
require 'active_support/core_ext/hash' unless Hash.method_defined?(:reverse_merge)
|
13
13
|
## Hash#to_params
|
14
14
|
require 'active_support/core_ext/object' unless Object.method_defined?(:to_query)
|
15
|
-
class Hash; alias to_params to_query; end unless Hash.method_defined?(:to_params)
|
15
|
+
class Hash; alias :to_params :to_query; end unless Hash.method_defined?(:to_params)
|
16
|
+
## Object#with_options
|
17
|
+
require 'active_support/option_merger'
|
16
18
|
## String#inflectors
|
17
19
|
require 'active_support/inflector' unless String.method_defined?(:constantize)
|
18
20
|
## Object#blank?, Object#present?
|
@@ -21,6 +21,10 @@ unless Hash.method_defined?(:symbolize_keys)
|
|
21
21
|
def symbolize_keys
|
22
22
|
Mash.new(self).symbolize_keys
|
23
23
|
end
|
24
|
+
|
25
|
+
def symbolize_keys!
|
26
|
+
self.replace(symbolize_keys.to_hash)
|
27
|
+
end
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
@@ -28,12 +32,36 @@ end
|
|
28
32
|
unless Hash.method_defined?(:slice)
|
29
33
|
require 'extlib/hash'
|
30
34
|
class Hash
|
35
|
+
# Slice a hash to include only the given keys. This is useful for
|
36
|
+
# limiting an options hash to valid keys before passing to a method:
|
37
|
+
#
|
38
|
+
# def search(criteria = {})
|
39
|
+
# assert_valid_keys(:mass, :velocity, :time)
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# search(options.slice(:mass, :velocity, :time))
|
43
|
+
#
|
44
|
+
# If you have an array of keys you want to limit to, you should splat them:
|
45
|
+
#
|
46
|
+
# valid_keys = [:mass, :velocity, :time]
|
47
|
+
# search(options.slice(*valid_keys))
|
31
48
|
def slice(*keys)
|
32
49
|
keys = keys.map! { |key| convert_key(key) } if respond_to?(:convert_key)
|
33
50
|
hash = self.class.new
|
34
51
|
keys.each { |k| hash[k] = self[k] if has_key?(k) }
|
35
52
|
hash
|
36
53
|
end
|
54
|
+
|
55
|
+
# Replaces the hash with only the given keys.
|
56
|
+
# Returns a hash contained the removed key/value pairs
|
57
|
+
# {:a => 1, :b => 2, :c => 3, :d => 4}.slice!(:a, :b) # => {:c => 3, :d =>4}
|
58
|
+
def slice!(*keys)
|
59
|
+
keys = keys.map! { |key| convert_key(key) } if respond_to?(:convert_key)
|
60
|
+
omit = slice(*self.keys - keys)
|
61
|
+
hash = slice(*keys)
|
62
|
+
replace(hash)
|
63
|
+
omit
|
64
|
+
end
|
37
65
|
end
|
38
66
|
end
|
39
67
|
|
@@ -43,7 +71,7 @@ unless Hash.method_defined?(:to_params)
|
|
43
71
|
end
|
44
72
|
|
45
73
|
## Hash#reverse_merge, Hash#reverse_merge!
|
46
|
-
unless Hash.method_defined?(:
|
74
|
+
unless Hash.method_defined?(:reverse_merge)
|
47
75
|
class Hash
|
48
76
|
def reverse_merge(other_hash)
|
49
77
|
other_hash.merge(self)
|
@@ -52,6 +80,15 @@ unless Hash.method_defined?(:present?)
|
|
52
80
|
def reverse_merge!(other_hash)
|
53
81
|
replace(reverse_merge(other_hash))
|
54
82
|
end
|
83
|
+
|
84
|
+
def deep_merge(other_hash)
|
85
|
+
target = dup
|
86
|
+
other_hash.each_pair do |k,v|
|
87
|
+
tv = target[k]
|
88
|
+
target[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v
|
89
|
+
end
|
90
|
+
target
|
91
|
+
end
|
55
92
|
end
|
56
93
|
end
|
57
94
|
|
@@ -68,19 +105,22 @@ end
|
|
68
105
|
unless String.method_defined?(:constantize)
|
69
106
|
require 'extlib/inflection'
|
70
107
|
class String
|
71
|
-
def classify;
|
72
|
-
def underscore;
|
108
|
+
def classify; Extlib::Inflection.classify(self); end
|
109
|
+
def underscore; Extlib::Inflection.underscore(self); end
|
73
110
|
def constantize; Extlib::Inflection.constantize(self); end
|
111
|
+
def camelize; Extlib::Inflection.camelize(self); end
|
112
|
+
def humanize; Extlib::Inflection.humanize(self); end
|
113
|
+
alias :titleize :humanize
|
74
114
|
end
|
75
115
|
end
|
76
116
|
|
77
117
|
## Object#blank?
|
78
|
-
unless
|
118
|
+
unless Object.method_defined?(:blank?)
|
79
119
|
require 'extlib/blank'
|
80
120
|
end
|
81
121
|
|
82
122
|
## Object#present?
|
83
|
-
unless
|
123
|
+
unless Object.method_defined?(:present?)
|
84
124
|
class Object
|
85
125
|
def present?
|
86
126
|
!blank?
|
@@ -88,6 +128,37 @@ unless Array.method_defined?(:present?)
|
|
88
128
|
end
|
89
129
|
end
|
90
130
|
|
131
|
+
## Object#with_options
|
132
|
+
unless Object.method_defined?(:with_options)
|
133
|
+
class SupportLite::OptionMerger #:nodoc:
|
134
|
+
instance_methods.each do |method|
|
135
|
+
undef_method(method) if method !~ /^(__|instance_eval|class|object_id)/
|
136
|
+
end
|
137
|
+
|
138
|
+
def initialize(context, options)
|
139
|
+
@context, @options = context, options
|
140
|
+
end
|
141
|
+
|
142
|
+
private
|
143
|
+
def method_missing(method, *arguments, &block)
|
144
|
+
if arguments.last.is_a?(Proc)
|
145
|
+
proc = arguments.pop
|
146
|
+
arguments << lambda { |*args| @options.deep_merge(proc.call(*args)) }
|
147
|
+
else
|
148
|
+
arguments << (arguments.last.respond_to?(:to_hash) ? @options.deep_merge(arguments.pop) : @options.dup)
|
149
|
+
end
|
150
|
+
|
151
|
+
@context.__send__(method, *arguments, &block)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
class Object
|
156
|
+
def with_options(options)
|
157
|
+
yield SupportLite::OptionMerger.new(self, options)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
91
162
|
## Module#alias_method_chain
|
92
163
|
unless Module.method_defined?(:alias_method_chain)
|
93
164
|
def alias_method_chain(target, feature)
|
data/lib/padrino-core/tasks.rb
CHANGED
data/padrino-core.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{padrino-core}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.5"
|
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{
|
12
|
+
s.date = %q{2010-01-06}
|
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}
|
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
"lib/padrino-core/application.rb",
|
30
30
|
"lib/padrino-core/caller.rb",
|
31
31
|
"lib/padrino-core/loader.rb",
|
32
|
+
"lib/padrino-core/locale/en.yml",
|
32
33
|
"lib/padrino-core/logger.rb",
|
33
34
|
"lib/padrino-core/mounter.rb",
|
34
35
|
"lib/padrino-core/reloader.rb",
|
@@ -51,9 +52,9 @@ Gem::Specification.new do |s|
|
|
51
52
|
"test/fixtures/apps/simple.rb",
|
52
53
|
"test/helper.rb",
|
53
54
|
"test/test_application.rb",
|
55
|
+
"test/test_core.rb",
|
54
56
|
"test/test_logger.rb",
|
55
|
-
"test/
|
56
|
-
"test/test_padrino_mounter.rb",
|
57
|
+
"test/test_mounter.rb",
|
57
58
|
"test/test_reloader_complex.rb",
|
58
59
|
"test/test_reloader_simple.rb",
|
59
60
|
"test/test_server.rb"
|
@@ -70,6 +71,7 @@ Gem::Specification.new do |s|
|
|
70
71
|
|
71
72
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
72
73
|
s.add_runtime_dependency(%q<sinatra>, [">= 0.9.2"])
|
74
|
+
s.add_runtime_dependency(%q<i18n>, [">= 0.3.2"])
|
73
75
|
s.add_runtime_dependency(%q<thor>, [">= 0.11.8"])
|
74
76
|
s.add_development_dependency(%q<haml>, [">= 2.2.1"])
|
75
77
|
s.add_runtime_dependency(%q<bundler>, [">= 0.5.0"])
|
@@ -79,6 +81,7 @@ Gem::Specification.new do |s|
|
|
79
81
|
s.add_development_dependency(%q<webrat>, [">= 0.5.1"])
|
80
82
|
else
|
81
83
|
s.add_dependency(%q<sinatra>, [">= 0.9.2"])
|
84
|
+
s.add_dependency(%q<i18n>, [">= 0.3.2"])
|
82
85
|
s.add_dependency(%q<thor>, [">= 0.11.8"])
|
83
86
|
s.add_dependency(%q<haml>, [">= 2.2.1"])
|
84
87
|
s.add_dependency(%q<bundler>, [">= 0.5.0"])
|
@@ -89,6 +92,7 @@ Gem::Specification.new do |s|
|
|
89
92
|
end
|
90
93
|
else
|
91
94
|
s.add_dependency(%q<sinatra>, [">= 0.9.2"])
|
95
|
+
s.add_dependency(%q<i18n>, [">= 0.3.2"])
|
92
96
|
s.add_dependency(%q<thor>, [">= 0.11.8"])
|
93
97
|
s.add_dependency(%q<haml>, [">= 2.2.1"])
|
94
98
|
s.add_dependency(%q<bundler>, [">= 0.5.0"])
|
data/test/helper.rb
CHANGED
@@ -23,7 +23,7 @@ module Kernel
|
|
23
23
|
alias :silence_stdout :silence_logger
|
24
24
|
end
|
25
25
|
|
26
|
-
class
|
26
|
+
class Class
|
27
27
|
# Allow assertions in request context
|
28
28
|
include Test::Unit::Assertions
|
29
29
|
end
|
@@ -31,32 +31,23 @@ end
|
|
31
31
|
class Test::Unit::TestCase
|
32
32
|
include Rack::Test::Methods
|
33
33
|
|
34
|
-
# Test App
|
35
|
-
class PadrinoTestApp < Padrino::Application; end
|
36
|
-
|
37
34
|
# Sets up a Sinatra::Base subclass defined with the block
|
38
35
|
# given. Used in setup or individual spec methods to establish
|
39
36
|
# the application.
|
40
|
-
def mock_app(base=
|
37
|
+
def mock_app(base=Padrino::Application, &block)
|
41
38
|
@app = Sinatra.new(base, &block)
|
42
39
|
end
|
43
|
-
|
40
|
+
|
44
41
|
def app
|
45
42
|
Rack::Lint.new(@app)
|
46
43
|
end
|
47
44
|
|
48
|
-
def stop_time_for_test
|
49
|
-
time = Time.now
|
50
|
-
Time.stubs(:now).returns(time)
|
51
|
-
return time
|
52
|
-
end
|
53
|
-
|
54
45
|
# Asserts that a file matches the pattern
|
55
46
|
def assert_match_in_file(pattern, file)
|
56
47
|
assert File.exist?(file), "File '#{file}' does not exist!"
|
57
48
|
assert_match pattern, File.read(file)
|
58
49
|
end
|
59
|
-
|
50
|
+
|
60
51
|
# Delegate other missing methods to response.
|
61
52
|
def method_missing(name, *args, &block)
|
62
53
|
if response && response.respond_to?(name)
|
data/test/test_application.rb
CHANGED
@@ -2,10 +2,36 @@ require File.dirname(__FILE__) + '/helper'
|
|
2
2
|
|
3
3
|
class TestApplication < Test::Unit::TestCase
|
4
4
|
|
5
|
+
def with_layout(name=:application)
|
6
|
+
# Build a temp layout
|
7
|
+
FileUtils.mkdir_p(File.dirname(__FILE__) + "/views/layouts")
|
8
|
+
layout = File.dirname(__FILE__) + "/views/layouts/#{name}.erb"
|
9
|
+
File.open(layout, 'wb') { |io| io.write "this is a <%= yield %>" }
|
10
|
+
yield
|
11
|
+
ensure
|
12
|
+
# Remove temp layout
|
13
|
+
File.unlink(layout) rescue nil
|
14
|
+
FileUtils.rm_rf(File.dirname(__FILE__) + "/views")
|
15
|
+
end
|
16
|
+
|
17
|
+
def with_view(name, content)
|
18
|
+
# Build a temp layout
|
19
|
+
FileUtils.mkdir_p(File.dirname(__FILE__) + "/views")
|
20
|
+
layout = File.dirname(__FILE__) + "/views/#{name}.erb"
|
21
|
+
File.open(layout, 'wb') { |io| io.write content }
|
22
|
+
yield
|
23
|
+
ensure
|
24
|
+
# Remove temp layout
|
25
|
+
File.unlink(layout) rescue nil
|
26
|
+
FileUtils.rm_rf(File.dirname(__FILE__) + "/views")
|
27
|
+
end
|
28
|
+
|
29
|
+
class PadrinoTestApp < Padrino::Application; end
|
30
|
+
|
5
31
|
context 'for application functionality' do
|
6
32
|
|
7
33
|
should 'check default options' do
|
8
|
-
assert_match
|
34
|
+
assert_match __FILE__, PadrinoTestApp.app_file
|
9
35
|
assert_equal :test, PadrinoTestApp.environment
|
10
36
|
assert_equal Padrino.root("views"), PadrinoTestApp.views
|
11
37
|
assert PadrinoTestApp.raise_errors
|
@@ -27,4 +53,129 @@ class TestApplication < Test::Unit::TestCase
|
|
27
53
|
assert !PadrinoTestApp.padrino_helpers
|
28
54
|
end
|
29
55
|
end
|
56
|
+
|
57
|
+
context 'for application layout functionality' do
|
58
|
+
|
59
|
+
should 'get no layout' do
|
60
|
+
mock_app do
|
61
|
+
get("/"){ "no layout" }
|
62
|
+
end
|
63
|
+
|
64
|
+
get "/"
|
65
|
+
assert_equal "no layout", body
|
66
|
+
end
|
67
|
+
|
68
|
+
should 'be compatible with sinatra layout' do
|
69
|
+
mock_app do
|
70
|
+
layout do
|
71
|
+
"this is a <%= yield %>"
|
72
|
+
end
|
73
|
+
|
74
|
+
get("/"){ render :erb, "sinatra layout" }
|
75
|
+
end
|
76
|
+
|
77
|
+
get "/"
|
78
|
+
assert_equal "this is a sinatra layout", body
|
79
|
+
end
|
80
|
+
|
81
|
+
should 'use rails way layout' do
|
82
|
+
with_layout do
|
83
|
+
mock_app do
|
84
|
+
get("/"){ render :erb, "rails way layout" }
|
85
|
+
end
|
86
|
+
|
87
|
+
get "/"
|
88
|
+
assert_equal "this is a rails way layout", body
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
should 'use rails way for a custom layout' do
|
93
|
+
with_layout :custom do
|
94
|
+
mock_app do
|
95
|
+
layout :custom
|
96
|
+
get("/"){ render :erb, "rails way custom layout" }
|
97
|
+
end
|
98
|
+
|
99
|
+
get "/"
|
100
|
+
assert_equal "this is a rails way custom layout", body
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'for application render functionality' do
|
106
|
+
|
107
|
+
should 'be compatible with sinatra render' do
|
108
|
+
mock_app do
|
109
|
+
get("/"){ render :erb, "<%= 1+2 %>" }
|
110
|
+
end
|
111
|
+
get "/"
|
112
|
+
assert_equal "3", body
|
113
|
+
end
|
114
|
+
|
115
|
+
should 'be compatible with sinatra views' do
|
116
|
+
with_view :index, "<%= 1+2 %>" do
|
117
|
+
mock_app do
|
118
|
+
get("/foo") { render :erb, :index }
|
119
|
+
get("/bar") { erb :index }
|
120
|
+
get("/dir") { "3" }
|
121
|
+
get("/inj") { erb "<%= 2+1 %>" }
|
122
|
+
get("/rnj") { render :erb, "<%= 2+1 %>" }
|
123
|
+
end
|
124
|
+
get "/foo"
|
125
|
+
assert_equal "3", body
|
126
|
+
get "/bar"
|
127
|
+
assert_equal "3", body
|
128
|
+
get "/dir"
|
129
|
+
assert_equal "3", body
|
130
|
+
get "/inj"
|
131
|
+
assert_equal "3", body
|
132
|
+
get "/rnj"
|
133
|
+
assert_equal "3", body
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
should 'resolve template engine' do
|
138
|
+
with_view :index, "<%= 1+2 %>" do
|
139
|
+
mock_app do
|
140
|
+
get("/foo") { render :index }
|
141
|
+
get("/bar") { render "/index" }
|
142
|
+
end
|
143
|
+
get "/foo"
|
144
|
+
assert_equal "3", body
|
145
|
+
get "/bar"
|
146
|
+
assert_equal "3", body
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'for application i18n functionality' do
|
152
|
+
|
153
|
+
should 'have a default locale en and auto_locale disabled' do
|
154
|
+
mock_app do
|
155
|
+
assert_equal :en, locale
|
156
|
+
assert !auto_locale
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
should 'change default locale from settings' do
|
161
|
+
mock_app do
|
162
|
+
set :locale, :it
|
163
|
+
enable :auto_locale
|
164
|
+
assert_equal :it, locale
|
165
|
+
assert auto_locale
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
should 'set locale when auto_locale is enabled' do
|
170
|
+
mock_app do
|
171
|
+
enable :auto_locale
|
172
|
+
get("/:locale"){ I18n.locale.to_s }
|
173
|
+
end
|
174
|
+
|
175
|
+
%w(it de fr).each do |lang|
|
176
|
+
get("/#{lang}")
|
177
|
+
assert_equal lang, body
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
30
181
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class TestMounter < Test::Unit::TestCase
|
4
4
|
|
5
5
|
def setup
|
6
6
|
Padrino.mounted_apps.clear
|
@@ -27,7 +27,7 @@ class TestPadrinoMounter < Test::Unit::TestCase
|
|
27
27
|
mounter.to("/test")
|
28
28
|
assert_equal "test", mounter.name
|
29
29
|
assert_equal "Test", mounter.app_class
|
30
|
-
assert_match %r{test/
|
30
|
+
assert_match %r{test/app.rb}, mounter.app_file
|
31
31
|
assert_equal "/test", mounter.uri_root
|
32
32
|
assert_nil mounter.app_root
|
33
33
|
end
|
@@ -46,7 +46,7 @@ class TestPadrinoMounter < Test::Unit::TestCase
|
|
46
46
|
assert_equal Test, mounter.app_obj
|
47
47
|
assert_equal Padrino.root('app/app.rb'), mounter.app_file
|
48
48
|
assert_equal "/", mounter.uri_root
|
49
|
-
assert_equal
|
49
|
+
assert_equal nil, mounter.app_root
|
50
50
|
end
|
51
51
|
|
52
52
|
should 'mount multiple apps' do
|
@@ -71,7 +71,7 @@ class TestPadrinoMounter < Test::Unit::TestCase
|
|
71
71
|
Padrino.mounted_root = "apps"
|
72
72
|
assert_equal Padrino.root("apps", "test", "app.rb"), Padrino.mounted_root("test", "app.rb")
|
73
73
|
Padrino.mounted_root = nil
|
74
|
-
assert_equal Padrino.root("
|
74
|
+
assert_equal Padrino.root("test", "app.rb"), Padrino.mounted_root("test", "app.rb")
|
75
75
|
end
|
76
76
|
|
77
77
|
should 'correctly instantiate a new padrino application' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: padrino-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Padrino Team
|
@@ -12,7 +12,7 @@ autorequire:
|
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
14
|
|
15
|
-
date:
|
15
|
+
date: 2010-01-06 00:00:00 +01:00
|
16
16
|
default_executable: padrino
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
@@ -25,6 +25,16 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.9.2
|
27
27
|
version:
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: i18n
|
30
|
+
type: :runtime
|
31
|
+
version_requirement:
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 0.3.2
|
37
|
+
version:
|
28
38
|
- !ruby/object:Gem::Dependency
|
29
39
|
name: thor
|
30
40
|
type: :runtime
|
@@ -115,6 +125,7 @@ files:
|
|
115
125
|
- lib/padrino-core/application.rb
|
116
126
|
- lib/padrino-core/caller.rb
|
117
127
|
- lib/padrino-core/loader.rb
|
128
|
+
- lib/padrino-core/locale/en.yml
|
118
129
|
- lib/padrino-core/logger.rb
|
119
130
|
- lib/padrino-core/mounter.rb
|
120
131
|
- lib/padrino-core/reloader.rb
|
@@ -137,9 +148,9 @@ files:
|
|
137
148
|
- test/fixtures/apps/simple.rb
|
138
149
|
- test/helper.rb
|
139
150
|
- test/test_application.rb
|
151
|
+
- test/test_core.rb
|
140
152
|
- test/test_logger.rb
|
141
|
-
- test/
|
142
|
-
- test/test_padrino_mounter.rb
|
153
|
+
- test/test_mounter.rb
|
143
154
|
- test/test_reloader_complex.rb
|
144
155
|
- test/test_reloader_simple.rb
|
145
156
|
- test/test_server.rb
|