Skip to content

Commit 6d022ec

Browse files
committed
feat: migrated to Nushell's own url functionality
1 parent 5293526 commit 6d022ec

File tree

4 files changed

+109
-117
lines changed

4 files changed

+109
-117
lines changed

nut/package.nu

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
# Resolve package information to a canonical form.
3+
export def resolve [
4+
type: string, version: string
5+
]: string -> record<scheme:string, host:string, path:string, fragment:string, type:string, version:string,> {
6+
let url = $in | url parse | validate
7+
8+
$url
9+
| select scheme host path fragment
10+
| update host { |it| $it.host | str downcase }
11+
| update path { |it| $it.path | str replace --regex '\.git$' '' }
12+
| insert type $type
13+
| insert version $version
14+
}
15+
16+
def validate []: record -> record {
17+
let url = $in
18+
if ($url.scheme not-in ["https", "file"]) {
19+
error make { msg: $"Unsupported scheme: ($url.scheme)" }
20+
}
21+
if ($url.path == "/") {
22+
error make { msg: $"Empty path is unsupported" }
23+
}
24+
if ($url.username != "" or $url.password != "") {
25+
error make { msg: $"Credentials are unsupported" }
26+
}
27+
if ($url.port != "") {
28+
error make { msg: $"Port is unsupported" }
29+
}
30+
$url
31+
}

nut/package_id.nu

Lines changed: 0 additions & 41 deletions
This file was deleted.

test/package_id_test.nu

Lines changed: 0 additions & 76 deletions
This file was deleted.

test/package_test.nu

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
use ../nut/package.nu
2+
use std assert
3+
4+
# [test]
5+
def "resolve id with normal data" [] {
6+
let result = "https://example.com/path/repo" | package resolve "module" "v0.1.0"
7+
8+
assert equal $result {
9+
scheme: "https"
10+
host: "example.com"
11+
path: "/path/repo"
12+
fragment: ""
13+
type: "module"
14+
version: "v0.1.0"
15+
}
16+
}
17+
18+
# [test]
19+
def "resolve id always results in lower case domain only" [] {
20+
let result = "https://NuCo.com/path/MyRepo" | package resolve "" ""
21+
22+
assert equal ($result | select host path) {
23+
host: "nuco.com"
24+
path: "/path/MyRepo"
25+
}
26+
}
27+
28+
# [test]
29+
def "resolve id removes git postfix" [] {
30+
let result = "https://example.com/path/repo.git" | package resolve "" ""
31+
32+
assert equal ($result | select path) {
33+
path: "/path/repo"
34+
}
35+
}
36+
37+
# [test]
38+
def "resolve validates scheme" [] {
39+
assert equal ("https://example.com/repo" | package resolve "" "" | get scheme) "https"
40+
assert equal ("file://example.com/repo" | package resolve "" "" | get scheme) "file"
41+
assert equal (catch-error { "http://example.com/repo" | package resolve "" "" }) "Unsupported scheme: http"
42+
}
43+
44+
# [test]
45+
def "resolve validates when unsupported urls" [] {
46+
assert equal (catch-error { "https://example.com" | package resolve "" "" }) "Empty path is unsupported"
47+
assert equal (catch-error { "https://user:[email protected]/repo" | package resolve "" "" }) "Credentials are unsupported"
48+
assert equal (catch-error { "https://example.com:123/repo" | package resolve "" "" }) "Port is unsupported"
49+
50+
# todo Might want to validate this
51+
assert equal ("https://invalid_domain/repo" | package resolve "" "" | get host) "invalid_domain"
52+
}
53+
54+
# [test]
55+
def "parse with fragment" [] {
56+
let result = "https://github.com/vyadh/nut#semver" | package resolve "" "" | get fragment
57+
58+
assert equal $result "semver"
59+
}
60+
61+
def catch-error [job: closure]: nothing -> string {
62+
try {
63+
do $job
64+
error make { msg: "no-error" }
65+
} catch { |error|
66+
if ($error.msg == "no-error") {
67+
error make {
68+
msg: "Expected an error"
69+
label: {
70+
text: "from here"
71+
span: (metadata $job).span
72+
}
73+
}
74+
} else {
75+
$error.msg
76+
}
77+
}
78+
}

0 commit comments

Comments
 (0)