From 25e33ace4792905a8dd8649aa884a7a9c5063c78 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 01:48:59 +0000 Subject: [PATCH] Update module github.com/testcontainers/testcontainers-go to v0.45.0 --- go.mod | 4 +- go.sum | 8 +- .../github.com/magiconair/properties/load.go | 5 + .../magiconair/properties/properties.go | 2 +- .../testcontainers/testcontainers-go/AI.md | 10 +- .../testcontainers/testcontainers-go/Makefile | 2 +- .../testcontainers/testcontainers-go/Pipfile | 16 - .../testcontainers-go/Pipfile.lock | 706 ------------------ .../testcontainers-go/cleanup.go | 2 +- .../testcontainers-go/commons-test.mk | 14 +- .../testcontainers-go/docker.go | 28 +- .../testcontainers-go/docker_client.go | 5 + .../testcontainers-go/docker_mounts.go | 2 +- .../testcontainers/testcontainers-go/file.go | 13 +- .../internal/config/config.go | 59 +- .../testcontainers-go/internal/core/client.go | 16 +- .../internal/core/docker_host.go | 16 + .../internal/core/runtime_provider.go | 181 +++++ .../testcontainers-go/internal/version.go | 2 +- .../testcontainers-go/mkdocs.yml | 10 +- .../testcontainers-go/netlify.toml | 8 + .../testcontainers-go/port_forwarding.go | 19 +- .../testcontainers-go/provider.go | 58 +- .../testcontainers-go/requirements.txt | 5 - .../testcontainers-go/runtime.txt | 1 - .../testcontainers-go/runtime_provider.go | 28 + .../testcontainers-go/testing.go | 3 +- .../testcontainers-go/wait/all.go | 5 +- .../testcontainers-go/wait/any.go | 34 +- .../testcontainers-go/wait/host_port.go | 30 +- .../testcontainers-go/wait/http.go | 1 - .../testcontainers-go/wait/log.go | 12 +- vendor/modules.txt | 6 +- 33 files changed, 511 insertions(+), 800 deletions(-) delete mode 100644 vendor/github.com/testcontainers/testcontainers-go/Pipfile delete mode 100644 vendor/github.com/testcontainers/testcontainers-go/Pipfile.lock create mode 100644 vendor/github.com/testcontainers/testcontainers-go/internal/core/runtime_provider.go create mode 100644 vendor/github.com/testcontainers/testcontainers-go/netlify.toml delete mode 100644 vendor/github.com/testcontainers/testcontainers-go/requirements.txt delete mode 100644 vendor/github.com/testcontainers/testcontainers-go/runtime.txt create mode 100644 vendor/github.com/testcontainers/testcontainers-go/runtime_provider.go diff --git a/go.mod b/go.mod index 2675a794..fbcd62d2 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/onsi/ginkgo/v2 v2.34.0 github.com/onsi/gomega v1.44.0 github.com/spf13/cobra v1.10.2 - github.com/testcontainers/testcontainers-go v0.44.0 + github.com/testcontainers/testcontainers-go v0.45.0 ) require ( @@ -197,7 +197,7 @@ require ( github.com/lucasb-eyer/go-colorful v1.4.1 // indirect github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e // indirect github.com/macabu/inamedparam v0.2.0 // indirect - github.com/magiconair/properties v1.8.10 // indirect + github.com/magiconair/properties v1.18.12 // indirect github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect github.com/manuelarte/funcorder v0.6.0 // indirect github.com/maratori/testableexamples v1.0.1 // indirect diff --git a/go.sum b/go.sum index 234ec99b..980ade4d 100644 --- a/go.sum +++ b/go.sum @@ -487,8 +487,8 @@ github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e h1:Q6MvJtQK/iRcRt github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= -github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= -github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/magiconair/properties v1.18.12 h1:sT9zQpvTB3B4gzrX0tmZNTEaGyg8Zw55MFYRE32Mr9I= +github.com/magiconair/properties v1.18.12/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww= github.com/manuelarte/embeddedstructfieldcheck v0.4.0/go.mod h1:z8dFSyXqp+fC6NLDSljRJeNQJJDWnY7RoWFzV3PC6UM= github.com/manuelarte/funcorder v0.6.0 h1:0hBngc4fa1IgNiI65A7sFGkMvoMCc878RjqB5V7rWP0= @@ -706,8 +706,8 @@ github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/testcontainers/testcontainers-go v0.44.0 h1:/Fwh6HY1mIikhnm9e7HwoxGycx0lzRAE0f5VQpjFxzI= -github.com/testcontainers/testcontainers-go v0.44.0/go.mod h1:IcnwQrYTO86xHXu5bvMaBH7ATlbS3Qn1M1QWW3c66rE= +github.com/testcontainers/testcontainers-go v0.45.0 h1:ss9Stm9KDX6JLgGL4jr2fC5dwpabTbCBsRcGadBPR9k= +github.com/testcontainers/testcontainers-go v0.45.0/go.mod h1:VMJZ7M+qhgfEHWNbtjm596OyEOraULSTDaus/h0hmJI= github.com/tetafro/godot v1.5.6 h1:IEkrFCwXaYHlOn4mGzGS3F3dkP6m9t0jpwqBFPIkKiA= github.com/tetafro/godot v1.5.6/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU= github.com/tidwall/gjson v1.20.0 h1:+agJ3rEzKcCXKDKo0ml26UROcpcAlnZyjq+TjbY5Fto= diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go index 6567e0c7..3d5573f3 100644 --- a/vendor/github.com/magiconair/properties/load.go +++ b/vendor/github.com/magiconair/properties/load.go @@ -5,6 +5,7 @@ package properties import ( + "bytes" "fmt" "io" "net/http" @@ -156,6 +157,10 @@ func (l *Loader) LoadURL(url string) (*Properties, error) { } func (l *Loader) loadBytes(buf []byte, enc Encoding) (*Properties, error) { + // Strip a leading UTF-8 BOM so Windows-edited property files load cleanly. + if enc == UTF8 || enc == utf8Default { + buf = bytes.TrimPrefix(buf, []byte{0xEF, 0xBB, 0xBF}) + } p, err := parse(convert(buf, enc)) if err != nil { return nil, err diff --git a/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/magiconair/properties/properties.go index 58297611..180ae37f 100644 --- a/vendor/github.com/magiconair/properties/properties.go +++ b/vendor/github.com/magiconair/properties/properties.go @@ -753,7 +753,7 @@ func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n i if p.WriteSeparator != "" { sep = p.WriteSeparator } - x, err = fmt.Fprintf(w, "%s%s%s\n", encode(key, " :", enc), sep, encode(value, "", enc)) + x, err = fmt.Fprintf(w, "%s%s%s\n", encode(key, " :=", enc), sep, encode(value, "", enc)) if err != nil { return } diff --git a/vendor/github.com/testcontainers/testcontainers-go/AI.md b/vendor/github.com/testcontainers/testcontainers-go/AI.md index f90971bb..a4dd5dd1 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/AI.md +++ b/vendor/github.com/testcontainers/testcontainers-go/AI.md @@ -14,15 +14,15 @@ This is a **Go monorepo** containing: ## Environment Setup ### Go Version -- **Required**: Go 1.25.9 +- **Required**: Go 1.26.10 - **Tool**: Use [gvm](https://github.com/andrewkroh/gvm) for version management - **CRITICAL**: Always run this before ANY Go command: ```bash # For Apple Silicon (M1/M2/M3) - eval "$(gvm 1.25.9 --arch=arm64)" + eval "$(gvm 1.26.10 --arch=arm64)" # For Intel/AMD (x86_64) - eval "$(gvm 1.25.9 --arch=amd64)" + eval "$(gvm 1.26.10 --arch=amd64)" ``` ### Project Structure @@ -171,14 +171,14 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom ### When Tests Fail 1. **Read the error message carefully** - it usually tells you exactly what's wrong 2. **Check if it's a lint issue** - run `make pre-commit` first -3. **Verify Go version** - ensure using Go 1.25.9 +3. **Verify Go version** - ensure using Go 1.26.10 4. **Check Docker** - some tests require Docker daemon running ## Common Pitfalls to Avoid ### Code Issues - ❌ Using interface types as return values -- ❌ Forgetting to run `eval "$(gvm 1.25.9 --arch=arm64)"` +- ❌ Forgetting to run `eval "$(gvm 1.26.10 --arch=arm64)"` - ❌ Not handling errors from built-in options - ❌ Using module-specific container names (`PostgresContainer`) - ❌ Calling `.Customize()` method instead of direct function call diff --git a/vendor/github.com/testcontainers/testcontainers-go/Makefile b/vendor/github.com/testcontainers/testcontainers-go/Makefile index 5b7c5000..f98c6386 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/Makefile +++ b/vendor/github.com/testcontainers/testcontainers-go/Makefile @@ -36,7 +36,7 @@ serve-docs: docker run --rm --name $(DOCS_CONTAINER) -it -p 8000:8000 \ -v $(PWD):/testcontainers-go \ -w /testcontainers-go \ - $(DOCS_IMAGE) bash -c "pip install -Ur requirements.txt && mkdocs serve -f mkdocs.yml -a 0.0.0.0:8000" + $(DOCS_IMAGE) bash -c "pip install -Ur docs-site/requirements.txt && mkdocs serve -f mkdocs.yml -a 0.0.0.0:8000" ## -------------------------------------- diff --git a/vendor/github.com/testcontainers/testcontainers-go/Pipfile b/vendor/github.com/testcontainers/testcontainers-go/Pipfile deleted file mode 100644 index ca5c98c2..00000000 --- a/vendor/github.com/testcontainers/testcontainers-go/Pipfile +++ /dev/null @@ -1,16 +0,0 @@ -[[source]] -name = "pypi" -url = "https://pypi.org/simple" -verify_ssl = true - -[dev-packages] - -[packages] -mkdocs = "==1.5.3" -mkdocs-codeinclude-plugin = "==0.3.1" -mkdocs-include-markdown-plugin = "==7.3.0" -mkdocs-material = "==9.5.18" -mkdocs-markdownextradata-plugin = "==0.2.6" - -[requires] -python_version = "3.13" diff --git a/vendor/github.com/testcontainers/testcontainers-go/Pipfile.lock b/vendor/github.com/testcontainers/testcontainers-go/Pipfile.lock deleted file mode 100644 index 3fac5c65..00000000 --- a/vendor/github.com/testcontainers/testcontainers-go/Pipfile.lock +++ /dev/null @@ -1,706 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "9836de74487210f57ac1040d06b403490e5171be35a8b5816a5361b4a2d02e01" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.8" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "babel": { - "hashes": [ - "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", - "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" - ], - "markers": "python_version >= '3.7'", - "version": "==2.14.0" - }, - "bracex": { - "hashes": [ - "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952", - "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6" - }, - "certifi": { - "hashes": [ - "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", - "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7" - ], - "markers": "python_version >= '3.7'", - "version": "==2026.2.25" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", - "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", - "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", - "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", - "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", - "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", - "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", - "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", - "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", - "sha256:1cf0a70018692f85172348fe06d3a4b63f94ecb055e13a00c644d368eb82e5b8", - "sha256:1ed80ff870ca6de33f4d953fda4d55654b9a2b340ff39ab32fa3adbcd718f264", - "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", - "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", - "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", - "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", - "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", - "sha256:2bd9d128ef93637a5d7a6af25363cf5dec3fa21cf80e68055aad627f280e8afa", - "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", - "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", - "sha256:2f7fdd9b6e6c529d6a2501a2d36b240109e78a8ceaef5687cfcfa2bbe671d297", - "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", - "sha256:31215157227939b4fb3d740cd23fe27be0439afef67b785a1eb78a3ae69cba9e", - "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", - "sha256:3516bbb8d42169de9e61b8520cbeeeb716f12f4ecfe3fd30a9919aa16c806ca8", - "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", - "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", - "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", - "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", - "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", - "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", - "sha256:461598cd852bfa5a61b09cae2b1c02e2efcd166ee5516e243d540ac24bfa68a7", - "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", - "sha256:48696db7f18afb80a068821504296eb0787d9ce239b91ca15059d1d3eaacf13b", - "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", - "sha256:4d1d02209e06550bdaef34af58e041ad71b88e624f5d825519da3a3308e22687", - "sha256:4f41da960b196ea355357285ad1316a00099f22d0929fe168343b99b254729c9", - "sha256:517ad0e93394ac532745129ceabdf2696b609ec9f87863d337140317ebce1c14", - "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", - "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", - "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", - "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", - "sha256:54fae94be3d75f3e573c9a1b5402dc593de19377013c9a0e4285e3d402dd3a2a", - "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", - "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", - "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", - "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", - "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", - "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", - "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", - "sha256:659a1e1b500fac8f2779dd9e1570464e012f43e580371470b45277a27baa7532", - "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", - "sha256:69dd852c2f0ad631b8b60cfbe25a28c0058a894de5abb566619c205ce0550eae", - "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", - "sha256:71be7e0e01753a89cf024abf7ecb6bca2c81738ead80d43004d9b5e3f1244e64", - "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", - "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", - "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", - "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", - "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", - "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", - "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", - "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", - "sha256:802168e03fba8bbc5ce0d866d589e4b1ca751d06edee69f7f3a19c5a9fe6b597", - "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", - "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", - "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", - "sha256:8761ac29b6c81574724322a554605608a9960769ea83d2c73e396f3df896ad54", - "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", - "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", - "sha256:8bc5f0687d796c05b1e28ab0d38a50e6309906ee09375dd3aff6a9c09dd6e8f4", - "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", - "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", - "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", - "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", - "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", - "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", - "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", - "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", - "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", - "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", - "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", - "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", - "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", - "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", - "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", - "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", - "sha256:ab30e5e3e706e3063bc6de96b118688cb10396b70bb9864a430f67df98c61ecc", - "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", - "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", - "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", - "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", - "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", - "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", - "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", - "sha256:bf625105bb9eef28a56a943fec8c8a98aeb80e7d7db99bd3c388137e6eb2d237", - "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", - "sha256:c45a03a4c69820a399f1dda9e1d8fbf3562eda46e7720458180302021b08f778", - "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", - "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", - "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", - "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", - "sha256:d08ec48f0a1c48d75d0356cea971921848fb620fdeba805b28f937e90691209f", - "sha256:d1a2ee9c1499fc8f86f4521f27a973c914b211ffa87322f4ee33bb35392da2c5", - "sha256:d5f5d1e9def3405f60e3ca8232d56f35c98fb7bf581efcc60051ebf53cb8b611", - "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", - "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", - "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", - "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", - "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", - "sha256:df01808ee470038c3f8dc4f48620df7225c49c2d6639e38f96e6d6ac6e6f7b0e", - "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", - "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", - "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", - "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", - "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", - "sha256:e8aeb10fcbe92767f0fa69ad5a72deca50d0dca07fbde97848997d778a50c9fe", - "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", - "sha256:ecbbd45615a6885fe3240eb9db73b9e62518b611850fdf8ab08bd56de7ad2b17", - "sha256:ee4ec14bc1680d6b0afab9aea2ef27e26d2024f18b24a2d7155a52b60da7e833", - "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", - "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", - "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", - "sha256:f50498891691e0864dc3da965f340fada0771f6142a378083dc4608f4ea513e2", - "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", - "sha256:f61aa92e4aad0be58eb6eb4e0c21acf32cf8065f4b2cae5665da756c4ceef982", - "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", - "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", - "sha256:f98059e4fcd3e3e4e2d632b7cf81c2faae96c43c60b569e9c621468082f1d104", - "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659" - ], - "markers": "python_version >= '3.7'", - "version": "==3.4.6" - }, - "click": { - "hashes": [ - "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", - "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96" - ], - "markers": "python_version >= '3.10'", - "version": "==8.4.1" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "ghp-import": { - "hashes": [ - "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", - "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343" - ], - "version": "==2.1.0" - }, - "idna": { - "hashes": [ - "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", - "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.15" - }, - "importlib-metadata": { - "hashes": [ - "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", - "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5" - ], - "markers": "python_version < '3.10'", - "version": "==8.4.0" - }, - "jinja2": { - "hashes": [ - "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", - "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.6" - }, - "markdown": { - "hashes": [ - "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", - "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36" - ], - "markers": "python_version >= '3.10'", - "version": "==3.10.2" - }, - "markupsafe": { - "hashes": [ - "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", - "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", - "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", - "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", - "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", - "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", - "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", - "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", - "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", - "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", - "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", - "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", - "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", - "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", - "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", - "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", - "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", - "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", - "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", - "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", - "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", - "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", - "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", - "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", - "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", - "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", - "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", - "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", - "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", - "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", - "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", - "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", - "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", - "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", - "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", - "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", - "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", - "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", - "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", - "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", - "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", - "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", - "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", - "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", - "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", - "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", - "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", - "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", - "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", - "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", - "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", - "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", - "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", - "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", - "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", - "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", - "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", - "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", - "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", - "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", - "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", - "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", - "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", - "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", - "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", - "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", - "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", - "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", - "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", - "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", - "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", - "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", - "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", - "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", - "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", - "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", - "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", - "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", - "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", - "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", - "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", - "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", - "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", - "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", - "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", - "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", - "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", - "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", - "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50" - ], - "markers": "python_version >= '3.9'", - "version": "==3.0.3" - }, - "mergedeep": { - "hashes": [ - "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", - "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307" - ], - "markers": "python_version >= '3.6'", - "version": "==1.3.4" - }, - "mkdocs": { - "hashes": [ - "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1", - "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==1.5.3" - }, - "mkdocs-codeinclude-plugin": { - "hashes": [ - "sha256:06bbbf0d4ac7eccaec6e0d89ce76d644a197cfed34880f541516e722ded6512a", - "sha256:443f32c9e4412b84ec084bd2b454020c5bf06cb9a958682e08a528e62b45da4d" - ], - "index": "pypi", - "markers": "python_version >= '3.11'", - "version": "==0.3.1" - }, - "mkdocs-include-markdown-plugin": { - "hashes": [ - "sha256:2800126746452e31c2e321bbd43c8190b356e0de353e20cbc16a34a3c3d6796c", - "sha256:5b5c99b5d3c9b9ce0114a9e60353bbafb6be53a26c2d3b74ec6b767a7a8e55ca" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==7.3.0" - }, - "mkdocs-markdownextradata-plugin": { - "hashes": [ - "sha256:34dd40870781784c75809596b2d8d879da783815b075336d541de1f150c94242", - "sha256:4aed9b43b8bec65b02598387426ca4809099ea5f5aa78bf114f3296fd46686b5" - ], - "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==0.2.6" - }, - "mkdocs-material": { - "hashes": [ - "sha256:1e0e27fc9fe239f9064318acf548771a4629d5fd5dfd45444fd80a953fe21eb4", - "sha256:a43f470947053fa2405c33995f282d24992c752a50114f23f30da9d8d0c57e62" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==9.5.18" - }, - "mkdocs-material-extensions": { - "hashes": [ - "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", - "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31" - ], - "markers": "python_version >= '3.8'", - "version": "==1.3.1" - }, - "packaging": { - "hashes": [ - "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", - "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661" - ], - "markers": "python_version >= '3.8'", - "version": "==26.2" - }, - "paginate": { - "hashes": [ - "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d" - ], - "version": "==0.5.6" - }, - "pathspec": { - "hashes": [ - "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", - "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.1" - }, - "platformdirs": { - "hashes": [ - "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", - "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a" - ], - "markers": "python_version >= '3.10'", - "version": "==4.10.0" - }, - "pygments": { - "hashes": [ - "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", - "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.20.0" - }, - "pymdown-extensions": { - "hashes": [ - "sha256:72cfcf55f07aea0d4af2c4f11dd4e52466ddfb1bb819673146398e0bd3a77354", - "sha256:d7a5d08014fc571e80ca21dd6f854e31f94c489800350564d55d15b3c41e76b6" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==10.21.3" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "markers": "python_version < '3.9'", - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", - "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", - "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", - "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", - "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", - "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", - "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", - "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", - "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", - "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", - "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", - "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6", - "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", - "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", - "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", - "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", - "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", - "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", - "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295", - "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", - "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", - "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", - "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", - "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", - "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", - "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", - "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", - "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b", - "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", - "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", - "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", - "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", - "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369", - "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", - "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", - "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", - "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", - "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", - "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", - "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", - "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", - "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", - "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", - "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", - "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", - "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", - "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", - "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", - "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", - "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4", - "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", - "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", - "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", - "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", - "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", - "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", - "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", - "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", - "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", - "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", - "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", - "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f", - "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", - "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", - "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", - "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", - "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", - "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", - "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", - "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3", - "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", - "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", - "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0" - ], - "markers": "python_version >= '3.8'", - "version": "==6.0.3" - }, - "pyyaml-env-tag": { - "hashes": [ - "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", - "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1" - }, - "regex": { - "hashes": [ - "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc", - "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5", - "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf", - "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94", - "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397", - "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82", - "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4", - "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae", - "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d", - "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db", - "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1", - "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b", - "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b", - "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666", - "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6", - "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c", - "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6", - "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c", - "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd", - "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636", - "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6", - "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962", - "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26", - "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e", - "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1", - "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b", - "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3", - "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a", - "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6", - "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257", - "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185", - "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e", - "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247", - "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31", - "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f", - "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec", - "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3", - "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b", - "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f", - "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150", - "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02", - "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17", - "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc", - "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4", - "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796", - "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f", - "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a", - "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d", - "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833", - "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f", - "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc", - "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d", - "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c", - "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10", - "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0", - "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb", - "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947", - "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae", - "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a", - "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f", - "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7", - "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925", - "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630", - "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61", - "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e", - "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58", - "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0", - "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8", - "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1", - "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1", - "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a", - "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662", - "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea", - "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1", - "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013", - "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90", - "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2", - "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e", - "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.4.28" - }, - "requests": { - "hashes": [ - "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", - "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==2.33.0" - }, - "six": { - "hashes": [ - "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", - "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.17.0" - }, - "urllib3": { - "hashes": [ - "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", - "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==2.7.0" - }, - "watchdog": { - "hashes": [ - "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", - "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", - "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", - "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", - "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", - "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", - "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", - "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", - "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", - "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa", - "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", - "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", - "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a", - "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", - "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", - "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", - "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", - "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", - "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", - "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", - "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", - "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", - "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", - "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", - "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", - "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", - "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e", - "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8", - "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c", - "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2" - ], - "markers": "python_version >= '3.9'", - "version": "==6.0.0" - }, - "wcmatch": { - "hashes": [ - "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a", - "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af" - ], - "markers": "python_version >= '3.9'", - "version": "==10.1" - }, - "zipp": { - "hashes": [ - "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064", - "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b" - ], - "markers": "python_version >= '3.8'", - "version": "==3.20.1" - } - }, - "develop": {} -} diff --git a/vendor/github.com/testcontainers/testcontainers-go/cleanup.go b/vendor/github.com/testcontainers/testcontainers-go/cleanup.go index 2f844863..f8aed0a2 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/cleanup.go +++ b/vendor/github.com/testcontainers/testcontainers-go/cleanup.go @@ -117,7 +117,7 @@ func isNil(val any) bool { valueOf := reflect.ValueOf(val) switch valueOf.Kind() { - case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice: + case reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, reflect.UnsafePointer, reflect.Interface, reflect.Slice: return valueOf.IsNil() default: return false diff --git a/vendor/github.com/testcontainers/testcontainers-go/commons-test.mk b/vendor/github.com/testcontainers/testcontainers-go/commons-test.mk index a3381c5d..80b0593f 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/commons-test.mk +++ b/vendor/github.com/testcontainers/testcontainers-go/commons-test.mk @@ -1,12 +1,16 @@ ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) GOBIN= $(GOPATH)/bin +TEST_RERUN_FAILS ?= 5 +TEST_REPORT ?= TEST-unit.xml +TEST_COVERAGE ?= coverage.out +GO_TEST_FLAGS ?= define go_install go install $(1) endef $(GOBIN)/golangci-lint: - $(call go_install,github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.9.0) + $(call go_install,github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.14.0) $(GOBIN)/gotestsum: $(call go_install,gotest.tools/gotestsum@latest) @@ -45,14 +49,14 @@ test-%: $(GOBIN)/gotestsum @echo "Running $* tests..." gotestsum \ --format short-verbose \ - --rerun-fails=5 \ + --rerun-fails=$(TEST_RERUN_FAILS) \ --packages="./..." \ - --junitfile TEST-unit.xml \ + --junitfile $(TEST_REPORT) \ -- \ -v \ - -coverprofile=coverage.out \ + -coverprofile=$(TEST_COVERAGE) \ -timeout=30m \ - -race + -race $(GO_TEST_FLAGS) .PHONY: tools tools: diff --git a/vendor/github.com/testcontainers/testcontainers-go/docker.go b/vendor/github.com/testcontainers/testcontainers-go/docker.go index ab243e2c..e689f832 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/docker.go +++ b/vendor/github.com/testcontainers/testcontainers-go/docker.go @@ -1059,6 +1059,7 @@ func (n *DockerNetwork) SetTerminationSignal(signal chan bool) { // DockerProvider implements the ContainerProvider interface type DockerProvider struct { *DockerProviderOptions + runtime RuntimeConfig client client.APIClient host string hostCache string @@ -1071,6 +1072,12 @@ func (p *DockerProvider) Client() client.APIClient { return p.client } +// RuntimeConfig returns the selected runtime's connection settings. Modules that +// construct additional Docker clients must use its endpoint when DockerHost is set. +func (p *DockerProvider) RuntimeConfig() RuntimeConfig { + return p.runtime +} + // Close closes the docker client used by the provider func (p *DockerProvider) Close() error { if p.client == nil { @@ -1612,6 +1619,9 @@ func (p *DockerProvider) DaemonHost(ctx context.Context) (string, error) { } func (p *DockerProvider) daemonHostLocked(ctx context.Context) (string, error) { + if p.runtime.PublishedHost != "" { + return p.runtime.PublishedHost, nil + } if p.hostCache != "" { return p.hostCache, nil } @@ -1784,17 +1794,31 @@ func (p *DockerProvider) ensureDefaultNetworkLocked(ctx context.Context) (string // TODO: remove once we have docker context support via #2810 // Prefer the default bridge network if it exists. // This makes the results stable as network list order is not guaranteed. + var fallbackNetwork string for _, nw := range networkResources.Items { switch nw.Name { case p.defaultBridgeNetworkName: p.defaultNetwork = p.defaultBridgeNetworkName return p.defaultNetwork, nil case ReaperDefault: - p.defaultNetwork = ReaperDefault + fallbackNetwork = ReaperDefault } } - if p.defaultNetwork != "" { + // A compatible runtime may list the default network under an alias: Podman + // lists "bridge", but container creation requires its native name "podman". + // Inspect the configured name before choosing or creating a fallback. + if p.defaultBridgeNetworkName != Bridge { + if _, err := p.client.NetworkInspect(ctx, p.defaultBridgeNetworkName, client.NetworkInspectOptions{}); err == nil { + p.defaultNetwork = p.defaultBridgeNetworkName + return p.defaultNetwork, nil + } else if !errdefs.IsNotFound(err) { + return "", fmt.Errorf("inspect default network: %w", err) + } + } + + if fallbackNetwork != "" { + p.defaultNetwork = fallbackNetwork return p.defaultNetwork, nil } diff --git a/vendor/github.com/testcontainers/testcontainers-go/docker_client.go b/vendor/github.com/testcontainers/testcontainers-go/docker_client.go index 53c7da03..03957907 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/docker_client.go +++ b/vendor/github.com/testcontainers/testcontainers-go/docker_client.go @@ -133,6 +133,11 @@ func NewDockerClientWithOpts(ctx context.Context, opt ...client.Opt) (*DockerCli } if _, err = tcClient.Info(ctx, client.InfoOptions{}); err != nil { + runtime, runtimeErr := core.Runtime(ctx) + if runtimeErr != nil || runtime.DockerHost != "" { + _ = tcClient.Close() + return nil, fmt.Errorf("connect to selected provider: %w", err) + } // Fallback to environment, including the original options if len(opt) == 0 { opt = []client.Opt{client.FromEnv} diff --git a/vendor/github.com/testcontainers/testcontainers-go/docker_mounts.go b/vendor/github.com/testcontainers/testcontainers-go/docker_mounts.go index 5d654b9a..fb00316f 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/docker_mounts.go +++ b/vendor/github.com/testcontainers/testcontainers-go/docker_mounts.go @@ -173,7 +173,7 @@ func mapToDockerMounts(containerMounts ContainerMounts) []mount.Mount { case ImageMounter: containerMount.ImageOptions = typedMounter.ImageOptions() case BindMounter: - log.Printf("Mount type %s is not supported by Testcontainers for Go", m.Source.Type()) + log.Printf("Mount type %s is not supported by Testcontainers for Go", mountTypeMapping[m.Source.Type()]) default: // The provided source type has no custom options } diff --git a/vendor/github.com/testcontainers/testcontainers-go/file.go b/vendor/github.com/testcontainers/testcontainers-go/file.go index 9205208c..b8666eb8 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/file.go +++ b/vendor/github.com/testcontainers/testcontainers-go/file.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "os" + "path" "path/filepath" "strings" @@ -115,11 +116,21 @@ func tarDir(src string, fileMode int64) (*bytes.Buffer, error) { func tarFile(basePath string, fileContent func(tw io.Writer) error, fileContentSize int64, fileMode int64) (*bytes.Buffer, error) { buffer := &bytes.Buffer{} + archivePath := path.Clean(basePath) + if archivePath == "." || archivePath == "/" { + return buffer, fmt.Errorf("invalid container file path %q", basePath) + } + if path.IsAbs(archivePath) { + archivePath = strings.TrimPrefix(archivePath, "/") + } else if archivePath == ".." || strings.HasPrefix(archivePath, "../") { + return buffer, fmt.Errorf("container file path %q escapes the archive root", basePath) + } + zr := gzip.NewWriter(buffer) tw := tar.NewWriter(zr) hdr := &tar.Header{ - Name: basePath, + Name: archivePath, Mode: fileMode, Size: fileContentSize, } diff --git a/vendor/github.com/testcontainers/testcontainers-go/internal/config/config.go b/vendor/github.com/testcontainers/testcontainers-go/internal/config/config.go index d2b762eb..f8607951 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/internal/config/config.go +++ b/vendor/github.com/testcontainers/testcontainers-go/internal/config/config.go @@ -1,9 +1,11 @@ package config import ( + "errors" "fmt" "os" "path/filepath" + "regexp" "strconv" "sync" "time" @@ -15,11 +17,46 @@ import ( const ReaperDefaultImage = "testcontainers/ryuk:0.14.0" +// reaperNamePrefix is the prefix of the name of the reaper container, which is built +// from the session ID. It is duplicated here, instead of imported, because the package +// building that name depends on this one. +const reaperNamePrefix = "reaper_" + +// maxContainerNameLen is the maximum length of a container name. +const maxContainerNameLen = 128 + var ( tcConfig Config tcConfigOnce = new(sync.Once) + + // containerNameRegex matches the names accepted by the container runtime. + containerNameRegex = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9_.-]*$`) ) +// validateSessionID verifies that a user-provided session ID can be used to build the +// resources created by the library, most notably the name of the reaper container. +// It validates the resulting name, not the session ID on its own, so a session ID is +// only rejected when it actually produces a name the container runtime refuses. +// The session IDs generated by the library always satisfy these constraints, so this +// validation only applies to the values coming from the user configuration. +func validateSessionID(sessionID string) error { + if sessionID == "" { + return errors.New("must not be empty") + } + + reaperName := reaperNamePrefix + sessionID + + if len(reaperName) > maxContainerNameLen { + return fmt.Errorf("must be at most %d characters long, got %d", maxContainerNameLen-len(reaperNamePrefix), len(sessionID)) + } + + if !containerNameRegex.MatchString(reaperName) { + return errors.New("must contain only alphanumeric characters, dots, hyphens and underscores") + } + + return nil +} + // testcontainersConfig { // Config represents the configuration for Testcontainers. @@ -94,6 +131,11 @@ type Config struct { // // Environment variable: TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE TestcontainersHost string `properties:"tc.host,default="` + + // Provider is the container provider to use (e.g., "docker", "podman"). + // + // Environment variable: TESTCONTAINERS_PROVIDER + Provider string `properties:"provider,default="` } // } @@ -131,9 +173,17 @@ func read() Config { } sessionID := os.Getenv("TESTCONTAINERS_SESSION_ID") - if sessionID != "" { + switch { + case sessionID != "": + if err := validateSessionID(sessionID); err != nil { + panic(fmt.Sprintf("invalid TESTCONTAINERS_SESSION_ID value %q: %s", sessionID, err)) + } config.SessionID = sessionID - } else if config.SessionID == "" { + case config.SessionID != "": + if err := validateSessionID(config.SessionID); err != nil { + panic(fmt.Sprintf("invalid session.id property value %q: %s", config.SessionID, err)) + } + default: config.SessionID = bootstrap.SessionID() } @@ -157,6 +207,11 @@ func read() Config { config.RyukConnectionTimeout = timeout } + providerEnv := os.Getenv("TESTCONTAINERS_PROVIDER") + if providerEnv != "" { + config.Provider = providerEnv + } + return config } diff --git a/vendor/github.com/testcontainers/testcontainers-go/internal/core/client.go b/vendor/github.com/testcontainers/testcontainers-go/internal/core/client.go index dd3263d2..6646205f 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/internal/core/client.go +++ b/vendor/github.com/testcontainers/testcontainers-go/internal/core/client.go @@ -2,6 +2,7 @@ package core import ( "context" + "fmt" "path/filepath" "github.com/moby/moby/client" @@ -19,13 +20,22 @@ func NewClient(ctx context.Context, ops ...client.Opt) (*client.Client, error) { } tcConfig := config.Read() + runtime, err := Runtime(ctx) + if err != nil { + return nil, err + } opts := []client.Opt{client.FromEnv} + if runtime.DockerHost != "" { + // A managed runtime owns its endpoint; host Docker TLS environment settings + // must not change the connection to that runtime. + opts = nil + } if dockerHost != "" { opts = append(opts, client.WithHost(dockerHost)) // for further information, read https://docs.docker.com/engine/security/protect-access/ - if tcConfig.TLSVerify == 1 { + if tcConfig.TLSVerify == 1 && runtime.DockerHost == "" { cacertPath := filepath.Join(tcConfig.CertPath, "ca.pem") certPath := filepath.Join(tcConfig.CertPath, "cert.pem") keyPath := filepath.Join(tcConfig.CertPath, "key.pem") @@ -49,6 +59,10 @@ func NewClient(ctx context.Context, ops ...client.Opt) (*client.Client, error) { if err != nil { return nil, err } + if runtime.DockerHost != "" && cli.DaemonHost() != runtime.DockerHost { + _ = cli.Close() + return nil, fmt.Errorf("client endpoint conflicts with provider %q", runtime.Name) + } return cli, nil } diff --git a/vendor/github.com/testcontainers/testcontainers-go/internal/core/docker_host.go b/vendor/github.com/testcontainers/testcontainers-go/internal/core/docker_host.go index fbb2e2b0..11bac636 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/internal/core/docker_host.go +++ b/vendor/github.com/testcontainers/testcontainers-go/internal/core/docker_host.go @@ -94,7 +94,15 @@ func MustExtractDockerHost(ctx context.Context) string { } func ExtractDockerHost(ctx context.Context) (string, error) { + runtime, err := Runtime(ctx) + if err != nil { + return "", err + } dockerHostOnce.Do(func() { + if runtime.DockerHost != "" { + dockerHostCache = runtime.DockerHost + return + } dockerHostCache, dockerHostErrCache = extractDockerHost(ctx) }) return dockerHostCache, dockerHostErrCache @@ -114,7 +122,15 @@ func ExtractDockerHost(ctx context.Context) (string, error) { // // It panics if a Docker client cannot be created, or the Docker host cannot be discovered. func MustExtractDockerSocket(ctx context.Context) string { + runtime, err := Runtime(ctx) + if err != nil { + panic(err) + } dockerSocketPathOnce.Do(func() { + if runtime.DockerSocketPath != "" { + dockerSocketPathCache = runtime.DockerSocketPath + return + } dockerSocketPathCache = extractDockerSocket(ctx) }) diff --git a/vendor/github.com/testcontainers/testcontainers-go/internal/core/runtime_provider.go b/vendor/github.com/testcontainers/testcontainers-go/internal/core/runtime_provider.go new file mode 100644 index 00000000..db2c3f4c --- /dev/null +++ b/vendor/github.com/testcontainers/testcontainers-go/internal/core/runtime_provider.go @@ -0,0 +1,181 @@ +package core + +import ( + "context" + "errors" + "fmt" + "os" + "strings" + "sync" + + "github.com/testcontainers/testcontainers-go/internal/config" +) + +// RuntimeProvider prepares a Docker-compatible runtime before client discovery. +// Initialize must not call testcontainers client or provider constructors, which +// would recursively initialize the runtime. It is called at most once per process. +// Its context preserves the first caller's values but not cancellation or deadlines; +// implementations must bound startup with their own timeout when needed. +type RuntimeProvider interface { + Initialize(context.Context) (RuntimeConfig, error) +} + +// RuntimeConfig separates the client endpoint, daemon-side socket mount, and +// address at which the test process can reach published container ports. +// Empty endpoint fields retain the standard Docker discovery behavior. +type RuntimeConfig struct { + Name string + DockerHost string + DockerSocketPath string + PublishedHost string + DefaultBridgeNetwork string +} + +// ProviderFactory constructs a runtime without initializing it during import. +type ProviderFactory func() RuntimeProvider + +var runtimeProviders = newRuntimeRegistry() + +type runtimeRegistry struct { + mu sync.Mutex + factories map[string]ProviderFactory + requested string + started bool + name string + ready chan struct{} + config RuntimeConfig + err error +} + +func newRuntimeRegistry() *runtimeRegistry { + return &runtimeRegistry{factories: make(map[string]ProviderFactory)} +} + +func (r *runtimeRegistry) register(name string, factory ProviderFactory) error { + name = strings.ToLower(strings.TrimSpace(name)) + if name == "" || name == "docker" || factory == nil { + return fmt.Errorf("invalid provider registration %q", name) + } + r.mu.Lock() + defer r.mu.Unlock() + if r.started { + return errors.New("register providers before Docker discovery starts") + } + if _, exists := r.factories[name]; exists { + return fmt.Errorf("provider %q is already registered", name) + } + r.factories[name] = factory + return nil +} + +func (r *runtimeRegistry) selectProvider(name string) error { + r.mu.Lock() + defer r.mu.Unlock() + if r.started { + // Legacy Docker and Podman selections share the same discovered daemon. + // Keep their per-request network behavior during the migration. + if name == r.name || (isLegacyProvider(name) && isLegacyProvider(r.name)) { + return nil + } + return fmt.Errorf("provider %q is already initialized; cannot switch to %q", r.name, name) + } + r.requested = name + return nil +} + +func (r *runtimeRegistry) resolve(ctx context.Context, name string) (RuntimeConfig, error) { + if err := ctx.Err(); err != nil { + return RuntimeConfig{}, err + } + r.mu.Lock() + if !r.started { + if r.requested != "" { + name = r.requested + } + r.started = true + r.name = name + r.ready = make(chan struct{}) + factory := r.factories[name] + // Startup is shared by the process. A caller may stop waiting without + // canceling initialization for every other caller or starting it twice. + go func() { + cfg, err := initializeRuntime(context.WithoutCancel(ctx), name, factory) + r.mu.Lock() + r.config, r.err = cfg, err + close(r.ready) + r.mu.Unlock() + }() + } + ready := r.ready + r.mu.Unlock() + + select { + case <-ctx.Done(): + return RuntimeConfig{}, ctx.Err() + case <-ready: + return r.config, r.err + } +} + +func initializeRuntime(ctx context.Context, name string, factory ProviderFactory) (RuntimeConfig, error) { + cfg := RuntimeConfig{Name: name, DefaultBridgeNetwork: "bridge"} + if factory == nil { + switch name { + case "docker": + return cfg, nil + case "podman": + // Compatibility path for users who have not imported modules/podman. + cfg.DefaultBridgeNetwork = "podman" + return cfg, nil + default: + return RuntimeConfig{}, fmt.Errorf("provider %q is not registered; import its Go module before using it", name) + } + } + p := factory() + if p == nil { + return RuntimeConfig{}, fmt.Errorf("provider %q factory returned nil", name) + } + cfg, err := p.Initialize(ctx) + if err != nil { + return RuntimeConfig{}, fmt.Errorf("initialize provider %q: %w", name, err) + } + cfg.Name = name + if cfg.DefaultBridgeNetwork == "" { + cfg.DefaultBridgeNetwork = "bridge" + } + return cfg, nil +} + +func isLegacyProvider(name string) bool { + return name == "docker" || name == "podman" +} + +// ConfiguredProviderName resolves a name without discovering a Docker endpoint. +func ConfiguredProviderName() string { + if name := strings.ToLower(strings.TrimSpace(config.Read().Provider)); name != "" { + return name + } + if strings.Contains(os.Getenv("DOCKER_HOST"), "podman.sock") { + return "podman" + } + return "docker" +} + +func RegisterProvider(name string, factory ProviderFactory) error { + return runtimeProviders.register(name, factory) +} + +func SelectRuntime(name string) error { + return runtimeProviders.selectProvider(name) +} + +func Runtime(ctx context.Context) (RuntimeConfig, error) { + return runtimeProviders.resolve(ctx, ConfiguredProviderName()) +} + +func HasRegisteredProvider(name string) bool { + runtimeProviders.mu.Lock() + defer runtimeProviders.mu.Unlock() + _, ok := runtimeProviders.factories[name] + return ok +} diff --git a/vendor/github.com/testcontainers/testcontainers-go/internal/version.go b/vendor/github.com/testcontainers/testcontainers-go/internal/version.go index 6236de0b..f3e33395 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/internal/version.go +++ b/vendor/github.com/testcontainers/testcontainers-go/internal/version.go @@ -1,4 +1,4 @@ package internal // Version is the next development version of the application -const Version = "0.44.0" +const Version = "0.45.0" diff --git a/vendor/github.com/testcontainers/testcontainers-go/mkdocs.yml b/vendor/github.com/testcontainers/testcontainers-go/mkdocs.yml index 679328e0..45fed574 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/mkdocs.yml +++ b/vendor/github.com/testcontainers/testcontainers-go/mkdocs.yml @@ -26,6 +26,7 @@ extra_javascript: - https://cdn.jsdelivr.net/npm/papaparse@5.4.1/papaparse.min.js - js/usage-metrics.js - js/modules-usage-metrics.js + - js/clones-metrics.js repo_name: testcontainers-go repo_url: https://github.com/testcontainers/testcontainers-go markdown_extensions: @@ -75,7 +76,6 @@ nav: - features/tls.md - Modules: - modules/index.md - - modules/fakegcsserver.md - modules/activemq.md - modules/aerospike.md - modules/arangodb.md @@ -99,8 +99,10 @@ nav: - modules/dynamodb.md - modules/elasticsearch.md - modules/etcd.md + - modules/fakegcsserver.md - modules/firebird.md - modules/forgejo.md + - modules/garage.md - modules/gcloud.md - modules/grafana-lgtm.md - modules/inbucket.md @@ -133,6 +135,7 @@ nav: - modules/orientdb.md - modules/papercutsmtp.md - modules/pinecone.md + - modules/podman.md - modules/postgres.md - modules/presto.md - modules/pulsar.md @@ -144,6 +147,7 @@ nav: - modules/redpanda.md - modules/registry.md - modules/s3mock.md + - modules/sbx.md - modules/scylladb.md - modules/sftp.md - modules/socat.md @@ -178,13 +182,15 @@ nav: - system_requirements/ci/travis.md - system_requirements/using_colima.md - system_requirements/using_podman.md + - system_requirements/using_sbx.md - system_requirements/rancher.md - Usage Metrics: - Core Library: usage-metrics/index.md - Modules: usage-metrics/modules.md + - GitHub Clones: usage-metrics/clones.md - Dependabot: dependabot.md - Contributing: contributing.md - Getting help: getting_help.md edit_uri: edit/main/docs/ extra: - latest_version: v0.44.0 + latest_version: v0.45.0 diff --git a/vendor/github.com/testcontainers/testcontainers-go/netlify.toml b/vendor/github.com/testcontainers/testcontainers-go/netlify.toml new file mode 100644 index 00000000..2ff22769 --- /dev/null +++ b/vendor/github.com/testcontainers/testcontainers-go/netlify.toml @@ -0,0 +1,8 @@ +# Netlify build configuration for the docs site (https://golang.testcontainers.org). +# The Python dependencies live in docs-site, so that they are not part of the Go module. +[build] + command = "pip install -r docs-site/requirements.txt && mkdocs build" + publish = "site" + +[build.environment] + PYTHON_VERSION = "3.13" diff --git a/vendor/github.com/testcontainers/testcontainers-go/port_forwarding.go b/vendor/github.com/testcontainers/testcontainers-go/port_forwarding.go index e4639e3a..80c9b805 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/port_forwarding.go +++ b/vendor/github.com/testcontainers/testcontainers-go/port_forwarding.go @@ -38,7 +38,7 @@ var sshPassword = uuid.NewString() // At least one port must be provided to expose. // The steps are: // 1. Create a new SSHD container. -// 2. Expose the host ports to the container after the container is ready. +// 2. Set up host port forwarding before the target container is created. // 3. Close the SSH sessions before killing the container. func exposeHostPorts(ctx context.Context, req *ContainerRequest, ports ...int) (sshdConnectHook ContainerLifecycleHooks, err error) { if len(ports) == 0 { @@ -158,11 +158,11 @@ func exposeHostPorts(ctx context.Context, req *ContainerRequest, ports ...int) ( }, } - // after the container is ready, create the SSH tunnel + // before the container is created, create the SSH tunnel // for each exposed port from the host. sshdConnectHook = ContainerLifecycleHooks{ - PostReadies: []ContainerHook{ - func(ctx context.Context, _ Container) error { + PreCreates: []ContainerRequestHook{ + func(ctx context.Context, req ContainerRequest) error { return sshdContainer.exposeHostPort(ctx, req.HostAccessPorts...) }, }, @@ -205,7 +205,7 @@ func newSshdContainer(ctx context.Context, opts ...ContainerCustomizer) (*sshdCo // It's an internal type that extends the DockerContainer type, to add the SSH tunnelling capabilities. type sshdContainer struct { Container - port string + addr string sshConfig *ssh.ClientConfig portForwarders []*portForwarder } @@ -240,12 +240,17 @@ func (sshdC *sshdContainer) closePorts() error { // clientConfig sets up the SSHD client configuration. func (sshdC *sshdContainer) clientConfig(ctx context.Context) error { + host, err := sshdC.Host(ctx) + if err != nil { + return fmt.Errorf("host: %w", err) + } + mappedPort, err := sshdC.MappedPort(ctx, sshPort) if err != nil { return fmt.Errorf("mapped port: %w", err) } - sshdC.port = mappedPort.Port() + sshdC.addr = net.JoinHostPort(host, mappedPort.Port()) sshdC.sshConfig = &ssh.ClientConfig{ User: user, HostKeyCallback: ssh.InsecureIgnoreHostKey(), @@ -263,7 +268,7 @@ func (sshdC *sshdContainer) exposeHostPort(ctx context.Context, ports ...int) (e } }() for _, port := range ports { - pf, err := newPortForwarder(ctx, "localhost:"+sshdC.port, sshdC.sshConfig, port) + pf, err := newPortForwarder(ctx, sshdC.addr, sshdC.sshConfig, port) if err != nil { return fmt.Errorf("new port forwarder: %w", err) } diff --git a/vendor/github.com/testcontainers/testcontainers-go/provider.go b/vendor/github.com/testcontainers/testcontainers-go/provider.go index 210f451f..3326284b 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/provider.go +++ b/vendor/github.com/testcontainers/testcontainers-go/provider.go @@ -16,6 +16,7 @@ import ( const ( ProviderDefault ProviderType = iota // default will auto-detect provider from DOCKER_HOST environment variable ProviderDocker + // Deprecated: import modules/podman and select provider=podman instead. ProviderPodman ) @@ -94,6 +95,32 @@ type ContainerProvider interface { Config() TestcontainersConfig } +// UnderlyingProviderType resolves the provider using the explicit selection, +// configuration, and DOCKER_HOST, in that order. It does not contact a daemon. +func (t ProviderType) UnderlyingProviderType() ProviderType { + // Provider set within code has precedence over all others + if t != ProviderDefault { + return t + } + + // Configuration of an explicit provider has the next priority + conf := config.Read() + switch strings.ToLower(strings.TrimSpace(conf.Provider)) { + case "docker": + return ProviderDocker + case "podman": + return ProviderPodman + } + + // Preserve auto-detection from DOCKER_HOST without initializing host discovery. + if strings.Contains(os.Getenv("DOCKER_HOST"), "podman.sock") { + return ProviderPodman + } + + // When all else fails, default to Docker + return ProviderDocker +} + // GetProvider provides the provider implementation for a certain type func (t ProviderType) GetProvider(opts ...GenericProviderOption) (GenericProvider, error) { opt := &GenericProviderOptions{ @@ -103,14 +130,25 @@ func (t ProviderType) GetProvider(opts ...GenericProviderOption) (GenericProvide for _, o := range opts { o.ApplyGenericTo(opt) } - - pt := t - if pt == ProviderDefault && strings.Contains(os.Getenv("DOCKER_HOST"), "podman.sock") { - pt = ProviderPodman + if t != ProviderDefault { + var name string + switch t { + case ProviderDocker: + name = "docker" + case ProviderPodman: + name = "podman" + default: + return nil, errors.New("unknown provider") + } + if err := core.SelectRuntime(name); err != nil { + return nil, err + } + } else if name := core.ConfiguredProviderName(); core.HasRegisteredProvider(name) || (name != "docker" && name != "podman") { + return NewDockerProvider(Generic2DockerOptions(opts...)...) } - switch pt { - case ProviderDefault, ProviderDocker: + switch t.UnderlyingProviderType() { + case ProviderDocker: providerOptions := append(Generic2DockerOptions(opts...), WithDefaultBridgeNetwork(Bridge)) provider, err := NewDockerProvider(providerOptions...) if err != nil { @@ -145,6 +183,13 @@ func NewDockerProvider(provOpts ...DockerProviderOption) (*DockerProvider, error if err != nil { return nil, err } + runtime, err := core.Runtime(ctx) + if err != nil { + return nil, err + } + if o.defaultBridgeNetworkName == "" { + o.defaultBridgeNetworkName = runtime.DefaultBridgeNetwork + } c, err := NewDockerClientWithOpts(ctx) if err != nil { return nil, err @@ -154,5 +199,6 @@ func NewDockerProvider(provOpts ...DockerProviderOption) (*DockerProvider, error client: c, host: host, config: config.Read(), + runtime: runtime, }, nil } diff --git a/vendor/github.com/testcontainers/testcontainers-go/requirements.txt b/vendor/github.com/testcontainers/testcontainers-go/requirements.txt deleted file mode 100644 index 69aeed52..00000000 --- a/vendor/github.com/testcontainers/testcontainers-go/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -mkdocs==1.5.3 -mkdocs-codeinclude-plugin==0.3.1 -mkdocs-include-markdown-plugin==7.3.0 -mkdocs-material==9.5.18 -mkdocs-markdownextradata-plugin==0.2.6 diff --git a/vendor/github.com/testcontainers/testcontainers-go/runtime.txt b/vendor/github.com/testcontainers/testcontainers-go/runtime.txt deleted file mode 100644 index 24ee5b1b..00000000 --- a/vendor/github.com/testcontainers/testcontainers-go/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -3.13 diff --git a/vendor/github.com/testcontainers/testcontainers-go/runtime_provider.go b/vendor/github.com/testcontainers/testcontainers-go/runtime_provider.go new file mode 100644 index 00000000..03f389cf --- /dev/null +++ b/vendor/github.com/testcontainers/testcontainers-go/runtime_provider.go @@ -0,0 +1,28 @@ +package testcontainers + +import "github.com/testcontainers/testcontainers-go/internal/core" + +// RuntimeProvider prepares a Docker-compatible runtime before any Docker host, +// socket, or client is discovered. Its Initialize method runs once per process. +// Implementations must not call testcontainers constructors from Initialize. +// The initialization context preserves the first caller's values but not its +// cancellation or deadline. Implementations should set their own startup timeout. +// Canceling an individual caller stops its wait without canceling shared startup. +type RuntimeProvider = core.RuntimeProvider + +// RuntimeConfig supplies the client endpoint, daemon-side socket path, published +// port host, and default bridge network. Empty fields use standard discovery. +// Name is assigned by the registry, regardless of the value returned by a provider. +type RuntimeConfig = core.RuntimeConfig + +// ProviderFactory constructs a provider without starting its runtime on import. +type ProviderFactory = core.ProviderFactory + +// RegisterProvider registers a named runtime, normally from a module's init +// function. Registration must precede Docker discovery. Names are case insensitive; +// duplicate names and attempts to replace the built-in Docker provider are errors. +// Select a registered provider through TESTCONTAINERS_PROVIDER or the provider +// property. A module must be imported; adding it to go.mod alone does not register it. +func RegisterProvider(name string, factory ProviderFactory) error { + return core.RegisterProvider(name, factory) +} diff --git a/vendor/github.com/testcontainers/testcontainers-go/testing.go b/vendor/github.com/testcontainers/testcontainers-go/testing.go index 32a7909d..156a9835 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/testing.go +++ b/vendor/github.com/testcontainers/testcontainers-go/testing.go @@ -31,10 +31,11 @@ func SkipIfProviderIsNotHealthy(t *testing.T) { }() ctx := context.Background() - provider, err := ProviderDocker.GetProvider() + provider, err := ProviderDefault.GetProvider() if err != nil { t.Skipf("Docker is not running. Testcontainers can't perform is work without it: %s", err) } + t.Cleanup(func() { _ = provider.Close() }) err = provider.Health(ctx) if err != nil { t.Skipf("Docker is not running. Testcontainers can't perform is work without it: %s", err) diff --git a/vendor/github.com/testcontainers/testcontainers-go/wait/all.go b/vendor/github.com/testcontainers/testcontainers-go/wait/all.go index e6503307..246704da 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/wait/all.go +++ b/vendor/github.com/testcontainers/testcontainers-go/wait/all.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "reflect" "strings" "time" ) @@ -61,7 +60,7 @@ func (ms *MultiStrategy) String() string { var strategies []string for _, strategy := range ms.Strategies { - if strategy == nil || reflect.ValueOf(strategy).IsNil() { + if isNilStrategy(strategy) { continue } if s, ok := strategy.(fmt.Stringer); ok { @@ -88,7 +87,7 @@ func (ms *MultiStrategy) WaitUntilReady(ctx context.Context, target StrategyTarg } for _, strategy := range ms.Strategies { - if strategy == nil || reflect.ValueOf(strategy).IsNil() { + if isNilStrategy(strategy) { // A module could be appending strategies after part of the container initialization, // and use wait.ForAll on a not initialized strategy. // In this case, we just skip the nil strategy. diff --git a/vendor/github.com/testcontainers/testcontainers-go/wait/any.go b/vendor/github.com/testcontainers/testcontainers-go/wait/any.go index 15d9c150..2b6ebd0a 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/wait/any.go +++ b/vendor/github.com/testcontainers/testcontainers-go/wait/any.go @@ -59,7 +59,7 @@ func (ms *AnyMultiStrategy) String() string { var strategies []string for _, strategy := range ms.Strategies { - if strategy == nil || reflect.ValueOf(strategy).IsNil() { + if isNilStrategy(strategy) { continue } if s, ok := strategy.(fmt.Stringer); ok { @@ -91,7 +91,7 @@ func (ms *AnyMultiStrategy) WaitUntilReady(ctx context.Context, target StrategyT var valid int for _, strategy := range ms.Strategies { - if strategy == nil || reflect.ValueOf(strategy).IsNil() { + if isNilStrategy(strategy) { // A module could be appending strategies after part of the container initialization, // and use wait.ForAny on a not initialized strategy. // In this case, we just skip the nil strategy. @@ -114,15 +114,25 @@ func (ms *AnyMultiStrategy) WaitUntilReady(ctx context.Context, target StrategyT return nil } - for { - select { - case err := <-resCh: - if err != nil { - return err - } - return nil - case <-ctx.Done(): - return fmt.Errorf("timed out waiting for strategies: %w", ctx.Err()) - } + select { + case err := <-resCh: + return err + case <-ctx.Done(): + return fmt.Errorf("timed out waiting for strategies: %w", ctx.Err()) + } +} + +// isNilStrategy reports whether the strategy is nil, or a typed nil of a +// nil-capable kind. Non-pointer implementations (e.g. structs) are never nil. +func isNilStrategy(strategy Strategy) bool { + if strategy == nil { + return true + } + + switch v := reflect.ValueOf(strategy); v.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice, reflect.UnsafePointer: + return v.IsNil() + default: + return false } } diff --git a/vendor/github.com/testcontainers/testcontainers-go/wait/host_port.go b/vendor/github.com/testcontainers/testcontainers-go/wait/host_port.go index 60cf5e4e..4eaefe82 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/wait/host_port.go +++ b/vendor/github.com/testcontainers/testcontainers-go/wait/host_port.go @@ -264,15 +264,13 @@ func externalCheck(ctx context.Context, ipAddress string, port network.Port, tar } conn, err := dialer.DialContext(ctx, string(proto), address) if err != nil { - var v *net.OpError - if errors.As(err, &v) { - var v2 *os.SyscallError - if errors.As(v.Err, &v2) { - if isConnRefusedErr(v2.Err) { - time.Sleep(waitInterval) - continue - } + if isRetryableDialErr(ctx, err) { + select { + case <-ctx.Done(): + return fmt.Errorf("dial: %w", ctx.Err()) + case <-time.After(waitInterval): } + continue } return fmt.Errorf("dial: %w", err) } @@ -282,6 +280,22 @@ func externalCheck(ctx context.Context, ipAddress string, port network.Port, tar } } +// isRetryableDialErr reports whether a failed dial should be retried until the +// context expires: connection refused, or a connect timeout (e.g. ETIMEDOUT) +// while the context is still alive. +func isRetryableDialErr(ctx context.Context, err error) bool { + var v *net.OpError + if errors.As(err, &v) { + var v2 *os.SyscallError + if errors.As(v.Err, &v2) && isConnRefusedErr(v2.Err) { + return true + } + } + + var ne net.Error + return ctx.Err() == nil && errors.As(err, &ne) && ne.Timeout() +} + func internalCheck(ctx context.Context, internalPort network.Port, target StrategyTarget) error { command := buildInternalCheckCommand(internalPort.Num()) for { diff --git a/vendor/github.com/testcontainers/testcontainers-go/wait/http.go b/vendor/github.com/testcontainers/testcontainers-go/wait/http.go index 95208290..28a1a717 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/wait/http.go +++ b/vendor/github.com/testcontainers/testcontainers-go/wait/http.go @@ -268,7 +268,6 @@ func (ws *HTTPStrategy) WaitUntilReady(ctx context.Context, target StrategyTarge DialContext: (&net.Dialer{ Timeout: time.Second, KeepAlive: 30 * time.Second, - DualStack: true, }).DialContext, ForceAttemptHTTP2: true, MaxIdleConns: 100, diff --git a/vendor/github.com/testcontainers/testcontainers-go/wait/log.go b/vendor/github.com/testcontainers/testcontainers-go/wait/log.go index 11113dc9..90d5a864 100644 --- a/vendor/github.com/testcontainers/testcontainers-go/wait/log.go +++ b/vendor/github.com/testcontainers/testcontainers-go/wait/log.go @@ -171,14 +171,22 @@ func (ws *LogStrategy) WaitUntilReady(ctx context.Context, target StrategyTarget reader, err := target.Logs(ctx) if err != nil { - // TODO: fix as this will wait for timeout if the logs are not available. + if checkErr != nil { + // The container is not usable either, so polling would only run out the timeout. + return errors.Join(checkErr, fmt.Errorf("get logs: %w", err)) + } + time.Sleep(ws.PollInterval) continue } b, err := io.ReadAll(reader) if err != nil { - // TODO: fix as this will wait for timeout if the logs are not readable. + if checkErr != nil { + // The container is not usable either, so polling would only run out the timeout. + return errors.Join(checkErr, fmt.Errorf("read logs: %w", err)) + } + time.Sleep(ws.PollInterval) continue } diff --git a/vendor/modules.txt b/vendor/modules.txt index cc9094e1..4255ef2f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1031,7 +1031,7 @@ github.com/lufia/plan9stats # github.com/macabu/inamedparam v0.2.0 ## explicit; go 1.23.0 github.com/macabu/inamedparam -# github.com/magiconair/properties v1.8.10 +# github.com/magiconair/properties v1.18.12 ## explicit; go 1.19 github.com/magiconair/properties # github.com/manuelarte/embeddedstructfieldcheck v0.4.0 @@ -1423,8 +1423,8 @@ github.com/stretchr/testify/require # github.com/subosito/gotenv v1.6.0 ## explicit; go 1.18 github.com/subosito/gotenv -# github.com/testcontainers/testcontainers-go v0.44.0 -## explicit; go 1.25.0 +# github.com/testcontainers/testcontainers-go v0.45.0 +## explicit; go 1.26.0 github.com/testcontainers/testcontainers-go github.com/testcontainers/testcontainers-go/exec github.com/testcontainers/testcontainers-go/internal