Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: JRuby 1.1.2
-
Fix Version/s: JRuby 1.2
-
Component/s: Core Classes/Modules
-
Labels:None
-
Environment:Latest JRuby 1.1.2 from trunk on Linux.
Description
New rubyspecs for URI library were recently added. We currently fail just two of them (out of 371).
mspec -t j spec/ruby/1.8/library/uri/ ...........F.............................F....... 1) URI.extract allows the user to specify a list of acceptable protocols of URIs to scan for FAILED Expected [] to equal ["ftp://ftp.is.co.za/rfc/rfc1808.txt", "http://www.math.uio.no/faq/compression-faq/part1.html", "mailto:mduerst@ifi.unizh.ch"] /opt/work/mspec.git/lib/mspec/expectations/expectations.rb:10:in `fail_with' /opt/work/mspec.git/lib/mspec/matchers/base.rb:9:in `==' /opt/work/./spec/ruby/1.8/library/uri/extract_spec.rb:84:in `/opt/work/./spec/ruby/1.8/library/uri/extract_spec.rb' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:121:in `instance_eval' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:121:in `protect' /opt/work/mspec.git/lib/mspec/runner/state.rb:46:in `each' /opt/work/mspec.git/lib/mspec/runner/state.rb:46:in `protect' /opt/work/mspec.git/lib/mspec/runner/state.rb:60:in `process' /opt/work/mspec.git/lib/mspec/runner/state.rb:56:in `each' /opt/work/mspec.git/lib/mspec/runner/state.rb:56:in `process' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:28:in `describe' /opt/work/mspec.git/lib/mspec/runner/object.rb:11:in `describe' /opt/work/./spec/ruby/1.8/library/uri/extract_spec.rb:4:in `/opt/work/./spec/ruby/1.8/library/uri/extract_spec.rb' /opt/work/./spec/ruby/1.8/library/uri/extract_spec.rb:46:in `load' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:46:in `files' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:121:in `instance_eval' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:121:in `protect' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:46:in `files' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:43:in `each' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:43:in `files' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:35:in `process' /opt/work/mspec.git/lib/mspec/commands/mspec-run.rb:76:in `run' /opt/work/mspec.git/lib/mspec/utils/script.rb:75:in `main' /opt/work/mspec.git/bin/mspec-run:8 2) URI.regexp behaves according to the MatzRuby tests FAILED Expected nil to equal "http://" /opt/work/mspec.git/lib/mspec/expectations/expectations.rb:10:in `fail_with' /opt/work/mspec.git/lib/mspec/matchers/base.rb:9:in `==' /opt/work/./spec/ruby/1.8/library/uri/regexp_spec.rb:10:in `/opt/work/./spec/ruby/1.8/library/uri/regexp_spec.rb' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:121:in `instance_eval' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:121:in `protect' /opt/work/mspec.git/lib/mspec/runner/state.rb:46:in `each' /opt/work/mspec.git/lib/mspec/runner/state.rb:46:in `protect' /opt/work/mspec.git/lib/mspec/runner/state.rb:60:in `process' /opt/work/mspec.git/lib/mspec/runner/state.rb:56:in `each' /opt/work/mspec.git/lib/mspec/runner/state.rb:56:in `process' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:28:in `describe' /opt/work/mspec.git/lib/mspec/runner/object.rb:11:in `describe' /opt/work/./spec/ruby/1.8/library/uri/regexp_spec.rb:6:in `/opt/work/./spec/ruby/1.8/library/uri/regexp_spec.rb' /opt/work/./spec/ruby/1.8/library/uri/regexp_spec.rb:46:in `load' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:46:in `files' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:121:in `instance_eval' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:121:in `protect' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:46:in `files' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:43:in `each' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:43:in `files' /opt/work/mspec.git/lib/mspec/runner/mspec.rb:35:in `process' /opt/work/mspec.git/lib/mspec/commands/mspec-run.rb:76:in `run' /opt/work/mspec.git/lib/mspec/utils/script.rb:75:in `main' /opt/work/mspec.git/bin/mspec-run:8 Finished in 0.752000 seconds 12 files, 49 examples, 371 expectations, 2 failures, 0 errors
This is still an issue, but I've narrowed it down to a regexp problem. It's a hell of a regexp though:
regexp = /(?=(?-mix:http):) ([a-zA-Z][-+.a-zA-Z\d]*): (?# 1: scheme) (?: ((?:[-_.!~*'()a-zA-Z\d;?:@&=+$,]|%[a-fA-F\d]{2})(?:[-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]|%[a-fA-F\d]{2})*) (?# 2: opaque) | (?:(?: \/\/(?: (?:(?:((?:[-_.!~*'()a-zA-Z\d;:&=+$,]|%[a-fA-F\d]{2})*)@)? (?# 3: userinfo) (?:((?:(?:(?:[a-zA-Z\d](?:[-a-zA-Z\d]*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:[-a-zA-Z\d]*[a-zA-Z\d])?)\.?|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\[(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?:(?:[a-fA-F\d]{1,4}:)*[a-fA-F\d]{1,4})?::(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))?)\]))(?::(\d*))?))?(?# 4: host, 5: port) | ((?:[-_.!~*'()a-zA-Z\d$,;+@&=+]|%[a-fA-F\d]{2})+) (?# 6: registry) ) | (?!\/\/)) (?# XXX: '\/\/' is the mark for hostport) (\/(?:[-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*(?:;(?:[-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*)*(?:\/(?:[-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*(?:;(?:[-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*)*)*)? (?# 7: path) )(?:\?((?:[-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]|%[a-fA-F\d]{2})*))? (?# 8: query) ) (?:\#((?:[-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]|%[a-fA-F\d]{2})*))? (?# 9: fragment) /xn str = "http://www.cnn.com" p str.scan(regexp)This should output [["http", nil, nil, "www.cnn.com", nil, nil, nil, nil, nil]] as on MRI, but instead it outputs [].
It's possible that the regular expressions used in uri/common.rb have been updated in 1.9 for Oniguruma...we may need to pull those regexp instead if this is a simple regexp compat issue.
regexp = /(?=(?-mix:http):) ([a-zA-Z][-+.a-zA-Z\d]*): (?# 1: scheme) (?: ((?:[-_.!~*'()a-zA-Z\d;?:@&=+$,]|%[a-fA-F\d]{2})(?:[-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]|%[a-fA-F\d]{2})*) (?# 2: opaque) | (?:(?: \/\/(?: (?:(?:((?:[-_.!~*'()a-zA-Z\d;:&=+$,]|%[a-fA-F\d]{2})*)@)? (?# 3: userinfo) (?:((?:(?:(?:[a-zA-Z\d](?:[-a-zA-Z\d]*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:[-a-zA-Z\d]*[a-zA-Z\d])?)\.?|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\[(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?:(?:[a-fA-F\d]{1,4}:)*[a-fA-F\d]{1,4})?::(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))?)\]))(?::(\d*))?))?(?# 4: host, 5: port) | ((?:[-_.!~*'()a-zA-Z\d$,;+@&=+]|%[a-fA-F\d]{2})+) (?# 6: registry) ) | (?!\/\/)) (?# XXX: '\/\/' is the mark for hostport) (\/(?:[-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*(?:;(?:[-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*)*(?:\/(?:[-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*(?:;(?:[-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*)*)*)? (?# 7: path) )(?:\?((?:[-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]|%[a-fA-F\d]{2})*))? (?# 8: query) ) (?:\#((?:[-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]|%[a-fA-F\d]{2})*))? (?# 9: fragment) /xn str = "http://www.cnn.com" p str.scan(regexp)