@smbcloud / cli / commits / f612fd5

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 <noreply@anthropic.com>

Seto Elkahfi committed Oct 24, 2026 at 13:10 UTC f612fd57940db6a6844835752e577e2d626e5afa
12 files changed +239 -223
.github/workflows/release-sdk-gem.yml
+11 -8
@@ -1,7 +1,7 @@
1 name: SDK Ruby Gem Release
2
3 -# Publishes the smbcloud-auth (sdk/gems/auth) and smbcloud-model
4 -# (sdk/gems/model) Ruby gems to RubyGems.
3 +# Publishes the smbcloud-auth (sdk/gems/auth), smbcloud-model (sdk/gems/model)
4 +# and smbcloud-email (sdk/gems/email) Ruby gems to RubyGems.
5 # Native gems are cross-compiled on Linux with rb-sys-dock, so the darwin gems
6 # get the generic `arm64-darwin` / `x86_64-darwin` platforms (a gem built with a
7 # runner's Ruby gets e.g. `arm64-darwin-23`, which only matches that macOS
@@ -11,8 +11,10 @@ name: SDK Ruby Gem Release
11 # Pull requests that touch the gems build everything but publish nothing.
12 #
13 # Required secrets:
14 -# RUBYGEMS_API_KEY — RubyGems.org API key with push access to smbcloud-auth and
15 -# smbcloud-model
14 +# RUBYGEMS_API_KEY — RubyGems.org API key that can push smbcloud-auth,
15 +# smbcloud-model and smbcloud-email. It must be able to
16 +# push a NEW gem (not scoped to existing gems only), or
17 +# the first smbcloud-email push is refused.
18
19 on:
20 workflow_dispatch:
@@ -27,6 +29,7 @@ on:
29 paths:
30 - "sdk/gems/auth/**"
31 - "sdk/gems/model/**"
32 + - "sdk/gems/email/**"
33 - ".github/workflows/release-sdk-gem.yml"
34
35 permissions:
@@ -43,7 +46,7 @@ jobs:
46 strategy:
47 fail-fast: false
48 matrix:
46 - gem: [auth, model]
49 + gem: [auth, model, email]
50 platform: [x86_64-linux, aarch64-linux, arm64-darwin, x86_64-darwin]
51
52 steps:
@@ -69,7 +72,7 @@ jobs:
72 if: github.event_name != 'pull_request'
73 shell: bash
74 run: |
72 - for crate_name in smbcloud-auth-sdk smbcloud-model smbcloud-network; do
75 + for crate_name in smbcloud-auth-sdk smbcloud-email-sdk smbcloud-model smbcloud-network; do
76 for attempt in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
77 if curl -fsS -H "User-Agent: smbcloud-cli-release" "https://crates.io/api/v1/crates/${crate_name}/${RELEASE_VERSION}" >/dev/null 2>&1; then
78 echo "${crate_name} ${RELEASE_VERSION} is available on crates.io"
@@ -136,7 +139,7 @@ jobs:
139 strategy:
140 fail-fast: false
141 matrix:
139 - gem: [auth, model]
142 + gem: [auth, model, email]
143 steps:
144 - name: Checkout
145 uses: actions/checkout@v6
@@ -201,7 +204,7 @@ jobs:
204 strategy:
205 fail-fast: false
206 matrix:
204 - gem: [auth, model]
207 + gem: [auth, model, email]
208
209 steps:
210 - name: Checkout
scripts/check-release-versions.mjs
+5 -1
@@ -68,7 +68,11 @@ for (const path of [
68 // must be the release's major.minor, or a gem can silently wrap an older crate.
69 const [expectedMajor, expectedMinor] = expectedVersion.split(".");
70 const expectedRequirement = `${expectedMajor}.${expectedMinor}`;
71 -for (const path of ["sdk/gems/auth/ext/auth/Cargo.toml", "sdk/gems/model/ext/model/Cargo.toml"]) {
71 +for (const path of [
72 + "sdk/gems/auth/ext/auth/Cargo.toml",
73 + "sdk/gems/email/ext/email/Cargo.toml",
74 + "sdk/gems/model/ext/model/Cargo.toml",
75 +]) {
76 for (const match of read(path).matchAll(/^(smbcloud-[\w-]+)\s*=\s*\{\s*version\s*=\s*"([^"]+)"/gm)) {
77 if (match[2] !== expectedRequirement) {
78 mismatches.push(`${path} dependency ${match[1]}: ${match[2]} (expected ${expectedRequirement})`);
scripts/sync-release-version.mjs
+3
@@ -269,6 +269,9 @@ if (
269 /^version\s*=\s*"[^"]+"/m,
270 `version = "${releaseVersion}"`,
271 `${emailGemCargoTomlPath} package version`,
272 + ).replace(
273 + /(smbcloud-email-sdk\s*=\s*\{\s*version\s*=\s*")([^"]+)("\s*\})/,
274 + `$1${rubySdkRequirement}$3`,
275 ),
276 )
277 ) {
sdk/gems/email/Cargo.lock
+191 -186
@@ -4,18 +4,18 @@ version = 4
4
5 [[package]]
6 name = "aho-corasick"
7 -version = "1.1.4"
7 +version = "1.1.5"
8 source = "registry+https://github.com/rust-lang/crates.io-index"
9 -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
9 +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
10 dependencies = [
11 "memchr",
12 ]
13
14 [[package]]
15 name = "android_system_properties"
16 -version = "0.1.5"
16 +version = "0.1.6"
17 source = "registry+https://github.com/rust-lang/crates.io-index"
18 -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
18 +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc"
19 dependencies = [
20 "libc",
21 ]
@@ -108,13 +108,19 @@ version = "0.22.1"
108 source = "registry+https://github.com/rust-lang/crates.io-index"
109 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
110
111 +[[package]]
112 +name = "base64"
113 +version = "0.23.1"
114 +source = "registry+https://github.com/rust-lang/crates.io-index"
115 +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
116 +
117 [[package]]
118 name = "bindgen"
119 version = "0.72.1"
120 source = "registry+https://github.com/rust-lang/crates.io-index"
121 checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"
122 dependencies = [
117 - "bitflags 2.13.1",
123 + "bitflags 2.13.2",
124 "cexpr",
125 "clang-sys",
126 "itertools",
@@ -134,9 +140,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
140
141 [[package]]
142 name = "bitflags"
137 -version = "2.13.1"
143 +version = "2.13.2"
144 source = "registry+https://github.com/rust-lang/crates.io-index"
139 -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
145 +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
146
147 [[package]]
148 name = "bumpalo"
@@ -152,9 +158,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
158
159 [[package]]
160 name = "cc"
155 -version = "1.4.0"
161 +version = "1.10.0"
162 source = "registry+https://github.com/rust-lang/crates.io-index"
157 -checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9"
163 +checksum = "86e055fa6e3e40ad6187ba25b6855eeb635d5271f8e0f0e1e9a5826b8d75bea0"
164 dependencies = [
165 "find-msvc-tools",
166 "shlex 2.0.1",
@@ -171,9 +177,9 @@ dependencies = [
177
178 [[package]]
179 name = "cfg-if"
174 -version = "1.0.4"
180 +version = "1.0.5"
181 source = "registry+https://github.com/rust-lang/crates.io-index"
176 -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
182 +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
183
184 [[package]]
185 name = "cfg_aliases"
@@ -183,9 +189,9 @@ checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527"
189
190 [[package]]
191 name = "chacha20"
186 -version = "0.10.1"
192 +version = "0.10.2"
193 source = "registry+https://github.com/rust-lang/crates.io-index"
188 -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
194 +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06"
195 dependencies = [
196 "cfg-if",
197 "cpufeatures",
@@ -234,9 +240,9 @@ dependencies = [
240
241 [[package]]
242 name = "clap"
237 -version = "4.6.4"
243 +version = "4.6.7"
244 source = "registry+https://github.com/rust-lang/crates.io-index"
239 -checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7"
245 +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946"
246 dependencies = [
247 "clap_builder",
248 "clap_derive",
@@ -244,9 +250,9 @@ dependencies = [
250
251 [[package]]
252 name = "clap_builder"
247 -version = "4.6.2"
253 +version = "4.6.7"
254 source = "registry+https://github.com/rust-lang/crates.io-index"
249 -checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b"
255 +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d"
256 dependencies = [
257 "anstream",
258 "anstyle",
@@ -256,21 +262,21 @@ dependencies = [
262
263 [[package]]
264 name = "clap_derive"
259 -version = "4.6.4"
265 +version = "4.6.7"
266 source = "registry+https://github.com/rust-lang/crates.io-index"
261 -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061"
267 +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0"
268 dependencies = [
269 "heck 0.5.0",
270 "proc-macro2",
271 "quote",
266 - "syn 3.0.3",
272 + "syn 3.0.9",
273 ]
274
275 [[package]]
276 name = "clap_lex"
271 -version = "1.1.0"
277 +version = "1.1.1"
278 source = "registry+https://github.com/rust-lang/crates.io-index"
273 -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
279 +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486"
280
281 [[package]]
282 name = "colorchoice"
@@ -305,9 +311,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
311
312 [[package]]
313 name = "cpufeatures"
308 -version = "0.3.0"
314 +version = "0.3.1"
315 source = "registry+https://github.com/rust-lang/crates.io-index"
310 -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
316 +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566"
317 dependencies = [
318 "libc",
319 ]
@@ -320,18 +326,18 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
326 dependencies = [
327 "proc-macro2",
328 "quote",
323 - "syn 3.0.3",
329 + "syn 3.0.9",
330 ]
331
332 [[package]]
333 name = "either"
328 -version = "1.17.0"
334 +version = "1.19.0"
335 source = "registry+https://github.com/rust-lang/crates.io-index"
330 -checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
336 +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be"
337
338 [[package]]
339 name = "email"
334 -version = "0.4.13"
340 +version = "0.7.6"
341 dependencies = [
342 "magnus",
343 "serde_json",
@@ -341,9 +347,9 @@ dependencies = [
347
348 [[package]]
349 name = "find-msvc-tools"
344 -version = "0.1.9"
350 +version = "0.1.15"
351 source = "registry+https://github.com/rust-lang/crates.io-index"
346 -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
352 +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48"
353
354 [[package]]
355 name = "form_urlencoded"
@@ -356,30 +362,30 @@ dependencies = [
362
363 [[package]]
364 name = "futures-channel"
359 -version = "0.3.33"
365 +version = "0.3.34"
366 source = "registry+https://github.com/rust-lang/crates.io-index"
361 -checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae"
367 +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4"
368 dependencies = [
369 "futures-core",
370 ]
371
372 [[package]]
373 name = "futures-core"
368 -version = "0.3.33"
374 +version = "0.3.34"
375 source = "registry+https://github.com/rust-lang/crates.io-index"
370 -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7"
376 +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
377
378 [[package]]
379 name = "futures-task"
374 -version = "0.3.33"
380 +version = "0.3.34"
381 source = "registry+https://github.com/rust-lang/crates.io-index"
376 -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109"
382 +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
383
384 [[package]]
385 name = "futures-util"
380 -version = "0.3.33"
386 +version = "0.3.34"
387 source = "registry+https://github.com/rust-lang/crates.io-index"
382 -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa"
388 +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
389 dependencies = [
390 "futures-core",
391 "futures-task",
@@ -485,9 +491,9 @@ dependencies = [
491
492 [[package]]
493 name = "http-body-util"
488 -version = "0.1.4"
494 +version = "0.1.5"
495 source = "registry+https://github.com/rust-lang/crates.io-index"
490 -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2"
496 +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c"
497 dependencies = [
498 "bytes",
499 "futures-core",
@@ -504,13 +510,12 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
510
511 [[package]]
512 name = "hyper"
507 -version = "1.11.0"
513 +version = "1.12.0"
514 source = "registry+https://github.com/rust-lang/crates.io-index"
509 -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72"
515 +checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c"
516 dependencies = [
517 "atomic-waker",
518 "bytes",
513 - "futures-channel",
519 "futures-core",
520 "http",
521 "http-body",
@@ -524,9 +529,9 @@ dependencies = [
529
530 [[package]]
531 name = "hyper-rustls"
527 -version = "0.27.9"
532 +version = "0.27.10"
533 source = "registry+https://github.com/rust-lang/crates.io-index"
529 -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f"
534 +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53"
535 dependencies = [
536 "http",
537 "hyper",
@@ -541,16 +546,17 @@ dependencies = [
546
547 [[package]]
548 name = "hyper-util"
544 -version = "0.1.20"
549 +version = "0.1.21"
550 source = "registry+https://github.com/rust-lang/crates.io-index"
546 -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
551 +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff"
552 dependencies = [
548 - "base64",
553 + "base64 0.23.1",
554 "bytes",
555 "futures-channel",
556 "futures-util",
557 "http",
558 "http-body",
559 + "httparse",
560 "hyper",
561 "ipnet",
562 "libc",
@@ -588,9 +594,9 @@ dependencies = [
594
595 [[package]]
596 name = "icu_collections"
591 -version = "2.2.0"
597 +version = "2.4.0"
598 source = "registry+https://github.com/rust-lang/crates.io-index"
593 -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
599 +checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd"
600 dependencies = [
601 "displaydoc",
602 "potential_utf",
@@ -602,9 +608,9 @@ dependencies = [
608
609 [[package]]
610 name = "icu_locale_core"
605 -version = "2.2.0"
611 +version = "2.4.0"
612 source = "registry+https://github.com/rust-lang/crates.io-index"
607 -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
613 +checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0"
614 dependencies = [
615 "displaydoc",
616 "litemap",
@@ -615,9 +621,9 @@ dependencies = [
621
622 [[package]]
623 name = "icu_normalizer"
618 -version = "2.2.0"
624 +version = "2.4.0"
625 source = "registry+https://github.com/rust-lang/crates.io-index"
620 -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
626 +checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599"
627 dependencies = [
628 "icu_collections",
629 "icu_normalizer_data",
@@ -629,16 +635,17 @@ dependencies = [
635
636 [[package]]
637 name = "icu_normalizer_data"
632 -version = "2.2.0"
638 +version = "2.4.0"
639 source = "registry+https://github.com/rust-lang/crates.io-index"
634 -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
640 +checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc"
641
642 [[package]]
643 name = "icu_properties"
638 -version = "2.2.0"
644 +version = "2.4.0"
645 source = "registry+https://github.com/rust-lang/crates.io-index"
640 -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
646 +checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f"
647 dependencies = [
648 + "displaydoc",
649 "icu_collections",
650 "icu_locale_core",
651 "icu_properties_data",
@@ -649,15 +656,15 @@ dependencies = [
656
657 [[package]]
658 name = "icu_properties_data"
652 -version = "2.2.0"
659 +version = "2.4.0"
660 source = "registry+https://github.com/rust-lang/crates.io-index"
654 -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
661 +checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf"
662
663 [[package]]
664 name = "icu_provider"
658 -version = "2.2.0"
665 +version = "2.4.0"
666 source = "registry+https://github.com/rust-lang/crates.io-index"
660 -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
667 +checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514"
668 dependencies = [
669 "displaydoc",
670 "icu_locale_core",
@@ -691,9 +698,9 @@ dependencies = [
698
699 [[package]]
700 name = "ipnet"
694 -version = "2.12.0"
701 +version = "2.12.2"
702 source = "registry+https://github.com/rust-lang/crates.io-index"
696 -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
703 +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0"
704
705 [[package]]
706 name = "is_terminal_polyfill"
@@ -718,9 +725,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
725
726 [[package]]
727 name = "js-sys"
721 -version = "0.3.103"
728 +version = "0.3.106"
729 source = "registry+https://github.com/rust-lang/crates.io-index"
723 -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
730 +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5"
731 dependencies = [
732 "cfg-if",
733 "futures-util",
@@ -729,15 +736,15 @@ dependencies = [
736
737 [[package]]
738 name = "lazy_static"
732 -version = "1.5.0"
739 +version = "1.5.1"
740 source = "registry+https://github.com/rust-lang/crates.io-index"
734 -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
741 +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb"
742
743 [[package]]
744 name = "libc"
738 -version = "0.2.189"
745 +version = "0.2.191"
746 source = "registry+https://github.com/rust-lang/crates.io-index"
740 -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
747 +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
748
749 [[package]]
750 name = "libloading"
@@ -751,15 +758,15 @@ dependencies = [
758
759 [[package]]
760 name = "litemap"
754 -version = "0.8.2"
761 +version = "0.8.3"
762 source = "registry+https://github.com/rust-lang/crates.io-index"
756 -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
763 +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae"
764
765 [[package]]
766 name = "log"
760 -version = "0.4.33"
767 +version = "0.4.34"
768 source = "registry+https://github.com/rust-lang/crates.io-index"
762 -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
769 +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6"
770
771 [[package]]
772 name = "loom"
@@ -778,15 +785,15 @@ dependencies = [
785
786 [[package]]
787 name = "lru-slab"
781 -version = "0.1.2"
788 +version = "0.1.3"
789 source = "registry+https://github.com/rust-lang/crates.io-index"
783 -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
790 +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f"
791
792 [[package]]
793 name = "magnus"
787 -version = "0.7.1"
794 +version = "0.8.4"
795 source = "registry+https://github.com/rust-lang/crates.io-index"
789 -checksum = "3d87ae53030f3a22e83879e666cb94e58a7bdf31706878a0ba48752994146dab"
796 +checksum = "e76237a607e1dea288dd0ef0c6c8f49037df2152d14bb52b3542c46522d9e6fc"
797 dependencies = [
798 "magnus-macros",
799 "rb-sys",
@@ -796,9 +803,9 @@ dependencies = [
803
804 [[package]]
805 name = "magnus-macros"
799 -version = "0.6.0"
806 +version = "0.8.0"
807 source = "registry+https://github.com/rust-lang/crates.io-index"
801 -checksum = "5968c820e2960565f647819f5928a42d6e874551cab9d88d75e3e0660d7f71e3"
808 +checksum = "47607461fd8e1513cb4f2076c197d8092d921a1ea75bd08af97398f593751892"
809 dependencies = [
810 "proc-macro2",
811 "quote",
@@ -834,9 +841,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
841
842 [[package]]
843 name = "mio"
837 -version = "1.2.2"
844 +version = "1.2.4"
845 source = "registry+https://github.com/rust-lang/crates.io-index"
839 -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427"
846 +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee"
847 dependencies = [
848 "libc",
849 "wasi",
@@ -903,9 +910,9 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
910
911 [[package]]
912 name = "potential_utf"
906 -version = "0.1.5"
913 +version = "0.1.6"
914 source = "registry+https://github.com/rust-lang/crates.io-index"
908 -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
915 +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661"
916 dependencies = [
917 "zerovec",
918 ]
@@ -945,9 +952,9 @@ dependencies = [
952
953 [[package]]
954 name = "quinn"
948 -version = "0.11.11"
955 +version = "0.11.12"
956 source = "registry+https://github.com/rust-lang/crates.io-index"
950 -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8"
957 +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11"
958 dependencies = [
959 "bytes",
960 "cfg_aliases",
@@ -965,9 +972,9 @@ dependencies = [
972
973 [[package]]
974 name = "quinn-proto"
968 -version = "0.11.16"
975 +version = "0.11.19"
976 source = "registry+https://github.com/rust-lang/crates.io-index"
970 -checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560"
977 +checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe"
978 dependencies = [
979 "bytes",
980 "getrandom 0.4.3",
@@ -987,9 +994,9 @@ dependencies = [
994
995 [[package]]
996 name = "quinn-udp"
990 -version = "0.5.15"
997 +version = "0.5.16"
998 source = "registry+https://github.com/rust-lang/crates.io-index"
992 -checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694"
999 +checksum = "af66907df18639dcf4db56ca65490cabc4b27a97dbadd96f2926cca73298f016"
1000 dependencies = [
1001 "cfg_aliases",
1002 "libc",
@@ -1016,9 +1023,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
1023
1024 [[package]]
1025 name = "rand"
1019 -version = "0.10.2"
1026 +version = "0.10.3"
1027 source = "registry+https://github.com/rust-lang/crates.io-index"
1021 -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
1028 +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af"
1029 dependencies = [
1030 "chacha20",
1031 "getrandom 0.4.3",
@@ -1042,18 +1049,18 @@ dependencies = [
1049
1050 [[package]]
1051 name = "rb-sys"
1045 -version = "0.9.128"
1052 +version = "0.9.130"
1053 source = "registry+https://github.com/rust-lang/crates.io-index"
1047 -checksum = "45ca28513560e56cfb79a62b1fce363c73af170a182024ce880c77ee9429920a"
1054 +checksum = "02faf625bb10ba893e3ae620f19c9fb1b5f8fcae0fe4eb86bb3f2230fad75edb"
1055 dependencies = [
1056 "rb-sys-build",
1057 ]
1058
1059 [[package]]
1060 name = "rb-sys-build"
1054 -version = "0.9.128"
1061 +version = "0.9.130"
1062 source = "registry+https://github.com/rust-lang/crates.io-index"
1056 -checksum = "ce04b2c55eff3a21aaa623fcc655d94373238e72cac6b3e1a3641ff31649f99a"
1063 +checksum = "05be6f9c86fe5482808162826f6c047d093b3670582296c770de1d94f8066694"
1064 dependencies = [
1065 "bindgen",
1066 "lazy_static",
@@ -1066,9 +1073,9 @@ dependencies = [
1073
1074 [[package]]
1075 name = "rb-sys-env"
1069 -version = "0.1.2"
1076 +version = "0.2.3"
1077 source = "registry+https://github.com/rust-lang/crates.io-index"
1071 -checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb"
1078 +checksum = "cca7ad6a7e21e72151d56fe2495a259b5670e204c3adac41ee7ef676ea08117a"
1079
1080 [[package]]
1081 name = "regex"
@@ -1084,9 +1091,9 @@ dependencies = [
1091
1092 [[package]]
1093 name = "regex-automata"
1087 -version = "0.4.16"
1094 +version = "0.4.18"
1095 source = "registry+https://github.com/rust-lang/crates.io-index"
1089 -checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
1096 +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
1097 dependencies = [
1098 "aho-corasick",
1099 "memchr",
@@ -1105,7 +1112,7 @@ version = "0.12.28"
1112 source = "registry+https://github.com/rust-lang/crates.io-index"
1113 checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
1114 dependencies = [
1108 - "base64",
1115 + "base64 0.22.1",
1116 "bytes",
1117 "futures-core",
1118 "http",
@@ -1160,9 +1167,9 @@ checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
1167
1168 [[package]]
1169 name = "rustls"
1163 -version = "0.23.43"
1170 +version = "0.23.46"
1171 source = "registry+https://github.com/rust-lang/crates.io-index"
1165 -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06"
1172 +checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf"
1173 dependencies = [
1174 "once_cell",
1175 "ring",
@@ -1174,9 +1181,9 @@ dependencies = [
1181
1182 [[package]]
1183 name = "rustls-native-certs"
1177 -version = "0.8.4"
1184 +version = "0.8.5"
1185 source = "registry+https://github.com/rust-lang/crates.io-index"
1179 -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d"
1186 +checksum = "4a073f5dc7469f984c52ad2752b63b0807745133b6de880b7b64c1ac4c48aec4"
1187 dependencies = [
1188 "openssl-probe",
1189 "rustls-pki-types",
@@ -1196,9 +1203,9 @@ dependencies = [
1203
1204 [[package]]
1205 name = "rustls-webpki"
1199 -version = "0.103.13"
1206 +version = "0.103.16"
1207 source = "registry+https://github.com/rust-lang/crates.io-index"
1201 -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
1208 +checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281"
1209 dependencies = [
1210 "ring",
1211 "rustls-pki-types",
@@ -1228,9 +1235,9 @@ dependencies = [
1235
1236 [[package]]
1237 name = "schannel"
1231 -version = "0.1.29"
1238 +version = "0.1.30"
1239 source = "registry+https://github.com/rust-lang/crates.io-index"
1233 -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939"
1240 +checksum = "9cb23c424d8ee841bb4d813677ca237e2a610067d594fec130f87d6093495ab5"
1241 dependencies = [
1242 "windows-sys 0.61.2",
1243 ]
@@ -1247,7 +1254,7 @@ version = "3.7.0"
1254 source = "registry+https://github.com/rust-lang/crates.io-index"
1255 checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
1256 dependencies = [
1250 - "bitflags 2.13.1",
1257 + "bitflags 2.13.2",
1258 "core-foundation",
1259 "core-foundation-sys",
1260 "libc",
@@ -1297,14 +1304,14 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
1304 dependencies = [
1305 "proc-macro2",
1306 "quote",
1300 - "syn 3.0.3",
1307 + "syn 3.0.9",
1308 ]
1309
1310 [[package]]
1311 name = "serde_json"
1305 -version = "1.0.151"
1312 +version = "1.0.154"
1313 source = "registry+https://github.com/rust-lang/crates.io-index"
1307 -checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
1314 +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6"
1315 dependencies = [
1316 "itoa",
1317 "memchr",
@@ -1321,7 +1328,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906"
1328 dependencies = [
1329 "proc-macro2",
1330 "quote",
1324 - "syn 3.0.3",
1331 + "syn 3.0.9",
1332 ]
1333
1334 [[package]]
@@ -1371,13 +1378,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
1378
1379 [[package]]
1380 name = "smallvec"
1374 -version = "1.15.2"
1381 +version = "1.16.4"
1382 source = "registry+https://github.com/rust-lang/crates.io-index"
1376 -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
1383 +checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8"
1384
1385 [[package]]
1386 name = "smbcloud-email-sdk"
1380 -version = "0.4.13"
1387 +version = "0.7.6"
1388 +source = "registry+https://github.com/rust-lang/crates.io-index"
1389 +checksum = "402b24ba82e12cb3fd502e2246c8cec8a638c7ff01b3864039902e7a2d1fe0f9"
1390 dependencies = [
1391 "log",
1392 "reqwest",
@@ -1391,7 +1400,9 @@ dependencies = [
1400
1401 [[package]]
1402 name = "smbcloud-model"
1394 -version = "0.4.13"
1403 +version = "0.7.6"
1404 +source = "registry+https://github.com/rust-lang/crates.io-index"
1405 +checksum = "c622460c12691c7318a93eaf0b8d56d3365de8ccf8a1391cd1cc4cbad5077ba7"
1406 dependencies = [
1407 "chrono",
1408 "log",
@@ -1407,9 +1418,11 @@ dependencies = [
1418
1419 [[package]]
1420 name = "smbcloud-network"
1410 -version = "0.4.13"
1421 +version = "0.7.6"
1422 +source = "registry+https://github.com/rust-lang/crates.io-index"
1423 +checksum = "dae0c7939392a434d1a099cb7091a4b440f13656a3d7901448e190f32746a23d"
1424 dependencies = [
1412 - "clap 4.6.4",
1425 + "clap 4.6.7",
1426 "log",
1427 "reqwest",
1428 "serde",
@@ -1560,9 +1573,9 @@ dependencies = [
1573
1574 [[package]]
1575 name = "syn"
1563 -version = "3.0.3"
1576 +version = "3.0.9"
1577 source = "registry+https://github.com/rust-lang/crates.io-index"
1565 -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3"
1578 +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
1579 dependencies = [
1580 "proc-macro2",
1581 "quote",
@@ -1580,13 +1593,13 @@ dependencies = [
1593
1594 [[package]]
1595 name = "synstructure"
1583 -version = "0.13.2"
1596 +version = "0.14.0"
1597 source = "registry+https://github.com/rust-lang/crates.io-index"
1585 -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
1598 +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02"
1599 dependencies = [
1600 "proc-macro2",
1601 "quote",
1589 - "syn 2.0.119",
1602 + "syn 3.0.9",
1603 ]
1604
1605 [[package]]
@@ -1600,22 +1613,22 @@ dependencies = [
1613
1614 [[package]]
1615 name = "thiserror"
1603 -version = "2.0.19"
1616 +version = "2.0.21"
1617 source = "registry+https://github.com/rust-lang/crates.io-index"
1605 -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9"
1618 +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
1619 dependencies = [
1620 "thiserror-impl",
1621 ]
1622
1623 [[package]]
1624 name = "thiserror-impl"
1612 -version = "2.0.19"
1625 +version = "2.0.21"
1626 source = "registry+https://github.com/rust-lang/crates.io-index"
1614 -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd"
1627 +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
1628 dependencies = [
1629 "proc-macro2",
1630 "quote",
1618 - "syn 3.0.3",
1631 + "syn 3.0.9",
1632 ]
1633
1634 [[package]]
@@ -1629,9 +1642,9 @@ dependencies = [
1642
1643 [[package]]
1644 name = "tinystr"
1632 -version = "0.8.3"
1645 +version = "0.8.5"
1646 source = "registry+https://github.com/rust-lang/crates.io-index"
1634 -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
1647 +checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a"
1648 dependencies = [
1649 "displaydoc",
1650 "zerovec",
@@ -1639,24 +1652,15 @@ dependencies = [
1652
1653 [[package]]
1654 name = "tinyvec"
1642 -version = "1.12.0"
1643 -source = "registry+https://github.com/rust-lang/crates.io-index"
1644 -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f"
1645 -dependencies = [
1646 - "tinyvec_macros",
1647 -]
1648 -
1649 -[[package]]
1650 -name = "tinyvec_macros"
1651 -version = "0.1.1"
1655 +version = "1.13.3"
1656 source = "registry+https://github.com/rust-lang/crates.io-index"
1653 -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1657 +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee"
1658
1659 [[package]]
1660 name = "tokio"
1657 -version = "1.53.1"
1661 +version = "1.54.1"
1662 source = "registry+https://github.com/rust-lang/crates.io-index"
1659 -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed"
1663 +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3"
1664 dependencies = [
1665 "bytes",
1666 "libc",
@@ -1668,9 +1672,9 @@ dependencies = [
1672
1673 [[package]]
1674 name = "tokio-rustls"
1671 -version = "0.26.4"
1675 +version = "0.26.6"
1676 source = "registry+https://github.com/rust-lang/crates.io-index"
1673 -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
1677 +checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db"
1678 dependencies = [
1679 "rustls",
1680 "tokio",
@@ -1697,7 +1701,7 @@ version = "0.6.11"
1701 source = "registry+https://github.com/rust-lang/crates.io-index"
1702 checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
1703 dependencies = [
1700 - "bitflags 2.13.1",
1704 + "bitflags 2.13.2",
1705 "bytes",
1706 "futures-util",
1707 "http",
@@ -1812,9 +1816,9 @@ checksum = "8acc9e35a3072d9ea375093f321b3738ea3ac4fdebc18d2789b01581e5c2e4ae"
1816
1817 [[package]]
1818 name = "unicode-ident"
1815 -version = "1.0.24"
1819 +version = "1.0.27"
1820 source = "registry+https://github.com/rust-lang/crates.io-index"
1817 -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
1821 +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
1822
1823 [[package]]
1824 name = "unicode-segmentation"
@@ -1888,9 +1892,9 @@ dependencies = [
1892
1893 [[package]]
1894 name = "want"
1891 -version = "0.3.1"
1895 +version = "0.3.2"
1896 source = "registry+https://github.com/rust-lang/crates.io-index"
1893 -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
1897 +checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b"
1898 dependencies = [
1899 "try-lock",
1900 ]
@@ -1903,9 +1907,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
1907
1908 [[package]]
1909 name = "wasm-bindgen"
1906 -version = "0.2.126"
1910 +version = "0.2.129"
1911 source = "registry+https://github.com/rust-lang/crates.io-index"
1908 -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
1912 +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409"
1913 dependencies = [
1914 "cfg-if",
1915 "once_cell",
@@ -1916,19 +1920,20 @@ dependencies = [
1920
1921 [[package]]
1922 name = "wasm-bindgen-futures"
1919 -version = "0.4.76"
1923 +version = "0.4.79"
1924 source = "registry+https://github.com/rust-lang/crates.io-index"
1921 -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d"
1925 +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e"
1926 dependencies = [
1927 "js-sys",
1928 + "tokio",
1929 "wasm-bindgen",
1930 ]
1931
1932 [[package]]
1933 name = "wasm-bindgen-macro"
1929 -version = "0.2.126"
1934 +version = "0.2.129"
1935 source = "registry+https://github.com/rust-lang/crates.io-index"
1931 -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
1936 +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535"
1937 dependencies = [
1938 "quote",
1939 "wasm-bindgen-macro-support",
@@ -1936,31 +1941,31 @@ dependencies = [
1941
1942 [[package]]
1943 name = "wasm-bindgen-macro-support"
1939 -version = "0.2.126"
1944 +version = "0.2.129"
1945 source = "registry+https://github.com/rust-lang/crates.io-index"
1941 -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
1946 +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7"
1947 dependencies = [
1948 "bumpalo",
1949 "proc-macro2",
1950 "quote",
1946 - "syn 2.0.119",
1951 + "syn 3.0.9",
1952 "wasm-bindgen-shared",
1953 ]
1954
1955 [[package]]
1956 name = "wasm-bindgen-shared"
1952 -version = "0.2.126"
1957 +version = "0.2.129"
1958 source = "registry+https://github.com/rust-lang/crates.io-index"
1954 -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
1959 +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6"
1960 dependencies = [
1961 "unicode-ident",
1962 ]
1963
1964 [[package]]
1965 name = "web-sys"
1961 -version = "0.3.103"
1966 +version = "0.3.106"
1967 source = "registry+https://github.com/rust-lang/crates.io-index"
1963 -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141"
1968 +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4"
1969 dependencies = [
1970 "js-sys",
1971 "wasm-bindgen",
@@ -1978,9 +1983,9 @@ dependencies = [
1983
1984 [[package]]
1985 name = "webpki-roots"
1981 -version = "1.0.9"
1986 +version = "1.0.11"
1987 source = "registry+https://github.com/rust-lang/crates.io-index"
1983 -checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a"
1988 +checksum = "f5f280bbb2b287bc8e7de7e3852945a0ff50d1bbcb5ed42b6c7a568c546df171"
1989 dependencies = [
1990 "rustls-pki-types",
1991 ]
@@ -2225,15 +2230,15 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2230
2231 [[package]]
2232 name = "writeable"
2228 -version = "0.6.3"
2233 +version = "0.6.4"
2234 source = "registry+https://github.com/rust-lang/crates.io-index"
2230 -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
2235 +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
2236
2237 [[package]]
2238 name = "yoke"
2234 -version = "0.8.3"
2239 +version = "0.8.4"
2240 source = "registry+https://github.com/rust-lang/crates.io-index"
2236 -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
2241 +checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3"
2242 dependencies = [
2243 "stable_deref_trait",
2244 "yoke-derive",
@@ -2242,13 +2247,13 @@ dependencies = [
2247
2248 [[package]]
2249 name = "yoke-derive"
2245 -version = "0.8.2"
2250 +version = "0.8.4"
2251 source = "registry+https://github.com/rust-lang/crates.io-index"
2247 -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
2252 +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71"
2253 dependencies = [
2254 "proc-macro2",
2255 "quote",
2251 - "syn 2.0.119",
2256 + "syn 3.0.9",
2257 "synstructure",
2258 ]
2259
@@ -2263,27 +2268,27 @@ dependencies = [
2268
2269 [[package]]
2270 name = "zerofrom-derive"
2266 -version = "0.1.7"
2271 +version = "0.1.8"
2272 source = "registry+https://github.com/rust-lang/crates.io-index"
2268 -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
2273 +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a"
2274 dependencies = [
2275 "proc-macro2",
2276 "quote",
2272 - "syn 2.0.119",
2277 + "syn 3.0.9",
2278 "synstructure",
2279 ]
2280
2281 [[package]]
2282 name = "zeroize"
2278 -version = "1.9.0"
2283 +version = "1.9.1"
2284 source = "registry+https://github.com/rust-lang/crates.io-index"
2280 -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
2285 +checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879"
2286
2287 [[package]]
2288 name = "zerotrie"
2284 -version = "0.2.4"
2289 +version = "0.2.5"
2290 source = "registry+https://github.com/rust-lang/crates.io-index"
2286 -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
2291 +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f"
2292 dependencies = [
2293 "displaydoc",
2294 "yoke",
@@ -2292,9 +2297,9 @@ dependencies = [
2297
2298 [[package]]
2299 name = "zerovec"
2295 -version = "0.11.6"
2300 +version = "0.11.9"
2301 source = "registry+https://github.com/rust-lang/crates.io-index"
2297 -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
2302 +checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40"
2303 dependencies = [
2304 "yoke",
2305 "zerofrom",
@@ -2303,13 +2308,13 @@ dependencies = [
2308
2309 [[package]]
2310 name = "zerovec-derive"
2306 -version = "0.11.3"
2311 +version = "0.11.7"
2312 source = "registry+https://github.com/rust-lang/crates.io-index"
2308 -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
2313 +checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a"
2314 dependencies = [
2315 "proc-macro2",
2316 "quote",
2312 - "syn 2.0.119",
2317 + "syn 3.0.9",
2318 ]
2319
2320 [[package]]
sdk/gems/email/Cargo.toml
-6
@@ -6,9 +6,3 @@
6 members = ["./ext/email"]
7 resolver = "2"
8
9 -# For local development, build the native extension against the in-repo SDK crate
10 -# rather than the published one. The release tooling publishes smbcloud-email-sdk
11 -# first, after which the version dependency in ext/email/Cargo.toml resolves from
12 -# crates.io and this patch is a no-op.
13 -[patch.crates-io]
14 -smbcloud-email-sdk = { path = "../../../crates/smbcloud-email-sdk" }
sdk/gems/email/Gemfile.lock
+2 -2
@@ -3,7 +3,7 @@ PATH
3 specs:
4 smbcloud-email (0.7.6)
5 json
6 - rb_sys (~> 0.9.91)
6 + rb_sys (~> 0.9, >= 0.9.130)
7
8 GEM
9 remote: https://rubygems.org/
@@ -13,7 +13,7 @@ GEM
13 rake-compiler (1.3.1)
14 rake
15 rake-compiler-dock (1.12.0)
16 - rb_sys (0.9.128)
16 + rb_sys (0.9.130)
17 rake-compiler-dock (= 1.12.0)
18
19 PLATFORMS
sdk/gems/email/Rakefile
+2
@@ -9,6 +9,8 @@ GEMSPEC = Gem::Specification.load('email.gemspec')
9
10 RbSys::ExtensionTask.new('email', GEMSPEC) do |ext|
11 ext.lib_dir = 'lib/email'
12 + ext.cross_compile = true
13 + ext.cross_platform = %w[x86_64-linux aarch64-linux arm64-darwin x86_64-darwin]
14 end
15
16 task default: :compile
sdk/gems/email/email.gemspec
+5 -2
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24 spec.files = IO.popen(%w[git ls-files -z], chdir: __dir__, err: IO::NULL) do |ls|
25 ls.readlines("\x0", chomp: true).reject do |f|
26 (f == gemspec) ||
27 - f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile])
27 + f.start_with?(*%w[bin/ test/ spec/ features/ .git .ruby-version .rubocop.yml appveyor Gemfile])
28 end
29 end
30 spec.bindir = 'exe'
@@ -33,5 +33,8 @@ Gem::Specification.new do |spec|
33 spec.extensions = ['ext/email/extconf.rb']
34
35 spec.add_dependency 'json'
36 - spec.add_dependency 'rb_sys', '~> 0.9.91'
36 + # 0.9.130 is the first rb_sys that gives darwin bundles a non-empty install
37 + # name. Older versions run `install_name_tool -id ""`, which dyld on macOS 15+
38 + # rejects, so the extension fails to load.
39 + spec.add_dependency 'rb_sys', '~> 0.9', '>= 0.9.130'
40 end
sdk/gems/email/ext/email/Cargo.toml
+2 -2
@@ -9,10 +9,10 @@ publish = false
9 crate-type = ["cdylib"]
10
11 [dependencies]
12 -magnus = { version = "0.7.1" }
12 +magnus = "0.8"
13 serde_json = "1"
14 tokio = { version = "1", features = ["rt-multi-thread"] }
15
16 # The published transactional-email SDK. For local development this is patched
17 # to the in-repo crate via `[patch.crates-io]` in the gem workspace Cargo.toml.
18 -smbcloud-email-sdk = { version = "0.4" }
18 +smbcloud-email-sdk = { version = "0.7" }
sdk/gems/email/ext/email/build.rs deleted
-11
@@ -1,11 +0,0 @@
1 -fn main() {
2 - // On macOS, a Rust `cdylib` is emitted with an empty LC_ID_DYLIB install
3 - // name. The dyld in macOS 15+/Tahoe (Darwin 27) validates this strictly and
4 - // refuses to load the resulting `.bundle` with:
5 - // "load command #4 string extends beyond end of load command"
6 - // Give the dylib a valid install name at link time so the Ruby extension
7 - // loads on the stricter loader.
8 - if std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("macos") {
9 - println!("cargo:rustc-cdylib-link-arg=-Wl,-install_name,@rpath/email.bundle");
10 - }
11 -}
sdk/gems/email/ext/email/src/lib.rs
+10 -4
@@ -2,10 +2,16 @@ use magnus::{function, prelude::*, Error, Ruby};
2 use smbcloud_email_sdk::{EmailClient, EmailCredentials, Environment, SendEmail};
3 use tokio::runtime::Runtime;
4
5 +// Every helper here runs on the Ruby thread that called into the extension
6 +// (tokio's `block_on` stays on the calling thread), so the handle is available.
7 +fn ruby() -> Ruby {
8 + Ruby::get().expect("smbcloud-email called outside a Ruby thread")
9 +}
10 +
11 fn parse_environment(value: String) -> Result<Environment, Error> {
12 value.parse().map_err(|_| {
13 Error::new(
8 - magnus::exception::arg_error(),
14 + ruby().exception_arg_error(),
15 format!("invalid environment `{value}`, expected `dev` or `production`"),
16 )
17 })
@@ -17,7 +23,7 @@ where
23 {
24 let runtime = Runtime::new().map_err(|err| {
25 Error::new(
20 - magnus::exception::runtime_error(),
26 + ruby().exception_runtime_error(),
27 format!("failed to initialize tokio runtime: {err}"),
28 )
29 })?;
@@ -25,7 +31,7 @@ where
31 }
32
33 fn runtime_error(message: impl std::fmt::Display) -> Error {
28 - Error::new(magnus::exception::runtime_error(), message.to_string())
34 + Error::new(ruby().exception_runtime_error(), message.to_string())
35 }
36
37 fn client(environment: Environment, api_key: &str) -> EmailClient {
@@ -37,7 +43,7 @@ fn client(environment: Environment, api_key: &str) -> EmailClient {
43 fn send_json(environment: String, api_key: String, message_json: String) -> Result<String, Error> {
44 let env = parse_environment(environment)?;
45 let message: SendEmail = serde_json::from_str(&message_json)
40 - .map_err(|err| Error::new(magnus::exception::arg_error(), format!("invalid message: {err}")))?;
46 + .map_err(|err| Error::new(ruby().exception_arg_error(), format!("invalid message: {err}")))?;
47
48 with_runtime(|runtime| {
49 match runtime.block_on(client(env, &api_key).send(&message)) {
sdk/gems/email/lib/email.rb
+8 -1
@@ -2,7 +2,14 @@
2
3 require 'json'
4 require_relative 'email/version'
5 -require_relative 'email/email'
5 +# Fat native gems ship one extension per Ruby minor (lib/email/3.4/email.bundle);
6 +# source and single-ABI builds put it directly under lib/email/.
7 +begin
8 + RUBY_VERSION =~ /(\d+\.\d+)/
9 + require_relative "email/#{Regexp.last_match(1)}/email"
10 +rescue LoadError
11 + require_relative 'email/email'
12 +end
13
14 module Email
15 end