uri 0.13.3 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ff198914bae27655aee5c90c174f209e283924fcedd3054a680a1fa13c38420
4
- data.tar.gz: 318d1acef1b37a91a7932dd065956d7526ed27ffe36785b0097524e87bcd31df
3
+ metadata.gz: 4d3b082505394be3f41eaa0d3a91a22ddf30e9064dc72c228fb46fb5131f2900
4
+ data.tar.gz: df272886d408cd1999654d23b1e3e7f6c9466e4e04b784bc462ed7d8ac609ba9
5
5
  SHA512:
6
- metadata.gz: d63fae0cebe8d47ba5d8042ed4c98935a991a8fdd95103ac86f0a31c8e1df5861dd38d4121d6b30be7f8079fae998569dab85c3b935efa924c9e3fc05d0effe3
7
- data.tar.gz: a6a56ca12543502cf80b100720a635f443951af35b3c29e651e6cc46441e0c2e863aa20b110f73941a9087bcd4aa3a92e5f2ac5a48f286325e8acf6090303d72
6
+ metadata.gz: 5e6e478e4ea13c8436c8b51a3a67755de842ab718835ff8b3fcaa5520d77bbfdac83f7092b8d22dfe7e54ac33d1f21b8a1ab7c2dce0f8e73dde4f3fa7667dee2
7
+ data.tar.gz: 1cea8abe746b7ad37355e785ca627d6ddb86adbb565d3c6cd59ab44102d7dfa5c9efb75f9ca46fe8e3d9d400194f9571c259064f8828601f942054cdebd34f91
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ BSDL
2
+ COPYING
3
+ README.md
4
+ docs/
5
+ lib/
data/.rdoc_options ADDED
@@ -0,0 +1,5 @@
1
+ main_page: README.md
2
+ op_dir: _site
3
+ warn_missing_rdoc_ref: true
4
+ title: URI Documentation
5
+ visibility: :private
@@ -4,10 +4,10 @@ Redistribution and use in source and binary forms, with or without
4
4
  modification, are permitted provided that the following conditions
5
5
  are met:
6
6
  1. Redistributions of source code must retain the above copyright
7
- notice, this list of conditions and the following disclaimer.
7
+ notice, this list of conditions and the following disclaimer.
8
8
  2. Redistributions in binary form must reproduce the above copyright
9
- notice, this list of conditions and the following disclaimer in the
10
- documentation and/or other materials provided with the distribution.
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
11
 
12
12
  THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
