lucidimagination-warbler 1.3.2.dev
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.
- data/Gemfile +16 -0
- data/History.txt +217 -0
- data/LICENSE.txt +26 -0
- data/Manifest.txt +92 -0
- data/README.txt +255 -0
- data/Rakefile +103 -0
- data/bin/warble +11 -0
- data/ext/JarMain.java +148 -0
- data/ext/WarMain.java +112 -0
- data/ext/WarblerJar.java +182 -0
- data/ext/WarblerJarService.java +18 -0
- data/lib/warbler.rb +33 -0
- data/lib/warbler/application.rb +86 -0
- data/lib/warbler/config.rb +223 -0
- data/lib/warbler/gems.rb +37 -0
- data/lib/warbler/jar.rb +253 -0
- data/lib/warbler/task.rb +183 -0
- data/lib/warbler/templates/bundler.erb +3 -0
- data/lib/warbler/templates/config.erb +1 -0
- data/lib/warbler/templates/jar.erb +5 -0
- data/lib/warbler/templates/rack.erb +1 -0
- data/lib/warbler/templates/rails.erb +1 -0
- data/lib/warbler/templates/war.erb +1 -0
- data/lib/warbler/traits.rb +107 -0
- data/lib/warbler/traits/bundler.rb +104 -0
- data/lib/warbler/traits/gemspec.rb +59 -0
- data/lib/warbler/traits/jar.rb +56 -0
- data/lib/warbler/traits/merb.rb +35 -0
- data/lib/warbler/traits/nogemspec.rb +42 -0
- data/lib/warbler/traits/rack.rb +33 -0
- data/lib/warbler/traits/rails.rb +62 -0
- data/lib/warbler/traits/war.rb +197 -0
- data/lib/warbler/version.rb +10 -0
- data/lib/warbler/war.rb +8 -0
- data/lib/warbler_jar.jar +0 -0
- data/spec/drb_helper.rb +41 -0
- data/spec/sample_bundler/Gemfile.lock +10 -0
- data/spec/sample_bundler/config.ru +0 -0
- data/spec/sample_jar/History.txt +6 -0
- data/spec/sample_jar/Manifest.txt +8 -0
- data/spec/sample_jar/README.txt +30 -0
- data/spec/sample_jar/lib/sample_jar.rb +6 -0
- data/spec/sample_jar/sample_jar.gemspec +40 -0
- data/spec/sample_jar/test/test_sample_jar.rb +8 -0
- data/spec/sample_war/app/controllers/application.rb +15 -0
- data/spec/sample_war/app/helpers/application_helper.rb +3 -0
- data/spec/sample_war/config/boot.rb +109 -0
- data/spec/sample_war/config/database.yml +19 -0
- data/spec/sample_war/config/environment.rb +67 -0
- data/spec/sample_war/config/environments/development.rb +17 -0
- data/spec/sample_war/config/environments/production.rb +25 -0
- data/spec/sample_war/config/environments/test.rb +22 -0
- data/spec/sample_war/config/initializers/inflections.rb +10 -0
- data/spec/sample_war/config/initializers/mime_types.rb +5 -0
- data/spec/sample_war/config/initializers/new_rails_defaults.rb +15 -0
- data/spec/sample_war/config/routes.rb +41 -0
- data/spec/sample_war/lib/tasks/utils.rake +0 -0
- data/spec/sample_war/public/404.html +30 -0
- data/spec/sample_war/public/422.html +30 -0
- data/spec/sample_war/public/500.html +30 -0
- data/spec/sample_war/public/favicon.ico +0 -0
- data/spec/sample_war/public/index.html +274 -0
- data/spec/sample_war/public/robots.txt +5 -0
- data/spec/spec_helper.rb +112 -0
- data/spec/warbler/application_spec.rb +95 -0
- data/spec/warbler/bundler_spec.rb +136 -0
- data/spec/warbler/config_spec.rb +130 -0
- data/spec/warbler/gems_spec.rb +40 -0
- data/spec/warbler/jar_spec.rb +718 -0
- data/spec/warbler/task_spec.rb +170 -0
- data/spec/warbler/traits_spec.rb +17 -0
- data/spec/warbler/war_spec.rb +14 -0
- data/warble.rb +142 -0
- data/web.xml.erb +32 -0
- metadata +198 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2010-2011 Engine Yard, Inc.
|
3
|
+
# Copyright (c) 2007-2009 Sun Microsystems, Inc.
|
4
|
+
# This source code is available under the MIT license.
|
5
|
+
# See the file LICENSE.txt for details.
|
6
|
+
#++
|
7
|
+
|
8
|
+
require 'stringio'
|
9
|
+
require 'ostruct'
|
10
|
+
|
11
|
+
module Warbler
|
12
|
+
module Traits
|
13
|
+
# The Jar trait sets up the archive layout for an executable jar
|
14
|
+
# project, and adds the JRuby jar files and a JarMain class to the
|
15
|
+
# archive.
|
16
|
+
class Jar
|
17
|
+
include Trait
|
18
|
+
|
19
|
+
def self.detect?
|
20
|
+
!War.detect?
|
21
|
+
end
|
22
|
+
|
23
|
+
def before_configure
|
24
|
+
config.gem_path = '/'
|
25
|
+
config.pathmaps = default_pathmaps
|
26
|
+
config.java_libs = default_jar_files
|
27
|
+
config.manifest_file = 'MANIFEST.MF' if File.exist?('MANIFEST.MF')
|
28
|
+
config.init_contents << "#{config.warbler_templates}/jar.erb"
|
29
|
+
end
|
30
|
+
|
31
|
+
def after_configure
|
32
|
+
config.init_contents << StringIO.new("require 'rubygems'\n")
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_archive(jar)
|
36
|
+
jar.files['META-INF/MANIFEST.MF'] = StringIO.new(Warbler::Jar::DEFAULT_MANIFEST.chomp + "Main-Class: JarMain\n") unless config.manifest_file
|
37
|
+
jar.files['JarMain.class'] = jar.entry_in_jar("#{WARBLER_HOME}/lib/warbler_jar.jar", "JarMain.class")
|
38
|
+
end
|
39
|
+
|
40
|
+
def default_pathmaps
|
41
|
+
p = OpenStruct.new
|
42
|
+
p.java_libs = ["META-INF/lib/%f"]
|
43
|
+
p.java_classes = ["%p"]
|
44
|
+
p.application = ["#{config.jar_name}/%p"]
|
45
|
+
p.gemspecs = ["specifications/%f"]
|
46
|
+
p.gems = ["gems/%p"]
|
47
|
+
p
|
48
|
+
end
|
49
|
+
|
50
|
+
def default_jar_files
|
51
|
+
require 'jruby-jars'
|
52
|
+
FileList[JRubyJars.core_jar_path, JRubyJars.stdlib_jar_path]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2010-2011 Engine Yard, Inc.
|
3
|
+
# Copyright (c) 2007-2009 Sun Microsystems, Inc.
|
4
|
+
# This source code is available under the MIT license.
|
5
|
+
# See the file LICENSE.txt for details.
|
6
|
+
#++
|
7
|
+
|
8
|
+
module Warbler
|
9
|
+
module Traits
|
10
|
+
# The Merb trait adds Merb::BootLoader gem dependencies to the project.
|
11
|
+
class Merb
|
12
|
+
include Trait
|
13
|
+
|
14
|
+
def self.detect?
|
15
|
+
File.exist?("config/init.rb")
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.requires?(trait)
|
19
|
+
trait == Traits::War
|
20
|
+
end
|
21
|
+
|
22
|
+
def before_configure
|
23
|
+
return false unless task = Warbler.project_application.lookup("merb_env")
|
24
|
+
task.invoke rescue nil
|
25
|
+
return false unless defined?(::Merb)
|
26
|
+
config.webxml.booter = :merb
|
27
|
+
if defined?(::Merb::BootLoader::Dependencies.dependencies)
|
28
|
+
::Merb::BootLoader::Dependencies.dependencies.each {|g| config.gems << g }
|
29
|
+
else
|
30
|
+
warn "unable to auto-detect Merb dependencies; upgrade to Merb 1.0 or greater"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2010-2011 Engine Yard, Inc.
|
3
|
+
# Copyright (c) 2007-2009 Sun Microsystems, Inc.
|
4
|
+
# This source code is available under the MIT license.
|
5
|
+
# See the file LICENSE.txt for details.
|
6
|
+
#++
|
7
|
+
|
8
|
+
module Warbler
|
9
|
+
module Traits
|
10
|
+
# The NoGemspec trait is used when no gemspec file is found for a
|
11
|
+
# jar project. It assumes a standard layout including +bin+ and
|
12
|
+
# +lib+ directories.
|
13
|
+
class NoGemspec
|
14
|
+
include Trait
|
15
|
+
|
16
|
+
def self.detect?
|
17
|
+
Jar.detect? && !Gemspec.detect?
|
18
|
+
end
|
19
|
+
|
20
|
+
def before_configure
|
21
|
+
config.dirs = ['.']
|
22
|
+
end
|
23
|
+
|
24
|
+
def after_configure
|
25
|
+
if File.directory?("lib")
|
26
|
+
add_init_load_path(config.pathmaps.application.inject("lib") {|pm,x| pm.pathmap(x)})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def update_archive(jar)
|
31
|
+
add_main_rb(jar, jar.apply_pathmaps(config, default_executable, :application))
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_executable
|
35
|
+
exes = Dir['bin/*']
|
36
|
+
exe = exes.grep(/#{config.jar_name}/).first || exes.first
|
37
|
+
raise "No executable script found" unless exe
|
38
|
+
exe
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2010-2011 Engine Yard, Inc.
|
3
|
+
# Copyright (c) 2007-2009 Sun Microsystems, Inc.
|
4
|
+
# This source code is available under the MIT license.
|
5
|
+
# See the file LICENSE.txt for details.
|
6
|
+
#++
|
7
|
+
|
8
|
+
module Warbler
|
9
|
+
module Traits
|
10
|
+
# The Rack trait adds config.ru to a Rack-based war project.
|
11
|
+
class Rack
|
12
|
+
include Trait
|
13
|
+
|
14
|
+
def self.detect?
|
15
|
+
!Rails.detect? && (File.exist?("config.ru") || !Dir['*/config.ru'].empty?)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.requires?(trait)
|
19
|
+
trait == Traits::War
|
20
|
+
end
|
21
|
+
|
22
|
+
def before_configure
|
23
|
+
config.webxml.booter = :rack
|
24
|
+
config.webinf_files += [FileList['config.ru', '*/config.ru'].detect {|f| File.exist?(f)}]
|
25
|
+
config.webxml.rack.env = ENV['RACK_ENV'] || 'production'
|
26
|
+
end
|
27
|
+
|
28
|
+
def after_configure
|
29
|
+
config.init_contents << "#{config.warbler_templates}/rack.erb"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2010-2011 Engine Yard, Inc.
|
3
|
+
# Copyright (c) 2007-2009 Sun Microsystems, Inc.
|
4
|
+
# This source code is available under the MIT license.
|
5
|
+
# See the file LICENSE.txt for details.
|
6
|
+
#++
|
7
|
+
|
8
|
+
module Warbler
|
9
|
+
module Traits
|
10
|
+
# The Rails trait invokes the Rake environment task and sets up Rails for a war-based project.
|
11
|
+
class Rails
|
12
|
+
include Trait
|
13
|
+
|
14
|
+
def self.detect?
|
15
|
+
File.exist?("config/environment.rb")
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.requires?(trait)
|
19
|
+
trait == Traits::War
|
20
|
+
end
|
21
|
+
|
22
|
+
def before_configure
|
23
|
+
config.jar_name = default_app_name
|
24
|
+
config.webxml.rails.env = ENV['RAILS_ENV'] || 'production'
|
25
|
+
|
26
|
+
return unless Warbler.framework_detection
|
27
|
+
return false unless task = Warbler.project_application.lookup("environment")
|
28
|
+
|
29
|
+
task.invoke rescue nil
|
30
|
+
return false unless defined?(::Rails)
|
31
|
+
|
32
|
+
config.dirs << "tmp" if File.directory?("tmp")
|
33
|
+
config.webxml.booter = :rails
|
34
|
+
unless (defined?(::Rails.vendor_rails?) && ::Rails.vendor_rails?) || File.directory?("vendor/rails")
|
35
|
+
config.gems["rails"] = ::Rails::VERSION::STRING
|
36
|
+
end
|
37
|
+
if defined?(::Rails.configuration.gems)
|
38
|
+
::Rails.configuration.gems.each do |g|
|
39
|
+
config.gems << Gem::Dependency.new(g.name, g.requirement) if Dir["vendor/gems/#{g.name}*"].empty?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def after_configure
|
45
|
+
config.init_contents << "#{config.warbler_templates}/rails.erb"
|
46
|
+
begin
|
47
|
+
rails_env = config.webxml.rails.env
|
48
|
+
unless IO.readlines("config/environments/#{rails_env}.rb").grep(/^\s*config\.threadsafe!/).empty?
|
49
|
+
config.webxml.jruby.min.runtimes = 1 unless Integer === config.webxml.jruby.min.runtimes
|
50
|
+
config.webxml.jruby.max.runtimes = 1 unless Integer === config.webxml.jruby.max.runtimes
|
51
|
+
end
|
52
|
+
rescue
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def default_app_name
|
58
|
+
File.basename(File.expand_path(defined?(::Rails.root) ? ::Rails.root : (defined?(RAILS_ROOT) ? RAILS_ROOT : Dir.getwd)))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2010-2011 Engine Yard, Inc.
|
3
|
+
# Copyright (c) 2007-2009 Sun Microsystems, Inc.
|
4
|
+
# This source code is available under the MIT license.
|
5
|
+
# See the file LICENSE.txt for details.
|
6
|
+
#++
|
7
|
+
|
8
|
+
require 'ostruct'
|
9
|
+
|
10
|
+
module Warbler
|
11
|
+
module Traits
|
12
|
+
# The War trait sets up the layout and generates web.xml for the war project.
|
13
|
+
class War
|
14
|
+
include Trait
|
15
|
+
|
16
|
+
DEFAULT_GEM_PATH = '/WEB-INF/gems'
|
17
|
+
|
18
|
+
def self.detect?
|
19
|
+
Traits::Rails.detect? || Traits::Merb.detect? || Traits::Rack.detect?
|
20
|
+
end
|
21
|
+
|
22
|
+
def before_configure
|
23
|
+
config.gem_path = DEFAULT_GEM_PATH
|
24
|
+
config.pathmaps = default_pathmaps
|
25
|
+
config.webxml = default_webxml_config
|
26
|
+
config.webinf_files = default_webinf_files
|
27
|
+
config.java_libs = default_jar_files
|
28
|
+
config.public_html = FileList["public/**/*"]
|
29
|
+
config.jar_extension = 'war'
|
30
|
+
config.init_contents << "#{config.warbler_templates}/war.erb"
|
31
|
+
end
|
32
|
+
|
33
|
+
def after_configure
|
34
|
+
update_gem_path(DEFAULT_GEM_PATH)
|
35
|
+
end
|
36
|
+
|
37
|
+
def default_pathmaps
|
38
|
+
p = OpenStruct.new
|
39
|
+
p.public_html = ["%{public/,}p"]
|
40
|
+
p.java_libs = ["WEB-INF/lib/%f"]
|
41
|
+
p.java_classes = ["WEB-INF/classes/%p"]
|
42
|
+
p.application = ["WEB-INF/%p"]
|
43
|
+
p.webinf = ["WEB-INF/%{.erb$,}f"]
|
44
|
+
p.gemspecs = ["#{config.relative_gem_path}/specifications/%f"]
|
45
|
+
p.gems = ["#{config.relative_gem_path}/gems/%p"]
|
46
|
+
p
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_webxml_config
|
50
|
+
c = WebxmlOpenStruct.new
|
51
|
+
c.public.root = '/'
|
52
|
+
c.jndi = nil
|
53
|
+
c.ignored = %w(jndi booter)
|
54
|
+
c
|
55
|
+
end
|
56
|
+
|
57
|
+
def default_webinf_files
|
58
|
+
webxml = if File.exist?("config/web.xml")
|
59
|
+
"config/web.xml"
|
60
|
+
elsif File.exist?("config/web.xml.erb")
|
61
|
+
"config/web.xml.erb"
|
62
|
+
else
|
63
|
+
"#{WARBLER_HOME}/web.xml.erb"
|
64
|
+
end
|
65
|
+
FileList[webxml]
|
66
|
+
end
|
67
|
+
|
68
|
+
def default_jar_files
|
69
|
+
require 'jruby-jars'
|
70
|
+
require 'jruby-rack'
|
71
|
+
FileList[JRubyJars.core_jar_path, JRubyJars.stdlib_jar_path, JRubyJars.jruby_rack_jar_path]
|
72
|
+
end
|
73
|
+
|
74
|
+
def update_archive(jar)
|
75
|
+
add_public_files(jar)
|
76
|
+
add_webxml(jar)
|
77
|
+
add_executables(jar) if config.features.include?("executable")
|
78
|
+
add_gemjar(jar) if config.features.include?("gemjar")
|
79
|
+
end
|
80
|
+
|
81
|
+
# Add public/static assets to the root of the war file.
|
82
|
+
def add_public_files(jar)
|
83
|
+
config.public_html.exclude *(config.excludes.to_a)
|
84
|
+
config.public_html.map {|f| jar.add_with_pathmaps(config, f, :public_html) }
|
85
|
+
end
|
86
|
+
|
87
|
+
# Add web.xml and other WEB-INF configuration files from
|
88
|
+
# config.webinf_files to the war file.
|
89
|
+
def add_webxml(jar)
|
90
|
+
config.webinf_files.each do |wf|
|
91
|
+
if wf =~ /\.erb$/
|
92
|
+
jar.files[jar.apply_pathmaps(config, wf, :webinf)] = jar.expand_erb(wf, config)
|
93
|
+
else
|
94
|
+
jar.files[jar.apply_pathmaps(config, wf, :webinf)] = wf
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def add_executables(jar)
|
100
|
+
winstone_type = ENV["WINSTONE"] || "winstone-lite"
|
101
|
+
winstone_version = ENV["WINSTONE_VERSION"] || "0.9.10"
|
102
|
+
winstone_path = "net/sourceforge/winstone/#{winstone_type}/#{winstone_version}/#{winstone_type}-#{winstone_version}.jar"
|
103
|
+
winstone_jar = File.expand_path("~/.m2/repository/#{winstone_path}")
|
104
|
+
unless File.exist?(winstone_jar)
|
105
|
+
# Not always covered in tests as these lines may not get
|
106
|
+
# executed every time if the jar is cached.
|
107
|
+
puts "Downloading #{winstone_type}.jar" #:nocov:
|
108
|
+
mkdir_p File.dirname(winstone_jar) #:nocov:
|
109
|
+
require 'open-uri' #:nocov:
|
110
|
+
maven_repo = ENV["MAVEN_REPO"] || "http://repo2.maven.org/maven2" #:nocov:
|
111
|
+
open("#{maven_repo}/#{winstone_path}") do |stream| #:nocov:
|
112
|
+
File.open(winstone_jar, "wb") do |f| #:nocov:
|
113
|
+
while buf = stream.read(4096) #:nocov:
|
114
|
+
f << buf #:nocov:
|
115
|
+
end #:nocov:
|
116
|
+
end #:nocov:
|
117
|
+
end #:nocov:
|
118
|
+
end
|
119
|
+
|
120
|
+
jar.files['META-INF/MANIFEST.MF'] = StringIO.new(Warbler::Jar::DEFAULT_MANIFEST.chomp + "Main-Class: WarMain\n")
|
121
|
+
jar.files['WarMain.class'] = jar.entry_in_jar("#{WARBLER_HOME}/lib/warbler_jar.jar", 'WarMain.class')
|
122
|
+
jar.files['WEB-INF/winstone.jar'] = winstone_jar
|
123
|
+
end
|
124
|
+
|
125
|
+
def add_gemjar(jar)
|
126
|
+
gem_jar = Warbler::Jar.new
|
127
|
+
gem_path = Regexp::quote(config.relative_gem_path)
|
128
|
+
gems = jar.files.select{|k,v| k =~ %r{#{gem_path}/} }
|
129
|
+
gems.each do |k,v|
|
130
|
+
gem_jar.files[k.sub(%r{#{gem_path}/}, '')] = v
|
131
|
+
end
|
132
|
+
jar.files["WEB-INF/lib/gems.jar"] = "tmp/gems.jar"
|
133
|
+
jar.files.reject!{|k,v| k =~ /#{gem_path}/ || k == "WEB-INF/tmp/gems.jar"}
|
134
|
+
mkdir_p "tmp"
|
135
|
+
gem_jar.add_manifest
|
136
|
+
gem_jar.create("tmp/gems.jar")
|
137
|
+
end
|
138
|
+
|
139
|
+
# Helper class for holding arbitrary config.webxml values for injecting into +web.xml+.
|
140
|
+
class WebxmlOpenStruct < OpenStruct
|
141
|
+
%w(java com org javax gem).each do |name|
|
142
|
+
undef_method name if Object.methods.include?(name)
|
143
|
+
undef_method name.to_sym if Object.methods.include?(name.to_sym)
|
144
|
+
end
|
145
|
+
|
146
|
+
def initialize(key = 'webxml')
|
147
|
+
@key = key
|
148
|
+
@table = Hash.new {|h,k| h[k] = WebxmlOpenStruct.new(k) }
|
149
|
+
end
|
150
|
+
|
151
|
+
def servlet_context_listener
|
152
|
+
case self.booter
|
153
|
+
when :rack
|
154
|
+
"org.jruby.rack.RackServletContextListener"
|
155
|
+
when :merb
|
156
|
+
"org.jruby.rack.merb.MerbServletContextListener"
|
157
|
+
else # :rails, default
|
158
|
+
"org.jruby.rack.rails.RailsServletContextListener"
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def [](key)
|
163
|
+
new_ostruct_member(key)
|
164
|
+
send(key)
|
165
|
+
end
|
166
|
+
|
167
|
+
def []=(key, value)
|
168
|
+
new_ostruct_member(key)
|
169
|
+
send("#{key}=", value)
|
170
|
+
end
|
171
|
+
|
172
|
+
def context_params(escape = true)
|
173
|
+
require 'cgi'
|
174
|
+
params = {}
|
175
|
+
@table.each do |k,v|
|
176
|
+
case v
|
177
|
+
when WebxmlOpenStruct
|
178
|
+
nested_params = v.context_params
|
179
|
+
nested_params.each do |nk,nv|
|
180
|
+
params["#{escape ? CGI::escapeHTML(k.to_s) : k.to_s}.#{nk}"] = nv
|
181
|
+
end
|
182
|
+
else
|
183
|
+
params[escape ? CGI::escapeHTML(k.to_s) : k.to_s] = escape ? CGI::escapeHTML(v.to_s) : v.to_s
|
184
|
+
end
|
185
|
+
end
|
186
|
+
extra_ignored = Array === ignored ? ignored : []
|
187
|
+
params.delete_if {|k,v| ['ignored', *extra_ignored].include?(k.to_s) }
|
188
|
+
params
|
189
|
+
end
|
190
|
+
|
191
|
+
def to_s
|
192
|
+
"No value for '#@key' found"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|