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 URI
e 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 #send
para 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