addressable 2.5.0 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7327067f0dbb5a74d2da6ddff4227408af2f91aa
4
- data.tar.gz: a2d86db5e9be6a83ba2e17c825fe4d30bfbac28f
2
+ SHA256:
3
+ metadata.gz: 03a21b1eab156a16e90bd7963af85980edfbddc8f3dbe052766303dba76cc000
4
+ data.tar.gz: 03eca5d86f4c70f9320000f36e3cff4fd8023342a4e0ac855d0ef1ec89ee6183
5
5
  SHA512:
6
- metadata.gz: afd48eec1e6c38e64f34834cbac4af4f59464f66c9616a95ec74fc0f2c005d2c1c27046d6eccbdafb81d4e0bd974d9cd9fc40beb534911f2943f56c9bcc4da7b
7
- data.tar.gz: 6a4de13abead387b0f31861e16887181a8fd686dcdb37f82f04a2fe69be91bdde5b34436269677b47477061d66d98192fbb31c67c1114b10e205c8f23b542d2b
6
+ metadata.gz: d504f9475ad823f5bb077b9c039a2c91c83e52c20896247a7289b61725c61b1ddefe8ae06155fb018fc67087cf04276081b42105a18394b45e2374ad0b2fadb0
7
+ data.tar.gz: b81766fbcb9335d5ca94403b62d3b2a6fae31b66cd3c05f48e1885eaf07883bfa1321b6930271fe1415135aec687af51312a26ce27bd4b83b2ac6424dec597c9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,43 @@
1
+ # Addressable 2.8.0
2
+ - fixes ReDoS vulnerability in Addressable::Template#match
3
+ - no longer replaces `+` with spaces in queries for non-http(s) schemes
4
+ - fixed encoding ipv6 literals
5
+ - the `:compacted` flag for `normalized_query` now dedupes parameters
6
+ - fix broken `escape_component` alias
7
+ - dropping support for Ruby 2.0 and 2.1
8
+ - adding Ruby 3.0 compatibility for development tasks
9
+ - drop support for `rack-mount` and remove Addressable::Template#generate
10
+ - performance improvements
11
+ - switch CI/CD to GitHub Actions
12
+
13
+ # Addressable 2.7.0
14
+ - added `:compacted` flag to `normalized_query`
15
+ - `heuristic_parse` handles `mailto:` more intuitively
16
+ - dropped explicit support for JRuby 9.0.5.0
17
+ - compatibility w/ public_suffix 4.x
18
+ - performance improvements
19
+
20
+ # Addressable 2.6.0
21
+ - added `tld=` method to allow assignment to the public suffix
22
+ - most `heuristic_parse` patterns are now case-insensitive
23
+ - `heuristic_parse` handles more `file://` URI variations
24
+ - fixes bug in `heuristic_parse` when uri starts with digit
25
+ - fixes bug in `request_uri=` with query strings
26
+ - fixes template issues with `nil` and `?` operator
27
+ - `frozen_string_literal` pragmas added
28
+ - minor performance improvements in regexps
29
+ - fixes to eliminate warnings
30
+
31
+ # Addressable 2.5.2
32
+ - better support for frozen string literals
33
+ - fixed bug w/ uppercase characters in scheme
34
+ - IDNA errors w/ emoji URLs
35
+ - compatibility w/ public_suffix 3.x
36
+
37
+ # Addressable 2.5.1
38
+ - allow unicode normalization to be disabled for URI Template expansion
39
+ - removed duplicate test
40
+
1
41
  # Addressable 2.5.0
2
42
  - dropping support for Ruby 1.9
3
43
  - adding support for Ruby 2.4 preview
data/Gemfile CHANGED
@@ -1,10 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
- gemspec
5
+ gemspec(path: __FILE__ == "(eval)" ? ".." : ".")
4
6
 
5
7
  group :test do
6
- gem 'rspec', '~> 3.0'
7
- gem 'rspec-its', '~> 1.1'
8
+ gem 'rspec', '~> 3.8'
9
+ gem 'rspec-its', '~> 1.3'
10
+ end
11
+
12
+ group :coverage do
13
+ gem "coveralls", "> 0.7", require: false, platforms: :mri
14
+ gem "simplecov", require: false
8
15
  end
9
16
 
10
17
  group :development do
@@ -14,19 +21,8 @@ group :development do
14
21
  end
15
22
 
16
23
  group :test, :development do
