escape_utils 1.2.1 → 1.2.2
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.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +43 -0
- data/.gitignore +0 -1
- data/CHANGELOG.md +13 -0
- data/Gemfile +15 -0
- data/README.md +2 -4
- data/Rakefile +4 -2
- data/bin/console +8 -0
- data/escape_utils.gemspec +1 -12
- data/ext/escape_utils/escape_utils.c +1 -1
- data/ext/escape_utils/houdini_js_e.c +15 -3
- data/ext/escape_utils/houdini_uri_e.c +1 -1
- data/lib/escape_utils/url/rack.rb +0 -12
- data/lib/escape_utils/version.rb +1 -1
- data/lib/escape_utils/xml/builder.rb +2 -2
- data/test/html/escape_test.rb +16 -18
- data/test/html/unescape_test.rb +16 -18
- data/test/javascript/escape_test.rb +58 -20
- data/test/javascript/unescape_test.rb +16 -18
- data/test/query/escape_test.rb +16 -18
- data/test/query/unescape_test.rb +16 -18
- data/test/uri/escape_test.rb +16 -18
- data/test/uri/unescape_test.rb +15 -17
- data/test/uri_component/escape_test.rb +15 -17
- data/test/uri_component/unescape_test.rb +15 -17
- data/test/url/escape_test.rb +15 -17
- data/test/url/unescape_test.rb +15 -17
- data/test/xml/escape_test.rb +15 -17
- metadata +11 -122
- data/.travis.yml +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6f26c8a24ba01ecb130e04ef9af6802ab2deb56455527ccd551ae93839736604
|
4
|
+
data.tar.gz: 4fc6f51b66cd0c773cf3aea923023ccb66e31cd865e9b89da81a9119540cae05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0f6556bd83c1068189d5a3183b2ad1df88bd4a79f46f119ae7fcfdff4339544d6e1654379fe0b64cd6f07865c67eafa83b9caa236e0ac6b23de1814fd808b2e
|
7
|
+
data.tar.gz: dd5e1b3baf9c594d48f0580f6c71c766e7e341fce332dba8fbd7f0a36d8611bb70e043ef3808c95e9d6a774a71d088e1136ff8025c2ae43e1588f0500d8d04ad
|
@@ -0,0 +1,43 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
rubies:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
strategy:
|
9
|
+
fail-fast: false
|
10
|
+
matrix:
|
11
|
+
ruby: [ ruby-head, '3.1', '3.0', '2.7', '2.6', '2.5' ]
|
12
|
+
steps:
|
13
|
+
- name: Checkout
|
14
|
+
uses: actions/checkout@v2
|
15
|
+
- name: Set up Ruby
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: ${{ matrix.ruby }}
|
19
|
+
- name: Install dependencies
|
20
|
+
run: bundle install
|
21
|
+
- name: Run test
|
22
|
+
run: rake
|
23
|
+
- name: Install gem
|
24
|
+
run: rake install
|
25
|
+
platforms:
|
26
|
+
strategy:
|
27
|
+
matrix:
|
28
|
+
os: [macos, windows]
|
29
|
+
ruby: ['2.5']
|
30
|
+
runs-on: ${{ matrix.os }}-latest
|
31
|
+
steps:
|
32
|
+
- name: Checkout
|
33
|
+
uses: actions/checkout@v3
|
34
|
+
- name: Set up Ruby
|
35
|
+
uses: ruby/setup-ruby@v1
|
36
|
+
with:
|
37
|
+
ruby-version: ${{ matrix.ruby }}
|
38
|
+
- name: Install dependencies
|
39
|
+
run: bundle install
|
40
|
+
- name: Run test
|
41
|
+
run: bundle exec rake
|
42
|
+
- name: Install gem
|
43
|
+
run: bundle exec rake install
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Unreleased
|
2
|
+
|
3
|
+
# 1.2.2
|
4
|
+
|
5
|
+
- Update EscapeUtils.escape_javascript to match Rails `escape_javascript`
|
6
|
+
Now escapes, Backquotes (```), Dollar (`$`), `U+2000` and `U+2001`
|
7
|
+
- Make the Rack monkey patch a noop as it's no longer correct since circa 2011.
|
8
|
+
- Require Ruby 2.5+
|
9
|
+
- Stop escaping `~` like `CGI.escape` does since Ruby 2.5
|
10
|
+
|
11
|
+
# 1.2.1
|
12
|
+
|
13
|
+
- Historical version
|
data/Gemfile
CHANGED
@@ -1,3 +1,18 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
+
group :test do
|
4
|
+
gem 'rake-compiler'
|
5
|
+
gem 'minitest'
|
6
|
+
gem 'actionview'
|
7
|
+
end
|
8
|
+
|
9
|
+
group :benchmark do
|
10
|
+
gem 'benchmark-ips'
|
11
|
+
gem 'rack'
|
12
|
+
gem 'haml'
|
13
|
+
gem 'fast_xs'
|
14
|
+
gem 'actionpack'
|
15
|
+
gem 'url_escape'
|
16
|
+
end
|
17
|
+
|
3
18
|
gemspec
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Being as though we're all html escaping everything these days, why not make it faster?
|
4
4
|
|
5
|
-
For character encoding
|
5
|
+
For character encoding, the output string's encoding is copied from the input string.
|
6
6
|
|
7
7
|
It has monkey-patches for Rack::Utils, CGI, URI, ERB::Util and Haml and ActionView so you can drop this in and have your app start escaping fast as balls in no time
|
8
8
|
|
@@ -10,7 +10,7 @@ It supports HTML, URL, URI and Javascript escaping/unescaping.
|
|
10
10
|
|
11
11
|
## Installing
|
12
12
|
|
13
|
-
Compatible with Ruby
|
13
|
+
Compatible with Ruby 2.5+
|
14
14
|
|
15
15
|
``` sh
|
16
16
|
gem install escape_utils
|
@@ -52,7 +52,6 @@ html = EscapeUtils.unescape_html(escaped_html)
|
|
52
52
|
#### Monkey Patches
|
53
53
|
|
54
54
|
``` ruby
|
55
|
-
require 'escape_utils/html/rack' # to patch Rack::Utils
|
56
55
|
require 'escape_utils/html/erb' # to patch ERB::Util
|
57
56
|
require 'escape_utils/html/cgi' # to patch CGI
|
58
57
|
require 'escape_utils/html/haml' # to patch Haml::Helpers
|
@@ -84,7 +83,6 @@ EscapeUtils.unescape_url(escaped_url) == url # => true
|
|
84
83
|
``` ruby
|
85
84
|
require 'escape_utils/url/cgi' # to patch CGI
|
86
85
|
require 'escape_utils/url/erb' # to patch ERB::Util
|
87
|
-
require 'escape_utils/url/rack' # to patch Rack::Utils
|
88
86
|
require 'escape_utils/url/uri' # to patch URI
|
89
87
|
```
|
90
88
|
|
data/Rakefile
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
1
2
|
require 'rake/testtask'
|
2
3
|
|
3
4
|
Rake::TestTask.new do |t|
|
4
|
-
t.
|
5
|
+
t.libs << "test"
|
6
|
+
t.libs << "lib"
|
7
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
5
8
|
end
|
6
9
|
|
7
10
|
task :default => :test
|
8
11
|
|
9
|
-
gem 'rake-compiler', '>= 0.7.5'
|
10
12
|
require "rake/extensiontask"
|
11
13
|
|
12
14
|
Rake::ExtensionTask.new('escape_utils') do |ext|
|
data/bin/console
ADDED
data/escape_utils.gemspec
CHANGED
@@ -16,16 +16,5 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.description = %q{Quickly perform HTML, URL, URI and Javascript escaping/unescaping}
|
17
17
|
s.test_files = `git ls-files test`.split("\n")
|
18
18
|
|
19
|
-
s.required_ruby_version = ">=
|
20
|
-
|
21
|
-
# tests
|
22
|
-
s.add_development_dependency 'rake-compiler', ">= 0.7.5"
|
23
|
-
s.add_development_dependency 'minitest', ">= 5.0.0"
|
24
|
-
# benchmarks
|
25
|
-
s.add_development_dependency 'benchmark-ips'
|
26
|
-
s.add_development_dependency 'rack'
|
27
|
-
s.add_development_dependency 'haml'
|
28
|
-
s.add_development_dependency 'fast_xs'
|
29
|
-
s.add_development_dependency 'actionpack'
|
30
|
-
s.add_development_dependency 'url_escape'
|
19
|
+
s.required_ruby_version = ">= 2.5"
|
31
20
|
end
|
@@ -167,7 +167,7 @@ static VALUE rb_eu_escape_xml(VALUE self, VALUE str)
|
|
167
167
|
*/
|
168
168
|
static VALUE rb_eu_escape_js(VALUE self, VALUE str)
|
169
169
|
{
|
170
|
-
return rb_eu__generic(str, &houdini_escape_js);
|
170
|
+
return rb_eu__generic(rb_obj_as_string(str), &houdini_escape_js);
|
171
171
|
}
|
172
172
|
|
173
173
|
static VALUE rb_eu_unescape_js(VALUE self, VALUE str)
|
@@ -7,10 +7,11 @@
|
|
7
7
|
static const char JS_ESCAPE[] = {
|
8
8
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
|
9
9
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
10
|
-
0, 0, 1, 0,
|
10
|
+
0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
|
11
11
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
12
12
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
13
13
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
|
14
|
+
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
14
15
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
15
16
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
16
17
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
@@ -18,8 +19,7 @@ static const char JS_ESCAPE[] = {
|
|
18
19
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
19
20
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
20
21
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
21
|
-
0, 0,
|
22
|
-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
22
|
+
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
23
23
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
24
24
|
};
|
25
25
|
|
@@ -51,6 +51,18 @@ houdini_escape_js(gh_buf *ob, const uint8_t *src, size_t size)
|
|
51
51
|
ch = src[i];
|
52
52
|
|
53
53
|
switch (ch) {
|
54
|
+
case 226:
|
55
|
+
if (i + 2 < size && src[i + 1] == 128) {
|
56
|
+
if (src[i + 2] == 168) {
|
57
|
+
gh_buf_put(ob, "
", 8);
|
58
|
+
i += 2;
|
59
|
+
} else if (src[i + 2] == 169) {
|
60
|
+
gh_buf_put(ob, "
", 8);
|
61
|
+
i += 2;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
break;
|
65
|
+
|
54
66
|
case '/':
|
55
67
|
/*
|
56
68
|
* Escape only if preceded by a lt
|
@@ -12,7 +12,7 @@ static const char URL_SAFE[] = {
|
|
12
12
|
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
13
13
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
|
14
14
|
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
15
|
-
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
|
15
|
+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0,
|
16
16
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
17
17
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
18
18
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
data/lib/escape_utils/version.rb
CHANGED
data/test/html/escape_test.rb
CHANGED
@@ -105,26 +105,24 @@ class HtmlEscapeTest < Minitest::Test
|
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
EscapeUtils.escape_html(str)
|
115
|
-
end
|
116
|
-
|
117
|
-
str.force_encoding 'UTF-8'
|
118
|
-
begin
|
119
|
-
EscapeUtils.escape_html(str)
|
120
|
-
rescue Encoding::CompatibilityError => e
|
121
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
122
|
-
end
|
108
|
+
def test_utf8_or_ascii_input_only
|
109
|
+
str = "<b>Bourbon & Branch</b>"
|
110
|
+
|
111
|
+
str.force_encoding 'ISO-8859-1'
|
112
|
+
assert_raises Encoding::CompatibilityError do
|
113
|
+
EscapeUtils.escape_html(str)
|
123
114
|
end
|
124
115
|
|
125
|
-
|
126
|
-
|
127
|
-
|
116
|
+
str.force_encoding 'UTF-8'
|
117
|
+
begin
|
118
|
+
EscapeUtils.escape_html(str)
|
119
|
+
rescue Encoding::CompatibilityError => e
|
120
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
128
121
|
end
|
129
122
|
end
|
123
|
+
|
124
|
+
def test_return_value_is_tagged_as_utf8
|
125
|
+
str = "<b>Bourbon & Branch</b>".encode('utf-8')
|
126
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_html(str).encoding
|
127
|
+
end
|
130
128
|
end
|
data/test/html/unescape_test.rb
CHANGED
@@ -23,26 +23,24 @@ class HtmlUnescapeTest < Minitest::Test
|
|
23
23
|
assert_equal "<", EscapeUtils.unescape_html("<")
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
EscapeUtils.unescape_html(escaped)
|
33
|
-
end
|
34
|
-
|
35
|
-
escaped.force_encoding 'UTF-8'
|
36
|
-
begin
|
37
|
-
EscapeUtils.unescape_html(escaped)
|
38
|
-
rescue Encoding::CompatibilityError => e
|
39
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
40
|
-
end
|
26
|
+
def test_input_must_be_utf8_or_ascii
|
27
|
+
escaped = EscapeUtils.escape_html("<b>Bourbon & Branch</b>")
|
28
|
+
|
29
|
+
escaped.force_encoding 'ISO-8859-1'
|
30
|
+
assert_raises Encoding::CompatibilityError do
|
31
|
+
EscapeUtils.unescape_html(escaped)
|
41
32
|
end
|
42
33
|
|
43
|
-
|
44
|
-
|
45
|
-
|
34
|
+
escaped.force_encoding 'UTF-8'
|
35
|
+
begin
|
36
|
+
EscapeUtils.unescape_html(escaped)
|
37
|
+
rescue Encoding::CompatibilityError => e
|
38
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
46
39
|
end
|
47
40
|
end
|
41
|
+
|
42
|
+
def test_return_value_is_tagged_as_utf8
|
43
|
+
escaped = EscapeUtils.escape_html("<b>Bourbon & Branch</b>")
|
44
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_html(escaped).encoding
|
45
|
+
end
|
48
46
|
end
|
@@ -1,42 +1,80 @@
|
|
1
1
|
require File.expand_path("../../helper", __FILE__)
|
2
2
|
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_support/json'
|
5
|
+
require 'action_view'
|
6
|
+
require 'action_view/helpers'
|
7
|
+
|
3
8
|
class JavascriptEscapeTest < Minitest::Test
|
9
|
+
ActiveSupport.escape_html_entities_in_json = true
|
10
|
+
|
11
|
+
module ActionViewHelper
|
12
|
+
include ActionView::Helpers::JavaScriptHelper
|
13
|
+
extend self
|
14
|
+
end
|
15
|
+
|
4
16
|
def test_returns_empty_string_if_nil_passed
|
5
|
-
|
17
|
+
assert_compatible nil
|
6
18
|
end
|
7
19
|
|
8
20
|
def test_quotes_and_newlines
|
9
|
-
|
21
|
+
assert_compatible %(This "thing" is really\n netos\r\n\n')
|
10
22
|
end
|
11
23
|
|
12
24
|
def test_backslashes
|
13
|
-
|
25
|
+
assert_compatible %(backslash\\test)
|
14
26
|
end
|
15
27
|
|
16
28
|
def test_closed_html_tags
|
17
|
-
|
29
|
+
assert_compatible %(keep <open>, but dont </close> tags)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_escape_javascript
|
33
|
+
assert_compatible 123
|
34
|
+
assert_compatible :en
|
35
|
+
assert_compatible false
|
36
|
+
assert_compatible true
|
37
|
+
assert_compatible %(don't </close> tags)
|
38
|
+
assert_compatible (+%(unicode \342\200\250 newline)).force_encoding(Encoding::UTF_8).encode!
|
39
|
+
assert_compatible (+%(unicode \342\200\251 newline)).force_encoding(Encoding::UTF_8).encode!
|
40
|
+
assert_compatible %(don't </close> tags)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_escape_backtick
|
44
|
+
assert_compatible "`"
|
18
45
|
end
|
19
46
|
|
20
|
-
|
21
|
-
|
22
|
-
|
47
|
+
def test_escape_dollar_sign
|
48
|
+
assert_compatible "$"
|
49
|
+
end
|
23
50
|
|
24
|
-
|
25
|
-
|
26
|
-
EscapeUtils.escape_javascript(str)
|
27
|
-
end
|
51
|
+
def test_input_must_be_utf8_or_ascii
|
52
|
+
str = "dont </close> tags"
|
28
53
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
rescue Encoding::CompatibilityError => e
|
33
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
34
|
-
end
|
54
|
+
str.force_encoding Encoding::ISO_8859_1
|
55
|
+
assert_raises Encoding::CompatibilityError do
|
56
|
+
EscapeUtils.escape_javascript(str)
|
35
57
|
end
|
36
58
|
|
37
|
-
|
38
|
-
|
39
|
-
|
59
|
+
str.force_encoding Encoding::UTF_8
|
60
|
+
begin
|
61
|
+
EscapeUtils.escape_javascript(str)
|
62
|
+
rescue Encoding::CompatibilityError => e
|
63
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
40
64
|
end
|
41
65
|
end
|
66
|
+
|
67
|
+
def test_return_value_is_tagged_as_utf8
|
68
|
+
str = "dont </close> tags"
|
69
|
+
assert_equal Encoding::UTF_8, EscapeUtils.escape_javascript(str).encoding
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def assert_compatible(src)
|
75
|
+
assert_equal(
|
76
|
+
ActionViewHelper.escape_javascript(src),
|
77
|
+
EscapeUtils.escape_javascript(src),
|
78
|
+
)
|
79
|
+
end
|
42
80
|
end
|
@@ -21,26 +21,24 @@ class JavascriptUnescapeTest < Minitest::Test
|
|
21
21
|
assert_equal "\\", EscapeUtils.unescape_javascript("\\")
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
EscapeUtils.unescape_javascript(escaped)
|
31
|
-
end
|
32
|
-
|
33
|
-
escaped.force_encoding 'UTF-8'
|
34
|
-
begin
|
35
|
-
EscapeUtils.unescape_javascript(escaped)
|
36
|
-
rescue Encoding::CompatibilityError => e
|
37
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
38
|
-
end
|
24
|
+
def test_input_must_be_utf8_or_ascii
|
25
|
+
escaped = EscapeUtils.escape_javascript("dont </close> tags")
|
26
|
+
|
27
|
+
escaped.force_encoding 'ISO-8859-1'
|
28
|
+
assert_raises Encoding::CompatibilityError do
|
29
|
+
EscapeUtils.unescape_javascript(escaped)
|
39
30
|
end
|
40
31
|
|
41
|
-
|
42
|
-
|
43
|
-
|
32
|
+
escaped.force_encoding 'UTF-8'
|
33
|
+
begin
|
34
|
+
EscapeUtils.unescape_javascript(escaped)
|
35
|
+
rescue Encoding::CompatibilityError => e
|
36
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
44
37
|
end
|
45
38
|
end
|
39
|
+
|
40
|
+
def test_return_value_is_tagged_as_utf8
|
41
|
+
escaped = EscapeUtils.escape_javascript("dont </close> tags")
|
42
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_javascript(escaped).encoding
|
43
|
+
end
|
46
44
|
end
|
data/test/query/escape_test.rb
CHANGED
@@ -25,26 +25,24 @@ class QueryEscapeTest < Minitest::Test
|
|
25
25
|
assert_equal '%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8', EscapeUtils.escape_url(matz_name_sep)
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
EscapeUtils.escape_url(str)
|
35
|
-
end
|
36
|
-
|
37
|
-
str.force_encoding 'UTF-8'
|
38
|
-
begin
|
39
|
-
EscapeUtils.escape_url(str)
|
40
|
-
rescue Encoding::CompatibilityError => e
|
41
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
42
|
-
end
|
28
|
+
def test_input_must_be_utf8_or_ascii
|
29
|
+
str = "a space"
|
30
|
+
|
31
|
+
str.force_encoding 'ISO-8859-1'
|
32
|
+
assert_raises Encoding::CompatibilityError do
|
33
|
+
EscapeUtils.escape_url(str)
|
43
34
|
end
|
44
35
|
|
45
|
-
|
46
|
-
|
47
|
-
|
36
|
+
str.force_encoding 'UTF-8'
|
37
|
+
begin
|
38
|
+
EscapeUtils.escape_url(str)
|
39
|
+
rescue Encoding::CompatibilityError => e
|
40
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
48
41
|
end
|
49
42
|
end
|
43
|
+
|
44
|
+
def test_return_value_is_tagged_as_utf8
|
45
|
+
str = "a+space"
|
46
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_url(str).encoding
|
47
|
+
end
|
50
48
|
end
|
data/test/query/unescape_test.rb
CHANGED
@@ -27,26 +27,24 @@ class QueryUnescapeTest < Minitest::Test
|
|
27
27
|
assert_equal matz_name_sep, EscapeUtils.unescape_url('%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8')
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
EscapeUtils.unescape_url(escaped)
|
37
|
-
end
|
38
|
-
|
39
|
-
escaped.force_encoding 'UTF-8'
|
40
|
-
begin
|
41
|
-
EscapeUtils.unescape_url(escaped)
|
42
|
-
rescue Encoding::CompatibilityError => e
|
43
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
44
|
-
end
|
30
|
+
def test_input_must_be_valid_utf8_or_ascii
|
31
|
+
escaped = EscapeUtils.unescape_url("a+space")
|
32
|
+
|
33
|
+
escaped.force_encoding 'ISO-8859-1'
|
34
|
+
assert_raises Encoding::CompatibilityError do
|
35
|
+
EscapeUtils.unescape_url(escaped)
|
45
36
|
end
|
46
37
|
|
47
|
-
|
48
|
-
|
49
|
-
|
38
|
+
escaped.force_encoding 'UTF-8'
|
39
|
+
begin
|
40
|
+
EscapeUtils.unescape_url(escaped)
|
41
|
+
rescue Encoding::CompatibilityError => e
|
42
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
50
43
|
end
|
51
44
|
end
|
45
|
+
|
46
|
+
def test_return_value_is_tagged_as_utf8
|
47
|
+
escaped = EscapeUtils.escape_url("a space")
|
48
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_url(escaped).encoding
|
49
|
+
end
|
52
50
|
end
|
data/test/uri/escape_test.rb
CHANGED
@@ -5,7 +5,7 @@ class UriEscapeTest < Minitest::Test
|
|
5
5
|
def test_uri_stdlib_compatibility
|
6
6
|
(0..127).each do |i|
|
7
7
|
c = i.chr
|
8
|
-
assert_equal URI.escape(c), EscapeUtils.escape_uri(c)
|
8
|
+
assert_equal URI::DEFAULT_PARSER.escape(c), EscapeUtils.escape_uri(c)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -33,26 +33,24 @@ class UriEscapeTest < Minitest::Test
|
|
33
33
|
assert_equal "a/slash", EscapeUtils.escape_uri("a/slash")
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
str = "fo<o>bar"
|
36
|
+
def test_input_must_be_utf8_or_ascii
|
37
|
+
str = "fo<o>bar"
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
str.force_encoding 'UTF-8'
|
46
|
-
begin
|
47
|
-
EscapeUtils.escape_uri(str)
|
48
|
-
rescue Encoding::CompatibilityError => e
|
49
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
50
|
-
end
|
39
|
+
str.force_encoding 'ISO-8859-1'
|
40
|
+
assert_raises Encoding::CompatibilityError do
|
41
|
+
EscapeUtils.escape_uri(str)
|
51
42
|
end
|
52
43
|
|
53
|
-
|
54
|
-
|
55
|
-
|
44
|
+
str.force_encoding 'UTF-8'
|
45
|
+
begin
|
46
|
+
EscapeUtils.escape_uri(str)
|
47
|
+
rescue Encoding::CompatibilityError => e
|
48
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
56
49
|
end
|
57
50
|
end
|
51
|
+
|
52
|
+
def test_return_value_is_tagged_as_utf8
|
53
|
+
str = "fo<o>bar"
|
54
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_uri(str).encoding
|
55
|
+
end
|
58
56
|
end
|
data/test/uri/unescape_test.rb
CHANGED
@@ -41,26 +41,24 @@ class UriUnescapeTest < Minitest::Test
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
escaped = EscapeUtils.escape_uri("fo<o>bar")
|
44
|
+
def test_input_must_be_valid_utf8_or_ascii
|
45
|
+
escaped = EscapeUtils.escape_uri("fo<o>bar")
|
47
46
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
escaped.force_encoding 'UTF-8'
|
54
|
-
begin
|
55
|
-
EscapeUtils.unescape_uri(escaped)
|
56
|
-
rescue Encoding::CompatibilityError => e
|
57
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
58
|
-
end
|
47
|
+
escaped.force_encoding 'ISO-8859-1'
|
48
|
+
assert_raises Encoding::CompatibilityError do
|
49
|
+
EscapeUtils.unescape_uri(escaped)
|
59
50
|
end
|
60
51
|
|
61
|
-
|
62
|
-
|
63
|
-
|
52
|
+
escaped.force_encoding 'UTF-8'
|
53
|
+
begin
|
54
|
+
EscapeUtils.unescape_uri(escaped)
|
55
|
+
rescue Encoding::CompatibilityError => e
|
56
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
64
57
|
end
|
65
58
|
end
|
59
|
+
|
60
|
+
def test_return_value_is_tagged_as_utf8
|
61
|
+
escaped = EscapeUtils.escape_uri("a space")
|
62
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_uri(escaped).encoding
|
63
|
+
end
|
66
64
|
end
|
@@ -43,26 +43,24 @@ class UriComponentEscapeTest < Minitest::Test
|
|
43
43
|
assert_equal "a%2Fslash", EscapeUtils.escape_uri_component("a/slash")
|
44
44
|
end
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
str = "fo<o>bar"
|
46
|
+
def test_input_must_be_utf8_or_ascii
|
47
|
+
str = "fo<o>bar"
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
str.force_encoding 'UTF-8'
|
56
|
-
begin
|
57
|
-
EscapeUtils.escape_uri_component(str)
|
58
|
-
rescue Encoding::CompatibilityError => e
|
59
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
60
|
-
end
|
49
|
+
str.force_encoding 'ISO-8859-1'
|
50
|
+
assert_raises Encoding::CompatibilityError do
|
51
|
+
EscapeUtils.escape_uri_component(str)
|
61
52
|
end
|
62
53
|
|
63
|
-
|
64
|
-
|
65
|
-
|
54
|
+
str.force_encoding 'UTF-8'
|
55
|
+
begin
|
56
|
+
EscapeUtils.escape_uri_component(str)
|
57
|
+
rescue Encoding::CompatibilityError => e
|
58
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
66
59
|
end
|
67
60
|
end
|
61
|
+
|
62
|
+
def test_return_value_is_tagged_as_utf8
|
63
|
+
str = "fo<o>bar"
|
64
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_uri_component(str).encoding
|
65
|
+
end
|
68
66
|
end
|
@@ -46,26 +46,24 @@ class UriComponentUnescapeTest < Minitest::Test
|
|
46
46
|
assert_equal matz_name_sep, EscapeUtils.unescape_uri_component('%E3%81%BE%E3%81%A4%20%E3%82%82%E3%81%A8')
|
47
47
|
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
escaped = EscapeUtils.escape_uri_component("fo<o>bar")
|
49
|
+
def test_input_must_be_valid_utf8_or_ascii
|
50
|
+
escaped = EscapeUtils.escape_uri_component("fo<o>bar")
|
52
51
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
escaped.force_encoding 'UTF-8'
|
59
|
-
begin
|
60
|
-
EscapeUtils.unescape_uri_component(escaped)
|
61
|
-
rescue Encoding::CompatibilityError => e
|
62
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
63
|
-
end
|
52
|
+
escaped.force_encoding 'ISO-8859-1'
|
53
|
+
assert_raises Encoding::CompatibilityError do
|
54
|
+
EscapeUtils.unescape_uri_component(escaped)
|
64
55
|
end
|
65
56
|
|
66
|
-
|
67
|
-
|
68
|
-
|
57
|
+
escaped.force_encoding 'UTF-8'
|
58
|
+
begin
|
59
|
+
EscapeUtils.unescape_uri_component(escaped)
|
60
|
+
rescue Encoding::CompatibilityError => e
|
61
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
69
62
|
end
|
70
63
|
end
|
64
|
+
|
65
|
+
def test_return_value_is_tagged_as_utf8
|
66
|
+
escaped = EscapeUtils.escape_uri_component("fo<o>bar")
|
67
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_uri_component(escaped).encoding
|
68
|
+
end
|
71
69
|
end
|
data/test/url/escape_test.rb
CHANGED
@@ -41,26 +41,24 @@ class UrlEscapeTest < Minitest::Test
|
|
41
41
|
assert_equal "a%2Fslash", EscapeUtils.escape_url("a/slash")
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
str = "fo<o>bar"
|
44
|
+
def test_input_must_be_utf8_or_ascii
|
45
|
+
str = "fo<o>bar"
|
47
46
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
str.force_encoding 'UTF-8'
|
54
|
-
begin
|
55
|
-
EscapeUtils.escape_url(str)
|
56
|
-
rescue Encoding::CompatibilityError => e
|
57
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
58
|
-
end
|
47
|
+
str.force_encoding 'ISO-8859-1'
|
48
|
+
assert_raises Encoding::CompatibilityError do
|
49
|
+
EscapeUtils.escape_url(str)
|
59
50
|
end
|
60
51
|
|
61
|
-
|
62
|
-
|
63
|
-
|
52
|
+
str.force_encoding 'UTF-8'
|
53
|
+
begin
|
54
|
+
EscapeUtils.escape_url(str)
|
55
|
+
rescue Encoding::CompatibilityError => e
|
56
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
64
57
|
end
|
65
58
|
end
|
59
|
+
|
60
|
+
def test_return_value_is_tagged_as_utf8
|
61
|
+
str = "fo<o>bar"
|
62
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_url(str).encoding
|
63
|
+
end
|
66
64
|
end
|
data/test/url/unescape_test.rb
CHANGED
@@ -46,26 +46,24 @@ class UrlUnescapeTest < Minitest::Test
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
escaped = EscapeUtils.escape_url("fo<o>bar")
|
49
|
+
def test_input_must_be_valid_utf8_or_ascii
|
50
|
+
escaped = EscapeUtils.escape_url("fo<o>bar")
|
52
51
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
escaped.force_encoding 'UTF-8'
|
59
|
-
begin
|
60
|
-
EscapeUtils.unescape_url(escaped)
|
61
|
-
rescue Encoding::CompatibilityError => e
|
62
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
63
|
-
end
|
52
|
+
escaped.force_encoding 'ISO-8859-1'
|
53
|
+
assert_raises Encoding::CompatibilityError do
|
54
|
+
EscapeUtils.unescape_url(escaped)
|
64
55
|
end
|
65
56
|
|
66
|
-
|
67
|
-
|
68
|
-
|
57
|
+
escaped.force_encoding 'UTF-8'
|
58
|
+
begin
|
59
|
+
EscapeUtils.unescape_url(escaped)
|
60
|
+
rescue Encoding::CompatibilityError => e
|
61
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
69
62
|
end
|
70
63
|
end
|
64
|
+
|
65
|
+
def test_return_value_is_tagged_as_utf8
|
66
|
+
escaped = EscapeUtils.escape_url("fo<o>bar")
|
67
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.unescape_url(escaped).encoding
|
68
|
+
end
|
71
69
|
end
|
data/test/xml/escape_test.rb
CHANGED
@@ -42,26 +42,24 @@ class XmlEscapeTest < Minitest::Test
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
str = "<some_tag/>"
|
45
|
+
def test_input_must_be_utf8_or_ascii
|
46
|
+
str = "<some_tag/>"
|
48
47
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
str.force_encoding 'UTF-8'
|
55
|
-
begin
|
56
|
-
EscapeUtils.escape_xml(str)
|
57
|
-
rescue Encoding::CompatibilityError => e
|
58
|
-
assert_nil e, "#{e.class.name} raised, expected not to"
|
59
|
-
end
|
48
|
+
str.force_encoding 'ISO-8859-1'
|
49
|
+
assert_raises Encoding::CompatibilityError do
|
50
|
+
EscapeUtils.escape_xml(str)
|
60
51
|
end
|
61
52
|
|
62
|
-
|
63
|
-
|
64
|
-
|
53
|
+
str.force_encoding 'UTF-8'
|
54
|
+
begin
|
55
|
+
EscapeUtils.escape_xml(str)
|
56
|
+
rescue Encoding::CompatibilityError => e
|
57
|
+
assert_nil e, "#{e.class.name} raised, expected not to"
|
65
58
|
end
|
66
59
|
end
|
60
|
+
|
61
|
+
def test_return_value_is_tagged_as_utf8
|
62
|
+
str = "<some_tag/>"
|
63
|
+
assert_equal Encoding.find('UTF-8'), EscapeUtils.escape_url(str).encoding
|
64
|
+
end
|
67
65
|
end
|
metadata
CHANGED
@@ -1,127 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: escape_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Lopez
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake-compiler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.7.5
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.7.5
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: minitest
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 5.0.0
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 5.0.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: benchmark-ips
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rack
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: haml
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: fast_xs
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: actionpack
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: url_escape
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
11
|
+
date: 2022-06-07 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
125
13
|
description: Quickly perform HTML, URL, URI and Javascript escaping/unescaping
|
126
14
|
email: seniorlopez@gmail.com
|
127
15
|
executables: []
|
@@ -129,8 +17,9 @@ extensions:
|
|
129
17
|
- ext/escape_utils/extconf.rb
|
130
18
|
extra_rdoc_files: []
|
131
19
|
files:
|
20
|
+
- ".github/workflows/ci.yml"
|
132
21
|
- ".gitignore"
|
133
|
-
-
|
22
|
+
- CHANGELOG.md
|
134
23
|
- Gemfile
|
135
24
|
- LICENSE
|
136
25
|
- README.md
|
@@ -142,6 +31,7 @@ files:
|
|
142
31
|
- benchmark/url_escape.rb
|
143
32
|
- benchmark/url_unescape.rb
|
144
33
|
- benchmark/xml_escape.rb
|
34
|
+
- bin/console
|
145
35
|
- escape_utils.gemspec
|
146
36
|
- ext/escape_utils/buffer.c
|
147
37
|
- ext/escape_utils/buffer.h
|
@@ -191,7 +81,7 @@ homepage: https://github.com/brianmario/escape_utils
|
|
191
81
|
licenses:
|
192
82
|
- MIT
|
193
83
|
metadata: {}
|
194
|
-
post_install_message:
|
84
|
+
post_install_message:
|
195
85
|
rdoc_options:
|
196
86
|
- "--charset=UTF-8"
|
197
87
|
require_paths:
|
@@ -200,16 +90,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
90
|
requirements:
|
201
91
|
- - ">="
|
202
92
|
- !ruby/object:Gem::Version
|
203
|
-
version:
|
93
|
+
version: '2.5'
|
204
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
95
|
requirements:
|
206
96
|
- - ">="
|
207
97
|
- !ruby/object:Gem::Version
|
208
98
|
version: '0'
|
209
99
|
requirements: []
|
210
|
-
|
211
|
-
|
212
|
-
signing_key:
|
100
|
+
rubygems_version: 3.3.7
|
101
|
+
signing_key:
|
213
102
|
specification_version: 4
|
214
103
|
summary: Faster string escaping routines for your web apps
|
215
104
|
test_files:
|