Skip to content

Commit a2baa96

Browse files
committed
merge
2 parents d90fa30 + 334b6e7 commit a2baa96

File tree

80 files changed

+5591
-4393
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+5591
-4393
lines changed

.air.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ indent-style = "space"
55
line-ending = "auto"
66
persistent-line-breaks = true
77
exclude = []
8-
default-exclude = true
8+
default-exclude = true

.ruff.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
extend-exclude = [
2+
"**/renv",
3+
"**/.venv",
4+
".github",
5+
".vscode",
6+
"**/node_modules",
7+
"**/__pycache__",
8+
"**/build",
9+
# file with cell magic not parsed by ruff
10+
"src/resources/jupyter/lang/python/cleanup.py",
11+
"src/resources/jupyter/lang/python/setup.py",
12+
]
13+
# don't format .ipynb files as quarto cell comment
14+
include = ["**/*.py"]

.vscode/extensions.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
"esbenp.prettier-vscode",
55
"sumneko.lua",
66
"nvarner.typst-lsp",
7-
"Posit.air-vscode"
7+
"Posit.air-vscode",
8+
"charliermarsh.ruff",
9+
"tamasfe.even-better-toml"
810
]
911
}

.vscode/settings.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22
"[typescript]": {
33
"editor.defaultFormatter": "denoland.vscode-deno"
44
},
5+
"notebook.formatOnSave.enabled": false,
6+
"notebook.codeActionsOnSave": {
7+
"notebook.source.organizeImports": "explicit"
8+
},
9+
"pylint.enabled": false,
10+
"[python]": {
11+
"editor.formatOnSave": true,
12+
"editor.defaultFormatter": "charliermarsh.ruff",
13+
"editor.codeActionsOnSave": {
14+
"source.organizeImports": "explicit"
15+
}
16+
},
517
"[r]": {
618
"editor.formatOnSave": true,
719
"editor.defaultFormatter": "Posit.air-vscode"
@@ -13,6 +25,10 @@
1325
"[html]": {
1426
"editor.formatOnSave": false
1527
},
28+
"[toml]": {
29+
"editor.formatOnSave": true,
30+
"editor.defaultFormatter": "tamasfe.even-better-toml"
31+
},
1632
"editor.defaultFormatter": "esbenp.prettier-vscode",
1733
"editor.formatOnSave": true,
1834
"editor.tabSize": 2,

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ authors:
2020
given-names: "Gordon"
2121
orcid: "https://orcid.org/0009-0005-1809-8936"
2222
title: "Quarto"
23-
version: 1.6
23+
version: 1.7
2424
doi: 10.5281/zenodo.5960048
25-
date-released: 2024-11-27
25+
date-released: 2025-04-28
2626
url: "https://github.com/quarto-dev/quarto-cli"

configuration

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ export DENO=v2.2.10
1515
# TODO figure out where 0.1.41 apple silicon libs are available
1616
export DENO_DOM=v0.1.41-alpha-artifacts
1717
export PANDOC=3.6.3
18-
export DARTSASS=1.85.1
19-
export ESBUILD=0.19.12
18+
export DARTSASS=1.87.0
19+
export ESBUILD=0.25.3
2020
export TYPST=0.13.0
2121

2222

@@ -61,7 +61,7 @@ export ALGOLIA_SEARCH_INSIGHTS_JS=2.0.3
6161

6262

6363
# Quarto Info Version
64-
export QUARTO_VERSION=1.7
64+
export QUARTO_VERSION=1.8
6565
export QUARTO_NAME=Quarto
6666

6767
# Folder names. These are not the same as paths (those variable names end in _PATH).

dev-docs/checklist-make-a-new-quarto-release.md

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
- [ ] create a branch `v1.x`, where x is the version being released
33
- `git checkout -b v1.4`
44
- `git push origin v1.4`
5-
- [ ] mark the current release as the stable release in the `main` branch
5+
- [ ] mark the current release as the new release in the `main` branch
66
- [ ] edit QUARTO_VERSION line in `/configuration` to be the new version (e.g. `1.5`)
77
- [ ] push the changes to the `main` branch
88
- [ ] kick off a v1.5 build in GHA: https://github.com/quarto-dev/quarto-cli/actions/workflows/create-release.yml
99
- [ ] ensure the build completes successfully
1010
- [ ] mark v1.4 release as stable
11-
- go to https://github.com/quarto-dev/quarto-cli/releases
12-
- find the latest v1.4 release and edit, (eg https://github.com/quarto-dev/quarto-cli/releases/edit/v1.4.549)
13-
- at the bottom of the page, there will be two checkboxes, "Set as pre-release" and "Set as latest release":
14-
- "Set as pre-release" should be unchecked, and
15-
- "Set as latest release" should be checked.
11+
- [ ] go to https://github.com/quarto-dev/quarto-cli/releases
12+
- [ ] find the latest v1.4 release and edit, (eg https://github.com/quarto-dev/quarto-cli/releases/edit/v1.4.549)
13+
- [ ] at the bottom of the page, there will be two checkboxes, "Set as pre-release" and "Set as latest release":
14+
- [ ] "Set as pre-release" should be unchecked, and
15+
- [ ] "Set as latest release" should be checked.
1616
- [ ] once the v1.5 build completes, edit the quarto.org website configuration on https://github.com/quarto-dev/quarto-web to reflect the new version
1717
- this means flipping the profile group configuration in `_quarto.yml` from `[rc,prelease]` to `[prerelease,rc]`
1818
- [ ] push the changes to the `main` branch
@@ -30,33 +30,33 @@
3030
- [ ] create `docs/prerelease/1.5/{_highlights, index, _pre-release-feature}.qmd` files based on the ones from the previous release
3131
- [ ] change `docs/prerelease/_highlights.qmd` so its include points to the new version-specific `_highlights.qmd` file (here, 1.5)
3232
- [ ] change `docs/prerelease/_highlights-release.qmd` so its include points to the new version-specific `_highlights.qmd` file (here, 1.4)
33-
- [ ] add the stable version to the older downloads list, like [this example](https://github.com/quarto-dev/quarto-web/commit/85ef62ec5036026d62d57f9cfb190d8b923b2d43)
34-
- [ ] run `quarto run tools/release-notes.R` to generate the release notes
33+
- [ ] add the stable version to the older downloads list by editing /docs/download/\_download-older.yml
34+
- [ ] run `quarto run tools/release-notes.R` to generate the release notes
3535
- [ ] push the changes to `prerelease` branch, ensure they build correctly
36-
- [ ] Merge the `prerelease` branch into `main`
36+
- [ ] Merge the `prerelease` branch into `main`, push to `main`
3737
- [ ] ensure the build completes successfully
38-
- [ ] Merge `main` into `prerelease`
38+
- [ ] Merge `main` into `prerelease`, push to `prerelease`
3939
- [ ] ensure the build completes successfully
40-
- [ ] Create new tag on `main` (here, `v1.5`)
41-
- [ ] `git tag -a v1.5 -m "v1.5"`
42-
- [ ] `git push origin v1.5`
40+
- [ ] Create new tag on `main` with stable release version number (here, `v1.4`) to mark when the new main site version went live
41+
- [ ] `git tag -a v1.4 -m "v1.4"`
42+
- [ ] `git push origin v1.4`
4343
- [ ] Update `prerelease` version number (here, `v1.5`)
4444
- [ ] edit `_quarto-prerelease-docs.yml` to point to the new version
4545
- [ ] publish the release blog post that should exist in https://github.com/quarto-dev/quarto-web/tree/main/docs/blog/posts
46-
by removing the `draft: true` line in the metadata and changing the date to match the release date. Do this on a branch off of `main` to trigger our PR automation to make the corresponding change to `prerelease`.
46+
- [ ] Create a branch off of `main` (to trigger our PR automation to make the corresponding change to `prerelease`).
47+
- [ ] Removing the `draft: true` line in the metadata
48+
- [ ] Change the date to match the release date.
4749

4850
- [ ] Update https://github.com/quarto-dev/quarto-cli/blob/main/CITATION.cff
4951
- [ ] Packaging and package managers, etc
50-
- TBD winget, etc?
51-
- [ ] chocolatey
52-
- https://github.com/quarto-dev/quarto-release-bundles/
53-
- Go to "Select 'Publish Quarto PyPi'"
54-
- [ ] Click "Run Workflow"
52+
- [ ] chocolatey (Only once quarto.org download page is updated with the new release)
53+
- https://github.com/quarto-dev/quarto-release-bundles/actions/workflows/build-and-publish-choco.yaml
54+
- [ ] In "Build Choco package & Publish" workflow page, click "Run Workflow"
5555
- Check the "Whether to publish or not the package on chocolatey" checkbox
5656
- Wait for @cderv to receive email confirmation, no action needed
5757
- [ ] pypi
58-
- Goto the [quarto-cli-pypi repo](https://github.com/quarto-dev/quarto-cli-pypi)
59-
- Update `version.txt` to be the version you'd like to publish and commit
58+
- Go to the [quarto-cli-pypi repo](https://github.com/quarto-dev/quarto-cli-pypi)
59+
- [ ] Update `version.txt` to be the version you'd like to publish and commit
6060
- Go to actions
6161
- Select 'Publish Quarto PyPi'
6262
- [ ] Click "Run Workflow"
@@ -70,3 +70,11 @@
7070
- **Publishing Production**: You may elect to publish to production pypyi by checking the `Production Release` option
7171
- Published to: <https://pypi.org/project/quarto-cli/>
7272
- Take a sip of tea ☕, bask in the glory of automation.
73+
- Others installers
74+
- conda-forge: An automated PR will be created to update the package version in the feedstock <github.com/conda-forge/quarto-feedstock>
75+
- This is community maintained, so no action is needed from us - except maybe helping if there are issues with the PR. We are assigned as reviewers to the PR.
76+
- Winget: An automated PR will be created by a winget bot in <github.com/microsoft/winget-pkgs/>.
77+
- This is community maintained, so no action is needed from us.
78+
- Scoop: This will be updated automatically in the manifests repo. No action is needed from us. Maintained as personal project by @cderv.
79+
- Homebrew: This is automated through an homebrew bot to update the cask <https://github.com/Homebrew/homebrew-cask>
80+
- Manisfest: <https://github.com/Homebrew/homebrew-cask/blob/master/Casks/q/quarto.rb>

dev-docs/checklist-make-a-new-stable-quarto-release.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
- Uncheck "Pre-release" (or ensure it's unchecked)
99
- Check "Publish release" (or ensure it's checked)
1010
- [ ] Click "Run Workflow"
11+
- Take a sip of tea ☕, bask in the glory of automation.
12+
- [ ] Trigger update for quarto.org website once new stable release is available
13+
- Go to quarto-dev/quarto-web repo in [Update Downloads](https://github.com/quarto-dev/quarto-web/actions/workflows/update-downloads.yml) workflow
14+
- Run the workflow with 'Run Workflow' button on `main` branch.
15+
This will check the new release, and update the files in quarto-web to update the Download page.
16+
- While this automation is running, update the release on pypi below.
1117
- [ ] update release on pypi repo
1218
- Goto the [quarto-cli-pypi repo](https://github.com/quarto-dev/quarto-cli-pypi)
1319
- Update `version.txt` to be the version you'd like to publish and commit
@@ -24,4 +30,17 @@
2430
- **Publishing Production**: You may elect to publish to production pypyi by checking the `Production Release` option
2531
- Published to: <https://pypi.org/project/quarto-cli/>
2632
- Take a sip of tea ☕, bask in the glory of automation.
33+
- [ ] push release to chocolatey (Only once quarto.org download page is updated with the new release)
34+
- Got to <https://github.com/quarto-dev/quarto-release-bundles/actions/workflows/build-and-publish-choco.yaml>
35+
- In the "Build Choco package & Publish" workflow, click "Run Workflow" and be sure to check the "Whether to publish or not the package on chocolatey" checkbox
36+
- Wait for @cderv to receive email confirmation, no action needed.
2737
- [ ] Update the stable changelog by moving entries to the "in previous release". Use "[release checklist]" in the commit message to make it easier to spot if a new release is needed next month.
38+
39+
- Others installers
40+
- conda-forge: An automated PR will be created to update the package version in the feedstock <github.com/conda-forge/quarto-feedstock>
41+
- This is community maintained, so no action is needed from us - except maybe helping if there are issues with the PR. We are assigned as reviewers to the PR.
42+
- Winget: An automated PR will be created by a winget bot in <github.com/microsoft/winget-pkgs/>.
43+
- This is community maintained, so no action is needed from us.
44+
- Scoop: This will be updated automatically in the manifests repo. No action is needed from us. Maintained as personal project by @cderv.
45+
- Homebrew: This is automated through an homebrew bot to update the cask <https://github.com/Homebrew/homebrew-cask>
46+
- Manisfest: <https://github.com/Homebrew/homebrew-cask/blob/master/Casks/q/quarto.rb>

dev-docs/feature-format-matrix/create_table.py

Lines changed: 53 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import json
33
import pathlib
44

5-
class Trie:
65

6+
class Trie:
77
def __init__(self):
88
self.children = {}
99
self.values = []
@@ -37,13 +37,12 @@ def tabulator(self):
3737
children = v.tabulator()
3838
feature = k
3939
if v.entry != "":
40-
link = "<a href='%s' target='_blank'><i class='fa-solid fa-link' aria-label='link'></i></a>" % v.entry
40+
link = (
41+
"<a href='%s' target='_blank'><i class='fa-solid fa-link' aria-label='link'></i></a>"
42+
% v.entry
43+
)
4144
feature = "%s %s" % (link, k)
42-
d = {
43-
"sort_key": k,
44-
"feature": feature,
45-
**v.tabulator_leaf()
46-
}
45+
d = {"sort_key": k, "feature": feature, **v.tabulator_leaf()}
4746
if children:
4847
d["_children"] = children
4948
result.append(d)
@@ -60,13 +59,14 @@ def size(self):
6059
return 1
6160
return sum([v.size() for v in self.children.values()])
6261

63-
def walk(self, visitor, path = None):
62+
def walk(self, visitor, path=None):
6463
if path is None:
6564
path = []
6665
visitor(self, path)
6766
for k, v in self.children.items():
6867
v.walk(visitor, path + [k])
6968

69+
7070
def extract_metadata_from_file(file):
7171
with open(file, "r") as f:
7272
lines = f.readlines()
@@ -78,10 +78,13 @@ def extract_metadata_from_file(file):
7878
start = i
7979
else:
8080
end = i
81-
metadata = yaml.load("".join(lines[start+1:end]), Loader=yaml.SafeLoader)
81+
metadata = yaml.load(
82+
"".join(lines[start + 1 : end]), Loader=yaml.SafeLoader
83+
)
8284
return metadata
8385
raise ValueError("No metadata found in file %s" % file)
8486

87+
8588
def table_cell(entry, _feature, _format_name, format_config):
8689
if type(format_config) == str:
8790
format_config = {}
@@ -90,8 +93,22 @@ def table_cell(entry, _feature, _format_name, format_config):
9093
if quality is not None:
9194
if type(quality) == str:
9295
quality = quality.lower()
93-
qualities = {-1: "&#x1F6AB;", 0: "&#x26A0;", 1: "&#x2713;", 2: "&#x2713;&#x2713;", "unknown": "&#x2753;", "na": "NA"}
94-
colors = {-1: "bad", 0: "ok", 1: "good", 2: "good", "unknown": "unknown", "na": "na"}
96+
qualities = {
97+
-1: "&#x1F6AB;",
98+
0: "&#x26A0;",
99+
1: "&#x2713;",
100+
2: "&#x2713;&#x2713;",
101+
"unknown": "&#x2753;",
102+
"na": "NA",
103+
}
104+
colors = {
105+
-1: "bad",
106+
0: "ok",
107+
1: "good",
108+
2: "good",
109+
"unknown": "unknown",
110+
"na": "na",
111+
}
95112
color = colors[quality]
96113
quality_icon = qualities.get(quality, "&#x2753;")
97114
result.append(f"<span class='{color}'>{quality_icon}</span>")
@@ -101,7 +118,8 @@ def table_cell(entry, _feature, _format_name, format_config):
101118
result.append(f"<span title='{comment}'>&#x1F4AC;</span>")
102119
return "".join(result)
103120

104-
def compute_trie(detailed = False):
121+
122+
def compute_trie(detailed=False):
105123
trie = Trie()
106124
pattern = "qmd-files/**/*.qmd" if detailed else "qmd-files/**/document.qmd"
107125
for entry in pathlib.Path(".").glob(pattern):
@@ -115,26 +133,37 @@ def compute_trie(detailed = False):
115133
except KeyError:
116134
raise Exception("No format found in %s" % entry)
117135
for format_name, format_config in format.items():
118-
trie.insert(feature, {
119-
"feature": "/".join(feature),
120-
"format": format_name,
121-
"entry": entry,
122-
"format_config": format_config,
123-
"table_cell": table_cell(entry, feature, format_name, format_config)
124-
})
136+
trie.insert(
137+
feature,
138+
{
139+
"feature": "/".join(feature),
140+
"format": format_name,
141+
"entry": entry,
142+
"format_config": format_config,
143+
"table_cell": table_cell(
144+
entry, feature, format_name, format_config
145+
),
146+
},
147+
)
125148
return trie
126149

127-
def render_features_formats_data(trie = None):
150+
151+
def render_features_formats_data(trie=None):
128152
if trie is None:
129153
trie = compute_trie()
130154
entries = trie.tabulator()
131-
return "```{=html}\n<script type='text/javascript'>\nvar tableData = %s;\n</script>\n```\n" % json.dumps(entries, indent=2)
155+
return (
156+
"```{=html}\n<script type='text/javascript'>\nvar tableData = %s;\n</script>\n```\n"
157+
% json.dumps(entries, indent=2)
158+
)
159+
132160

133-
def compute_quality_summary(trie = None):
161+
def compute_quality_summary(trie=None):
134162
if trie is None:
135163
trie = compute_trie()
136164
quality_summary = {"unknown": 0, -1: 0, 0: 0, 1: 0, 2: 0, "na": 0}
137165
n_rows = 0
166+
138167
def visit(node, _path):
139168
nonlocal n_rows
140169
if not node.children or len(node.values):
@@ -149,5 +178,6 @@ def visit(node, _path):
149178
if quality_summary.get(quality) is None:
150179
raise ValueError("Invalid quality value %s" % quality)
151180
quality_summary[quality] += 1
181+
152182
trie.walk(visit)
153-
return {"n_rows": n_rows, "quality": quality_summary}
183+
return {"n_rows": n_rows, "quality": quality_summary}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
title: Callout with minimal appearance
3+
format:
4+
html:
5+
quality: 1
6+
---
7+
8+
::: {.callout-note appearance="minimal"}
9+
10+
## Title
11+
12+
{{< lipsum 1 >}}
13+
14+
:::

0 commit comments

Comments
 (0)