Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better url and endpoint handling #663

Merged
merged 1 commit into from
Feb 27, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions src/Paket.Core/PublicAPI.fs
Original file line number Diff line number Diff line change
Expand Up @@ -256,11 +256,10 @@ type Dependencies(dependenciesFileName: string) =
PackageProcess.Pack(dependenciesFile, outputPath, buildConfig, version, releaseNotes)

// Push a nupkg file.
member this.Push(packageFileName, ?url, ?apiKey, ?endPoint, ?maxTrials) =
let endPoint = defaultArg endPoint "/api/v2/package"
member this.Push(packageFileName, ?url, ?apiKey, (?endPoint: string), ?maxTrials) =
let urlWithEndpoint = RemoteUpload.GetUrlWithEndpoint url endPoint
let apiKey = defaultArg apiKey (Environment.GetEnvironmentVariable("nugetkey"))
if String.IsNullOrEmpty apiKey then
failwithf "Could not push package %s. Please specify an NuGet API key via environment variable \"nugetkey\"." packageFileName
let url = defaultArg url "https://nuget.org"
let maxTrials = defaultArg maxTrials 5
RemoteUpload.Push maxTrials (url + endPoint) apiKey packageFileName
RemoteUpload.Push maxTrials urlWithEndpoint apiKey packageFileName
24 changes: 23 additions & 1 deletion src/Paket.Core/RemoteUpload.fs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,29 @@ type System.Net.WebClient with
stream.Write(newlineBytes, 0, newlineBytes.Length)
stream.Write(trailerbytes, 0, trailerbytes.Length)
()


let GetUrlWithEndpoint (url: string option) (endPoint: string option) =
let (|UrlWithEndpoint|_|) url =
match url with
| Some url when not (String.IsNullOrEmpty(Uri(url).AbsolutePath.TrimStart('/'))) -> Some(Uri(url))
| _ -> None

let (|IsUrl|_|) (url: string option) =
match url with
| Some url -> Uri(url.TrimEnd('/') + "/") |> Some
| _ -> None

let defaultEndpoint = "/api/v2/package"
let urlWithEndpoint =
match (url, endPoint) with
| None , _ -> Uri(Uri("https://nuget.org"), defaultEndpoint)
| IsUrl baseUrl , Some customEndpoint -> Uri(baseUrl, customEndpoint.TrimStart('/'))
| UrlWithEndpoint baseUrl, _ -> baseUrl
| IsUrl baseUrl , None -> Uri(baseUrl, defaultEndpoint)
| Some whyIsThisNeeded , _ -> failwith "Url and endpoint combination not supported"
urlWithEndpoint.ToString ()


let Push maxTrials url apiKey packageFileName =
let rec push trial =
tracefn "Pushing package %s to %s - trial %d" packageFileName url trial
Expand Down
1 change: 1 addition & 0 deletions tests/Paket.Tests/Paket.Tests.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
<Compile Include="TemplateFileParsing.fs" />
<Compile Include="NuspecWriterSpecs.fs" />
<Compile Include="PackageProcessSpecs.fs" />
<Compile Include="RemotePushUrlSpecs.fs" />
<Content Include="Nuspec\FSharp.Data.nuspec">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
Expand Down
55 changes: 55 additions & 0 deletions tests/Paket.Tests/RemotePushUrlSpecs.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
module Paket.RemotePushUrlSpecs

open Paket.RemoteUpload
open NUnit.Framework
open System.Xml
open FsUnit

let nugetUrl = "https://nuget.org"
let defaultEndpoint = "/api/v2/package"
let customHost = "http://my.host.com"
let customEndpoint = "/my/feed"
let customHostWithEndpoint = (customHost + customEndpoint)

[<Test>]
let ``default result is nuget host with default endpoint`` () =
GetUrlWithEndpoint None None
|> shouldEqual (nugetUrl + defaultEndpoint)

[<Test>]
let ``no host with custom endpoint yields nuget host with default endpoint`` () =
GetUrlWithEndpoint None (Some customEndpoint)
|> shouldEqual (nugetUrl + defaultEndpoint)

[<Test>]
let ``custom host with no endpoint yields custom host with default endpoint`` () =
GetUrlWithEndpoint (Some customHost) None
|> shouldEqual (customHost + defaultEndpoint)

[<Test>]
let ``custom host with custom endpoint yields custom host with custom endpoint`` () =
GetUrlWithEndpoint (Some customHost) (Some customEndpoint)
|> shouldEqual (customHost + customEndpoint)

[<Test>]
let ``custom host that includes endpoint and no custom enpoint does not append default endpoint`` () =
GetUrlWithEndpoint (Some customHostWithEndpoint) None
|> shouldEqual customHostWithEndpoint

[<Test>]
let ``custom host that includes endpoint and custom endpoint yields host + customendpoint`` () =
GetUrlWithEndpoint (Some customHostWithEndpoint) (Some customEndpoint)
|> shouldEqual (customHostWithEndpoint + customEndpoint)

[<Test>]
let ``can combine host and endpoint with missing leading slash on endpoint`` () =
let noSlashes = "my/feed"
GetUrlWithEndpoint (Some customHost) (Some noSlashes)
|> shouldEqual (customHost + "/" + noSlashes)

[<Test>]
let ``can combine host and endpoint with leading slash on endpoint and trailing slash on host`` () =
let slashyHost = customHost + "/"
GetUrlWithEndpoint (Some slashyHost) (Some customEndpoint)
|> shouldEqual (customHost + customEndpoint)