O URI do Ruby tira barras quando não há host

Alguns esquemas de URI (a parte do protocolo de um endereço) não requerem um nome de host ou parte da rede. Por exemplo

file:///home/rmg/scratchpad

De acordo com o RFC, você pode ignorar o //caso não haja host.

file:/home/rmg/scratchpad

Infelizmente, nem todo mundo sabe disso e, portanto, nem todo software lida com isso!

O URI()método de nome constante na biblioteca URI do Ruby gosta de retirar o //para você. Quão útil!

Como descobri, o Subversion é um daqueles softwares que não lidam com isso.

Dei uma olhada no código-fonte e encontrei uma maneira de falsificar as coisas sem recorrer ao monkey patching URIe sem reescrever grandes porções da funcionalidade.

uri = URI('file:///foo/bar/baz')
uri
.to_s #=> 'file:/foo/bar/baz'
uri
.send(:set_host, '')
uri
.to_s #=> 'file:///foo/bar/baz'

Ele requer o uso #sendpara chamar um método protegido, no entanto. Funciona por enquanto, porém, e fui capaz de resumir em um único método bem testado que faz o que preciso para que eu possa pelo menos refatorá-lo mais tarde, caso se torne um problema com versões mais recentes.

require 'uri'
require
'pathname'

def clean_url(*parts)
uri
= URI(parts.join('/'))
uri
.path = Pathname(uri.path).cleanpath.to_s
uri
.send(:set_host, '') unless uri.host
uri
.to_s
end