diff --git a/lib/paperclip/interpolated_string.rb b/lib/paperclip/interpolated_string.rb new file mode 100644 index 000000000..bb8da8245 --- /dev/null +++ b/lib/paperclip/interpolated_string.rb @@ -0,0 +1,33 @@ +require 'uri' + +module Paperclip + class InterpolatedString < String + def escaped? + !!@escaped + end + + def escape + if !escaped? + escaped_string = self.class.new(URI.escape(self)) + escaped_string.instance_variable_set(:@escaped, true) + escaped_string + else + self + end + end + + def unescape + if escaped? + escaped_string = self.class.new(URI.unescape(self)) + escaped_string.instance_variable_set(:@escaped, false) + escaped_string + else + self + end + end + + def force_escape + @escaped = true + end + end +end diff --git a/test/interpolated_string_test.rb b/test/interpolated_string_test.rb new file mode 100644 index 000000000..6e243a256 --- /dev/null +++ b/test/interpolated_string_test.rb @@ -0,0 +1,62 @@ +require './test/helper' + +class InterpolatedStringTest < Test::Unit::TestCase + context "inheritance" do + should "inherited from String" do + assert Paperclip::InterpolatedString.new("paperclip").is_a? String + end + end + + context "#escape" do + subject { Paperclip::InterpolatedString.new("paperclip foo").escape } + + should "returns an InterpolatedString object" do + assert subject.is_a? Paperclip::InterpolatedString + end + + should "escape the output string" do + assert_equal "paperclip%20foo", subject + end + + should "not double escape output string" do + assert_equal "paperclip%20foo", subject.escape + end + end + + context "#unescape" do + subject { Paperclip::InterpolatedString.new("paperclip%20foo").escape.unescape } + + should "returns an InterpolatedString object" do + assert subject.is_a? Paperclip::InterpolatedString + end + + should "unescape the output string" do + assert_equal "paperclip%20foo", subject + end + + should "not double unescape output string" do + assert_equal "paperclip%20foo", subject.unescape + end + end + + context "#escaped?" do + subject { Paperclip::InterpolatedString.new("paperclip") } + + should "returns true if string was escaped" do + assert subject.escape.escaped? + end + + should "returns false if string wasn't escaped" do + assert !subject.escaped? + end + end + + context "#force_escape" do + subject { Paperclip::InterpolatedString.new("paperclip") } + setup { subject.force_escape } + + should "sets escaped flag to true" do + assert subject.escaped? + end + end +end