padrino-core 0.13.2 → 0.13.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 851c38a957c7a3b50110244d3b5eb5691091f845
4
- data.tar.gz: 131c5ba7f4a596a9079aab6d0571b7cc09eb408c
3
+ metadata.gz: 3a7babb0beba45716e2ff3af2f78dbc0f6a3e842
4
+ data.tar.gz: 1a047b4858de0f5c60d42a18289d824cc43b519d
5
5
  SHA512:
6
- metadata.gz: ae1ff61464492c25cbb92ee965631a3ed05430f51df3a5431cbd6763c39c4d262c5a9ca0ec92bb8661fe5c9194a8f912414771773b47d02f322a2a0e9fd46437
7
- data.tar.gz: 4b37b25021834707ed9b6c267345538b3a2073e428175fe4b0620e3825d167eb0c973ea058e58590e4f223272defb1ec4b254caca66a541d15ae8e0840b36e1d
6
+ metadata.gz: ea91c7f77ca7a01beefd69e03288619b142e64696e68ec36b860491dacf18561867b75b3334580841c2c3705b2bfca7bcc834b4834c1d2398402df279bed6549
7
+ data.tar.gz: dd67394786c89aa8f52584cc933a164e0a221c534de89c2189141797b5d6103abf79c542fe54e6aae55760333185b5de30a9aead6db67f56cef56280fdefa9f0
data/bin/padrino CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
- require 'bundler/setup' if %w(Gemfile .components).all? { |f| File.exist?(f) }
2
+ require 'padrino-core/cli/binstub'
3
+ Padrino.replace_with_binstub('padrino')
3
4
 
4
5
  padrino_core_path = File.expand_path('../../lib', __FILE__)
5
6
  $:.unshift(padrino_core_path) if File.directory?(padrino_core_path) && !$:.include?(padrino_core_path)
@@ -203,7 +203,7 @@ module Padrino
203
203
  # @since 0.10.8
204
204
  # @api public
205
205
  def redirect(url, *args)
206
- flashes = args.extract_options!
206
+ flashes = args.last.is_a?(Hash) ? args.pop : {}
207
207
 
208
208
  flashes.each do |type, message|
209
209
  message = I18n.translate(message) if message.is_a?(Symbol) && defined?(I18n)
@@ -1,9 +1,3 @@
1
- begin
2
- require 'active_support/core_ext/object/deep_dup' # AS 4.1
3
- rescue LoadError
4
- require 'active_support/core_ext/hash/deep_dup' # AS >= 3.1
5
- end
6
-
7
1
  module Padrino
8
2
  ##
9
3
  # Padrino application module providing means for mass-assignment protection.
@@ -45,7 +39,7 @@ module Padrino
45
39
  def params(*allowed_params)
46
40
  allowed_params = prepare_allowed_params(allowed_params)
47
41
  condition do
48
- @original_params = params.deep_dup
42
+ @original_params = Utils.deep_dup(params)
49
43
  filter_params!(params, allowed_params)
50
44
  end
51
45
  end
@@ -217,10 +217,11 @@ module Padrino
217
217
  # @see http://www.padrinorb.com/guides/controllers#route-filters
218
218
  #
219
219
  def construct_filter(*args, &block)
220
- options = args.extract_options!
220
+ options = args.last.is_a?(Hash) ? args.pop : {}
221
221
  if except = options.delete(:except)
222
222
  fail "You cannot use :except with other options specified" unless args.empty? && options.empty?
223
- options = Array(except).extract_options!
223
+ except = Array(except)
224
+ options = except.last.is_a?(Hash) ? except.pop : {}
224
225
  end
225
226
  Filter.new(!except, @_controller, options, Array(except || args), &block)
226
227
  end
@@ -337,7 +338,7 @@ module Padrino
337
338
  # url(:index, :fragment => 'comments')
338
339
  #
339
340
  def url(*args)
340
- params = args.extract_options!
341
+ params = args.last.is_a?(Hash) ? args.pop : {}
341
342
  fragment = params.delete(:fragment) || params.delete(:anchor)
