diff --git a/.github/workflows/publish_crates.yml b/.github/workflows/publish_crates.yml index 87450d5..2a2aa7f 100644 --- a/.github/workflows/publish_crates.yml +++ b/.github/workflows/publish_crates.yml @@ -1,6 +1,6 @@ name: Publish_rs -on: [workflow_dispatch] +on: [ workflow_dispatch ] permissions: contents: read @@ -10,24 +10,25 @@ jobs: name: Publish (crates.io) runs-on: ubuntu-latest timeout-minutes: 25 + env: + CARGO_HOME: ${{ github.workspace }}/.cargo steps: - uses: actions/checkout@v6 - name: Restore cache uses: actions/cache/restore@v4 with: - path: | - ~/.cargo + path: ${{ env.CARGO_HOME }} key: cache-ubuntu-cargo-publish - name: Install Rust run: |- - export PATH="${CARGO_HOME:-$HOME/.cargo}/bin:$PATH" + export PATH="$CARGO_HOME/bin:$PATH" if ! command -v rustc >/dev/null 2>&1; then curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y else rustup update fi - echo "${CARGO_HOME:-$HOME/.cargo}/bin" >> "$GITHUB_PATH" + echo "$CARGO_HOME/bin" >> "$GITHUB_PATH" cargo install cargo-release shell: bash @@ -47,8 +48,9 @@ jobs: # which is reasonable, since this job only runs after the Linux, Windows, and WASM builds # have passed. - name: "cargo release publish" + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_API_TOKEN }} run: |- - cargo login ${{ secrets.CRATES_IO_API_TOKEN }} cargo release \ publish \ --workspace \ @@ -61,6 +63,5 @@ jobs: - name: Store cache uses: actions/cache/save@v4 with: - path: | - ~/.cargo + path: ${{ env.CARGO_HOME }} key: cache-ubuntu-cargo-publish diff --git a/.github/workflows/publish_pypi.yml b/.github/workflows/publish_pypi.yml index 0ccafd6..52a71cf 100644 --- a/.github/workflows/publish_pypi.yml +++ b/.github/workflows/publish_pypi.yml @@ -1,6 +1,6 @@ name: Publish_py -on: [workflow_dispatch] +on: [ workflow_dispatch ] permissions: contents: read @@ -9,6 +9,8 @@ jobs: pypi_publish: name: Publish (pypi.org) runs-on: ubuntu-latest + env: + CARGO_HOME: ${{ github.workspace }}/.cargo steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v5 @@ -23,7 +25,7 @@ jobs: ~/.cache/pip-wheel ~/.cache/sccache ~/.cache/cargo-xwin - ~/.cargo + ${{ env.CARGO_HOME }} ~/.osxcross key: cache-ubuntu-maturin-cross-compile @@ -37,17 +39,18 @@ jobs: - name: Install Rust run: | - export PATH="$HOME/.cargo/bin:$PATH" + export PATH="$CARGO_HOME/bin:$PATH" if ! command -v rustc >/dev/null 2>&1; then curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y else rustup update fi + echo "$CARGO_HOME/bin" >> "$GITHUB_PATH" + cargo --version shell: bash - name: Install sccache and maturin run: | - export PATH="$HOME/.cargo/bin:$PATH" python -m pip install --upgrade pip pip install maturin ziglang if ! command -v sccache >/dev/null 2>&1; then @@ -57,7 +60,6 @@ jobs: - name: Install xwin run: | - export PATH="$HOME/.cargo/bin:$PATH" if ! command -v cargo-xwin >/dev/null 2>&1; then cargo install cargo-xwin || pip install cargo-xwin cargo xwin cache xwin @@ -75,7 +77,7 @@ jobs: - name: Build wheels run: | - export PATH="$HOME/.cargo/bin:$HOME/.osxcross/bin:$PATH" + export PATH="$HOME/.osxcross/bin:$PATH" rustup default stable rm -rf dist maturin sdist --out dist -m ome-metadata/Cargo.toml @@ -107,7 +109,7 @@ jobs: ~/.cache/pip-wheel ~/.cache/sccache ~/.cache/cargo-xwin - ~/.cargo + ${{ env.CARGO_HOME }} ~/.osxcross key: cache-ubuntu-maturin-cross-compile diff --git a/.gitignore b/.gitignore index 843f2e3..944793a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target +/.cargo/ # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/ome-metadata-derive/Cargo.toml b/ome-metadata-derive/Cargo.toml index dcf54cf..9774fdf 100644 --- a/ome-metadata-derive/Cargo.toml +++ b/ome-metadata-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ome-metadata-derive" -version = "0.5.0" +version = "0.6.0" edition = "2024" rust-version = "1.88.0" authors = ["Wim Pomp "] @@ -13,7 +13,7 @@ readme = "README.md" [dependencies] quote = "1" -syn = "2" +syn = "3" [lib] proc-macro = true \ No newline at end of file diff --git a/ome-metadata/Cargo.toml b/ome-metadata/Cargo.toml index ea013a3..2fb9e8f 100644 --- a/ome-metadata/Cargo.toml +++ b/ome-metadata/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ome-metadata" -version = "0.5.0" +version = "0.6.0" edition = "2024" rust-version = "1.88.0" authors = ["Wim Pomp "] @@ -21,9 +21,9 @@ crate-type = ["cdylib", "rlib"] [dependencies] color-eyre = { version = "0.6", optional = true } -ome-metadata-derive = { path = "../ome-metadata-derive", version = "0.5.0" } +ome-metadata-derive = { path = "../ome-metadata-derive", version = "0.6.0" } pyo3 = { version = "0.29", features = ["abi3-py310", "anyhow", "eyre", "generate-import-lib"], optional = true} -quick-xml = { version = "0.40", features = ["serialize"] } +quick-xml = { version = "0.42", features = ["serialize"] } serde = { version = "1", features = ["derive"] } strum = { version = "0.28", features = ["derive"] } thiserror = "2" diff --git a/ome-metadata/src/lib.rs b/ome-metadata/src/lib.rs index 2fb8471..26114b6 100644 --- a/ome-metadata/src/lib.rs +++ b/ome-metadata/src/lib.rs @@ -50,7 +50,7 @@ mod tests { assert_eq!( namespace, quick_xml::name::ResolveResult::Bound(quick_xml::name::Namespace( - b"http://www.openmicroscopy.org/Schemas/OME/2016-06" + "http://www.openmicroscopy.org/Schemas/OME/2016-06" )) ); let root = match event { @@ -59,18 +59,22 @@ mod tests { } event => panic!("expected OME root, got {event:?}"), }; - assert_eq!(root.name().as_ref(), b"OME"); + assert_eq!(root.name().as_ref(), "OME"); assert_eq!( root.try_get_attribute("xmlns:xsi") .unwrap() .unwrap() .value .as_ref(), - b"http://www.w3.org/2001/XMLSchema-instance" + "http://www.w3.org/2001/XMLSchema-instance" ); assert_eq!( - root.try_get_attribute("xsi:schemaLocation").unwrap().unwrap().value.as_ref(), - b"http://www.openmicroscopy.org/Schemas/OME/2016-06 http://www.openmicroscopy.org/Schemas/OME/2016-06/ome.xsd" + root.try_get_attribute("xsi:schemaLocation") + .unwrap() + .unwrap() + .value + .as_ref(), + "http://www.openmicroscopy.org/Schemas/OME/2016-06 http://www.openmicroscopy.org/Schemas/OME/2016-06/ome.xsd" ); assert_eq!(Ome::from_xml(&xml)?, ome); diff --git a/ome-metadata/src/xml.rs b/ome-metadata/src/xml.rs index 5c0a26c..b540fc4 100644 --- a/ome-metadata/src/xml.rs +++ b/ome-metadata/src/xml.rs @@ -15,33 +15,30 @@ pub(crate) fn to_string(value: &T) -> Result { // Serde sees an escaped string; the public XML API sees an XML fragment. fn rewrite_values(xml: &str, writing: bool) -> Result { let mut reader = quick_xml::Reader::from_str(xml); - let mut stack: Vec<(Vec, BTreeMap)> = Vec::new(); + let mut stack: Vec<(String, BTreeMap)> = Vec::new(); let mut output = String::new(); let mut copied = 0; loop { match reader.read_event().map_err(quick_xml::DeError::from)? { Event::Start(ref start) => { let name = start.local_name(); - let is_value = (name.as_ref() == b"Value" + let is_value = (name.as_ref() == "Value" && stack .last() - .is_some_and(|(name, _)| name.as_slice() == b"XMLAnnotation")) - || (stack.is_empty() && name.as_ref() == b"XmlAnnotationValue"); + .is_some_and(|(name, _)| name == "XMLAnnotation")) + || (stack.is_empty() && name.as_ref() == "XmlAnnotationValue"); let mut namespaces = stack.last().map(|(_, ns)| ns.clone()).unwrap_or_default(); for attribute in start.attributes() { let attribute = attribute .map_err(quick_xml::Error::from) .map_err(quick_xml::DeError::from)?; let key = attribute.key.as_ref(); - if key == b"xmlns" || key.starts_with(b"xmlns:") { + if key == "xmlns" || key.starts_with("xmlns:") { namespaces.insert( - String::from_utf8_lossy(key).into_owned(), + key.to_owned(), quick_xml::escape::escape( attribute - .decoded_and_normalized_value( - quick_xml::XmlVersion::Implicit1_0, - reader.decoder(), - ) + .normalized_value(quick_xml::XmlVersion::Implicit1_0) .map_err(quick_xml::DeError::from)?, ) .into_owned(), @@ -74,7 +71,7 @@ fn rewrite_values(xml: &str, writing: bool) -> Result { } copied = inner_end; } else { - stack.push((name.as_ref().to_vec(), namespaces)); + stack.push((name.as_ref().to_owned(), namespaces)); } } Event::End(_) => { @@ -160,7 +157,7 @@ fn retain_namespaces( let attribute = attribute .map_err(quick_xml::Error::from) .map_err(quick_xml::DeError::from)?; - declared.push(String::from_utf8_lossy(attribute.key.as_ref()).into_owned()); + declared.push(attribute.key.as_ref().to_owned()); } let insertion = before + 1 + start.name().as_ref().len(); output.push_str(&fragment[copied..insertion]);