From 12352d79bdb6000841bac1e8f62a1f92960cb428 Mon Sep 17 00:00:00 2001 From: Paul T Date: Sat, 29 Mar 2025 08:12:19 -0400 Subject: [PATCH] chore: typst 0.13 updates (#113) * chore: upgrade linguify * chore: update tests * fix: remove deprecated type checks * chore: improve Justfile docs * chore: compile with typst 0.12 and 0.13 in CI * chore: use tytanic for testing * chore: use tytanic in CI * fix: don't use ubuntu-latest * fix: test runner issues * chore: trying to fix CI issues * fix: remove unused font in tests * fix: update references --- .github/workflows/release.yml | 2 +- .github/workflows/tests.yml | 13 ++++++------- Justfile | 34 +++++++++++++++++++++++----------- lib.typ | 32 +++++++++++++++++++------------- tests/resume/test.typ | 2 +- tests/utilities/ref/1.png | Bin 24361 -> 24880 bytes tests/utilities/test.typ | 6 ++++-- 7 files changed, 54 insertions(+), 35 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2f1ad46..d276524 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ env: jobs: release: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index eb0f818..18166c7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,13 +10,13 @@ jobs: strategy: matrix: # add any other Typst versions that your package should support - typst-version: ["0.12"] + typst-version: ["0.12", "0.13"] # the docs don't need to build with all versions supported by the package; # the latest one is enough include: - - typst-version: "0.12" + - typst-version: "0.13" doc: 1 - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v4 @@ -37,12 +37,10 @@ jobs: with: crate: just - - name: Install typst-test from github + - name: Install tytanic from github uses: baptiste0928/cargo-install@v3 with: - crate: typst-test - git: https://github.com/tingerrr/typst-test.git - tag: ci-semi-stable + crate: tytanic - name: Setup typst uses: typst-community/setup-typst@v3 @@ -55,6 +53,7 @@ jobs: sudo apt-get install fonts-roboto ./scripts/install-fontawesome ./scripts/install-source-sans + typst fonts - name: Install locally run: just install diff --git a/Justfile b/Justfile index 882c22b..5df58d2 100644 --- a/Justfile +++ b/Justfile @@ -7,39 +7,51 @@ default: @just --list --unsorted # generate manual +[doc('Generate package documentation')] +[group('package')] doc: typst compile docs/manual.typ docs/manual.pdf -# run test suite -test *args: - typst-test run {{ args }} +[doc('Run test suite. Requires tytanic.')] +[group('dev')] +test *args: install + tt run {{ args }} --use-system-fonts --no-fail-fast -# update test cases +[doc('Update test cases. Requires tytanic.')] +[group('dev')] update *args: - typst-test update {{ args }} + tt update {{ args }} --use-system-fonts -# package the library into the specified destination folder +[doc('Package the library into the specified destination folder')] +[group('package')] package target: ./scripts/package "{{target}}" -# install the library with the "@local" prefix +[doc('Install the library with the "@local" prefix')] +[group('dev')] install: (package "@local") -# install the library with the "@preview" prefix (for pre-release testing) +[doc('Install the library with the "@preview" prefix (for pre-release testing)')] +[group('dev')] install-preview: (package "@preview") [private] remove target: ./scripts/uninstall "{{target}}" -# uninstalls the library from the "@local" prefix +[doc('Uninstall the library from the "@local" prefix')] +[group('dev')] uninstall: (remove "@local") -# uninstalls the library from the "@preview" prefix (for pre-release testing) +[doc('Uninstall the library from the "@preview" prefix (for pre-release testing)')] +[group('dev')] uninstall-preview: (remove "@preview") +[doc('Format the source code. Requires typstyle.')] +[group('dev')] format: ./scripts/format -# run ci suite +[doc('Run ci suite')] +[group('dev')] ci: test doc diff --git a/lib.typ b/lib.typ index 59a7214..2f938dc 100644 --- a/lib.typ +++ b/lib.typ @@ -1,5 +1,5 @@ #import "@preview/fontawesome:0.5.0": * -#import "@preview/linguify:0.4.1": * +#import "@preview/linguify:0.4.2": * // const color #let color-darknight = rgb("#131A28") @@ -230,7 +230,7 @@ } let lang_data = toml("lang.toml") - + show: body => context { set document( author: author.firstname + " " + author.lastname, @@ -238,7 +238,7 @@ ) body } - + set text( font: font, lang: language, @@ -464,9 +464,8 @@ address contacts } - + body - } /// The base item for resume entries. @@ -618,15 +617,19 @@ if closing == none { closing = default-closing(lang_data) } - + show: body => context { set document( author: author.firstname + " " + author.lastname, - title: lflib._linguify("cover-letter", lang: language, from: lang_data).ok, + title: lflib._linguify( + "cover-letter", + lang: language, + from: lang_data, + ).ok, ) body } - + set text( font: font, lang: language, @@ -731,9 +734,9 @@ let contacts = { set box(height: 9pt) - let separator = [ #box(sym.bar.v) ] + let separator = [ #box(sym.bar.v) ] let author_list = () - + if ("phone" in author) { author_list.push[ #phone-icon @@ -772,8 +775,8 @@ #box[#link(author.website)[#author.website]] ] } - - + + align(right)[ #set text( size: 8pt, @@ -862,7 +865,10 @@ // TODO: Make this adaptable to content underline(evade: false, stroke: 0.5pt, offset: 0.3em)[ - #text(weight: "bold", size: 12pt)[#linguify("letter-position-pretext", from: lang_data) #job-position] + #text(weight: "bold", size: 12pt)[#linguify( + "letter-position-pretext", + from: lang_data, + ) #job-position] ] pad(top: 1em, bottom: 1em)[ #text(weight: "light", fill: color-gray)[ diff --git a/tests/resume/test.typ b/tests/resume/test.typ index c2d9d55..a7659fe 100644 --- a/tests/resume/test.typ +++ b/tests/resume/test.typ @@ -1,7 +1,7 @@ #import "@local/modern-cv:0.8.0": * // setup the document like we do for the resume -#let font = ("Source Sans Pro", "Source Sans 3") +#let font = ("Source Sans 3") #set text( font: font, size: 11pt, diff --git a/tests/utilities/ref/1.png b/tests/utilities/ref/1.png index 13ab13324768066001e35758923bd79eac52a398..26160aa51cd44bad582d3dfadcd6bf689f52b25f 100644 GIT binary patch delta 5694 zcmaJ_1zc3yx}O2*4(Sk(PEm3wL0X3HE(u8yQHf1=58aKFq|&XVga`u&NaxTnpoF~9 zd+vGXynF83zr9y{>&yM$>s!D5m34q?dcg54Xcp(Stg4a#vbanj7X5oZkUt#NfL;GM z)t>1cUt}WnlMUXF6GKY4d-4eik7&|O8y-ap;B(f0sH=2x&d{ICD2ckq#UT(_knttU zMX$B4l#z}qY0lk)B65+aQ)F{_*Dc2ma(KBf22%0`{l5GsvHmsq8v*!5Q}SK%pLObE z#ulJalV!Qe$LjODve9-nfCTar{#xJNa65F}dVX;hOQ}D^C0HNJR=h9mxnbqJ0P{My zY~C)q>Fuu>_`b@HSEa|j8DNencdq*J9U>WvXr1j~h)2TwLI-|@%*@DKwm0l4Bz2iD zuZ^1rI7q^rg#fCURj6C$$dh4+X~W~Ygi+C#r$6vE(?>TKju|i()Gs=mI=hfz9>?}I z#Z}rzDj%CG+X~8$&m>)#qib23f3)MWGI*d|^iK~Mahashz8e*x?$Q39wTLp=#CFsH zGwc{IlJfFx&gQywhj4$qONY7 z{k*KKoCG!Qu~cAOp?HTNlRTm!;@RqPGGgltcQj?DTA2h|1%G*Y%QZr6Z!57rB06@b z%_q>F51@z&!AU$n{fs2j5=>)Bx@lzJTh1l7yPerIXGjmx^aoadA#fPFse@})A8|3Q zoK(+n4IM$>sprJO*0(t�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