Skip to content

Commit 48302fa

Browse files
authored
feat: allow client to specify sha256 values and generate an assets declaration (#92)
- Declare the toolchains in a separate repository. - Rename `assets` to `prebuilt_assets`. - Refactor `assets.create()` to be tool agnostic. Closes #87.
1 parent 23403d3 commit 48302fa

File tree

17 files changed

+507
-142
lines changed

17 files changed

+507
-142
lines changed

WORKSPACE

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@ workspace(name = "cgrindel_rules_swiftformat")
22

33
load(
44
"//swiftformat:deps.bzl",
5-
"swiftformat_register_toolchains",
65
"swiftformat_rules_dependencies",
76
)
87

98
swiftformat_rules_dependencies()
109

11-
swiftformat_register_toolchains(version = "0.51.10")
12-
1310
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
1411

1512
bazel_skylib_workspace()

examples/exclude_files/WORKSPACE

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@ local_repository(
77

88
load(
99
"@cgrindel_rules_swiftformat//swiftformat:deps.bzl",
10-
"swiftformat_register_toolchains",
1110
"swiftformat_rules_dependencies",
1211
)
1312

1413
swiftformat_rules_dependencies()
1514

16-
swiftformat_register_toolchains(version = "0.51.10")
17-
1815
load(
1916
"@cgrindel_bazel_starlib//:deps.bzl",
2017
"bazel_starlib_dependencies",
@@ -35,3 +32,10 @@ load(
3532
)
3633

3734
swift_rules_extra_dependencies()
35+
36+
load(
37+
"@cgrindel_rules_swiftformat//swiftformat:defs.bzl",
38+
"swiftformat_register_prebuilt_toolchains",
39+
)
40+
41+
swiftformat_register_prebuilt_toolchains()

examples/rules_swift_helpers/WORKSPACE

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@ local_repository(
77

88
load(
99
"@cgrindel_rules_swiftformat//swiftformat:deps.bzl",
10-
"swiftformat_register_toolchains",
1110
"swiftformat_rules_dependencies",
1211
)
1312

1413
swiftformat_rules_dependencies()
1514

16-
swiftformat_register_toolchains(version = "0.51.10")
17-
1815
load(
1916
"@cgrindel_bazel_starlib//:deps.bzl",
2017
"bazel_starlib_dependencies",
@@ -35,3 +32,10 @@ load(
3532
)
3633

3734
swift_rules_extra_dependencies()
35+
36+
load(
37+
"@cgrindel_rules_swiftformat//swiftformat:defs.bzl",
38+
"swiftformat_register_prebuilt_toolchains",
39+
)
40+
41+
swiftformat_register_prebuilt_toolchains()

examples/simple/WORKSPACE

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ local_repository(
77

88
load(
99
"@cgrindel_rules_swiftformat//swiftformat:deps.bzl",
10-
"swiftformat_register_toolchains",
1110
"swiftformat_rules_dependencies",
1211
)
1312

1413
swiftformat_rules_dependencies()
1514

16-
swiftformat_register_toolchains(version = "0.51.10")
15+
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
16+
17+
bazel_skylib_workspace()
1718

1819
load(
1920
"@cgrindel_bazel_starlib//:deps.bzl",
@@ -35,3 +36,10 @@ load(
3536
)
3637

3738
swift_rules_extra_dependencies()
39+
40+
load(
41+
"@cgrindel_rules_swiftformat//swiftformat:defs.bzl",
42+
"swiftformat_register_prebuilt_toolchains",
43+
)
44+
45+
swiftformat_register_prebuilt_toolchains()

swiftformat/BUILD.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ bzl_library(
1919
"//swiftformat/internal:swiftformat_library",
2020
"//swiftformat/internal:swiftformat_pkg",
2121
"//swiftformat/internal:swiftformat_test",
22+
"//swiftformat/toolchains:toolchain",
2223
],
2324
)
2425

@@ -42,7 +43,6 @@ bzl_library(
4243
name = "deps",
4344
srcs = ["deps.bzl"],
4445
deps = [
45-
"//swiftformat/toolchains:assets",
4646
"@bazel_tools//tools/build_defs/repo:http.bzl",
4747
"@bazel_tools//tools/build_defs/repo:utils.bzl",
4848
],

swiftformat/defs.bzl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ load(
2424
"//swiftformat/internal:swiftformat_test.bzl",
2525
_swiftformat_test = "swiftformat_test",
2626
)
27+
load(
28+
"//swiftformat/toolchains:toolchain.bzl",
29+
_swiftformat_register_prebuilt_toolchains = "swiftformat_register_prebuilt_toolchains",
30+
)
31+
32+
# Toolchain Registration
33+
swiftformat_register_prebuilt_toolchains = _swiftformat_register_prebuilt_toolchains
2734

2835
# Macros
2936
swiftformat_pkg = _swiftformat_pkg

swiftformat/deps.bzl

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,6 @@
22

33
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
44
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
5-
load(
6-
"//swiftformat/toolchains:assets.bzl",
7-
_swiftformat_register_toolchains = "swiftformat_register_toolchains",
8-
)
9-
10-
swiftformat_register_toolchains = _swiftformat_register_toolchains
115

126
def swiftformat_rules_dependencies():
137
"""Loads the dependencies for `rules_swiftformat`."""

swiftformat/toolchains/BUILD.bazel

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
22
load("@cgrindel_bazel_starlib//bzlformat:defs.bzl", "bzlformat_pkg")
3-
load(":toolchain.bzl", "declare_swiftformat_toolchains")
43

54
bzlformat_pkg(name = "bzlformat")
65

@@ -10,20 +9,23 @@ filegroup(
109
visibility = ["//:__subpackages__"],
1110
)
1211

13-
# Toolchain
14-
15-
declare_swiftformat_toolchains()
16-
1712
bzl_library(
18-
name = "assets",
19-
srcs = ["assets.bzl"],
13+
name = "prebuilt_assets",
14+
srcs = ["prebuilt_assets.bzl"],
2015
visibility = ["//visibility:public"],
21-
deps = ["@bazel_tools//tools/build_defs/repo:http.bzl"],
16+
deps = [
17+
"@bazel_skylib//lib:types",
18+
"@bazel_tools//tools/build_defs/repo:http.bzl",
19+
],
2220
)
2321

2422
bzl_library(
2523
name = "toolchain",
2624
srcs = ["toolchain.bzl"],
2725
visibility = ["//visibility:public"],
28-
deps = [":assets"],
26+
deps = [
27+
":prebuilt_assets",
28+
"@bazel_tools//tools/build_defs/repo:http.bzl",
29+
"@bazel_tools//tools/build_defs/repo:utils.bzl",
30+
],
2931
)

swiftformat/toolchains/assets.bzl

Lines changed: 0 additions & 99 deletions
This file was deleted.
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
"""Support downloading prebuilt SwiftFormat binaries."""
2+
3+
load("@bazel_skylib//lib:types.bzl", "types")
4+
5+
# _VALID_TOOLS = ["swiftformat"]
6+
7+
def _create(
8+
os,
9+
cpu,
10+
file,
11+
urls,
12+
executable_label,
13+
repo,
14+
sha256 = None,
15+
swiftformat_toolchain_name = None,
16+
toolchain_name = None):
17+
"""Create an asset.
18+
19+
Args:
20+
os: The operating system name as a `string`.
21+
cpu: The cpu as a `string`.
22+
file: The name of the executable in the archive as a `string`.
23+
urls: A `list` of urls to download the archive file that contains the
24+
executable.
25+
executable_label: The label for the executable as a `string`.
26+
repo: The name of the repository for the downloaded archive as a
27+
`string`.
28+
sha256: Optional. The SHA256 value for the archive as a `string`.
29+
swiftformat_toolchain_name: Optional. The name for the
30+
`swiftformat_toolchain` as a `string`.
31+
toolchain_name: Optional. The name of the `toolchain` as a `string`.
32+
33+
Returns:
34+
A `struct` representing a downloadable asset.
35+
"""
36+
if swiftformat_toolchain_name == None:
37+
swiftformat_toolchain_name = repo
38+
if toolchain_name == None:
39+
toolchain_name = swiftformat_toolchain_name + "_toolchain"
40+
return struct(
41+
os = os,
42+
cpu = cpu,
43+
file = file,
44+
urls = urls,
45+
repo = repo,
46+
swiftformat_toolchain_name = swiftformat_toolchain_name,
47+
toolchain_name = toolchain_name,
48+
executable_label = executable_label,
49+
sha256 = sha256,
50+
)
51+
52+
_SWIFTFORMAT_DOWNLOAD_URL_TEMPLATE = """\
53+
https://github.com/nicklockwood/SwiftFormat/releases/download/{version}/{archive}\
54+
"""
55+
56+
def _create_swiftformat(version, os, cpu, file, sha256 = None):
57+
"""Create an asset declaration for the swiftformat tool.
58+
59+
Args:
60+
version: The version as a `string`.
61+
os: The operating system name as a `string`.
62+
cpu: The cpu as a `string`.
63+
file: The name of the executable in the archive as a `string`.
64+
sha256: Optional. The SHA256 value for the archive file as a `string`.
65+
66+
Returns:
67+
An asset `struct` as returned by `prebuilt_assets.create()`.
68+
"""
69+
repo = "swiftformat_download_{os}_{cpu}".format(
70+
os = os,
71+
cpu = cpu,
72+
)
73+
archive = file + ".zip"
74+
return _create(
75+
os = os,
76+
cpu = cpu,
77+
file = file,
78+
urls = [
79+
_SWIFTFORMAT_DOWNLOAD_URL_TEMPLATE.format(
80+
version = version,
81+
archive = archive,
82+
),
83+
],
84+
executable_label = "@{repo}//:executable".format(repo = repo),
85+
repo = repo,
86+
sha256 = sha256,
87+
)
88+
89+
def _from_json(json_str):
90+
"""Returns an asset `struct` or a `list` of asset `struct` values as \
91+
represented by the JSON `string`.
92+
93+
Args:
94+
json_str: A JSON `string` representing an asset or a list of assets.
95+
96+
Returns:
97+
An asset `struct` or a `list` of asset `struct` values.
98+
"""
99+
result = json.decode(json_str)
100+
if types.is_list(result):
101+
return [_create(**a) for a in result]
102+
elif types.is_dict(result):
103+
return _create(**result)
104+
fail("Unexpected result type decoding JSON string. %s" % (json_str))
105+
106+
prebuilt_assets = struct(
107+
create = _create,
108+
create_swiftformat = _create_swiftformat,
109+
from_json = _from_json,
110+
)

0 commit comments

Comments
 (0)