Skip to content
Browse files

Add Paperclip::InterpolatedString to store the interpolated string wh…

…ich has an escape flag
  • Loading branch information...
1 parent f7fdc9f commit db60516ca9790a70210ac943bd34e666c6994840 @sikachu sikachu committed Oct 7, 2011
Showing with 95 additions and 0 deletions.
  1. +33 −0 lib/paperclip/interpolated_string.rb
  2. +62 −0 test/interpolated_string_test.rb
View
33 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
View
62 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

0 comments on commit db60516

Please sign in to comment.
Something went wrong with that request. Please try again.