17
- gem 'rake', '> 10.0', '< 12'
18
- gem 'simplecov', :require => false
19
- gem 'coveralls', :require => false, :platforms => [
20
- :ruby_20, :ruby_21, :ruby_22, :ruby_23
21
- ]
22
- # Used to test compatibility.
23
- gem 'rack-mount', git: 'https://github.com/sporkmonger/rack-mount.git', require: 'rack/mount'
24
-
25
- if RUBY_VERSION.start_with?('2.0', '2.1')
26
- gem 'rack', '< 2', :require => false
27
- else
28
- gem 'rack', :require => false
29
- end
24
+ gem 'memory_profiler'
25
+ gem "rake", ">= 12.3.3"
30
26
  end
31
27
 
32
- gem 'idn-ruby', :platform => [:mri_20, :mri_21, :mri_22]
28
+ gem "idn-ruby", platform: :mri
data/README.md CHANGED
@@ -7,24 +7,23 @@
7
7
  <dt>License</dt><dd>Apache 2.0</dd>
8
8
  </dl>
9
9
 
10
- [![Gem Version](http://img.shields.io/gem/dt/addressable.svg)][gem]
11
- [![Build Status](https://secure.travis-ci.org/sporkmonger/addressable.png?branch=master)][travis]
12
- [![Dependency Status](https://gemnasium.com/sporkmonger/addressable.png?travis)][gemnasium]
10
+ [![Gem Version](https://img.shields.io/gem/dt/addressable.svg)][gem]
11
+ [![Build Status](https://github.com/sporkmonger/addressable/workflows/CI/badge.svg)][actions]
13
12
  [![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls]
14
- [![Documentation Coverage Status](http://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch]
15
- [![Gittip Donate](http://img.shields.io/gittip/sporkmonger.png)](https://www.gittip.com/sporkmonger/ "Support Open Source Development w/ Gittip")
13
+ [![Documentation Coverage Status](https://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch]
16
14
 
17
15
  [gem]: https://rubygems.org/gems/addressable
18
- [travis]: http://travis-ci.org/sporkmonger/addressable
19
- [gemnasium]: https://gemnasium.com/sporkmonger/addressable
16
+ [actions]: https://github.com/sporkmonger/addressable/actions
20
17
  [coveralls]: https://coveralls.io/r/sporkmonger/addressable
21
- [inch]: http://inch-ci.org/github/sporkmonger/addressable
18
+ [inch]: https://inch-ci.org/github/sporkmonger/addressable
22
19
 
23
20
  # Description
24
21
 
25
- Addressable is a replacement for the URI implementation that is part of
26
- Ruby's standard library. It more closely conforms to RFC 3986, RFC 3987, and
27
- RFC 6570 (level 4), providing support for IRIs and URI templates.
22
+ Addressable is an alternative implementation to the URI implementation
23
+ that is part of Ruby's standard library. It is flexible, offers heuristic
24
+ parsing, and additionally provides extensive support for IRIs and URI templates.
25
+
26
+ Addressable closely conforms to RFC 3986, RFC 3987, and RFC 6570 (level 4).
28
27
 
29
28
  # Reference
30
29
 
@@ -59,7 +58,7 @@ For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt).
59
58
 
60
59
  require "addressable/template"
61
60
 
62
- template = Addressable::Template.new("http://example.com/{?query*}/")
61
+ template = Addressable::Template.new("http://example.com/{?query*}")
63
62
  template.expand({
64
63
  "query" => {
65
64
  'foo' => 'bar',
@@ -99,19 +98,19 @@ You may optionally turn on native IDN support by installing libidn and the
99
98
  idn gem:
100
99
 
101
100
  ```console
102
- $ sudo apt-get install idn # Debian/Ubuntu
101
+ $ sudo apt-get install libidn11-dev # Debian/Ubuntu
103
102
  $ brew install libidn # OS X
104
103
  $ gem install idn-ruby
105
104
  ```
106
105
 
107
106
  # Semantic Versioning
108
107
 
109
- This project uses sementic versioning. You can (and should) specify your
108
+ This project uses [Semantic Versioning](https://semver.org/). You can (and should) specify your
110
109
  dependency using a pessimistic version constraint covering the major and minor
111
110
  values:
112
111
 
113
112
  ```ruby
114
- spec.add_dependency 'addressable', '~> 2.5'
113
+ spec.add_dependency 'addressable', '~> 2.7'
115
114
  ```
116
115
 
117
116
  If you need a specific bug fix, you can also specify minimum tiny versions
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
  require 'rake'
3
5
 
@@ -12,9 +14,9 @@ RELEASE_NAME = "REL #{PKG_VERSION}"
12
14
 
13
15
  PKG_SUMMARY = "URI Implementation"
14
16
  PKG_DESCRIPTION = <<-TEXT
15
- Addressable is a replacement for the URI implementation that is part of
16
- Ruby's standard library. It more closely conforms to the relevant RFCs and
17
- adds support for IRIs and URI templates.
17
+ Addressable is an alternative implementation to the URI implementation that is
18
+ part of Ruby's standard library. It is flexible, offers heuristic parsing, and
19
+ additionally provides extensive support for IRIs and URI templates.
18
20
  TEXT
19
21
 
20
22
  PKG_FILES = FileList[
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # stub: addressable 2.8.0 ruby lib
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "addressable".freeze
6
+ s.version = "2.8.0"
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
+ s.require_paths = ["lib".freeze]
10
+ s.authors = ["Bob Aman".freeze]
11
+ s.date = "2021-07-03"
12
+ s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze
13
+ s.email = "bob@sporkmonger.com".freeze
14
+ s.extra_rdoc_files = ["README.md".freeze]
15
+ s.files = ["CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE.txt".freeze, "README.md".freeze, "Rakefile".freeze, "addressable.gemspec".freeze, "data/unicode.data".freeze, "lib/addressable.rb".freeze, "lib/addressable/idna.rb".freeze, "lib/addressable/idna/native.rb".freeze, "lib/addressable/idna/pure.rb".freeze, "lib/addressable/template.rb".freeze, "lib/addressable/uri.rb".freeze, "lib/addressable/version.rb".freeze, "spec/addressable/idna_spec.rb".freeze, "spec/addressable/net_http_compat_spec.rb".freeze, "spec/addressable/security_spec.rb".freeze, "spec/addressable/template_spec.rb".freeze, "spec/addressable/uri_spec.rb".freeze, "spec/spec_helper.rb".freeze, "tasks/clobber.rake".freeze, "tasks/gem.rake".freeze, "tasks/git.rake".freeze, "tasks/metrics.rake".freeze, "tasks/profile.rake".freeze, "tasks/rspec.rake".freeze, "tasks/yard.rake".freeze]
16
+ s.homepage = "https://github.com/sporkmonger/addressable".freeze
17
+ s.licenses = ["Apache-2.0".freeze]
18
+ s.rdoc_options = ["--main".freeze, "README.md".freeze]
19
+ s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
20
+ s.rubygems_version = "3.0.3".freeze
21
+ s.summary = "URI Implementation".freeze
22
+
23
+ if s.respond_to? :specification_version then
24
+ s.specification_version = 4
25
+
26
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
+ s.add_runtime_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
28
+ s.add_development_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
29
+ else
30
+ s.add_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
31
+ s.add_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<public_suffix>.freeze, [">= 2.0.2", "< 5.0"])
35
+ s.add_dependency(%q<bundler>.freeze, [">= 1.0", "< 3.0"])
36
+ end
37
+ end
data/lib/addressable.rb CHANGED
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'addressable/uri'
2
4
  require 'addressable/template'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # encoding:utf-8
2
4
  #--
3
5
  # Copyright (C) Bob Aman
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # encoding:utf-8
2
4
  #--
3
5
  # Copyright (C) Bob Aman
@@ -35,7 +37,7 @@ module Addressable
35
37
  def self.to_ascii(value)
36
38
  value.to_s.split('.', -1).map do |segment|
37
39
  if segment.size > 0 && segment.size < 64
38
- IDN::Idna.toASCII(segment)
40
+ IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED)
39
41
  elsif segment.size >= 64
40
42
  segment
41
43
  else
@@ -47,7 +49,7 @@ module Addressable
47
49
  def self.to_unicode(value)
48
50
  value.to_s.split('.', -1).map do |segment|
49
51
  if segment.size > 0 && segment.size < 64
50
- IDN::Idna.toUnicode(segment)
52
+ IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED)
51
53
  elsif segment.size >= 64
52
54
  segment
53
55
  else
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # encoding:utf-8
2
4
  #--
3
5
  # Copyright (C) Bob Aman
@@ -133,7 +135,7 @@ module Addressable
133
135
  unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) }
134
136
  return unpacked.pack("U*")
135
137
  end
136
- (class <<self; private :unicode_downcase; end)
138
+ private_class_method :unicode_downcase
137
139
 
138
140
  def self.unicode_compose(unpacked)
139
141
  unpacked_result = []
@@ -146,22 +148,19 @@ module Addressable
146
148
  starter_cc = 256 if starter_cc != 0
147
149
  for i in 1...length
148
150
  ch = unpacked[i]
149
- cc = lookup_unicode_combining_class(ch)
150
151
 
151
152
  if (starter_cc == 0 &&
152
153
  (composite = unicode_compose_pair(starter, ch)) != nil)
153
154
  starter = composite
154
- startercc = lookup_unicode_combining_class(composite)
155
155
  else
156
156
  unpacked_result << starter
157
157
  starter = ch
158
- startercc = cc
159
158
  end
160
159
  end
161
160
  unpacked_result << starter
162
161
  return unpacked_result
163
162
  end
164
- (class <<self; private :unicode_compose; end)
163
+ private_class_method :unicode_compose
165
164
 
166
165
  def self.unicode_compose_pair(ch_one, ch_two)
167
166
  if ch_one >= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT &&
@@ -179,43 +178,45 @@ module Addressable
179
178
  end
180
179
 
181
180
  p = []
182
- ucs4_to_utf8 = lambda do |ch|
183
- if ch < 128
184
- p << ch
185
- elsif ch < 2048
186
- p << (ch >> 6 | 192)
187
- p << (ch & 63 | 128)
188
- elsif ch < 0x10000
189
- p << (ch >> 12 | 224)
190
- p << (ch >> 6 & 63 | 128)
191
- p << (ch & 63 | 128)
192
- elsif ch < 0x200000
193
- p << (ch >> 18 | 240)
194
- p << (ch >> 12 & 63 | 128)
195
- p << (ch >> 6 & 63 | 128)
196
- p << (ch & 63 | 128)
197
- elsif ch < 0x4000000
198
- p << (ch >> 24 | 248)
199
- p << (ch >> 18 & 63 | 128)
200
- p << (ch >> 12 & 63 | 128)
201
- p << (ch >> 6 & 63 | 128)
202
- p << (ch & 63 | 128)
203
- elsif ch < 0x80000000
204
- p << (ch >> 30 | 252)
205
- p << (ch >> 24 & 63 | 128)
206
- p << (ch >> 18 & 63 | 128)
207
- p << (ch >> 12 & 63 | 128)
208
- p << (ch >> 6 & 63 | 128)
209
- p << (ch & 63 | 128)
210
- end
211
- end
212
181
 
213
- ucs4_to_utf8.call(ch_one)
214
- ucs4_to_utf8.call(ch_two)
182
+ ucs4_to_utf8(ch_one, p)
183
+ ucs4_to_utf8(ch_two, p)
215
184
 
216
185
  return lookup_unicode_composition(p)
217
186
  end
218
- (class <<self; private :unicode_compose_pair; end)
187
+ private_class_method :unicode_compose_pair
188
+
189
+ def self.ucs4_to_utf8(char, buffer)
190
+ if char < 128
191
+ buffer << char
192
+ elsif char < 2048
193
+ buffer << (char >> 6 | 192)
194
+ buffer << (char & 63 | 128)
195
+ elsif char < 0x10000
196
+ buffer << (char >> 12 | 224)
197
+ buffer << (char >> 6 & 63 | 128)
198
+ buffer << (char & 63 | 128)
199
+ elsif char < 0x200000
200
+ buffer << (char >> 18 | 240)
201
+ buffer << (char >> 12 & 63 | 128)
202
+ buffer << (char >> 6 & 63 | 128)
203
+ buffer << (char & 63 | 128)
204
+ elsif char < 0x4000000
205
+ buffer << (char >> 24 | 248)
206
+ buffer << (char >> 18 & 63 | 128)
207
+ buffer << (char >> 12 & 63 | 128)
208
+ buffer << (char >> 6 & 63 | 128)
209
+ buffer << (char & 63 | 128)
210
+ elsif char < 0x80000000
211
+ buffer << (char >> 30 | 252)
212
+ buffer << (char >> 24 & 63 | 128)
213
+ buffer << (char >> 18 & 63 | 128)
214
+ buffer << (char >> 12 & 63 | 128)
215
+ buffer << (char >> 6 & 63 | 128)
216
+ buffer << (char & 63 | 128)
217
+ end
218
+ end
219
+ private_class_method :ucs4_to_utf8
219
220
 
220
221
  def self.unicode_sort_canonical(unpacked)
221
222
  unpacked = unpacked.dup
@@ -239,7 +240,7 @@ module Addressable
239
240
  end
240
241
  return unpacked
241
242
  end
242
- (class <<self; private :unicode_sort_canonical; end)
243
+ private_class_method :unicode_sort_canonical
243
244
 
244
245
  def self.unicode_decompose(unpacked)
245
246
  unpacked_result = []
@@ -260,7 +261,7 @@ module Addressable
260
261
  end
261
262
  return unpacked_result
262
263
  end
263
- (class <<self; private :unicode_decompose; end)
264
+ private_class_method :unicode_decompose
264
265
 
265
266
  def self.unicode_decompose_hangul(codepoint)
266
267
  sindex = codepoint - HANGUL_SBASE;
@@ -277,7 +278,7 @@ module Addressable
277
278
  end
278
279
  return l, v, t
279
280
  end
280
- (class <<self; private :unicode_decompose_hangul; end)
281
+ private_class_method :unicode_decompose_hangul
281
282
 
282
283
  def self.lookup_unicode_combining_class(codepoint)
283
284
  codepoint_data = UNICODE_DATA[codepoint]
@@ -285,14 +286,14 @@ module Addressable
285
286
  (codepoint_data[UNICODE_DATA_COMBINING_CLASS] || 0) :
286
287
  0)
287
288
  end
288
- (class <<self; private :lookup_unicode_combining_class; end)
289
+ private_class_method :lookup_unicode_combining_class
289
290
 
290
291
  def self.lookup_unicode_compatibility(codepoint)
291
292
  codepoint_data = UNICODE_DATA[codepoint]
292
293
  (codepoint_data ?
293
294
  codepoint_data[UNICODE_DATA_COMPATIBILITY] : nil)
294
295
  end
295
- (class <<self; private :lookup_unicode_compatibility; end)
296
+ private_class_method :lookup_unicode_compatibility
296
297
 
297
298
  def self.lookup_unicode_lowercase(codepoint)
298
299
  codepoint_data = UNICODE_DATA[codepoint]
@@ -300,12 +301,12 @@ module Addressable
300
301
  (codepoint_data[UNICODE_DATA_LOWERCASE] || codepoint) :
301
302
  codepoint)
302
303
  end
303
- (class <<self; private :lookup_unicode_lowercase; end)
304
+ private_class_method :lookup_unicode_lowercase
304
305
 
305
306
  def self.lookup_unicode_composition(unpacked)
306
307
  return COMPOSITION_TABLE[unpacked]
307
308
  end
308
- (class <<self; private :lookup_unicode_composition; end)
309
+ private_class_method :lookup_unicode_composition
309
310
 
310
311
  HANGUL_SBASE = 0xac00
311
312
  HANGUL_LBASE = 0x1100
@@ -342,7 +343,7 @@ module Addressable
342
343
  end
343
344
 
344
345
  COMPOSITION_TABLE = {}
345
- for codepoint, data in UNICODE_DATA
346
+ UNICODE_DATA.each do |codepoint, data|
346
347
  canonical = data[UNICODE_DATA_CANONICAL]
347
348
  exclusion = data[UNICODE_DATA_EXCLUSION]
348
349
 
@@ -501,7 +502,7 @@ module Addressable
501
502
 
502
503
  output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "")
503
504
  end
504
- (class <<self; private :punycode_encode; end)
505
+ private_class_method :punycode_encode
505
506
 
506
507
  def self.punycode_decode(punycode)
507
508
  input = []
@@ -623,22 +624,22 @@ module Addressable
623
624
 
624
625
  output.pack("U*")
625
626
  end
626
- (class <<self; private :punycode_decode; end)
627
+ private_class_method :punycode_decode
627
628
 
628
629
  def self.punycode_basic?(codepoint)
629
630
  codepoint < 0x80
630
631
  end
631
- (class <<self; private :punycode_basic?; end)
632
+ private_class_method :punycode_basic?
632
633
 
633
634
  def self.punycode_delimiter?(codepoint)
634
635
  codepoint == PUNYCODE_DELIMITER
635
636
  end
636
- (class <<self; private :punycode_delimiter?; end)
637
+ private_class_method :punycode_delimiter?
637
638
 
638
639
  def self.punycode_encode_digit(d)
639
640
  d + 22 + 75 * ((d < 26) ? 1 : 0)
640
641
  end
641
- (class <<self; private :punycode_encode_digit; end)
642
+ private_class_method :punycode_encode_digit
642
643
 
643
644
  # Returns the numeric value of a basic codepoint
644
645
  # (for use in representing integers) in the range 0 to
@@ -654,7 +655,7 @@ module Addressable
654
655
  PUNYCODE_BASE
655
656
  end
656
657
  end
657
- (class <<self; private :punycode_decode_digit; end)
658
+ private_class_method :punycode_decode_digit
658
659
 
659
660
  # Bias adaptation method
660
661
  def self.punycode_adapt(delta, numpoints, firsttime)
@@ -671,7 +672,7 @@ module Addressable
671
672
 
672
673
  k + (difference + 1) * delta / (delta + PUNYCODE_SKEW)
673
674
  end
674
- (class <<self; private :punycode_adapt; end)
675
+ private_class_method :punycode_adapt
675
676
  end
676
677
  # :startdoc:
677
678
  end