padrino-core 0.10.1 → 0.10.2
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/README.rdoc +1 -1
- data/lib/padrino-core.rb +3 -3
- data/lib/padrino-core/application.rb +7 -6
- data/lib/padrino-core/application/rendering.rb +11 -7
- data/lib/padrino-core/application/routing.rb +24 -22
- data/lib/padrino-core/caller.rb +1 -1
- data/lib/padrino-core/cli/adapter.rb +1 -1
- data/lib/padrino-core/cli/base.rb +1 -2
- data/lib/padrino-core/cli/rake.rb +1 -1
- data/lib/padrino-core/command.rb +1 -1
- data/lib/padrino-core/images/404.png +0 -0
- data/lib/padrino-core/images/500.png +0 -0
- data/lib/padrino-core/loader.rb +1 -1
- data/lib/padrino-core/locale/no.yml +0 -0
- data/lib/padrino-core/logger.rb +1 -11
- data/lib/padrino-core/mounter.rb +2 -2
- data/lib/padrino-core/reloader.rb +2 -2
- data/lib/padrino-core/router.rb +1 -1
- data/lib/padrino-core/server.rb +1 -1
- data/lib/padrino-core/support_lite.rb +26 -8
- data/lib/padrino-core/tasks.rb +1 -1
- data/lib/padrino-core/version.rb +1 -1
- data/padrino-core.gemspec +3 -3
- data/test/fixtures/apps/complex.rb +6 -1
- data/test/fixtures/apps/simple.rb +2 -2
- data/test/fixtures/dependencies/a.rb +1 -1
- data/test/fixtures/dependencies/b.rb +1 -1
- data/test/fixtures/dependencies/c.rb +1 -1
- data/test/fixtures/dependencies/d.rb +1 -1
- data/test/helper.rb +3 -3
- data/test/test_application.rb +26 -2
- data/test/test_core.rb +2 -2
- data/test/test_logger.rb +1 -1
- data/test/test_mounter.rb +1 -1
- data/test/test_reloader_complex.rb +8 -1
- data/test/test_reloader_simple.rb +1 -1
- data/test/test_rendering.rb +1 -1
- data/test/test_restful_routing.rb +1 -1
- data/test/test_router.rb +1 -1
- data/test/test_routing.rb +108 -3
- metadata +42 -4
data/README.rdoc
CHANGED
data/lib/padrino-core.rb
CHANGED
@@ -9,7 +9,7 @@ PADRINO_ENV = ENV["PADRINO_ENV"] ||= ENV["RACK_ENV"] ||= "development" unless
|
|
9
9
|
PADRINO_ROOT = ENV["PADRINO_ROOT"] ||= File.dirname(Padrino.first_caller) unless defined?(PADRINO_ROOT)
|
10
10
|
|
11
11
|
module Padrino
|
12
|
-
class ApplicationLoadError < RuntimeError
|
12
|
+
class ApplicationLoadError < RuntimeError # @private
|
13
13
|
end
|
14
14
|
|
15
15
|
class << self
|
@@ -80,7 +80,7 @@ module Padrino
|
|
80
80
|
$KCODE='u'
|
81
81
|
else
|
82
82
|
Encoding.default_external = Encoding::UTF_8
|
83
|
-
Encoding.default_internal =
|
83
|
+
Encoding.default_internal = Encoding::UTF_8
|
84
84
|
end
|
85
85
|
nil
|
86
86
|
end
|
@@ -116,4 +116,4 @@ module Padrino
|
|
116
116
|
middleware << [m, args, block]
|
117
117
|
end
|
118
118
|
end # self
|
119
|
-
end # Padrino
|
119
|
+
end # Padrino
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Padrino
|
2
|
-
class ApplicationSetupError < RuntimeError
|
2
|
+
class ApplicationSetupError < RuntimeError # @private
|
3
3
|
end
|
4
4
|
|
5
5
|
##
|
@@ -11,7 +11,7 @@ module Padrino
|
|
11
11
|
|
12
12
|
class << self
|
13
13
|
|
14
|
-
def inherited(base)
|
14
|
+
def inherited(base) # @private
|
15
15
|
logger.devel "Setup #{base}"
|
16
16
|
CALLERS_TO_IGNORE.concat(PADRINO_IGNORE_CALLERS)
|
17
17
|
base.default_configuration!
|
@@ -54,11 +54,12 @@ module Padrino
|
|
54
54
|
logger.devel "Reloading #{self}"
|
55
55
|
@_dependencies = nil # Reset dependencies
|
56
56
|
reset! # Reset sinatra app
|
57
|
-
|
57
|
+
reset_router! # Reset all routes
|
58
58
|
Padrino.require_dependencies(self.app_file, :force => true) # Reload the app file
|
59
|
-
require_dependencies # Reload dependencies
|
60
59
|
register_initializers # Reload our middlewares
|
60
|
+
require_dependencies # Reload dependencies
|
61
61
|
default_filters! # Reload filters
|
62
|
+
default_routes! # Reload default routes
|
62
63
|
default_errors! # Reload our errors
|
63
64
|
I18n.reload! if defined?(I18n) # Reload also our translations
|
64
65
|
end
|
@@ -217,7 +218,7 @@ module Padrino
|
|
217
218
|
response.status = 500
|
218
219
|
content_type 'text/html'
|
219
220
|
'<h1>Internal Server Error</h1>'
|
220
|
-
end
|
221
|
+
end unless errors.has_key?(::Exception)
|
221
222
|
end
|
222
223
|
end
|
223
224
|
|
@@ -256,4 +257,4 @@ module Padrino
|
|
256
257
|
end
|
257
258
|
end # render method
|
258
259
|
end # Application
|
259
|
-
end # Padrino
|
260
|
+
end # Padrino
|
@@ -6,7 +6,7 @@ module Padrino
|
|
6
6
|
# enhanced layout functionality, locale enabled rendering, among other features.
|
7
7
|
#
|
8
8
|
module Rendering
|
9
|
-
class TemplateNotFound < RuntimeError
|
9
|
+
class TemplateNotFound < RuntimeError # @private
|
10
10
|
end
|
11
11
|
|
12
12
|
##
|
@@ -90,8 +90,12 @@ module Padrino
|
|
90
90
|
module InstanceMethods
|
91
91
|
attr_reader :current_engine
|
92
92
|
|
93
|
-
def content_type(type=nil, params={})
|
94
|
-
type.nil?
|
93
|
+
def content_type(type=nil, params={}) # @private
|
94
|
+
unless type.nil?
|
95
|
+
super(type, params)
|
96
|
+
@_content_type = type
|
97
|
+
end
|
98
|
+
@_content_type
|
95
99
|
end
|
96
100
|
|
97
101
|
private
|
@@ -108,7 +112,7 @@ module Padrino
|
|
108
112
|
#
|
109
113
|
def render(engine, data=nil, options={}, locals={}, &block)
|
110
114
|
# If engine is a hash then render data converted to json
|
111
|
-
return engine.to_json if engine.is_a?(Hash)
|
115
|
+
content_type(:json, :charset => 'utf-8') and return engine.to_json if engine.is_a?(Hash)
|
112
116
|
|
113
117
|
# If engine is nil, ignore engine parameter and shift up all arguments
|
114
118
|
# render nil, "index", { :layout => true }, { :localvar => "foo" }
|
@@ -121,7 +125,7 @@ module Padrino
|
|
121
125
|
|
122
126
|
# If data is unassigned then this is a likely a template to be resolved
|
123
127
|
# This means that no engine was explicitly defined
|
124
|
-
data, engine = *resolve_template(engine, options) if data.nil?
|
128
|
+
data, engine = *resolve_template(engine, options.dup) if data.nil?
|
125
129
|
|
126
130
|
# Setup root
|
127
131
|
root = settings.respond_to?(:root) ? settings.root : ""
|
@@ -182,7 +186,7 @@ module Padrino
|
|
182
186
|
#
|
183
187
|
def resolve_template(template_path, options={})
|
184
188
|
# Fetch cached template for rendering options
|
185
|
-
template_path =
|
189
|
+
template_path = template_path.to_s[0] == ?/ ? template_path.to_s : "/#{template_path}"
|
186
190
|
rendering_options = [template_path, content_type, locale]
|
187
191
|
cached_template = settings.fetch_template_file(rendering_options)
|
188
192
|
return cached_template if cached_template
|
@@ -225,4 +229,4 @@ module Padrino
|
|
225
229
|
end
|
226
230
|
end # InstanceMethods
|
227
231
|
end # Rendering
|
228
|
-
end # Padrino
|
232
|
+
end # Padrino
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'http_router' unless defined?(HttpRouter)
|
2
2
|
require 'padrino-core/support_lite' unless defined?(SupportLite)
|
3
3
|
|
4
|
-
class Sinatra::Request
|
4
|
+
class Sinatra::Request # @private
|
5
5
|
attr_accessor :route_obj
|
6
6
|
|
7
7
|
def controller
|
@@ -9,7 +9,7 @@ class Sinatra::Request #:nodoc:
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
class HttpRouter
|
12
|
+
class HttpRouter # @private
|
13
13
|
def rewrite_partial_path_info(env, request); end
|
14
14
|
def rewrite_path_info(env, request); end
|
15
15
|
|
@@ -53,7 +53,7 @@ class HttpRouter #:nodoc:
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
class Route
|
56
|
+
class Route # @private
|
57
57
|
attr_reader :before_filters, :after_filters
|
58
58
|
attr_accessor :custom_conditions, :use_layout, :controller, :cache
|
59
59
|
|
@@ -123,9 +123,9 @@ module Padrino
|
|
123
123
|
#
|
124
124
|
module Routing
|
125
125
|
CONTENT_TYPE_ALIASES = { :htm => :html } unless defined?(CONTENT_TYPE_ALIASES)
|
126
|
-
ROUTE_PRIORITY = {:high => 0, :normal => 1, :low => 2}
|
126
|
+
ROUTE_PRIORITY = {:high => 0, :normal => 1, :low => 2} unless defined?(ROUTE_PRIORITY)
|
127
127
|
|
128
|
-
class UnrecognizedException < RuntimeError
|
128
|
+
class UnrecognizedException < RuntimeError # @private
|
129
129
|
end
|
130
130
|
|
131
131
|
##
|
@@ -248,14 +248,14 @@ module Padrino
|
|
248
248
|
options = args.extract_options!
|
249
249
|
|
250
250
|
# Controller defaults
|
251
|
-
@_controller, original_controller = args,
|
252
|
-
@_parents, original_parent = options.delete(:parent),
|
253
|
-
@_provides, original_provides = options.delete(:provides),
|
251
|
+
@_controller, original_controller = args, @_controller
|
252
|
+
@_parents, original_parent = options.delete(:parent), @_parents
|
253
|
+
@_provides, original_provides = options.delete(:provides), @_provides
|
254
254
|
@_use_format, original_use_format = options.delete(:use_format), @_use_format
|
255
|
-
@_cache, original_cache = options.delete(:cache),
|
256
|
-
@_map, original_map = options.delete(:map),
|
255
|
+
@_cache, original_cache = options.delete(:cache), @_cache
|
256
|
+
@_map, original_map = options.delete(:map), @_map
|
257
257
|
@_conditions, original_conditions = options.delete(:conditions), @_conditions
|
258
|
-
@_defaults, original_defaults = options,
|
258
|
+
@_defaults, original_defaults = options, @_defaults
|
259
259
|
|
260
260
|
# Application defaults
|
261
261
|
@filters, original_filters = { :before => @filters[:before].dup, :after => @filters[:after].dup }, @filters
|
@@ -268,9 +268,9 @@ module Padrino
|
|
268
268
|
@layout = original_layout
|
269
269
|
|
270
270
|
# Controller defaults
|
271
|
-
@_controller, @_parents,
|
272
|
-
@_defaults,
|
273
|
-
@_conditions, @_use_format
|
271
|
+
@_controller, @_parents, @_cache = original_controller, original_parent, original_cache
|
272
|
+
@_defaults, @_provides, @_map = original_defaults, original_provides, original_map
|
273
|
+
@_conditions, @_use_format = original_conditions, original_use_format
|
274
274
|
else
|
275
275
|
include(*args) if extensions.any?
|
276
276
|
end
|
@@ -353,9 +353,8 @@ module Padrino
|
|
353
353
|
end
|
354
354
|
|
355
355
|
def recognize_path(path)
|
356
|
-
|
357
|
-
|
358
|
-
end
|
356
|
+
responses = @router.recognize(Rack::MockRequest.env_for(path))
|
357
|
+
[responses[0].path.route.named, responses[0].params]
|
359
358
|
end
|
360
359
|
|
361
360
|
##
|
@@ -537,8 +536,8 @@ module Padrino
|
|
537
536
|
map = options.delete(:map)
|
538
537
|
|
539
538
|
if path.kind_of?(Symbol) # path i.e :index or :show
|
540
|
-
name = path
|
541
|
-
path = map ? map.dup : path.to_s # The route path
|
539
|
+
name = path # The route name
|
540
|
+
path = map ? map.dup : (path == :index ? '/' : path.to_s) # The route path
|
542
541
|
end
|
543
542
|
|
544
543
|
if path.kind_of?(String) # path i.e "/index" or "/show"
|
@@ -586,11 +585,11 @@ module Padrino
|
|
586
585
|
|
587
586
|
# Small reformats
|
588
587
|
path.gsub!(%r{/\?$}, '(/)') # Remove index path
|
589
|
-
path.gsub!(%r{/?index/?}, '/') # Remove index path
|
590
588
|
path.gsub!(%r{//$}, '/') # Remove index path
|
591
589
|
path[0,0] = "/" unless path =~ %r{^\(?/} # Paths must start with a /
|
592
590
|
path.sub!(%r{/(\))?$}, '\\1') if path != "/" # Remove latest trailing delimiter
|
593
591
|
path.gsub!(/\/(\(\.|$)/, '\\1') # Remove trailing slashes
|
592
|
+
path.squeeze!('/')
|
594
593
|
end
|
595
594
|
|
596
595
|
# Merge in option defaults
|
@@ -660,7 +659,6 @@ module Padrino
|
|
660
659
|
@_use_format = true
|
661
660
|
condition do
|
662
661
|
mime_types = types.map { |t| mime_type(t) }
|
663
|
-
request.path_info =~ /\.([^\.\/]+)$/
|
664
662
|
url_format = params[:format].to_sym if params[:format]
|
665
663
|
accepts = request.accept.map { |a| a.split(";")[0].strip }
|
666
664
|
|
@@ -770,7 +768,11 @@ module Padrino
|
|
770
768
|
# end
|
771
769
|
#
|
772
770
|
def content_type(type=nil, params={})
|
773
|
-
type.nil?
|
771
|
+
unless type.nil?
|
772
|
+
super(type, params)
|
773
|
+
@_content_type = type
|
774
|
+
end
|
775
|
+
@_content_type
|
774
776
|
end
|
775
777
|
|
776
778
|
private
|
data/lib/padrino-core/caller.rb
CHANGED
@@ -109,8 +109,7 @@ module Padrino
|
|
109
109
|
help(task.to_s)
|
110
110
|
raise SystemExit
|
111
111
|
end
|
112
|
-
ENV["PADRINO_ENV"] ||= options.environment.to_s
|
113
|
-
ENV["RACK_ENV"] = ENV["PADRINO_ENV"] # Also set this for middleware
|
112
|
+
ENV["PADRINO_ENV"] ||= ENV["RACK_ENV"] ||= options.environment.to_s
|
114
113
|
chdir(options.chdir)
|
115
114
|
unless File.exist?('config/boot.rb')
|
116
115
|
puts "=> Could not find boot file in: #{options.chdir}/config/boot.rb !!!"
|
data/lib/padrino-core/command.rb
CHANGED
Binary file
|
Binary file
|
data/lib/padrino-core/loader.rb
CHANGED
File without changes
|
data/lib/padrino-core/logger.rb
CHANGED
@@ -104,23 +104,14 @@ module Padrino
|
|
104
104
|
|
105
105
|
# Embed in a String to clear all previous ANSI sequences.
|
106
106
|
CLEAR = "\e[0m"
|
107
|
-
# The start of an ANSI bold sequence.
|
108
107
|
BOLD = "\e[1m"
|
109
|
-
# Set the terminal's foreground ANSI color to black.
|
110
108
|
BLACK = "\e[30m"
|
111
|
-
# Set the terminal's foreground ANSI color to red.
|
112
109
|
RED = "\e[31m"
|
113
|
-
# Set the terminal's foreground ANSI color to green.
|
114
110
|
GREEN = "\e[32m"
|
115
|
-
# Set the terminal's foreground ANSI color to yellow.
|
116
111
|
YELLOW = "\e[33m"
|
117
|
-
# Set the terminal's foreground ANSI color to blue.
|
118
112
|
BLUE = "\e[34m"
|
119
|
-
# Set the terminal's foreground ANSI color to magenta.
|
120
113
|
MAGENTA = "\e[35m"
|
121
|
-
# Set the terminal's foreground ANSI color to cyan.
|
122
114
|
CYAN = "\e[36m"
|
123
|
-
# Set the terminal's foreground ANSI color to white.
|
124
115
|
WHITE = "\e[37m"
|
125
116
|
|
126
117
|
# Colors for levels
|
@@ -245,7 +236,6 @@ module Padrino
|
|
245
236
|
#
|
246
237
|
Levels.each_pair do |name, number|
|
247
238
|
class_eval <<-LEVELMETHODS, __FILE__, __LINE__
|
248
|
-
|
249
239
|
# Appends a message to the log if the log level is at least as high as
|
250
240
|
# the log level of the logger.
|
251
241
|
#
|
@@ -347,7 +337,7 @@ module Padrino
|
|
347
337
|
end # Logger
|
348
338
|
end # Padrino
|
349
339
|
|
350
|
-
module Kernel
|
340
|
+
module Kernel # @private
|
351
341
|
##
|
352
342
|
# Define a logger available every where in our app
|
353
343
|
#
|
data/lib/padrino-core/mounter.rb
CHANGED
@@ -9,7 +9,7 @@ module Padrino
|
|
9
9
|
# Mounter.new("blog_app", :app_file => "/path/to/blog/app.rb").to("/blog")
|
10
10
|
#
|
11
11
|
class Mounter
|
12
|
-
class MounterException < RuntimeError
|
12
|
+
class MounterException < RuntimeError # @private
|
13
13
|
end
|
14
14
|
|
15
15
|
attr_accessor :name, :uri_root, :app_file, :app_class, :app_root, :app_obj, :app_host
|
@@ -189,4 +189,4 @@ module Padrino
|
|
189
189
|
Mounter.new(name, options)
|
190
190
|
end
|
191
191
|
end # Mounter
|
192
|
-
end # Padrino
|
192
|
+
end # Padrino
|
@@ -98,7 +98,7 @@ module Padrino
|
|
98
98
|
# We lock dependencies sets to prevent reloading of protected constants
|
99
99
|
#
|
100
100
|
def lock!
|
101
|
-
klasses = ObjectSpace.classes.map { |klass| klass.to_s.split("::")[0] }.uniq
|
101
|
+
klasses = ObjectSpace.classes.map { |klass| klass.name.to_s.split("::")[0] }.uniq
|
102
102
|
klasses = klasses | Padrino.mounted_apps.map { |app| app.app_class }
|
103
103
|
Padrino::Reloader.exclude_constants.concat(klasses)
|
104
104
|
end
|
@@ -244,4 +244,4 @@ module Padrino
|
|
244
244
|
end
|
245
245
|
end
|
246
246
|
end # Reloader
|
247
|
-
end # Padrino
|
247
|
+
end # Padrino
|
data/lib/padrino-core/router.rb
CHANGED
data/lib/padrino-core/server.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
##
|
2
2
|
# This file loads certain extensions required by Padrino from ActiveSupport.
|
3
3
|
#
|
4
|
-
require 'active_support/core_ext/kernel' # silence_warnings
|
5
4
|
require 'active_support/core_ext/module/aliasing' # alias_method_chain
|
6
|
-
require 'active_support/core_ext/class/attribute_accessors' # cattr_reader
|
7
5
|
require 'active_support/core_ext/hash/keys' # symbolize_keys
|
8
6
|
require 'active_support/core_ext/hash/reverse_merge' # reverse_merge
|
9
7
|
require 'active_support/core_ext/hash/slice' # slice
|
@@ -20,6 +18,7 @@ require 'active_support/inflections' # load default infle
|
|
20
18
|
# Issue: https://github.com/rails/rails/issues/1526
|
21
19
|
#
|
22
20
|
class String
|
21
|
+
##
|
23
22
|
# Returns the plural form of the word in the string.
|
24
23
|
#
|
25
24
|
# "post".pluralize # => "posts"
|
@@ -28,10 +27,12 @@ class String
|
|
28
27
|
# "words".pluralize # => "words"
|
29
28
|
# "the blue mailman".pluralize # => "the blue mailmen"
|
30
29
|
# "CamelOctopus".pluralize # => "CamelOctopi"
|
30
|
+
#
|
31
31
|
def pluralize
|
32
32
|
ActiveSupport::Inflector.pluralize(self)
|
33
33
|
end
|
34
34
|
|
35
|
+
##
|
35
36
|
# Returns the singular form of the word in the string.
|
36
37
|
#
|
37
38
|
# "posts".singularize # => "post"
|
@@ -40,10 +41,12 @@ class String
|
|
40
41
|
# "words".singularize # => "word"
|
41
42
|
# "the blue mailmen".singularize # => "the blue mailman"
|
42
43
|
# "CamelOctopi".singularize # => "CamelOctopus"
|
44
|
+
#
|
43
45
|
def singularize
|
44
46
|
ActiveSupport::Inflector.singularize(self)
|
45
47
|
end
|
46
48
|
|
49
|
+
##
|
47
50
|
# +constantize+ tries to find a declared constant with the name specified
|
48
51
|
# in the string. It raises a NameError when the name is not in CamelCase
|
49
52
|
# or is not initialized.
|
@@ -51,10 +54,12 @@ class String
|
|
51
54
|
# Examples
|
52
55
|
# "Module".constantize # => Module
|
53
56
|
# "Class".constantize # => Class
|
57
|
+
#
|
54
58
|
def constantize
|
55
59
|
ActiveSupport::Inflector.constantize(self)
|
56
60
|
end
|
57
61
|
|
62
|
+
##
|
58
63
|
# By default, +camelize+ converts strings to UpperCamelCase. If the argument to camelize
|
59
64
|
# is set to <tt>:lower</tt> then camelize produces lowerCamelCase.
|
60
65
|
#
|
@@ -64,6 +69,7 @@ class String
|
|
64
69
|
# "active_record".camelize(:lower) # => "activeRecord"
|
65
70
|
# "active_record/errors".camelize # => "ActiveRecord::Errors"
|
66
71
|
# "active_record/errors".camelize(:lower) # => "activeRecord::Errors"
|
72
|
+
#
|
67
73
|
def camelize(first_letter = :upper)
|
68
74
|
case first_letter
|
69
75
|
when :upper then ActiveSupport::Inflector.camelize(self, true)
|
@@ -72,16 +78,19 @@ class String
|
|
72
78
|
end
|
73
79
|
alias_method :camelcase, :camelize
|
74
80
|
|
81
|
+
##
|
75
82
|
# The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string.
|
76
83
|
#
|
77
84
|
# +underscore+ will also change '::' to '/' to convert namespaces to paths.
|
78
85
|
#
|
79
86
|
# "ActiveRecord".underscore # => "active_record"
|
80
87
|
# "ActiveRecord::Errors".underscore # => active_record/errors
|
88
|
+
#
|
81
89
|
def underscore
|
82
90
|
ActiveSupport::Inflector.underscore(self)
|
83
91
|
end
|
84
92
|
|
93
|
+
##
|
85
94
|
# Create a class name from a plural table name like Rails does for table names to models.
|
86
95
|
# Note that this returns a string and not a class. (To convert to an actual class
|
87
96
|
# follow +classify+ with +constantize+.)
|
@@ -92,6 +101,7 @@ class String
|
|
92
101
|
# Singular names are not handled correctly.
|
93
102
|
#
|
94
103
|
# "business".classify # => "Busines"
|
104
|
+
#
|
95
105
|
def classify
|
96
106
|
ActiveSupport::Inflector.classify(self)
|
97
107
|
end
|
@@ -102,7 +112,10 @@ module ObjectSpace
|
|
102
112
|
# Returns all the classes in the object space.
|
103
113
|
def classes
|
104
114
|
ObjectSpace.each_object(Module).select do |klass|
|
105
|
-
|
115
|
+
# Why this? Ruby when you remove a constant don't clean it from
|
116
|
+
# rb_tables, this mean that here we can found classes that was
|
117
|
+
# removed.
|
118
|
+
klass.name rescue false
|
106
119
|
end
|
107
120
|
end
|
108
121
|
end
|
@@ -111,21 +124,26 @@ end
|
|
111
124
|
##
|
112
125
|
# FileSet helper method for iterating and interacting with files inside a directory
|
113
126
|
#
|
114
|
-
|
127
|
+
module FileSet
|
128
|
+
extend self
|
129
|
+
##
|
115
130
|
# Iterates over every file in the glob pattern and yields to a block
|
116
131
|
# Returns the list of files matching the glob pattern
|
117
132
|
# FileSet.glob('padrino-core/application/*.rb', __FILE__) { |file| load file }
|
118
|
-
|
133
|
+
#
|
134
|
+
def glob(glob_pattern, file_path=nil, &block)
|
119
135
|
glob_pattern = File.join(File.dirname(file_path), glob_pattern) if file_path
|
120
136
|
file_list = Dir.glob(glob_pattern).sort
|
121
137
|
file_list.each { |file| block.call(file) }
|
122
138
|
file_list
|
123
139
|
end
|
124
140
|
|
141
|
+
##
|
125
142
|
# Requires each file matched in the glob pattern into the application
|
126
143
|
# FileSet.glob_require('padrino-core/application/*.rb', __FILE__)
|
127
|
-
|
128
|
-
|
144
|
+
#
|
145
|
+
def glob_require(glob_pattern, file_path=nil)
|
146
|
+
glob(glob_pattern, file_path) { |f| require f }
|
129
147
|
end
|
130
148
|
end
|
131
149
|
|
@@ -144,4 +162,4 @@ I18n.load_path += Dir["#{File.dirname(__FILE__)}/locale/*.yml"] if defined?(I18n
|
|
144
162
|
##
|
145
163
|
# Used to know if this file has already been required
|
146
164
|
#
|
147
|
-
module SupportLite; end
|
165
|
+
module SupportLite; end
|
data/lib/padrino-core/tasks.rb
CHANGED
data/lib/padrino-core/version.rb
CHANGED
data/padrino-core.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
|
33
33
|
s.add_dependency("tilt", "~> 1.3.0")
|
34
34
|
s.add_dependency("sinatra", "~> 1.2.6")
|
35
|
-
s.add_dependency("http_router", "~> 0.
|
35
|
+
s.add_dependency("http_router", "~> 0.10.2")
|
36
36
|
s.add_dependency("thor", "~> 0.14.3")
|
37
|
-
s.add_dependency("activesupport", "~> 3.
|
38
|
-
end
|
37
|
+
s.add_dependency("activesupport", "~> 3.1.0")
|
38
|
+
end
|
@@ -14,6 +14,11 @@ end
|
|
14
14
|
class Complex2Demo < Padrino::Application
|
15
15
|
set :reload, true
|
16
16
|
get("/old"){ "Old Sinatra Way" }
|
17
|
+
|
18
|
+
controllers :var do
|
19
|
+
get(:destroy){ params.inspect }
|
20
|
+
end
|
21
|
+
|
17
22
|
get("/"){ "The magick number is: 12!" } # Change only the number!!!
|
18
23
|
end
|
19
24
|
|
@@ -24,4 +29,4 @@ end
|
|
24
29
|
Complex2Demo.controllers do
|
25
30
|
end
|
26
31
|
|
27
|
-
Padrino.load!
|
32
|
+
Padrino.load!
|
@@ -14,7 +14,7 @@ end
|
|
14
14
|
|
15
15
|
SimpleDemo.controllers do
|
16
16
|
get "/" do
|
17
|
-
'The magick number is:
|
17
|
+
'The magick number is: 724274705032786548110472817755585178605481536388041566742570203174924198689!' # Change only the number!!!
|
18
18
|
end
|
19
19
|
|
20
20
|
get "/rand" do
|
@@ -30,4 +30,4 @@ end
|
|
30
30
|
# Then run it from your console: ruby -I"lib" test/fixtures/apps/simple.rb
|
31
31
|
#
|
32
32
|
|
33
|
-
Padrino.load!
|
33
|
+
Padrino.load!
|
@@ -1 +1 @@
|
|
1
|
-
C = "C"
|
1
|
+
C = "C"
|
data/test/helper.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
ENV['PADRINO_ENV'] = 'test'
|
2
|
-
PADRINO_ROOT = File.dirname(__FILE__) unless defined?
|
2
|
+
PADRINO_ROOT = File.dirname(__FILE__) unless defined?(PADRINO_ROOT)
|
3
3
|
|
4
4
|
require File.expand_path('../../../load_paths', __FILE__)
|
5
5
|
require 'padrino-core'
|
6
|
+
require 'json'
|
6
7
|
require 'test/unit'
|
7
8
|
require 'rack/test'
|
8
9
|
require 'rack'
|
9
10
|
require 'shoulda'
|
10
|
-
require 'phocus'
|
11
11
|
|
12
12
|
# Rubies < 1.9 don't handle hashes in the properly order so to prevent
|
13
13
|
# this issue for now we remove extra values from mimetypes.
|
@@ -98,4 +98,4 @@ class Test::Unit::TestCase
|
|
98
98
|
end
|
99
99
|
alias :with_view :with_template
|
100
100
|
alias :with_layout :with_template
|
101
|
-
end
|
101
|
+
end
|
data/test/test_application.rb
CHANGED
@@ -78,6 +78,30 @@ class TestApplication < Test::Unit::TestCase
|
|
78
78
|
get '/bar', {}, { 'HTTP_ACCEPT' => 'application/xml' }
|
79
79
|
assert_equal "Foo in html", body
|
80
80
|
end # content_type to :html
|
81
|
-
end # application functionality
|
82
81
|
|
83
|
-
|
82
|
+
context "errors" do
|
83
|
+
should "haven't mapped errors on development" do
|
84
|
+
mock_app { get('/'){ 'HI' } }
|
85
|
+
get "/"
|
86
|
+
assert @app.errors.empty?
|
87
|
+
end
|
88
|
+
|
89
|
+
should "have mapped errors on production" do
|
90
|
+
mock_app { set :environment, :production; get('/'){ 'HI' } }
|
91
|
+
get "/"
|
92
|
+
assert_equal 1, @app.errors.size
|
93
|
+
end
|
94
|
+
|
95
|
+
should "overide errors" do
|
96
|
+
mock_app do
|
97
|
+
set :environment, :production
|
98
|
+
get('/'){ raise }
|
99
|
+
error(::Exception){ 'custom error' }
|
100
|
+
end
|
101
|
+
get "/"
|
102
|
+
assert_equal 1, @app.errors.size
|
103
|
+
assert_equal 'custom error', body
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end # application functionality
|
107
|
+
end
|
data/test/test_core.rb
CHANGED
@@ -33,7 +33,7 @@ class TestCore < Test::Unit::TestCase
|
|
33
33
|
assert_equal 'UTF8', $KCODE
|
34
34
|
else
|
35
35
|
assert_equal Encoding.default_external, Encoding::UTF_8
|
36
|
-
assert_equal Encoding.default_internal,
|
36
|
+
assert_equal Encoding.default_internal, Encoding::UTF_8
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -76,4 +76,4 @@ class TestCore < Test::Unit::TestCase
|
|
76
76
|
assert_equal "yes", res["Middleware-Called"]
|
77
77
|
end
|
78
78
|
end
|
79
|
-
end
|
79
|
+
end
|
data/test/test_logger.rb
CHANGED
data/test/test_mounter.rb
CHANGED
@@ -36,9 +36,13 @@ class TestComplexReloader < Test::Unit::TestCase
|
|
36
36
|
get "/complex_2_demo/old"
|
37
37
|
assert_equal 200, status
|
38
38
|
|
39
|
+
get "/complex_2_demo/var/destroy"
|
40
|
+
assert_equal '{}', body
|
41
|
+
|
39
42
|
new_phrase = "The magick number is: #{rand(2**255)}!"
|
40
43
|
buffer = File.read(Complex1Demo.app_file)
|
41
44
|
new_buffer = buffer.gsub(/The magick number is: \d+!/, new_phrase)
|
45
|
+
new_buffer.gsub!(/get\(:destroy\)/, 'get(:destroy, :with => :id)')
|
42
46
|
begin
|
43
47
|
File.open(Complex1Demo.app_file, "w") { |f| f.write(new_buffer) }
|
44
48
|
sleep 1.2 # We need at least a cooldown of 1 sec.
|
@@ -57,10 +61,13 @@ class TestComplexReloader < Test::Unit::TestCase
|
|
57
61
|
|
58
62
|
get "/complex_2_demo/old"
|
59
63
|
assert_equal 200, status
|
64
|
+
|
65
|
+
get "/complex_2_demo/var/destroy/variable"
|
66
|
+
assert_equal '{:id=>"variable"}', body
|
60
67
|
ensure
|
61
68
|
# Now we need to prevent to commit a new changed file so we revert it
|
62
69
|
File.open(Complex1Demo.app_file, "w") { |f| f.write(buffer) }
|
63
70
|
end
|
64
71
|
end
|
65
72
|
end
|
66
|
-
end
|
73
|
+
end
|
data/test/test_rendering.rb
CHANGED
data/test/test_router.rb
CHANGED
data/test/test_routing.rb
CHANGED
@@ -37,6 +37,9 @@ class TestRouting < Test::Unit::TestCase
|
|
37
37
|
get %r{/([0-9]+)/} do |num|
|
38
38
|
"Your lucky number: #{num} #{params[:captures].first}"
|
39
39
|
end
|
40
|
+
get /\/page\/([0-9]+)|\// do |num|
|
41
|
+
"My lucky number: #{num} #{params[:captures].first}"
|
42
|
+
end
|
40
43
|
end
|
41
44
|
get "/foo"
|
42
45
|
assert_equal "str", body
|
@@ -46,6 +49,8 @@ class TestRouting < Test::Unit::TestCase
|
|
46
49
|
assert_equal "regexp", body
|
47
50
|
get "/1234/"
|
48
51
|
assert_equal "Your lucky number: 1234 1234", body
|
52
|
+
get "/page/99"
|
53
|
+
assert_equal "My lucky number: 99 99", body
|
49
54
|
end
|
50
55
|
|
51
56
|
should "parse routes with question marks" do
|
@@ -239,6 +244,24 @@ class TestRouting < Test::Unit::TestCase
|
|
239
244
|
assert_equal 'json', body
|
240
245
|
end
|
241
246
|
|
247
|
+
should "set content_type to :json if render => :json" do
|
248
|
+
mock_app do
|
249
|
+
get("/foo"){ render :foo => :bar }
|
250
|
+
end
|
251
|
+
|
252
|
+
get '/foo'
|
253
|
+
assert_equal 'application/json;charset=utf-8', content_type
|
254
|
+
end
|
255
|
+
|
256
|
+
should 'set and get content_type' do
|
257
|
+
mock_app do
|
258
|
+
get("/foo"){ content_type(:json); content_type.to_s }
|
259
|
+
end
|
260
|
+
get "/foo"
|
261
|
+
assert_equal 'application/json', content_type
|
262
|
+
assert_equal 'json', body
|
263
|
+
end
|
264
|
+
|
242
265
|
should "send the appropriate number of params" do
|
243
266
|
mock_app do
|
244
267
|
get('/id/:user_id', :provides => [:json]) { |user_id| user_id}
|
@@ -432,7 +455,7 @@ class TestRouting < Test::Unit::TestCase
|
|
432
455
|
get "/"
|
433
456
|
assert_equal "index", body
|
434
457
|
assert_equal "/", @app.url(:index)
|
435
|
-
get "/accounts"
|
458
|
+
get "/accounts/index"
|
436
459
|
assert_equal "accounts", body
|
437
460
|
end
|
438
461
|
|
@@ -626,6 +649,20 @@ class TestRouting < Test::Unit::TestCase
|
|
626
649
|
assert_equal "foo_bar_index", body
|
627
650
|
end
|
628
651
|
|
652
|
+
should "support a reindex action and remove index inside controller" do
|
653
|
+
mock_app do
|
654
|
+
controller :posts do
|
655
|
+
get(:index){ "index" }
|
656
|
+
get(:reindex){ "reindex" }
|
657
|
+
end
|
658
|
+
end
|
659
|
+
get "/posts"
|
660
|
+
assert_equal "index", body
|
661
|
+
get "/posts/reindex"
|
662
|
+
assert_equal "/posts/reindex", @app.url(:posts, :reindex)
|
663
|
+
assert_equal "reindex", body
|
664
|
+
end
|
665
|
+
|
629
666
|
should 'use uri_root' do
|
630
667
|
mock_app do
|
631
668
|
get(:foo){ "foo" }
|
@@ -888,7 +925,7 @@ class TestRouting < Test::Unit::TestCase
|
|
888
925
|
assert_equal 406, status
|
889
926
|
end
|
890
927
|
|
891
|
-
should "
|
928
|
+
should "does not allow global provides" do
|
892
929
|
mock_app do
|
893
930
|
provides :xml
|
894
931
|
|
@@ -905,6 +942,39 @@ class TestRouting < Test::Unit::TestCase
|
|
905
942
|
assert_equal 'Bar in html', body
|
906
943
|
end
|
907
944
|
|
945
|
+
should "does not allow global provides in controller" do
|
946
|
+
mock_app do
|
947
|
+
controller :base do
|
948
|
+
provides :xml
|
949
|
+
|
950
|
+
get(:foo, "/foo"){ "Foo in #{content_type}" }
|
951
|
+
get(:bar, "/bar"){ "Bar in #{content_type}" }
|
952
|
+
end
|
953
|
+
end
|
954
|
+
|
955
|
+
get '/foo', {}, { 'HTTP_ACCEPT' => 'application/xml' }
|
956
|
+
assert_equal 'Foo in xml', body
|
957
|
+
get '/foo'
|
958
|
+
assert_equal 'Foo in xml', body
|
959
|
+
|
960
|
+
get '/bar', {}, { 'HTTP_ACCEPT' => 'application/xml' }
|
961
|
+
assert_equal 'Bar in html', body
|
962
|
+
end
|
963
|
+
|
964
|
+
should "map non named routes in controllers" do
|
965
|
+
mock_app do
|
966
|
+
controller :base do
|
967
|
+
get("/foo") { "ok" }
|
968
|
+
get("/bar") { "ok" }
|
969
|
+
end
|
970
|
+
end
|
971
|
+
|
972
|
+
get "/base/foo"
|
973
|
+
assert ok?
|
974
|
+
get "/base/bar"
|
975
|
+
assert ok?
|
976
|
+
end
|
977
|
+
|
908
978
|
should "set content_type to :html for both empty Accept as well as Accept text/html" do
|
909
979
|
mock_app do
|
910
980
|
provides :html
|
@@ -1445,6 +1515,29 @@ class TestRouting < Test::Unit::TestCase
|
|
1445
1515
|
assert_equal 'okay', body
|
1446
1516
|
end
|
1447
1517
|
|
1518
|
+
should 'return value from params' do
|
1519
|
+
mock_app do
|
1520
|
+
get("/foo/:bar"){ raise "'bar' should be a string" unless params[:bar].kind_of? String}
|
1521
|
+
end
|
1522
|
+
assert_nothing_raised do
|
1523
|
+
get "/foo/50"
|
1524
|
+
end
|
1525
|
+
end
|
1526
|
+
|
1527
|
+
should 'have MethodOverride middleware with more options' do
|
1528
|
+
mock_app do
|
1529
|
+
put('/', :with => :id, :provides => [:json]) { params[:id] }
|
1530
|
+
end
|
1531
|
+
post '/hi', {'_method'=>'PUT'}
|
1532
|
+
assert_equal 200, status
|
1533
|
+
assert_equal 'hi', body
|
1534
|
+
post '/hi.json', {'_method'=>'PUT'}
|
1535
|
+
assert_equal 200, status
|
1536
|
+
assert_equal 'hi', body
|
1537
|
+
post '/hi.json'
|
1538
|
+
assert_equal 405, status
|
1539
|
+
end
|
1540
|
+
|
1448
1541
|
should 'parse nested params' do
|
1449
1542
|
mock_app do
|
1450
1543
|
get(:index) { "%s %s" % [params[:account][:name], params[:account][:surname]] }
|
@@ -1459,7 +1552,7 @@ class TestRouting < Test::Unit::TestCase
|
|
1459
1552
|
mock_app { set :environment, :development }
|
1460
1553
|
get "/"
|
1461
1554
|
assert_equal 404, status
|
1462
|
-
assert_match
|
1555
|
+
assert_match %r{(Sinatra doesn’t know this ditty.|<h1>Not Found</h1>)}, body
|
1463
1556
|
end
|
1464
1557
|
|
1465
1558
|
should 'render a custom NotFound page' do
|
@@ -1510,6 +1603,18 @@ class TestRouting < Test::Unit::TestCase
|
|
1510
1603
|
assert_equal "/paginate/10", body
|
1511
1604
|
end
|
1512
1605
|
|
1606
|
+
should 'accept :map and :parent' do
|
1607
|
+
mock_app do
|
1608
|
+
controller :posts do
|
1609
|
+
get :show, :parent => :users, :map => "posts/:id" do
|
1610
|
+
"#{params[:user_id]}-#{params[:id]}"
|
1611
|
+
end
|
1612
|
+
end
|
1613
|
+
end
|
1614
|
+
get '/users/123/posts/321'
|
1615
|
+
assert_equal "123-321", body
|
1616
|
+
end
|
1617
|
+
|
1513
1618
|
should 'change params in current_path' do
|
1514
1619
|
mock_app do
|
1515
1620
|
get :index, :map => "/paginate/:page" do
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: padrino-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 51
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 10
|
9
|
+
- 2
|
10
|
+
version: 0.10.2
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Padrino Team
|
@@ -13,7 +18,7 @@ autorequire:
|
|
13
18
|
bindir: bin
|
14
19
|
cert_chain: []
|
15
20
|
|
16
|
-
date: 2011-08-
|
21
|
+
date: 2011-08-31 00:00:00 -07:00
|
17
22
|
default_executable:
|
18
23
|
dependencies:
|
19
24
|
- !ruby/object:Gem::Dependency
|
@@ -24,6 +29,11 @@ dependencies:
|
|
24
29
|
requirements:
|
25
30
|
- - ~>
|
26
31
|
- !ruby/object:Gem::Version
|
32
|
+
hash: 27
|
33
|
+
segments:
|
34
|
+
- 1
|
35
|
+
- 3
|
36
|
+
- 0
|
27
37
|
version: 1.3.0
|
28
38
|
type: :runtime
|
29
39
|
version_requirements: *id001
|
@@ -35,6 +45,11 @@ dependencies:
|
|
35
45
|
requirements:
|
36
46
|
- - ~>
|
37
47
|
- !ruby/object:Gem::Version
|
48
|
+
hash: 19
|
49
|
+
segments:
|
50
|
+
- 1
|
51
|
+
- 2
|
52
|
+
- 6
|
38
53
|
version: 1.2.6
|
39
54
|
type: :runtime
|
40
55
|
version_requirements: *id002
|
@@ -46,7 +61,12 @@ dependencies:
|
|
46
61
|
requirements:
|
47
62
|
- - ~>
|
48
63
|
- !ruby/object:Gem::Version
|
49
|
-
|
64
|
+
hash: 51
|
65
|
+
segments:
|
66
|
+
- 0
|
67
|
+
- 10
|
68
|
+
- 2
|
69
|
+
version: 0.10.2
|
50
70
|
type: :runtime
|
51
71
|
version_requirements: *id003
|
52
72
|
- !ruby/object:Gem::Dependency
|
@@ -57,6 +77,11 @@ dependencies:
|
|
57
77
|
requirements:
|
58
78
|
- - ~>
|
59
79
|
- !ruby/object:Gem::Version
|
80
|
+
hash: 33
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
- 14
|
84
|
+
- 3
|
60
85
|
version: 0.14.3
|
61
86
|
type: :runtime
|
62
87
|
version_requirements: *id004
|
@@ -68,7 +93,12 @@ dependencies:
|
|
68
93
|
requirements:
|
69
94
|
- - ~>
|
70
95
|
- !ruby/object:Gem::Version
|
71
|
-
|
96
|
+
hash: 3
|
97
|
+
segments:
|
98
|
+
- 3
|
99
|
+
- 1
|
100
|
+
- 0
|
101
|
+
version: 3.1.0
|
72
102
|
type: :runtime
|
73
103
|
version_requirements: *id005
|
74
104
|
description: The Padrino core gem required for use of this framework
|
@@ -171,12 +201,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
171
201
|
requirements:
|
172
202
|
- - ">="
|
173
203
|
- !ruby/object:Gem::Version
|
204
|
+
hash: 3
|
205
|
+
segments:
|
206
|
+
- 0
|
174
207
|
version: "0"
|
175
208
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
209
|
none: false
|
177
210
|
requirements:
|
178
211
|
- - ">="
|
179
212
|
- !ruby/object:Gem::Version
|
213
|
+
hash: 23
|
214
|
+
segments:
|
215
|
+
- 1
|
216
|
+
- 3
|
217
|
+
- 6
|
180
218
|
version: 1.3.6
|
181
219
|
requirements: []
|
182
220
|
|