1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

erb: set variables from the command line

* bin/erb (ARGV.switch, ERB::Main#run): allow variables to be set
  from the command line.  [ruby-core:65772] [Feature #10395]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48786 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-12-12 10:48:57 +00:00
parent e82f4195d4
commit 9e52416cd3
4 changed files with 38 additions and 5 deletions

View file

@ -1,3 +1,8 @@
Fri Dec 12 19:48:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* bin/erb (ARGV.switch, ERB::Main#run): allow variables to be set
from the command line. [ruby-core:65772] [Feature #10395]
Fri Dec 12 19:31:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Dec 12 19:31:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/erb.rb (ERB#lineno): accessor for line number to eval. * lib/erb.rb (ERB#lineno): accessor for line number to eval.

21
bin/erb
View file

@ -25,6 +25,8 @@ class ERB
@maybe_arg = nil @maybe_arg = nil
end end
"-#{$1}" "-#{$1}"
when /\A(\w+)=/
arg
else else
self.unshift arg self.unshift arg
nil nil
@ -55,6 +57,7 @@ class ERB
def run(factory=ERB) def run(factory=ERB)
trim_mode = 0 trim_mode = 0
disable_percent = false disable_percent = false
variables = {}
begin begin
while switch = ARGV.switch while switch = ARGV.switch
case switch case switch
@ -92,14 +95,17 @@ class ERB
disable_percent = true disable_percent = true
when '--help' when '--help'
raise "print this help" raise "print this help"
else when /\A-/
raise "unknown switch #{switch.dump}" raise "unknown switch #{switch.dump}"
else
var, val = *switch.split('=', 2)
(variables ||= {})[var] = val
end end
end end
rescue # usage rescue # usage
STDERR.puts $!.to_s STDERR.puts $!.to_s
STDERR.puts File.basename($0) + STDERR.puts File.basename($0) +
" [switches] [inputfile]" " [switches] [var=value...] [inputfile]"
STDERR.puts <<EOU STDERR.puts <<EOU
-x print ruby script -x print ruby script
-n print ruby script with line number -n print ruby script with line number
@ -111,6 +117,7 @@ class ERB
-U set default encoding to UTF-8. -U set default encoding to UTF-8.
-T trim_mode specify trim_mode (0..2, -) -T trim_mode specify trim_mode (0..2, -)
-P ignore lines which start with "%" -P ignore lines which start with "%"
var=value set variable
EOU EOU
exit 1 exit 1
end end
@ -131,7 +138,15 @@ EOU
puts erb.src puts erb.src
end end
else else
erb.run(TOPLEVEL_BINDING.taint) bind = TOPLEVEL_BINDING.taint
if variables
enc = erb.encoding
variables.each do |var, val|
val = val.encode(enc) if val
bind.local_variable_set(var, val)
end
end
erb.run(bind)
end end
end end
module_function :run module_function :run

View file

@ -797,7 +797,7 @@ class ERB
@safe_level = safe_level @safe_level = safe_level
compiler = make_compiler(trim_mode) compiler = make_compiler(trim_mode)
set_eoutvar(compiler, eoutvar) set_eoutvar(compiler, eoutvar)
@src, @enc = *compiler.compile(str) @src, @encoding = *compiler.compile(str)
@filename = nil @filename = nil
@lineno = 0 @lineno = 0
end end
@ -812,6 +812,9 @@ class ERB
# The Ruby code generated by ERB # The Ruby code generated by ERB
attr_reader :src attr_reader :src
# The encoding to eval
attr_reader :encoding
# The optional _filename_ argument passed to Kernel#eval when the ERB code # The optional _filename_ argument passed to Kernel#eval when the ERB code
# is run # is run
attr_accessor :filename attr_accessor :filename
@ -879,7 +882,7 @@ class ERB
# print MyClass.new.render('foo', 123) # print MyClass.new.render('foo', 123)
def def_method(mod, methodname, fname='(ERB)') def def_method(mod, methodname, fname='(ERB)')
src = self.src src = self.src
magic_comment = "#coding:#{@enc}\n" magic_comment = "#coding:#{@encoding}\n"
mod.module_eval do mod.module_eval do
eval(magic_comment + "def #{methodname}\n" + src + "\nend\n", binding, fname, -2) eval(magic_comment + "def #{methodname}\n" + src + "\nend\n", binding, fname, -2)
end end

View file

@ -0,0 +1,10 @@
# -*- coding: us-ascii -*-
require 'test/unit'
class TestErbCommand < Test::Unit::TestCase
def test_var
assert_in_out_err([File.expand_path("../../../bin/erb", __FILE__),
"var=hoge"],
"<%=var%>", ["hoge"])
end
end