addressable 2.5.2 → 2.6.0
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.
Potentially problematic release.
This version of addressable might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/Gemfile +1 -1
- data/README.md +2 -4
- data/Rakefile +2 -0
- data/lib/addressable.rb +2 -0
- data/lib/addressable/idna.rb +2 -0
- data/lib/addressable/idna/native.rb +2 -0
- data/lib/addressable/idna/pure.rb +2 -3
- data/lib/addressable/template.rb +17 -37
- data/lib/addressable/uri.rb +40 -22
- data/lib/addressable/version.rb +4 -2
- data/spec/addressable/idna_spec.rb +8 -6
- data/spec/addressable/net_http_compat_spec.rb +2 -0
- data/spec/addressable/rack_mount_compat_spec.rb +2 -0
- data/spec/addressable/security_spec.rb +2 -0
- data/spec/addressable/template_spec.rb +33 -1
- data/spec/addressable/uri_spec.rb +77 -0
- data/spec/spec_helper.rb +3 -0
- data/tasks/clobber.rake +2 -0
- data/tasks/gem.rake +3 -1
- data/tasks/git.rake +2 -0
- data/tasks/metrics.rake +2 -0
- data/tasks/rspec.rake +2 -0
- data/tasks/yard.rake +2 -0
- metadata +10 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: afa411655b3715e655e0cdca551d20df31b83491
         | 
| 4 | 
            +
              data.tar.gz: 0cd2871c45abb19f6b6238ad202856e7afb8619d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 16274bd51d38c58b3712dbbdad1368417051937dbe33d74fa73951a39b71d824092c0ecd50005d467db9c914cc074fd0344282df2e23e1182c764b1a1da9750a
         | 
| 7 | 
            +
              data.tar.gz: c53ff1d0e09a5e3d997a13a464d50c45fd7d548326f94d3ad40dc97753ce3a47aad4804a62faea48b89775394538982e70ac22d7488fab8ee6594b6816d8ff28
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,14 @@ | |
| 1 | 
            +
            # Addressable 2.6.0
         | 
| 2 | 
            +
            - added `tld=` method to allow assignment to the public suffix
         | 
| 3 | 
            +
            - most `heuristic_parse` patterns are now case-insensitive
         | 
| 4 | 
            +
            - `heuristic_parse` handles more `file://` URI variations
         | 
| 5 | 
            +
            - fixes bug in `heuristic_parse` when uri starts with digit
         | 
| 6 | 
            +
            - fixes bug in `request_uri=` with query strings
         | 
| 7 | 
            +
            - fixes template issues with `nil` and `?` operator
         | 
| 8 | 
            +
            - `frozen_string_literal` pragmas added
         | 
| 9 | 
            +
            - minor performance improvements in regexps
         | 
| 10 | 
            +
            - fixes to eliminate warnings
         | 
| 11 | 
            +
             | 
| 1 12 | 
             
            # Addressable 2.5.2
         | 
| 2 13 | 
             
            - better support for frozen string literals
         | 
| 3 14 | 
             
            - fixed bug w/ uppercase characters in scheme
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -9,13 +9,11 @@ | |
| 9 9 |  | 
| 10 10 | 
             
            [][gem]
         | 
| 11 11 | 
             
            [][travis]
         | 
| 12 | 
            -
            [][gemnasium]
         | 
| 13 12 | 
             
            [][coveralls]
         | 
| 14 13 | 
             
            [][inch]
         | 
| 15 14 |  | 
| 16 15 | 
             
            [gem]: https://rubygems.org/gems/addressable
         | 
| 17 16 | 
             
            [travis]: http://travis-ci.org/sporkmonger/addressable
         | 
| 18 | 
            -
            [gemnasium]: https://gemnasium.com/sporkmonger/addressable
         | 
| 19 17 | 
             
            [coveralls]: https://coveralls.io/r/sporkmonger/addressable
         | 
| 20 18 | 
             
            [inch]: http://inch-ci.org/github/sporkmonger/addressable
         | 
| 21 19 |  | 
| @@ -58,7 +56,7 @@ For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt). | |
| 58 56 |  | 
| 59 57 | 
             
            require "addressable/template"
         | 
