padrino-core 0.2.9 → 0.4.5
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/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
|