padrino-core 0.9.14 → 0.9.15
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/bin/padrino +3 -20
- data/lib/padrino-core.rb +6 -3
- data/lib/padrino-core/application/routing.rb +50 -37
- data/lib/padrino-core/cli/base.rb +21 -2
- data/lib/padrino-core/cli/rake.rb +2 -1
- data/lib/padrino-core/loader.rb +49 -5
- data/lib/padrino-core/locale/nl.yml +30 -0
- data/lib/padrino-core/locale/pl.yml +30 -0
- data/lib/padrino-core/reloader.rb +4 -17
- data/lib/padrino-core/router.rb +2 -2
- data/lib/padrino-core/support_lite.rb +9 -4
- data/lib/padrino-core/version.rb +2 -2
- data/padrino-core.gemspec +18 -10
- data/test/fixtures/dependencies/a.rb +7 -2
- data/test/fixtures/dependencies/b.rb +3 -3
- data/test/fixtures/dependencies/d.rb +4 -0
- data/test/test_application.rb +1 -1
- data/test/test_dependencies.rb +14 -9
- data/test/test_mounter.rb +1 -1
- data/test/test_rendering.rb +0 -1
- data/test/test_routing.rb +64 -6
- metadata +19 -112
data/LICENSE
CHANGED
@@ -17,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
17
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
18
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
19
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/bin/padrino
CHANGED
@@ -1,25 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require 'rubygems' unless defined?(Gem)
|
2
|
+
require 'rubygems' unless defined?(Gem) # Useful only on --dev mode
|
3
3
|
|
4
|
-
# We load Padrino libs
|
5
4
|
padrino_core_path = File.expand_path('../../lib', __FILE__)
|
6
5
|
$:.unshift(padrino_core_path) if File.directory?(padrino_core_path) && !$:.include?(padrino_core_path)
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
ARGV.shift
|
11
|
-
begin
|
12
|
-
# We try to load the vendored padrino-gen if exist
|
13
|
-
padrino_gen_path = File.expand_path('../../../padrino-gen/lib', __FILE__)
|
14
|
-
$:.unshift(padrino_gen_path) if File.directory?(padrino_gen_path) && !$:.include?(padrino_gen_path)
|
15
|
-
require 'padrino-core/command'
|
16
|
-
require 'padrino-gen/command'
|
17
|
-
Padrino.bin_gen(ARGV)
|
18
|
-
rescue
|
19
|
-
puts "<= You need padrino-gen! Run: gem install padrino-gen"
|
20
|
-
end
|
21
|
-
else
|
22
|
-
# We load our cli
|
23
|
-
require 'padrino-core/cli/base'
|
24
|
-
Padrino::Cli::Base.start(ARGV)
|
25
|
-
end
|
7
|
+
require 'padrino-core/cli/base'
|
8
|
+
Padrino::Cli::Base.start(ARGV)
|
data/lib/padrino-core.rb
CHANGED
@@ -44,11 +44,14 @@ module Padrino
|
|
44
44
|
end
|
45
45
|
|
46
46
|
##
|
47
|
-
# Default encoding to UTF8
|
47
|
+
# Default encoding to UTF8.
|
48
48
|
#
|
49
49
|
def set_encoding
|
50
|
-
|
51
|
-
$KCODE
|
50
|
+
if RUBY_VERSION < '1.9'
|
51
|
+
$KCODE='u'
|
52
|
+
else
|
53
|
+
Encoding.default_external = Encoding::UTF_8
|
54
|
+
Encoding.default_internal = Encoding::UTF_8
|
52
55
|
end
|
53
56
|
nil
|
54
57
|
end
|
@@ -12,19 +12,38 @@ module Padrino
|
|
12
12
|
module Routing
|
13
13
|
CONTENT_TYPE_ALIASES = { :htm => :html }
|
14
14
|
|
15
|
-
class ::HttpRouter
|
16
|
-
attr_accessor :
|
17
|
-
|
15
|
+
class ::HttpRouter #:nodoc:
|
16
|
+
attr_accessor :runner
|
17
|
+
class Route #:nodoc:
|
18
|
+
attr_accessor :custom_conditions, :before_filters, :after_filters, :use_layout, :controller
|
19
|
+
|
20
|
+
def process_arbitrary_blocks(blocks)
|
21
|
+
blocks.each { |blk| arbitrary { |env| router.runner.instance_eval(&blk) != false } } if blocks
|
22
|
+
end
|
18
23
|
|
19
|
-
|
20
|
-
|
24
|
+
def before_filters=(before_filters)
|
25
|
+
process_arbitrary_blocks(before_filters)
|
26
|
+
@before_filters = before_filters
|
27
|
+
end
|
21
28
|
|
22
|
-
|
23
|
-
|
29
|
+
def custom_conditions=(custom_conditions)
|
30
|
+
process_arbitrary_blocks(custom_conditions)
|
31
|
+
@custom_conditions = custom_conditions
|
32
|
+
end
|
24
33
|
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module ::Sinatra #:nodoc:
|
37
|
+
class Request #:nodoc:
|
38
|
+
attr_accessor :match
|
25
39
|
|
26
|
-
|
27
|
-
|
40
|
+
def controller
|
41
|
+
route && route.controller
|
42
|
+
end
|
43
|
+
|
44
|
+
def route
|
45
|
+
match.matched? ? match.path.route : nil
|
46
|
+
end
|
28
47
|
end
|
29
48
|
end
|
30
49
|
|
@@ -140,13 +159,11 @@ module Padrino
|
|
140
159
|
#
|
141
160
|
# ==== Examples
|
142
161
|
#
|
143
|
-
# router.add('/greedy
|
162
|
+
# router.add('/greedy/:greed')
|
144
163
|
# router.recognize('/simple')
|
145
164
|
#
|
146
165
|
def router
|
147
|
-
|
148
|
-
@router = HttpRouter.new
|
149
|
-
end
|
166
|
+
@router ||= HttpRouter.new
|
150
167
|
block_given? ? yield(@router) : @router
|
151
168
|
end
|
152
169
|
alias :urls :router
|
@@ -227,14 +244,19 @@ module Padrino
|
|
227
244
|
invoke_hook(:route_added, verb, path, block)
|
228
245
|
|
229
246
|
# HTTPRouter route construction
|
230
|
-
route =
|
247
|
+
route = case path
|
248
|
+
when Regexp
|
249
|
+
router.add('/?*').match_path(path)
|
250
|
+
else
|
251
|
+
router.add(path)
|
252
|
+
end
|
253
|
+
|
231
254
|
route.name(name) if name
|
232
255
|
route.send(verb.downcase.to_sym)
|
233
256
|
route.host(options.delete(:host)) if options.key?(:host)
|
257
|
+
route.condition(:user_agent => options.delete(:agent)) if options.key?(:agent)
|
234
258
|
route.default_values = options.delete(:default_values)
|
235
259
|
|
236
|
-
route.to(block)
|
237
|
-
|
238
260
|
# Add Sinatra conditions
|
239
261
|
options.each { |option, args| send(option, *args) }
|
240
262
|
conditions, @conditions = @conditions, []
|
@@ -251,9 +273,15 @@ module Padrino
|
|
251
273
|
route.after_filters = []
|
252
274
|
end
|
253
275
|
|
276
|
+
route.to(block)
|
277
|
+
|
254
278
|
route
|
255
279
|
end
|
256
280
|
|
281
|
+
def current_controller
|
282
|
+
@_controller && @_controller.last
|
283
|
+
end
|
284
|
+
|
257
285
|
##
|
258
286
|
# Returns the final parsed route details (modified to reflect all Padrino options)
|
259
287
|
# given the raw route. Raw route passed in could be a named alias or a string and
|
@@ -273,18 +301,6 @@ module Padrino
|
|
273
301
|
end
|
274
302
|
|
275
303
|
if path.kind_of?(String) # path i.e "/index" or "/show"
|
276
|
-
# Backwards compatability
|
277
|
-
|
278
|
-
if path == '(/)'
|
279
|
-
path = '/'
|
280
|
-
warn "WARNING! #{Padrino.first_caller}: #{verb} (/) is deprecated, simply use / instead" if verb != "HEAD"
|
281
|
-
end
|
282
|
-
|
283
|
-
if path =~ /\(\/\)$/
|
284
|
-
path.gsub(/\(\/\)$/, '/?')
|
285
|
-
warn "WARNING! #{Padrino.first_caller}: #{verb} (/) is deprecated, simply use /? instead" if verb != "HEAD"
|
286
|
-
end
|
287
|
-
|
288
304
|
# Now we need to parse our 'with' params
|
289
305
|
if with_params = options.delete(:with)
|
290
306
|
path = process_path_for_with_params(path, with_params)
|
@@ -345,7 +361,7 @@ module Padrino
|
|
345
361
|
# Used for calculating path in route method
|
346
362
|
#
|
347
363
|
def process_path_for_parent_params(path, parent_params)
|
348
|
-
parent_prefix = parent_params.uniq.collect { |param| "#{param}/:#{param}_id" }.join("/")
|
364
|
+
parent_prefix = parent_params.flatten.uniq.collect { |param| "#{param}/:#{param}_id" }.join("/")
|
349
365
|
File.join(parent_prefix, path)
|
350
366
|
end
|
351
367
|
|
@@ -450,20 +466,17 @@ module Padrino
|
|
450
466
|
# Compatibility with http_router
|
451
467
|
#
|
452
468
|
def route!(base=self.class, pass_block=nil)
|
469
|
+
base.router.runner = self
|
453
470
|
if base.router and match = base.router.recognize(@request)
|
454
471
|
if !match.matched?
|
455
|
-
route_eval
|
456
|
-
match.headers.each{|k,v| response[k] = v}
|
472
|
+
route_eval do
|
473
|
+
match.headers.each {|k,v| response[k] = v}
|
457
474
|
status match.status
|
458
|
-
|
475
|
+
end
|
459
476
|
elsif match
|
460
477
|
@block_params = match.params
|
461
478
|
(@params ||= {}).merge!(match.params_as_hash)
|
462
479
|
pass_block = catch(:pass) do
|
463
|
-
# Run Sinatra Conditions
|
464
|
-
match.path.route.custom_conditions.each { |cond| throw :pass if instance_eval(&cond) == false }
|
465
|
-
# Run scoped before filters
|
466
|
-
match.path.route.before_filters.each { |bef| throw :pass if instance_eval(&bef) == false }
|
467
480
|
# If present set current controller layout
|
468
481
|
parent_layout = base.instance_variable_get(:@layout)
|
469
482
|
base.instance_variable_set(:@layout, match.path.route.use_layout) if match.path.route.use_layout
|
@@ -483,7 +496,7 @@ module Padrino
|
|
483
496
|
|
484
497
|
# Run routes defined in superclass.
|
485
498
|
if base.superclass.respond_to?(:router)
|
486
|
-
route!
|
499
|
+
route!(base.superclass, pass_block)
|
487
500
|
return
|
488
501
|
end
|
489
502
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'thor'
|
3
2
|
|
4
3
|
module Padrino
|
@@ -63,6 +62,26 @@ module Padrino
|
|
63
62
|
IRB.start
|
64
63
|
end
|
65
64
|
|
65
|
+
desc "generate", "Executes the Padrino generator with given options."
|
66
|
+
def generate(*args)
|
67
|
+
# Build Padrino g as an alias of padrino-gen
|
68
|
+
begin
|
69
|
+
# We try to load the vendored padrino-gen if exist
|
70
|
+
padrino_gen_path = File.expand_path('../../../../../padrino-gen/lib', __FILE__)
|
71
|
+
$:.unshift(padrino_gen_path) if File.directory?(padrino_gen_path) && !$:.include?(padrino_gen_path)
|
72
|
+
require 'padrino-core/command'
|
73
|
+
require 'padrino-gen/command'
|
74
|
+
ARGV.shift
|
75
|
+
Padrino.bin_gen(ARGV)
|
76
|
+
rescue
|
77
|
+
puts "<= You need padrino-gen! Run: gem install padrino-gen"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
desc "g", "Executes the Padrino generator with given options."
|
81
|
+
alias :g :generate
|
82
|
+
desc "gen", "Executes the Padrino generator with given options."
|
83
|
+
alias :gen :generate
|
84
|
+
|
66
85
|
desc "version", "Show current Padrino Version"
|
67
86
|
map "-v" => :version, "--version" => :version
|
68
87
|
def version
|
@@ -86,7 +105,7 @@ module Padrino
|
|
86
105
|
end
|
87
106
|
|
88
107
|
protected
|
89
|
-
def self.banner(task)
|
108
|
+
def self.banner(task=nil, *args)
|
90
109
|
"padrino #{task.name}"
|
91
110
|
end
|
92
111
|
|
@@ -4,9 +4,10 @@ Rake.application.instance_variable_set(:@rakefile, __FILE__)
|
|
4
4
|
|
5
5
|
module PadrinoTasks
|
6
6
|
def self.init
|
7
|
-
Padrino::Tasks.files.flatten.uniq.each { |ext| load(ext) }
|
7
|
+
Padrino::Tasks.files.flatten.uniq.each { |ext| load(ext) rescue puts "<= Failed load #{ext}" } unless @_init
|
8
8
|
Rake.application.init
|
9
9
|
Rake.application.top_level
|
10
|
+
@_init = true
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
data/lib/padrino-core/loader.rb
CHANGED
@@ -1,5 +1,38 @@
|
|
1
1
|
module Padrino
|
2
2
|
class << self
|
3
|
+
|
4
|
+
##
|
5
|
+
# Hooks to be called before a load/reload
|
6
|
+
#
|
7
|
+
# ==== Examples
|
8
|
+
#
|
9
|
+
# before_load do
|
10
|
+
# pre_initialize_something
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
#
|
14
|
+
def before_load(&block)
|
15
|
+
@_before_load ||= []
|
16
|
+
@_before_load << Proc.new(&block) if block_given?
|
17
|
+
@_before_load
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Hooks to be called after a load/reload
|
22
|
+
#
|
23
|
+
# ==== Examples
|
24
|
+
#
|
25
|
+
# after_load do
|
26
|
+
# DataMapper.finalize
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
#
|
30
|
+
def after_load(&block)
|
31
|
+
@_after_load ||= []
|
32
|
+
@_after_load << Proc.new(&block) if block_given?
|
33
|
+
@_after_load
|
34
|
+
end
|
35
|
+
|
3
36
|
##
|
4
37
|
# Requires necessary dependencies as well as application files from root lib and models
|
5
38
|
#
|
@@ -8,9 +41,11 @@ module Padrino
|
|
8
41
|
@_called_from = first_caller
|
9
42
|
set_encoding
|
10
43
|
set_load_paths(*load_paths) # We set the padrino load paths
|
44
|
+
Padrino.logger # Initialize our logger
|
45
|
+
before_load.each { |bl| bl.call } # Run before hooks
|
11
46
|
dependency_paths.each { |path| require_dependency(path) }
|
12
47
|
Reloader::Stat.run! # We need to fill our Stat::CACHE
|
13
|
-
|
48
|
+
after_load.each { |al| al.call } # Run after hooks
|
14
49
|
Thread.current[:padrino_loaded] = true
|
15
50
|
end
|
16
51
|
|
@@ -18,7 +53,9 @@ module Padrino
|
|
18
53
|
# Method for reloading required applications and their files
|
19
54
|
#
|
20
55
|
def reload!
|
56
|
+
before_load.each { |bl| bl.call } # Run before hooks
|
21
57
|
Reloader::Stat.reload! # detects the modified files
|
58
|
+
after_load.each { |al| al.call } # Run after hooks
|
22
59
|
end
|
23
60
|
|
24
61
|
##
|
@@ -53,12 +90,13 @@ module Padrino
|
|
53
90
|
# With +require_dependencies+ we don't have this problem.
|
54
91
|
#
|
55
92
|
# ==== Examples
|
93
|
+
#
|
56
94
|
# # For require all our app libs we need to do:
|
57
95
|
# require_dependencies("#{Padrino.root}/lib/**/*.rb")
|
58
96
|
#
|
59
97
|
def require_dependencies(*paths)
|
60
98
|
# Extract all files to load
|
61
|
-
files = paths.map { |path| Dir[path] }.flatten
|
99
|
+
files = paths.map { |path| Dir[path] }.flatten.uniq.sort
|
62
100
|
|
63
101
|
while files.present?
|
64
102
|
# We need a size to make sure things are loading
|
@@ -72,9 +110,14 @@ module Padrino
|
|
72
110
|
begin
|
73
111
|
Reloader::Stat.safe_load(file)
|
74
112
|
files.delete(file)
|
75
|
-
rescue
|
113
|
+
rescue LoadError => e
|
76
114
|
errors << e
|
77
|
-
failed <<
|
115
|
+
failed << file
|
116
|
+
rescue NameError => e
|
117
|
+
errors << e
|
118
|
+
failed << file
|
119
|
+
rescue Exception => e
|
120
|
+
raise e
|
78
121
|
end
|
79
122
|
end
|
80
123
|
|
@@ -99,6 +142,7 @@ module Padrino
|
|
99
142
|
|
100
143
|
##
|
101
144
|
# Appends custom dependency patterns to the be loaded for Padrino
|
145
|
+
#
|
102
146
|
# ==== Examples
|
103
147
|
# Padrino.custom_dependencies("#{Padrino.root}/foo/bar/*.rb")
|
104
148
|
#
|
@@ -126,4 +170,4 @@ module Padrino
|
|
126
170
|
$:.uniq!
|
127
171
|
end
|
128
172
|
end # self
|
129
|
-
end # Padrino
|
173
|
+
end # Padrino
|
@@ -0,0 +1,30 @@
|
|
1
|
+
nl:
|
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: "%d-%m-%Y"
|
8
|
+
short: "%d %b"
|
9
|
+
long: "%d %B %Y"
|
10
|
+
|
11
|
+
day_names: [zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag]
|
12
|
+
abbr_day_names: [zo, ma, di, wo, do, vr, za]
|
13
|
+
month_names: [~, januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november]
|
14
|
+
abbr_month_names: [~, jan, feb, maa, apr, mei, jun, jul, aug, sep, okt, nov, dec]
|
15
|
+
order: [ :day, :month, :year ]
|
16
|
+
|
17
|
+
time:
|
18
|
+
formats:
|
19
|
+
default: "%a %d %b %Y %H:%M:%S %z"
|
20
|
+
short: "%d %b %H:%M"
|
21
|
+
long: "%d %B %Y %H:%M"
|
22
|
+
am: "am"
|
23
|
+
pm: "pm"
|
24
|
+
|
25
|
+
# Used in array.to_sentence.
|
26
|
+
support:
|
27
|
+
array:
|
28
|
+
words_connector: ", "
|
29
|
+
two_words_connector: " en "
|
30
|
+
last_word_connector: " en "
|
@@ -0,0 +1,30 @@
|
|
1
|
+
pl:
|
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: "%d %b"
|
9
|
+
long: "%d %B %Y"
|
10
|
+
|
11
|
+
day_names: [Niedziela, Poniedziałek, Wtorek, Środa, Czwartek, Piątek, Sobota]
|
12
|
+
abbr_day_names: [nie, pon, wto, śro, czw, pia, sob]
|
13
|
+
month_names: [~, Styczeń, Luty, Marzec, Kwiecień, Maj, Czerwiec, Lipiec, Sierpień, Wrzesień, Październik, Listopad, Grudzień]
|
14
|
+
abbr_month_names: [~, sty, lut, mar, kwi, maj, cze, lip, sie, wrz, paź, lis, gru]
|
15
|
+
order: [ :year, :month, :day ]
|
16
|
+
|
17
|
+
time:
|
18
|
+
formats:
|
19
|
+
default: "%a, %d %b %Y, %H:%M:%S %z"
|
20
|
+
short: "%d %b, %H:%M"
|
21
|
+
long: "%d %B %Y, %H:%M"
|
22
|
+
am: "przed południem"
|
23
|
+
pm: "po południu"
|
24
|
+
|
25
|
+
# Used in array.to_sentence.
|
26
|
+
support:
|
27
|
+
array:
|
28
|
+
words_connector: ", "
|
29
|
+
two_words_connector: " i "
|
30
|
+
last_word_connector: " i "
|
@@ -189,23 +189,10 @@ module Padrino
|
|
189
189
|
##
|
190
190
|
# Removes the specified class and constant.
|
191
191
|
#
|
192
|
-
# Additionally this removes the specified class from the subclass list of every superclass that
|
193
|
-
# tracks it's subclasses in an array returned by _subclasses_list. Classes that wish to use this
|
194
|
-
# functionality are required to alias the reader for their list of subclasses
|
195
|
-
# to _subclasses_list. Plugins for ORMs and other libraries should keep this in mind.
|
196
|
-
#
|
197
192
|
def remove_constant(const)
|
198
193
|
return if Padrino::Reloader.exclude_constants.any? { |base| (const.to_s =~ /^#{base}/ || const.superclass.to_s =~ /^#{base}/) } &&
|
199
194
|
!Padrino::Reloader.include_constants.any? { |base| (const.to_s =~ /^#{base}/ || const.superclass.to_s =~ /^#{base}/) }
|
200
195
|
|
201
|
-
superklass = const
|
202
|
-
until (superklass = superklass.superclass).nil?
|
203
|
-
if superklass.respond_to?(:_subclasses_list)
|
204
|
-
superklass.send(:_subclasses_list).delete(klass)
|
205
|
-
superklass.send(:_subclasses_list).delete(klass.to_s)
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
196
|
parts = const.to_s.split("::")
|
210
197
|
base = parts.size == 1 ? Object : Object.full_const_get(parts[0..-2].join("::"))
|
211
198
|
object = parts[-1].to_s
|
@@ -221,11 +208,11 @@ module Padrino
|
|
221
208
|
# Searches Ruby files in your +Padrino.root+ and monitors them for any changes.
|
222
209
|
#
|
223
210
|
def rotation
|
224
|
-
paths
|
225
|
-
|
226
|
-
files
|
211
|
+
paths = Dir[Padrino.root("*")].unshift(Padrino.root).
|
212
|
+
reject { |path| Padrino::Reloader.exclude.include?(path) || !File.directory?(path) }
|
213
|
+
files = paths.map { |path| Dir["#{path}/**/*.rb"] }.flatten.uniq
|
227
214
|
|
228
|
-
files.map{ |file|
|
215
|
+
files.map { |file|
|
229
216
|
next if Padrino::Reloader.exclude.any? { |base| file =~ /^#{base}/ }
|
230
217
|
|
231
218
|
found, stat = figure_path(file, paths)
|
data/lib/padrino-core/router.rb
CHANGED
@@ -38,7 +38,7 @@ module Padrino
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def sort!
|
41
|
-
@mapping = @mapping.sort_by { |h, p, m, a|
|
41
|
+
@mapping = @mapping.sort_by { |h, p, m, a| -p.size }
|
42
42
|
end
|
43
43
|
|
44
44
|
def map(options={})
|
@@ -76,4 +76,4 @@ module Padrino
|
|
76
76
|
[404, {"Content-Type" => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{rPath}"]]
|
77
77
|
end
|
78
78
|
end
|
79
|
-
end
|
79
|
+
end
|
@@ -49,6 +49,11 @@ if defined?(ActiveSupport::CoreExtensions::Hash) && !Hash.method_defined?(:slice
|
|
49
49
|
include ActiveSupport::CoreExtensions::Hash::DeepMerge
|
50
50
|
include ActiveSupport::CoreExtensions::Hash::ReverseMerge
|
51
51
|
include ActiveSupport::CoreExtensions::Hash::Slice
|
52
|
+
|
53
|
+
def ordered_collect(&block)
|
54
|
+
keys = self.stringify_keys.keys.sort
|
55
|
+
keys.collect { |key| block.call(key, self[key.to_sym]) }
|
56
|
+
end
|
52
57
|
end
|
53
58
|
end
|
54
59
|
|
@@ -62,7 +67,7 @@ module ObjectSpace
|
|
62
67
|
# Returns all the classes in the object space.
|
63
68
|
def classes
|
64
69
|
klasses = []
|
65
|
-
ObjectSpace.each_object(Class)
|
70
|
+
ObjectSpace.each_object(Class) { |o| klasses << o }
|
66
71
|
klasses
|
67
72
|
end
|
68
73
|
end
|
@@ -86,14 +91,14 @@ end unless Object.method_defined?(:full_const_get)
|
|
86
91
|
class FileSet
|
87
92
|
# Iterates over every file in the glob pattern and yields to a block
|
88
93
|
# Returns the list of files matching the glob pattern
|
89
|
-
# FileSet.
|
94
|
+
# FileSet.glob('padrino-core/application/*.rb', __FILE__) { |file| load file }
|
90
95
|
def self.glob(glob_pattern, file_path=nil, &block)
|
91
96
|
glob_pattern = File.join(File.dirname(file_path), glob_pattern) if file_path
|
92
97
|
file_list = Dir.glob(glob_pattern).sort
|
93
98
|
file_list.each { |file| block.call(file) }
|
94
99
|
file_list
|
95
100
|
end
|
96
|
-
|
101
|
+
|
97
102
|
# Requires each file matched in the glob pattern into the application
|
98
103
|
# FileSet.glob_require('padrino-core/application/*.rb', __FILE__)
|
99
104
|
def self.glob_require(glob_pattern, file_path=nil)
|
@@ -104,4 +109,4 @@ end unless defined?(FileSet)
|
|
104
109
|
##
|
105
110
|
# Loads our locales configuration files
|
106
111
|
#
|
107
|
-
I18n.load_path += Dir["#{File.dirname(__FILE__)}/locale/*.yml"] if defined?(I18n)
|
112
|
+
I18n.load_path += Dir["#{File.dirname(__FILE__)}/locale/*.yml"] if defined?(I18n)
|
data/lib/padrino-core/version.rb
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
# without include full padrino core.
|
6
6
|
#
|
7
7
|
module Padrino
|
8
|
-
VERSION = '0.9.
|
8
|
+
VERSION = '0.9.15' unless defined?(Padrino::VERSION)
|
9
9
|
##
|
10
10
|
# Return the current Padrino version
|
11
11
|
#
|
12
12
|
def self.version
|
13
13
|
VERSION
|
14
14
|
end
|
15
|
-
end # Padrino
|
15
|
+
end # Padrino
|
data/padrino-core.gemspec
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
require File.expand_path("../lib/padrino-core/version.rb", __FILE__)
|
2
|
-
require 'rubygems'
|
3
|
-
require 'bundler'
|
4
2
|
|
5
3
|
Gem::Specification.new do |s|
|
6
4
|
s.name = "padrino-core"
|
7
5
|
s.rubyforge_project = "padrino-core"
|
8
6
|
s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
|
9
|
-
s.email =
|
10
|
-
s.summary =
|
11
|
-
s.homepage = "http://
|
12
|
-
s.description =
|
13
|
-
s.default_executable =
|
7
|
+
s.email = "padrinorb@gmail.com"
|
8
|
+
s.summary = "The required Padrino core gem"
|
9
|
+
s.homepage = "http://www.padrinorb.com"
|
10
|
+
s.description = "The Padrino core gem required for use of this framework"
|
11
|
+
s.default_executable = "padrino"
|
14
12
|
s.executables = ["padrino"]
|
15
13
|
s.required_rubygems_version = ">= 1.3.6"
|
16
14
|
s.version = Padrino.version
|
@@ -18,6 +16,16 @@ Gem::Specification.new do |s|
|
|
18
16
|
s.extra_rdoc_files = Dir["*.rdoc"]
|
19
17
|
s.files = %w(.document .gitignore LICENSE README.rdoc Rakefile padrino-core.gemspec) + Dir.glob("{bin,lib,test}/**/*")
|
20
18
|
s.rdoc_options = ["--charset=UTF-8"]
|
21
|
-
s.require_path =
|
22
|
-
s.
|
23
|
-
|
19
|
+
s.require_path = "lib"
|
20
|
+
s.add_dependency("sinatra", ">= 1.0.0")
|
21
|
+
s.add_dependency("http_router", ">= 0.3.13")
|
22
|
+
s.add_dependency("thor", ">= 0.13.0")
|
23
|
+
# If you want try our test on AS edge.
|
24
|
+
# $ AS=edge rake test
|
25
|
+
if ENV['AS'] == "edge"
|
26
|
+
s.add_dependency("activesupport", ">= 3.0.0.beta4")
|
27
|
+
s.add_dependency("tzinfo")
|
28
|
+
else
|
29
|
+
s.add_dependency("activesupport", ">= 2.3.8")
|
30
|
+
end
|
31
|
+
end
|
@@ -1,4 +1,9 @@
|
|
1
|
-
|
1
|
+
# This file will be safe loaded three times.
|
2
|
+
# The first one fail because B and C constant are not defined
|
3
|
+
# The second one file because B requires C constant so will not be loaded
|
4
|
+
# The third one B and C are defined
|
2
5
|
|
3
6
|
# But here we need some of b.rb
|
4
|
-
A_result = [B,
|
7
|
+
A_result = [B, C]
|
8
|
+
|
9
|
+
A = "A"
|
data/test/test_application.rb
CHANGED
data/test/test_dependencies.rb
CHANGED
@@ -1,14 +1,20 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
2
2
|
|
3
3
|
class TestDependencies < Test::Unit::TestCase
|
4
|
-
context 'when we require a dependency that have another
|
4
|
+
context 'when we require a dependency that have another dependency' do
|
5
5
|
|
6
|
-
should 'raise an error without
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
should 'raise an error without reloading it twice' do
|
7
|
+
silence_warnings do
|
8
|
+
assert_raise(RuntimeError) do
|
9
|
+
Padrino.require_dependencies(
|
10
|
+
Padrino.root("fixtures/dependencies/a.rb"),
|
11
|
+
Padrino.root("fixtures/dependencies/b.rb"),
|
12
|
+
Padrino.root("fixtures/dependencies/c.rb"),
|
13
|
+
Padrino.root("fixtures/dependencies/d.rb")
|
14
|
+
)
|
15
|
+
end
|
11
16
|
end
|
17
|
+
assert_equal 1, D
|
12
18
|
end
|
13
19
|
|
14
20
|
should 'resolve dependency problems' do
|
@@ -19,9 +25,8 @@ class TestDependencies < Test::Unit::TestCase
|
|
19
25
|
Padrino.root("fixtures/dependencies/c.rb")
|
20
26
|
)
|
21
27
|
end
|
22
|
-
assert_equal ["B", "
|
23
|
-
assert_equal
|
28
|
+
assert_equal ["B", "C"], A_result
|
29
|
+
assert_equal "C", B_result
|
24
30
|
end
|
25
31
|
end
|
26
|
-
|
27
32
|
end
|
data/test/test_mounter.rb
CHANGED
data/test/test_rendering.rb
CHANGED
data/test/test_routing.rb
CHANGED
@@ -27,6 +27,19 @@ class TestRouting < Test::Unit::TestCase
|
|
27
27
|
}
|
28
28
|
end
|
29
29
|
|
30
|
+
should 'accept regexp routes' do
|
31
|
+
mock_app do
|
32
|
+
get(%r{/fob|/baz}) { "regexp" }
|
33
|
+
get("/foo") { "str" }
|
34
|
+
end
|
35
|
+
get "/foo"
|
36
|
+
assert_equal "str", body
|
37
|
+
get "/fob"
|
38
|
+
assert_equal "regexp", body
|
39
|
+
get "/baz"
|
40
|
+
assert_equal "regexp", body
|
41
|
+
end
|
42
|
+
|
30
43
|
should "parse routes with question marks" do
|
31
44
|
mock_app do
|
32
45
|
get("/foo/?"){ "okey" }
|
@@ -53,6 +66,17 @@ class TestRouting < Test::Unit::TestCase
|
|
53
66
|
assert_equal "2", body
|
54
67
|
end
|
55
68
|
|
69
|
+
should "match user agents" do
|
70
|
+
app = mock_app do
|
71
|
+
get("/main", :agent => /IE/){ "hello IE" }
|
72
|
+
get("/main"){ "hello" }
|
73
|
+
end
|
74
|
+
get "/main"
|
75
|
+
assert_equal "hello", body
|
76
|
+
get "/main", {}, {'HTTP_USER_AGENT' => 'This is IE'}
|
77
|
+
assert_equal "hello IE", body
|
78
|
+
end
|
79
|
+
|
56
80
|
should "not generate overlapping head urls" do
|
57
81
|
app = mock_app do
|
58
82
|
get("/main"){ "hello" }
|
@@ -471,17 +495,19 @@ class TestRouting < Test::Unit::TestCase
|
|
471
495
|
mock_app do
|
472
496
|
controllers :project do
|
473
497
|
get(:index, :parent => :user) { "index #{params[:user_id]}" }
|
498
|
+
get(:index, :parent => [:user, :section]) { "index #{params[:user_id]} #{params[:section_id]}" }
|
474
499
|
get(:edit, :with => :id, :parent => :user) { "edit #{params[:id]} #{params[:user_id]}"}
|
475
500
|
get(:show, :with => :id, :parent => [:user, :product]) { "show #{params[:id]} #{params[:user_id]} #{params[:product_id]}"}
|
476
501
|
end
|
477
502
|
end
|
478
503
|
get "/user/1/project"
|
479
504
|
assert_equal "index 1", body
|
505
|
+
get "/user/1/section/3/project"
|
506
|
+
assert_equal "index 1 3", body
|
480
507
|
get "/user/1/project/edit/2"
|
481
508
|
assert_equal "edit 2 1", body
|
482
509
|
get "/user/1/product/2/project/show/3"
|
483
510
|
assert_equal "show 3 1 2", body
|
484
|
-
|
485
511
|
end
|
486
512
|
|
487
513
|
should "apply parent to controller" do
|
@@ -610,8 +636,8 @@ class TestRouting < Test::Unit::TestCase
|
|
610
636
|
assert_equal 'html', body
|
611
637
|
end
|
612
638
|
|
613
|
-
should 'allows custom route-conditions to be set via route options' do
|
614
|
-
protector = Module.new
|
639
|
+
should 'allows custom route-conditions to be set via route options and halt' do
|
640
|
+
protector = Module.new do
|
615
641
|
def protect(*args)
|
616
642
|
condition {
|
617
643
|
unless authorize(params["user"], params["password"])
|
@@ -619,7 +645,7 @@ class TestRouting < Test::Unit::TestCase
|
|
619
645
|
end
|
620
646
|
}
|
621
647
|
end
|
622
|
-
|
648
|
+
end
|
623
649
|
|
624
650
|
mock_app do
|
625
651
|
register protector
|
@@ -644,6 +670,39 @@ class TestRouting < Test::Unit::TestCase
|
|
644
670
|
assert_equal "hey", body
|
645
671
|
end
|
646
672
|
|
673
|
+
should 'allows custom route-conditions to be set via route options using two routes' do
|
674
|
+
protector = Module.new do
|
675
|
+
def protect(*args)
|
676
|
+
condition { authorize(params["user"], params["password"]) }
|
677
|
+
end
|
678
|
+
end
|
679
|
+
|
680
|
+
mock_app do
|
681
|
+
register protector
|
682
|
+
|
683
|
+
helpers do
|
684
|
+
def authorize(username, password)
|
685
|
+
username == "foo" && password == "bar"
|
686
|
+
end
|
687
|
+
end
|
688
|
+
|
689
|
+
get "/", :protect => true do
|
690
|
+
"hey"
|
691
|
+
end
|
692
|
+
|
693
|
+
get "/" do
|
694
|
+
"go away"
|
695
|
+
end
|
696
|
+
end
|
697
|
+
|
698
|
+
get "/"
|
699
|
+
assert_equal "go away", body
|
700
|
+
|
701
|
+
get "/", :user => "foo", :password => "bar"
|
702
|
+
assert ok?
|
703
|
+
assert_equal "hey", body
|
704
|
+
end
|
705
|
+
|
647
706
|
should 'scope filters in the given controller' do
|
648
707
|
mock_app do
|
649
708
|
before { @global = 'global' }
|
@@ -759,7 +818,6 @@ class TestRouting < Test::Unit::TestCase
|
|
759
818
|
post "/.json"
|
760
819
|
assert_equal "This is the post index.json", body
|
761
820
|
post "/.js"
|
762
|
-
assert_match "Sinatra doesn't know this ditty", body
|
763
821
|
assert_equal 404, status
|
764
822
|
end
|
765
823
|
|
@@ -859,4 +917,4 @@ class TestRouting < Test::Unit::TestCase
|
|
859
917
|
post @app.url(:posts, :create, :format => :js, :bar => 'bar', :baz => 'baz', :id => 5)
|
860
918
|
assert_equal "POST CREATE bar - baz - 5", body, "should properly post to create action"
|
861
919
|
end
|
862
|
-
end
|
920
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: padrino-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 37
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 15
|
10
|
+
version: 0.9.15
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Padrino Team
|
@@ -18,10 +18,12 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date: 2010-
|
21
|
+
date: 2010-08-28 00:00:00 +02:00
|
22
22
|
default_executable: padrino
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
25
|
+
name: sinatra
|
26
|
+
prerelease: false
|
25
27
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
28
|
none: false
|
27
29
|
requirements:
|
@@ -34,26 +36,26 @@ dependencies:
|
|
34
36
|
- 0
|
35
37
|
version: 1.0.0
|
36
38
|
type: :runtime
|
37
|
-
name: sinatra
|
38
|
-
prerelease: false
|
39
39
|
version_requirements: *id001
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
|
+
name: http_router
|
42
|
+
prerelease: false
|
41
43
|
requirement: &id002 !ruby/object:Gem::Requirement
|
42
44
|
none: false
|
43
45
|
requirements:
|
44
46
|
- - ">="
|
45
47
|
- !ruby/object:Gem::Version
|
46
|
-
hash:
|
48
|
+
hash: 9
|
47
49
|
segments:
|
48
50
|
- 0
|
49
51
|
- 3
|
50
|
-
-
|
51
|
-
version: 0.3.
|
52
|
+
- 13
|
53
|
+
version: 0.3.13
|
52
54
|
type: :runtime
|
53
|
-
name: http_router
|
54
|
-
prerelease: false
|
55
55
|
version_requirements: *id002
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
+
name: thor
|
58
|
+
prerelease: false
|
57
59
|
requirement: &id003 !ruby/object:Gem::Requirement
|
58
60
|
none: false
|
59
61
|
requirements:
|
@@ -66,10 +68,10 @@ dependencies:
|
|
66
68
|
- 0
|
67
69
|
version: 0.13.0
|
68
70
|
type: :runtime
|
69
|
-
name: thor
|
70
|
-
prerelease: false
|
71
71
|
version_requirements: *id003
|
72
72
|
- !ruby/object:Gem::Dependency
|
73
|
+
name: activesupport
|
74
|
+
prerelease: false
|
73
75
|
requirement: &id004 !ruby/object:Gem::Requirement
|
74
76
|
none: false
|
75
77
|
requirements:
|
@@ -82,105 +84,7 @@ dependencies:
|
|
82
84
|
- 8
|
83
85
|
version: 2.3.8
|
84
86
|
type: :runtime
|
85
|
-
name: activesupport
|
86
|
-
prerelease: false
|
87
87
|
version_requirements: *id004
|
88
|
-
- !ruby/object:Gem::Dependency
|
89
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
|
-
requirements:
|
92
|
-
- - ">="
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
hash: 49
|
95
|
-
segments:
|
96
|
-
- 0
|
97
|
-
- 8
|
98
|
-
- 7
|
99
|
-
version: 0.8.7
|
100
|
-
type: :development
|
101
|
-
name: rake
|
102
|
-
prerelease: false
|
103
|
-
version_requirements: *id005
|
104
|
-
- !ruby/object:Gem::Dependency
|
105
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
hash: 43
|
111
|
-
segments:
|
112
|
-
- 0
|
113
|
-
- 9
|
114
|
-
- 8
|
115
|
-
version: 0.9.8
|
116
|
-
type: :development
|
117
|
-
name: mocha
|
118
|
-
prerelease: false
|
119
|
-
version_requirements: *id006
|
120
|
-
- !ruby/object:Gem::Dependency
|
121
|
-
requirement: &id007 !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
|
-
requirements:
|
124
|
-
- - ">="
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
hash: 11
|
127
|
-
segments:
|
128
|
-
- 0
|
129
|
-
- 5
|
130
|
-
- 0
|
131
|
-
version: 0.5.0
|
132
|
-
type: :development
|
133
|
-
name: rack-test
|
134
|
-
prerelease: false
|
135
|
-
version_requirements: *id007
|
136
|
-
- !ruby/object:Gem::Dependency
|
137
|
-
requirement: &id008 !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
|
-
requirements:
|
140
|
-
- - ">="
|
141
|
-
- !ruby/object:Gem::Version
|
142
|
-
hash: 9
|
143
|
-
segments:
|
144
|
-
- 0
|
145
|
-
- 5
|
146
|
-
- 1
|
147
|
-
version: 0.5.1
|
148
|
-
type: :development
|
149
|
-
name: webrat
|
150
|
-
prerelease: false
|
151
|
-
version_requirements: *id008
|
152
|
-
- !ruby/object:Gem::Dependency
|
153
|
-
requirement: &id009 !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
|
-
requirements:
|
156
|
-
- - ">="
|
157
|
-
- !ruby/object:Gem::Version
|
158
|
-
hash: 43
|
159
|
-
segments:
|
160
|
-
- 2
|
161
|
-
- 2
|
162
|
-
- 22
|
163
|
-
version: 2.2.22
|
164
|
-
type: :development
|
165
|
-
name: haml
|
166
|
-
prerelease: false
|
167
|
-
version_requirements: *id009
|
168
|
-
- !ruby/object:Gem::Dependency
|
169
|
-
requirement: &id010 !ruby/object:Gem::Requirement
|
170
|
-
none: false
|
171
|
-
requirements:
|
172
|
-
- - ">="
|
173
|
-
- !ruby/object:Gem::Version
|
174
|
-
hash: 33
|
175
|
-
segments:
|
176
|
-
- 2
|
177
|
-
- 10
|
178
|
-
- 3
|
179
|
-
version: 2.10.3
|
180
|
-
type: :development
|
181
|
-
name: shoulda
|
182
|
-
prerelease: false
|
183
|
-
version_requirements: *id010
|
184
88
|
description: The Padrino core gem required for use of this framework
|
185
89
|
email: padrinorb@gmail.com
|
186
90
|
executables:
|
@@ -218,6 +122,8 @@ files:
|
|
218
122
|
- lib/padrino-core/locale/es.yml
|
219
123
|
- lib/padrino-core/locale/fr.yml
|
220
124
|
- lib/padrino-core/locale/it.yml
|
125
|
+
- lib/padrino-core/locale/nl.yml
|
126
|
+
- lib/padrino-core/locale/pl.yml
|
221
127
|
- lib/padrino-core/locale/pt_br.yml
|
222
128
|
- lib/padrino-core/locale/ru.yml
|
223
129
|
- lib/padrino-core/locale/tr.yml
|
@@ -235,6 +141,7 @@ files:
|
|
235
141
|
- test/fixtures/dependencies/a.rb
|
236
142
|
- test/fixtures/dependencies/b.rb
|
237
143
|
- test/fixtures/dependencies/c.rb
|
144
|
+
- test/fixtures/dependencies/d.rb
|
238
145
|
- test/helper.rb
|
239
146
|
- test/test_application.rb
|
240
147
|
- test/test_core.rb
|
@@ -248,7 +155,7 @@ files:
|
|
248
155
|
- test/test_routing.rb
|
249
156
|
- test/test_server.rb
|
250
157
|
has_rdoc: true
|
251
|
-
homepage: http://
|
158
|
+
homepage: http://www.padrinorb.com
|
252
159
|
licenses: []
|
253
160
|
|
254
161
|
post_install_message:
|