| 60 58 |  | 
| 61 | 
            -
            template = Addressable::Template.new("http://example.com/{?query*} | 
| 59 | 
            +
            template = Addressable::Template.new("http://example.com/{?query*}")
         | 
| 62 60 | 
             
            template.expand({
         | 
| 63 61 | 
             
              "query" => {
         | 
| 64 62 | 
             
                'foo' => 'bar',
         | 
| @@ -105,7 +103,7 @@ $ gem install idn-ruby | |
| 105 103 |  | 
| 106 104 | 
             
            # Semantic Versioning
         | 
| 107 105 |  | 
| 108 | 
            -
            This project uses  | 
| 106 | 
            +
            This project uses [Semantic Versioning](https://semver.org/). You can (and should) specify your
         | 
| 109 107 | 
             
            dependency using a pessimistic version constraint covering the major and minor
         | 
| 110 108 | 
             
            values:
         | 
| 111 109 |  | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/lib/addressable.rb
    CHANGED
    
    
    
        data/lib/addressable/idna.rb
    CHANGED
    
    
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # encoding:utf-8
         | 
| 2 4 | 
             
            #--
         | 
| 3 5 | 
             
            # Copyright (C) Bob Aman
         | 
| @@ -146,16 +148,13 @@ 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
         | 
    
        data/lib/addressable/template.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # encoding:utf-8
         | 
| 2 4 | 
             
            #--
         | 
| 3 5 | 
             
            # Copyright (C) Bob Aman
         | 
| @@ -728,54 +730,32 @@ module Addressable | |
| 728 730 | 
             
                                              normalize_values = true)
         | 
| 729 731 | 
             
                  _, operator, varlist = *capture.match(EXPRESSION)
         | 
| 730 732 |  | 
| 731 | 
            -
                  vars = varlist.split( | 
| 733 | 
            +
                  vars = varlist.split(",")
         | 
| 732 734 |  | 
| 733 | 
            -
                  if  | 
| 735 | 
            +
                  if operator == "?"
         | 
| 734 736 | 
             
                    # partial expansion of form style query variables sometimes requires a
         | 
| 735 737 | 
             
                    # slight reordering of the variables to produce a valid url.
         | 
| 736 738 | 
             
                    first_to_expand = vars.find { |varspec|
         | 
| 737 739 | 
             
                      _, name, _ =  *varspec.match(VARSPEC)
         | 
| 738 | 
            -
                      mapping.key? name
         | 
| 740 | 
            +
                      mapping.key?(name) && !mapping[name].nil?
         | 
| 739 741 | 
             
                    }
         | 
| 740 742 |  | 
| 741 743 | 
             
                    vars = [first_to_expand] + vars.reject {|varspec| varspec == first_to_expand}  if first_to_expand
         | 
| 742 744 | 
             
                  end
         | 
| 743 745 |  | 
| 744 | 
            -
                  vars
         | 
| 745 | 
            -
                     | 
| 746 | 
            -
                    .reduce("".dup) do |acc, (varspec, op)|
         | 
| 746 | 
            +
                  vars.
         | 
| 747 | 
            +
                    inject("".dup) do |acc, varspec|
         | 
| 747 748 | 
             
                      _, name, _ =  *varspec.match(VARSPEC)
         | 
| 748 | 
            -
             | 
| 749 | 
            -
             | 
| 750 | 
            -
             | 
| 751 | 
            -
             | 
| 752 | 
            -
             | 
| 753 | 
            -
             | 
| 754 | 
            -
             | 
| 755 | 
            -
             | 
| 756 | 
            -
             | 
| 757 | 
            -
             | 
| 758 | 
            -
                ##
         | 
| 759 | 
            -
                # Creates a lazy Enumerator of the operators that should be used to expand
         | 
| 760 | 
            -
                # variables in a varlist starting with `operator`. For example, an operator
         | 
| 761 | 
            -
                # `"?"` results in the sequence `"?","&","&"...`
         | 
| 762 | 
            -
                #
         | 
| 763 | 
            -
                # @param [String] operator from which to generate a sequence
         | 
| 764 | 
            -
                #
         | 
| 765 | 
            -
                # @return [Enumerator] sequence of operators
         | 
| 766 | 
            -
                def operator_sequence(operator)
         | 
| 767 | 
            -
                  rest_operator = if "?" == operator
         | 
| 768 | 
            -
                                    "&"
         | 
| 769 | 
            -
                                  else
         | 
| 770 | 
            -
                                    operator
         | 
| 771 | 
            -
                                  end
         | 
| 772 | 
            -
                  head_operator = operator
         | 
| 773 | 
            -
             | 
| 774 | 
            -
                  Enumerator.new do |y|
         | 
| 775 | 
            -
                    y << head_operator.to_s
         | 
| 776 | 
            -
                    while true
         | 
| 777 | 
            -
                      y << rest_operator.to_s
         | 
| 778 | 
            -
                    end
         | 
| 749 | 
            +
                      next_val = if mapping.key? name
         | 
| 750 | 
            +
                                   transform_capture(mapping, "{#{operator}#{varspec}}",
         | 
| 751 | 
            +
                                                     processor, normalize_values)
         | 
| 752 | 
            +
                                 else
         | 
| 753 | 
            +
                                   "{#{operator}#{varspec}}"
         | 
| 754 | 
            +
                                 end
         | 
| 755 | 
            +
                      # If we've already expanded at least one '?' operator with non-empty
         | 
| 756 | 
            +
                      # value, change to '&'
         | 
| 757 | 
            +
                      operator = "&" if (operator == "?") && (next_val != "")
         | 
| 758 | 
            +
                      acc << next_val
         | 
| 779 759 | 
             
                  end
         | 
| 780 760 | 
             
                end
         | 
| 781 761 |  | 
    
        data/lib/addressable/uri.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # encoding:utf-8
         | 
| 2 4 | 
             
            #--
         | 
| 3 5 | 
             
            # Copyright (C) Bob Aman
         | 
| @@ -122,9 +124,9 @@ module Addressable | |
| 122 124 | 
             
                      user = userinfo.strip[/^([^:]*):?/, 1]
         | 
| 123 125 | 
             
                      password = userinfo.strip[/:(.*)$/, 1]
         | 
| 124 126 | 
             
                    end
         | 
| 125 | 
            -
                    host = authority. | 
| 127 | 
            +
                    host = authority.sub(
         | 
| 126 128 | 
             
                      /^([^\[\]]*)@/, EMPTY_STR
         | 
| 127 | 
            -
                    ). | 
| 129 | 
            +
                    ).sub(
         | 
| 128 130 | 
             
                      /:([^:@\[\]]*?)$/, EMPTY_STR
         | 
| 129 131 | 
             
                    )
         | 
| 130 132 | 
             
                    port = authority[/:([^:@\[\]]*?)$/, 1]
         | 
| @@ -182,18 +184,24 @@ module Addressable | |
| 182 184 | 
             
                    :scheme => "http"
         | 
| 183 185 | 
             
                  }.merge(hints)
         | 
| 184 186 | 
             
                  case uri
         | 
| 185 | 
            -
                  when /^http | 
| 186 | 
            -
                    uri. | 
| 187 | 
            -
                  when /^https | 
| 188 | 
            -
                    uri. | 
| 189 | 
            -
                  when /^feed:\/+http | 
| 190 | 
            -
                    uri. | 
| 191 | 
            -
                  when /^feed | 
| 192 | 
            -
                    uri. | 
| 193 | 
            -
                  when  | 
| 194 | 
            -
                    uri. | 
| 187 | 
            +
                  when /^http:\//i
         | 
| 188 | 
            +
                    uri.sub!(/^http:\/+/i, "http://")
         | 
| 189 | 
            +
                  when /^https:\//i
         | 
| 190 | 
            +
                    uri.sub!(/^https:\/+/i, "https://")
         | 
| 191 | 
            +
                  when /^feed:\/+http:\//i
         | 
| 192 | 
            +
                    uri.sub!(/^feed:\/+http:\/+/i, "feed:http://")
         | 
| 193 | 
            +
                  when /^feed:\//i
         | 
| 194 | 
            +
                    uri.sub!(/^feed:\/+/i, "feed://")
         | 
| 195 | 
            +
                  when %r[^file:/{4}]i
         | 
| 196 | 
            +
                    uri.sub!(%r[^file:/+]i, "file:////")
         | 
| 197 | 
            +
                  when %r[^file://localhost/]i
         | 
| 198 | 
            +
                    uri.sub!(%r[^file://localhost/+]i, "file:///")
         | 
| 199 | 
            +
                  when %r[^file:/+]i
         | 
| 200 | 
            +
                    uri.sub!(%r[^file:/+]i, "file:///")
         | 
| 195 201 | 
             
                  when /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
         | 
| 196 | 
            -
                    uri. | 
| 202 | 
            +
                    uri.sub!(/^/, hints[:scheme] + "://")
         | 
| 203 | 
            +
                  when /\A\d+\..*:\d+\z/
         | 
| 204 | 
            +
                    uri = "#{hints[:scheme]}://#{uri}"
         | 
| 197 205 | 
             
                  end
         | 
| 198 206 | 
             
                  match = uri.match(URIREGEX)
         | 
| 199 207 | 
             
                  fragments = match.captures
         | 
| @@ -202,6 +210,7 @@ module Addressable | |
| 202 210 | 
             
                    new_authority = authority.gsub(/\\/, '/').gsub(/ /, '%20')
         | 
| 203 211 | 
             
                    # NOTE: We want offset 4, not 3!
         | 
| 204 212 | 
             
                    offset = match.offset(4)
         | 
| 213 | 
            +
                    uri = uri.dup
         | 
| 205 214 | 
             
                    uri[offset[0]...offset[1]] = new_authority
         | 
| 206 215 | 
             
                  end
         | 
| 207 216 | 
             
                  parsed = self.parse(uri)
         | 
| @@ -212,7 +221,7 @@ module Addressable | |
| 212 221 | 
             
                    new_host = parsed.path[/^([^\/]+\.[^\/]*)/, 1]
         | 
| 213 222 | 
             
                    if new_host
         | 
| 214 223 | 
             
                      parsed.defer_validation do
         | 
| 215 | 
            -
                        new_path = parsed.path. | 
| 224 | 
            +
                        new_path = parsed.path.sub(
         | 
| 216 225 | 
             
                          Regexp.new("^" + Regexp.escape(new_host)), EMPTY_STR)
         | 
| 217 226 | 
             
                        parsed.host = new_host
         | 
| 218 227 | 
             
                        parsed.path = new_path
         | 
| @@ -263,19 +272,19 @@ module Addressable | |
| 263 272 | 
             
                  # Otherwise, convert to a String
         | 
| 264 273 | 
             
                  path = path.to_str.strip
         | 
| 265 274 |  | 
| 266 | 
            -
                  path. | 
| 275 | 
            +
                  path.sub!(/^file:\/?\/?/, EMPTY_STR) if path =~ /^file:\/?\/?/
         | 
| 267 276 | 
             
                  path = SLASH + path if path =~ /^([a-zA-Z])[\|:]/
         | 
| 268 277 | 
             
                  uri = self.parse(path)
         | 
| 269 278 |  | 
| 270 279 | 
             
                  if uri.scheme == nil
         | 
| 271 280 | 
             
                    # Adjust windows-style uris
         | 
| 272 | 
            -
                    uri.path. | 
| 281 | 
            +
                    uri.path.sub!(/^\/?([a-zA-Z])[\|:][\\\/]/) do
         | 
| 273 282 | 
             
                      "/#{$1.downcase}:/"
         | 
| 274 283 | 
             
                    end
         | 
| 275 284 | 
             
                    uri.path.gsub!(/\\/, SLASH)
         | 
| 276 285 | 
             
                    if File.exist?(uri.path) &&
         | 
| 277 286 | 
             
                        File.stat(uri.path).directory?
         | 
| 278 | 
            -
                      uri.path. | 
| 287 | 
            +
                      uri.path.sub!(/\/$/, EMPTY_STR)
         | 
| 279 288 | 
             
                      uri.path = uri.path + '/'
         | 
| 280 289 | 
             
                    end
         | 
| 281 290 |  | 
| @@ -1168,6 +1177,15 @@ module Addressable | |
| 1168 1177 | 
             
                  PublicSuffix.parse(self.host, ignore_private: true).tld
         | 
| 1169 1178 | 
             
                end
         | 
| 1170 1179 |  | 
| 1180 | 
            +
                ##
         | 
| 1181 | 
            +
                # Sets the top-level domain for this URI.
         | 
| 1182 | 
            +
                #
         | 
| 1183 | 
            +
                # @param [String, #to_str] new_tld The new top-level domain.
         | 
| 1184 | 
            +
                def tld=(new_tld)
         | 
| 1185 | 
            +
                  replaced_tld = domain.sub(/#{tld}\z/, new_tld)
         | 
| 1186 | 
            +
                  self.host = PublicSuffix::Domain.new(replaced_tld).to_s
         | 
| 1187 | 
            +
                end
         | 
| 1188 | 
            +
             | 
| 1171 1189 | 
             
                ##
         | 
| 1172 1190 | 
             
                # Returns the public suffix domain for this host.
         | 
| 1173 1191 | 
             
                #
         | 
| @@ -1235,9 +1253,9 @@ module Addressable | |
| 1235 1253 | 
             
                      new_user = new_userinfo.strip[/^([^:]*):?/, 1]
         | 
| 1236 1254 | 
             
                      new_password = new_userinfo.strip[/:(.*)$/, 1]
         | 
| 1237 1255 | 
             
                    end
         | 
| 1238 | 
            -
                    new_host = new_authority. | 
| 1256 | 
            +
                    new_host = new_authority.sub(
         | 
| 1239 1257 | 
             
                      /^([^\[\]]*)@/, EMPTY_STR
         | 
| 1240 | 
            -
                    ). | 
| 1258 | 
            +
                    ).sub(
         | 
| 1241 1259 | 
             
                      /:([^:@\[\]]*?)$/, EMPTY_STR
         | 
| 1242 1260 | 
             
                    )
         | 
| 1243 1261 | 
             
                    new_port =
         | 
| @@ -1544,7 +1562,7 @@ module Addressable | |
| 1544 1562 | 
             
                # @return [String] The path's basename.
         | 
| 1545 1563 | 
             
                def basename
         | 
| 1546 1564 | 
             
                  # Path cannot be nil
         | 
| 1547 | 
            -
                  return File.basename(self.path). | 
| 1565 | 
            +
                  return File.basename(self.path).sub(/;[^\/]*$/, EMPTY_STR)
         | 
| 1548 1566 | 
             
                end
         | 
| 1549 1567 |  | 
| 1550 1568 | 
             
                ##
         | 
| @@ -1744,7 +1762,7 @@ module Addressable | |
| 1744 1762 | 
             
                      "Cannot set an HTTP request URI for a non-HTTP URI."
         | 
| 1745 1763 | 
             
                  end
         | 
| 1746 1764 | 
             
                  new_request_uri = new_request_uri.to_str
         | 
| 1747 | 
            -
                  path_component = new_request_uri[/^([^\?]*) | 
| 1765 | 
            +
                  path_component = new_request_uri[/^([^\?]*)\??(?:.*)$/, 1]
         | 
| 1748 1766 | 
             
                  query_component = new_request_uri[/^(?:[^\?]*)\?(.*)$/, 1]
         | 
| 1749 1767 | 
             
                  path_component = path_component.to_s
         | 
| 1750 1768 | 
             
                  path_component = (!path_component.empty? ? path_component : SLASH)
         | 
| @@ -1900,7 +1918,7 @@ module Addressable | |
| 1900 1918 | 
             
                          #
         | 
| 1901 1919 | 
             
                          # Removes the right-most path segment from the base path.
         | 
| 1902 1920 | 
             
                          if base_path =~ /\//
         | 
| 1903 | 
            -
                            base_path. | 
| 1921 | 
            +
                            base_path.sub!(/\/[^\/]+$/, SLASH)
         | 
| 1904 1922 | 
             
                          else
         | 
| 1905 1923 | 
             
                            base_path = EMPTY_STR
         | 
| 1906 1924 | 
             
                          end
         | 
    
        data/lib/addressable/version.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # encoding:utf-8
         | 
| 2 4 | 
             
            #--
         | 
| 3 5 | 
             
            # Copyright (C) Bob Aman
         | 
| @@ -21,8 +23,8 @@ if !defined?(Addressable::VERSION) | |
| 21 23 | 
             
              module Addressable
         | 
| 22 24 | 
             
                module VERSION
         | 
| 23 25 | 
             
                  MAJOR = 2
         | 
| 24 | 
            -
                  MINOR =  | 
| 25 | 
            -
                  TINY  =  | 
| 26 | 
            +
                  MINOR = 6
         | 
| 27 | 
            +
                  TINY  = 0
         | 
| 26 28 |  | 
| 27 29 | 
             
                  STRING = [MAJOR, MINOR, TINY].join('.')
         | 
| 28 30 | 
             
                end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # coding: utf-8
         | 
| 2 4 | 
             
            # Copyright (C) Bob Aman
         | 
| 3 5 | 
             
            #
         | 
| @@ -26,9 +28,9 @@ shared_examples_for "converting from unicode to ASCII" do | |
| 26 28 | 
             
                expect(Addressable::IDNA.to_ascii("www.google.com")).to eq("www.google.com")
         | 
| 27 29 | 
             
              end
         | 
| 28 30 |  | 
| 29 | 
            -
               | 
| 30 | 
            -
              it "should convert '#{ | 
| 31 | 
            -
                expect(Addressable::IDNA.to_ascii( | 
| 31 | 
            +
              long = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com'
         | 
| 32 | 
            +
              it "should convert '#{long}' correctly" do
         | 
| 33 | 
            +
                expect(Addressable::IDNA.to_ascii(long)).to eq(long)
         | 
| 32 34 | 
             
              end
         | 
| 33 35 |  | 
| 34 36 | 
             
              it "should convert 'www.詹姆斯.com' correctly" do
         | 
| @@ -148,9 +150,9 @@ shared_examples_for "converting from unicode to ASCII" do | |
| 148 150 | 
             
            end
         | 
| 149 151 |  | 
| 150 152 | 
             
            shared_examples_for "converting from ASCII to unicode" do
         | 
| 151 | 
            -
               | 
| 152 | 
            -
              it "should convert '#{ | 
| 153 | 
            -
                expect(Addressable::IDNA.to_unicode( | 
| 153 | 
            +
              long = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com'
         | 
| 154 | 
            +
              it "should convert '#{long}' correctly" do
         | 
| 155 | 
            +
                expect(Addressable::IDNA.to_unicode(long)).to eq(long)
         | 
| 154 156 | 
             
              end
         | 
| 155 157 |  | 
| 156 158 | 
             
              it "should return the identity conversion when punycode decode fails" do
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # coding: utf-8
         | 
| 2 4 | 
             
            # Copyright (C) Bob Aman
         | 
| 3 5 | 
             
            #
         | 
| @@ -82,7 +84,7 @@ describe "Type conversion" do | |
| 82 84 | 
             
                  :hello => 1234,
         | 
| 83 85 | 
             
                  :nothing => nil,
         | 
| 84 86 | 
             
                  :sym => :symbolic,
         | 
| 85 | 
            -
                  :decimal => BigDecimal | 
| 87 | 
            +
                  :decimal => BigDecimal('1')
         | 
| 86 88 | 
             
                }
         | 
| 87 89 | 
             
              }
         | 
| 88 90 |  | 
| @@ -949,6 +951,36 @@ describe Addressable::Template do | |
| 949 951 | 
             
                    )
         | 
| 950 952 | 
             
                  end
         | 
| 951 953 | 
             
                end
         | 
| 954 | 
            +
                context "issue #307 - partial_expand form query with nil params" do
         | 
| 955 | 
            +
                  subject do
         | 
| 956 | 
            +
                    Addressable::Template.new("http://example.com/{?one,two,three}/")
         | 
| 957 | 
            +
                  end
         | 
| 958 | 
            +
                  it "builds a new pattern with two=nil" do
         | 
| 959 | 
            +
                    expect(subject.partial_expand(two: nil).pattern).to eq(
         | 
| 960 | 
            +
                      "http://example.com/{?one}{&three}/"
         | 
| 961 | 
            +
                    )
         | 
| 962 | 
            +
                  end
         | 
| 963 | 
            +
                  it "builds a new pattern with one=nil and two=nil" do
         | 
| 964 | 
            +
                    expect(subject.partial_expand(one: nil, two: nil).pattern).to eq(
         | 
| 965 | 
            +
                      "http://example.com/{?three}/"
         | 
| 966 | 
            +
                    )
         | 
| 967 | 
            +
                  end
         | 
| 968 | 
            +
                  it "builds a new pattern with one=1 and two=nil" do
         | 
| 969 | 
            +
                    expect(subject.partial_expand(one: 1, two: nil).pattern).to eq(
         | 
| 970 | 
            +
                      "http://example.com/?one=1{&three}/"
         | 
| 971 | 
            +
                    )
         | 
| 972 | 
            +
                  end
         | 
| 973 | 
            +
                  it "builds a new pattern with one=nil and two=2" do
         | 
| 974 | 
            +
                    expect(subject.partial_expand(one: nil, two: 2).pattern).to eq(
         | 
| 975 | 
            +
                      "http://example.com/?two=2{&three}/"
         | 
| 976 | 
            +
                    )
         | 
| 977 | 
            +
                  end
         | 
| 978 | 
            +
                  it "builds a new pattern with one=nil" do
         | 
| 979 | 
            +
                    expect(subject.partial_expand(one: nil).pattern).to eq(
         | 
| 980 | 
            +
                      "http://example.com/{?two}{&three}/"
         | 
| 981 | 
            +
                    )
         | 
| 982 | 
            +
                  end
         | 
| 983 | 
            +
                end
         | 
| 952 984 | 
             
                context "partial_expand with query string" do
         | 
| 953 985 | 
             
                  subject {
         | 
| 954 986 | 
             
                    Addressable::Template.new("http://example.com/{?two,one}/")
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # coding: utf-8
         | 
| 2 4 | 
             
            # Copyright (C) Bob Aman
         | 
| 3 5 | 
             
            #
         | 
| @@ -1984,6 +1986,20 @@ describe Addressable::URI, "when parsed from " + | |
| 1984 1986 | 
             
                expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html")
         | 
| 1985 1987 | 
             
              end
         | 
| 1986 1988 |  | 
| 1989 | 
            +
              it "should have the correct request URI after assignment" do
         | 
| 1990 | 
            +
                @uri.request_uri = "/pub/WWW/TheProject.html?"
         | 
| 1991 | 
            +
                expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html?")
         | 
| 1992 | 
            +
                expect(@uri.path).to eq("/pub/WWW/TheProject.html")
         | 
| 1993 | 
            +
                expect(@uri.query).to eq("")
         | 
| 1994 | 
            +
              end
         | 
| 1995 | 
            +
             | 
| 1996 | 
            +
              it "should have the correct request URI after assignment" do
         | 
| 1997 | 
            +
                @uri.request_uri = "/some/where/else.html"
         | 
| 1998 | 
            +
                expect(@uri.request_uri).to eq("/some/where/else.html")
         | 
| 1999 | 
            +
                expect(@uri.path).to eq("/some/where/else.html")
         | 
| 2000 | 
            +
                expect(@uri.query).to eq(nil)
         | 
| 2001 | 
            +
              end
         | 
| 2002 | 
            +
             | 
| 1987 2003 | 
             
              it "should have the correct request URI after assignment" do
         | 
| 1988 2004 | 
             
                @uri.request_uri = "/some/where/else.html?query?string"
         | 
| 1989 2005 | 
             
                expect(@uri.request_uri).to eq("/some/where/else.html?query?string")
         | 
| @@ -5490,6 +5506,31 @@ describe Addressable::URI, "when given the path '/one/two/'" do | |
| 5490 5506 | 
             
              end
         | 
| 5491 5507 | 
             
            end
         | 
| 5492 5508 |  | 
| 5509 | 
            +
            describe Addressable::URI, "when given the tld " do
         | 
| 5510 | 
            +
              it "'uk' should have a tld of 'uk'" do
         | 
| 5511 | 
            +
                uri = Addressable::URI.parse("http://example.com")
         | 
| 5512 | 
            +
                uri.tld = "uk"
         | 
| 5513 | 
            +
             | 
| 5514 | 
            +
                expect(uri.tld).to eq("uk")
         | 
| 5515 | 
            +
              end
         | 
| 5516 | 
            +
             | 
| 5517 | 
            +
              context "which " do
         | 
| 5518 | 
            +
                let (:uri) { Addressable::URI.parse("http://comrade.net/path/to/source/") }
         | 
| 5519 | 
            +
             | 
| 5520 | 
            +
                it "contains a subdomain" do
         | 
| 5521 | 
            +
                  uri.tld = "co.uk"
         | 
| 5522 | 
            +
             | 
| 5523 | 
            +
                  expect(uri.to_s).to eq("http://comrade.co.uk/path/to/source/")
         | 
| 5524 | 
            +
                end
         | 
| 5525 | 
            +
             | 
| 5526 | 
            +
                it "is part of the domain" do
         | 
| 5527 | 
            +
                  uri.tld = "com"
         | 
| 5528 | 
            +
             | 
| 5529 | 
            +
                  expect(uri.to_s).to eq("http://comrade.com/path/to/source/")
         | 
| 5530 | 
            +
                end
         | 
| 5531 | 
            +
              end
         | 
| 5532 | 
            +
            end
         | 
| 5533 | 
            +
             | 
| 5493 5534 | 
             
            describe Addressable::URI, "when given the path " +
         | 
| 5494 5535 | 
             
                "'c:\\windows\\My Documents 100%20\\foo.txt'" do
         | 
| 5495 5536 | 
             
              before do
         | 
| @@ -6227,6 +6268,18 @@ describe Addressable::URI, "when given the input " + | |
| 6227 6268 | 
             
              end
         | 
| 6228 6269 | 
             
            end
         | 
| 6229 6270 |  | 
| 6271 | 
            +
            describe Addressable::URI, "when given the input which "\
         | 
| 6272 | 
            +
              "start with digits and has specified port" do
         | 
| 6273 | 
            +
              before do
         | 
| 6274 | 
            +
                @input = "7777.example.org:8089"
         | 
| 6275 | 
            +
              end
         | 
| 6276 | 
            +
             | 
| 6277 | 
            +
              it "should heuristically parse to 'http://7777.example.org:8089'" do
         | 
| 6278 | 
            +
                uri = Addressable::URI.heuristic_parse(@input)
         | 
| 6279 | 
            +
                expect(uri.to_s).to eq("http://7777.example.org:8089")
         | 
| 6280 | 
            +
              end
         | 
| 6281 | 
            +
            end
         | 
| 6282 | 
            +
             | 
| 6230 6283 | 
             
            describe Addressable::URI, "when given the input " +
         | 
| 6231 6284 | 
             
                "'feed:///example.com'" do
         | 
| 6232 6285 | 
             
              before do
         | 
| @@ -6239,6 +6292,18 @@ describe Addressable::URI, "when given the input " + | |
| 6239 6292 | 
             
              end
         | 
| 6240 6293 | 
             
            end
         | 
| 6241 6294 |  | 
| 6295 | 
            +
            describe Addressable::URI, "when given the input " +
         | 
| 6296 | 
            +
                "'file://localhost/path/to/resource/'" do
         | 
| 6297 | 
            +
              before do
         | 
| 6298 | 
            +
                @input = "file://localhost/path/to/resource/"
         | 
| 6299 | 
            +
              end
         | 
| 6300 | 
            +
             | 
| 6301 | 
            +
              it "should heuristically parse to 'file:///path/to/resource/'" do
         | 
| 6302 | 
            +
                @uri = Addressable::URI.heuristic_parse(@input)
         | 
| 6303 | 
            +
                expect(@uri.to_s).to eq("file:///path/to/resource/")
         | 
| 6304 | 
            +
              end
         | 
| 6305 | 
            +
            end
         | 
| 6306 | 
            +
             | 
| 6242 6307 | 
             
            describe Addressable::URI, "when given the input " +
         | 
| 6243 6308 | 
             
                "'file://path/to/resource/'" do
         | 
| 6244 6309 | 
             
              before do
         | 
| @@ -6251,6 +6316,18 @@ describe Addressable::URI, "when given the input " + | |
| 6251 6316 | 
             
              end
         | 
| 6252 6317 | 
             
            end
         | 
| 6253 6318 |  | 
| 6319 | 
            +
            describe Addressable::URI, "when given the input " +
         | 
| 6320 | 
            +
                "'file://///path/to/resource/'" do
         | 
| 6321 | 
            +
              before do
         | 
| 6322 | 
            +
                @input = "file:///////path/to/resource/"
         | 
| 6323 | 
            +
              end
         | 
| 6324 | 
            +
             | 
| 6325 | 
            +
              it "should heuristically parse to 'file:////path/to/resource/'" do
         | 
| 6326 | 
            +
                @uri = Addressable::URI.heuristic_parse(@input)
         | 
| 6327 | 
            +
                expect(@uri.to_s).to eq("file:////path/to/resource/")
         | 
| 6328 | 
            +
              end
         | 
| 6329 | 
            +
            end
         | 
| 6330 | 
            +
             | 
| 6254 6331 | 
             
            describe Addressable::URI, "when given the input " +
         | 
| 6255 6332 | 
             
                "'feed://http://example.com'" do
         | 
| 6256 6333 | 
             
              before do
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    
    
        data/tasks/clobber.rake
    CHANGED
    
    
    
        data/tasks/gem.rake
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "rubygems/package_task"
         | 
| 2 4 |  | 
| 3 5 | 
             
            namespace :gem do
         | 
| @@ -21,7 +23,7 @@ namespace :gem do | |
| 21 23 | 
             
                s.required_ruby_version = '>= 2.0'
         | 
| 22 24 |  | 
| 23 25 | 
             
                s.add_runtime_dependency 'public_suffix', '>= 2.0.2', '< 4.0'
         | 
| 24 | 
            -
                s.add_development_dependency 'bundler', ' | 
| 26 | 
            +
                s.add_development_dependency 'bundler', '>= 1.0', '< 3.0'
         | 
| 25 27 |  | 
| 26 28 | 
             
                s.require_path = "lib"
         | 
| 27 29 |  | 
    
        data/tasks/git.rake
    CHANGED
    
    
    
        data/tasks/metrics.rake
    CHANGED
    
    
    
        data/tasks/rspec.rake
    CHANGED
    
    
    
        data/tasks/yard.rake
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: addressable
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.6.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Bob Aman
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2019-01-18 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: public_suffix
         | 
| @@ -34,16 +34,22 @@ dependencies: | |
| 34 34 | 
             
              name: bundler
         | 
| 35 35 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 36 36 | 
             
                requirements:
         | 
| 37 | 
            -
                - - " | 
| 37 | 
            +
                - - ">="
         | 
| 38 38 | 
             
                  - !ruby/object:Gem::Version
         | 
| 39 39 | 
             
                    version: '1.0'
         | 
| 40 | 
            +
                - - "<"
         | 
| 41 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 42 | 
            +
                    version: '3.0'
         | 
| 40 43 | 
             
              type: :development
         | 
| 41 44 | 
             
              prerelease: false
         | 
| 42 45 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 43 46 | 
             
                requirements:
         | 
| 44 | 
            -
                - - " | 
| 47 | 
            +
                - - ">="
         | 
| 45 48 | 
             
                  - !ruby/object:Gem::Version
         | 
| 46 49 | 
             
                    version: '1.0'
         | 
| 50 | 
            +
                - - "<"
         | 
| 51 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 52 | 
            +
                    version: '3.0'
         | 
| 47 53 | 
             
            description: |
         | 
| 48 54 | 
             
              Addressable is a replacement for the URI implementation that is part of
         | 
| 49 55 | 
             
              Ruby's standard library. It more closely conforms to the relevant RFCs and
         |