escape_utils 0.1.5 → 0.1.6
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/CHANGELOG.md +4 -0
- data/VERSION +1 -1
- data/escape_utils.gemspec +11 -6
- data/ext/escape_utils.c +125 -2
- data/lib/escape_utils.rb +1 -1
- data/lib/escape_utils/html/cgi.rb +1 -1
- data/lib/escape_utils/url/cgi.rb +2 -2
- data/lib/escape_utils/url/erb.rb +1 -1
- data/lib/escape_utils/url/rack.rb +2 -2
- data/lib/escape_utils/url/uri.rb +10 -0
- data/spec/javascript/escape_spec.rb +3 -2
- data/spec/{url → query}/escape_spec.rb +0 -0
- data/spec/{url → query}/unescape_spec.rb +0 -0
- data/spec/uri/escape_spec.rb +52 -0
- data/spec/uri/unescape_spec.rb +55 -0
- metadata +13 -8
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.1.5 (September 6th, 2010)
|
4
|
+
* support for URI escaping added (thanks to @joshbuddy)
|
5
|
+
* bugfix to ensure we don't drop opening tags during escape_javascript (thanks to @nagybence)
|
6
|
+
|
3
7
|
## 0.1.5 (July 13th, 2010)
|
4
8
|
* add URL escaping and unescaping
|
5
9
|
* major refactor of HTML and Javascript escaping and unescaping logic for a decent speed up
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
data/escape_utils.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{escape_utils}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Brian Lopez"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-09-06}
|
13
13
|
s.email = %q{seniorlopez@gmail.com}
|
14
14
|
s.extensions = ["ext/extconf.rb"]
|
15
15
|
s.extra_rdoc_files = [
|
@@ -41,16 +41,19 @@ Gem::Specification.new do |s|
|
|
41
41
|
"lib/escape_utils/url/cgi.rb",
|
42
42
|
"lib/escape_utils/url/erb.rb",
|
43
43
|
"lib/escape_utils/url/rack.rb",
|
44
|
+
"lib/escape_utils/url/uri.rb",
|
44
45
|
"spec/html/escape_spec.rb",
|
45
46
|
"spec/html/unescape_spec.rb",
|
46
47
|
"spec/html_safety_spec.rb",
|
47
48
|
"spec/javascript/escape_spec.rb",
|
48
49
|
"spec/javascript/unescape_spec.rb",
|
50
|
+
"spec/query/escape_spec.rb",
|
51
|
+
"spec/query/unescape_spec.rb",
|
49
52
|
"spec/rcov.opts",
|
50
53
|
"spec/spec.opts",
|
51
54
|
"spec/spec_helper.rb",
|
52
|
-
"spec/
|
53
|
-
"spec/
|
55
|
+
"spec/uri/escape_spec.rb",
|
56
|
+
"spec/uri/unescape_spec.rb"
|
54
57
|
]
|
55
58
|
s.homepage = %q{http://github.com/brianmario/escape_utils}
|
56
59
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -63,9 +66,11 @@ Gem::Specification.new do |s|
|
|
63
66
|
"spec/html_safety_spec.rb",
|
64
67
|
"spec/javascript/escape_spec.rb",
|
65
68
|
"spec/javascript/unescape_spec.rb",
|
69
|
+
"spec/query/escape_spec.rb",
|
70
|
+
"spec/query/unescape_spec.rb",
|
66
71
|
"spec/spec_helper.rb",
|
67
|
-
"spec/
|
68
|
-
"spec/
|
72
|
+
"spec/uri/escape_spec.rb",
|
73
|
+
"spec/uri/unescape_spec.rb"
|
69
74
|
]
|
70
75
|
|
71
76
|
if s.respond_to? :specification_version then
|
data/ext/escape_utils.c
CHANGED
@@ -7,6 +7,8 @@ static rb_encoding *utf8Encoding;
|
|
7
7
|
#define IS_HEX(c) (c >= 48 || c <= 57) && (c >= 65 || c <= 70) && (c >= 97 || c <= 102)
|
8
8
|
#define NOT_HEX(c) (c < 48 || c > 57) && (c < 65 || c > 90) && (c < 97 || c > 122)
|
9
9
|
#define UNHEX(c) (c >= '0' && c <= '9' ? c - '0' : c >= 'A' && c <= 'F' ? c - 'A' + 10 : c - 'a' + 10)
|
10
|
+
#define URI_SAFE(c) (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= 38 && c <= 47) || c == 33 || c == 36 || c == 58 || c == 59 || c == 61 || c == 63 || c == 64 || c == 91 || c == 93 || c == 95 || c == 126
|
11
|
+
// \.:\/?\[\]\-_~\!\$&'\(\)\*\+,;=@
|
10
12
|
|
11
13
|
static size_t escape_html(unsigned char *out, const unsigned char *in, size_t in_len) {
|
12
14
|
size_t total = 0;
|
@@ -112,8 +114,9 @@ static size_t escape_javascript(unsigned char *out, const unsigned char *in, siz
|
|
112
114
|
total++;
|
113
115
|
break;
|
114
116
|
case '<':
|
117
|
+
*out++ = '<';
|
115
118
|
if (*in == '/') {
|
116
|
-
*out++ = '
|
119
|
+
*out++ = '\\'; *out++ = '/';
|
117
120
|
in++; in_len--;
|
118
121
|
total++;
|
119
122
|
}
|
@@ -234,6 +237,51 @@ static size_t unescape_url(unsigned char *out, const unsigned char *in, size_t i
|
|
234
237
|
return total;
|
235
238
|
}
|
236
239
|
|
240
|
+
static size_t escape_uri(unsigned char *out, const unsigned char *in, size_t in_len) {
|
241
|
+
size_t total = 0;
|
242
|
+
unsigned char curChar, hex[2];
|
243
|
+
const unsigned char hexChars[16] = "0123456789ABCDEF";
|
244
|
+
|
245
|
+
total = in_len;
|
246
|
+
while (in_len) {
|
247
|
+
curChar = *in++;
|
248
|
+
if (URI_SAFE(curChar)) {
|
249
|
+
*out++ = curChar;
|
250
|
+
} else {
|
251
|
+
hex[1] = hexChars[curChar & 0x0f];
|
252
|
+
hex[0] = hexChars[(curChar >> 4) & 0x0f];
|
253
|
+
*out++ = '%'; *out++ = hex[0]; *out++ = hex[1];
|
254
|
+
total += 2;
|
255
|
+
}
|
256
|
+
in_len--;
|
257
|
+
}
|
258
|
+
|
259
|
+
return total;
|
260
|
+
}
|
261
|
+
|
262
|
+
static size_t unescape_uri(unsigned char *out, const unsigned char *in, size_t in_len) {
|
263
|
+
size_t total = 0, len = in_len;
|
264
|
+
unsigned char curChar, *start;
|
265
|
+
|
266
|
+
start = (unsigned char *)&in[0];
|
267
|
+
total = in_len;
|
268
|
+
while (len) {
|
269
|
+
curChar = *in++;
|
270
|
+
if (curChar == '%') {
|
271
|
+
if ((in-start)+2 <= in_len && IS_HEX(*in) && IS_HEX(*(in+1))) {
|
272
|
+
*out++ = (UNHEX(*in) << 4) + UNHEX(*(in+1));
|
273
|
+
in+=2;
|
274
|
+
total-=2;
|
275
|
+
}
|
276
|
+
} else {
|
277
|
+
*out++ = curChar;
|
278
|
+
}
|
279
|
+
len--;
|
280
|
+
}
|
281
|
+
|
282
|
+
return total;
|
283
|
+
}
|
284
|
+
|
237
285
|
static VALUE rb_escape_html(VALUE self, VALUE str) {
|
238
286
|
Check_Type(str, T_STRING);
|
239
287
|
|
@@ -452,6 +500,76 @@ static VALUE rb_unescape_url(VALUE self, VALUE str) {
|
|
452
500
|
return rb_output_buf;
|
453
501
|
}
|
454
502
|
|
503
|
+
static VALUE rb_escape_uri(VALUE self, VALUE str) {
|
504
|
+
Check_Type(str, T_STRING);
|
505
|
+
|
506
|
+
VALUE rb_output_buf;
|
507
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
508
|
+
rb_encoding *default_internal_enc = rb_default_internal_encoding();
|
509
|
+
rb_encoding *original_encoding = rb_enc_get(str);
|
510
|
+
#endif
|
511
|
+
unsigned char *inBuf = (unsigned char*)RSTRING_PTR(str);
|
512
|
+
size_t len = RSTRING_LEN(str), new_len = 0;
|
513
|
+
|
514
|
+
// this is the max size the string could be
|
515
|
+
// TODO: we should try to be more intelligent about this
|
516
|
+
unsigned char *outBuf = (unsigned char *)malloc(sizeof(unsigned char *)*(len*3));
|
517
|
+
|
518
|
+
// perform our escape, returning the new string's length
|
519
|
+
new_len = escape_uri(outBuf, inBuf, len);
|
520
|
+
|
521
|
+
// create our new ruby string
|
522
|
+
rb_output_buf = rb_str_new((char *)outBuf, new_len);
|
523
|
+
|
524
|
+
// free the temporary C string
|
525
|
+
free(outBuf);
|
526
|
+
|
527
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
528
|
+
rb_enc_associate(rb_output_buf, original_encoding);
|
529
|
+
if (default_internal_enc) {
|
530
|
+
rb_output_buf = rb_str_export_to_enc(rb_output_buf, default_internal_enc);
|
531
|
+
} else {
|
532
|
+
rb_output_buf = rb_str_export_to_enc(rb_output_buf, utf8Encoding);
|
533
|
+
}
|
534
|
+
#endif
|
535
|
+
return rb_output_buf;
|
536
|
+
}
|
537
|
+
|
538
|
+
static VALUE rb_unescape_uri(VALUE self, VALUE str) {
|
539
|
+
Check_Type(str, T_STRING);
|
540
|
+
|
541
|
+
VALUE rb_output_buf;
|
542
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
543
|
+
rb_encoding *default_internal_enc = rb_default_internal_encoding();
|
544
|
+
rb_encoding *original_encoding = rb_enc_get(str);
|
545
|
+
#endif
|
546
|
+
unsigned char *inBuf = (unsigned char*)RSTRING_PTR(str);
|
547
|
+
size_t len = RSTRING_LEN(str), new_len = 0;
|
548
|
+
|
549
|
+
// this is the max size the string could be
|
550
|
+
// TODO: we should try to be more intelligent about this
|
551
|
+
unsigned char *outBuf = (unsigned char *)malloc(sizeof(unsigned char *)*len);
|
552
|
+
|
553
|
+
// perform our escape, returning the new string's length
|
554
|
+
new_len = unescape_uri(outBuf, inBuf, len);
|
555
|
+
|
556
|
+
// create our new ruby string
|
557
|
+
rb_output_buf = rb_str_new((char *)outBuf, new_len);
|
558
|
+
|
559
|
+
// free the temporary C string
|
560
|
+
free(outBuf);
|
561
|
+
|
562
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
563
|
+
rb_enc_associate(rb_output_buf, original_encoding);
|
564
|
+
if (default_internal_enc) {
|
565
|
+
rb_output_buf = rb_str_export_to_enc(rb_output_buf, default_internal_enc);
|
566
|
+
} else {
|
567
|
+
rb_output_buf = rb_str_export_to_enc(rb_output_buf, utf8Encoding);
|
568
|
+
}
|
569
|
+
#endif
|
570
|
+
return rb_output_buf;
|
571
|
+
}
|
572
|
+
|
455
573
|
/* Ruby Extension initializer */
|
456
574
|
void Init_escape_utils_ext() {
|
457
575
|
VALUE mEscape = rb_define_module("EscapeUtils");
|
@@ -467,8 +585,13 @@ void Init_escape_utils_ext() {
|
|
467
585
|
rb_define_module_function(mEscape, "escape_url", rb_escape_url, 1);
|
468
586
|
rb_define_method(mEscape, "unescape_url", rb_unescape_url, 1);
|
469
587
|
rb_define_module_function(mEscape, "unescape_url", rb_unescape_url, 1);
|
588
|
+
rb_define_method(mEscape, "escape_uri", rb_escape_uri, 1);
|
589
|
+
rb_define_module_function(mEscape, "escape_uri", rb_escape_uri, 1);
|
590
|
+
rb_define_method(mEscape, "unescape_uri", rb_unescape_uri, 1);
|
591
|
+
rb_define_module_function(mEscape, "unescape_uri", rb_unescape_uri, 1);
|
470
592
|
|
471
593
|
#ifdef HAVE_RUBY_ENCODING_H
|
472
594
|
utf8Encoding = rb_utf8_encoding();
|
473
595
|
#endif
|
474
|
-
}
|
596
|
+
}
|
597
|
+
|
data/lib/escape_utils.rb
CHANGED
data/lib/escape_utils/url/cgi.rb
CHANGED
data/lib/escape_utils/url/erb.rb
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
module Rack
|
4
4
|
module Utils
|
5
5
|
def escape(url)
|
6
|
-
EscapeUtils.escape_url(url)
|
6
|
+
EscapeUtils.escape_url(url.to_s)
|
7
7
|
end
|
8
8
|
def unescape(url)
|
9
|
-
EscapeUtils.unescape_url(url)
|
9
|
+
EscapeUtils.unescape_url(url.to_s)
|
10
10
|
end
|
11
11
|
module_function :escape
|
12
12
|
module_function :unescape
|
@@ -20,7 +20,7 @@ describe EscapeUtils, "escape_javascript" do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should escape closed html tags" do
|
23
|
-
EscapeUtils.escape_javascript(%(dont </close> tags)).should eql(%(dont <\\/close> tags))
|
23
|
+
EscapeUtils.escape_javascript(%(keep <open>, but dont </close> tags)).should eql(%(keep <open>, but dont <\\/close> tags))
|
24
24
|
end
|
25
25
|
|
26
26
|
if RUBY_VERSION =~ /^1.9/
|
@@ -36,4 +36,5 @@ describe EscapeUtils, "escape_javascript" do
|
|
36
36
|
EscapeUtils.escape_javascript(%(dont </close> tags)).encoding.should eql(Encoding.default_internal)
|
37
37
|
end
|
38
38
|
end
|
39
|
-
end
|
39
|
+
end
|
40
|
+
|
File without changes
|
File without changes
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
|
3
|
+
|
4
|
+
describe EscapeUtils, "escape_uri" do
|
5
|
+
it "should respond to escape_uri" do
|
6
|
+
EscapeUtils.should respond_to(:escape_uri)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should escape a basic url" do
|
10
|
+
EscapeUtils.escape_uri("http://www.homerun.com/").should eql("http://www.homerun.com/")
|
11
|
+
end
|
12
|
+
|
13
|
+
# NOTE: from Rack's test suite
|
14
|
+
it "should escape a url containing tags" do
|
15
|
+
EscapeUtils.escape_uri("fo<o>bar").should eql("fo%3Co%3Ebar")
|
16
|
+
end
|
17
|
+
|
18
|
+
# NOTE: from Rack's test suite
|
19
|
+
it "should escape a url with spaces" do
|
20
|
+
EscapeUtils.escape_uri("a space").should eql("a%20space")
|
21
|
+
EscapeUtils.escape_uri("a sp ace ").should eql("a%20%20%20sp%20ace%20")
|
22
|
+
end
|
23
|
+
|
24
|
+
# NOTE: from Rack's test suite
|
25
|
+
it "should escape a string of mixed characters" do
|
26
|
+
EscapeUtils.escape_uri("q1!2\"'w$5&7/z8)?\\").should eql("q1!2%22'w$5&7/z8)?%5C")
|
27
|
+
end
|
28
|
+
|
29
|
+
# NOTE: from Rack's test suite
|
30
|
+
it "should escape correctly for multibyte characters" do
|
31
|
+
matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsumoto
|
32
|
+
matz_name.force_encoding("UTF-8") if matz_name.respond_to? :force_encoding
|
33
|
+
EscapeUtils.escape_uri(matz_name).should eql('%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8')
|
34
|
+
matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsu moto
|
35
|
+
matz_name_sep.force_encoding("UTF-8") if matz_name_sep.respond_to? :force_encoding
|
36
|
+
EscapeUtils.escape_uri(matz_name_sep).should eql('%E3%81%BE%E3%81%A4%20%E3%82%82%E3%81%A8')
|
37
|
+
end
|
38
|
+
|
39
|
+
if RUBY_VERSION =~ /^1.9/
|
40
|
+
it "should default to utf-8 if Encoding.default_internal is nil" do
|
41
|
+
Encoding.default_internal = nil
|
42
|
+
EscapeUtils.escape_uri("http://www.homerun.com/").encoding.should eql(Encoding.find('utf-8'))
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should use Encoding.default_internal" do
|
46
|
+
Encoding.default_internal = Encoding.find('utf-8')
|
47
|
+
EscapeUtils.escape_uri("http://www.homerun.com/").encoding.should eql(Encoding.default_internal)
|
48
|
+
Encoding.default_internal = Encoding.find('us-ascii')
|
49
|
+
EscapeUtils.escape_uri("http://www.homerun.com/").encoding.should eql(Encoding.default_internal)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
|
3
|
+
|
4
|
+
describe EscapeUtils, "unescape_uri" do
|
5
|
+
it "should respond to unescape_uri" do
|
6
|
+
EscapeUtils.should respond_to(:unescape_uri)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should unescape a basic url" do
|
10
|
+
EscapeUtils.unescape_uri("http%3A%2F%2Fwww.homerun.com%2F").should eql("http://www.homerun.com/")
|
11
|
+
EscapeUtils.unescape_uri("http://www.homerun.com/").should eql("http://www.homerun.com/")
|
12
|
+
end
|
13
|
+
|
14
|
+
# NOTE: from Rack's test suite
|
15
|
+
it "should unescape a url containing tags" do
|
16
|
+
EscapeUtils.unescape_uri("fo%3Co%3Ebar").should eql("fo<o>bar")
|
17
|
+
end
|
18
|
+
|
19
|
+
# NOTE: from Rack's test suite
|
20
|
+
it "should unescape a url with spaces" do
|
21
|
+
EscapeUtils.unescape_uri("a%20space").should eql("a space")
|
22
|
+
EscapeUtils.unescape_uri("a%20%20%20sp%20ace%20").should eql("a sp ace ")
|
23
|
+
EscapeUtils.unescape_uri("a+space").should eql("a+space")
|
24
|
+
end
|
25
|
+
|
26
|
+
# NOTE: from Rack's test suite
|
27
|
+
it "should unescape a string of mixed characters" do
|
28
|
+
EscapeUtils.unescape_uri("q1%212%22%27w%245%267%2Fz8%29%3F%5C").should eql("q1!2\"'w$5&7/z8)?\\")
|
29
|
+
EscapeUtils.unescape_uri("q1!2%22'w$5&7/z8)?%5C").should eql("q1!2\"'w$5&7/z8)?\\")
|
30
|
+
end
|
31
|
+
|
32
|
+
# NOTE: from Rack's test suite
|
33
|
+
it "should unescape correctly for multibyte characters" do
|
34
|
+
matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsumoto
|
35
|
+
matz_name.force_encoding("UTF-8") if matz_name.respond_to? :force_encoding
|
36
|
+
EscapeUtils.unescape_uri('%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8').should eql(matz_name)
|
37
|
+
matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsu moto
|
38
|
+
matz_name_sep.force_encoding("UTF-8") if matz_name_sep.respond_to? :force_encoding
|
39
|
+
EscapeUtils.unescape_uri('%E3%81%BE%E3%81%A4%20%E3%82%82%E3%81%A8').should eql(matz_name_sep)
|
40
|
+
end
|
41
|
+
|
42
|
+
if RUBY_VERSION =~ /^1.9/
|
43
|
+
it "should default to utf-8 if Encoding.default_internal is nil" do
|
44
|
+
Encoding.default_internal = nil
|
45
|
+
EscapeUtils.unescape_uri("http%3A%2F%2Fwww.homerun.com%2F").encoding.should eql(Encoding.find('utf-8'))
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should use Encoding.default_internal" do
|
49
|
+
Encoding.default_internal = Encoding.find('utf-8')
|
50
|
+
EscapeUtils.unescape_uri("http%3A%2F%2Fwww.homerun.com%2F").encoding.should eql(Encoding.default_internal)
|
51
|
+
Encoding.default_internal = Encoding.find('us-ascii')
|
52
|
+
EscapeUtils.unescape_uri("http%3A%2F%2Fwww.homerun.com%2F").encoding.should eql(Encoding.default_internal)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: escape_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 6
|
10
|
+
version: 0.1.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Brian Lopez
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-09-06 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -53,16 +53,19 @@ files:
|
|
53
53
|
- lib/escape_utils/url/cgi.rb
|
54
54
|
- lib/escape_utils/url/erb.rb
|
55
55
|
- lib/escape_utils/url/rack.rb
|
56
|
+
- lib/escape_utils/url/uri.rb
|
56
57
|
- spec/html/escape_spec.rb
|
57
58
|
- spec/html/unescape_spec.rb
|
58
59
|
- spec/html_safety_spec.rb
|
59
60
|
- spec/javascript/escape_spec.rb
|
60
61
|
- spec/javascript/unescape_spec.rb
|
62
|
+
- spec/query/escape_spec.rb
|
63
|
+
- spec/query/unescape_spec.rb
|
61
64
|
- spec/rcov.opts
|
62
65
|
- spec/spec.opts
|
63
66
|
- spec/spec_helper.rb
|
64
|
-
- spec/
|
65
|
-
- spec/
|
67
|
+
- spec/uri/escape_spec.rb
|
68
|
+
- spec/uri/unescape_spec.rb
|
66
69
|
has_rdoc: true
|
67
70
|
homepage: http://github.com/brianmario/escape_utils
|
68
71
|
licenses: []
|
@@ -104,6 +107,8 @@ test_files:
|
|
104
107
|
- spec/html_safety_spec.rb
|
105
108
|
- spec/javascript/escape_spec.rb
|
106
109
|
- spec/javascript/unescape_spec.rb
|
110
|
+
- spec/query/escape_spec.rb
|
111
|
+
- spec/query/unescape_spec.rb
|
107
112
|
- spec/spec_helper.rb
|
108
|
-
- spec/
|
109
|
-
- spec/
|
113
|
+
- spec/uri/escape_spec.rb
|
114
|
+
- spec/uri/unescape_spec.rb
|