342
343
  path = make_path_with_params(args, value_to_param(params.symbolize_keys))
343
344
  rebase_url(fragment ? path << '#' << fragment.to_s : path)
@@ -401,7 +402,7 @@ module Padrino
401
402
 
402
403
  # Saves controller options, yields the block, restores controller options.
403
404
  def with_new_options(*args)
404
- options = args.extract_options!
405
+ options = args.last.is_a?(Hash) ? args.pop : {}
405
406
 
406
407
  CONTROLLER_OPTIONS.each{ |key| replace_instance_variable("@_#{key}", options.delete(key)) }
407
408
  replace_instance_variable(:@_controller, args)
@@ -538,7 +539,7 @@ module Padrino
538
539
  route.default_values = defaults if defaults
539
540
  end
540
541
  options.delete_if do |option, captures|
541
- if route.significant_variable_names.include?(option)
542
+ if route.significant_variable_names.include?(option.to_s)
542
543
  route.capture[option] = Array(captures).first
543
544
  true
544
545
  end
@@ -579,6 +580,7 @@ module Padrino
579
580
  # controllers, parents, 'with' parameters, and other options.
580
581
  #
581
582
  def parse_route(path, options, verb)
583
+ path = path.dup if path.kind_of?(String)
582
584
  route_options = {}
583
585
 
584
586
  if options[:params] == true
@@ -926,6 +928,10 @@ module Padrino
926
928
  end
927
929
 
928
930
  def dispatch!
931
+ unless @params
932
+ @params = indifferent_params(@request.params)
933
+ force_encoding(@params)
934
+ end
929
935
  invoke do
930
936
  static! if settings.static? && (request.get? || request.head?)
931
937
  route!
@@ -977,7 +983,11 @@ module Padrino
977
983
  @route = request.route_obj = route
978
984
  captured_params = captures_from_params(params)
979
985
 
980
- @params.merge!(params) { |key, original, newval| original } unless params.empty?
986
+ # Should not overwrite params by given query
987
+ @params.merge!(params) do |key, original, newval|
988
+ @route.significant_variable_names.include?(key) ? newval : original
989
+ end unless params.empty?
990
+
981
991
  @params[:format] = params[:format] if params[:format]
982
992
  @params[:captures] = captured_params if !captured_params.empty? && route.path.is_a?(Regexp)
983
993
 
@@ -28,16 +28,20 @@ module Padrino
28
28
  def console(*args)
29
29
  prepare :console
30
30
  require File.expand_path("../../version", __FILE__)
31
- ARGV.clear
32
- require 'irb'
33
- begin
34
- require "irb/completion"
35
- rescue LoadError
36
- end
37
31
  require File.expand_path('config/boot.rb')
38
32
  puts "=> Loading #{Padrino.env} console (Padrino v.#{Padrino.version})"
39
33
  require File.expand_path('../console', __FILE__)
40
- IRB.start
34
+ ARGV.clear
35
+ if defined? Pry
36
+ Pry.start
37
+ else
38
+ require 'irb'
39
+ begin
40
+ require "irb/completion"
41
+ rescue LoadError
42
+ end
43
+ IRB.start
44
+ end
41
45
  end
42
46
 
43
47
  desc "generate", "Executes the Padrino generator with given options (alternatively use 'gen' or 'g')."
@@ -0,0 +1,27 @@
1
+ module Padrino
2
+ ##
3
+ # Replaces the current process with it's binstub.
4
+ #
5
+ def self.replace_with_binstub(executable)
6
+ begin
7
+ return if Bundler.definition.missing_specs.empty?
8
+ rescue NameError, NoMethodError
9
+ end
10
+
11
+ project_root = Dir.pwd
12
+ until project_root.empty?
13
+ break if File.file?(File.join(project_root, 'Gemfile'))
14
+ project_root = project_root.rpartition('/').first
15
+ end
16
+
17
+ if %w(Gemfile .components).all? { |file| File.file?(File.join(project_root, file)) }
18
+ binstub = File.join(project_root, 'bin', executable)
19
+ if File.file?(binstub)
20
+ exec Gem.ruby, binstub, *ARGV
21
+ else
22
+ puts 'Please run `bundler install --binstubs` from your project root to generate bundle-specific executables'
23
+ exit!
24
+ end
25
+ end
26
+ end
27
+ end
@@ -143,7 +143,8 @@ module Padrino
143
143
  # require_dependencies("#{Padrino.root}/lib/**/*.rb")
