From d032cec0b242803be043c76c8c22b907f081b89e Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 27 Aug 2026 20:46:23 +0700 Subject: [PATCH] fix garageS3 --- Manifest.toml | 230 +++++++++++++++++++++++++++++++----------------- Project.toml | 4 + src/garageS3.jl | 131 +++++++++++++++++++++++++-- 3 files changed, 279 insertions(+), 86 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index 03d6c68..8f7a5ff 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,8 +1,20 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.12.6" +julia_version = "1.12.7" manifest_format = "2.0" -project_hash = "a1c572efdd97cec1f432040f02784b67635102aa" +project_hash = "4450296e6bb4e5e245de62f43b73b263b215aa5d" + +[[deps.AWS]] +deps = ["Base64", "Compat", "Dates", "Downloads", "GitHub", "HTTP", "IniFile", "JSON", "MD5", "Mocking", "OrderedCollections", "Random", "SHA", "ScopedValues", "Sockets", "URIs", "UUIDs", "XMLDict"] +git-tree-sha1 = "842075b12a7f763c5f815a04037a99b6ac346df9" +uuid = "fbe9abb3-538b-5e4e-ba9e-bc94f4f92ebc" +version = "1.99.0" + +[[deps.AWSS3]] +deps = ["AWS", "ArrowTypes", "Base64", "Compat", "Dates", "EzXML", "FilePathsBase", "HTTP", "MbedTLS", "Mocking", "OrderedCollections", "Retry", "SymDict", "URIs", "UUIDs", "XMLDict"] +git-tree-sha1 = "af99cea71364c8c4483405a6b03697d197ab4d3b" +uuid = "1c724243-ef5b-51ab-93f4-b0a88ac62a95" +version = "0.11.6" [[deps.Accessors]] deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] @@ -74,9 +86,9 @@ version = "1.11.0" [[deps.CSV]] deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] -git-tree-sha1 = "8d8e0b0f350b8e1c91420b5e64e5de774c2f0f4d" +git-tree-sha1 = "abed1e735dd4152f48c90cf0767e1790e25f332f" uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -version = "0.10.16" +version = "0.10.17" [[deps.CodeTracking]] deps = ["InteractiveUtils", "REPL", "UUIDs"] @@ -92,14 +104,15 @@ version = "0.3.4" [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +git-tree-sha1 = "970758a3d591a2a5c2a907c53f2e2f8c1b1d3537" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.8" +version = "0.7.9" [[deps.CommonSolve]] -git-tree-sha1 = "eeaad7cef88554c2fa56b5a3f71cfd5cb708c662" +deps = ["PrecompileTools"] +git-tree-sha1 = "6c389fa857f6ca5a95474b52a52023fd77f24cb7" uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.11" +version = "0.2.14" [[deps.Compat]] deps = ["TOML", "UUIDs"] @@ -119,7 +132,7 @@ version = "0.1.1" [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.3.0+1" +version = "1.3.1+2" [[deps.CompositionsBase]] git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" @@ -146,14 +159,14 @@ version = "1.6.0" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" [[deps.Crayons]] -git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +git-tree-sha1 = "54b76cbb40d9a0f5368c880725b2f141da77c94f" uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" -version = "4.1.1" +version = "4.2.0" [[deps.DBInterface]] -git-tree-sha1 = "a444404b3f94deaa43ca2a58e18153a82695282b" +git-tree-sha1 = "265d7f87f329c063cbde41920f9d00713a43cedd" uuid = "a10d1c49-ce27-4219-8d33-6db1a4562965" -version = "2.6.1" +version = "2.7.0" [[deps.DataAPI]] git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" @@ -168,9 +181,9 @@ version = "1.8.2" [[deps.DataStructures]] deps = ["OrderedCollections"] -git-tree-sha1 = "6fb53a69613a0b2b68a0d12671717d307ab8b24e" +git-tree-sha1 = "b0bc6d2cad1fed8b7fd59a1551a991cb3d2809e6" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.19.5" +version = "0.19.6" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -208,9 +221,9 @@ version = "1.11.0" [[deps.Distributions]] deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "cd3c5ac74cd3923c8945c6a81518c46abd0e73a3" +git-tree-sha1 = "a958ab3a40c755563f5e1405c0846cb0446bf19d" uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.129" +version = "0.25.131" [deps.Distributions.extensions] DistributionsChainRulesCoreExt = "ChainRulesCore" @@ -240,9 +253,15 @@ uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" version = "1.0.7" [[deps.ExprTools]] -git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +git-tree-sha1 = "d2e49e7efd29719d6f28b891b0e0e159daa9d2b4" uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.10" +version = "0.1.11" + +[[deps.EzXML]] +deps = ["Printf", "XML2_jll"] +git-tree-sha1 = "7ea1aa5869e2626ccae84480e4f37185bc6f41d3" +uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615" +version = "1.2.3" [[deps.FilePathsBase]] deps = ["Compat", "Dates"] @@ -261,9 +280,9 @@ version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] -git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3" +git-tree-sha1 = "5bad39456d9f0166184fce2248783dd9862645c1" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.16.0" +version = "1.17.0" weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"] [deps.FillArrays.extensions] @@ -278,15 +297,22 @@ uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" version = "1.11.0" [[deps.Gamma]] -git-tree-sha1 = "86f86b6168a016ed88e4ae4e64577b98c3b59e8e" +deps = ["LogExpFunctions"] +git-tree-sha1 = "becc397f7cfb06e343496ae6ffb04818a851da51" uuid = "a0844989-3bd2-4988-8bea-c9407ab0941b" -version = "1.1.0" +version = "1.2.0" [[deps.GeneralUtils]] -deps = ["CSV", "DataFrames", "DataStructures", "Dates", "Distributions", "Graphs", "HTTP", "JSON", "LibPQ", "NATS", "PrettyPrinting", "Random", "Revise", "SHA", "StringDistances", "UUIDs"] +deps = ["AWS", "AWSS3", "CSV", "DataFrames", "DataStructures", "Dates", "Distributions", "Graphs", "HTTP", "JSON", "LibPQ", "NATS", "PrettyPrinting", "Random", "Revise", "SHA", "StringDistances", "UUIDs"] path = "." uuid = "c6c72f09-b708-4ac8-ac7c-2084d70108fe" -version = "0.4.10" +version = "0.6.0" + +[[deps.GitHub]] +deps = ["Base64", "Dates", "HTTP", "JSON", "MbedTLS", "Sockets", "SodiumSeal", "URIs"] +git-tree-sha1 = "33de1bc5665494f0a9669fd6027e28180709d874" +uuid = "bc5e4493-9b4d-5f90-b8aa-2b2bcaad7a26" +version = "5.13.0" [[deps.Graphs]] deps = ["ArnoldiMethod", "DataStructures", "Inflate", "LinearAlgebra", "Random", "SimpleTraits", "SparseArrays", "Statistics"] @@ -303,9 +329,9 @@ version = "1.14.0" [[deps.HTTP]] deps = ["Base64", "CodecZlib", "Dates", "EnumX", "PrecompileTools", "Random", "Reseau", "SHA", "URIs", "UUIDs", "Zlib_jll"] -git-tree-sha1 = "c2c808326222b6dc4bec295a83b55f79aeec98e0" +git-tree-sha1 = "d6e390d1515836237b837fb7b6fca7ba1d752db6" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "2.5.5" +version = "2.6.5" [[deps.HashArrayMappedTries]] git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" @@ -314,9 +340,9 @@ version = "0.2.0" [[deps.HypergeometricFunctions]] deps = ["Gamma", "LinearAlgebra"] -git-tree-sha1 = "18d7deab5fb0440dc6a7b6993c5c27b25420de10" +git-tree-sha1 = "31bb6c92405c084617facc1d7ed9eb6c402d061e" uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.29" +version = "0.3.30" [[deps.ICU_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -335,6 +361,11 @@ git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" version = "0.1.5" +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + [[deps.InlineStrings]] git-tree-sha1 = "8f3d257792a522b4601c24a577954b0a8cd7334d" uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" @@ -394,9 +425,9 @@ version = "1.8.0" [[deps.JSON]] deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] -git-tree-sha1 = "c89d196f5ffb64bfbf80985b699ea913b0d2c211" +git-tree-sha1 = "c7345ab1a7ca4dc8a02c9f6510da0d9857bbe513" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "1.6.1" +version = "1.7.1" weakdeps = ["ArrowTypes"] [deps.JSON.extensions] @@ -414,9 +445,9 @@ weakdeps = ["ArrowTypes"] [[deps.JuliaInterpreter]] deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] -git-tree-sha1 = "58927c485919bf17ea308d9d82156de1adf4b006" +git-tree-sha1 = "c3d401f110454b4ea24a76be33f6ee0d7d385103" uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" -version = "0.10.12" +version = "0.11.4" [[deps.JuliaSyntaxHighlighting]] deps = ["StyledStrings"] @@ -430,9 +461,9 @@ uuid = "b39eb1a6-c29a-53d7-8c32-632cd16f18da" version = "1.21.3+0" [[deps.LaTeXStrings]] -git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +git-tree-sha1 = "f88f3ccef05a6a72a0cf0ed417c8fd68530f4ab2" uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.4.0" +version = "1.4.1" [[deps.LayerDicts]] git-tree-sha1 = "6087ad3521d6278ebe5c27ae55e7bbb15ca312cb" @@ -480,6 +511,12 @@ version = "1.11.3+1" uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" version = "1.11.0" +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -507,9 +544,15 @@ version = "1.11.0" [[deps.LoweredCodeUtils]] deps = ["CodeTracking", "Compiler", "JuliaInterpreter"] -git-tree-sha1 = "3733419e9a71156b389f3e331672d2e95436783f" +git-tree-sha1 = "1d4c737ab26f51ceed52ab2019c09b7660eb7440" uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" -version = "3.6.2" +version = "3.8.0" + +[[deps.MD5]] +deps = ["Random", "SHA"] +git-tree-sha1 = "1576f756617d31eb397a4a517b68562fd28dc2b4" +uuid = "6ac74813-4b46-53a4-afec-0b5dc9d7885c" +version = "0.2.3" [[deps.MacroTools]] git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" @@ -567,9 +610,9 @@ version = "0.1.1" [[deps.NanoDates]] deps = ["Dates", "Parsers"] -git-tree-sha1 = "850a0557ae5934f6e67ac0dc5ca13d0328422d1f" +git-tree-sha1 = "77c7e98ca39aefb481f9b97a2f4f5c5471c08a1d" uuid = "46f1a544-deae-4307-8689-c12aa3c955c6" -version = "1.0.3" +version = "1.1.0" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" @@ -599,7 +642,7 @@ version = "0.8.7+0" [[deps.OpenSSL_jll]] deps = ["Artifacts", "Libdl"] uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.4+0" +version = "3.5.6+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -608,15 +651,15 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.6+0" [[deps.OrderedCollections]] -git-tree-sha1 = "94ba93778373a53bfd5a0caaf7d809c445292ff4" +git-tree-sha1 = "05f45c2e0de6259db764adbfd2f1dc6d3f8de13c" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.8.2" +version = "2.0.1" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "26766d4b5f1a410c218a19b85a672c6edb693c65" +git-tree-sha1 = "123266c25174ef6c8d4718920abc206452cf8de6" uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.40" +version = "0.11.41" weakdeps = ["StatsBase"] [deps.PDMats.extensions] @@ -624,9 +667,9 @@ weakdeps = ["StatsBase"] [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "32a4e09c5f29402573d673901778a0e03b0807b9" +git-tree-sha1 = "3de8f5e6e90ebfa8d6d1f86997d6cdcd6a912ff3" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.8.6" +version = "2.8.7" [[deps.PooledArrays]] deps = ["DataAPI", "Future"] @@ -647,15 +690,15 @@ uuid = "21216c6a-2e73-6563-6e65-726566657250" version = "1.5.2" [[deps.PrettyPrinting]] -git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e" +git-tree-sha1 = "0b7f4ad437e31c51cf5b91fb103579b04025170a" uuid = "54e16d92-306c-5ea0-a30b-337be88ac337" -version = "0.4.2" +version = "0.4.3" [[deps.PrettyTables]] deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "ebf455bb866ee6737030e3d3816bb6a0683c4325" +git-tree-sha1 = "1b8aa19f229b1cea7fc93874a52e49db6a854450" uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "3.4.0" +version = "3.4.8" [deps.PrettyTables.extensions] PrettyTablesExcelExt = "XLSX" @@ -716,15 +759,20 @@ version = "1.3.1" [[deps.Reseau]] deps = ["NetworkOptions", "OpenSSL_jll", "PrecompileTools", "Random", "SHA"] -git-tree-sha1 = "0eab6d95ed40c2ef3992255c1c71e4f9748932b5" +git-tree-sha1 = "aaee74fab545e9af4b21d10c2203c93c636c4ae0" uuid = "802f3686-a58f-41ce-bb0c-3c43c75bba36" -version = "1.3.1" +version = "1.4.1" + +[[deps.Retry]] +git-tree-sha1 = "41ac127cd281bb33e42aba46a9d3b25cd35fc6d5" +uuid = "20febd7b-183b-5ae2-ac4a-720e7ce64774" +version = "0.4.1" [[deps.Revise]] -deps = ["CRC32c", "CodeTracking", "FileWatching", "InteractiveUtils", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Preferences", "REPL", "UUIDs"] -git-tree-sha1 = "27e3ee13fc8739a59b380d6163d6a82f52c03bd7" +deps = ["CRC32c", "CodeTracking", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Preferences", "REPL", "UUIDs"] +git-tree-sha1 = "f6ad10ad2fa1063c2ae0f75d17d92d1d0cae4c77" uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" -version = "3.15.1" +version = "3.16.5" weakdeps = ["Distributed"] [deps.Revise.extensions] @@ -738,15 +786,15 @@ version = "0.9.0" [[deps.Rmath_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +git-tree-sha1 = "6d40b2fe70437b01397d2a4d5b020008da4e7019" uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.5.1+0" +version = "0.5.2+0" [[deps.Roots]] deps = ["Accessors", "CommonSolve", "Printf"] -git-tree-sha1 = "125cbd31a56de53169c3eed9c17180bc6c245f83" +git-tree-sha1 = "13a9e0164267bb9ebc55c1c5d72fceea8f09555b" uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" -version = "3.0.4" +version = "3.0.7" [deps.Roots.extensions] RootsChainRulesCoreExt = "ChainRulesCore" @@ -811,6 +859,12 @@ git-tree-sha1 = "907703e0d50846f300650d7225bdcab145b7bca9" uuid = "4f5b5e99-b0ad-42cd-b47a-334e172ec8bd" version = "1.1.2" +[[deps.SodiumSeal]] +deps = ["Base64", "Libdl", "libsodium_jll"] +git-tree-sha1 = "80cef67d2953e33935b41c6ab0a178b9987b1c99" +uuid = "2133526b-2bfb-4018-ac12-889fb3908a75" +version = "0.1.1" + [[deps.SortingAlgorithms]] deps = ["DataStructures"] git-tree-sha1 = "13cd91cc9be159e3f4d95b857fa2aa383b53772a" @@ -824,9 +878,9 @@ version = "1.12.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "6547cbdd8ce32efba0d21c5a40fa96d1a3548f9f" +git-tree-sha1 = "429071b23f4c9a13fb6582f807cc2ef454082408" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.8.0" +version = "2.9.0" [deps.SpecialFunctions.extensions] SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" @@ -836,9 +890,9 @@ version = "2.8.0" [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db" +git-tree-sha1 = "fac51faf3bb96e8bc0bf6f9f39ca4955652776bb" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.18" +version = "1.9.19" [deps.StaticArrays.extensions] StaticArraysChainRulesCoreExt = "ChainRulesCore" @@ -871,15 +925,15 @@ version = "1.8.0" [[deps.StatsBase]] deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "e4d7a1a0edc20af42689ea6f4f3587a2175d50ee" +git-tree-sha1 = "adb9da019510162e67a4493fc235c23203d8b09e" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.12" +version = "0.34.13" [[deps.StatsFuns]] deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "770240df9a3b8888065046948f7a09b4e0f997d5" +git-tree-sha1 = "91a5737baed20ee31f3faea0e51f57461f6a689e" uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "2.2.0" +version = "2.2.1" [deps.StatsFuns.extensions] StatsFunsChainRulesCoreExt = "ChainRulesCore" @@ -891,15 +945,15 @@ version = "2.2.0" [[deps.StringDistances]] deps = ["Distances", "StatsAPI"] -git-tree-sha1 = "cd83a04baf746e3b43b83c61b7de77ab0409b80a" +git-tree-sha1 = "456f343c7a6c8f52d8b501c0da2a05538ab1b907" uuid = "88034a9c-02f8-509d-84a9-84ec65e18404" -version = "1.0.0" +version = "1.0.1" [[deps.StringManipulation]] deps = ["PrecompileTools"] -git-tree-sha1 = "d05693d339e37d6ab134c5ab53c29fce5ee5d7d5" +git-tree-sha1 = "773065c6e0e903924a9d838259be74338422aef2" uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" -version = "0.4.4" +version = "0.5.0" [[deps.StructTypes]] deps = ["Dates", "UUIDs"] @@ -909,9 +963,9 @@ version = "1.11.0" [[deps.StructUtils]] deps = ["Dates", "UUIDs"] -git-tree-sha1 = "82bee338d650aa515f31866c460cb7e3bcef90b8" +git-tree-sha1 = "2d0fc55c61321ba245c47be599570d11bac50303" uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" -version = "2.8.2" +version = "2.8.5" [deps.StructUtils.extensions] StructUtilsMeasurementsExt = ["Measurements"] @@ -936,6 +990,12 @@ deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" version = "7.8.3+2" +[[deps.SymDict]] +deps = ["Test"] +git-tree-sha1 = "0108ccdaea3ef69d9680eeafc8d5ad198b896ec8" +uuid = "2da68c74-98d7-5633-99d6-8493888d7b1e" +version = "0.3.0" + [[deps.TOML]] deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" @@ -943,9 +1003,9 @@ version = "1.0.3" [[deps.TZJData]] deps = ["Artifacts"] -git-tree-sha1 = "72df96b3a595b7aab1e101eb07d2a435963a97e2" +git-tree-sha1 = "d3b30a9f29a898e21fb4bdf280101b7a12e1f39c" uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" -version = "1.5.0+2025b" +version = "1.5.1+2025b" [[deps.TableTraits]] deps = ["IteratorInterfaceExtensions"] @@ -955,9 +1015,9 @@ version = "1.0.1" [[deps.Tables]] deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "0f38a06c83f0007bbab3cf911262841c9a0f07e0" +git-tree-sha1 = "a94d9bdda1b7bed0046cea645639ab3f62196fac" uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.13.0" +version = "1.14.0" [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] @@ -980,9 +1040,9 @@ uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" version = "0.11.3" [[deps.URIs]] -git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" +git-tree-sha1 = "908fec9df6c5de98548ead82a468c95ccf6cd263" uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.6.1" +version = "1.7.0" [[deps.UTCDateTimes]] deps = ["Dates", "TimeZones"] @@ -1010,6 +1070,18 @@ git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" version = "1.6.1" +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "3f3315d89fc954a28f5b471bce698ed6e27481be" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.15.3+0" + +[[deps.XMLDict]] +deps = ["EzXML", "IterTools", "OrderedCollections"] +git-tree-sha1 = "8e8cdc9c93e1f442eba471b56db6f86ffeb1a33a" +uuid = "228000da-037f-5747-90a9-8195ccbf91a5" +version = "0.4.2" + [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" diff --git a/Project.toml b/Project.toml index df9d4fe..a79abfe 100644 --- a/Project.toml +++ b/Project.toml @@ -4,6 +4,8 @@ version = "0.6.0" authors = ["tonaerospace "] [deps] +AWS = "fbe9abb3-538b-5e4e-ba9e-bc94f4f92ebc" +AWSS3 = "1c724243-ef5b-51ab-93f4-b0a88ac62a95" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" @@ -22,6 +24,8 @@ StringDistances = "88034a9c-02f8-509d-84a9-84ec65e18404" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [compat] +AWS = "1.99.0" +AWSS3 = "0.11.6" Graphs = "1.14.0" HTTP = "2.5.0 - 2.9.9" JSON = "1.3.0 - 1.9.9" diff --git a/src/garageS3.jl b/src/garageS3.jl index 3ad7e4e..3e83440 100644 --- a/src/garageS3.jl +++ b/src/garageS3.jl @@ -1,4 +1,4 @@ -module GarageS3 +module garageS3 export GarageStorage, @@ -7,8 +7,7 @@ export list_files, delete_file -using AWS -using AWSS3 +using AWS, AWSS3 # ---------------------------------------------- 100 --------------------------------------------- # # Garage uses Path-Style routing (https://s3-api.my-domain.com/bucket/key). @@ -64,10 +63,36 @@ AWS.check_credentials(c::SimpleCredentials) = c AWS.region(aws::GarageConfig) = aws.region AWS.credentials(aws::GarageConfig) = aws.credentials +""" Generate the base URL for a Garage S3 service request. + +# Arguments +- `aws::GarageConfig` + The Garage configuration containing the endpoint. +- `service::String` + The AWS service name (e.g., `"s3"`). +- `region::String` + The AWS region string. + +# Return +- `String`: The stripped endpoint URL (trailing slashes removed). +""" function AWS.generate_service_url(aws::GarageConfig, service::String, region::String) return strip(aws.endpoint, '/') end +""" Generate the full service URL including the resource path for a Garage S3 request. + +# Arguments +- `aws::GarageConfig` + The Garage configuration containing the endpoint. +- `service::String` + The AWS service name (e.g., `"s3"`). +- `resource::String` + The S3 resource path (e.g., `"/bucket/key"`). + +# Return +- `String`: The full URL combining the endpoint and resource path. +""" function AWS.generate_service_url(aws::GarageConfig, service::String, resource::String) endpoint = strip(aws.endpoint, '/') resource_path = startswith(resource, '/') ? resource : "/" * resource @@ -82,14 +107,61 @@ struct GarageStorage config::GarageConfig bucket::String end +""" Create a thread-safe Garage S3 storage client. +# Arguments +- `endpoint::String` + The Garage S3 API endpoint URL (e.g., `"https://s3-api.yiem.cc"`). +- `key::String` + The Garage access key ID (created via garage-ui). +- `secret::String` + The secret key corresponding to the access key. +- `bucket::String` + The name of the S3 bucket to use. + +# Keyword Arguments +- `region::String = "garage"` + The region identifier for the Garage instance. + +# Return +- `GarageStorage`: A thread-safe storage client instance. + +# Examples +```jldoctest +julia> storage = GarageStorage("https://s3-api.yiem.cc", "GKb080154a2e5b19100b1b2c6e", "a2c6b1379c2f731d3e6e5a408dd4d6cffca7511717675f55114ff94828febca1", "sommpanion-s3") +GarageStorage(GarageConfig(...), "sommpanion-s3") +``` +""" function GarageStorage(endpoint::String, key::String, secret::String, bucket::String; region::String="garage") creds = SimpleCredentials(key, secret, "") config = GarageConfig(endpoint, region, creds) return GarageStorage(config, bucket) end -# Write object to Garage +""" Upload an object to the Garage S3 bucket. + +# Arguments +- `storage::GarageStorage` + The storage client instance. +- `key::String` + The object key (name) in the bucket. Must not contain slashes (`/`). +- `data::Union{String, Vector{UInt8}}` + The data to upload. + +# Return +- `Nothing` if the key contains slashes (upload aborted with warning). +- Prints a success message if the upload completes. + +# Notes +- Slashes in keys are prohibited to prevent S3 listing issues. Use a flat naming + convention (e.g., `"users-1002.json"` instead of `"users/1002.json"`). + +# Examples +```julia +julia> put_file(storage, "test.json", "{\"status\": \"active\"}") +Successfully uploaded: test.json +``` +""" function put_file(storage::GarageStorage, key::String, data::Union{String, Vector{UInt8}}) # Check if the key contains a slash (virtual folder character) if occursin('/', key) @@ -102,19 +174,64 @@ function put_file(storage::GarageStorage, key::String, data::Union{String, Vecto println("Successfully uploaded: ", key) end -# Read object from Garage +""" Download an object from the Garage S3 bucket. + +# Arguments +- `storage::GarageStorage` + The storage client instance. +- `key::String` + The object key (name) in the bucket. + +# Return +- `Vector{UInt8}`: The raw bytes of the downloaded object. + +# Examples +```julia +julia> data = String(get_file(storage, "test.json")) +"\"{\\\"status\\\": \\\"active\\\"}\"" +``` +""" function get_file(storage::GarageStorage, key::String)::Vector{UInt8} return s3_get(storage.config, storage.bucket, key) end -# List keys in bucket (Thread-safe & explicit credentials) +""" List all object keys in the Garage S3 bucket. + +# Arguments +- `storage::GarageStorage` + The storage client instance. + +# Return +- `Vector{String}`: A list of object keys (file names) in the bucket. + +# Examples +```julia +julia> keys = list_files(storage) +3-element Vector{String}: + "test1.json" + "test2.json" + "users-1002.json" +``` +""" function list_files(storage::GarageStorage) # Approach 2: s3_list_objects returns a Vector of Dicts with object details objects = s3_list_objects(storage.config, storage.bucket) return [obj["Key"] for obj in objects] end -# Delete object from Garage +""" Delete an object from the Garage S3 bucket. + +# Arguments +- `storage::GarageStorage` + The storage client instance. +- `key::String` + The object key (name) to delete. + +# Examples +```julia +julia> delete_file(storage, "test.json") +``` +""" function delete_file(storage::GarageStorage, key::String) s3_delete(storage.config, storage.bucket, key) end