Skip to content

Commit c078ecb

Browse files
viralpraxisbyroot
authored andcommitted
Ensure Rack config pragmas are kept during application building
Resolves #173 Prior to these changes, Ruby pragmas (including `frozen-string-literal`) were inserted in the wrong place. This might be a breaking change.
1 parent ea261b9 commit c078ecb

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

lib/pitchfork.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,12 @@ def builder(ru, op)
8787
when /\.ru$/
8888
raw = File.read(ru)
8989
raw.sub!(/^__END__\n.*/, '')
90-
eval("Rack::Builder.new {(\n#{raw}\n)}.to_app", TOPLEVEL_BINDING, ru)
90+
lines = raw.lines
91+
trailing_comments_index = lines.index { |line| !line.start_with?('#') }
92+
prelude = lines[0...trailing_comments_index].join("\n")
93+
raw = lines[trailing_comments_index...-1].join("\n")
94+
95+
eval("#{prelude}\nRack::Builder.new {(\n#{raw}\n)}.to_app", TOPLEVEL_BINDING, ru)
9196
else
9297
require ru
9398
Object.const_get(File.basename(ru, '.rb').capitalize)

test/integration/frozen_string.ru

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# frozen_string_literal: true
2+
3+
'42'.succ!
4+
5+
run lambda { |_env| [200, {}, []] }
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
require 'integration_test_helper'
3+
4+
class BrokenAppTest < Pitchfork::IntegrationTest
5+
def test_keeps_rack_config_pragmas
6+
addr, port = unused_port
7+
8+
pid = spawn_server("-E", "none", app: File.join(ROOT, "test/integration/frozen_string.ru"), lint: false, config: <<~CONFIG,)
9+
listen "#{addr}:#{port}"
10+
CONFIG
11+
12+
assert_stderr "can't modify frozen String: \"42\" (FrozenError)"
13+
14+
assert_exited pid, 1
15+
end
16+
end

0 commit comments

Comments
 (0)