144
144
  #
145
145
  def require_dependencies(*paths)
146
- options = paths.extract_options!.merge( :cyclic => true )
146
+ options = (paths.last.is_a?(Hash) ? paths.pop : {}).merge( :cyclic => true )
147
+
147
148
  files = paths.flatten.flat_map{ |path| Dir.glob(path).sort_by{ |filename| filename.count('/') } }.uniq
148
149
 
149
150
  until files.empty?
@@ -55,7 +55,7 @@ module Padrino
55
55
  # Finds a path which is matched with conditions from arguments
56
56
  #
57
57
  def path(name, *args)
58
- params = args.extract_options!
58
+ params = args.last.is_a?(Hash) ? args.pop : {}
59
59
  candidates = @routes.select { |route| route.name == name }
60
60
  fail InvalidRouteException if candidates.empty?
61
61
  route = candidates.sort_by! { |route|
@@ -63,9 +63,9 @@ module Padrino
63
63
  def significant_variable_names
64
64
  @significant_variable_names ||=
65
65
  if @path.is_a?(String)
66
- @path.scan(SIGNIFICANT_VARIABLES_REGEX).map{ |p| p.last.to_sym }
66
+ @path.scan(SIGNIFICANT_VARIABLES_REGEX).map(&:last)
67
67
  elsif @path.is_a?(Regexp) and @path.respond_to?(:named_captures)
68
- @path.named_captures.keys.map(&:to_sym)
68
+ @path.named_captures.keys
69
69
  else
70
70
  []
71
71
  end
@@ -74,7 +74,7 @@ module Padrino
74
74
  #
75
75
  def lock!
76
76
  klasses = Storage.send(:object_classes) do |klass|
77
- original_klass_name = klass._orig_klass_name
77
+ original_klass_name = constant_name(klass)
78
78
  original_klass_name.split('::').first if original_klass_name
79
79
  end
80
80
  klasses |= Padrino.mounted_apps.map(&:app_class)
@@ -244,7 +244,7 @@ module Padrino
244
244
  # Tells if a constant should be excluded from Reloader routines.
245
245
  #
246
246
  def constant_excluded?(const)
247
- external_constant?(const) || (exclude_constants - include_constants).any?{ |excluded_constant| const._orig_klass_name.start_with?(excluded_constant) }
247
+ external_constant?(const) || (exclude_constants - include_constants).any?{ |excluded_constant| constant_name(const).start_with?(excluded_constant) }
248
248
  end
249
249
 
250
250
  ##
@@ -310,5 +310,11 @@ module Padrino
310
310
  ensure
311
311
  $-v = verbosity_level
312
312
  end
313
+
314
+ def constant_name(constant)
315
+ constant._orig_klass_name
316
+ rescue NoMethodError
317
+ constant.name
318
+ end
313
319
  end
314
320
  end
@@ -57,7 +57,7 @@ module Padrino
57
57
  def object_classes
58
58
  klasses = Set.new
59
59
 
60
- ObjectSpace.each_object(Class).each do |klass|
60
+ ObjectSpace.each_object(::Class).each do |klass|
61
61
  if block_given?
62
62
  if filtered_class = yield(klass)
63
63
  klasses << filtered_class
@@ -110,9 +110,9 @@ module Padrino
110
110
  # Detects Host and Port for Rack server.
111
111
  #
112
112
  def self.detect_address(options)
113
- address = DEFAULT_ADDRESS.merge options.slice(:Host, :Port)
114
- address[:Host] = options[:host] if options[:host].present?
115
- address[:Port] = options[:port] if options[:port].present?
113
+ address = DEFAULT_ADDRESS.merge options.select{ |key| [:Host, :Port].include?(key) }
114
+ address[:Host] = options[:host] if options[:host]
115
+ address[:Port] = options[:port] if options[:port]
116
116
  address
117
117
  end
118
118
  end
@@ -6,7 +6,7 @@
6
6
  #
7
7
  module Padrino
8
8
  # The version constant for the current version of Padrino.
9
- VERSION = '0.13.2' unless defined?(Padrino::VERSION)
9
+ VERSION = '0.13.3' unless defined?(Padrino::VERSION)
10
10
 
11
11
  #
12
12
  # The current Padrino version.
@@ -0,0 +1,5 @@
1
+ PADRINO_ROOT = File.dirname(__FILE__) unless defined? PADRINO_ROOT
2
+
3
+ class SystemConcernedClassDemo < Padrino::Application
4
+ set :reload, true
5
+ end
@@ -0,0 +1,4 @@
1
+ module BadModule
2
+ @happy_global_variable ||= 0
3
+ @happy_global_variable += 1
4
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  PADRINO_ROOT = File.dirname(__FILE__) unless defined? PADRINO_ROOT
2
4
 
3
5
  class SystemDemo < Padrino::Application
data/test/test_logger.rb CHANGED
@@ -102,7 +102,8 @@ describe "PadrinoLogger" do
102
102
  @logger.error binary_data
103
103
  @logger.error utf8_data
104
104
  @logger.flush
105
- assert_match /\?.*фыв/m, @log.string.encode(Encoding.default_external)
105
+ assert @log.string.force_encoding(encoding).include?("?\n".encode(encoding))
106
+ assert @log.string.force_encoding(encoding).include?(utf8_data.encode(encoding))
106
107
  end
107
108
 
108
109
  it 'should log an application' do
@@ -80,7 +80,7 @@ describe "SimpleReloader" do
80
80
  assert ok?
81
81
  last_body = body
82
82
  assert_equal 1, @app.filters[:before].size
83
- assert_equal 1, @app.errors.size
83
+ assert_equal 0, @app.errors.reject{ |key, _| [404, Sinatra::NotFound].include? key }.size
84
84
  assert_equal 2, @app.filters[:after].size # app + content-type + padrino-flash
85
85
  assert_equal 0, @app.middleware.size
86
86
  assert_equal 4, @app.routes.size # GET+HEAD of "/" + GET+HEAD of "/rand" = 4
@@ -90,7 +90,7 @@ describe "SimpleReloader" do
90
90
  get "/rand"
91
91
  refute_equal last_body, body
92
92
  assert_equal 1, @app.filters[:before].size
93
- assert_equal 1, @app.errors.size
93
+ assert_equal 0, @app.errors.reject{ |key, _| [404, Sinatra::NotFound].include? key }.size
94
94
  assert_equal 2, @app.filters[:after].size
95
95
  assert_equal 0, @app.middleware.size
96
96
  assert_equal 4, @app.routes.size # GET+HEAD of "/" = 2
@@ -0,0 +1,52 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/helper')
2
+
3
+ describe "Padrino::Reloader::Storage" do
4
+ describe "#classes" do
5
+ it 'should take an snapshot of the current loaded classes' do
6
+ snapshot = Padrino::Reloader::Storage.send(:object_classes)
7
+ assert_equal snapshot.include?(Padrino::Logger), true
8
+ end
9
+
10
+ it 'should return a Set object' do
11
+ snapshot = Padrino::Reloader::Storage.send(:object_classes)
12
+ assert_equal snapshot.kind_of?(Set), true
13
+ end
14
+
15
+ it 'should be able to process a the class name given a block' do
16
+ klasses = Padrino::Reloader::Storage.send(:object_classes) do |klass|
17
+ next unless klass.respond_to?(:name) # fix JRuby < 1.7.22
18
+ if klass.name =~ /^Padrino::/
19
+ klass
20
+ end
21
+ end
22
+
23
+ assert_equal (klasses.size > 1), true
24
+ klasses.each do |klass|
25
+ assert_match /^Padrino::/, klass.to_s
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "#new_classes" do
31
+ before do
32
+ @snapshot = Padrino::Reloader::Storage.send(:object_classes)
33
+ end
34
+
35
+ it 'should return list of new classes' do
36
+ skip
37
+ class OSTest; end
38
+ module OSTestModule; class B; end; end
39
+
40
+ new_classes = Padrino::Reloader::Storage.send(:new_classes, @snapshot)
41
+
42
+ assert_equal new_classes.size, 3
43
+ assert_equal new_classes.include?(OSTest), true
44
+ assert_equal new_classes.include?(OSTestModule::B), true
45
+ end
46
+
47
+ it 'should return a Set object' do
48
+ new_classes = Padrino::Reloader::Storage.send(:new_classes, @snapshot)
49
+ assert_equal new_classes.kind_of?(Set), true
50
+ end
51
+ end
52
+ end
@@ -140,4 +140,20 @@ describe "SystemReloader" do
140
140
  assert Padrino::Reloader.changed?, 'Change to custom dependency has not been recognised'
141
141
  end
142
142
  end
143
+
144
+ describe 'reloading module constants' do
145
+ it 'should remove constants of misdesigned modules' do
146
+ skip
147
+ Padrino.clear!
148
+ require File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/concerned/app.rb')
149
+ @app = SystemConcernedClassDemo
150
+ Padrino.mount(SystemConcernedClassDemo).to("/")
151
+ get '/'
152
+
153
+ original_value = BadModule.instance_variable_get(:@happy_global_variable)
154
+ FileUtils.touch File.dirname(__FILE__) + '/fixtures/apps/concerned/models/mixins/badmodule.rb'
155
+ Padrino.reload!
156
+ assert_equal original_value, BadModule.instance_variable_get(:@happy_global_variable)
157
+ end
158
+ end
143
159
  end
data/test/test_routing.rb CHANGED
@@ -2403,4 +2403,14 @@ describe "Routing" do
2403
2403
  get '/update/1?product[title]=test'
2404
2404
  assert_equal 'test==test', body
2405
2405
  end
2406
+
2407
+ it "prevent overwriting params by given query" do
2408
+ mock_app do
2409
+ get '/prohibit/:id' do
2410
+ params[:id]
2411
+ end
2412
+ end
2413
+ get '/prohibit/123?id=456'
2414
+ assert_equal '123', body
2415
+ end
2406
2416
  end
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.13.2
4
+ version: 0.13.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Padrino Team
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2016-05-09 00:00:00.000000000 Z
14
+ date: 2016-08-17 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: padrino-support
@@ -19,14 +19,14 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.13.2
22
+ version: 0.13.3
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.13.2
29
+ version: 0.13.3
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: sinatra
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +123,7 @@ files:
123
123
  - lib/padrino-core/caller.rb
124
124
  - lib/padrino-core/cli/adapter.rb
125
125
  - lib/padrino-core/cli/base.rb
126
+ - lib/padrino-core/cli/binstub.rb
126
127
  - lib/padrino-core/cli/console.rb
127
128
  - lib/padrino-core/cli/launcher.rb
128
129
  - lib/padrino-core/cli/rake.rb
@@ -157,6 +158,8 @@ files:
157
158
  - test/fixtures/app_gem/lib/app_gem.rb
158
159
  - test/fixtures/app_gem/lib/app_gem/version.rb
159
160
  - test/fixtures/apps/complex.rb
161
+ - test/fixtures/apps/concerned/app.rb
162
+ - test/fixtures/apps/concerned/models/mixins/badmodule.rb
160
163
  - test/fixtures/apps/custom_dependencies/custom_dependencies.rb
161
164
  - test/fixtures/apps/custom_dependencies/my_dependencies/my_dependency.rb
162
165
  - test/fixtures/apps/demo_app.rb
@@ -209,6 +212,7 @@ files:
209
212
  - test/test_reloader_complex.rb
210
213
  - test/test_reloader_external.rb
211
214
  - test/test_reloader_simple.rb
215
+ - test/test_reloader_storage.rb
212
216
  - test/test_reloader_system.rb
213
217
  - test/test_restful_routing.rb
214
218
  - test/test_router.rb
@@ -234,71 +238,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
238
  version: 1.3.6
235
239
  requirements: []
236
240
  rubyforge_project: padrino-core
237
- rubygems_version: 2.4.8
241
+ rubygems_version: 2.6.4
238
242
  signing_key:
239
243
  specification_version: 4
240
244
  summary: The required Padrino core gem
241
- test_files:
242
- - test/fixtures/app_gem/Gemfile
243
- - test/fixtures/app_gem/app/app.rb
244
- - test/fixtures/app_gem/app_gem.gemspec
245
- - test/fixtures/app_gem/lib/app_gem.rb
246
- - test/fixtures/app_gem/lib/app_gem/version.rb
247
- - test/fixtures/apps/complex.rb
248
- - test/fixtures/apps/custom_dependencies/custom_dependencies.rb
249
- - test/fixtures/apps/custom_dependencies/my_dependencies/my_dependency.rb
250
- - test/fixtures/apps/demo_app.rb
251
- - test/fixtures/apps/demo_demo.rb
252
- - test/fixtures/apps/demo_project/api/app.rb
253
- - test/fixtures/apps/demo_project/api/lib/api_lib.rb
254
- - test/fixtures/apps/demo_project/app.rb
255
- - test/fixtures/apps/external_apps/fake_lib.rb
256
- - test/fixtures/apps/external_apps/fake_root.rb
257
- - test/fixtures/apps/helpers/class_methods_helpers.rb
258
- - test/fixtures/apps/helpers/instance_methods_helpers.rb
259
- - test/fixtures/apps/helpers/system_helpers.rb
260
- - test/fixtures/apps/kiq.rb
261
- - test/fixtures/apps/lib/myklass.rb
262
- - test/fixtures/apps/lib/myklass/mysubklass.rb
263
- - test/fixtures/apps/models/child.rb
264
- - test/fixtures/apps/models/parent.rb
265
- - test/fixtures/apps/mountable_apps/rack_apps.rb
266
- - test/fixtures/apps/mountable_apps/static.html
267
- - test/fixtures/apps/precompiled_app.rb
268
- - test/fixtures/apps/simple.rb
269
- - test/fixtures/apps/static.rb
270
- - test/fixtures/apps/stealthy/app.rb
271
- - test/fixtures/apps/stealthy/helpers/stealthy_class_helpers.rb
272
- - test/fixtures/apps/system.rb
273
- - test/fixtures/apps/system_class_methods_demo.rb
274
- - test/fixtures/apps/system_instance_methods_demo.rb
275
- - test/fixtures/dependencies/a.rb
276
- - test/fixtures/dependencies/b.rb
277
- - test/fixtures/dependencies/c.rb
278
- - test/fixtures/dependencies/circular/e.rb
279
- - test/fixtures/dependencies/circular/f.rb
280
- - test/fixtures/dependencies/circular/g.rb
281
- - test/fixtures/dependencies/d.rb
282
- - test/fixtures/reloadable_apps/external/app/app.rb
283
- - test/fixtures/reloadable_apps/external/app/controllers/base.rb
284
- - test/fixtures/reloadable_apps/main/app.rb
285
- - test/helper.rb
286
- - test/test_application.rb
287
- - test/test_configuration.rb
288
- - test/test_core.rb
289
- - test/test_csrf_protection.rb
290
- - test/test_dependencies.rb
291
- - test/test_filters.rb
292
- - test/test_flash.rb
293
- - test/test_locale.rb
294
- - test/test_logger.rb
295
- - test/test_mounter.rb
296
- - test/test_params_protection.rb
297
- - test/test_reloader_complex.rb
298
- - test/test_reloader_external.rb
299
- - test/test_reloader_simple.rb
300
- - test/test_reloader_system.rb
301
- - test/test_restful_routing.rb
302
- - test/test_router.rb
303
- - test/test_routing.rb
304
- has_rdoc:
245
+ test_files: []