From f612fd57940db6a6844835752e577e2d626e5afa Mon Sep 17 00:00:00 2001 From: Seto Elkahfi <1797197+setoelkahfi@users.noreply.github.com> Date: Sat, 24 Oct 2026 13:10:36 +0200 Subject: [PATCH 1/2] Publish the smbcloud-email gem Give sdk/gems/email the same treatment auth and model got in #91 so it can ship to RubyGems as a fat native gem. - Build with magnus 0.8 (0.7.1 does not compile on Ruby 4.0) and depend on smbcloud-email-sdk 0.7 instead of the 0.4 that no longer matches the crate. - Require rb_sys >= 0.9.130, which sets the darwin install name, and drop build.rs. - Cross-compile for four platforms and load the per-Ruby-minor extension with a fallback to the single-ABI path. - Stop packaging .ruby-version, a symlink that made the source gem uninstallable. - Remove the [patch.crates-io] path override from the gem workspace. It ships in the source gem and points outside it, so cargo fails on install. - Add the gem to release-sdk-gem.yml and to the version sync and drift checks. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/release-sdk-gem.yml | 19 +- scripts/check-release-versions.mjs | 6 +- scripts/sync-release-version.mjs | 3 + sdk/gems/email/Cargo.lock | 377 +++++++++++++------------- sdk/gems/email/Cargo.toml | 6 - sdk/gems/email/Gemfile.lock | 4 +- sdk/gems/email/Rakefile | 2 + sdk/gems/email/email.gemspec | 7 +- sdk/gems/email/ext/email/Cargo.toml | 4 +- sdk/gems/email/ext/email/build.rs | 11 - sdk/gems/email/ext/email/src/lib.rs | 14 +- sdk/gems/email/lib/email.rb | 9 +- 12 files changed, 239 insertions(+), 223 deletions(-) delete mode 100644 sdk/gems/email/ext/email/build.rs diff --git a/.github/workflows/release-sdk-gem.yml b/.github/workflows/release-sdk-gem.yml index c4185116..cdf54eec 100644 --- a/.github/workflows/release-sdk-gem.yml +++ b/.github/workflows/release-sdk-gem.yml @@ -1,7 +1,7 @@ name: SDK Ruby Gem Release -# Publishes the smbcloud-auth (sdk/gems/auth) and smbcloud-model -# (sdk/gems/model) Ruby gems to RubyGems. +# Publishes the smbcloud-auth (sdk/gems/auth), smbcloud-model (sdk/gems/model) +# and smbcloud-email (sdk/gems/email) Ruby gems to RubyGems. # Native gems are cross-compiled on Linux with rb-sys-dock, so the darwin gems # get the generic `arm64-darwin` / `x86_64-darwin` platforms (a gem built with a # runner's Ruby gets e.g. `arm64-darwin-23`, which only matches that macOS @@ -11,8 +11,10 @@ name: SDK Ruby Gem Release # Pull requests that touch the gems build everything but publish nothing. # # Required secrets: -# RUBYGEMS_API_KEY — RubyGems.org API key with push access to smbcloud-auth and -# smbcloud-model +# RUBYGEMS_API_KEY — RubyGems.org API key that can push smbcloud-auth, +# smbcloud-model and smbcloud-email. It must be able to +# push a NEW gem (not scoped to existing gems only), or +# the first smbcloud-email push is refused. on: workflow_dispatch: @@ -27,6 +29,7 @@ on: paths: - "sdk/gems/auth/**" - "sdk/gems/model/**" + - "sdk/gems/email/**" - ".github/workflows/release-sdk-gem.yml" permissions: @@ -43,7 +46,7 @@ jobs: strategy: fail-fast: false matrix: - gem: [auth, model] + gem: [auth, model, email] platform: [x86_64-linux, aarch64-linux, arm64-darwin, x86_64-darwin] steps: @@ -69,7 +72,7 @@ jobs: if: github.event_name != 'pull_request' shell: bash run: | - for crate_name in smbcloud-auth-sdk smbcloud-model smbcloud-network; do + for crate_name in smbcloud-auth-sdk smbcloud-email-sdk smbcloud-model smbcloud-network; do for attempt in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do if curl -fsS -H "User-Agent: smbcloud-cli-release" "https://crates.io/api/v1/crates/${crate_name}/${RELEASE_VERSION}" >/dev/null 2>&1; then echo "${crate_name} ${RELEASE_VERSION} is available on crates.io" @@ -136,7 +139,7 @@ jobs: strategy: fail-fast: false matrix: - gem: [auth, model] + gem: [auth, model, email] steps: - name: Checkout uses: actions/checkout@v6 @@ -201,7 +204,7 @@ jobs: strategy: fail-fast: false matrix: - gem: [auth, model] + gem: [auth, model, email] steps: - name: Checkout diff --git a/scripts/check-release-versions.mjs b/scripts/check-release-versions.mjs index d3093264..de2dc30d 100644 --- a/scripts/check-release-versions.mjs +++ b/scripts/check-release-versions.mjs @@ -68,7 +68,11 @@ for (const path of [ // must be the release's major.minor, or a gem can silently wrap an older crate. const [expectedMajor, expectedMinor] = expectedVersion.split("."); const expectedRequirement = `${expectedMajor}.${expectedMinor}`; -for (const path of ["sdk/gems/auth/ext/auth/Cargo.toml", "sdk/gems/model/ext/model/Cargo.toml"]) { +for (const path of [ + "sdk/gems/auth/ext/auth/Cargo.toml", + "sdk/gems/email/ext/email/Cargo.toml", + "sdk/gems/model/ext/model/Cargo.toml", +]) { for (const match of read(path).matchAll(/^(smbcloud-[\w-]+)\s*=\s*\{\s*version\s*=\s*"([^"]+)"/gm)) { if (match[2] !== expectedRequirement) { mismatches.push(`${path} dependency ${match[1]}: ${match[2]} (expected ${expectedRequirement})`); diff --git a/scripts/sync-release-version.mjs b/scripts/sync-release-version.mjs index 256842ed..74e27afc 100644 --- a/scripts/sync-release-version.mjs +++ b/scripts/sync-release-version.mjs @@ -269,6 +269,9 @@ if ( /^version\s*=\s*"[^"]+"/m, `version = "${releaseVersion}"`, `${emailGemCargoTomlPath} package version`, + ).replace( + /(smbcloud-email-sdk\s*=\s*\{\s*version\s*=\s*")([^"]+)("\s*\})/, + `$1${rubySdkRequirement}$3`, ), ) ) { diff --git a/sdk/gems/email/Cargo.lock b/sdk/gems/email/Cargo.lock index 6d33da06..69c16a4a 100644 --- a/sdk/gems/email/Cargo.lock +++ b/sdk/gems/email/Cargo.lock @@ -4,18 +4,18 @@ version = 4 [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] [[package]] name = "android_system_properties" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" dependencies = [ "libc", ] @@ -108,13 +108,19 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + [[package]] name = "bindgen" version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cexpr", "clang-sys", "itertools", @@ -134,9 +140,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.1" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "bumpalo" @@ -152,9 +158,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" -version = "1.4.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +checksum = "86e055fa6e3e40ad6187ba25b6855eeb635d5271f8e0f0e1e9a5826b8d75bea0" dependencies = [ "find-msvc-tools", "shlex 2.0.1", @@ -171,9 +177,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cfg_aliases" @@ -183,9 +189,9 @@ checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ "cfg-if", "cpufeatures", @@ -234,9 +240,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", "clap_derive", @@ -244,9 +250,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.2" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstream", "anstyle", @@ -256,21 +262,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.9", ] [[package]] name = "clap_lex" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" [[package]] name = "colorchoice" @@ -305,9 +311,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ "libc", ] @@ -320,18 +326,18 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.9", ] [[package]] name = "either" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" [[package]] name = "email" -version = "0.4.13" +version = "0.7.6" dependencies = [ "magnus", "serde_json", @@ -341,9 +347,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" [[package]] name = "form_urlencoded" @@ -356,30 +362,30 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-task" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", "futures-task", @@ -485,9 +491,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", @@ -504,13 +510,12 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" dependencies = [ "atomic-waker", "bytes", - "futures-channel", "futures-core", "http", "http-body", @@ -524,9 +529,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.9" +version = "0.27.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" dependencies = [ "http", "hyper", @@ -541,16 +546,17 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" dependencies = [ - "base64", + "base64 0.23.1", "bytes", "futures-channel", "futures-util", "http", "http-body", + "httparse", "hyper", "ipnet", "libc", @@ -588,9 +594,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" dependencies = [ "displaydoc", "potential_utf", @@ -602,9 +608,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" dependencies = [ "displaydoc", "litemap", @@ -615,9 +621,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -629,16 +635,17 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" [[package]] name = "icu_properties" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" dependencies = [ + "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", @@ -649,15 +656,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" [[package]] name = "icu_provider" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" dependencies = [ "displaydoc", "icu_locale_core", @@ -691,9 +698,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.12.0" +version = "2.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" [[package]] name = "is_terminal_polyfill" @@ -718,9 +725,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ "cfg-if", "futures-util", @@ -729,15 +736,15 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" [[package]] name = "libc" -version = "0.2.189" +version = "0.2.191" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" [[package]] name = "libloading" @@ -751,15 +758,15 @@ dependencies = [ [[package]] name = "litemap" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "log" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "loom" @@ -778,15 +785,15 @@ dependencies = [ [[package]] name = "lru-slab" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" [[package]] name = "magnus" -version = "0.7.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d87ae53030f3a22e83879e666cb94e58a7bdf31706878a0ba48752994146dab" +checksum = "e76237a607e1dea288dd0ef0c6c8f49037df2152d14bb52b3542c46522d9e6fc" dependencies = [ "magnus-macros", "rb-sys", @@ -796,9 +803,9 @@ dependencies = [ [[package]] name = "magnus-macros" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5968c820e2960565f647819f5928a42d6e874551cab9d88d75e3e0660d7f71e3" +checksum = "47607461fd8e1513cb4f2076c197d8092d921a1ea75bd08af97398f593751892" dependencies = [ "proc-macro2", "quote", @@ -834,9 +841,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "1.2.2" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" dependencies = [ "libc", "wasi", @@ -903,9 +910,9 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "potential_utf" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -945,9 +952,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" dependencies = [ "bytes", "cfg_aliases", @@ -965,9 +972,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.16" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe" dependencies = [ "bytes", "getrandom 0.4.3", @@ -987,9 +994,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +checksum = "af66907df18639dcf4db56ca65490cabc4b27a97dbadd96f2926cca73298f016" dependencies = [ "cfg_aliases", "libc", @@ -1016,9 +1023,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ "chacha20", "getrandom 0.4.3", @@ -1042,18 +1049,18 @@ dependencies = [ [[package]] name = "rb-sys" -version = "0.9.128" +version = "0.9.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ca28513560e56cfb79a62b1fce363c73af170a182024ce880c77ee9429920a" +checksum = "02faf625bb10ba893e3ae620f19c9fb1b5f8fcae0fe4eb86bb3f2230fad75edb" dependencies = [ "rb-sys-build", ] [[package]] name = "rb-sys-build" -version = "0.9.128" +version = "0.9.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce04b2c55eff3a21aaa623fcc655d94373238e72cac6b3e1a3641ff31649f99a" +checksum = "05be6f9c86fe5482808162826f6c047d093b3670582296c770de1d94f8066694" dependencies = [ "bindgen", "lazy_static", @@ -1066,9 +1073,9 @@ dependencies = [ [[package]] name = "rb-sys-env" -version = "0.1.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb" +checksum = "cca7ad6a7e21e72151d56fe2495a259b5670e204c3adac41ee7ef676ea08117a" [[package]] name = "regex" @@ -1084,9 +1091,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -1105,7 +1112,7 @@ version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-core", "http", @@ -1160,9 +1167,9 @@ checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustls" -version = "0.23.43" +version = "0.23.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" dependencies = [ "once_cell", "ring", @@ -1174,9 +1181,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +checksum = "4a073f5dc7469f984c52ad2752b63b0807745133b6de880b7b64c1ac4c48aec4" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -1196,9 +1203,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" dependencies = [ "ring", "rustls-pki-types", @@ -1228,9 +1235,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +checksum = "9cb23c424d8ee841bb4d813677ca237e2a610067d594fec130f87d6093495ab5" dependencies = [ "windows-sys 0.61.2", ] @@ -1247,7 +1254,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "core-foundation", "core-foundation-sys", "libc", @@ -1297,14 +1304,14 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.9", ] [[package]] name = "serde_json" -version = "1.0.151" +version = "1.0.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" dependencies = [ "itoa", "memchr", @@ -1321,7 +1328,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.9", ] [[package]] @@ -1371,13 +1378,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" [[package]] name = "smbcloud-email-sdk" -version = "0.4.13" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402b24ba82e12cb3fd502e2246c8cec8a638c7ff01b3864039902e7a2d1fe0f9" dependencies = [ "log", "reqwest", @@ -1391,7 +1400,9 @@ dependencies = [ [[package]] name = "smbcloud-model" -version = "0.4.13" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c622460c12691c7318a93eaf0b8d56d3365de8ccf8a1391cd1cc4cbad5077ba7" dependencies = [ "chrono", "log", @@ -1407,9 +1418,11 @@ dependencies = [ [[package]] name = "smbcloud-network" -version = "0.4.13" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae0c7939392a434d1a099cb7091a4b440f13656a3d7901448e190f32746a23d" dependencies = [ - "clap 4.6.4", + "clap 4.6.7", "log", "reqwest", "serde", @@ -1560,9 +1573,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.3" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" dependencies = [ "proc-macro2", "quote", @@ -1580,13 +1593,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", ] [[package]] @@ -1600,22 +1613,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.19" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.19" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.9", ] [[package]] @@ -1629,9 +1642,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" dependencies = [ "displaydoc", "zerovec", @@ -1639,24 +1652,15 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" [[package]] name = "tokio" -version = "1.53.1" +version = "1.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" dependencies = [ "bytes", "libc", @@ -1668,9 +1672,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.4" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db" dependencies = [ "rustls", "tokio", @@ -1697,7 +1701,7 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytes", "futures-util", "http", @@ -1812,9 +1816,9 @@ checksum = "8acc9e35a3072d9ea375093f321b3738ea3ac4fdebc18d2789b01581e5c2e4ae" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" [[package]] name = "unicode-segmentation" @@ -1888,9 +1892,9 @@ dependencies = [ [[package]] name = "want" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" dependencies = [ "try-lock", ] @@ -1903,9 +1907,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -1916,19 +1920,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.76" +version = "0.4.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" dependencies = [ "js-sys", + "tokio", "wasm-bindgen", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1936,31 +1941,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.103" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" dependencies = [ "js-sys", "wasm-bindgen", @@ -1978,9 +1983,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +checksum = "f5f280bbb2b287bc8e7de7e3852945a0ff50d1bbcb5ed42b6c7a568c546df171" dependencies = [ "rustls-pki-types", ] @@ -2225,15 +2230,15 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "writeable" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "yoke" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -2242,13 +2247,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", "synstructure", ] @@ -2263,27 +2268,27 @@ dependencies = [ [[package]] name = "zerofrom-derive" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", "synstructure", ] [[package]] name = "zeroize" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" [[package]] name = "zerotrie" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -2292,9 +2297,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" dependencies = [ "yoke", "zerofrom", @@ -2303,13 +2308,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.3" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", ] [[package]] diff --git a/sdk/gems/email/Cargo.toml b/sdk/gems/email/Cargo.toml index afcc8534..1eed39fa 100644 --- a/sdk/gems/email/Cargo.toml +++ b/sdk/gems/email/Cargo.toml @@ -6,9 +6,3 @@ members = ["./ext/email"] resolver = "2" -# For local development, build the native extension against the in-repo SDK crate -# rather than the published one. The release tooling publishes smbcloud-email-sdk -# first, after which the version dependency in ext/email/Cargo.toml resolves from -# crates.io and this patch is a no-op. -[patch.crates-io] -smbcloud-email-sdk = { path = "../../../crates/smbcloud-email-sdk" } diff --git a/sdk/gems/email/Gemfile.lock b/sdk/gems/email/Gemfile.lock index 9d1bd03a..0d01c0fe 100644 --- a/sdk/gems/email/Gemfile.lock +++ b/sdk/gems/email/Gemfile.lock @@ -3,7 +3,7 @@ PATH specs: smbcloud-email (0.7.6) json - rb_sys (~> 0.9.91) + rb_sys (~> 0.9, >= 0.9.130) GEM remote: https://rubygems.org/ @@ -13,7 +13,7 @@ GEM rake-compiler (1.3.1) rake rake-compiler-dock (1.12.0) - rb_sys (0.9.128) + rb_sys (0.9.130) rake-compiler-dock (= 1.12.0) PLATFORMS diff --git a/sdk/gems/email/Rakefile b/sdk/gems/email/Rakefile index c3c8a2b7..4dd0f969 100644 --- a/sdk/gems/email/Rakefile +++ b/sdk/gems/email/Rakefile @@ -9,6 +9,8 @@ GEMSPEC = Gem::Specification.load('email.gemspec') RbSys::ExtensionTask.new('email', GEMSPEC) do |ext| ext.lib_dir = 'lib/email' + ext.cross_compile = true + ext.cross_platform = %w[x86_64-linux aarch64-linux arm64-darwin x86_64-darwin] end task default: :compile diff --git a/sdk/gems/email/email.gemspec b/sdk/gems/email/email.gemspec index 3bd8e5fa..fa07b37e 100644 --- a/sdk/gems/email/email.gemspec +++ b/sdk/gems/email/email.gemspec @@ -24,7 +24,7 @@ Gem::Specification.new do |spec| spec.files = IO.popen(%w[git ls-files -z], chdir: __dir__, err: IO::NULL) do |ls| ls.readlines("\x0", chomp: true).reject do |f| (f == gemspec) || - f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile]) + f.start_with?(*%w[bin/ test/ spec/ features/ .git .ruby-version .rubocop.yml appveyor Gemfile]) end end spec.bindir = 'exe' @@ -33,5 +33,8 @@ Gem::Specification.new do |spec| spec.extensions = ['ext/email/extconf.rb'] spec.add_dependency 'json' - spec.add_dependency 'rb_sys', '~> 0.9.91' + # 0.9.130 is the first rb_sys that gives darwin bundles a non-empty install + # name. Older versions run `install_name_tool -id ""`, which dyld on macOS 15+ + # rejects, so the extension fails to load. + spec.add_dependency 'rb_sys', '~> 0.9', '>= 0.9.130' end diff --git a/sdk/gems/email/ext/email/Cargo.toml b/sdk/gems/email/ext/email/Cargo.toml index 25ca1163..e4aff808 100644 --- a/sdk/gems/email/ext/email/Cargo.toml +++ b/sdk/gems/email/ext/email/Cargo.toml @@ -9,10 +9,10 @@ publish = false crate-type = ["cdylib"] [dependencies] -magnus = { version = "0.7.1" } +magnus = "0.8" serde_json = "1" tokio = { version = "1", features = ["rt-multi-thread"] } # The published transactional-email SDK. For local development this is patched # to the in-repo crate via `[patch.crates-io]` in the gem workspace Cargo.toml. -smbcloud-email-sdk = { version = "0.4" } +smbcloud-email-sdk = { version = "0.7" } diff --git a/sdk/gems/email/ext/email/build.rs b/sdk/gems/email/ext/email/build.rs deleted file mode 100644 index 017879eb..00000000 --- a/sdk/gems/email/ext/email/build.rs +++ /dev/null @@ -1,11 +0,0 @@ -fn main() { - // On macOS, a Rust `cdylib` is emitted with an empty LC_ID_DYLIB install - // name. The dyld in macOS 15+/Tahoe (Darwin 27) validates this strictly and - // refuses to load the resulting `.bundle` with: - // "load command #4 string extends beyond end of load command" - // Give the dylib a valid install name at link time so the Ruby extension - // loads on the stricter loader. - if std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("macos") { - println!("cargo:rustc-cdylib-link-arg=-Wl,-install_name,@rpath/email.bundle"); - } -} diff --git a/sdk/gems/email/ext/email/src/lib.rs b/sdk/gems/email/ext/email/src/lib.rs index 1f1dec26..fb190869 100644 --- a/sdk/gems/email/ext/email/src/lib.rs +++ b/sdk/gems/email/ext/email/src/lib.rs @@ -2,10 +2,16 @@ use magnus::{function, prelude::*, Error, Ruby}; use smbcloud_email_sdk::{EmailClient, EmailCredentials, Environment, SendEmail}; use tokio::runtime::Runtime; +// Every helper here runs on the Ruby thread that called into the extension +// (tokio's `block_on` stays on the calling thread), so the handle is available. +fn ruby() -> Ruby { + Ruby::get().expect("smbcloud-email called outside a Ruby thread") +} + fn parse_environment(value: String) -> Result { value.parse().map_err(|_| { Error::new( - magnus::exception::arg_error(), + ruby().exception_arg_error(), format!("invalid environment `{value}`, expected `dev` or `production`"), ) }) @@ -17,7 +23,7 @@ where { let runtime = Runtime::new().map_err(|err| { Error::new( - magnus::exception::runtime_error(), + ruby().exception_runtime_error(), format!("failed to initialize tokio runtime: {err}"), ) })?; @@ -25,7 +31,7 @@ where } fn runtime_error(message: impl std::fmt::Display) -> Error { - Error::new(magnus::exception::runtime_error(), message.to_string()) + Error::new(ruby().exception_runtime_error(), message.to_string()) } fn client(environment: Environment, api_key: &str) -> EmailClient { @@ -37,7 +43,7 @@ fn client(environment: Environment, api_key: &str) -> EmailClient { fn send_json(environment: String, api_key: String, message_json: String) -> Result { let env = parse_environment(environment)?; let message: SendEmail = serde_json::from_str(&message_json) - .map_err(|err| Error::new(magnus::exception::arg_error(), format!("invalid message: {err}")))?; + .map_err(|err| Error::new(ruby().exception_arg_error(), format!("invalid message: {err}")))?; with_runtime(|runtime| { match runtime.block_on(client(env, &api_key).send(&message)) { diff --git a/sdk/gems/email/lib/email.rb b/sdk/gems/email/lib/email.rb index b1c704c3..2c3ca9d4 100644 --- a/sdk/gems/email/lib/email.rb +++ b/sdk/gems/email/lib/email.rb @@ -2,7 +2,14 @@ require 'json' require_relative 'email/version' -require_relative 'email/email' +# Fat native gems ship one extension per Ruby minor (lib/email/3.4/email.bundle); +# source and single-ABI builds put it directly under lib/email/. +begin + RUBY_VERSION =~ /(\d+\.\d+)/ + require_relative "email/#{Regexp.last_match(1)}/email" +rescue LoadError + require_relative 'email/email' +end module Email end From f749b0d14c284a9fa67409fa815ead691ddbea03 Mon Sep 17 00:00:00 2001 From: Seto Elkahfi <1797197+setoelkahfi@users.noreply.github.com> Date: Sat, 24 Oct 2026 13:15:33 +0200 Subject: [PATCH 2/2] Push gems with RubyGems trusted publishing Replace the RUBYGEMS_API_KEY secret with an OIDC exchange through rubygems/configure-rubygems-credentials. The push job gets id-token: write and the key is short lived. This also removes the problem of a scoped key refusing the first push of a new gem: smbcloud-email can use a pending trusted publisher instead. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/release-sdk-gem.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release-sdk-gem.yml b/.github/workflows/release-sdk-gem.yml index cdf54eec..f8a881e9 100644 --- a/.github/workflows/release-sdk-gem.yml +++ b/.github/workflows/release-sdk-gem.yml @@ -10,11 +10,12 @@ name: SDK Ruby Gem Release # # Pull requests that touch the gems build everything but publish nothing. # -# Required secrets: -# RUBYGEMS_API_KEY — RubyGems.org API key that can push smbcloud-auth, -# smbcloud-model and smbcloud-email. It must be able to -# push a NEW gem (not scoped to existing gems only), or -# the first smbcloud-email push is refused. +# Gems are pushed with RubyGems trusted publishing (OIDC), so there is no API +# key secret. Each gem needs a trusted publisher on rubygems.org for repository +# smbcloudXYZ/smbcloud-cli, workflow release-sdk-gem.yml, with no environment. +# A gem that does not exist yet (smbcloud-email) needs a *pending* trusted +# publisher, created from the owner's profile; the first push turns it into a +# normal one. See https://guides.rubygems.org/trusted-publishing/ on: workflow_dispatch: @@ -201,6 +202,9 @@ jobs: needs: [build-gems, build-source-gem] if: github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest + permissions: + contents: read + id-token: write strategy: fail-fast: false matrix: @@ -237,12 +241,10 @@ jobs: with: ruby-version: .ruby-version + # Exchanges this job's OIDC token for a short-lived RubyGems API key and + # exports it as GEM_HOST_API_KEY, which `gem push` reads. - name: Configure RubyGems credentials - shell: bash - run: | - mkdir -p "${HOME}/.gem" - echo ":rubygems_api_key: ${{ secrets.RUBYGEMS_API_KEY }}" > "${HOME}/.gem/credentials" - chmod 0600 "${HOME}/.gem/credentials" + uses: rubygems/configure-rubygems-credentials@v2.1.0 # Push each .gem file individually. A file that is already published (a # re-run, or completing a partial release) is skipped; any other failure