ruby-uriparser 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Gemfile +4 -2
- data/README.md +3 -1
- data/Rakefile +5 -3
- data/ext/uriparser_ext/extconf.rb +3 -1
- data/ext/uriparser_ext/uriparser.c +60 -30
- data/lib/uriparser.rb +13 -19
- data/lib/uriparser/uri_gem.rb +6 -4
- data/lib/uriparser/version.rb +4 -2
- data/test/test_helper.rb +11 -2
- data/test/uriparser_test.rb +95 -71
- metadata +37 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 04a0cd98ff9826b233dbc567276e1dad5485c0068ac48c5d6809929876b05c73
|
4
|
+
data.tar.gz: '08cb5e19c101d70dfd1a34a189be595829b03de8ed150fbaadc7edeb36ae4504'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdc713b945f0874b05cf622941387ff0f90f74fd6f9a84b938f334f31e15ccfa7cb899afd9a8b1f3cbf8afb03474a7e40a959bbdf17a674b48b3356e3a11c4a9
|
7
|
+
data.tar.gz: ad799965b0b8bf958255b0a4be711e7f40f0a527d424a5d00c637220e4a4431ac6c199bc57346d61cb09f3b45d8fc4e56aa7788d53ba8ffc579ae23f84657ef7
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# ruby-uriparser
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/ruby-uriparser.png)](http://badge.fury.io/rb/ruby-uriparser)
|
4
|
+
[![Build Status](https://travis-ci.org/tlewin/ruby-uriparser.svg?branch=master)](https://travis-ci.org/tlewin/ruby-uriparser)
|
5
|
+
[![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop-hq/rubocop)
|
4
6
|
|
5
7
|
Ruby-uriparser is a wrapper for [uriparser](http://uriparser.sourceforge.net/) C library which is fast (linear input length time complexity), approximatelly 7.5x faster than the standard ruby URI library with a low memory consumption.
|
6
8
|
|
@@ -56,4 +58,4 @@ This project includes code from the New BSD licensed:
|
|
56
58
|
* Copyright (C) 2007, Weijia Song <songweijia@gmail.com>
|
57
59
|
* Copyright (C) 2007, Sebastian Pipping <webmaster@hartwork.org>
|
58
60
|
|
59
|
-
All rights reserved.
|
61
|
+
All rights reserved.
|
data/Rakefile
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake/extensiontask'
|
2
4
|
require 'rake/testtask'
|
3
5
|
|
4
6
|
Rake::ExtensionTask.new('uriparser_ext')
|
5
7
|
|
6
8
|
desc 'run tests'
|
7
|
-
Rake::TestTask.new(:
|
9
|
+
Rake::TestTask.new(test: :'ext:build') do |test|
|
8
10
|
test.libs << 'test'
|
9
11
|
test.pattern = 'test/**/*_test.rb'
|
10
12
|
test.verbose = true
|
@@ -12,7 +14,7 @@ end
|
|
12
14
|
|
13
15
|
namespace :ext do
|
14
16
|
desc 'build extention'
|
15
|
-
task :
|
17
|
+
task build: %i[clobber compile]
|
16
18
|
end
|
17
19
|
|
18
|
-
task :
|
20
|
+
task default: :test
|
@@ -73,10 +73,11 @@ struct uri_data {
|
|
73
73
|
|
74
74
|
/* Helper methods prototypes */
|
75
75
|
static void reset_fields(struct uri_data *);
|
76
|
-
static void populate_fields(VALUE
|
76
|
+
static void populate_fields(VALUE);
|
77
77
|
static VALUE compose_uri_from_data(struct uri_data *);
|
78
|
-
static int parse_uri(char *, UriUriA *);
|
78
|
+
static int parse_uri(const char *, UriUriA *);
|
79
79
|
static void free_uri(UriUriA *);
|
80
|
+
static UriUriA* update_uri(VALUE);
|
80
81
|
|
81
82
|
static void
|
82
83
|
rb_uriparser_mark(void *p)
|
@@ -169,14 +170,9 @@ rb_uriparser_get_path(VALUE self)
|
|
169
170
|
UriPathSegmentA *path_segment = data->uri->pathHead;
|
170
171
|
data->path = rb_str_new("/", 1);
|
171
172
|
do { /* go through the linked list */
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
path_segment->text.afterLast - path_segment->text.first + 1);
|
176
|
-
} else {
|
177
|
-
rb_str_cat(data->path, path_segment->text.first,
|
178
|
-
path_segment->text.afterLast - path_segment->text.first);
|
179
|
-
}
|
173
|
+
rb_str_cat(data->path, path_segment->text.first,
|
174
|
+
path_segment->text.afterLast - path_segment->text.first +
|
175
|
+
(*path_segment->text.afterLast == '/')); /* check if there is a slash to add */
|
180
176
|
path_segment = path_segment->next;
|
181
177
|
} while(path_segment);
|
182
178
|
} else {
|
@@ -197,25 +193,8 @@ rb_uriparser_normalize_bang(VALUE self)
|
|
197
193
|
struct uri_data *data;
|
198
194
|
|
199
195
|
Data_Get_Struct(self, struct uri_data, data);
|
200
|
-
|
201
|
-
|
202
|
-
populate_fields(self);
|
203
|
-
}
|
204
|
-
/* Compute and parse the new URI */
|
205
|
-
VALUE new_uri = compose_uri_from_data(data);
|
206
|
-
UriUriA *uri = ALLOC(UriUriA);
|
207
|
-
|
208
|
-
if(parse_uri(StringValueCStr(new_uri), uri) != URI_SUCCESS) {
|
209
|
-
free_uri(uri);
|
210
|
-
rb_gc_mark(new_uri);
|
211
|
-
rb_raise(rb_eStandardError, "invalid URI (%s) to normalize", StringValueCStr(new_uri));
|
212
|
-
}
|
213
|
-
|
214
|
-
free_uri(data->uri);
|
215
|
-
rb_gc_mark(new_uri);
|
216
|
-
data->uri = uri;
|
217
|
-
}
|
218
|
-
|
196
|
+
update_uri(self);
|
197
|
+
|
219
198
|
if(uriNormalizeSyntaxA(data->uri) != URI_SUCCESS) {
|
220
199
|
rb_raise(rb_eStandardError, "unable to normalize the URI");
|
221
200
|
}
|
@@ -237,6 +216,25 @@ rb_uriparser_unescape(VALUE self)
|
|
237
216
|
return Qnil;
|
238
217
|
}
|
239
218
|
|
219
|
+
static VALUE
|
220
|
+
rb_uriparser_to_s(VALUE self)
|
221
|
+
{
|
222
|
+
int chars_required;
|
223
|
+
char *str_uri;
|
224
|
+
UriUriA *uri = update_uri(self);
|
225
|
+
VALUE obj_str_uri;
|
226
|
+
|
227
|
+
if(uriToStringCharsRequiredA(uri, &chars_required) != URI_SUCCESS ||
|
228
|
+
!(str_uri = ALLOC_N(char, ++chars_required)) ||
|
229
|
+
uriToStringA(str_uri, uri, chars_required, NULL) != URI_SUCCESS) {
|
230
|
+
rb_raise(rb_eStandardError, "unable to convert to string");
|
231
|
+
}
|
232
|
+
|
233
|
+
obj_str_uri = rb_str_new2(str_uri);
|
234
|
+
xfree(str_uri);
|
235
|
+
return obj_str_uri;
|
236
|
+
}
|
237
|
+
|
240
238
|
static void
|
241
239
|
reset_fields(struct uri_data *data)
|
242
240
|
{
|
@@ -318,7 +316,7 @@ compose_uri_from_data(struct uri_data *data)
|
|
318
316
|
}
|
319
317
|
|
320
318
|
static int
|
321
|
-
parse_uri(char *str_uri, UriUriA *uri)
|
319
|
+
parse_uri(const char *str_uri, UriUriA *uri)
|
322
320
|
{
|
323
321
|
uri_parse_state.uri = uri;
|
324
322
|
|
@@ -334,6 +332,37 @@ free_uri(UriUriA *uri)
|
|
334
332
|
}
|
335
333
|
}
|
336
334
|
|
335
|
+
static UriUriA *
|
336
|
+
update_uri(VALUE uri_obj)
|
337
|
+
{
|
338
|
+
struct uri_data *data;
|
339
|
+
|
340
|
+
Data_Get_Struct(uri_obj, struct uri_data, data);
|
341
|
+
if(!data->uri || data->updated) {
|
342
|
+
VALUE new_uri;
|
343
|
+
UriUriA *uri = ALLOC(UriUriA);
|
344
|
+
|
345
|
+
if(data->updated) {
|
346
|
+
populate_fields(uri_obj);
|
347
|
+
}
|
348
|
+
/* Compute and parse the new URI */
|
349
|
+
new_uri = compose_uri_from_data(data);
|
350
|
+
|
351
|
+
if(parse_uri(StringValueCStr(new_uri), uri) != URI_SUCCESS) {
|
352
|
+
free_uri(uri);
|
353
|
+
rb_gc_mark(new_uri);
|
354
|
+
rb_raise(rb_eStandardError, "invalid URI (%s) to normalize", StringValueCStr(new_uri));
|
355
|
+
}
|
356
|
+
|
357
|
+
free_uri(data->uri);
|
358
|
+
rb_gc_mark(new_uri);
|
359
|
+
data->uri = uri;
|
360
|
+
}
|
361
|
+
|
362
|
+
return data->uri;
|
363
|
+
}
|
364
|
+
|
365
|
+
|
337
366
|
void
|
338
367
|
Init_uriparser_ext()
|
339
368
|
{
|
@@ -360,6 +389,7 @@ Init_uriparser_ext()
|
|
360
389
|
rb_define_method(rb_cUri_Class, "normalize!", rb_uriparser_normalize_bang, 0);
|
361
390
|
rb_define_method(rb_cUri_Class, "escape", rb_uriparser_escape, 0);
|
362
391
|
rb_define_method(rb_cUri_Class, "unescape", rb_uriparser_unescape, 0);
|
392
|
+
rb_define_method(rb_cUri_Class, "to_s", rb_uriparser_to_s, 0);
|
363
393
|
|
364
394
|
rb_define_singleton_method(rb_mUriParser, "parse", rb_uriparser_s_parse, 1);
|
365
395
|
}
|
data/lib/uriparser.rb
CHANGED
@@ -1,35 +1,29 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.push __dir__
|
2
4
|
require 'uriparser_ext'
|
3
5
|
|
4
|
-
module UriParser
|
6
|
+
module UriParser #:nodoc: all
|
5
7
|
class URI
|
6
8
|
def port
|
7
|
-
@port ||=
|
8
|
-
nil
|
9
|
-
else
|
10
|
-
str_port.to_i
|
11
|
-
end
|
9
|
+
@port ||= str_port.nil? ? nil : str_port.to_i
|
12
10
|
end
|
13
11
|
|
14
|
-
def port=value
|
12
|
+
def port=(value)
|
15
13
|
@port = value.to_i
|
16
14
|
self.str_port = (value.nil? ? nil : value.to_s)
|
17
15
|
end
|
18
16
|
|
19
17
|
def user
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
nil
|
24
|
-
end
|
18
|
+
return unless userinfo
|
19
|
+
|
20
|
+
userinfo.split(':').first
|
25
21
|
end
|
26
22
|
|
27
23
|
def password
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
nil
|
32
|
-
end
|
24
|
+
return unless userinfo
|
25
|
+
|
26
|
+
userinfo.split(':')[1]
|
33
27
|
end
|
34
28
|
end
|
35
|
-
end
|
29
|
+
end
|
data/lib/uriparser/uri_gem.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'uri'
|
2
4
|
require 'uriparser'
|
3
5
|
|
4
6
|
# wrapper the ruby URI class
|
5
|
-
module URI
|
6
|
-
def self.
|
7
|
+
module URI #:nodoc: all
|
8
|
+
def self.parse(uri)
|
7
9
|
UriParser.parse(uri)
|
8
10
|
end
|
9
11
|
end
|
10
12
|
|
11
|
-
module Kernel
|
12
|
-
def URI(uri)
|
13
|
+
module Kernel #:nodoc: all
|
14
|
+
def URI(uri) # rubocop:disable Naming/MethodName
|
13
15
|
UriParser.parse(uri)
|
14
16
|
end
|
15
17
|
end
|
data/lib/uriparser/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,4 +1,13 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'shoulda/context'
|
5
|
+
require 'shoulda/matchers'
|
3
6
|
|
4
7
|
require './lib/uriparser'
|
8
|
+
|
9
|
+
Shoulda::Matchers.configure do |config|
|
10
|
+
config.integrate do |with|
|
11
|
+
with.test_framework :minitest
|
12
|
+
end
|
13
|
+
end
|
data/test/uriparser_test.rb
CHANGED
@@ -1,103 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
|
-
class UriParserTest < Test
|
5
|
+
class UriParserTest < Minitest::Test # rubocop:disable Metrics/ClassLength
|
6
|
+
FULL_URI = 'http://user:pwd@ruby-lang.org:80/en/about?yes=1#any'
|
7
|
+
SIMPLE_URI = 'https://ruby-lang.org'
|
8
|
+
WEIRD_PATH_URI = 'http://example.org/one/two/../../one'
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@full_uri = UriParser.parse(FULL_URI)
|
12
|
+
@simple_uri = UriParser.parse(SIMPLE_URI)
|
13
|
+
|
14
|
+
@manual_uri = UriParser::URI.new
|
15
|
+
@manual_uri.scheme = 'http'
|
16
|
+
@manual_uri.host = 'example.org'
|
17
|
+
@manual_uri.path = '/one/two/../'
|
18
|
+
@manual_uri.fragment = 'test'
|
19
|
+
|
20
|
+
@weird_path_uri = UriParser.parse(WEIRD_PATH_URI)
|
21
|
+
end
|
4
22
|
|
5
23
|
context 'URI parsing' do
|
6
24
|
should 'raise an exception if was unable to parse the URI' do
|
7
|
-
|
25
|
+
assert_raises(StandardError) { UriParser.parse('invalid uri') }
|
8
26
|
end
|
9
27
|
|
10
28
|
should 'parse valid URI' do
|
11
|
-
|
12
|
-
assert_equal
|
13
|
-
assert_equal
|
14
|
-
assert_equal
|
15
|
-
assert_equal
|
16
|
-
assert_equal
|
17
|
-
assert_equal
|
18
|
-
assert_equal uri.fragment, 'any'
|
29
|
+
assert_equal @full_uri.scheme, 'http'
|
30
|
+
assert_equal @full_uri.userinfo, 'user:pwd'
|
31
|
+
assert_equal @full_uri.host, 'ruby-lang.org'
|
32
|
+
assert_equal @full_uri.str_port, '80'
|
33
|
+
assert_equal @full_uri.path, '/en/about'
|
34
|
+
assert_equal @full_uri.query, 'yes=1'
|
35
|
+
assert_equal @full_uri.fragment, 'any'
|
19
36
|
end
|
20
37
|
|
21
38
|
should 'paser valid but incomplete URI' do
|
22
|
-
|
23
|
-
|
24
|
-
assert_equal
|
25
|
-
|
26
|
-
assert_equal
|
27
|
-
|
28
|
-
|
29
|
-
assert_equal uri.fragment, nil
|
39
|
+
assert_equal @simple_uri.scheme, 'https'
|
40
|
+
assert_nil @simple_uri.userinfo
|
41
|
+
assert_equal @simple_uri.host, 'ruby-lang.org'
|
42
|
+
assert_nil @simple_uri.str_port
|
43
|
+
assert_equal @simple_uri.path, ''
|
44
|
+
assert_nil @simple_uri.query
|
45
|
+
assert_nil @simple_uri.fragment
|
30
46
|
end
|
31
47
|
|
32
48
|
should 'return URI object after a successful parsing' do
|
33
|
-
|
34
|
-
assert_instance_of UriParser::URI, uri
|
49
|
+
assert_instance_of UriParser::URI, @simple_uri
|
35
50
|
end
|
36
51
|
end
|
37
52
|
|
38
53
|
context 'URI class API' do
|
39
54
|
should 'allow update any URI field' do
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
assert_equal
|
50
|
-
|
51
|
-
assert_equal
|
52
|
-
assert_equal
|
53
|
-
|
54
|
-
assert_equal uri.fragment, nil
|
55
|
+
@full_uri.scheme = 'ftp'
|
56
|
+
@full_uri.userinfo = nil
|
57
|
+
@full_uri.host = 'example.org'
|
58
|
+
@full_uri.str_port = nil
|
59
|
+
@full_uri.path = '/'
|
60
|
+
@full_uri.query = 'xx=11'
|
61
|
+
@full_uri.fragment = nil
|
62
|
+
assert_equal @full_uri.scheme, 'ftp'
|
63
|
+
assert_nil @full_uri.userinfo
|
64
|
+
assert_equal @full_uri.host, 'example.org'
|
65
|
+
assert_nil @full_uri.str_port
|
66
|
+
assert_equal @full_uri.path, '/'
|
67
|
+
assert_equal @full_uri.query, 'xx=11'
|
68
|
+
assert_nil @full_uri.fragment
|
55
69
|
end
|
56
70
|
|
57
71
|
should 'split userinfo data' do
|
58
|
-
|
59
|
-
assert_equal
|
60
|
-
assert_equal uri.password, 'pwd'
|
72
|
+
assert_equal @full_uri.user, 'user'
|
73
|
+
assert_equal @full_uri.password, 'pwd'
|
61
74
|
end
|
62
75
|
|
63
76
|
should 'return nil if no user/password informed' do
|
64
77
|
uri = UriParser.parse('http://ruby-lang.org:80/en/about?yes=1#any')
|
65
|
-
|
66
|
-
|
78
|
+
assert_nil uri.user
|
79
|
+
assert_nil uri.password
|
67
80
|
end
|
68
81
|
|
69
82
|
should 'port and str_port be synchronized' do
|
70
|
-
|
71
|
-
|
72
|
-
|
83
|
+
@full_uri.port = 1
|
84
|
+
assert_equal @full_uri.str_port, '1'
|
85
|
+
end
|
86
|
+
|
87
|
+
should 'convert to string (to_s)' do
|
88
|
+
assert_equal @simple_uri.to_s, SIMPLE_URI
|
89
|
+
assert_equal @full_uri.to_s, FULL_URI
|
90
|
+
assert_equal @manual_uri.to_s, 'http://example.org/one/two/../#test'
|
91
|
+
assert_equal @weird_path_uri.to_s, WEIRD_PATH_URI
|
73
92
|
end
|
74
93
|
end
|
75
94
|
|
76
95
|
context 'URI normalizing' do
|
77
96
|
should 'normalize a valid URI' do
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
assert_equal
|
82
|
-
|
83
|
-
assert_equal
|
84
|
-
|
85
|
-
|
86
|
-
assert_equal uri.fragment, nil
|
97
|
+
@weird_path_uri.normalize!
|
98
|
+
assert_equal @weird_path_uri.scheme, 'http'
|
99
|
+
assert_nil @weird_path_uri.userinfo
|
100
|
+
assert_equal @weird_path_uri.host, 'example.org'
|
101
|
+
assert_nil @weird_path_uri.str_port
|
102
|
+
assert_equal @weird_path_uri.path, '/one'
|
103
|
+
assert_nil @weird_path_uri.query
|
104
|
+
assert_nil @weird_path_uri.fragment
|
87
105
|
end
|
88
106
|
|
89
107
|
should 'normalize an updated URI' do
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
assert_equal
|
96
|
-
|
97
|
-
assert_equal
|
98
|
-
|
99
|
-
|
100
|
-
assert_equal uri.fragment, nil
|
108
|
+
@simple_uri.path = '/one/two/../../one'
|
109
|
+
assert_equal @simple_uri.path, '/one/two/../../one'
|
110
|
+
@simple_uri.normalize!
|
111
|
+
assert_equal @simple_uri.scheme, 'https'
|
112
|
+
assert_nil @simple_uri.userinfo
|
113
|
+
assert_equal @simple_uri.host, 'ruby-lang.org'
|
114
|
+
assert_nil @simple_uri.str_port
|
115
|
+
assert_equal @simple_uri.path, '/one'
|
116
|
+
assert_nil @simple_uri.query
|
117
|
+
assert_nil @simple_uri.fragment
|
101
118
|
end
|
102
119
|
|
103
120
|
should 'normalize an URI manually created' do
|
@@ -107,13 +124,20 @@ class UriParserTest < Test::Unit::TestCase
|
|
107
124
|
uri.path = '/one/two/../'
|
108
125
|
uri.fragment = 'test'
|
109
126
|
uri.normalize!
|
110
|
-
assert_equal uri.scheme,
|
111
|
-
|
112
|
-
assert_equal uri.host,
|
113
|
-
|
114
|
-
assert_equal uri.path,
|
115
|
-
|
116
|
-
assert_equal uri.fragment,
|
127
|
+
assert_equal uri.scheme, 'http'
|
128
|
+
assert_nil uri.userinfo
|
129
|
+
assert_equal uri.host, 'example.org'
|
130
|
+
assert_nil uri.str_port
|
131
|
+
assert_equal uri.path, '/one'
|
132
|
+
assert_nil uri.query
|
133
|
+
assert_equal uri.fragment, 'test'
|
134
|
+
end
|
135
|
+
|
136
|
+
should 'update URI string representation' do
|
137
|
+
@weird_path_uri.normalize!
|
138
|
+
@manual_uri.normalize!
|
139
|
+
assert_equal @weird_path_uri.to_s, 'http://example.org/one'
|
140
|
+
assert_equal @manual_uri.to_s, 'http://example.org/one/#test'
|
117
141
|
end
|
118
142
|
end
|
119
|
-
end
|
143
|
+
end
|
metadata
CHANGED
@@ -1,35 +1,63 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-uriparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thiago Lewin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rake-compiler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
|
19
|
+
version: '1.1'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
21
25
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
26
|
+
version: '1.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubocop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.92'
|
23
34
|
type: :development
|
24
35
|
prerelease: false
|
25
36
|
version_requirements: !ruby/object:Gem::Requirement
|
26
37
|
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.92'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: shoulda
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.5.0
|
27
48
|
- - "~>"
|
28
49
|
- !ruby/object:Gem::Version
|
29
50
|
version: '3.5'
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
30
55
|
- - ">="
|
31
56
|
- !ruby/object:Gem::Version
|
32
57
|
version: 3.5.0
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '3.5'
|
33
61
|
description: Ruby wrapper for uriparser C library
|
34
62
|
email:
|
35
63
|
- thiago_lewin@yahoo.com.br
|
@@ -61,18 +89,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
61
89
|
requirements:
|
62
90
|
- - ">="
|
63
91
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
92
|
+
version: 2.4.0
|
65
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
94
|
requirements:
|
67
95
|
- - ">="
|
68
96
|
- !ruby/object:Gem::Version
|
69
97
|
version: '0'
|
70
98
|
requirements: []
|
71
|
-
|
72
|
-
rubygems_version: 2.2.2
|
99
|
+
rubygems_version: 3.0.1
|
73
100
|
signing_key:
|
74
101
|
specification_version: 4
|
75
102
|
summary: Ruby wrapper for uriparser C library
|
76
103
|
test_files:
|
77
|
-
- test/test_helper.rb
|
78
104
|
- test/uriparser_test.rb
|
105
|
+
- test/test_helper.rb
|