diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/old_rubygems_patch.rb | 42 | ||||
-rw-r--r-- | lib/rack_quote_monkeypatch.rb | 65 |
2 files changed, 107 insertions, 0 deletions
diff --git a/lib/old_rubygems_patch.rb b/lib/old_rubygems_patch.rb new file mode 100644 index 000000000..5601a5e90 --- /dev/null +++ b/lib/old_rubygems_patch.rb @@ -0,0 +1,42 @@ +require File.join(File.dirname(__FILE__),'..','vendor','rails','railties','lib','rails','gem_dependency.rb') + +module Rails + class GemDependency < Gem::Dependency + + # This definition of the requirement method is a patch + if !method_defined?(:requirement) + def requirement + req = version_requirements + end + end + + def add_load_paths + self.class.add_frozen_gem_path + return if @loaded || @load_paths_added + if framework_gem? + @load_paths_added = @loaded = @frozen = true + return + end + + begin + dep = Gem::Dependency.new(name, requirement) + spec = Gem.source_index.find { |_,s| s.satisfies_requirement?(dep) }.last + spec.activate # a way that exists + rescue + begin + gem self.name, self.requirement # < 1.8 unhappy way + # This second rescue is a patch - fall back to passing Rails::GemDependency to gem + # for older rubygems + rescue ArgumentError + gem self + end + end + + @spec = Gem.loaded_specs[name] + @frozen = @spec.loaded_from.include?(self.class.unpacked_path) if @spec + @load_paths_added = true + rescue Gem::LoadError + end + end + +end diff --git a/lib/rack_quote_monkeypatch.rb b/lib/rack_quote_monkeypatch.rb new file mode 100644 index 000000000..be079c6a2 --- /dev/null +++ b/lib/rack_quote_monkeypatch.rb @@ -0,0 +1,65 @@ +# There's a bug in Rack 1.1.x which is fixed in Rack 1.2, but our +# current version of Rails won't use that. So for now, monkeypatch, +# This can be dropped when we move to Rails 3. +# +# See https://github.com/sebbacon/alaveteli/issues/38 for Alaveteli +# bug report +# +# More info about the monkeypatch: +# http://thewebfellas.com/blog/2010/7/15/rails-2-3-8-rack-1-1-and-the-curious-case-of-the-missing-quotes + +module Rack + module Utils + def parse_query(qs, d = nil) + params = {} + + (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p| + k, v = p.split('=', 2).map { |x| unescape(x) } + if cur = params[k] + if cur.class == Array + params[k] << v + else + params[k] = [cur, v] + end + else + params[k] = v + end + end + + return params + end + module_function :parse_query + + def normalize_params(params, name, v = nil) + name =~ %r(\A[\[\]]*([^\[\]]+)\]*) + k = $1 || '' + after = $' || '' + + return if k.empty? + + if after == "" + params[k] = v + elsif after == "[]" + params[k] ||= [] + raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) + params[k] << v + elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$) + child_key = $1 + params[k] ||= [] + raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) + if params[k].last.is_a?(Hash) && !params[k].last.key?(child_key) + normalize_params(params[k].last, child_key, v) + else + params[k] << normalize_params({}, child_key, v) + end + else + params[k] ||= {} + raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Hash) + params[k] = normalize_params(params[k], after, v) + end + + return params + end + module_function :normalize_params + end +end |