railties 4.1.16 → 4.2.0.beta1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +80 -439
- data/RDOC_MAIN.rdoc +1 -1
- data/README.rdoc +6 -2
- data/lib/rails.rb +7 -1
- data/lib/rails/all.rb +1 -0
- data/lib/rails/api/task.rb +7 -0
- data/lib/rails/app_rails_loader.rb +4 -2
- data/lib/rails/application.rb +74 -47
- data/lib/rails/application/configuration.rb +23 -1
- data/lib/rails/application/finisher.rb +0 -2
- data/lib/rails/code_statistics.rb +4 -2
- data/lib/rails/commands/commands_tasks.rb +1 -6
- data/lib/rails/commands/console.rb +24 -12
- data/lib/rails/commands/dbconsole.rb +2 -2
- data/lib/rails/commands/plugin.rb +1 -1
- data/lib/rails/commands/server.rb +22 -9
- data/lib/rails/engine.rb +7 -7
- data/lib/rails/gem_version.rb +3 -3
- data/lib/rails/generators.rb +68 -15
- data/lib/rails/generators/actions.rb +27 -7
- data/lib/rails/generators/actions/create_migration.rb +2 -1
- data/lib/rails/generators/app_base.rb +55 -65
- data/lib/rails/generators/base.rb +2 -2
- data/lib/rails/generators/erb/scaffold/templates/_form.html.erb +0 -5
- data/lib/rails/generators/erb/scaffold/templates/edit.html.erb +1 -1
- data/lib/rails/generators/erb/scaffold/templates/index.html.erb +3 -1
- data/lib/rails/generators/erb/scaffold/templates/new.html.erb +1 -1
- data/lib/rails/generators/generated_attribute.rb +24 -4
- data/lib/rails/generators/model_helpers.rb +28 -0
- data/lib/rails/generators/rails/app/app_generator.rb +8 -2
- data/lib/rails/generators/rails/app/templates/Gemfile +21 -6
- data/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +1 -1
- data/lib/rails/generators/rails/app/templates/bin/setup +28 -0
- data/lib/rails/generators/rails/app/templates/config/application.rb +5 -1
- data/lib/rails/generators/rails/app/templates/config/boot.rb +1 -2
- data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml +1 -3
- data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml +1 -1
- data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +4 -0
- data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +8 -10
- data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +3 -0
- data/lib/rails/generators/rails/app/templates/config/initializers/cookies_serializer.rb +1 -1
- data/lib/rails/generators/rails/app/templates/gitignore +2 -0
- data/lib/rails/generators/rails/controller/USAGE +0 -1
- data/lib/rails/generators/rails/controller/controller_generator.rb +6 -2
- data/lib/rails/generators/rails/helper/USAGE +0 -4
- data/lib/rails/generators/rails/model/USAGE +11 -1
- data/lib/rails/generators/rails/model/model_generator.rb +4 -0
- data/lib/rails/generators/rails/plugin/plugin_generator.rb +1 -3
- data/lib/rails/generators/rails/plugin/templates/%name%.gemspec +1 -1
- data/lib/rails/generators/rails/plugin/templates/Gemfile +10 -6
- data/lib/rails/generators/rails/plugin/templates/Rakefile +4 -0
- data/lib/rails/generators/rails/plugin/templates/app/controllers/%name%/application_controller.rb.tt +0 -1
- data/lib/rails/generators/rails/plugin/templates/rails/javascripts.js +1 -1
- data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb +2 -10
- data/lib/rails/generators/rails/resource_route/resource_route_generator.rb +2 -4
- data/lib/rails/generators/rails/scaffold/USAGE +7 -1
- data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +0 -1
- data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb +1 -1
- data/lib/rails/generators/resource_helpers.rb +2 -11
- data/lib/rails/generators/test_unit/helper/helper_generator.rb +1 -5
- data/lib/rails/generators/testing/behaviour.rb +17 -0
- data/lib/rails/info.rb +1 -1
- data/lib/rails/info_controller.rb +1 -1
- data/lib/rails/mailers_controller.rb +14 -16
- data/lib/rails/paths.rb +1 -1
- data/lib/rails/rack.rb +1 -1
- data/lib/rails/rack/log_tailer.rb +4 -0
- data/lib/rails/rack/logger.rb +1 -1
- data/lib/rails/railtie.rb +2 -2
- data/lib/rails/ruby_version_check.rb +1 -1
- data/lib/rails/source_annotation_extractor.rb +23 -16
- data/lib/rails/tasks/framework.rake +1 -1
- data/lib/rails/tasks/statistics.rake +8 -3
- data/lib/rails/templates/rails/mailers/email.html.erb +2 -13
- data/lib/rails/templates/rails/mailers/index.html.erb +2 -2
- data/lib/rails/templates/rails/mailers/mailer.html.erb +1 -1
- data/lib/rails/test_unit/sub_test_task.rb +2 -2
- metadata +13 -13
- data/lib/rails/generators/test_unit/helper/templates/helper_test.rb +0 -6
- data/lib/rails/rubyprof_ext.rb +0 -35
@@ -5,13 +5,9 @@ Description:
|
|
5
5
|
To create a helper within a module, specify the helper name as a
|
6
6
|
path like 'parent_module/helper_name'.
|
7
7
|
|
8
|
-
This generates a helper class in app/helpers and invokes the configured
|
9
|
-
test framework.
|
10
|
-
|
11
8
|
Example:
|
12
9
|
`rails generate helper CreditCard`
|
13
10
|
|
14
11
|
Credit card helper.
|
15
12
|
Helper: app/helpers/credit_card_helper.rb
|
16
|
-
Test: test/helpers/credit_card_helper_test.rb
|
17
13
|
|
@@ -6,6 +6,11 @@ Description:
|
|
6
6
|
model's attributes. Timestamps are added by default, so you don't have to
|
7
7
|
specify them by hand as 'created_at:datetime updated_at:datetime'.
|
8
8
|
|
9
|
+
As a special case, specifying 'password:digest' will generate a
|
10
|
+
password_digest field of string type, and configure your generated model and
|
11
|
+
tests for use with ActiveModel has_secure_password (assuming the default ORM
|
12
|
+
and test framework are being used).
|
13
|
+
|
9
14
|
You don't have to think up every attribute up front, but it helps to
|
10
15
|
sketch out a few so you can start working with the model immediately.
|
11
16
|
|
@@ -27,7 +32,8 @@ Available field types:
|
|
27
32
|
`rails generate model post title:string body:text`
|
28
33
|
|
29
34
|
will generate a title column with a varchar type and a body column with a text
|
30
|
-
type.
|
35
|
+
type. If no type is specified the string type will be used by default.
|
36
|
+
You can use the following types:
|
31
37
|
|
32
38
|
integer
|
33
39
|
primary_key
|
@@ -73,6 +79,10 @@ Available field types:
|
|
73
79
|
`rails generate model user username:string{30}:uniq`
|
74
80
|
`rails generate model product supplier:references{polymorphic}:index`
|
75
81
|
|
82
|
+
If you require a `password_digest` string column for use with
|
83
|
+
has_secure_password, you should specify `password:digest`:
|
84
|
+
|
85
|
+
`rails generate model user password:digest`
|
76
86
|
|
77
87
|
Examples:
|
78
88
|
`rails generate model account`
|
@@ -1,6 +1,10 @@
|
|
1
|
+
require 'rails/generators/model_helpers'
|
2
|
+
|
1
3
|
module Rails
|
2
4
|
module Generators
|
3
5
|
class ModelGenerator < NamedBase # :nodoc:
|
6
|
+
include Rails::Generators::ModelHelpers
|
7
|
+
|
4
8
|
argument :attributes, type: :array, default: [], banner: "field[:type][:index] field[:type][:index]"
|
5
9
|
hook_for :orm, required: true
|
6
10
|
end
|
@@ -241,7 +241,7 @@ task default: :test
|
|
241
241
|
build(:leftovers)
|
242
242
|
end
|
243
243
|
|
244
|
-
public_task :apply_rails_template
|
244
|
+
public_task :apply_rails_template, :run_bundle
|
245
245
|
|
246
246
|
def name
|
247
247
|
@name ||= begin
|
@@ -315,7 +315,6 @@ task default: :test
|
|
315
315
|
else
|
316
316
|
@author = `git config user.name`.chomp rescue default
|
317
317
|
end
|
318
|
-
@author
|
319
318
|
end
|
320
319
|
|
321
320
|
def email
|
@@ -325,7 +324,6 @@ task default: :test
|
|
325
324
|
else
|
326
325
|
@email = `git config user.email`.chomp rescue default
|
327
326
|
end
|
328
|
-
@email
|
329
327
|
end
|
330
328
|
|
331
329
|
def valid_const?
|
@@ -22,6 +22,6 @@ Gem::Specification.new do |s|
|
|
22
22
|
<%= '# ' if options.dev? || options.edge? -%>s.add_dependency "rails", "~> <%= Rails::VERSION::STRING %>"
|
23
23
|
<% unless options[:skip_active_record] -%>
|
24
24
|
|
25
|
-
s.add_development_dependency "<%= gem_for_database
|
25
|
+
s.add_development_dependency "<%= gem_for_database %>"
|
26
26
|
<% end -%>
|
27
27
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
<% if options[:skip_gemspec] -%>
|
4
|
-
<%= '# ' if options.dev? || options.edge? -%>gem
|
4
|
+
<%= '# ' if options.dev? || options.edge? -%>gem 'rails', '~> <%= Rails::VERSION::STRING %>'
|
5
5
|
<% else -%>
|
6
6
|
# Declare your gem's dependencies in <%= name %>.gemspec.
|
7
7
|
# Bundler will treat runtime dependencies like base dependencies, and
|
@@ -11,7 +11,7 @@ gemspec
|
|
11
11
|
|
12
12
|
<% if options[:skip_gemspec] -%>
|
13
13
|
group :development do
|
14
|
-
gem
|
14
|
+
gem '<%= gem_for_database %>'
|
15
15
|
end
|
16
16
|
<% else -%>
|
17
17
|
# Declare any dependencies that are still in development here instead of in
|
@@ -31,13 +31,17 @@ end
|
|
31
31
|
<% end -%>
|
32
32
|
<%= gem.commented_out ? '# ' : '' %>gem '<%= gem.name %>'<%= %(, '#{gem.version}') if gem.version -%>
|
33
33
|
<% if gem.options.any? -%>
|
34
|
-
|
34
|
+
, <%= gem.options.map { |k,v|
|
35
35
|
"#{k}: #{v.inspect}" }.join(', ') %>
|
36
36
|
<% end -%>
|
37
37
|
<% end -%>
|
38
38
|
|
39
39
|
<% end -%>
|
40
40
|
<% unless defined?(JRUBY_VERSION) -%>
|
41
|
-
# To use debugger
|
42
|
-
|
41
|
+
# To use a debugger
|
42
|
+
<%- if RUBY_VERSION < '2.0.0' -%>
|
43
|
+
# gem 'debugger', group: [:development, :test]
|
44
|
+
<%- else -%>
|
45
|
+
# gem 'byebug', group: [:development, :test]
|
46
|
+
<%- end -%>
|
43
47
|
<% end -%>
|
@@ -19,6 +19,10 @@ APP_RAKEFILE = File.expand_path("../<%= dummy_path -%>/Rakefile", __FILE__)
|
|
19
19
|
load 'rails/tasks/engine.rake'
|
20
20
|
<% end %>
|
21
21
|
|
22
|
+
<% if engine? -%>
|
23
|
+
load 'rails/tasks/statistics.rake'
|
24
|
+
<% end %>
|
25
|
+
|
22
26
|
<% unless options[:skip_gemspec] -%>
|
23
27
|
|
24
28
|
Bundler::GemHelper.install_tasks
|
@@ -7,7 +7,7 @@
|
|
7
7
|
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
8
|
// compiled file.
|
9
9
|
//
|
10
|
-
// Read Sprockets README (https://github.com/
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
11
|
// about supported directives.
|
12
12
|
//
|
13
13
|
//= require_tree .
|
@@ -1,18 +1,10 @@
|
|
1
1
|
# Configure Rails Environment
|
2
2
|
ENV["RAILS_ENV"] = "test"
|
3
3
|
|
4
|
-
require File.expand_path("
|
5
|
-
<% unless options[:skip_active_record] -%>
|
6
|
-
ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../<%= options[:dummy_path] -%>/db/migrate", __FILE__)]
|
7
|
-
<% if options[:mountable] -%>
|
8
|
-
ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__)
|
9
|
-
<% end -%>
|
10
|
-
<% end -%>
|
4
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
11
5
|
require "rails/test_help"
|
12
6
|
|
13
|
-
|
14
|
-
# to be shown.
|
15
|
-
Minitest.backtrace_filter = Minitest::BacktraceFilter.new
|
7
|
+
Rails.backtrace_cleaner.remove_silencers!
|
16
8
|
|
17
9
|
# Load support files
|
18
10
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
@@ -29,10 +29,8 @@ module Rails
|
|
29
29
|
write("end", route_length - index)
|
30
30
|
end
|
31
31
|
|
32
|
-
# route prepends two spaces onto the front of the string that is passed, this corrects that
|
33
|
-
|
34
|
-
# we need to correct that too.
|
35
|
-
route route_string[2..-2]
|
32
|
+
# route prepends two spaces onto the front of the string that is passed, this corrects that
|
33
|
+
route route_string[2..-1]
|
36
34
|
end
|
37
35
|
|
38
36
|
private
|
@@ -9,11 +9,16 @@ Description:
|
|
9
9
|
|
10
10
|
Attributes are field arguments specifying the model's attributes. You can
|
11
11
|
optionally pass the type and an index to each field. For instance:
|
12
|
-
|
12
|
+
'title body:text tracking_id:integer:uniq' will generate a title field of
|
13
13
|
string type, a body with text type and a tracking_id as an integer with an
|
14
14
|
unique index. "index" could also be given instead of "uniq" if one desires
|
15
15
|
a non unique index.
|
16
16
|
|
17
|
+
As a special case, specifying 'password:digest' will generate a
|
18
|
+
password_digest field of string type, and configure your generated model,
|
19
|
+
controller, views, and test suite for use with ActiveModel
|
20
|
+
has_secure_password (assuming they are using Rails defaults).
|
21
|
+
|
17
22
|
Timestamps are added by default, so you don't have to specify them by hand
|
18
23
|
as 'created_at:datetime updated_at:datetime'.
|
19
24
|
|
@@ -33,3 +38,4 @@ Examples:
|
|
33
38
|
`rails generate scaffold post`
|
34
39
|
`rails generate scaffold post title body:text published:boolean`
|
35
40
|
`rails generate scaffold purchase amount:decimal tracking_id:integer:uniq`
|
41
|
+
`rails generate scaffold user email:uniq password:digest`
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'rails/generators/active_model'
|
2
|
+
require 'rails/generators/model_helpers'
|
2
3
|
|
3
4
|
module Rails
|
4
5
|
module Generators
|
5
6
|
# Deal with controller names on scaffold and add some helpers to deal with
|
6
7
|
# ActiveModel.
|
7
8
|
module ResourceHelpers # :nodoc:
|
8
|
-
mattr_accessor :skip_warn
|
9
9
|
|
10
10
|
def self.included(base) #:nodoc:
|
11
|
-
base.
|
11
|
+
base.send :include, Rails::Generators::ModelHelpers
|
12
12
|
base.class_option :model_name, type: :string, desc: "ModelName to be used"
|
13
13
|
end
|
14
14
|
|
@@ -21,15 +21,6 @@ module Rails
|
|
21
21
|
assign_names!(self.name)
|
22
22
|
end
|
23
23
|
|
24
|
-
if name == name.pluralize && name.singularize != name.pluralize && !options[:force_plural]
|
25
|
-
unless ResourceHelpers.skip_warn
|
26
|
-
say "Plural version of the model detected, using singularized version. Override with --force-plural."
|
27
|
-
ResourceHelpers.skip_warn = true
|
28
|
-
end
|
29
|
-
name.replace name.singularize
|
30
|
-
assign_names!(name)
|
31
|
-
end
|
32
|
-
|
33
24
|
assign_controller_names!(controller_name.pluralize)
|
34
25
|
end
|
35
26
|
|
@@ -3,11 +3,7 @@ require 'rails/generators/test_unit'
|
|
3
3
|
module TestUnit # :nodoc:
|
4
4
|
module Generators # :nodoc:
|
5
5
|
class HelperGenerator < Base # :nodoc:
|
6
|
-
|
7
|
-
|
8
|
-
def create_helper_files
|
9
|
-
template 'helper_test.rb', File.join('test/helpers', class_path, "#{file_name}_helper_test.rb")
|
10
|
-
end
|
6
|
+
# Rails does not generate anything here.
|
11
7
|
end
|
12
8
|
end
|
13
9
|
end
|
@@ -100,6 +100,23 @@ module Rails
|
|
100
100
|
dirname, file_name = File.dirname(absolute), File.basename(absolute).sub(/\.rb$/, '')
|
101
101
|
Dir.glob("#{dirname}/[0-9]*_*.rb").grep(/\d+_#{file_name}.rb$/).first
|
102
102
|
end
|
103
|
+
|
104
|
+
def capture(stream)
|
105
|
+
stream = stream.to_s
|
106
|
+
captured_stream = Tempfile.new(stream)
|
107
|
+
stream_io = eval("$#{stream}")
|
108
|
+
origin_stream = stream_io.dup
|
109
|
+
stream_io.reopen(captured_stream)
|
110
|
+
|
111
|
+
yield
|
112
|
+
|
113
|
+
stream_io.rewind
|
114
|
+
return captured_stream.read
|
115
|
+
ensure
|
116
|
+
captured_stream.close
|
117
|
+
captured_stream.unlink
|
118
|
+
stream_io.reopen(origin_stream)
|
119
|
+
end
|
103
120
|
end
|
104
121
|
end
|
105
122
|
end
|
data/lib/rails/info.rb
CHANGED
@@ -5,7 +5,7 @@ class Rails::InfoController < Rails::ApplicationController # :nodoc:
|
|
5
5
|
prepend_view_path ActionDispatch::DebugExceptions::RESCUES_TEMPLATE_PATH
|
6
6
|
layout -> { request.xhr? ? false : 'application' }
|
7
7
|
|
8
|
-
|
8
|
+
before_action :require_local!
|
9
9
|
|
10
10
|
def index
|
11
11
|
redirect_to action: :routes
|
@@ -3,8 +3,8 @@ require 'rails/application_controller'
|
|
3
3
|
class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
4
4
|
prepend_view_path ActionDispatch::DebugExceptions::RESCUES_TEMPLATE_PATH
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
before_action :require_local!
|
7
|
+
before_action :find_preview, only: :preview
|
8
8
|
|
9
9
|
def index
|
10
10
|
@previews = ActionMailer::Preview.all
|
@@ -16,10 +16,10 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
|
16
16
|
@page_title = "Mailer Previews for #{@preview.preview_name}"
|
17
17
|
render action: 'mailer'
|
18
18
|
else
|
19
|
-
|
19
|
+
email = File.basename(params[:path])
|
20
20
|
|
21
|
-
if @preview.email_exists?(
|
22
|
-
@email = @preview.call(
|
21
|
+
if @preview.email_exists?(email)
|
22
|
+
@email = @preview.call(email)
|
23
23
|
|
24
24
|
if params[:part]
|
25
25
|
part_type = Mime::Type.lookup(params[:part])
|
@@ -28,14 +28,14 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
|
28
28
|
response.content_type = part_type
|
29
29
|
render text: part.respond_to?(:decoded) ? part.decoded : part
|
30
30
|
else
|
31
|
-
raise AbstractController::ActionNotFound, "Email part '#{part_type}' not found in #{@preview.name}##{
|
31
|
+
raise AbstractController::ActionNotFound, "Email part '#{part_type}' not found in #{@preview.name}##{email}"
|
32
32
|
end
|
33
33
|
else
|
34
34
|
@part = find_preferred_part(request.format, Mime::HTML, Mime::TEXT)
|
35
35
|
render action: 'email', layout: false, formats: %w[html]
|
36
36
|
end
|
37
37
|
else
|
38
|
-
raise AbstractController::ActionNotFound, "Email '#{
|
38
|
+
raise AbstractController::ActionNotFound, "Email '#{email}' not found in #{@preview.name}"
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -54,22 +54,20 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def find_preferred_part(*formats)
|
57
|
-
|
58
|
-
|
59
|
-
return
|
57
|
+
if @email.multipart?
|
58
|
+
formats.each do |format|
|
59
|
+
return find_part(format) if @email.parts.any?{ |p| p.mime_type == format }
|
60
60
|
end
|
61
|
-
|
62
|
-
|
63
|
-
if formats.any?{ |f| @email.mime_type == f }
|
61
|
+
else
|
64
62
|
@email
|
65
63
|
end
|
66
64
|
end
|
67
65
|
|
68
66
|
def find_part(format)
|
69
|
-
if
|
70
|
-
|
67
|
+
if @email.multipart?
|
68
|
+
@email.parts.find{ |p| p.mime_type == format }
|
71
69
|
elsif @email.mime_type == format
|
72
70
|
@email
|
73
71
|
end
|
74
72
|
end
|
75
|
-
end
|
73
|
+
end
|
data/lib/rails/paths.rb
CHANGED
@@ -101,7 +101,7 @@ module Rails
|
|
101
101
|
def filter_by(&block)
|
102
102
|
all_paths.find_all(&block).flat_map { |path|
|
103
103
|
paths = path.existent
|
104
|
-
paths - path.children.
|
104
|
+
paths - path.children.flat_map { |p| yield(p) ? [] : p.existent }
|
105
105
|
}.uniq
|
106
106
|
end
|
107
107
|
end
|
data/lib/rails/rack.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
require 'active_support/deprecation'
|
2
|
+
|
1
3
|
module Rails
|
2
4
|
module Rack
|
3
5
|
class LogTailer
|
4
6
|
def initialize(app, log = nil)
|
7
|
+
ActiveSupport::Deprecation.warn "LogTailer is deprecated and will be removed on Rails 5"
|
8
|
+
|
5
9
|
@app = app
|
6
10
|
|
7
11
|
path = Pathname.new(log || "#{::File.expand_path(Rails.root)}/log/#{Rails.env}.log").cleanpath
|
data/lib/rails/rack/logger.rb
CHANGED
@@ -34,7 +34,7 @@ module Rails
|
|
34
34
|
|
35
35
|
instrumenter = ActiveSupport::Notifications.instrumenter
|
36
36
|
instrumenter.start 'request.action_dispatch', request: request
|
37
|
-
logger.info started_request_message(request)
|
37
|
+
logger.info { started_request_message(request) }
|
38
38
|
resp = @app.call(env)
|
39
39
|
resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
|
40
40
|
resp
|