13
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
data/COPYING ADDED
@@ -0,0 +1,56 @@
1
+ Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
2
+ You can redistribute it and/or modify it under either the terms of the
3
+ 2-clause BSDL (see the file BSDL), or the conditions below:
4
+
5
+ 1. You may make and give away verbatim copies of the source form of the
6
+ software without restriction, provided that you duplicate all of the
7
+ original copyright notices and associated disclaimers.
8
+
9
+ 2. You may modify your copy of the software in any way, provided that
10
+ you do at least ONE of the following:
11
+
12
+ a. place your modifications in the Public Domain or otherwise
13
+ make them Freely Available, such as by posting said
14
+ modifications to Usenet or an equivalent medium, or by allowing
15
+ the author to include your modifications in the software.
16
+
17
+ b. use the modified software only within your corporation or
18
+ organization.
19
+
20
+ c. give non-standard binaries non-standard names, with
21
+ instructions on where to get the original software distribution.
22
+
23
+ d. make other distribution arrangements with the author.
24
+
25
+ 3. You may distribute the software in object code or binary form,
26
+ provided that you do at least ONE of the following:
27
+
28
+ a. distribute the binaries and library files of the software,
29
+ together with instructions (in the manual page or equivalent)
30
+ on where to get the original distribution.
31
+
32
+ b. accompany the distribution with the machine-readable source of
33
+ the software.
34
+
35
+ c. give non-standard binaries non-standard names, with
36
+ instructions on where to get the original software distribution.
37
+
38
+ d. make other distribution arrangements with the author.
39
+
40
+ 4. You may modify and include the part of the software into any other
41
+ software (possibly commercial). But some files in the distribution
42
+ are not written by the author, so that they are not under these terms.
43
+
44
+ For the list of those files and their copying conditions, see the
45
+ file LEGAL.
46
+
47
+ 5. The scripts and library files supplied as input to or produced as
48
+ output from the software do not automatically fall under the
49
+ copyright of the software, but belong to whomever generated them,
50
+ and may be sold commercially, and may be aggregated with this
51
+ software.
52
+
53
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
54
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
55
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56
+ PURPOSE.
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![CI](https://github.com/ruby/uri/actions/workflows/test.yml/badge.svg)](https://github.com/ruby/uri/actions/workflows/test.yml)
4
4
  [![Yard Docs](https://img.shields.io/badge/docs-exist-blue.svg)](https://ruby.github.io/uri/)
5
5
 
6
- URI is a module providing classes to handle Uniform Resource Identifiers [RFC2396](http://tools.ietf.org/html/rfc2396).
6
+ URI is a module providing classes to handle Uniform Resource Identifiers [RFC3986](http://tools.ietf.org/html/rfc3986).
7
7
 
8
8
  ## Features
9
9
 
data/docs/kernel.rb ADDED
@@ -0,0 +1,2 @@
1
+ # :stopdoc:
2
+ module Kernel end
data/lib/uri/common.rb CHANGED
@@ -13,26 +13,54 @@ require_relative "rfc2396_parser"
13
13
  require_relative "rfc3986_parser"
14
14
 
15
15
  module URI
16
- include RFC2396_REGEXP
16
+ # The default parser instance for RFC 2396.
17
+ RFC2396_PARSER = RFC2396_Parser.new
18
+ Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor)
17
19
 
18
- REGEXP = RFC2396_REGEXP
19
- Parser = RFC2396_Parser
20
+ # The default parser instance for RFC 3986.
20
21
  RFC3986_PARSER = RFC3986_Parser.new
21
22
  Ractor.make_shareable(RFC3986_PARSER) if defined?(Ractor)
22
- RFC2396_PARSER = RFC2396_Parser.new
23
- Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor)
24
23
 
25
- # URI::Parser.new
26
- DEFAULT_PARSER = Parser.new
27
- DEFAULT_PARSER.pattern.each_pair do |sym, str|
28
- unless REGEXP::PATTERN.const_defined?(sym)
29
- REGEXP::PATTERN.const_set(sym, str)
24
+ # The default parser instance.
25
+ DEFAULT_PARSER = RFC3986_PARSER
26
+ Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor)
27
+
28
+ # Set the default parser instance.
29
+ def self.parser=(parser = RFC3986_PARSER)
30
+ remove_const(:Parser) if defined?(::URI::Parser)
31
+ const_set("Parser", parser.class)
32
+
33
+ remove_const(:PARSER) if defined?(::URI::PARSER)
34
+ const_set("PARSER", parser)
35
+
36
+ remove_const(:REGEXP) if defined?(::URI::REGEXP)
37
+ remove_const(:PATTERN) if defined?(::URI::PATTERN)
38
+ if Parser == RFC2396_Parser
39
+ const_set("REGEXP", URI::RFC2396_REGEXP)
40
+ const_set("PATTERN", URI::RFC2396_REGEXP::PATTERN)
41
+ end
42
+
43
+ Parser.new.regexp.each_pair do |sym, str|
44
+ remove_const(sym) if const_defined?(sym, false)
45
+ const_set(sym, str)
30
46
  end
31
47
  end
32
- DEFAULT_PARSER.regexp.each_pair do |sym, str|
33
- const_set(sym, str)
48
+ self.parser = RFC3986_PARSER
49
+
50
+ def self.const_missing(const) # :nodoc:
51
+ if const == :REGEXP
52
+ warn "URI::REGEXP is obsolete. Use URI::RFC2396_REGEXP explicitly.", uplevel: 1 if $VERBOSE
53
+ URI::RFC2396_REGEXP
54
+ elsif value = RFC2396_PARSER.regexp[const]
55
+ warn "URI::#{const} is obsolete. Use URI::RFC2396_PARSER.regexp[#{const.inspect}] explicitly.", uplevel: 1 if $VERBOSE
56
+ value
57
+ elsif value = RFC2396_Parser.const_get(const)
58
+ warn "URI::#{const} is obsolete. Use URI::RFC2396_Parser::#{const} explicitly.", uplevel: 1 if $VERBOSE
59
+ value
60
+ else
61
+ super
62
+ end
34
63
  end
35
- Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor)
36
64
 
37
65
  module Util # :nodoc:
38
66
  def make_components_hash(klass, array_hash)
@@ -66,7 +94,41 @@ module URI
66
94
  module_function :make_components_hash
67
95
  end
68
96
 
69
- module Schemes
97
+ module Schemes # :nodoc:
98
+ class << self
99
+ ReservedChars = ".+-"
100
+ EscapedChars = "\u01C0\u01C1\u01C2"
101
+ # Use Lo category chars as escaped chars for TruffleRuby, which
102
+ # does not allow Symbol categories as identifiers.
103
+
104
+ def escape(name)
105
+ unless name and name.ascii_only?
106
+ return nil
107
+ end
108
+ name.upcase.tr(ReservedChars, EscapedChars)
109
+ end
110
+
111
+ def unescape(name)
112
+ name.tr(EscapedChars, ReservedChars).encode(Encoding::US_ASCII).upcase
113
+ end
114
+
115
+ def find(name)
116
+ const_get(name, false) if name and const_defined?(name, false)
117
+ end
118
+
119
+ def register(name, klass)
120
+ unless scheme = escape(name)
121
+ raise ArgumentError, "invalid character as scheme - #{name}"
122
+ end
123
+ const_set(scheme, klass)
124
+ end
125
+
126
+ def list
127
+ constants.map { |name|
128
+ [unescape(name.to_s), const_get(name)]
129
+ }.to_h
130
+ end
131
+ end
70
132
  end
71
133
  private_constant :Schemes
72
134
 
@@ -79,7 +141,7 @@ module URI
79
141
  # Note that after calling String#upcase on +scheme+, it must be a valid
80
142
  # constant name.
81
143
  def self.register_scheme(scheme, klass)
82
- Schemes.const_set(scheme.to_s.upcase, klass)
144
+ Schemes.register(scheme, klass)
83
145
  end
84
146
 
85
147
  # Returns a hash of the defined schemes:
@@ -97,14 +159,14 @@ module URI
97
159
  #
98
160
  # Related: URI.register_scheme.
99
161
  def self.scheme_list
100
- Schemes.constants.map { |name|
101
- [name.to_s.upcase, Schemes.const_get(name)]
102
- }.to_h
162
+ Schemes.list
103
163
  end
104
164
 
165
+ # :stopdoc:
105
166
  INITIAL_SCHEMES = scheme_list
106
167
  private_constant :INITIAL_SCHEMES
107
168
  Ractor.make_shareable(INITIAL_SCHEMES) if defined?(Ractor)
169
+ # :startdoc:
108
170
 
109
171
  # Returns a new object constructed from the given +scheme+, +arguments+,
110
172
  # and +default+:
@@ -123,12 +185,10 @@ module URI
123
185
  # # => #<URI::HTTP foo://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
124
186
  #
125
187
  def self.for(scheme, *arguments, default: Generic)
126
- const_name = scheme.to_s.upcase
188
+ const_name = Schemes.escape(scheme)
127
189
 
128
190
  uri_class = INITIAL_SCHEMES[const_name]
129
- uri_class ||= if /\A[A-Z]\w*\z/.match?(const_name) && Schemes.const_defined?(const_name, false)
130
- Schemes.const_get(const_name, false)
131
- end
191
+ uri_class ||= Schemes.find(const_name)
132
192
  uri_class ||= default
133
193
 
134
194
  return uri_class.new(scheme, *arguments)
@@ -170,7 +230,7 @@ module URI
170
230
  # ["fragment", "top"]]
171
231
  #
172
232
  def self.split(uri)
173
- RFC3986_PARSER.split(uri)
233
+ PARSER.split(uri)
174
234
  end
175
235
 
176
236
  # Returns a new \URI object constructed from the given string +uri+:
@@ -180,11 +240,11 @@ module URI
180
240
  # URI.parse('http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top')
181
241
  # # => #<URI::HTTP http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
182
242
  #
183
- # It's recommended to first ::escape string +uri+
243
+ # It's recommended to first URI::RFC2396_PARSER.escape string +uri+
184
244
  # if it may contain invalid URI characters.
185
245
  #
186
246
  def self.parse(uri)
187
- RFC3986_PARSER.parse(uri)
247
+ PARSER.parse(uri)
188
248
  end
189
249
 
190
250
  # Merges the given URI strings +str+
@@ -211,7 +271,7 @@ module URI
211
271
  # # => #<URI::HTTP http://example.com/foo/bar>
212
272
  #
213
273
  def self.join(*str)
214
- RFC3986_PARSER.join(*str)
274
+ DEFAULT_PARSER.join(*str)
215
275
  end
216
276
 
217
277
  #
@@ -240,7 +300,7 @@ module URI
240
300
  #
241
301
  def self.extract(str, schemes = nil, &block) # :nodoc:
242
302
  warn "URI.extract is obsolete", uplevel: 1 if $VERBOSE
243
- DEFAULT_PARSER.extract(str, schemes, &block)
303
+ PARSER.extract(str, schemes, &block)
244
304
  end
245
305
 
246
306
  #
@@ -277,14 +337,14 @@ module URI
277
337
  #
278
338
  def self.regexp(schemes = nil)# :nodoc:
279
339
  warn "URI.regexp is obsolete", uplevel: 1 if $VERBOSE
280
- DEFAULT_PARSER.make_regexp(schemes)
340
+ PARSER.make_regexp(schemes)
281
341
  end
282
342
 
283
343
  TBLENCWWWCOMP_ = {} # :nodoc:
284
344
  256.times do |i|
285
345
  TBLENCWWWCOMP_[-i.chr] = -('%%%02X' % i)
286
346
  end
287
- TBLENCURICOMP_ = TBLENCWWWCOMP_.dup.freeze
347
+ TBLENCURICOMP_ = TBLENCWWWCOMP_.dup.freeze # :nodoc:
288
348
  TBLENCWWWCOMP_[' '] = '+'
289
349
  TBLENCWWWCOMP_.freeze
290
350
  TBLDECWWWCOMP_ = {} # :nodoc:
@@ -382,6 +442,8 @@ module URI
382
442
  _decode_uri_component(/%\h\h/, str, enc)
383
443
  end
384
444
 
445
+ # Returns a string derived from the given string +str+ with
446
+ # URI-encoded characters matching +regexp+ according to +table+.
385
447
  def self._encode_uri_component(regexp, table, str, enc)
386
448
  str = str.to_s.dup
387
449
  if str.encoding != Encoding::ASCII_8BIT
@@ -396,6 +458,8 @@ module URI
396
458
  end
397
459
  private_class_method :_encode_uri_component
398
460
 
461
+ # Returns a string decoding characters matching +regexp+ from the
462
+ # given \URL-encoded string +str+.
399
463
  def self._decode_uri_component(regexp, str, enc)
400
464
  raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/.match?(str)
401
465
  str.b.gsub(regexp, TBLDECWWWCOMP_).force_encoding(enc)
@@ -834,6 +898,7 @@ module Kernel
834
898
  # Returns a \URI object derived from the given +uri+,
835
899
  # which may be a \URI string or an existing \URI object:
836
900
  #
901
+ # require 'uri'
837
902
  # # Returns a new URI.
838
903
  # uri = URI('http://github.com/ruby/ruby')
839
904
  # # => #<URI::HTTP http://github.com/ruby/ruby>
@@ -841,6 +906,8 @@ module Kernel
841
906
  # URI(uri)
842
907
  # # => #<URI::HTTP http://github.com/ruby/ruby>
843
908
  #
909
+ # You must require 'uri' to use this method.
910
+ #
844
911
  def URI(uri)
845
912
  if uri.is_a?(URI::Generic)
846
913
  uri
data/lib/uri/file.rb CHANGED
@@ -47,7 +47,7 @@ module URI
47
47
  # :path => '/ruby/src'})
48
48
  # uri2.to_s # => "file://host.example.com/ruby/src"
49
49
  #
50
- # uri3 = URI::File.build({:path => URI::escape('/path/my file.txt')})
50
+ # uri3 = URI::File.build({:path => URI::RFC2396_PARSER.escape('/path/my file.txt')})
51
51
  # uri3.to_s # => "file:///path/my%20file.txt"
52
52
  #
53
53
  def self.build(args)
@@ -70,17 +70,17 @@ module URI
70
70
 
71
71
  # raise InvalidURIError
72
72
  def check_userinfo(user)
73
- raise URI::InvalidURIError, "can not set userinfo for file URI"
73
+ raise URI::InvalidURIError, "cannot set userinfo for file URI"
74
74
  end
75
75
 
76
76
  # raise InvalidURIError
77
77
  def check_user(user)
78
- raise URI::InvalidURIError, "can not set user for file URI"
78
+ raise URI::InvalidURIError, "cannot set user for file URI"
79
79
  end
80
80
 
81
81
  # raise InvalidURIError
82
82
  def check_password(user)
83
- raise URI::InvalidURIError, "can not set password for file URI"
83
+ raise URI::InvalidURIError, "cannot set password for file URI"
84
84
  end
85
85
 
86
86
  # do nothing
data/lib/uri/ftp.rb CHANGED
@@ -17,7 +17,7 @@ module URI
17
17
  # This class will be redesigned because of difference of implementations;
18
18
  # the structure of its path. draft-hoffman-ftp-uri-04 is a draft but it
19
19
  # is a good summary about the de facto spec.
20
- # http://tools.ietf.org/html/draft-hoffman-ftp-uri-04
20
+ # https://datatracker.ietf.org/doc/html/draft-hoffman-ftp-uri-04
21
21
  #
22
22
  class FTP < Generic
23
23
  # A Default port of 21 for URI::FTP.
data/lib/uri/generic.rb CHANGED
@@ -73,7 +73,7 @@ module URI
73
73
  #
74
74
  # At first, tries to create a new URI::Generic instance using
75
75
  # URI::Generic::build. But, if exception URI::InvalidComponentError is raised,
76
- # then it does URI::Escape.escape all URI components and tries again.
76
+ # then it does URI::RFC2396_PARSER.escape all URI components and tries again.
77
77
  #
78
78
  def self.build2(args)
79
79
  begin
@@ -82,7 +82,7 @@ module URI
82
82
  if args.kind_of?(Array)
83
83
  return self.build(args.collect{|x|
84
84
  if x.is_a?(String)
85
- DEFAULT_PARSER.escape(x)
85
+ URI::RFC2396_PARSER.escape(x)
86
86
  else
87
87
  x
88
88
  end
@@ -91,7 +91,7 @@ module URI
91
91
  tmp = {}
92
92
  args.each do |key, value|
93
93
  tmp[key] = if value
94
- DEFAULT_PARSER.escape(value)
94
+ URI::RFC2396_PARSER.escape(value)
95
95
  else
96
96
  value
97
97
  end
@@ -126,9 +126,9 @@ module URI
126
126
  end
127
127
  end
128
128
  else
129
- component = self.class.component rescue ::URI::Generic::COMPONENT
129
+ component = self.component rescue ::URI::Generic::COMPONENT
130
130
  raise ArgumentError,
131
- "expected Array of or Hash of components of #{self.class} (#{component.join(', ')})"
131
+ "expected Array of or Hash of components of #{self} (#{component.join(', ')})"
132
132
  end
133
133
 
134
134
  tmp << nil
@@ -284,7 +284,7 @@ module URI
284
284
 
285
285
  # Returns the parser to be used.
286
286
  #
287
- # Unless a URI::Parser is defined, DEFAULT_PARSER is used.
287
+ # Unless the +parser+ is defined, DEFAULT_PARSER is used.
288
288
  #
289
289
  def parser
290
290
  if !defined?(@parser) || !@parser
@@ -315,7 +315,7 @@ module URI
315
315
  end
316
316
 
317
317
  #
318
- # Checks the scheme +v+ component against the URI::Parser Regexp for :SCHEME.
318
+ # Checks the scheme +v+ component against the +parser+ Regexp for :SCHEME.
319
319
  #
320
320
  def check_scheme(v)
321
321
  if v && parser.regexp[:SCHEME] !~ v
@@ -385,7 +385,7 @@ module URI
385
385
 
386
386
  #
387
387
  # Checks the user +v+ component for RFC2396 compliance
388
- # and against the URI::Parser Regexp for :USERINFO.
388
+ # and against the +parser+ Regexp for :USERINFO.
389
389
  #
390
390
  # Can not have a registry or opaque component defined,
391
391
  # with a user component defined.
@@ -393,7 +393,7 @@ module URI
393
393
  def check_user(v)
394
394
  if @opaque
395
395
  raise InvalidURIError,
396
- "can not set user with opaque"
396
+ "cannot set user with opaque"
397
397
  end
398
398
 
399
399
  return v unless v
@@ -409,7 +409,7 @@ module URI
409
409
 
410
410
  #
411
411
  # Checks the password +v+ component for RFC2396 compliance
412
- # and against the URI::Parser Regexp for :USERINFO.
412
+ # and against the +parser+ Regexp for :USERINFO.
413
413
  #
414
414
  # Can not have a registry or opaque component defined,
415
415
  # with a user component defined.
@@ -417,7 +417,7 @@ module URI
417
417
  def check_password(v, user = @user)
418
418
  if @opaque
419
419
  raise InvalidURIError,
420
- "can not set password with opaque"
420
+ "cannot set password with opaque"
421
421
  end
422
422
  return v unless v
423
423
 
@@ -592,7 +592,7 @@ module URI
592
592
 
593
593
  #
594
594
  # Checks the host +v+ component for RFC2396 compliance
595
- # and against the URI::Parser Regexp for :HOST.
595
+ # and against the +parser+ Regexp for :HOST.
596
596
  #
597
597
  # Can not have a registry or opaque component defined,
598
598
  # with a host component defined.
@@ -602,7 +602,7 @@ module URI
602
602
 
603
603
  if @opaque
604
604
  raise InvalidURIError,
605
- "can not set host with registry or opaque"
605
+ "cannot set host with registry or opaque"
606
606
  elsif parser.regexp[:HOST] !~ v
607
607
  raise InvalidComponentError,
608
608
  "bad component(expected host component): #{v}"
@@ -689,7 +689,7 @@ module URI
689
689
 
690
690
  #
691
691
  # Checks the port +v+ component for RFC2396 compliance
692
- # and against the URI::Parser Regexp for :PORT.
692
+ # and against the +parser+ Regexp for :PORT.
693
693
  #
694
694
  # Can not have a registry or opaque component defined,
695
695
  # with a port component defined.
@@ -699,7 +699,7 @@ module URI
699
699
 
700
700
  if @opaque
701
701
  raise InvalidURIError,
702
- "can not set port with registry or opaque"
702
+ "cannot set port with registry or opaque"
703
703
  elsif !v.kind_of?(Integer) && parser.regexp[:PORT] !~ v
704
704
  raise InvalidComponentError,
705
705
  "bad component(expected port component): #{v.inspect}"
@@ -748,22 +748,22 @@ module URI
748
748
  end
749
749
 
750
750
  def check_registry(v) # :nodoc:
751
- raise InvalidURIError, "can not set registry"
751
+ raise InvalidURIError, "cannot set registry"
752
752
  end
753
753
  private :check_registry
754
754
 
755
- def set_registry(v) #:nodoc:
756
- raise InvalidURIError, "can not set registry"
755
+ def set_registry(v) # :nodoc:
756
+ raise InvalidURIError, "cannot set registry"
757
757
  end
758
758
  protected :set_registry
759
759
 
760
- def registry=(v)
761
- raise InvalidURIError, "can not set registry"
760
+ def registry=(v) # :nodoc:
761
+ raise InvalidURIError, "cannot set registry"
762
762
  end
763
763
 
764
764
  #
765
765
  # Checks the path +v+ component for RFC2396 compliance
766
- # and against the URI::Parser Regexp
766
+ # and against the +parser+ Regexp
767
767
  # for :ABS_PATH and :REL_PATH.
768
768
  #
769
769
  # Can not have a opaque component defined,
@@ -868,7 +868,7 @@ module URI
868
868
 
869
869
  #
870
870
  # Checks the opaque +v+ component for RFC2396 compliance and
871
- # against the URI::Parser Regexp for :OPAQUE.
871
+ # against the +parser+ Regexp for :OPAQUE.
872
872
  #
873
873
  # Can not have a host, port, user, or path component defined,
874
874
  # with an opaque component defined.
@@ -881,7 +881,7 @@ module URI
881
881
  # hier_part = ( net_path | abs_path ) [ "?" query ]
882
882
  if @host || @port || @user || @path # userinfo = @user + ':' + @password
883
883
  raise InvalidURIError,
884
- "can not set opaque with host, port, userinfo or path"
884
+ "cannot set opaque with host, port, userinfo or path"
885
885
  elsif v && parser.regexp[:OPAQUE] !~ v
886
886
  raise InvalidComponentError,
887
887
  "bad component(expected opaque component): #{v}"
@@ -920,7 +920,7 @@ module URI
920
920
  end
921
921
 
922
922
  #
923
- # Checks the fragment +v+ component against the URI::Parser Regexp for :FRAGMENT.
923
+ # Checks the fragment +v+ component against the +parser+ Regexp for :FRAGMENT.
924
924
  #
925
925
  #
926
926
  # == Args
@@ -960,7 +960,7 @@ module URI
960
960
  # == Description
961
961
  #
962
962
  # URI has components listed in order of decreasing significance from left to right,
963
- # see RFC3986 https://tools.ietf.org/html/rfc3986 1.2.3.
963
+ # see RFC3986 https://www.rfc-editor.org/rfc/rfc3986 1.2.3.
964
964
  #
965
965
  # == Usage
966
966
  #
@@ -1247,7 +1247,7 @@ module URI
1247
1247
  return rel, rel
1248
1248
  end
1249
1249
 
1250
- # you can modify `rel', but can not `oth'.
1250
+ # you can modify `rel', but cannot `oth'.
1251
1251
  return oth, rel
1252
1252
  end
1253
1253
  private :route_from0
@@ -1272,7 +1272,7 @@ module URI
1272
1272
  # #=> #<URI::Generic /main.rbx?page=1>
1273
1273
  #
1274
1274
  def route_from(oth)
1275
- # you can modify `rel', but can not `oth'.
1275
+ # you can modify `rel', but cannot `oth'.
1276
1276
  begin
1277
1277
  oth, rel = route_from0(oth)
1278
1278
  rescue
@@ -1376,6 +1376,9 @@ module URI
1376
1376
  str << ':'
1377
1377
  str << @port.to_s
1378
1378
  end
1379
+ if (@host || @port) && !@path.empty? && !@path.start_with?('/')
1380
+ str << '/'
1381
+ end
1379
1382
  str << @path
1380
1383
  if @query
1381
1384
  str << '?'
@@ -1401,29 +1404,18 @@ module URI
1401
1404
  end
1402
1405
  end
1403
1406
 
1407
+ # Returns the hash value.
1404
1408
  def hash
1405
1409
  self.component_ary.hash
1406
1410
  end
1407
1411
 
1412
+ # Compares with _oth_ for Hash.
1408
1413
  def eql?(oth)
1409
1414
  self.class == oth.class &&
1410
1415
  parser == oth.parser &&
1411
1416
  self.component_ary.eql?(oth.component_ary)
1412
1417
  end
1413
1418
 
1414
- =begin
1415
-
1416
- --- URI::Generic#===(oth)
1417
-
1418
- =end
1419
- # def ===(oth)
1420
- # raise NotImplementedError
1421
- # end
1422
-
1423
- =begin
1424
- =end
1425
-
1426
-
1427
1419
  # Returns an Array of the components defined from the COMPONENT Array.
1428
1420
  def component_ary
1429
1421
  component.collect do |x|
@@ -1460,7 +1452,7 @@ module URI
1460
1452
  end
1461
1453
  end
1462
1454
 
1463
- def inspect
1455
+ def inspect # :nodoc:
1464
1456
  "#<#{self.class} #{self}>"
1465
1457
  end
1466
1458
 
@@ -1548,7 +1540,7 @@ module URI
1548
1540
  else
1549
1541
  unless proxy_uri = env[name]
1550
1542
  if proxy_uri = env[name.upcase]
1551
- warn 'The environment variable HTTP_PROXY is discouraged. Use http_proxy.', uplevel: 1
1543
+ warn 'The environment variable HTTP_PROXY is discouraged. Please use http_proxy instead.', uplevel: 1
1552
1544
  end
1553
1545
  end
1554
1546
  end
data/lib/uri/http.rb CHANGED
@@ -61,6 +61,18 @@ module URI
61
61
  super(tmp)
62
62
  end
63
63
 
64
+ # Do not allow empty host names, as they are not allowed by RFC 3986.
65
+ def check_host(v)
66
+ ret = super
67
+
68
+ if ret && v.empty?
69
+ raise InvalidComponentError,
70
+ "bad component(expected host component): #{v}"
71
+ end
72
+
73
+ ret
74
+ end
75
+
64
76
  #
65
77
  # == Description
66
78
  #
@@ -85,7 +97,7 @@ module URI
85
97
  # == Description
86
98
  #
87
99
  # Returns the authority for an HTTP uri, as defined in
88
- # https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.
100
+ # https://www.rfc-editor.org/rfc/rfc3986#section-3.2.
89
101
  #
90
102
  #
91
103
  # Example:
@@ -106,7 +118,7 @@ module URI
106
118
  # == Description
107
119
  #
108
120
  # Returns the origin for an HTTP uri, as defined in
109
- # https://datatracker.ietf.org/doc/html/rfc6454.
121
+ # https://www.rfc-editor.org/rfc/rfc6454.
110
122
  #
111
123
  #
112
124
  # Example:
@@ -67,7 +67,7 @@ module URI
67
67
  #
68
68
  # == Synopsis
69
69
  #
70
- # URI::Parser.new([opts])
70
+ # URI::RFC2396_Parser.new([opts])
71
71
  #
72
72
  # == Args
73
73
  #
@@ -86,7 +86,7 @@ module URI
86
86
  #
87
87
  # == Examples
88
88
  #
89
- # p = URI::Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})")
89
+ # p = URI::RFC2396_Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})")
90
90
  # u = p.parse("http://example.jp/%uABCD") #=> #<URI::HTTP http://example.jp/%uABCD>
91
91
  # URI.parse(u.to_s) #=> raises URI::InvalidURIError
92
92
  #
@@ -108,12 +108,12 @@ module URI
108
108
 
109
109
  # The Hash of patterns.
110
110
  #
111
- # See also URI::Parser.initialize_pattern.
111
+ # See also #initialize_pattern.
112
112
  attr_reader :pattern
113
113
 
114
114
  # The Hash of Regexp.
115
115
  #
116
- # See also URI::Parser.initialize_regexp.
116
+ # See also #initialize_regexp.
117
117
  attr_reader :regexp
118
118
 
119
119
  # Returns a split URI against +regexp[:ABS_URI]+.
@@ -140,11 +140,11 @@ module URI
140
140
 
141
141
  if !scheme
142
142
  raise InvalidURIError,
143
- "bad URI(absolute but no scheme): #{uri}"
143
+ "bad URI (absolute but no scheme): #{uri}"
144
144
  end
145
145
  if !opaque && (!path && (!host && !registry))
146
146
  raise InvalidURIError,
147
- "bad URI(absolute but no path): #{uri}"
147
+ "bad URI (absolute but no path): #{uri}"
148
148
  end
149
149
 
150
150
  when @regexp[:REL_URI]
@@ -173,7 +173,7 @@ module URI
173
173
  # server = [ [ userinfo "@" ] hostport ]
174
174
 
175
175
  else
176
- raise InvalidURIError, "bad URI(is not URI?): #{uri}"
176
+ raise InvalidURIError, "bad URI (is not URI?): #{uri}"
177
177
  end
178
178
 
179
179
  path = '' if !path && !opaque # (see RFC2396 Section 5.2)
@@ -202,8 +202,7 @@ module URI
202
202
  #
203
203
  # == Usage
204
204
  #
205
- # p = URI::Parser.new
206
- # p.parse("ldap://ldap.example.com/dc=example?user=john")
205
+ # URI::RFC2396_PARSER.parse("ldap://ldap.example.com/dc=example?user=john")
207
206
  # #=> #<URI::LDAP ldap://ldap.example.com/dc=example?user=john>
208
207
  #
209
208
  def parse(uri)
@@ -244,7 +243,7 @@ module URI
244
243
  # If no +block+ given, then returns the result,
245
244
  # else it calls +block+ for each element in result.
246
245
  #
247
- # See also URI::Parser.make_regexp.
246
+ # See also #make_regexp.
248
247
  #
249
248
  def extract(str, schemes = nil)
250
249
  if block_given?
@@ -263,7 +262,7 @@ module URI
263
262
  unless schemes
264
263
  @regexp[:ABS_URI_REF]
265
264
  else
266
- /(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x
265
+ /(?=(?i:#{Regexp.union(*schemes).source}):)#{@pattern[:X_ABS_URI]}/x
267
266
  end
268
267
  end
269
268
 
@@ -321,14 +320,14 @@ module URI
321
320
  str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(enc) }
322
321
  end
323
322
 
324
- @@to_s = Kernel.instance_method(:to_s)
325
- if @@to_s.respond_to?(:bind_call)
326
- def inspect
327
- @@to_s.bind_call(self)
323
+ TO_S = Kernel.instance_method(:to_s) # :nodoc:
324
+ if TO_S.respond_to?(:bind_call)
325
+ def inspect # :nodoc:
326
+ TO_S.bind_call(self)
328
327
  end
329
328
  else
330
- def inspect
331
- @@to_s.bind(self).call
329
+ def inspect # :nodoc:
330
+ TO_S.bind(self).call
332
331
  end
333
332
  end
334
333
 
@@ -524,6 +523,8 @@ module URI
524
523
  ret
525
524
  end
526
525
 
526
+ # Returns +uri+ as-is if it is URI, or convert it to URI if it is
527
+ # a String.
527
528
  def convert_to_uri(uri)
528
529
  if uri.is_a?(URI::Generic)
529
530
  uri
@@ -536,4 +537,11 @@ module URI
536
537
  end
537
538
 
538
539
  end # class Parser
540
+
541
+ # Backward compatibility for URI::REGEXP::PATTERN::*
542
+ RFC2396_Parser.new.pattern.each_pair do |sym, str|
543
+ unless RFC2396_REGEXP::PATTERN.const_defined?(sym, false)
544
+ RFC2396_REGEXP::PATTERN.const_set(sym, str)
545
+ end
546
+ end
539
547
  end # module URI
@@ -78,7 +78,7 @@ module URI
78
78
  begin
79
79
  uri = uri.to_str
80
80
  rescue NoMethodError
81
- raise InvalidURIError, "bad URI(is not URI?): #{uri.inspect}"
81
+ raise InvalidURIError, "bad URI (is not URI?): #{uri.inspect}"
82
82
  end
83
83
  uri.ascii_only? or
84
84
  raise InvalidURIError, "URI must be ascii only #{uri.dump}"
@@ -127,7 +127,7 @@ module URI
127
127
  m["fragment"]
128
128
  ]
129
129
  else
130
- raise InvalidURIError, "bad URI(is not URI?): #{uri.inspect}"
130
+ raise InvalidURIError, "bad URI (is not URI?): #{uri.inspect}"
131
131
  end
132
132
  end
133
133
 
@@ -135,12 +135,35 @@ module URI
135
135
  URI.for(*self.split(uri), self)
136
136
  end
137
137
 
138
-
139
138
  def join(*uris) # :nodoc:
140
139
  uris[0] = convert_to_uri(uris[0])
141
140
  uris.inject :merge
142
141
  end
143
142
 
143
+ # Compatibility for RFC2396 parser
144
+ def extract(str, schemes = nil, &block) # :nodoc:
145
+ warn "URI::RFC3986_PARSER.extract is obsolete. Use URI::RFC2396_PARSER.extract explicitly.", uplevel: 1 if $VERBOSE
146
+ RFC2396_PARSER.extract(str, schemes, &block)
147
+ end
148
+
149
+ # Compatibility for RFC2396 parser
150
+ def make_regexp(schemes = nil) # :nodoc:
151
+ warn "URI::RFC3986_PARSER.make_regexp is obsolete. Use URI::RFC2396_PARSER.make_regexp explicitly.", uplevel: 1 if $VERBOSE
152
+ RFC2396_PARSER.make_regexp(schemes)
153
+ end
154
+
155
+ # Compatibility for RFC2396 parser
156
+ def escape(str, unsafe = nil) # :nodoc:
157
+ warn "URI::RFC3986_PARSER.escape is obsolete. Use URI::RFC2396_PARSER.escape explicitly.", uplevel: 1 if $VERBOSE
158
+ unsafe ? RFC2396_PARSER.escape(str, unsafe) : RFC2396_PARSER.escape(str)
159
+ end
160
+
161
+ # Compatibility for RFC2396 parser
162
+ def unescape(str, escaped = nil) # :nodoc:
163
+ warn "URI::RFC3986_PARSER.unescape is obsolete. Use URI::RFC2396_PARSER.unescape explicitly.", uplevel: 1 if $VERBOSE
164
+ escaped ? RFC2396_PARSER.unescape(str, escaped) : RFC2396_PARSER.unescape(str)
165
+ end
166
+
144
167
  @@to_s = Kernel.instance_method(:to_s)
145
168
  if @@to_s.respond_to?(:bind_call)
146
169
  def inspect
data/lib/uri/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module URI
2
2
  # :stopdoc:
3
- VERSION_CODE = '001303'.freeze
4
- VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze
3
+ VERSION = '1.1.1'.freeze
4
+ VERSION_CODE = VERSION.split('.').map{|s| s.rjust(2, '0')}.join.freeze
5
5
  # :startdoc:
6
6
  end
data/lib/uri.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: false
2
2
  # URI is a module providing classes to handle Uniform Resource Identifiers
3
- # (RFC2396[http://tools.ietf.org/html/rfc2396]).
3
+ # (RFC2396[https://www.rfc-editor.org/rfc/rfc2396]).
4
4
  #
5
5
  # == Features
6
6
  #
@@ -47,14 +47,14 @@
47
47
  # A good place to view an RFC spec is http://www.ietf.org/rfc.html.
48
48
  #
49
49
  # Here is a list of all related RFC's:
50
- # - RFC822[http://tools.ietf.org/html/rfc822]
51
- # - RFC1738[http://tools.ietf.org/html/rfc1738]
52
- # - RFC2255[http://tools.ietf.org/html/rfc2255]
53
- # - RFC2368[http://tools.ietf.org/html/rfc2368]
54
- # - RFC2373[http://tools.ietf.org/html/rfc2373]
55
- # - RFC2396[http://tools.ietf.org/html/rfc2396]
56
- # - RFC2732[http://tools.ietf.org/html/rfc2732]
57
- # - RFC3986[http://tools.ietf.org/html/rfc3986]
50
+ # - RFC822[https://www.rfc-editor.org/rfc/rfc822]
51
+ # - RFC1738[https://www.rfc-editor.org/rfc/rfc1738]
52
+ # - RFC2255[https://www.rfc-editor.org/rfc/rfc2255]
53
+ # - RFC2368[https://www.rfc-editor.org/rfc/rfc2368]
54
+ # - RFC2373[https://www.rfc-editor.org/rfc/rfc2373]
55
+ # - RFC2396[https://www.rfc-editor.org/rfc/rfc2396]
56
+ # - RFC2732[https://www.rfc-editor.org/rfc/rfc2732]
57
+ # - RFC3986[https://www.rfc-editor.org/rfc/rfc3986]
58
58
  #
59
59
  # == Class tree
60
60
  #
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uri
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.3
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Yamada
@@ -16,16 +16,12 @@ executables: []
16
16
  extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
- - ".github/dependabot.yml"
20
- - ".github/workflows/gh-pages.yml"
21
- - ".github/workflows/test.yml"
22
- - ".gitignore"
23
- - Gemfile
24
- - LICENSE.txt
19
+ - ".document"
20
+ - ".rdoc_options"
21
+ - BSDL
22
+ - COPYING
25
23
  - README.md
26
- - Rakefile
27
- - bin/console
28
- - bin/setup
24
+ - docs/kernel.rb
29
25
  - lib/uri.rb
30
26
  - lib/uri/common.rb
31
27
  - lib/uri/file.rb
@@ -41,8 +37,6 @@ files:
41
37
  - lib/uri/version.rb
42
38
  - lib/uri/ws.rb
43
39
  - lib/uri/wss.rb
44
- - rakelib/sync_tool.rake
45
- - uri.gemspec
46
40
  homepage: https://github.com/ruby/uri
47
41
  licenses:
48
42
  - Ruby
@@ -67,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
61
  - !ruby/object:Gem::Version
68
62
  version: '0'
69
63
  requirements: []
70
- rubygems_version: 3.8.0.dev
64
+ rubygems_version: 3.6.9
71
65
  specification_version: 4
72
66
  summary: URI is a module providing classes to handle Uniform Resource Identifiers
73
67
  test_files: []
@@ -1,6 +0,0 @@
1
- version: 2
2
- updates:
3
- - package-ecosystem: 'github-actions'
4
- directory: '/'
5
- schedule:
6
- interval: 'weekly'
@@ -1,46 +0,0 @@
1
- name: Deploy RDoc site to Pages
2
-
3
- on:
4
- push:
5
- branches: [ 'master' ]
6
- workflow_dispatch:
7
-
8
- permissions:
9
- contents: read
10
- pages: write
11
- id-token: write
12
-
13
- concurrency:
14
- group: "pages"
15
- cancel-in-progress: true
16
-
17
- jobs:
18
- build:
19
- runs-on: ubuntu-latest
20
- steps:
21
- - name: Checkout
22
- uses: actions/checkout@v4
23
- - name: Setup Ruby
24
- uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # v1.152.0
25
- with:
26
- ruby-version: '3.2'
27
- bundler-cache: true
28
- - name: Setup Pages
29
- id: pages
30
- uses: actions/configure-pages@v3
31
- - name: Build with RDoc
32
- # Outputs to the './_site' directory by default
33
- run: bundle exec rake rdoc
34
- - name: Upload artifact
35
- uses: actions/upload-pages-artifact@v2
36
-
37
- deploy:
38
- environment:
39
- name: github-pages
40
- url: ${{ steps.deployment.outputs.page_url }}
41
- runs-on: ubuntu-latest
42
- needs: build
43
- steps:
44
- - name: Deploy to GitHub Pages
45
- id: deployment
46
- uses: actions/deploy-pages@v2
@@ -1,30 +0,0 @@
1
- name: CI
2
-
3
- on: [push, pull_request]
4
-
5
- jobs:
6
- ruby-versions:
7
- uses: ruby/actions/.github/workflows/ruby_versions.yml@master
8
- with:
9
- min_version: 2.5
10
-
11
- build:
12
- needs: ruby-versions
13
- name: build (${{ matrix.ruby }} / ${{ matrix.os }})
14
- strategy:
15
- matrix:
16
- ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
17
- os: [ ubuntu-latest, macos-latest ]
18
- exclude:
19
- - ruby: 2.5
20
- os: macos-latest
21
- runs-on: ${{ matrix.os }}
22
- steps:
23
- - uses: actions/checkout@v4
24
- - name: Set up Ruby
25
- uses: ruby/setup-ruby@v1
26
- with:
27
- ruby-version: ${{ matrix.ruby }}
28
- - run: bundle install --jobs 4 --retry 3
29
- - name: Run test
30
- run: rake test
data/.gitignore DELETED
@@ -1,10 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
9
- Gemfile.lock
10
- /_site
data/Gemfile DELETED
@@ -1,10 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec
4
-
5
- group :development do
6
- gem "bundler"
7
- gem "rake"
8
- gem "test-unit"
9
- gem "test-unit-ruby-core"
10
- end
data/Rakefile DELETED
@@ -1,18 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
3
-
4
- Rake::TestTask.new(:test) do |t|
5
- t.libs << "test/lib"
6
- t.ruby_opts << "-rhelper"
7
- t.test_files = FileList["test/**/test_*.rb"]
8
- end
9
-
10
- require "rdoc/task"
11
- RDoc::Task.new do |doc|
12
- doc.main = "README.md"
13
- doc.title = "URI - handle Uniform Resource Identifiers"
14
- doc.rdoc_files = FileList.new %w[lib README.md LICENSE.txt]
15
- doc.rdoc_dir = "_site" # for github pages
16
- end
17
-
18
- task :default => :test
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "uri"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
@@ -1,17 +0,0 @@
1
- task :sync_tool, [:from] do |t, from: nil|
2
- from ||= (File.identical?(__dir__, "rakelib") ? "../ruby/tool" : File.dirname(__dir__))
3
-
4
- require 'fileutils'
5
-
6
- {
7
- "rakelib/sync_tool.rake" => "rakelib",
8
- "lib/core_assertions.rb" => "test/lib",
9
- "lib/envutil.rb" => "test/lib",
10
- "lib/find_executable.rb" => "test/lib",
11
- "lib/helper.rb" => "test/lib",
12
- }.each do |src, dest|
13
- FileUtils.mkpath(dest)
14
- FileUtils.cp "#{from}/#{src}", dest
15
- rescue Errno::ENOENT
16
- end
17
- end
data/uri.gemspec DELETED
@@ -1,39 +0,0 @@
1
- begin
2
- require_relative "lib/uri/version"
3
- rescue LoadError # Fallback to load version file in ruby core repository
4
- require_relative "version"
5
- end
6
-
7
- Gem::Specification.new do |spec|
8
- spec.name = "uri"
9
- spec.version = URI::VERSION
10
- spec.authors = ["Akira Yamada"]
11
- spec.email = ["akira@ruby-lang.org"]
12
-
13
- spec.summary = %q{URI is a module providing classes to handle Uniform Resource Identifiers}
14
- spec.description = spec.summary
15
-
16
- github_link = "https://github.com/ruby/uri"
17
-
18
- spec.homepage = github_link
19
- spec.licenses = ["Ruby", "BSD-2-Clause"]
20
-
21
- spec.required_ruby_version = '>= 2.5'
22
-
23
- spec.metadata = {
24
- "bug_tracker_uri" => "#{github_link}/issues",
25
- "changelog_uri" => "#{github_link}/releases",
26
- "documentation_uri" => "https://ruby.github.io/uri/",
27
- "homepage_uri" => spec.homepage,
28
- "source_code_uri" => github_link
29
- }
30
-
31
- # Specify which files should be added to the gem when it is released.
32
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
33
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
34
- `git ls-files -z 2>#{IO::NULL}`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
35
- end
36
- spec.bindir = "exe"
37
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
38
- spec.require_paths = ["lib"]
39
- end