From e397a6a15c7b9ee9325c4798c1c6deeb2d427175 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 28 Jan 2026 19:22:01 +0800 Subject: [PATCH 001/124] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0java-sdk?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-sdk/pom.xml | 13 ++++ .../wikiglobal/wikibroker/openapi/Core.java | 74 +++++++++++++++++++ .../wikibroker/openapi/OpenApi.java | 13 ---- .../wikibroker/openapi/WikiBrokerOpenApi.java | 39 ++++++++++ .../wikibroker/openapi/common/Hash.java | 34 +++++++++ .../wikibroker/openapi/common/Utils.java | 13 ++++ .../openapi/common/enums/CustomHeaders.java | 18 +++++ .../openapi/common/types/HeadersLike.java | 9 +++ .../openapi/common/types/RequestsInfo.java | 9 +++ .../wikibroker/openapi/OpenApiTest.java | 4 - 10 files changed, 209 insertions(+), 17 deletions(-) create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/OpenApi.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/enums/CustomHeaders.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/HeadersLike.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestsInfo.java diff --git a/java-sdk/pom.xml b/java-sdk/pom.xml index 1159542..747c7d0 100644 --- a/java-sdk/pom.xml +++ b/java-sdk/pom.xml @@ -34,5 +34,18 @@ 5.2.1 provided + + org.jspecify + jspecify + 1.0.0 + compile + + + + commons-codec + commons-codec + 1.20.0 + compile + diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java new file mode 100644 index 0000000..1917f6b --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java @@ -0,0 +1,74 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.common.Hash; +import com.wikiglobal.wikibroker.openapi.common.Utils; +import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; +import com.wikiglobal.wikibroker.openapi.common.types.RequestsInfo; + +import org.apache.commons.codec.binary.Hex; +import org.jetbrains.annotations.Contract; +import org.jspecify.annotations.NonNull; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Map; +import java.util.stream.Collectors; + +public final class Core { + private Core() { + } + + @Contract("_, _ -> new") + public static @NonNull String generateSignature( + @NonNull String key, + @NonNull String message + ) throws NoSuchAlgorithmException, InvalidKeyException { + return Hex.encodeHexString(Hash.hmacSha256(key, message)); + } + + public static @NonNull String generateCanonicalString( + @NonNull RequestsInfo req + ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException { + final var method = req.method().toUpperCase(); + final var path = new URI(req.url()).toURL().getPath(); + final var canonicalQuery = Core.buildCanonicalQuery(req); + final var apiKey = req.headers().get(CustomHeaders.ApiKey.value()); + final var timestamp = req.headers().get(CustomHeaders.TimeStamp.value()); + final var nonce = req.headers().get(CustomHeaders.Nonce.value()); + final var bodyHash = Core.calculateBodyHash(req); + return String.join("\n", method, path, canonicalQuery, apiKey, timestamp, nonce, bodyHash); + } + + private static @NonNull String calculateBodyHash(RequestsInfo req) throws NoSuchAlgorithmException { + final var body = Utils.isRequestUsePostMethod(req) ? req.data() : ""; + final var hash = Hash.sha256Hash(body); + return Hex.encodeHexString(hash); + } + + private static String buildCanonicalQuery( + @NonNull RequestsInfo req + ) throws URISyntaxException, MalformedURLException { + final var queryString = new URI(req.url()).toURL().getQuery(); + final var query = Arrays.stream(queryString.split("&")) + .map(pair -> pair.split("=")) + .collect(Collectors.groupingBy( + x -> x[0], + Collectors.mapping(x -> x[1], Collectors.toList()) + )); + for (var pair : query.entrySet()) { + pair.getValue().sort(Comparator.naturalOrder()); + } + final var parts = new ArrayList<>(query.entrySet()); + parts.sort(Map.Entry.comparingByKey()); + return parts.stream().flatMap(item -> { + final var values = item.getValue(); + return values.stream().map(value -> String.format("%s=%s", item.getKey(), value)); + }).collect(Collectors.joining("&")); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/OpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/OpenApi.java deleted file mode 100644 index 8e668bf..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/OpenApi.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ -package com.wikiglobal.wikibroker.openapi; - -/** - * - * @author auston - */ -public class OpenApi { - -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java new file mode 100644 index 0000000..b7799e6 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -0,0 +1,39 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; +import com.wikiglobal.wikibroker.openapi.common.types.HeadersLike; +import com.wikiglobal.wikibroker.openapi.common.types.RequestsInfo; +import org.jspecify.annotations.NonNull; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.Instant; +import java.util.UUID; + +@SuppressWarnings("unused") +public class WikiBrokerOpenApi { + private WikiBrokerOpenApi() { + } + + public static void addXHeaders( + @NonNull HeadersLike headers, + @NonNull UUID apiKey, + @NonNull Instant timestamp, + @NonNull UUID nonce + ) { + headers.set(CustomHeaders.ApiKey.value(), apiKey.toString()); + headers.set(CustomHeaders.TimeStamp.value(), String.valueOf(timestamp.toEpochMilli())); + headers.set(CustomHeaders.Nonce.value(), nonce.toString()); + } + + public static void sign( + RequestsInfo req, + String key + ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { + final var canonicalString = Core.generateCanonicalString(req); + final var signature = Core.generateSignature(key, canonicalString); + req.headers().set(CustomHeaders.Signature.value(), signature); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java new file mode 100644 index 0000000..85904cd --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java @@ -0,0 +1,34 @@ +package com.wikiglobal.wikibroker.openapi.common; + +import org.jspecify.annotations.NonNull; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public final class Hash { + private Hash() { + } + + public static byte[] hmacSha256( + @NonNull String key, + @NonNull String message + ) throws NoSuchAlgorithmException, InvalidKeyException { + final var restoreKey = new SecretKeySpec( + key.getBytes(StandardCharsets.UTF_8), + "HmacSHA256" + ); + final var mac = Mac.getInstance(restoreKey.getAlgorithm()); + mac.init(restoreKey); + return mac.doFinal(message.getBytes(StandardCharsets.UTF_8)); + } + + public static byte[] sha256Hash(@NonNull String message) throws NoSuchAlgorithmException { + final var md = MessageDigest.getInstance("SHA-256"); + md.update(message.getBytes(StandardCharsets.UTF_8)); + return md.digest(); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java new file mode 100644 index 0000000..016bbd3 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java @@ -0,0 +1,13 @@ +package com.wikiglobal.wikibroker.openapi.common; + +import com.wikiglobal.wikibroker.openapi.common.types.RequestsInfo; +import org.jspecify.annotations.NonNull; + +public class Utils { + private Utils() { + } + + public static boolean isRequestUsePostMethod(@NonNull RequestsInfo req) { + return req.method().equalsIgnoreCase("POST"); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/enums/CustomHeaders.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/enums/CustomHeaders.java new file mode 100644 index 0000000..0a70d80 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/enums/CustomHeaders.java @@ -0,0 +1,18 @@ +package com.wikiglobal.wikibroker.openapi.common.enums; + +public enum CustomHeaders { + ApiKey("X-Api-Key"), + TimeStamp("X-Timestamp"), + Nonce("X-Nonce"), + Signature("X-Signature"); + + private final String value; + + CustomHeaders(String value) { + this.value = value; + } + + public String value() { + return this.value; + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/HeadersLike.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/HeadersLike.java new file mode 100644 index 0000000..add4fb5 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/HeadersLike.java @@ -0,0 +1,9 @@ +package com.wikiglobal.wikibroker.openapi.common.types; + +import org.jspecify.annotations.NonNull; + +public interface HeadersLike { + void set(@NonNull String field, @NonNull String value); + + String get(@NonNull String field); +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestsInfo.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestsInfo.java new file mode 100644 index 0000000..a1dbbd6 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestsInfo.java @@ -0,0 +1,9 @@ +package com.wikiglobal.wikibroker.openapi.common.types; + +public record RequestsInfo( + HeadersLike headers, + String method, + String url, + String data +) { +} diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index 9eca932..dcfbc33 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -1,7 +1,3 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/UnitTests/JUnit5TestClass.java to edit this template - */ package com.wikiglobal.wikibroker.openapi; import org.junit.jupiter.api.Test; From b0fa2b79e9a5c6a1b1bf3f9f62936ebde53c904d Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 29 Jan 2026 18:25:56 +0800 Subject: [PATCH 002/124] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96java-sdk?= =?UTF-8?q?=E4=B8=AD=E7=B1=BB=E5=9E=8B=E6=8A=BD=E8=B1=A1=E4=B8=8E=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wikiglobal/wikibroker/openapi/Core.java | 24 +++++++++---------- .../wikibroker/openapi/WikiBrokerOpenApi.java | 24 ++++++++++--------- .../wikibroker/openapi/common/Utils.java | 6 ++--- .../openapi/common/types/HeadersLike.java | 9 ------- .../openapi/common/types/LoadHeaders.java | 9 +++++++ .../openapi/common/types/RequestBuilder.java | 18 ++++++++++++++ .../openapi/common/types/RequestOperator.java | 4 ++++ .../openapi/common/types/RequestReader.java | 11 +++++++++ .../openapi/common/types/RequestsInfo.java | 9 ------- .../wikibroker/openapi/common/types/Sign.java | 13 ++++++++++ .../openapi/common/types/Wrapper.java | 5 ++++ 11 files changed, 88 insertions(+), 44 deletions(-) delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/HeadersLike.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestOperator.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestReader.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestsInfo.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Wrapper.java diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java index 1917f6b..88eaab7 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java @@ -3,8 +3,8 @@ import com.wikiglobal.wikibroker.openapi.common.Hash; import com.wikiglobal.wikibroker.openapi.common.Utils; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.RequestsInfo; +import com.wikiglobal.wikibroker.openapi.common.types.RequestReader; import org.apache.commons.codec.binary.Hex; import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; @@ -33,28 +33,28 @@ private Core() { } public static @NonNull String generateCanonicalString( - @NonNull RequestsInfo req + @NonNull RequestReader req ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException { - final var method = req.method().toUpperCase(); - final var path = new URI(req.url()).toURL().getPath(); + final var method = req.getMethod().toUpperCase(); + final var path = new URI(req.getUrl()).toURL().getPath(); final var canonicalQuery = Core.buildCanonicalQuery(req); - final var apiKey = req.headers().get(CustomHeaders.ApiKey.value()); - final var timestamp = req.headers().get(CustomHeaders.TimeStamp.value()); - final var nonce = req.headers().get(CustomHeaders.Nonce.value()); + final var apiKey = req.getHeader(CustomHeaders.ApiKey.value()); + final var timestamp = req.getHeader(CustomHeaders.TimeStamp.value()); + final var nonce = req.getHeader(CustomHeaders.Nonce.value()); final var bodyHash = Core.calculateBodyHash(req); return String.join("\n", method, path, canonicalQuery, apiKey, timestamp, nonce, bodyHash); } - private static @NonNull String calculateBodyHash(RequestsInfo req) throws NoSuchAlgorithmException { - final var body = Utils.isRequestUsePostMethod(req) ? req.data() : ""; + private static @NonNull String calculateBodyHash(@NonNull RequestReader req) throws NoSuchAlgorithmException { + final var body = Utils.isRequestUsePostMethod(req) ? req.getBody() : ""; final var hash = Hash.sha256Hash(body); return Hex.encodeHexString(hash); } - private static String buildCanonicalQuery( - @NonNull RequestsInfo req + private static @NonNull String buildCanonicalQuery( + @NonNull RequestReader req ) throws URISyntaxException, MalformedURLException { - final var queryString = new URI(req.url()).toURL().getQuery(); + final var queryString = new URI(req.getUrl()).toURL().getQuery(); final var query = Arrays.stream(queryString.split("&")) .map(pair -> pair.split("=")) .collect(Collectors.groupingBy( diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java index b7799e6..c967f2b 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -1,8 +1,8 @@ package com.wikiglobal.wikibroker.openapi; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.HeadersLike; -import com.wikiglobal.wikibroker.openapi.common.types.RequestsInfo; +import com.wikiglobal.wikibroker.openapi.common.types.RequestBuilder; +import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; import org.jspecify.annotations.NonNull; import java.net.MalformedURLException; @@ -12,28 +12,30 @@ import java.time.Instant; import java.util.UUID; -@SuppressWarnings("unused") public class WikiBrokerOpenApi { private WikiBrokerOpenApi() { } - public static void addXHeaders( - @NonNull HeadersLike headers, + public static void addXHeaders( + @NonNull RequestBuilder builder, @NonNull UUID apiKey, @NonNull Instant timestamp, @NonNull UUID nonce ) { - headers.set(CustomHeaders.ApiKey.value(), apiKey.toString()); - headers.set(CustomHeaders.TimeStamp.value(), String.valueOf(timestamp.toEpochMilli())); - headers.set(CustomHeaders.Nonce.value(), nonce.toString()); + builder.setHeader(CustomHeaders.ApiKey.value(), apiKey.toString()); + builder.setHeader( + CustomHeaders.TimeStamp.value(), + String.valueOf(timestamp.toEpochMilli()) + ); + builder.setHeader(CustomHeaders.Nonce.value(), nonce.toString()); } - public static void sign( - RequestsInfo req, + public static void sign( + RequestOperator req, String key ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { final var canonicalString = Core.generateCanonicalString(req); final var signature = Core.generateSignature(key, canonicalString); - req.headers().set(CustomHeaders.Signature.value(), signature); + req.setHeader(CustomHeaders.Signature.value(), signature); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java index 016bbd3..bd43833 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java @@ -1,13 +1,13 @@ package com.wikiglobal.wikibroker.openapi.common; -import com.wikiglobal.wikibroker.openapi.common.types.RequestsInfo; +import com.wikiglobal.wikibroker.openapi.common.types.RequestReader; import org.jspecify.annotations.NonNull; public class Utils { private Utils() { } - public static boolean isRequestUsePostMethod(@NonNull RequestsInfo req) { - return req.method().equalsIgnoreCase("POST"); + public static boolean isRequestUsePostMethod(@NonNull RequestReader req) { + return req.getMethod().equalsIgnoreCase("POST"); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/HeadersLike.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/HeadersLike.java deleted file mode 100644 index add4fb5..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/HeadersLike.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.wikiglobal.wikibroker.openapi.common.types; - -import org.jspecify.annotations.NonNull; - -public interface HeadersLike { - void set(@NonNull String field, @NonNull String value); - - String get(@NonNull String field); -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java new file mode 100644 index 0000000..21ff7e2 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java @@ -0,0 +1,9 @@ +package com.wikiglobal.wikibroker.openapi.common.types; + +import java.time.Instant; +import java.util.UUID; + +@FunctionalInterface +public interface LoadHeaders { + void accept(RequestBuilder builder, UUID apiKey, Instant timestamp, UUID nonce); +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java new file mode 100644 index 0000000..167503a --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java @@ -0,0 +1,18 @@ +package com.wikiglobal.wikibroker.openapi.common.types; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +public interface RequestBuilder { + RequestBuilder setHeader(String name, String value); + + RequestBuilder setMethod(String method); + + RequestBuilder setUrl(String url); + + RequestBuilder setBody(String data); + + T build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException; +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestOperator.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestOperator.java new file mode 100644 index 0000000..5c90b95 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestOperator.java @@ -0,0 +1,4 @@ +package com.wikiglobal.wikibroker.openapi.common.types; + +public interface RequestOperator extends RequestBuilder, RequestReader { +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestReader.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestReader.java new file mode 100644 index 0000000..07723e3 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestReader.java @@ -0,0 +1,11 @@ +package com.wikiglobal.wikibroker.openapi.common.types; + +public interface RequestReader { + String getHeader(String name); + + String getMethod(); + + String getUrl(); + + String getBody(); +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestsInfo.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestsInfo.java deleted file mode 100644 index a1dbbd6..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestsInfo.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.wikiglobal.wikibroker.openapi.common.types; - -public record RequestsInfo( - HeadersLike headers, - String method, - String url, - String data -) { -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java new file mode 100644 index 0000000..1bc9791 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java @@ -0,0 +1,13 @@ +package com.wikiglobal.wikibroker.openapi.common.types; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +public interface Sign { + void accept( + RequestOperator req, + String key + ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException; +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Wrapper.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Wrapper.java new file mode 100644 index 0000000..69a2b70 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Wrapper.java @@ -0,0 +1,5 @@ +package com.wikiglobal.wikibroker.openapi.common.types; + +public interface Wrapper { + T raw(); +} From 80c712f547a95ecb4356cd39fba41f70cbc3efd9 Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 29 Jan 2026 18:26:33 +0800 Subject: [PATCH 003/124] =?UTF-8?q?feat:=20=E5=9C=A8java-sdk=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8E=9F=E7=94=9Fhttp=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E9=80=82=E9=85=8D=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openapi/adapters/HttpRequestBuilder.java | 103 ++++++++++++++++++ .../wikibroker/openapi/OpenApiTest.java | 67 +++++++++++- 2 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java new file mode 100644 index 0000000..bb1f8cc --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java @@ -0,0 +1,103 @@ +package com.wikiglobal.wikibroker.openapi.adapters; + +import com.wikiglobal.wikibroker.openapi.common.types.*; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpRequest; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.function.Supplier; + +public class HttpRequestBuilder implements RequestOperator, Wrapper { + private final HttpRequest.Builder raw; + private final Map headers; + private String method; + private String url; + private String body; + private final UUID apiKey; + private final String apiSecret; + private final LoadHeaders loadHeaders; + private final Sign sign; + private final Supplier timestampGenerator; + private final Supplier idGenerator; + + public HttpRequestBuilder( + HttpRequest.Builder raw, + UUID apiKey, + String apiSecret, + LoadHeaders loadHeaders, + Sign sign, + Supplier timestampGenerator, + Supplier idGenerator + ) { + this.raw = raw; + this.headers = new HashMap<>(); + this.apiKey = apiKey; + this.apiSecret = apiSecret; + this.loadHeaders = loadHeaders; + this.sign = sign; + this.timestampGenerator = timestampGenerator; + this.idGenerator = idGenerator; + } + + public HttpRequestBuilder setHeader(String name, String value) { + this.headers.put(name, value); + this.raw.setHeader(name, this.headers.get(name)); + return this; + } + + public HttpRequestBuilder setMethod(String method) { + this.method = method.toUpperCase(); + this.raw.method(this.method, HttpRequest.BodyPublishers.noBody()); + return this; + } + + public HttpRequestBuilder setUrl(String url) { + this.url = url; + this.raw.uri(URI.create(this.url)); + return this; + } + + public HttpRequestBuilder setBody(String data) { + this.body = data; + this.raw.method(this.method, HttpRequest.BodyPublishers.ofString(data)); + return this; + } + + public HttpRequest build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { + this.loadHeaders.accept( + this, + this.apiKey, + this.timestampGenerator.get(), + this.idGenerator.get() + ); + this.sign.accept(this, this.apiSecret); + return this.raw.build(); + } + + public HttpRequest.Builder raw() { + return this.raw; + } + + public String getHeader(String name) { + return this.headers.get(name); + } + + public String getMethod() { + return this.method; + } + + public String getUrl() { + return this.url; + } + + public String getBody() { + return this.body; + } +} diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index dcfbc33..cfe75b3 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -1,16 +1,73 @@ package com.wikiglobal.wikibroker.openapi; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; +import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; +import okhttp3.*; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.http.HttpRequest; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.Instant; +import java.util.UUID; -/** - * - * @author auston - */ public class OpenApiTest { + private static final String baseURL = "https://api.example.com"; + private static final String path = "test?q1=c&q2=b&q1=a"; + + private static String url() { + return String.format("%s/%s", OpenApiTest.baseURL, OpenApiTest.path); + } + + private static final String body = "{\"key\":\"value\"}"; + + + private static final UUID apiKey = UUID.fromString("ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"); + private static final String apiSecret = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; + private static final UUID nonce = UUID.fromString("4428a206-1afd-4b15-a98d-43e91f49a08d"); + private static final Instant timestamp = Instant.ofEpochMilli(1798115622000L); + private static final String expectedSignature = "1b0c80dbbc30905719559ab5526dfd59bae04d7337c8843efd9e51ff0af6dfb4"; public OpenApiTest() { } + @Test + void testNative() { + final var raw = HttpRequest.newBuilder(); + final var builder = new HttpRequestBuilder( + raw, + apiKey, + apiSecret, + WikiBrokerOpenApi::addXHeaders, + WikiBrokerOpenApi::sign, + () -> timestamp, + () -> nonce + ); + try { + final var req = builder.setUrl(url()).setMethod("POST").setBody(body).build(); + final var actualSignature = req.headers() + .firstValue(CustomHeaders.Signature.value()) + .orElse(""); + assertEquals(expectedSignature, actualSignature); + } catch (MalformedURLException | + URISyntaxException | + NoSuchAlgorithmException | + InvalidKeyException e) { + throw new RuntimeException(e); + } + } + + @Test + void testApache() { + // TODO + } + + @Test + void testOkHttp() { + // TODO + } } From d667c1f186fba9fa65b09c5bbf06582855ff4b21 Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 29 Jan 2026 18:30:59 +0800 Subject: [PATCH 004/124] =?UTF-8?q?refactor:=20=E5=9C=A8java-sdk=E4=B8=AD?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E9=93=BE=E5=BC=8F=E8=AF=AD=E6=B3=95=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=87=AA=E5=AE=9A=E4=B9=89=E8=AF=B7=E6=B1=82=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java index c967f2b..c2c22ba 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -22,12 +22,9 @@ public static void addXHeaders( @NonNull Instant timestamp, @NonNull UUID nonce ) { - builder.setHeader(CustomHeaders.ApiKey.value(), apiKey.toString()); - builder.setHeader( - CustomHeaders.TimeStamp.value(), - String.valueOf(timestamp.toEpochMilli()) - ); - builder.setHeader(CustomHeaders.Nonce.value(), nonce.toString()); + builder.setHeader(CustomHeaders.ApiKey.value(), apiKey.toString()) + .setHeader(CustomHeaders.TimeStamp.value(), String.valueOf(timestamp.toEpochMilli())) + .setHeader(CustomHeaders.Nonce.value(), nonce.toString()); } public static void sign( From 83a4be4b1c1154b054af3732053f10a92aacf2e6 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 10:34:21 +0800 Subject: [PATCH 005/124] =?UTF-8?q?chore:=20=E9=87=8D=E6=96=B0=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96java-sdk=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wikiglobal/wikibroker/openapi/Core.java | 15 ++++++---- .../wikibroker/openapi/WikiBrokerOpenApi.java | 12 ++++---- .../openapi/adapters/HttpRequestBuilder.java | 28 +++++++++++-------- .../wikibroker/openapi/common/Hash.java | 8 +++--- .../openapi/common/types/LoadHeaders.java | 7 ++++- .../wikibroker/openapi/common/types/Sign.java | 4 +-- 6 files changed, 43 insertions(+), 31 deletions(-) diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java index 88eaab7..e04817a 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java @@ -26,14 +26,14 @@ private Core() { @Contract("_, _ -> new") public static @NonNull String generateSignature( - @NonNull String key, - @NonNull String message + @NonNull String key, + @NonNull String message ) throws NoSuchAlgorithmException, InvalidKeyException { return Hex.encodeHexString(Hash.hmacSha256(key, message)); } public static @NonNull String generateCanonicalString( - @NonNull RequestReader req + @NonNull RequestReader req ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException { final var method = req.getMethod().toUpperCase(); final var path = new URI(req.getUrl()).toURL().getPath(); @@ -52,14 +52,17 @@ private Core() { } private static @NonNull String buildCanonicalQuery( - @NonNull RequestReader req + @NonNull RequestReader req ) throws URISyntaxException, MalformedURLException { final var queryString = new URI(req.getUrl()).toURL().getQuery(); final var query = Arrays.stream(queryString.split("&")) .map(pair -> pair.split("=")) .collect(Collectors.groupingBy( - x -> x[0], - Collectors.mapping(x -> x[1], Collectors.toList()) + x -> x[0], + Collectors.mapping( + x -> x[1], + Collectors.toList() + ) )); for (var pair : query.entrySet()) { pair.getValue().sort(Comparator.naturalOrder()); diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java index c2c22ba..7ebe1de 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -17,10 +17,10 @@ private WikiBrokerOpenApi() { } public static void addXHeaders( - @NonNull RequestBuilder builder, - @NonNull UUID apiKey, - @NonNull Instant timestamp, - @NonNull UUID nonce + @NonNull RequestBuilder builder, + @NonNull UUID apiKey, + @NonNull Instant timestamp, + @NonNull UUID nonce ) { builder.setHeader(CustomHeaders.ApiKey.value(), apiKey.toString()) .setHeader(CustomHeaders.TimeStamp.value(), String.valueOf(timestamp.toEpochMilli())) @@ -28,8 +28,8 @@ public static void addXHeaders( } public static void sign( - RequestOperator req, - String key + RequestOperator req, + String key ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { final var canonicalString = Core.generateCanonicalString(req); final var signature = Core.generateSignature(key, canonicalString); diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java index bb1f8cc..00ef4cf 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java @@ -1,6 +1,10 @@ package com.wikiglobal.wikibroker.openapi.adapters; -import com.wikiglobal.wikibroker.openapi.common.types.*; + +import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; +import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; +import com.wikiglobal.wikibroker.openapi.common.types.Sign; +import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; import java.net.MalformedURLException; import java.net.URI; @@ -28,13 +32,13 @@ public class HttpRequestBuilder implements RequestOperator, Wrapper private final Supplier idGenerator; public HttpRequestBuilder( - HttpRequest.Builder raw, - UUID apiKey, - String apiSecret, - LoadHeaders loadHeaders, - Sign sign, - Supplier timestampGenerator, - Supplier idGenerator + HttpRequest.Builder raw, + UUID apiKey, + String apiSecret, + LoadHeaders loadHeaders, + Sign sign, + Supplier timestampGenerator, + Supplier idGenerator ) { this.raw = raw; this.headers = new HashMap<>(); @@ -72,10 +76,10 @@ public HttpRequestBuilder setBody(String data) { public HttpRequest build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { this.loadHeaders.accept( - this, - this.apiKey, - this.timestampGenerator.get(), - this.idGenerator.get() + this, + this.apiKey, + this.timestampGenerator.get(), + this.idGenerator.get() ); this.sign.accept(this, this.apiSecret); return this.raw.build(); diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java index 85904cd..3198082 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java @@ -14,12 +14,12 @@ private Hash() { } public static byte[] hmacSha256( - @NonNull String key, - @NonNull String message + @NonNull String key, + @NonNull String message ) throws NoSuchAlgorithmException, InvalidKeyException { final var restoreKey = new SecretKeySpec( - key.getBytes(StandardCharsets.UTF_8), - "HmacSHA256" + key.getBytes(StandardCharsets.UTF_8), + "HmacSHA256" ); final var mac = Mac.getInstance(restoreKey.getAlgorithm()); mac.init(restoreKey); diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java index 21ff7e2..1a851e0 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java @@ -5,5 +5,10 @@ @FunctionalInterface public interface LoadHeaders { - void accept(RequestBuilder builder, UUID apiKey, Instant timestamp, UUID nonce); + void accept( + RequestBuilder builder, + UUID apiKey, + Instant timestamp, + UUID nonce + ); } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java index 1bc9791..d7a6cd4 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java @@ -7,7 +7,7 @@ public interface Sign { void accept( - RequestOperator req, - String key + RequestOperator req, + String key ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException; } From 78914a9394a8ef302d54d0a6f6493a87f7f67db7 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 10:36:45 +0800 Subject: [PATCH 006/124] =?UTF-8?q?feat:=20=E5=9C=A8java-sdk=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0okhttp=E8=AF=B7=E6=B1=82=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E9=80=82=E9=85=8D=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/OkHttpRequestBuilder.java | 107 ++++++++++++++++++ .../wikibroker/openapi/OpenApiTest.java | 40 +++++-- 2 files changed, 137 insertions(+), 10 deletions(-) create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java new file mode 100644 index 0000000..01cd74f --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java @@ -0,0 +1,107 @@ +package com.wikiglobal.wikibroker.openapi.adapters; + +import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; +import com.wikiglobal.wikibroker.openapi.common.types.Sign; +import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; +import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; +import okhttp3.Request; +import okhttp3.RequestBody; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.function.Supplier; + +public class OkHttpRequestBuilder implements RequestOperator, Wrapper { + private final Request.Builder raw; + private final Map headers; + private String method; + private String url; + private String body; + private final UUID apiKey; + private final String apiSecret; + private final LoadHeaders loadHeaders; + private final Sign sign; + private final Supplier timestampGenerator; + private final Supplier idGenerator; + + public OkHttpRequestBuilder( + Request.Builder raw, + UUID apiKey, + String apiSecret, + LoadHeaders loadHeaders, + Sign sign, + Supplier timestampGenerator, + Supplier idGenerator + ) { + this.raw = raw; + this.headers = new HashMap<>(); + this.apiKey = apiKey; + this.apiSecret = apiSecret; + this.loadHeaders = loadHeaders; + this.sign = sign; + this.timestampGenerator = timestampGenerator; + this.idGenerator = idGenerator; + } + + public OkHttpRequestBuilder setHeader(String name, String value) { + this.headers.put(name, value); + this.raw.header(name, this.headers.get(name)); + return this; + } + + public OkHttpRequestBuilder setMethod(String method) { + this.method = method.toUpperCase(); + this.raw.setMethod$okhttp(this.method); + return this; + } + + public OkHttpRequestBuilder setUrl(String url) { + this.url = url; + this.raw.url(this.url); + return this; + } + + public OkHttpRequestBuilder setBody(String data) { + this.body = data; + this.raw.setBody$okhttp(RequestBody.create(this.body.getBytes(StandardCharsets.UTF_8))); + return this; + } + + public Request build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { + this.loadHeaders.accept( + this, + this.apiKey, + this.timestampGenerator.get(), + this.idGenerator.get() + ); + this.sign.accept(this, this.apiSecret); + return this.raw.build(); + } + + public Request.Builder raw() { + return this.raw; + } + + public String getHeader(String name) { + return this.headers.get(name); + } + + public String getMethod() { + return this.method; + } + + public String getUrl() { + return this.url; + } + + public String getBody() { + return this.body; + } +} diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index cfe75b3..90716ed 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; +import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; import okhttp3.*; import org.junit.jupiter.api.Test; @@ -24,7 +25,7 @@ private static String url() { } private static final String body = "{\"key\":\"value\"}"; - + private static final String method = "POST"; private static final UUID apiKey = UUID.fromString("ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"); private static final String apiSecret = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; @@ -39,16 +40,16 @@ public OpenApiTest() { void testNative() { final var raw = HttpRequest.newBuilder(); final var builder = new HttpRequestBuilder( - raw, - apiKey, - apiSecret, - WikiBrokerOpenApi::addXHeaders, - WikiBrokerOpenApi::sign, - () -> timestamp, - () -> nonce + raw, + apiKey, + apiSecret, + WikiBrokerOpenApi::addXHeaders, + WikiBrokerOpenApi::sign, + () -> timestamp, + () -> nonce ); try { - final var req = builder.setUrl(url()).setMethod("POST").setBody(body).build(); + final var req = builder.setUrl(url()).setMethod(method).setBody(body).build(); final var actualSignature = req.headers() .firstValue(CustomHeaders.Signature.value()) .orElse(""); @@ -68,6 +69,25 @@ void testApache() { @Test void testOkHttp() { - // TODO + final var raw = new Request.Builder(); + final var builder = new OkHttpRequestBuilder( + raw, + apiKey, + apiSecret, + WikiBrokerOpenApi::addXHeaders, + WikiBrokerOpenApi::sign, + () -> timestamp, + () -> nonce + ); + try { + final var req = builder.setUrl(url()).setMethod(method).setBody(body).build(); + final var actualSignature = req.header(CustomHeaders.Signature.value()); + assertEquals(expectedSignature, actualSignature); + } catch (MalformedURLException | + URISyntaxException | + NoSuchAlgorithmException | + InvalidKeyException e) { + throw new RuntimeException(e); + } } } From adfbc2a0b80febe87112fee7ae354e840a4dcee1 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 11:05:41 +0800 Subject: [PATCH 007/124] =?UTF-8?q?refactor:=20=E5=9C=A8java-sdk=E4=B8=AD?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openapi/adapters/HttpRequestBuilder.java | 21 +++++++++++----- .../adapters/OkHttpRequestBuilder.java | 25 +++++++++++++------ .../wikibroker/openapi/common/types/Sign.java | 1 + 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java index 00ef4cf..908a182 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java @@ -1,11 +1,5 @@ package com.wikiglobal.wikibroker.openapi.adapters; - -import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; -import com.wikiglobal.wikibroker.openapi.common.types.Sign; -import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; - import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; @@ -18,6 +12,11 @@ import java.util.UUID; import java.util.function.Supplier; +import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; +import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; +import com.wikiglobal.wikibroker.openapi.common.types.Sign; +import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; + public class HttpRequestBuilder implements RequestOperator, Wrapper { private final HttpRequest.Builder raw; private final Map headers; @@ -50,30 +49,35 @@ public HttpRequestBuilder( this.idGenerator = idGenerator; } + @Override public HttpRequestBuilder setHeader(String name, String value) { this.headers.put(name, value); this.raw.setHeader(name, this.headers.get(name)); return this; } + @Override public HttpRequestBuilder setMethod(String method) { this.method = method.toUpperCase(); this.raw.method(this.method, HttpRequest.BodyPublishers.noBody()); return this; } + @Override public HttpRequestBuilder setUrl(String url) { this.url = url; this.raw.uri(URI.create(this.url)); return this; } + @Override public HttpRequestBuilder setBody(String data) { this.body = data; this.raw.method(this.method, HttpRequest.BodyPublishers.ofString(data)); return this; } + @Override public HttpRequest build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { this.loadHeaders.accept( this, @@ -85,22 +89,27 @@ public HttpRequest build() throws MalformedURLException, URISyntaxException, NoS return this.raw.build(); } + @Override public HttpRequest.Builder raw() { return this.raw; } + @Override public String getHeader(String name) { return this.headers.get(name); } + @Override public String getMethod() { return this.method; } + @Override public String getUrl() { return this.url; } + @Override public String getBody() { return this.body; } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java index 01cd74f..9a6f062 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java @@ -1,12 +1,5 @@ package com.wikiglobal.wikibroker.openapi.adapters; -import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.Sign; -import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; -import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; -import okhttp3.Request; -import okhttp3.RequestBody; - import java.net.MalformedURLException; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; @@ -18,6 +11,14 @@ import java.util.UUID; import java.util.function.Supplier; +import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; +import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; +import com.wikiglobal.wikibroker.openapi.common.types.Sign; +import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; + +import okhttp3.Request; +import okhttp3.RequestBody; + public class OkHttpRequestBuilder implements RequestOperator, Wrapper { private final Request.Builder raw; private final Map headers; @@ -50,30 +51,35 @@ public OkHttpRequestBuilder( this.idGenerator = idGenerator; } + @Override public OkHttpRequestBuilder setHeader(String name, String value) { this.headers.put(name, value); this.raw.header(name, this.headers.get(name)); return this; } + @Override public OkHttpRequestBuilder setMethod(String method) { this.method = method.toUpperCase(); this.raw.setMethod$okhttp(this.method); return this; } + @Override public OkHttpRequestBuilder setUrl(String url) { this.url = url; this.raw.url(this.url); return this; } + @Override public OkHttpRequestBuilder setBody(String data) { this.body = data; this.raw.setBody$okhttp(RequestBody.create(this.body.getBytes(StandardCharsets.UTF_8))); return this; } + @Override public Request build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { this.loadHeaders.accept( this, @@ -85,22 +91,27 @@ public Request build() throws MalformedURLException, URISyntaxException, NoSuchA return this.raw.build(); } + @Override public Request.Builder raw() { return this.raw; } + @Override public String getHeader(String name) { return this.headers.get(name); } + @Override public String getMethod() { return this.method; } + @Override public String getUrl() { return this.url; } + @Override public String getBody() { return this.body; } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java index d7a6cd4..3e7f805 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java @@ -5,6 +5,7 @@ import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +@FunctionalInterface public interface Sign { void accept( RequestOperator req, From fd9e5240c86574a1211bab46977ee10c41804542 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 11:06:02 +0800 Subject: [PATCH 008/124] =?UTF-8?q?test:=20=E4=BC=98=E5=8C=96java-sdk?= =?UTF-8?q?=E4=B8=AD=E6=B5=8B=E8=AF=95=E5=85=A5=E5=8F=82=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-sdk/pom.xml | 7 +++++++ .../com/wikiglobal/wikibroker/openapi/OpenApiTest.java | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/java-sdk/pom.xml b/java-sdk/pom.xml index 747c7d0..070d16a 100644 --- a/java-sdk/pom.xml +++ b/java-sdk/pom.xml @@ -47,5 +47,12 @@ 1.20.0 compile + + + com.alibaba.fastjson2 + fastjson2 + 2.0.60 + test + diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index 90716ed..1d2ba67 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import com.alibaba.fastjson2.JSON; import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; @@ -14,6 +15,7 @@ import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.time.Instant; +import java.util.Map; import java.util.UUID; public class OpenApiTest { @@ -24,7 +26,7 @@ private static String url() { return String.format("%s/%s", OpenApiTest.baseURL, OpenApiTest.path); } - private static final String body = "{\"key\":\"value\"}"; + private static final String body = JSON.toJSONString(Map.of("key", "value")); private static final String method = "POST"; private static final UUID apiKey = UUID.fromString("ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"); From eef8bc250ffb27f83be3670ef76c8741cf44e942 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 12:07:21 +0800 Subject: [PATCH 009/124] =?UTF-8?q?feat:=20=E5=9C=A8java-sdk=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0apacheHttpClient=E9=80=82=E9=85=8D=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/ApacheHttpRequestBuilder.java | 127 ++++++++++++++++++ .../openapi/adapters/HttpRequestBuilder.java | 4 +- .../wikibroker/openapi/OpenApiTest.java | 26 +++- 3 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java new file mode 100644 index 0000000..4742dc3 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java @@ -0,0 +1,127 @@ +package com.wikiglobal.wikibroker.openapi.adapters; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; +import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; +import com.wikiglobal.wikibroker.openapi.common.types.Sign; +import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.io.entity.StringEntity; +import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; +import org.apache.hc.core5.http.message.BasicHeader; + +public class ApacheHttpRequestBuilder implements RequestOperator, Wrapper { + private final ClassicRequestBuilder raw; + private final Map headers; + private String method; + private String url; + private String body; + private final UUID apiKey; + private final String apiSecret; + private final LoadHeaders loadHeaders; + private final Sign sign; + private final Supplier timestampGenerator; + private final Supplier idGenerator; + + public ApacheHttpRequestBuilder( + ClassicRequestBuilder raw, + UUID apiKey, + String apiSecret, + LoadHeaders loadHeaders, + Sign sign, + Supplier timestampGenerator, + Supplier idGenerator + ) { + this.raw = raw; + this.headers = new HashMap<>(); + this.apiKey = apiKey; + this.apiSecret = apiSecret; + this.loadHeaders = loadHeaders; + this.sign = sign; + this.timestampGenerator = timestampGenerator; + this.idGenerator = idGenerator; + } + + @Override + public ApacheHttpRequestBuilder setHeader(String name, String value) { + this.headers.put(name, value); + return this; + } + + @Override + public ApacheHttpRequestBuilder setMethod(String method) { + this.method = method.toUpperCase(); + return this; + } + + @Override + public ApacheHttpRequestBuilder setUrl(String url) { + this.url = url; + return this; + } + + @Override + public ApacheHttpRequestBuilder setBody(String data) { + this.body = data; + return this; + } + + @Override + public ClassicHttpRequest build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { + this.loadHeaders.accept( + this, + this.apiKey, + this.timestampGenerator.get(), + this.idGenerator.get() + ); + this.sign.accept(this, this.apiSecret); + final var headers = this.headers.entrySet() + .stream() + .map(entry -> new BasicHeader( + entry.getKey(), + entry.getValue() + )).toArray(Header[]::new); + return ClassicRequestBuilder.create(this.method) + .setHeaders(headers) + .setUri(this.url) + .setEntity(this.body) + .build(); + } + + @Override + public ClassicRequestBuilder raw() { + return this.raw; + } + + @Override + public String getHeader(String name) { + return this.headers.get(name); + } + + @Override + public String getMethod() { + return this.method; + } + + @Override + public String getUrl() { + return this.url; + } + + @Override + public String getBody() { + return this.body; + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java index 908a182..8e98990 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java @@ -59,7 +59,7 @@ public HttpRequestBuilder setHeader(String name, String value) { @Override public HttpRequestBuilder setMethod(String method) { this.method = method.toUpperCase(); - this.raw.method(this.method, HttpRequest.BodyPublishers.noBody()); + this.raw.method(this.method, HttpRequest.BodyPublishers.ofString(this.body)); return this; } @@ -73,7 +73,7 @@ public HttpRequestBuilder setUrl(String url) { @Override public HttpRequestBuilder setBody(String data) { this.body = data; - this.raw.method(this.method, HttpRequest.BodyPublishers.ofString(data)); + this.raw.method(this.method, HttpRequest.BodyPublishers.ofString(this.body)); return this; } diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index 1d2ba67..1874000 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -3,10 +3,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import com.alibaba.fastjson2.JSON; +import com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; import okhttp3.*; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.ProtocolException; +import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; import org.junit.jupiter.api.Test; import java.net.MalformedURLException; @@ -66,7 +70,27 @@ void testNative() { @Test void testApache() { - // TODO + final var raw = ClassicRequestBuilder.create(method); + final var builder = new ApacheHttpRequestBuilder( + raw, + apiKey, + apiSecret, + WikiBrokerOpenApi::addXHeaders, + WikiBrokerOpenApi::sign, + () -> timestamp, + () -> nonce + ); + try { + final var req = builder.setUrl(url()).setMethod(method).setBody(body).build(); + final var actualSignature = req.getHeader(CustomHeaders.Signature.value()).getValue(); + assertEquals(expectedSignature, actualSignature); + } catch (MalformedURLException | + URISyntaxException | + NoSuchAlgorithmException | + InvalidKeyException | + ProtocolException e) { + throw new RuntimeException(e); + } } @Test From 68ee04f96186a46b1d0447d9425d9983d5d51513 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 14:23:33 +0800 Subject: [PATCH 010/124] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BC=98?= =?UTF-8?q?=E5=8C=96java-sdk=E4=B8=AD=E9=80=82=E9=85=8D=E5=99=A8=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/AbstractRequestBuilder.java | 101 ++++++++++++++++ .../adapters/ApacheHttpRequestBuilder.java | 96 +-------------- .../openapi/adapters/HttpRequestBuilder.java | 113 +++--------------- .../adapters/OkHttpRequestBuilder.java | 103 ++-------------- .../wikibroker/openapi/common/Hash.java | 2 +- .../openapi/common/types/RequestBuilder.java | 2 +- .../openapi/common/types/Wrapper.java | 5 - .../wikibroker/openapi/OpenApiTest.java | 9 -- 8 files changed, 137 insertions(+), 294 deletions(-) create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Wrapper.java diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java new file mode 100644 index 0000000..afc6f92 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java @@ -0,0 +1,101 @@ +package com.wikiglobal.wikibroker.openapi.adapters; + +import com.wikiglobal.wikibroker.openapi.common.types.*; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.function.Supplier; + +public abstract class AbstractRequestBuilder implements RequestOperator { + protected final Map headers; + protected String method; + protected String url; + protected String body; + private final UUID apiKey; + private final String apiSecret; + private final LoadHeaders loadHeaders; + private final Sign sign; + private final Supplier timestampGenerator; + private final Supplier idGenerator; + + public AbstractRequestBuilder( + UUID apiKey, + String apiSecret, + LoadHeaders loadHeaders, + Sign sign, + Supplier timestampGenerator, + Supplier idGenerator + ) { + this.headers = new HashMap<>(); + this.apiKey = apiKey; + this.apiSecret = apiSecret; + this.loadHeaders = loadHeaders; + this.sign = sign; + this.timestampGenerator = timestampGenerator; + this.idGenerator = idGenerator; + } + + @Override + public final RequestBuilder setHeader(String name, String value) { + this.headers.put(name, value); + return this; + } + + @Override + public final RequestBuilder setMethod(String method) { + this.method = method.toUpperCase(); + return this; + } + + @Override + public final RequestBuilder setUrl(String url) { + this.url = url; + return this; + } + + @Override + public final RequestBuilder setBody(String body) { + this.body = body; + return this; + } + + @Override + public final T build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { + this.loadHeaders.accept( + this, + this.apiKey, + this.timestampGenerator.get(), + this.idGenerator.get() + ); + this.sign.accept(this, this.apiSecret); + return buildRequest(); + } + + protected abstract T buildRequest(); + + @Override + public final String getHeader(String name) { + return this.headers.get(name); + } + + @Override + public final String getMethod() { + return this.method; + } + + @Override + public final String getUrl() { + return this.url; + } + + @Override + public final String getBody() { + return this.body; + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java index 4742dc3..db540ac 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java @@ -1,42 +1,18 @@ package com.wikiglobal.wikibroker.openapi.adapters; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; import java.time.Instant; -import java.util.HashMap; -import java.util.Map; import java.util.UUID; import java.util.function.Supplier; -import java.util.stream.Collectors; import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; import com.wikiglobal.wikibroker.openapi.common.types.Sign; -import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; import org.apache.hc.core5.http.ClassicHttpRequest; import org.apache.hc.core5.http.Header; -import org.apache.hc.core5.http.io.entity.StringEntity; import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; import org.apache.hc.core5.http.message.BasicHeader; -public class ApacheHttpRequestBuilder implements RequestOperator, Wrapper { - private final ClassicRequestBuilder raw; - private final Map headers; - private String method; - private String url; - private String body; - private final UUID apiKey; - private final String apiSecret; - private final LoadHeaders loadHeaders; - private final Sign sign; - private final Supplier timestampGenerator; - private final Supplier idGenerator; - +public final class ApacheHttpRequestBuilder extends AbstractRequestBuilder { public ApacheHttpRequestBuilder( - ClassicRequestBuilder raw, UUID apiKey, String apiSecret, LoadHeaders loadHeaders, @@ -44,84 +20,22 @@ public ApacheHttpRequestBuilder( Supplier timestampGenerator, Supplier idGenerator ) { - this.raw = raw; - this.headers = new HashMap<>(); - this.apiKey = apiKey; - this.apiSecret = apiSecret; - this.loadHeaders = loadHeaders; - this.sign = sign; - this.timestampGenerator = timestampGenerator; - this.idGenerator = idGenerator; - } - - @Override - public ApacheHttpRequestBuilder setHeader(String name, String value) { - this.headers.put(name, value); - return this; - } - - @Override - public ApacheHttpRequestBuilder setMethod(String method) { - this.method = method.toUpperCase(); - return this; + super(apiKey, apiSecret, loadHeaders, sign, timestampGenerator, idGenerator); } @Override - public ApacheHttpRequestBuilder setUrl(String url) { - this.url = url; - return this; - } - - @Override - public ApacheHttpRequestBuilder setBody(String data) { - this.body = data; - return this; - } - - @Override - public ClassicHttpRequest build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { - this.loadHeaders.accept( - this, - this.apiKey, - this.timestampGenerator.get(), - this.idGenerator.get() - ); - this.sign.accept(this, this.apiSecret); + protected ClassicHttpRequest buildRequest() { final var headers = this.headers.entrySet() .stream() .map(entry -> new BasicHeader( entry.getKey(), entry.getValue() - )).toArray(Header[]::new); + )) + .toArray(Header[]::new); return ClassicRequestBuilder.create(this.method) .setHeaders(headers) .setUri(this.url) .setEntity(this.body) .build(); } - - @Override - public ClassicRequestBuilder raw() { - return this.raw; - } - - @Override - public String getHeader(String name) { - return this.headers.get(name); - } - - @Override - public String getMethod() { - return this.method; - } - - @Override - public String getUrl() { - return this.url; - } - - @Override - public String getBody() { - return this.body; - } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java index 8e98990..f8de397 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java @@ -1,37 +1,17 @@ package com.wikiglobal.wikibroker.openapi.adapters; -import java.net.MalformedURLException; import java.net.URI; -import java.net.URISyntaxException; import java.net.http.HttpRequest; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; import java.time.Instant; -import java.util.HashMap; -import java.util.Map; import java.util.UUID; import java.util.function.Supplier; +import java.util.stream.Stream; import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; import com.wikiglobal.wikibroker.openapi.common.types.Sign; -import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; - -public class HttpRequestBuilder implements RequestOperator, Wrapper { - private final HttpRequest.Builder raw; - private final Map headers; - private String method; - private String url; - private String body; - private final UUID apiKey; - private final String apiSecret; - private final LoadHeaders loadHeaders; - private final Sign sign; - private final Supplier timestampGenerator; - private final Supplier idGenerator; +public final class HttpRequestBuilder extends AbstractRequestBuilder { public HttpRequestBuilder( - HttpRequest.Builder raw, UUID apiKey, String apiSecret, LoadHeaders loadHeaders, @@ -39,78 +19,21 @@ public HttpRequestBuilder( Supplier timestampGenerator, Supplier idGenerator ) { - this.raw = raw; - this.headers = new HashMap<>(); - this.apiKey = apiKey; - this.apiSecret = apiSecret; - this.loadHeaders = loadHeaders; - this.sign = sign; - this.timestampGenerator = timestampGenerator; - this.idGenerator = idGenerator; - } - - @Override - public HttpRequestBuilder setHeader(String name, String value) { - this.headers.put(name, value); - this.raw.setHeader(name, this.headers.get(name)); - return this; - } - - @Override - public HttpRequestBuilder setMethod(String method) { - this.method = method.toUpperCase(); - this.raw.method(this.method, HttpRequest.BodyPublishers.ofString(this.body)); - return this; - } - - @Override - public HttpRequestBuilder setUrl(String url) { - this.url = url; - this.raw.uri(URI.create(this.url)); - return this; - } - - @Override - public HttpRequestBuilder setBody(String data) { - this.body = data; - this.raw.method(this.method, HttpRequest.BodyPublishers.ofString(this.body)); - return this; - } - - @Override - public HttpRequest build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { - this.loadHeaders.accept( - this, - this.apiKey, - this.timestampGenerator.get(), - this.idGenerator.get() - ); - this.sign.accept(this, this.apiSecret); - return this.raw.build(); - } - - @Override - public HttpRequest.Builder raw() { - return this.raw; - } - - @Override - public String getHeader(String name) { - return this.headers.get(name); - } - - @Override - public String getMethod() { - return this.method; - } - - @Override - public String getUrl() { - return this.url; - } - - @Override - public String getBody() { - return this.body; + super(apiKey, apiSecret, loadHeaders, sign, timestampGenerator, idGenerator); + } + + @Override + protected HttpRequest buildRequest() { + final var headers = this.headers.entrySet() + .stream() + .flatMap(entry -> Stream.of( + entry.getKey(), + entry.getValue() + )) + .toArray(String[]::new); + return HttpRequest.newBuilder(URI.create(this.url)) + .method(this.method, HttpRequest.BodyPublishers.ofString(this.body)) + .headers(headers) + .build(); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java index 9a6f062..a2b3be1 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java @@ -1,39 +1,19 @@ package com.wikiglobal.wikibroker.openapi.adapters; -import java.net.MalformedURLException; -import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; import java.time.Instant; -import java.util.HashMap; -import java.util.Map; import java.util.UUID; import java.util.function.Supplier; import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; import com.wikiglobal.wikibroker.openapi.common.types.Sign; -import com.wikiglobal.wikibroker.openapi.common.types.Wrapper; +import okhttp3.Headers; import okhttp3.Request; import okhttp3.RequestBody; -public class OkHttpRequestBuilder implements RequestOperator, Wrapper { - private final Request.Builder raw; - private final Map headers; - private String method; - private String url; - private String body; - private final UUID apiKey; - private final String apiSecret; - private final LoadHeaders loadHeaders; - private final Sign sign; - private final Supplier timestampGenerator; - private final Supplier idGenerator; - +public final class OkHttpRequestBuilder extends AbstractRequestBuilder { public OkHttpRequestBuilder( - Request.Builder raw, UUID apiKey, String apiSecret, LoadHeaders loadHeaders, @@ -41,78 +21,17 @@ public OkHttpRequestBuilder( Supplier timestampGenerator, Supplier idGenerator ) { - this.raw = raw; - this.headers = new HashMap<>(); - this.apiKey = apiKey; - this.apiSecret = apiSecret; - this.loadHeaders = loadHeaders; - this.sign = sign; - this.timestampGenerator = timestampGenerator; - this.idGenerator = idGenerator; - } - - @Override - public OkHttpRequestBuilder setHeader(String name, String value) { - this.headers.put(name, value); - this.raw.header(name, this.headers.get(name)); - return this; - } - - @Override - public OkHttpRequestBuilder setMethod(String method) { - this.method = method.toUpperCase(); - this.raw.setMethod$okhttp(this.method); - return this; - } - - @Override - public OkHttpRequestBuilder setUrl(String url) { - this.url = url; - this.raw.url(this.url); - return this; - } - - @Override - public OkHttpRequestBuilder setBody(String data) { - this.body = data; - this.raw.setBody$okhttp(RequestBody.create(this.body.getBytes(StandardCharsets.UTF_8))); - return this; - } - - @Override - public Request build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { - this.loadHeaders.accept( - this, - this.apiKey, - this.timestampGenerator.get(), - this.idGenerator.get() - ); - this.sign.accept(this, this.apiSecret); - return this.raw.build(); - } - - @Override - public Request.Builder raw() { - return this.raw; - } - - @Override - public String getHeader(String name) { - return this.headers.get(name); - } - - @Override - public String getMethod() { - return this.method; - } - - @Override - public String getUrl() { - return this.url; + super(apiKey, apiSecret, loadHeaders, sign, timestampGenerator, idGenerator); } @Override - public String getBody() { - return this.body; + protected Request buildRequest() { + return new Request.Builder().method( + this.method, + RequestBody.create(this.body.getBytes(StandardCharsets.UTF_8)) + ) + .headers(Headers.of(this.headers)) + .url(this.url) + .build(); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java index 3198082..7faf5b4 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java @@ -9,7 +9,7 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -public final class Hash { +public class Hash { private Hash() { } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java index 167503a..617a7e0 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java @@ -12,7 +12,7 @@ public interface RequestBuilder { RequestBuilder setUrl(String url); - RequestBuilder setBody(String data); + RequestBuilder setBody(String body); T build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException; } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Wrapper.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Wrapper.java deleted file mode 100644 index 69a2b70..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Wrapper.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.wikiglobal.wikibroker.openapi.common.types; - -public interface Wrapper { - T raw(); -} diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index 1874000..fa345b6 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -8,14 +8,11 @@ import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; import okhttp3.*; -import org.apache.hc.core5.http.ClassicHttpRequest; import org.apache.hc.core5.http.ProtocolException; -import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; import org.junit.jupiter.api.Test; import java.net.MalformedURLException; import java.net.URISyntaxException; -import java.net.http.HttpRequest; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.time.Instant; @@ -44,9 +41,7 @@ public OpenApiTest() { @Test void testNative() { - final var raw = HttpRequest.newBuilder(); final var builder = new HttpRequestBuilder( - raw, apiKey, apiSecret, WikiBrokerOpenApi::addXHeaders, @@ -70,9 +65,7 @@ void testNative() { @Test void testApache() { - final var raw = ClassicRequestBuilder.create(method); final var builder = new ApacheHttpRequestBuilder( - raw, apiKey, apiSecret, WikiBrokerOpenApi::addXHeaders, @@ -95,9 +88,7 @@ void testApache() { @Test void testOkHttp() { - final var raw = new Request.Builder(); final var builder = new OkHttpRequestBuilder( - raw, apiKey, apiSecret, WikiBrokerOpenApi::addXHeaders, From 82d1bc32839185083b273719f4239bac5c1d7cb7 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 14:35:19 +0800 Subject: [PATCH 011/124] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96java-sdk?= =?UTF-8?q?=E4=B8=AD=E5=8C=85=E7=BB=93=E6=9E=84=E7=BB=84=E7=BB=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/wikiglobal/wikibroker/openapi/Core.java | 2 +- .../com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java | 4 ++-- .../wikibroker/openapi/adapters/AbstractRequestBuilder.java | 2 +- .../wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java | 4 ++-- .../wikibroker/openapi/adapters/HttpRequestBuilder.java | 4 ++-- .../wikibroker/openapi/adapters/OkHttpRequestBuilder.java | 4 ++-- .../java/com/wikiglobal/wikibroker/openapi/common/Utils.java | 2 +- .../openapi/common/{types => interfaces}/LoadHeaders.java | 2 +- .../openapi/common/{types => interfaces}/RequestBuilder.java | 2 +- .../openapi/common/{types => interfaces}/RequestOperator.java | 2 +- .../openapi/common/{types => interfaces}/RequestReader.java | 2 +- .../wikibroker/openapi/common/{types => interfaces}/Sign.java | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) rename java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/{types => interfaces}/LoadHeaders.java (79%) rename java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/{types => interfaces}/RequestBuilder.java (89%) rename java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/{types => interfaces}/RequestOperator.java (57%) rename java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/{types => interfaces}/RequestReader.java (69%) rename java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/{types => interfaces}/Sign.java (86%) diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java index e04817a..a64b51b 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java @@ -4,7 +4,7 @@ import com.wikiglobal.wikibroker.openapi.common.Utils; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.RequestReader; +import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestReader; import org.apache.commons.codec.binary.Hex; import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java index 7ebe1de..7f4c029 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -1,8 +1,8 @@ package com.wikiglobal.wikibroker.openapi; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.RequestBuilder; -import com.wikiglobal.wikibroker.openapi.common.types.RequestOperator; +import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; +import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestOperator; import org.jspecify.annotations.NonNull; import java.net.MalformedURLException; diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java index afc6f92..c9503f7 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java @@ -1,6 +1,6 @@ package com.wikiglobal.wikibroker.openapi.adapters; -import com.wikiglobal.wikibroker.openapi.common.types.*; +import com.wikiglobal.wikibroker.openapi.common.interfaces.*; import java.net.MalformedURLException; import java.net.URISyntaxException; diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java index db540ac..9d41006 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java @@ -4,8 +4,8 @@ import java.util.UUID; import java.util.function.Supplier; -import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.Sign; +import com.wikiglobal.wikibroker.openapi.common.interfaces.LoadHeaders; +import com.wikiglobal.wikibroker.openapi.common.interfaces.Sign; import org.apache.hc.core5.http.ClassicHttpRequest; import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java index f8de397..f7accee 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java @@ -7,8 +7,8 @@ import java.util.function.Supplier; import java.util.stream.Stream; -import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.Sign; +import com.wikiglobal.wikibroker.openapi.common.interfaces.LoadHeaders; +import com.wikiglobal.wikibroker.openapi.common.interfaces.Sign; public final class HttpRequestBuilder extends AbstractRequestBuilder { public HttpRequestBuilder( diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java index a2b3be1..49544bf 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java @@ -5,8 +5,8 @@ import java.util.UUID; import java.util.function.Supplier; -import com.wikiglobal.wikibroker.openapi.common.types.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.types.Sign; +import com.wikiglobal.wikibroker.openapi.common.interfaces.LoadHeaders; +import com.wikiglobal.wikibroker.openapi.common.interfaces.Sign; import okhttp3.Headers; import okhttp3.Request; diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java index bd43833..65d998d 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java @@ -1,6 +1,6 @@ package com.wikiglobal.wikibroker.openapi.common; -import com.wikiglobal.wikibroker.openapi.common.types.RequestReader; +import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestReader; import org.jspecify.annotations.NonNull; public class Utils { diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/LoadHeaders.java similarity index 79% rename from java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java rename to java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/LoadHeaders.java index 1a851e0..c314f0b 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/LoadHeaders.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/LoadHeaders.java @@ -1,4 +1,4 @@ -package com.wikiglobal.wikibroker.openapi.common.types; +package com.wikiglobal.wikibroker.openapi.common.interfaces; import java.time.Instant; import java.util.UUID; diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java similarity index 89% rename from java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java rename to java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java index 617a7e0..3545449 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java @@ -1,4 +1,4 @@ -package com.wikiglobal.wikibroker.openapi.common.types; +package com.wikiglobal.wikibroker.openapi.common.interfaces; import java.net.MalformedURLException; import java.net.URISyntaxException; diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestOperator.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestOperator.java similarity index 57% rename from java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestOperator.java rename to java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestOperator.java index 5c90b95..9c5eecc 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestOperator.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestOperator.java @@ -1,4 +1,4 @@ -package com.wikiglobal.wikibroker.openapi.common.types; +package com.wikiglobal.wikibroker.openapi.common.interfaces; public interface RequestOperator extends RequestBuilder, RequestReader { } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestReader.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestReader.java similarity index 69% rename from java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestReader.java rename to java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestReader.java index 07723e3..ea8e270 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/RequestReader.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestReader.java @@ -1,4 +1,4 @@ -package com.wikiglobal.wikibroker.openapi.common.types; +package com.wikiglobal.wikibroker.openapi.common.interfaces; public interface RequestReader { String getHeader(String name); diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Sign.java similarity index 86% rename from java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java rename to java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Sign.java index 3e7f805..67cb488 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/types/Sign.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Sign.java @@ -1,4 +1,4 @@ -package com.wikiglobal.wikibroker.openapi.common.types; +package com.wikiglobal.wikibroker.openapi.common.interfaces; import java.net.MalformedURLException; import java.net.URISyntaxException; From 6d8796d95d2d055d76299b0f9203dcdefe8639af Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 15:55:26 +0800 Subject: [PATCH 012/124] =?UTF-8?q?feat:=20=E5=9C=A8java-sdk=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=AB=98=E5=B1=82=E7=BA=A7=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E5=BA=93=E9=9B=86=E6=88=90API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openapi/WikiBrokerOpenApiApache.java | 24 +++++++++++++++++++ .../openapi/WikiBrokerOpenApiNative.java | 24 +++++++++++++++++++ .../openapi/WikiBrokerOpenApiOkhttp.java | 24 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApache.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNative.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttp.java diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApache.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApache.java new file mode 100644 index 0000000..ec1e4d6 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApache.java @@ -0,0 +1,24 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder; +import org.jspecify.annotations.NonNull; + +import java.time.Instant; +import java.util.UUID; + +@SuppressWarnings("unused") +public class WikiBrokerOpenApiApache { + private WikiBrokerOpenApiApache() { + } + + public static @NonNull ApacheHttpRequestBuilder create(String apiKey, String apiSecret) { + return new ApacheHttpRequestBuilder( + UUID.fromString(apiKey), + apiSecret, + WikiBrokerOpenApi::addXHeaders, + WikiBrokerOpenApi::sign, + Instant::now, + UUID::randomUUID + ); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNative.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNative.java new file mode 100644 index 0000000..44fa265 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNative.java @@ -0,0 +1,24 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; +import org.jspecify.annotations.NonNull; + +import java.time.Instant; +import java.util.UUID; + +@SuppressWarnings("unused") +public class WikiBrokerOpenApiNative { + private WikiBrokerOpenApiNative() { + } + + public static @NonNull HttpRequestBuilder create(String apiKey, String apiSecret) { + return new HttpRequestBuilder( + UUID.fromString(apiKey), + apiSecret, + WikiBrokerOpenApi::addXHeaders, + WikiBrokerOpenApi::sign, + Instant::now, + UUID::randomUUID + ); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttp.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttp.java new file mode 100644 index 0000000..45015bb --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttp.java @@ -0,0 +1,24 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; +import org.jspecify.annotations.NonNull; + +import java.time.Instant; +import java.util.UUID; + +@SuppressWarnings("unused") +public class WikiBrokerOpenApiOkhttp { + private WikiBrokerOpenApiOkhttp() { + } + + public static @NonNull OkHttpRequestBuilder create(String apiKey, String apiSecret) { + return new OkHttpRequestBuilder( + UUID.fromString(apiKey), + apiSecret, + WikiBrokerOpenApi::addXHeaders, + WikiBrokerOpenApi::sign, + Instant::now, + UUID::randomUUID + ); + } +} From cd1b49f3faa437d0c4dce3ab92bc59e86bb46246 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 15:56:32 +0800 Subject: [PATCH 013/124] =?UTF-8?q?chore:=20=E4=BC=98=E5=8C=96java-sdk?= =?UTF-8?q?=E4=B8=AD=E4=BB=A3=E7=A0=81=E6=B3=A8=E8=A7=A3=E5=92=8C=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=A3=B0=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-sdk/pom.xml | 1 + .../src/main/java/com/wikiglobal/wikibroker/openapi/Core.java | 2 -- .../wikibroker/openapi/adapters/AbstractRequestBuilder.java | 3 ++- .../wikibroker/openapi/adapters/OkHttpRequestBuilder.java | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/java-sdk/pom.xml b/java-sdk/pom.xml index 070d16a..52611ce 100644 --- a/java-sdk/pom.xml +++ b/java-sdk/pom.xml @@ -34,6 +34,7 @@ 5.2.1 provided + org.jspecify jspecify diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java index a64b51b..25f52a6 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java @@ -6,7 +6,6 @@ import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestReader; import org.apache.commons.codec.binary.Hex; -import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; import java.net.MalformedURLException; @@ -24,7 +23,6 @@ public final class Core { private Core() { } - @Contract("_, _ -> new") public static @NonNull String generateSignature( @NonNull String key, @NonNull String message diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java index c9503f7..34a2f0d 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java @@ -1,6 +1,7 @@ package com.wikiglobal.wikibroker.openapi.adapters; import com.wikiglobal.wikibroker.openapi.common.interfaces.*; +import org.jspecify.annotations.NonNull; import java.net.MalformedURLException; import java.net.URISyntaxException; @@ -48,7 +49,7 @@ public final RequestBuilder setHeader(String name, String value) { } @Override - public final RequestBuilder setMethod(String method) { + public final RequestBuilder setMethod(@NonNull String method) { this.method = method.toUpperCase(); return this; } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java index 49544bf..21196c5 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java @@ -11,6 +11,7 @@ import okhttp3.Headers; import okhttp3.Request; import okhttp3.RequestBody; +import org.jspecify.annotations.NonNull; public final class OkHttpRequestBuilder extends AbstractRequestBuilder { public OkHttpRequestBuilder( @@ -25,7 +26,7 @@ public OkHttpRequestBuilder( } @Override - protected Request buildRequest() { + protected @NonNull Request buildRequest() { return new Request.Builder().method( this.method, RequestBody.create(this.body.getBytes(StandardCharsets.UTF_8)) From 7a7406357eccbbd51333735c270d67c2541aeccf Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 16:12:09 +0800 Subject: [PATCH 014/124] =?UTF-8?q?chore:=20=E9=85=8D=E7=BD=AEjava-sdk?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E5=AD=97=E7=AC=A6=E9=9B=86=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-sdk/pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java-sdk/pom.xml b/java-sdk/pom.xml index 52611ce..3d1d273 100644 --- a/java-sdk/pom.xml +++ b/java-sdk/pom.xml @@ -11,6 +11,9 @@ 21 21 + UTF-8 + UTF-8 + UTF-8 From e0742cba1adad8f30bf312e2d63940ca2a4c3c89 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 17:48:24 +0800 Subject: [PATCH 015/124] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96java-sdk?= =?UTF-8?q?=E4=B8=AD=E9=AB=98=E5=B1=82=E7=BA=A7=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=BA=93=E9=9B=86=E6=88=90API=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openapi/AbstractBuilderFactory.java | 28 +++++++++++++++++++ .../openapi/WikiBrokerOpenApiApache.java | 24 ---------------- ...kerOpenApiApacheRequestBuilderFactory.java | 25 +++++++++++++++++ .../openapi/WikiBrokerOpenApiNative.java | 24 ---------------- ...kerOpenApiNativeRequestBuilderFactory.java | 28 +++++++++++++++++++ .../openapi/WikiBrokerOpenApiOkhttp.java | 24 ---------------- ...kerOpenApiOkhttpRequestBuilderFactory.java | 24 ++++++++++++++++ .../openapi/common/interfaces/Factory.java | 5 ++++ 8 files changed, 110 insertions(+), 72 deletions(-) create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApache.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNative.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttp.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java create mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java new file mode 100644 index 0000000..832547f --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java @@ -0,0 +1,28 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.common.interfaces.*; + +import java.time.Instant; +import java.util.UUID; +import java.util.function.Supplier; + +public abstract class AbstractBuilderFactory implements Factory> { + protected final UUID apiKey; + protected final String apiSecret; + protected final LoadHeaders loadHeaders; + protected final Sign sign; + protected final Supplier timestampGenerator; + protected final Supplier idGenerator; + + public AbstractBuilderFactory(String apiKey, String apiSecret) { + this.apiKey = UUID.fromString(apiKey); + this.apiSecret = apiSecret; + this.loadHeaders = WikiBrokerOpenApi::addXHeaders; + this.sign = WikiBrokerOpenApi::sign; + this.timestampGenerator = Instant::now; + this.idGenerator = UUID::randomUUID; + } + + @Override + public abstract RequestBuilder create(); +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApache.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApache.java deleted file mode 100644 index ec1e4d6..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApache.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wikiglobal.wikibroker.openapi; - -import com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder; -import org.jspecify.annotations.NonNull; - -import java.time.Instant; -import java.util.UUID; - -@SuppressWarnings("unused") -public class WikiBrokerOpenApiApache { - private WikiBrokerOpenApiApache() { - } - - public static @NonNull ApacheHttpRequestBuilder create(String apiKey, String apiSecret) { - return new ApacheHttpRequestBuilder( - UUID.fromString(apiKey), - apiSecret, - WikiBrokerOpenApi::addXHeaders, - WikiBrokerOpenApi::sign, - Instant::now, - UUID::randomUUID - ); - } -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java new file mode 100644 index 0000000..863c2ea --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java @@ -0,0 +1,25 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder; +import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.jspecify.annotations.NonNull; + +@SuppressWarnings("unused") +public final class WikiBrokerOpenApiApacheRequestBuilderFactory extends AbstractBuilderFactory { + public WikiBrokerOpenApiApacheRequestBuilderFactory(String apiKey, String apiSecret) { + super(apiKey, apiSecret); + } + + @Override + public @NonNull RequestBuilder create() { + return new ApacheHttpRequestBuilder( + this.apiKey, + this.apiSecret, + this.loadHeaders, + this.sign, + this.timestampGenerator, + this.idGenerator + ); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNative.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNative.java deleted file mode 100644 index 44fa265..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNative.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wikiglobal.wikibroker.openapi; - -import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; -import org.jspecify.annotations.NonNull; - -import java.time.Instant; -import java.util.UUID; - -@SuppressWarnings("unused") -public class WikiBrokerOpenApiNative { - private WikiBrokerOpenApiNative() { - } - - public static @NonNull HttpRequestBuilder create(String apiKey, String apiSecret) { - return new HttpRequestBuilder( - UUID.fromString(apiKey), - apiSecret, - WikiBrokerOpenApi::addXHeaders, - WikiBrokerOpenApi::sign, - Instant::now, - UUID::randomUUID - ); - } -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java new file mode 100644 index 0000000..d4dc8b6 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java @@ -0,0 +1,28 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; +import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; +import org.jetbrains.annotations.Contract; +import org.jspecify.annotations.NonNull; + +import java.net.http.HttpRequest; + +@SuppressWarnings("unused") +public final class WikiBrokerOpenApiNativeRequestBuilderFactory extends AbstractBuilderFactory { + public WikiBrokerOpenApiNativeRequestBuilderFactory(String apiKey, String apiSecret) { + super(apiKey, apiSecret); + } + + @Contract(" -> new") + @Override + public @NonNull RequestBuilder create() { + return new HttpRequestBuilder( + this.apiKey, + this.apiSecret, + this.loadHeaders, + this.sign, + this.timestampGenerator, + this.idGenerator + ); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttp.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttp.java deleted file mode 100644 index 45015bb..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttp.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wikiglobal.wikibroker.openapi; - -import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; -import org.jspecify.annotations.NonNull; - -import java.time.Instant; -import java.util.UUID; - -@SuppressWarnings("unused") -public class WikiBrokerOpenApiOkhttp { - private WikiBrokerOpenApiOkhttp() { - } - - public static @NonNull OkHttpRequestBuilder create(String apiKey, String apiSecret) { - return new OkHttpRequestBuilder( - UUID.fromString(apiKey), - apiSecret, - WikiBrokerOpenApi::addXHeaders, - WikiBrokerOpenApi::sign, - Instant::now, - UUID::randomUUID - ); - } -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java new file mode 100644 index 0000000..4a24198 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java @@ -0,0 +1,24 @@ +package com.wikiglobal.wikibroker.openapi; + +import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; +import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; +import okhttp3.Request; + +@SuppressWarnings("unused") +public class WikiBrokerOpenApiOkhttpRequestBuilderFactory extends AbstractBuilderFactory { + public WikiBrokerOpenApiOkhttpRequestBuilderFactory(String apiKey, String apiSecret) { + super(apiKey, apiSecret); + } + + @Override + public RequestBuilder create() { + return new OkHttpRequestBuilder( + this.apiKey, + this.apiSecret, + this.loadHeaders, + this.sign, + this.timestampGenerator, + this.idGenerator + ); + } +} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java new file mode 100644 index 0000000..c645881 --- /dev/null +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java @@ -0,0 +1,5 @@ +package com.wikiglobal.wikibroker.openapi.common.interfaces; + +public interface Factory { + T create(); +} From aebf94a6fec8d8900087a9b699cdcd6d8301ff23 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 18:01:25 +0800 Subject: [PATCH 016/124] =?UTF-8?q?doc:=20=E6=B7=BB=E5=8A=A0Java=E4=BD=BF?= =?UTF-8?q?=E7=94=A8java-sdk=E6=8E=A5=E5=85=A5=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ java-sdk/README.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 java-sdk/README.md diff --git a/README.md b/README.md index 3492be5..60fb991 100644 --- a/README.md +++ b/README.md @@ -260,6 +260,8 @@ async def send_request(): send_request() ``` +#### `Java`/`Kotlin`接入([开发中](./java-sdk)) + ### 通过API接入 如果你使用的编程语言没有可用的SDK,可以按照以下方式自行编写接入代码。 diff --git a/java-sdk/README.md b/java-sdk/README.md new file mode 100644 index 0000000..d8eeaf6 --- /dev/null +++ b/java-sdk/README.md @@ -0,0 +1,78 @@ +# WikiBroker OpenAPI SDK for JVM + +## 示例 + +`java.net.http` + +```java +import java.net.http.HttpClient; +import java.net.http.HttpResponse; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiNativeRequestBuilderFactory; +// ... +final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; +final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; +final var factory = new WikiBrokerOpenApiNativeRequestBuilderFactory(API_KEY, API_SECRET); + +try (var client = HttpClient.newHttpClient()) { + var builder = factory.create(); + var req = builder.setMethod("POST") + .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") + .setBody("{\"key\":\"value\"") + .build(); + client.send(req, HttpResponse.BodyHandlers.ofString()); +} catch (Exception e) { + // Handle Exception +} +``` + +`okhttp` + +```java +import okhttp3.OkHttpClient; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiOkhttpRequestBuilderFactory; +// ... +final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; +final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; +final var factory = new WikiBrokerOpenApiOkhttpRequestBuilderFactory(API_KEY, API_SECRET); + +var client = new OkHttpClient(); +try { + var builder = factory.create(); + var req = builder.setMethod("POST") + .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") + .setBody("{\"key\":\"value\"") + .build(); + try (var resp = client.newCall(req).execute()) { + // Handle Response + } +} catch (Exception e) { + // Handle Exception +} +``` + +`apache httpclient` + +```java +import org.apache.hc.client5.http.impl.classic.HttpClients; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiApacheRequestBuilderFactory; +// ... +final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; +final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; +final var factory = new WikiBrokerOpenApiApacheRequestBuilderFactory(API_KEY, API_SECRET); + +try (var client = HttpClients.createDefault()) { + var builder = factory.create(); + var req = builder.setMethod("POST") + .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") + .setBody("{\"key\":\"value\"") + .build(); + client.execute( + req, resp -> { + // Handle Response + return null; + } + ); +} catch (Exception e) { + // Handle Exception +} +``` From 2746832da0d5d5f3a6af4c8a9ea3dedd0233cc62 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 18:10:36 +0800 Subject: [PATCH 017/124] =?UTF-8?q?chore:=20=E9=85=8D=E7=BD=AEjava-sdk?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- Makefile | 22 ++++++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 5c34472..09de447 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.tgz -*.whl \ No newline at end of file +*.whl +*.jar \ No newline at end of file diff --git a/Makefile b/Makefile index 5337085..7f42c34 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build build-js build-go build-py +.PHONY: build build-js build-go build-py build-java GO_SDK_VERSION=1.0.0 @@ -9,24 +9,30 @@ build: @echo "" @echo "开始构建所有SDK..." @echo "" - @$(MAKE) build-js && $(MAKE) build-go && $(MAKE) build-py + @$(MAKE) build-js && $(MAKE) build-go && $(MAKE) build-py && $(MAKE) build-java @echo "" @echo "所有SDK构建成功!" build-js: - @echo "[1/3] 开始构建 JavaScript SDK..." + @echo "[1/4] 开始构建 JavaScript SDK..." @cd javascript-sdk && rm -rf dist && pnpm pack && rename 's/openapi-sdk/openapi-js-sdk/' wikibroker-*.tgz && mv wikibroker-*.tgz .. - @echo "[1/3] JavaScript SDK 构建完成 ✓" + @echo "[1/4] JavaScript SDK 构建完成 ✓" @echo "" build-go: - @echo "[2/3] 开始构建 Go SDK..." + @echo "[2/4] 开始构建 Go SDK..." @cp -r golang-sdk wikibroker_openapi_sdk && tar zcf wikibroker-openapi-go-sdk-$(GO_SDK_VERSION).tgz wikibroker_openapi_sdk && rm -rf wikibroker_openapi_sdk - @echo "[2/3] Go SDK 构建完成 ✓" + @echo "[2/4] Go SDK 构建完成 ✓" @echo "" build-py: - @echo "[3/3] 开始构建 Python SDK..." + @echo "[3/4] 开始构建 Python SDK..." @cd python-sdk && rm -rf dist && poetry build && mv dist/wikibroker*.whl .. - @echo "[3/3] Python SDK 构建完成 ✓" + @echo "[3/4] Python SDK 构建完成 ✓" @echo "" + +build-java: + @echo "[4/4] 开始构建 Java SDK..." + @cd java-sdk && rm -rf target && mvn package && mv target/wikibroker*.jar .. + @echo "[4/4] Java SDK 构建完成 ✓" + @echo "" \ No newline at end of file From 884726f92957ca93ab4e567088e7babd64d7fb1b Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 30 Jan 2026 18:32:45 +0800 Subject: [PATCH 018/124] =?UTF-8?q?feat:=20=E5=9C=A8java-sdk=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9D=9E=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=AF=B7=E6=B1=82=E4=BD=93=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapters/AbstractRequestBuilder.java | 7 ++++++ .../common/interfaces/RequestBuilder.java | 3 +++ .../wikibroker/openapi/OpenApiTest.java | 22 ++++++++++++++----- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java index 34a2f0d..23180ef 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java @@ -11,6 +11,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; +import java.util.function.Function; import java.util.function.Supplier; public abstract class AbstractRequestBuilder implements RequestOperator { @@ -66,6 +67,12 @@ public final RequestBuilder setBody(String body) { return this; } + @Override + public final RequestBuilder setBody(U body, @NonNull Function serialize) { + this.body = serialize.apply(body); + return this; + } + @Override public final T build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { this.loadHeaders.accept( diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java index 3545449..38e5145 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java @@ -4,6 +4,7 @@ import java.net.URISyntaxException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import java.util.function.Function; public interface RequestBuilder { RequestBuilder setHeader(String name, String value); @@ -14,5 +15,7 @@ public interface RequestBuilder { RequestBuilder setBody(String body); + RequestBuilder setBody(U body, Function serialize); + T build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException; } diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index fa345b6..4f95a04 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -9,6 +9,8 @@ import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; import okhttp3.*; import org.apache.hc.core5.http.ProtocolException; +import org.jetbrains.annotations.Contract; +import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.Test; import java.net.MalformedURLException; @@ -23,11 +25,12 @@ public class OpenApiTest { private static final String baseURL = "https://api.example.com"; private static final String path = "test?q1=c&q2=b&q1=a"; - private static String url() { + @Contract(pure = true) + private static @NonNull String url() { return String.format("%s/%s", OpenApiTest.baseURL, OpenApiTest.path); } - private static final String body = JSON.toJSONString(Map.of("key", "value")); + private static final Map body = Map.of("key", "value"); private static final String method = "POST"; private static final UUID apiKey = UUID.fromString("ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"); @@ -50,7 +53,10 @@ void testNative() { () -> nonce ); try { - final var req = builder.setUrl(url()).setMethod(method).setBody(body).build(); + final var req = builder.setUrl(url()) + .setMethod(method) + .setBody(body, JSON::toJSONString) + .build(); final var actualSignature = req.headers() .firstValue(CustomHeaders.Signature.value()) .orElse(""); @@ -74,7 +80,10 @@ void testApache() { () -> nonce ); try { - final var req = builder.setUrl(url()).setMethod(method).setBody(body).build(); + final var req = builder.setUrl(url()) + .setMethod(method) + .setBody(body, JSON::toJSONString) + .build(); final var actualSignature = req.getHeader(CustomHeaders.Signature.value()).getValue(); assertEquals(expectedSignature, actualSignature); } catch (MalformedURLException | @@ -97,7 +106,10 @@ void testOkHttp() { () -> nonce ); try { - final var req = builder.setUrl(url()).setMethod(method).setBody(body).build(); + final var req = builder.setUrl(url()) + .setMethod(method) + .setBody(body, JSON::toJSONString) + .build(); final var actualSignature = req.header(CustomHeaders.Signature.value()); assertEquals(expectedSignature, actualSignature); } catch (MalformedURLException | From 1b7ca2a5647f3f904e596f821d10c9bba446ead4 Mon Sep 17 00:00:00 2001 From: auston Date: Fri, 13 Feb 2026 13:37:10 +0800 Subject: [PATCH 019/124] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96golang-sd?= =?UTF-8?q?k=E4=B8=AD=E5=87=BD=E6=95=B0=E5=8F=82=E6=95=B0=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E5=92=8Cpython-sdk=E4=B8=AD=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- golang-sdk/core.go | 4 ++-- python-sdk/src/wikibroker_openapi_sdk/core.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/golang-sdk/core.go b/golang-sdk/core.go index 061a8d6..9c2aebd 100644 --- a/golang-sdk/core.go +++ b/golang-sdk/core.go @@ -11,9 +11,9 @@ import ( "wikibroker_openapi_sdk/common" ) -func generateSignature(key, canonicalString string) string { +func generateSignature(key, message string) string { h := hmac.New(sha256.New, []byte(key)) - h.Write([]byte(canonicalString)) + h.Write([]byte(message)) return hex.EncodeToString(h.Sum(nil)) } diff --git a/python-sdk/src/wikibroker_openapi_sdk/core.py b/python-sdk/src/wikibroker_openapi_sdk/core.py index 74be882..78e6551 100644 --- a/python-sdk/src/wikibroker_openapi_sdk/core.py +++ b/python-sdk/src/wikibroker_openapi_sdk/core.py @@ -1,4 +1,5 @@ -import hmac, hashlib +import hmac +import hashlib from .common.types import Request from .common.enums import CustomHeaders from urllib.parse import urlparse, parse_qsl From 3b227e92787bfaf8c33fe20eabf1d19d0527509c Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 24 Feb 2026 14:30:02 +0800 Subject: [PATCH 020/124] =?UTF-8?q?chore:=20=E5=B0=86python-sdk=E7=9A=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86=E5=B7=A5=E5=85=B7=E4=BB=8E?= =?UTF-8?q?poetry=E6=8D=A2=E6=88=90uv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- python-sdk/.gitignore | 7 +- python-sdk/.python-version | 1 + python-sdk/poetry.lock | 1189 ------------------------------------ python-sdk/pyproject.toml | 8 +- python-sdk/uv.lock | 783 ++++++++++++++++++++++++ 6 files changed, 795 insertions(+), 1195 deletions(-) create mode 100644 python-sdk/.python-version delete mode 100644 python-sdk/poetry.lock create mode 100644 python-sdk/uv.lock diff --git a/Makefile b/Makefile index 7f42c34..d86795a 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ build-go: build-py: @echo "[3/4] 开始构建 Python SDK..." - @cd python-sdk && rm -rf dist && poetry build && mv dist/wikibroker*.whl .. + @cd python-sdk && rm -rf dist && uv build && mv dist/wikibroker*.whl .. @echo "[3/4] Python SDK 构建完成 ✓" @echo "" diff --git a/python-sdk/.gitignore b/python-sdk/.gitignore index d294e43..7428811 100644 --- a/python-sdk/.gitignore +++ b/python-sdk/.gitignore @@ -1,3 +1,8 @@ .venv +.uv dist -__pycache__ \ No newline at end of file +__pycache__ +.pytest_cache +.mypy_cache +*.pyc +*.egg-info \ No newline at end of file diff --git a/python-sdk/.python-version b/python-sdk/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/python-sdk/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/python-sdk/poetry.lock b/python-sdk/poetry.lock deleted file mode 100644 index 62b4840..0000000 --- a/python-sdk/poetry.lock +++ /dev/null @@ -1,1189 +0,0 @@ -# This file is automatically @generated by Poetry 2.3.0 and should not be changed by hand. - -[[package]] -name = "aiohappyeyeballs" -version = "2.6.1" -description = "Happy Eyeballs for asyncio" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, - {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, -] - -[[package]] -name = "aiohttp" -version = "3.13.3" -description = "Async http client/server framework (asyncio)" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7"}, - {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821"}, - {file = "aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455"}, - {file = "aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29"}, - {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11"}, - {file = "aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd"}, - {file = "aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c"}, - {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b"}, - {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64"}, - {file = "aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1"}, - {file = "aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4"}, - {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29"}, - {file = "aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239"}, - {file = "aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f"}, - {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c"}, - {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168"}, - {file = "aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc"}, - {file = "aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce"}, - {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a"}, - {file = "aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046"}, - {file = "aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57"}, - {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c"}, - {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9"}, - {file = "aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0"}, - {file = "aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0"}, - {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591"}, - {file = "aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf"}, - {file = "aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e"}, - {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808"}, - {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415"}, - {file = "aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1"}, - {file = "aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c"}, - {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43"}, - {file = "aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1"}, - {file = "aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984"}, - {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c"}, - {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592"}, - {file = "aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8"}, - {file = "aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df"}, - {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa"}, - {file = "aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767"}, - {file = "aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344"}, - {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31a83ea4aead760dfcb6962efb1d861db48c34379f2ff72db9ddddd4cda9ea2e"}, - {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:988a8c5e317544fdf0d39871559e67b6341065b87fceac641108c2096d5506b7"}, - {file = "aiohttp-3.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b174f267b5cfb9a7dba9ee6859cecd234e9a681841eb85068059bc867fb8f02"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:947c26539750deeaee933b000fb6517cc770bbd064bad6033f1cff4803881e43"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9ebf57d09e131f5323464bd347135a88622d1c0976e88ce15b670e7ad57e4bd6"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4ae5b5a0e1926e504c81c5b84353e7a5516d8778fbbff00429fe7b05bb25cbce"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2ba0eea45eb5cc3172dbfc497c066f19c41bac70963ea1a67d51fc92e4cf9a80"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bae5c2ed2eae26cc382020edad80d01f36cb8e746da40b292e68fec40421dc6a"}, - {file = "aiohttp-3.13.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a60e60746623925eab7d25823329941aee7242d559baa119ca2b253c88a7bd6"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e50a2e1404f063427c9d027378472316201a2290959a295169bcf25992d04558"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:9a9dc347e5a3dc7dfdbc1f82da0ef29e388ddb2ed281bfce9dd8248a313e62b7"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b46020d11d23fe16551466c77823df9cc2f2c1e63cc965daf67fa5eec6ca1877"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:69c56fbc1993fa17043e24a546959c0178fe2b5782405ad4559e6c13975c15e3"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b99281b0704c103d4e11e72a76f1b543d4946fea7dd10767e7e1b5f00d4e5704"}, - {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:40c5e40ecc29ba010656c18052b877a1c28f84344825efa106705e835c28530f"}, - {file = "aiohttp-3.13.3-cp39-cp39-win32.whl", hash = "sha256:56339a36b9f1fc708260c76c87e593e2afb30d26de9ae1eb445b5e051b98a7a1"}, - {file = "aiohttp-3.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:c6b8568a3bb5819a0ad087f16d40e5a3fb6099f39ea1d5625a3edc1e923fc538"}, - {file = "aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88"}, -] - -[package.dependencies] -aiohappyeyeballs = ">=2.5.0" -aiosignal = ">=1.4.0" -attrs = ">=17.3.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -propcache = ">=0.2.0" -yarl = ">=1.17.0,<2.0" - -[package.extras] -speedups = ["Brotli (>=1.2) ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi (>=1.2) ; platform_python_implementation != \"CPython\""] - -[[package]] -name = "aiosignal" -version = "1.4.0" -description = "aiosignal: a list of registered asynchronous callbacks" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, - {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" -typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""} - -[[package]] -name = "anyio" -version = "4.12.1" -description = "High-level concurrency and networking framework on top of asyncio or Trio" -optional = false -python-versions = ">=3.9" -groups = ["main", "dev"] -files = [ - {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, - {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, -] - -[package.dependencies] -idna = ">=2.8" -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} - -[package.extras] -trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] - -[[package]] -name = "asyncer" -version = "0.0.12" -description = "Asyncer, async and await, focused on developer experience." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "asyncer-0.0.12-py3-none-any.whl", hash = "sha256:2eb8bb255bdecf04a81df2d47cf168401df1f65a5f62e1bccc1f86ba375c9913"}, - {file = "asyncer-0.0.12.tar.gz", hash = "sha256:4ceaa472bf40f3778caa3bd7f7dfcbafec0a948a9688e3c90a1796469ebe5e19"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5.0" -sniffio = ">=1.1" - -[[package]] -name = "attrs" -version = "25.4.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, - {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, -] - -[[package]] -name = "certifi" -version = "2026.1.4" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, - {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.4" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, - {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, - {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["test"] -markers = "sys_platform == \"win32\"" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "frozenlist" -version = "1.8.0" -description = "A list-like structure which implements collections.abc.MutableSequence" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011"}, - {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565"}, - {file = "frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7"}, - {file = "frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a"}, - {file = "frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6"}, - {file = "frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e"}, - {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84"}, - {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9"}, - {file = "frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967"}, - {file = "frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25"}, - {file = "frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b"}, - {file = "frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a"}, - {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1"}, - {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b"}, - {file = "frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa"}, - {file = "frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf"}, - {file = "frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746"}, - {file = "frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd"}, - {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a"}, - {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7"}, - {file = "frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed"}, - {file = "frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496"}, - {file = "frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231"}, - {file = "frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62"}, - {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94"}, - {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c"}, - {file = "frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41"}, - {file = "frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b"}, - {file = "frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888"}, - {file = "frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042"}, - {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0"}, - {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f"}, - {file = "frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7"}, - {file = "frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806"}, - {file = "frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0"}, - {file = "frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b"}, - {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d"}, - {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed"}, - {file = "frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e"}, - {file = "frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df"}, - {file = "frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd"}, - {file = "frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79"}, - {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8b7138e5cd0647e4523d6685b0eac5d4be9a184ae9634492f25c6eb38c12a47"}, - {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a6483e309ca809f1efd154b4d37dc6d9f61037d6c6a81c2dc7a15cb22c8c5dca"}, - {file = "frozenlist-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b9290cf81e95e93fdf90548ce9d3c1211cf574b8e3f4b3b7cb0537cf2227068"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:59a6a5876ca59d1b63af8cd5e7ffffb024c3dc1e9cf9301b21a2e76286505c95"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dc4126390929823e2d2d9dc79ab4046ed74680360fc5f38b585c12c66cdf459"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:332db6b2563333c5671fecacd085141b5800cb866be16d5e3eb15a2086476675"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ff15928d62a0b80bb875655c39bf517938c7d589554cbd2669be42d97c2cb61"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7bf6cdf8e07c8151fba6fe85735441240ec7f619f935a5205953d58009aef8c6"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:48e6d3f4ec5c7273dfe83ff27c91083c6c9065af655dc2684d2c200c94308bb5"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:1a7607e17ad33361677adcd1443edf6f5da0ce5e5377b798fba20fae194825f3"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3a935c3a4e89c733303a2d5a7c257ea44af3a56c8202df486b7f5de40f37e1"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:940d4a017dbfed9daf46a3b086e1d2167e7012ee297fef9e1c545c4d022f5178"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b9be22a69a014bc47e78072d0ecae716f5eb56c15238acca0f43d6eb8e4a5bda"}, - {file = "frozenlist-1.8.0-cp39-cp39-win32.whl", hash = "sha256:1aa77cb5697069af47472e39612976ed05343ff2e84a3dcf15437b232cbfd087"}, - {file = "frozenlist-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:7398c222d1d405e796970320036b1b563892b65809d9e5261487bb2c7f7b5c6a"}, - {file = "frozenlist-1.8.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f3b365f31c6cd4af24545ca0a244a53688cad8834e32f56831c4923b50a103"}, - {file = "frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d"}, - {file = "frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad"}, -] - -[[package]] -name = "h11" -version = "0.16.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, - {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, -] - -[[package]] -name = "httpcore" -version = "1.0.9" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, - {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.16" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.28.1" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, - {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" - -[package.extras] -brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "idna" -version = "3.11" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.8" -groups = ["main", "dev"] -files = [ - {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, - {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - -[[package]] -name = "iniconfig" -version = "2.3.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.10" -groups = ["test"] -files = [ - {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, - {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, -] - -[[package]] -name = "multidict" -version = "6.7.0" -description = "multidict implementation" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349"}, - {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e"}, - {file = "multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36"}, - {file = "multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85"}, - {file = "multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7"}, - {file = "multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34"}, - {file = "multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff"}, - {file = "multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81"}, - {file = "multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8"}, - {file = "multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4"}, - {file = "multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b"}, - {file = "multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288"}, - {file = "multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17"}, - {file = "multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390"}, - {file = "multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6"}, - {file = "multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d"}, - {file = "multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6"}, - {file = "multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f"}, - {file = "multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885"}, - {file = "multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c"}, - {file = "multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0"}, - {file = "multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13"}, - {file = "multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd"}, - {file = "multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4"}, - {file = "multidict-6.7.0-cp39-cp39-win32.whl", hash = "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91"}, - {file = "multidict-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f"}, - {file = "multidict-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546"}, - {file = "multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3"}, - {file = "multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5"}, -] - -[[package]] -name = "packaging" -version = "25.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -groups = ["test"] -files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, -] - -[[package]] -name = "pluggy" -version = "1.6.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.9" -groups = ["test"] -files = [ - {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, - {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["coverage", "pytest", "pytest-benchmark"] - -[[package]] -name = "propcache" -version = "0.4.1" -description = "Accelerated property cache" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db"}, - {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8"}, - {file = "propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925"}, - {file = "propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21"}, - {file = "propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5"}, - {file = "propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db"}, - {file = "propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c"}, - {file = "propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb"}, - {file = "propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37"}, - {file = "propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581"}, - {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf"}, - {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5"}, - {file = "propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e"}, - {file = "propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566"}, - {file = "propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165"}, - {file = "propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc"}, - {file = "propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f"}, - {file = "propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1"}, - {file = "propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6"}, - {file = "propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239"}, - {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2"}, - {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403"}, - {file = "propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207"}, - {file = "propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72"}, - {file = "propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367"}, - {file = "propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4"}, - {file = "propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75"}, - {file = "propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8"}, - {file = "propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db"}, - {file = "propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1"}, - {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf"}, - {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311"}, - {file = "propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74"}, - {file = "propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe"}, - {file = "propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af"}, - {file = "propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c"}, - {file = "propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66"}, - {file = "propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81"}, - {file = "propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e"}, - {file = "propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1"}, - {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b"}, - {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566"}, - {file = "propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835"}, - {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e"}, - {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859"}, - {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b"}, - {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1"}, - {file = "propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717"}, - {file = "propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37"}, - {file = "propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a"}, - {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12"}, - {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c"}, - {file = "propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded"}, - {file = "propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641"}, - {file = "propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4"}, - {file = "propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44"}, - {file = "propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144"}, - {file = "propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f"}, - {file = "propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153"}, - {file = "propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992"}, - {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f"}, - {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393"}, - {file = "propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0"}, - {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a"}, - {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be"}, - {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc"}, - {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455"}, - {file = "propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85"}, - {file = "propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1"}, - {file = "propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9"}, - {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d233076ccf9e450c8b3bc6720af226b898ef5d051a2d145f7d765e6e9f9bcff"}, - {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:357f5bb5c377a82e105e44bd3d52ba22b616f7b9773714bff93573988ef0a5fb"}, - {file = "propcache-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbc3b6dfc728105b2a57c06791eb07a94229202ea75c59db644d7d496b698cac"}, - {file = "propcache-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:182b51b421f0501952d938dc0b0eb45246a5b5153c50d42b495ad5fb7517c888"}, - {file = "propcache-0.4.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b536b39c5199b96fc6245eb5fb796c497381d3942f169e44e8e392b29c9ebcc"}, - {file = "propcache-0.4.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db65d2af507bbfbdcedb254a11149f894169d90488dd3e7190f7cdcb2d6cd57a"}, - {file = "propcache-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd2dbc472da1f772a4dae4fa24be938a6c544671a912e30529984dd80400cd88"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:daede9cd44e0f8bdd9e6cc9a607fc81feb80fae7a5fc6cecaff0e0bb32e42d00"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:71b749281b816793678ae7f3d0d84bd36e694953822eaad408d682efc5ca18e0"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0002004213ee1f36cfb3f9a42b5066100c44276b9b72b4e1504cddd3d692e86e"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fe49d0a85038f36ba9e3ffafa1103e61170b28e95b16622e11be0a0ea07c6781"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99d43339c83aaf4d32bda60928231848eee470c6bda8d02599cc4cebe872d183"}, - {file = "propcache-0.4.1-cp39-cp39-win32.whl", hash = "sha256:a129e76735bc792794d5177069691c3217898b9f5cee2b2661471e52ffe13f19"}, - {file = "propcache-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:948dab269721ae9a87fd16c514a0a2c2a1bdb23a9a61b969b0f9d9ee2968546f"}, - {file = "propcache-0.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:5fd37c406dd6dc85aa743e214cef35dc54bbdd1419baac4f6ae5e5b1a2976938"}, - {file = "propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237"}, - {file = "propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d"}, -] - -[[package]] -name = "pygments" -version = "2.19.2" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" -groups = ["test"] -files = [ - {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, - {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pytest" -version = "9.0.2" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.10" -groups = ["test"] -files = [ - {file = "pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b"}, - {file = "pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11"}, -] - -[package.dependencies] -colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} -iniconfig = ">=1.0.1" -packaging = ">=22" -pluggy = ">=1.5,<2" -pygments = ">=2.7.2" - -[package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "requests" -version = "2.32.5" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, - {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset_normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "ruff" -version = "0.14.13" -description = "An extremely fast Python linter and code formatter, written in Rust." -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "ruff-0.14.13-py3-none-linux_armv6l.whl", hash = "sha256:76f62c62cd37c276cb03a275b198c7c15bd1d60c989f944db08a8c1c2dbec18b"}, - {file = "ruff-0.14.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:914a8023ece0528d5cc33f5a684f5f38199bbb566a04815c2c211d8f40b5d0ed"}, - {file = "ruff-0.14.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d24899478c35ebfa730597a4a775d430ad0d5631b8647a3ab368c29b7e7bd063"}, - {file = "ruff-0.14.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aaf3870f14d925bbaf18b8a2347ee0ae7d95a2e490e4d4aea6813ed15ebc80e"}, - {file = "ruff-0.14.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac5b7f63dd3b27cc811850f5ffd8fff845b00ad70e60b043aabf8d6ecc304e09"}, - {file = "ruff-0.14.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2b1097750d90ba82ce4ba676e85230a0ed694178ca5e61aa9b459970b3eb9"}, - {file = "ruff-0.14.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d0bf87705acbbcb8d4c24b2d77fbb73d40210a95c3903b443cd9e30824a5032"}, - {file = "ruff-0.14.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3eb5da8e2c9e9f13431032fdcbe7681de9ceda5835efee3269417c13f1fed5c"}, - {file = "ruff-0.14.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:642442b42957093811cd8d2140dfadd19c7417030a7a68cf8d51fcdd5f217427"}, - {file = "ruff-0.14.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4acdf009f32b46f6e8864af19cbf6841eaaed8638e65c8dac845aea0d703c841"}, - {file = "ruff-0.14.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:591a7f68860ea4e003917d19b5c4f5ac39ff558f162dc753a2c5de897fd5502c"}, - {file = "ruff-0.14.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:774c77e841cc6e046fc3e91623ce0903d1cd07e3a36b1a9fe79b81dab3de506b"}, - {file = "ruff-0.14.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:61f4e40077a1248436772bb6512db5fc4457fe4c49e7a94ea7c5088655dd21ae"}, - {file = "ruff-0.14.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6d02f1428357fae9e98ac7aa94b7e966fd24151088510d32cf6f902d6c09235e"}, - {file = "ruff-0.14.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e399341472ce15237be0c0ae5fbceca4b04cd9bebab1a2b2c979e015455d8f0c"}, - {file = "ruff-0.14.13-py3-none-win32.whl", hash = "sha256:ef720f529aec113968b45dfdb838ac8934e519711da53a0456038a0efecbd680"}, - {file = "ruff-0.14.13-py3-none-win_amd64.whl", hash = "sha256:6070bd026e409734b9257e03e3ef18c6e1a216f0435c6751d7a8ec69cb59abef"}, - {file = "ruff-0.14.13-py3-none-win_arm64.whl", hash = "sha256:7ab819e14f1ad9fe39f246cfcc435880ef7a9390d81a2b6ac7e01039083dd247"}, - {file = "ruff-0.14.13.tar.gz", hash = "sha256:83cd6c0763190784b99650a20fec7633c59f6ebe41c5cc9d45ee42749563ad47"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -description = "Backported and Experimental Type Hints for Python 3.9+" -optional = false -python-versions = ">=3.9" -groups = ["main", "dev"] -markers = "python_version == \"3.12\"" -files = [ - {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, - {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, -] - -[[package]] -name = "urllib3" -version = "2.6.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, - {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, -] - -[package.extras] -brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] - -[[package]] -name = "yarl" -version = "1.22.0" -description = "Yet another URL library" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, - {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, - {file = "yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467"}, - {file = "yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea"}, - {file = "yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca"}, - {file = "yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e"}, - {file = "yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca"}, - {file = "yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b"}, - {file = "yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520"}, - {file = "yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8"}, - {file = "yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c"}, - {file = "yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67"}, - {file = "yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95"}, - {file = "yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d"}, - {file = "yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62"}, - {file = "yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03"}, - {file = "yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"}, - {file = "yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da"}, - {file = "yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2"}, - {file = "yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79"}, - {file = "yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c"}, - {file = "yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e"}, - {file = "yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27"}, - {file = "yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8"}, - {file = "yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b"}, - {file = "yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed"}, - {file = "yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2"}, - {file = "yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff"}, - {file = "yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" -propcache = ">=0.2.1" - -[metadata] -lock-version = "2.1" -python-versions = ">=3.12" -content-hash = "9efcd77b7e2d6d1b754439cb76a3bb807138bb840e67ef5fb33ab1b605612588" diff --git a/python-sdk/pyproject.toml b/python-sdk/pyproject.toml index ee80c8f..f2a028f 100644 --- a/python-sdk/pyproject.toml +++ b/python-sdk/pyproject.toml @@ -7,12 +7,12 @@ readme = "README.md" requires-python = ">=3.12" dependencies = ["asyncer (>=0.0.12,<0.0.13)"] -[tool.poetry] -packages = [{ include = "wikibroker_openapi_sdk", from = "src" }] +[tool.uv] +package = true [build-system] -requires = ["poetry-core>=2.0.0,<3.0.0"] -build-backend = "poetry.core.masonry.api" +requires = ["setuptools>=61.0", "wheel"] +build-backend = "setuptools.build_meta" [dependency-groups] dev = [ diff --git a/python-sdk/uv.lock b/python-sdk/uv.lock new file mode 100644 index 0000000..c8fc464 --- /dev/null +++ b/python-sdk/uv.lock @@ -0,0 +1,783 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, + { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, + { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, + { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, + { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, + { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, + { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, + { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, + { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, + { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, + { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, + { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, + { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, + { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, + { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126, upload-time = "2026-01-03T17:31:47.463Z" }, + { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128, upload-time = "2026-01-03T17:31:49.2Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, + { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, + { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, + { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, + { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, + { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523, upload-time = "2026-01-03T17:32:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694, upload-time = "2026-01-03T17:32:24.546Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "anyio" +version = "4.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, +] + +[[package]] +name = "asyncer" +version = "0.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/3a/e3d6919a41328f837a1c73ac057a8be35276c350046a79af588c536bd0fc/asyncer-0.0.12.tar.gz", hash = "sha256:4ceaa472bf40f3778caa3bd7f7dfcbafec0a948a9688e3c90a1796469ebe5e19", size = 17909, upload-time = "2025-12-26T12:05:10.248Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/f6/ebdca24b43151ed2a7dcf98bab4b61fdfc50dbd7224b9b4de195099fa65e/asyncer-0.0.12-py3-none-any.whl", hash = "sha256:2eb8bb255bdecf04a81df2d47cf168401df1f65a5f62e1bccc1f86ba375c9913", size = 9320, upload-time = "2025-12-26T12:05:08.848Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "ruff" +version = "0.14.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, + { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, + { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "wikibroker-openapi-sdk" +version = "1.0.0" +source = { editable = "." } +dependencies = [ + { name = "asyncer" }, +] + +[package.dev-dependencies] +dev = [ + { name = "aiohttp" }, + { name = "httpx" }, + { name = "requests" }, + { name = "ruff" }, +] +test = [ + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [{ name = "asyncer", specifier = ">=0.0.12,<0.0.13" }] + +[package.metadata.requires-dev] +dev = [ + { name = "aiohttp", specifier = ">=3.13.3,<4.0.0" }, + { name = "httpx", specifier = ">=0.28.1,<0.29.0" }, + { name = "requests", specifier = ">=2.32.5,<3.0.0" }, + { name = "ruff", specifier = ">=0.14.13,<0.15.0" }, +] +test = [{ name = "pytest", specifier = ">=9.0.2,<10.0.0" }] + +[[package]] +name = "yarl" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, + { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, + { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, + { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, + { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, + { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, + { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, + { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, + { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, + { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, + { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, + { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, + { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, + { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, + { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, + { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, + { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, + { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, + { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, + { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, + { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, + { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, + { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, + { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, + { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, + { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, + { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, + { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, + { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, + { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990, upload-time = "2025-10-06T14:11:40.624Z" }, + { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292, upload-time = "2025-10-06T14:11:42.578Z" }, + { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888, upload-time = "2025-10-06T14:11:44.863Z" }, + { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, + { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, + { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, + { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, + { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, + { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056, upload-time = "2025-10-06T14:12:13.317Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292, upload-time = "2025-10-06T14:12:15.398Z" }, + { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +] From 8001cf88d62d76b8380aa5cc53f5c57f27e365fa Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 24 Feb 2026 15:33:03 +0800 Subject: [PATCH 021/124] =?UTF-8?q?doc:=20=E5=9C=A8README=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0java-sdk=E6=8E=A5=E5=85=A5=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 126 ++++++++++++++++++++++++++++++++++++++++++++- java-sdk/README.md | 78 ---------------------------- 2 files changed, 125 insertions(+), 79 deletions(-) delete mode 100644 java-sdk/README.md diff --git a/README.md b/README.md index 60fb991..6318299 100644 --- a/README.md +++ b/README.md @@ -260,7 +260,131 @@ async def send_request(): send_request() ``` -#### `Java`/`Kotlin`接入([开发中](./java-sdk)) +#### `Java`/`Kotlin`接入 + +**安装** + +`maven` + +1. 第一步:安装jar包 + + ```bash + mvn install:install-file \ + -Dfile=./wikibroker-openapi-sdk-0.1.0-alpha.jar \ + -DgroupId=com.wikiglobal \ + -DartifactId=wikibroker-openapi-sdk \ + -Dversion=0.1.0-alpha \ + -Dpackaging=jar + ``` + +2. 第二步:声明maven依赖 + + ```xml + + com.wikiglobal + wikibroker-openapi-sdk + 0.1.0-alpha + compile + ``` + +`gradle` + +1. 方式一:使用Groovy声明依赖 + + `build.gradle` + + ```groovy + dependencies { + implementation files('./wikibroker-openapi-sdk-0.1.0-alpha.jar') + } + ``` + +2. 方式二:使用Kotlin声明依赖 + + `build.gradle.kts` + + ```kotlin + dependencies { + implementation(files('./wikibroker-openapi-sdk-0.1.0-alpha.jar')) + } + ``` + +**示例** + +`java.net.http` + +```java +import java.net.http.HttpClient; +import java.net.http.HttpResponse; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiNativeRequestBuilderFactory; +// ... +final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; +final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; +final var factory = new WikiBrokerOpenApiNativeRequestBuilderFactory(API_KEY, API_SECRET); + +try (var client = HttpClient.newHttpClient()) { + var builder = factory.create(); + var req = builder.setMethod("POST") + .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") + .setBody("{\"key\":\"value\"") + .build(); + client.send(req, HttpResponse.BodyHandlers.ofString()); +} catch (Exception e) { + // Handle Exception +} +``` + +`okhttp` + +```java +import okhttp3.OkHttpClient; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiOkhttpRequestBuilderFactory; +// ... +final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; +final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; +final var factory = new WikiBrokerOpenApiOkhttpRequestBuilderFactory(API_KEY, API_SECRET); + +var client = new OkHttpClient(); +try { + var builder = factory.create(); + var req = builder.setMethod("POST") + .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") + .setBody("{\"key\":\"value\"") + .build(); + try (var resp = client.newCall(req).execute()) { + // Handle Response + } +} catch (Exception e) { + // Handle Exception +} +``` + +`apache httpclient` + +```java +import org.apache.hc.client5.http.impl.classic.HttpClients; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiApacheRequestBuilderFactory; +// ... +final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; +final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; +final var factory = new WikiBrokerOpenApiApacheRequestBuilderFactory(API_KEY, API_SECRET); + +try (var client = HttpClients.createDefault()) { + var builder = factory.create(); + var req = builder.setMethod("POST") + .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") + .setBody("{\"key\":\"value\"") + .build(); + client.execute( + req, resp -> { + // Handle Response + return null; + } + ); +} catch (Exception e) { + // Handle Exception +} +``` ### 通过API接入 diff --git a/java-sdk/README.md b/java-sdk/README.md deleted file mode 100644 index d8eeaf6..0000000 --- a/java-sdk/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# WikiBroker OpenAPI SDK for JVM - -## 示例 - -`java.net.http` - -```java -import java.net.http.HttpClient; -import java.net.http.HttpResponse; -import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiNativeRequestBuilderFactory; -// ... -final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; -final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; -final var factory = new WikiBrokerOpenApiNativeRequestBuilderFactory(API_KEY, API_SECRET); - -try (var client = HttpClient.newHttpClient()) { - var builder = factory.create(); - var req = builder.setMethod("POST") - .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") - .setBody("{\"key\":\"value\"") - .build(); - client.send(req, HttpResponse.BodyHandlers.ofString()); -} catch (Exception e) { - // Handle Exception -} -``` - -`okhttp` - -```java -import okhttp3.OkHttpClient; -import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiOkhttpRequestBuilderFactory; -// ... -final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; -final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; -final var factory = new WikiBrokerOpenApiOkhttpRequestBuilderFactory(API_KEY, API_SECRET); - -var client = new OkHttpClient(); -try { - var builder = factory.create(); - var req = builder.setMethod("POST") - .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") - .setBody("{\"key\":\"value\"") - .build(); - try (var resp = client.newCall(req).execute()) { - // Handle Response - } -} catch (Exception e) { - // Handle Exception -} -``` - -`apache httpclient` - -```java -import org.apache.hc.client5.http.impl.classic.HttpClients; -import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiApacheRequestBuilderFactory; -// ... -final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; -final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; -final var factory = new WikiBrokerOpenApiApacheRequestBuilderFactory(API_KEY, API_SECRET); - -try (var client = HttpClients.createDefault()) { - var builder = factory.create(); - var req = builder.setMethod("POST") - .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") - .setBody("{\"key\":\"value\"") - .build(); - client.execute( - req, resp -> { - // Handle Response - return null; - } - ); -} catch (Exception e) { - // Handle Exception -} -``` From 02102d231730c35edfc99b9bab596572a25b5c51 Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 24 Feb 2026 17:43:31 +0800 Subject: [PATCH 022/124] =?UTF-8?q?chore:=20=E4=BD=BF=E7=94=A8composer?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96php-sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/.gitignore | 1 + php-sdk/composer.json | 18 ++++++++++++++++++ php-sdk/composer.lock | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 php-sdk/.gitignore create mode 100644 php-sdk/composer.json create mode 100644 php-sdk/composer.lock diff --git a/php-sdk/.gitignore b/php-sdk/.gitignore new file mode 100644 index 0000000..a725465 --- /dev/null +++ b/php-sdk/.gitignore @@ -0,0 +1 @@ +vendor/ \ No newline at end of file diff --git a/php-sdk/composer.json b/php-sdk/composer.json new file mode 100644 index 0000000..45da282 --- /dev/null +++ b/php-sdk/composer.json @@ -0,0 +1,18 @@ +{ + "name": "wikiglobal/wikibroker-openapi-sdk", + "description": "WikiBroker OpenAPI SDK", + "type": "library", + "license": "MIT", + "autoload": { + "psr-4": { + "WikibrokerOpenapiSdk\\": "src/" + } + }, + "authors": [ + { + "name": "Auston", + "email": "auston@wikiglobal.com" + } + ], + "require": {} +} diff --git a/php-sdk/composer.lock b/php-sdk/composer.lock new file mode 100644 index 0000000..20b621d --- /dev/null +++ b/php-sdk/composer.lock @@ -0,0 +1,18 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "fc1763a73248da1ede092753adc493c1", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} From 0945f03897659f77041c0c654b15bc3ab4c47cb8 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 25 Feb 2026 15:45:58 +0800 Subject: [PATCH 023/124] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96java-sdk?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java-sdk/pom.xml | 7 ++ .../openapi/AbstractBuilderFactory.java | 12 ++-- .../wikiglobal/wikibroker/openapi/Core.java | 27 ++++---- .../wikibroker/openapi/WikiBrokerOpenApi.java | 17 +++-- ...kerOpenApiApacheRequestBuilderFactory.java | 17 +++-- ...kerOpenApiNativeRequestBuilderFactory.java | 19 +++--- ...kerOpenApiOkhttpRequestBuilderFactory.java | 17 +++-- .../adapters/AbstractRequestBuilder.java | 67 +++++-------------- .../adapters/ApacheHttpRequestBuilder.java | 19 +----- .../openapi/adapters/HttpRequestBuilder.java | 18 +---- .../adapters/OkHttpRequestBuilder.java | 19 +----- .../wikibroker/openapi/common/Hash.java | 9 ++- .../wikibroker/openapi/common/Utils.java | 9 ++- .../openapi/common/enums/CustomHeaders.java | 15 ++--- .../common/interfaces/RequestBuilder.java | 10 +-- .../common/interfaces/RequestReader.java | 8 +-- .../wikibroker/openapi/OpenApiTest.java | 67 ++++++++++--------- 17 files changed, 135 insertions(+), 222 deletions(-) diff --git a/java-sdk/pom.xml b/java-sdk/pom.xml index 3d1d273..9593735 100644 --- a/java-sdk/pom.xml +++ b/java-sdk/pom.xml @@ -58,5 +58,12 @@ 2.0.60 test + + + org.projectlombok + lombok + 1.18.42 + compile + diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java index 832547f..d5a3de7 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java @@ -9,18 +9,14 @@ public abstract class AbstractBuilderFactory implements Factory> { protected final UUID apiKey; protected final String apiSecret; - protected final LoadHeaders loadHeaders; - protected final Sign sign; - protected final Supplier timestampGenerator; - protected final Supplier idGenerator; + protected final LoadHeaders loadHeaders = WikiBrokerOpenApi::addXHeaders; + protected final Sign sign = WikiBrokerOpenApi::sign; + protected final Supplier timestampGenerator = Instant::now; + protected final Supplier idGenerator = UUID::randomUUID; public AbstractBuilderFactory(String apiKey, String apiSecret) { this.apiKey = UUID.fromString(apiKey); this.apiSecret = apiSecret; - this.loadHeaders = WikiBrokerOpenApi::addXHeaders; - this.sign = WikiBrokerOpenApi::sign; - this.timestampGenerator = Instant::now; - this.idGenerator = UUID::randomUUID; } @Override diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java index 25f52a6..18534a7 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/Core.java @@ -5,6 +5,7 @@ import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestReader; +import lombok.experimental.UtilityClass; import org.apache.commons.codec.binary.Hex; import org.jspecify.annotations.NonNull; @@ -19,40 +20,38 @@ import java.util.Map; import java.util.stream.Collectors; +@UtilityClass public final class Core { - private Core() { - } - - public static @NonNull String generateSignature( + public @NonNull String generateSignature( @NonNull String key, @NonNull String message ) throws NoSuchAlgorithmException, InvalidKeyException { return Hex.encodeHexString(Hash.hmacSha256(key, message)); } - public static @NonNull String generateCanonicalString( + public @NonNull String generateCanonicalString( @NonNull RequestReader req ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException { - final var method = req.getMethod().toUpperCase(); - final var path = new URI(req.getUrl()).toURL().getPath(); + final var method = req.method().toUpperCase(); + final var path = new URI(req.url()).toURL().getPath(); final var canonicalQuery = Core.buildCanonicalQuery(req); - final var apiKey = req.getHeader(CustomHeaders.ApiKey.value()); - final var timestamp = req.getHeader(CustomHeaders.TimeStamp.value()); - final var nonce = req.getHeader(CustomHeaders.Nonce.value()); + final var apiKey = req.header(CustomHeaders.ApiKey.value()); + final var timestamp = req.header(CustomHeaders.TimeStamp.value()); + final var nonce = req.header(CustomHeaders.Nonce.value()); final var bodyHash = Core.calculateBodyHash(req); return String.join("\n", method, path, canonicalQuery, apiKey, timestamp, nonce, bodyHash); } - private static @NonNull String calculateBodyHash(@NonNull RequestReader req) throws NoSuchAlgorithmException { - final var body = Utils.isRequestUsePostMethod(req) ? req.getBody() : ""; + private @NonNull String calculateBodyHash(@NonNull RequestReader req) throws NoSuchAlgorithmException { + final var body = Utils.isRequestUsePostMethod(req) ? req.body() : ""; final var hash = Hash.sha256Hash(body); return Hex.encodeHexString(hash); } - private static @NonNull String buildCanonicalQuery( + private @NonNull String buildCanonicalQuery( @NonNull RequestReader req ) throws URISyntaxException, MalformedURLException { - final var queryString = new URI(req.getUrl()).toURL().getQuery(); + final var queryString = new URI(req.url()).toURL().getQuery(); final var query = Arrays.stream(queryString.split("&")) .map(pair -> pair.split("=")) .collect(Collectors.groupingBy( diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java index 7f4c029..22b8967 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -3,6 +3,7 @@ import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestOperator; +import lombok.experimental.UtilityClass; import org.jspecify.annotations.NonNull; import java.net.MalformedURLException; @@ -12,27 +13,25 @@ import java.time.Instant; import java.util.UUID; +@UtilityClass public class WikiBrokerOpenApi { - private WikiBrokerOpenApi() { - } - - public static void addXHeaders( + public void addXHeaders( @NonNull RequestBuilder builder, @NonNull UUID apiKey, @NonNull Instant timestamp, @NonNull UUID nonce ) { - builder.setHeader(CustomHeaders.ApiKey.value(), apiKey.toString()) - .setHeader(CustomHeaders.TimeStamp.value(), String.valueOf(timestamp.toEpochMilli())) - .setHeader(CustomHeaders.Nonce.value(), nonce.toString()); + builder.header(CustomHeaders.ApiKey.value(), apiKey.toString()) + .header(CustomHeaders.TimeStamp.value(), String.valueOf(timestamp.toEpochMilli())) + .header(CustomHeaders.Nonce.value(), nonce.toString()); } - public static void sign( + public void sign( RequestOperator req, String key ) throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException { final var canonicalString = Core.generateCanonicalString(req); final var signature = Core.generateSignature(key, canonicalString); - req.setHeader(CustomHeaders.Signature.value(), signature); + req.header(CustomHeaders.Signature.value(), signature); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java index 863c2ea..956eb81 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java @@ -5,7 +5,6 @@ import org.apache.hc.core5.http.ClassicHttpRequest; import org.jspecify.annotations.NonNull; -@SuppressWarnings("unused") public final class WikiBrokerOpenApiApacheRequestBuilderFactory extends AbstractBuilderFactory { public WikiBrokerOpenApiApacheRequestBuilderFactory(String apiKey, String apiSecret) { super(apiKey, apiSecret); @@ -13,13 +12,13 @@ public WikiBrokerOpenApiApacheRequestBuilderFactory(String apiKey, String apiSec @Override public @NonNull RequestBuilder create() { - return new ApacheHttpRequestBuilder( - this.apiKey, - this.apiSecret, - this.loadHeaders, - this.sign, - this.timestampGenerator, - this.idGenerator - ); + return ApacheHttpRequestBuilder.builder() + .apiKey(this.apiKey) + .apiSecret(this.apiSecret) + .loadHeaders(this.loadHeaders) + .sign(this.sign) + .timestampGenerator(this.timestampGenerator) + .idGenerator(this.idGenerator) + .build(); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java index d4dc8b6..1322d76 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java @@ -2,27 +2,24 @@ import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; -import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; import java.net.http.HttpRequest; -@SuppressWarnings("unused") public final class WikiBrokerOpenApiNativeRequestBuilderFactory extends AbstractBuilderFactory { public WikiBrokerOpenApiNativeRequestBuilderFactory(String apiKey, String apiSecret) { super(apiKey, apiSecret); } - @Contract(" -> new") @Override public @NonNull RequestBuilder create() { - return new HttpRequestBuilder( - this.apiKey, - this.apiSecret, - this.loadHeaders, - this.sign, - this.timestampGenerator, - this.idGenerator - ); + return HttpRequestBuilder.builder() + .apiKey(this.apiKey) + .apiSecret(this.apiSecret) + .loadHeaders(this.loadHeaders) + .sign(this.sign) + .timestampGenerator(this.timestampGenerator) + .idGenerator(this.idGenerator) + .build(); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java index 4a24198..4a2940d 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java @@ -4,7 +4,6 @@ import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; import okhttp3.Request; -@SuppressWarnings("unused") public class WikiBrokerOpenApiOkhttpRequestBuilderFactory extends AbstractBuilderFactory { public WikiBrokerOpenApiOkhttpRequestBuilderFactory(String apiKey, String apiSecret) { super(apiKey, apiSecret); @@ -12,13 +11,13 @@ public WikiBrokerOpenApiOkhttpRequestBuilderFactory(String apiKey, String apiSec @Override public RequestBuilder create() { - return new OkHttpRequestBuilder( - this.apiKey, - this.apiSecret, - this.loadHeaders, - this.sign, - this.timestampGenerator, - this.idGenerator - ); + return OkHttpRequestBuilder.builder() + .apiKey(this.apiKey) + .apiSecret(this.apiSecret) + .loadHeaders(this.loadHeaders) + .sign(this.sign) + .timestampGenerator(this.timestampGenerator) + .idGenerator(this.idGenerator) + .build(); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java index 23180ef..35f16dd 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/AbstractRequestBuilder.java @@ -1,6 +1,10 @@ package com.wikiglobal.wikibroker.openapi.adapters; import com.wikiglobal.wikibroker.openapi.common.interfaces.*; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import lombok.experimental.SuperBuilder; import org.jspecify.annotations.NonNull; import java.net.MalformedURLException; @@ -14,11 +18,14 @@ import java.util.function.Function; import java.util.function.Supplier; +@SuperBuilder +@Setter +@Accessors(chain = true, fluent = true) public abstract class AbstractRequestBuilder implements RequestOperator { - protected final Map headers; - protected String method; - protected String url; - protected String body; + protected final Map headers = new HashMap<>(); + @Getter protected String method; + @Getter protected String url; + @Getter protected String body; private final UUID apiKey; private final String apiSecret; private final LoadHeaders loadHeaders; @@ -26,49 +33,20 @@ public abstract class AbstractRequestBuilder implements RequestOperator { private final Supplier timestampGenerator; private final Supplier idGenerator; - public AbstractRequestBuilder( - UUID apiKey, - String apiSecret, - LoadHeaders loadHeaders, - Sign sign, - Supplier timestampGenerator, - Supplier idGenerator - ) { - this.headers = new HashMap<>(); - this.apiKey = apiKey; - this.apiSecret = apiSecret; - this.loadHeaders = loadHeaders; - this.sign = sign; - this.timestampGenerator = timestampGenerator; - this.idGenerator = idGenerator; - } - @Override - public final RequestBuilder setHeader(String name, String value) { + public final RequestBuilder header(String name, String value) { this.headers.put(name, value); return this; } @Override - public final RequestBuilder setMethod(@NonNull String method) { + public final RequestBuilder method(@NonNull String method) { this.method = method.toUpperCase(); return this; } @Override - public final RequestBuilder setUrl(String url) { - this.url = url; - return this; - } - - @Override - public final RequestBuilder setBody(String body) { - this.body = body; - return this; - } - - @Override - public final RequestBuilder setBody(U body, @NonNull Function serialize) { + public final RequestBuilder body(U body, @NonNull Function serialize) { this.body = serialize.apply(body); return this; } @@ -88,22 +66,7 @@ public final T build() throws MalformedURLException, URISyntaxException, NoSuchA protected abstract T buildRequest(); @Override - public final String getHeader(String name) { + public final String header(String name) { return this.headers.get(name); } - - @Override - public final String getMethod() { - return this.method; - } - - @Override - public final String getUrl() { - return this.url; - } - - @Override - public final String getBody() { - return this.body; - } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java index 9d41006..82bd942 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/ApacheHttpRequestBuilder.java @@ -1,28 +1,13 @@ package com.wikiglobal.wikibroker.openapi.adapters; -import java.time.Instant; -import java.util.UUID; -import java.util.function.Supplier; - -import com.wikiglobal.wikibroker.openapi.common.interfaces.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.interfaces.Sign; +import lombok.experimental.SuperBuilder; import org.apache.hc.core5.http.ClassicHttpRequest; import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; import org.apache.hc.core5.http.message.BasicHeader; +@SuperBuilder public final class ApacheHttpRequestBuilder extends AbstractRequestBuilder { - public ApacheHttpRequestBuilder( - UUID apiKey, - String apiSecret, - LoadHeaders loadHeaders, - Sign sign, - Supplier timestampGenerator, - Supplier idGenerator - ) { - super(apiKey, apiSecret, loadHeaders, sign, timestampGenerator, idGenerator); - } - @Override protected ClassicHttpRequest buildRequest() { final var headers = this.headers.entrySet() diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java index f7accee..7fee37c 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/HttpRequestBuilder.java @@ -2,26 +2,12 @@ import java.net.URI; import java.net.http.HttpRequest; -import java.time.Instant; -import java.util.UUID; -import java.util.function.Supplier; import java.util.stream.Stream; -import com.wikiglobal.wikibroker.openapi.common.interfaces.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.interfaces.Sign; +import lombok.experimental.SuperBuilder; +@SuperBuilder public final class HttpRequestBuilder extends AbstractRequestBuilder { - public HttpRequestBuilder( - UUID apiKey, - String apiSecret, - LoadHeaders loadHeaders, - Sign sign, - Supplier timestampGenerator, - Supplier idGenerator - ) { - super(apiKey, apiSecret, loadHeaders, sign, timestampGenerator, idGenerator); - } - @Override protected HttpRequest buildRequest() { final var headers = this.headers.entrySet() diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java index 21196c5..c1309b2 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/adapters/OkHttpRequestBuilder.java @@ -1,30 +1,15 @@ package com.wikiglobal.wikibroker.openapi.adapters; import java.nio.charset.StandardCharsets; -import java.time.Instant; -import java.util.UUID; -import java.util.function.Supplier; - -import com.wikiglobal.wikibroker.openapi.common.interfaces.LoadHeaders; -import com.wikiglobal.wikibroker.openapi.common.interfaces.Sign; +import lombok.experimental.SuperBuilder; import okhttp3.Headers; import okhttp3.Request; import okhttp3.RequestBody; import org.jspecify.annotations.NonNull; +@SuperBuilder public final class OkHttpRequestBuilder extends AbstractRequestBuilder { - public OkHttpRequestBuilder( - UUID apiKey, - String apiSecret, - LoadHeaders loadHeaders, - Sign sign, - Supplier timestampGenerator, - Supplier idGenerator - ) { - super(apiKey, apiSecret, loadHeaders, sign, timestampGenerator, idGenerator); - } - @Override protected @NonNull Request buildRequest() { return new Request.Builder().method( diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java index 7faf5b4..ac2961a 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Hash.java @@ -1,5 +1,6 @@ package com.wikiglobal.wikibroker.openapi.common; +import lombok.experimental.UtilityClass; import org.jspecify.annotations.NonNull; import javax.crypto.Mac; @@ -9,11 +10,9 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +@UtilityClass public class Hash { - private Hash() { - } - - public static byte[] hmacSha256( + public byte[] hmacSha256( @NonNull String key, @NonNull String message ) throws NoSuchAlgorithmException, InvalidKeyException { @@ -26,7 +25,7 @@ public static byte[] hmacSha256( return mac.doFinal(message.getBytes(StandardCharsets.UTF_8)); } - public static byte[] sha256Hash(@NonNull String message) throws NoSuchAlgorithmException { + public byte[] sha256Hash(@NonNull String message) throws NoSuchAlgorithmException { final var md = MessageDigest.getInstance("SHA-256"); md.update(message.getBytes(StandardCharsets.UTF_8)); return md.digest(); diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java index 65d998d..06cc1ac 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/Utils.java @@ -1,13 +1,12 @@ package com.wikiglobal.wikibroker.openapi.common; import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestReader; +import lombok.experimental.UtilityClass; import org.jspecify.annotations.NonNull; +@UtilityClass public class Utils { - private Utils() { - } - - public static boolean isRequestUsePostMethod(@NonNull RequestReader req) { - return req.getMethod().equalsIgnoreCase("POST"); + public boolean isRequestUsePostMethod(@NonNull RequestReader req) { + return req.method().equalsIgnoreCase("POST"); } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/enums/CustomHeaders.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/enums/CustomHeaders.java index 0a70d80..27c7e1a 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/enums/CustomHeaders.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/enums/CustomHeaders.java @@ -1,18 +1,17 @@ package com.wikiglobal.wikibroker.openapi.common.enums; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.experimental.Accessors; + +@AllArgsConstructor public enum CustomHeaders { ApiKey("X-Api-Key"), TimeStamp("X-Timestamp"), Nonce("X-Nonce"), Signature("X-Signature"); + @Getter + @Accessors(fluent = true) private final String value; - - CustomHeaders(String value) { - this.value = value; - } - - public String value() { - return this.value; - } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java index 38e5145..3cf5b86 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestBuilder.java @@ -7,15 +7,15 @@ import java.util.function.Function; public interface RequestBuilder { - RequestBuilder setHeader(String name, String value); + RequestBuilder header(String name, String value); - RequestBuilder setMethod(String method); + RequestBuilder method(String method); - RequestBuilder setUrl(String url); + RequestBuilder url(String url); - RequestBuilder setBody(String body); + RequestBuilder body(String body); - RequestBuilder setBody(U body, Function serialize); + RequestBuilder body(U body, Function serialize); T build() throws MalformedURLException, URISyntaxException, NoSuchAlgorithmException, InvalidKeyException; } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestReader.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestReader.java index ea8e270..2c9bcf6 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestReader.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/RequestReader.java @@ -1,11 +1,11 @@ package com.wikiglobal.wikibroker.openapi.common.interfaces; public interface RequestReader { - String getHeader(String name); + String header(String name); - String getMethod(); + String method(); - String getUrl(); + String url(); - String getBody(); + String body(); } diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index 4f95a04..7d1f3a7 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -44,18 +44,18 @@ public OpenApiTest() { @Test void testNative() { - final var builder = new HttpRequestBuilder( - apiKey, - apiSecret, - WikiBrokerOpenApi::addXHeaders, - WikiBrokerOpenApi::sign, - () -> timestamp, - () -> nonce - ); + final var builder = HttpRequestBuilder.builder() + .apiKey(apiKey) + .apiSecret(apiSecret) + .loadHeaders(WikiBrokerOpenApi::addXHeaders) + .sign(WikiBrokerOpenApi::sign) + .timestampGenerator(() -> timestamp) + .idGenerator(() -> nonce) + .build(); try { - final var req = builder.setUrl(url()) - .setMethod(method) - .setBody(body, JSON::toJSONString) + final var req = builder.url(url()) + .method(method) + .body(body, JSON::toJSONString) .build(); final var actualSignature = req.headers() .firstValue(CustomHeaders.Signature.value()) @@ -71,18 +71,19 @@ void testNative() { @Test void testApache() { - final var builder = new ApacheHttpRequestBuilder( - apiKey, - apiSecret, - WikiBrokerOpenApi::addXHeaders, - WikiBrokerOpenApi::sign, - () -> timestamp, - () -> nonce - ); + + final var builder = ApacheHttpRequestBuilder.builder() + .apiKey(apiKey) + .apiSecret(apiSecret) + .loadHeaders(WikiBrokerOpenApi::addXHeaders) + .sign(WikiBrokerOpenApi::sign) + .timestampGenerator(() -> timestamp) + .idGenerator(() -> nonce) + .build(); try { - final var req = builder.setUrl(url()) - .setMethod(method) - .setBody(body, JSON::toJSONString) + final var req = builder.url(url()) + .method(method) + .body(body, JSON::toJSONString) .build(); final var actualSignature = req.getHeader(CustomHeaders.Signature.value()).getValue(); assertEquals(expectedSignature, actualSignature); @@ -97,18 +98,18 @@ void testApache() { @Test void testOkHttp() { - final var builder = new OkHttpRequestBuilder( - apiKey, - apiSecret, - WikiBrokerOpenApi::addXHeaders, - WikiBrokerOpenApi::sign, - () -> timestamp, - () -> nonce - ); + final var builder = OkHttpRequestBuilder.builder() + .apiKey(apiKey) + .apiSecret(apiSecret) + .loadHeaders(WikiBrokerOpenApi::addXHeaders) + .sign(WikiBrokerOpenApi::sign) + .timestampGenerator(() -> timestamp) + .idGenerator(() -> nonce) + .build(); try { - final var req = builder.setUrl(url()) - .setMethod(method) - .setBody(body, JSON::toJSONString) + final var req = builder.url(url()) + .method(method) + .body(body, JSON::toJSONString) .build(); final var actualSignature = req.header(CustomHeaders.Signature.value()); assertEquals(expectedSignature, actualSignature); From f2b2c8f7c69adef5cfa69425140108b6e1572604 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 25 Feb 2026 16:01:26 +0800 Subject: [PATCH 024/124] =?UTF-8?q?test:=20=E5=AE=8C=E5=96=84java-sdk?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wikibroker/openapi/OpenApiTest.java | 117 ++++++++++-------- 1 file changed, 67 insertions(+), 50 deletions(-) diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index 7d1f3a7..ac9a45f 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -7,16 +7,12 @@ import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; -import okhttp3.*; -import org.apache.hc.core5.http.ProtocolException; +import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; +import lombok.SneakyThrows; import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.Test; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; import java.time.Instant; import java.util.Map; import java.util.UUID; @@ -32,7 +28,6 @@ public class OpenApiTest { private static final Map body = Map.of("key", "value"); private static final String method = "POST"; - private static final UUID apiKey = UUID.fromString("ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"); private static final String apiSecret = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; private static final UUID nonce = UUID.fromString("4428a206-1afd-4b15-a98d-43e91f49a08d"); @@ -42,7 +37,18 @@ public class OpenApiTest { public OpenApiTest() { } + @SneakyThrows + private T buildRequestWithJSON(RequestBuilder builder) { + return builder.url(url()).method(method).body(body, JSON::toJSONString).build(); + } + + @SneakyThrows + private T buildRequestWithString(RequestBuilder builder) { + return builder.url(url()).method(method).body(JSON.toJSONString(body)).build(); + } + @Test + @SneakyThrows void testNative() { final var builder = HttpRequestBuilder.builder() .apiKey(apiKey) @@ -52,26 +58,16 @@ void testNative() { .timestampGenerator(() -> timestamp) .idGenerator(() -> nonce) .build(); - try { - final var req = builder.url(url()) - .method(method) - .body(body, JSON::toJSONString) - .build(); - final var actualSignature = req.headers() - .firstValue(CustomHeaders.Signature.value()) - .orElse(""); - assertEquals(expectedSignature, actualSignature); - } catch (MalformedURLException | - URISyntaxException | - NoSuchAlgorithmException | - InvalidKeyException e) { - throw new RuntimeException(e); - } + final var req = this.buildRequestWithJSON(builder); + final var actualSignature = req.headers() + .firstValue(CustomHeaders.Signature.value()) + .orElse(""); + assertEquals(expectedSignature, actualSignature); } @Test + @SneakyThrows void testApache() { - final var builder = ApacheHttpRequestBuilder.builder() .apiKey(apiKey) .apiSecret(apiSecret) @@ -80,23 +76,13 @@ void testApache() { .timestampGenerator(() -> timestamp) .idGenerator(() -> nonce) .build(); - try { - final var req = builder.url(url()) - .method(method) - .body(body, JSON::toJSONString) - .build(); - final var actualSignature = req.getHeader(CustomHeaders.Signature.value()).getValue(); - assertEquals(expectedSignature, actualSignature); - } catch (MalformedURLException | - URISyntaxException | - NoSuchAlgorithmException | - InvalidKeyException | - ProtocolException e) { - throw new RuntimeException(e); - } + final var req = this.buildRequestWithJSON(builder); + final var actualSignature = req.getHeader(CustomHeaders.Signature.value()).getValue(); + assertEquals(expectedSignature, actualSignature); } @Test + @SneakyThrows void testOkHttp() { final var builder = OkHttpRequestBuilder.builder() .apiKey(apiKey) @@ -106,18 +92,49 @@ void testOkHttp() { .timestampGenerator(() -> timestamp) .idGenerator(() -> nonce) .build(); - try { - final var req = builder.url(url()) - .method(method) - .body(body, JSON::toJSONString) - .build(); - final var actualSignature = req.header(CustomHeaders.Signature.value()); - assertEquals(expectedSignature, actualSignature); - } catch (MalformedURLException | - URISyntaxException | - NoSuchAlgorithmException | - InvalidKeyException e) { - throw new RuntimeException(e); - } + final var req = this.buildRequestWithJSON(builder); + final var actualSignature = req.header(CustomHeaders.Signature.value()); + assertEquals(expectedSignature, actualSignature); + } + + @Test + @SneakyThrows + void testNativeFactory() { + final var factory = new WikiBrokerOpenApiNativeRequestBuilderFactory( + apiKey.toString(), + apiSecret + ); + final var builder = factory.create(); + final var req = this.buildRequestWithString(builder); + final var actualSignature = req.headers() + .firstValue(CustomHeaders.Signature.value()) + .orElse(""); + System.out.println(actualSignature); + } + + @Test + @SneakyThrows + void testApacheFactory() { + final var factory = new WikiBrokerOpenApiApacheRequestBuilderFactory( + apiKey.toString(), + apiSecret + ); + final var builder = factory.create(); + final var req = this.buildRequestWithString(builder); + final var actualSignature = req.getHeader(CustomHeaders.Signature.value()).getValue(); + System.out.println(actualSignature); + } + + @Test + @SneakyThrows + void testOkHttpFactory() { + final var factory = new WikiBrokerOpenApiOkhttpRequestBuilderFactory( + apiKey.toString(), + apiSecret + ); + final var builder = factory.create(); + final var req = this.buildRequestWithString(builder); + final var actualSignature = req.header(CustomHeaders.Signature.value()); + System.out.println(actualSignature); } } From 6d502cb57eca118b1a17d664958aabfeeb098745 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 25 Feb 2026 16:01:41 +0800 Subject: [PATCH 025/124] =?UTF-8?q?doc:=20=E4=BF=AE=E8=AE=A2java-sdk?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6318299..237ecdb 100644 --- a/README.md +++ b/README.md @@ -324,9 +324,9 @@ final var factory = new WikiBrokerOpenApiNativeRequestBuilderFactory(API_KEY, AP try (var client = HttpClient.newHttpClient()) { var builder = factory.create(); - var req = builder.setMethod("POST") - .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") - .setBody("{\"key\":\"value\"") + var req = builder.method("POST") + .url("https://api.example.com/test?q1=c&q2=b&q1=a") + .body("{\"key\":\"value\"") .build(); client.send(req, HttpResponse.BodyHandlers.ofString()); } catch (Exception e) { @@ -347,9 +347,9 @@ final var factory = new WikiBrokerOpenApiOkhttpRequestBuilderFactory(API_KEY, AP var client = new OkHttpClient(); try { var builder = factory.create(); - var req = builder.setMethod("POST") - .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") - .setBody("{\"key\":\"value\"") + var req = builder.method("POST") + .url("https://api.example.com/test?q1=c&q2=b&q1=a") + .body("{\"key\":\"value\"") .build(); try (var resp = client.newCall(req).execute()) { // Handle Response @@ -371,9 +371,9 @@ final var factory = new WikiBrokerOpenApiApacheRequestBuilderFactory(API_KEY, AP try (var client = HttpClients.createDefault()) { var builder = factory.create(); - var req = builder.setMethod("POST") - .setUrl("https://api.example.com/test?q1=c&q2=b&q1=a") - .setBody("{\"key\":\"value\"") + var req = builder.method("POST") + .url("https://api.example.com/test?q1=c&q2=b&q1=a") + .body("{\"key\":\"value\"") .build(); client.execute( req, resp -> { From a759c12bd48410956d5e856fd5feab2508cf1ea9 Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 26 Feb 2026 10:42:52 +0800 Subject: [PATCH 026/124] =?UTF-8?q?test:=20=E4=BC=98=E5=8C=96java-sdk?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index ac9a45f..644a5ff 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -38,12 +38,12 @@ public OpenApiTest() { } @SneakyThrows - private T buildRequestWithJSON(RequestBuilder builder) { + private T buildRequestWithJSON(@NonNull RequestBuilder builder) { return builder.url(url()).method(method).body(body, JSON::toJSONString).build(); } @SneakyThrows - private T buildRequestWithString(RequestBuilder builder) { + private T buildRequestWithString(@NonNull RequestBuilder builder) { return builder.url(url()).method(method).body(JSON.toJSONString(body)).build(); } From 6ee3353e27a8bfd7510e0f55ac7a2e29883b3175 Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 3 Mar 2026 12:11:07 +0800 Subject: [PATCH 027/124] =?UTF-8?q?refactor:=20=E9=80=9A=E8=BF=87=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=8F=8D=E5=B0=84=E5=8A=A8=E6=80=81=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E7=B1=BB=E4=BC=98=E5=8C=96java-sdk=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openapi/AbstractBuilderFactory.java | 24 ------ .../wikibroker/openapi/WikiBrokerOpenApi.java | 76 ++++++++++++++++++- ...kerOpenApiApacheRequestBuilderFactory.java | 24 ------ ...kerOpenApiNativeRequestBuilderFactory.java | 25 ------ ...kerOpenApiOkhttpRequestBuilderFactory.java | 23 ------ .../openapi/common/interfaces/Factory.java | 4 + .../wikibroker/openapi/OpenApiTest.java | 20 +++-- 7 files changed, 92 insertions(+), 104 deletions(-) delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java delete mode 100644 java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java deleted file mode 100644 index d5a3de7..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/AbstractBuilderFactory.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wikiglobal.wikibroker.openapi; - -import com.wikiglobal.wikibroker.openapi.common.interfaces.*; - -import java.time.Instant; -import java.util.UUID; -import java.util.function.Supplier; - -public abstract class AbstractBuilderFactory implements Factory> { - protected final UUID apiKey; - protected final String apiSecret; - protected final LoadHeaders loadHeaders = WikiBrokerOpenApi::addXHeaders; - protected final Sign sign = WikiBrokerOpenApi::sign; - protected final Supplier timestampGenerator = Instant::now; - protected final Supplier idGenerator = UUID::randomUUID; - - public AbstractBuilderFactory(String apiKey, String apiSecret) { - this.apiKey = UUID.fromString(apiKey); - this.apiSecret = apiSecret; - } - - @Override - public abstract RequestBuilder create(); -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java index 22b8967..30704d9 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -1,8 +1,8 @@ package com.wikiglobal.wikibroker.openapi; import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; -import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; -import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestOperator; +import com.wikiglobal.wikibroker.openapi.common.interfaces.*; +import lombok.SneakyThrows; import lombok.experimental.UtilityClass; import org.jspecify.annotations.NonNull; @@ -12,6 +12,7 @@ import java.security.NoSuchAlgorithmException; import java.time.Instant; import java.util.UUID; +import java.util.function.Supplier; @UtilityClass public class WikiBrokerOpenApi { @@ -34,4 +35,75 @@ public void sign( final var signature = Core.generateSignature(key, canonicalString); req.header(CustomHeaders.Signature.value(), signature); } + + public class RequestBuilderFactory implements Factory> { + private final UUID apiKey; + private final String apiSecret; + + public RequestBuilderFactory(String apiKey, String apiSecret, Factory.Type type) { + this.apiKey = UUID.fromString(apiKey); + this.apiSecret = apiSecret; + this.init(type); + } + + private Supplier> create; + + @SneakyThrows + private void init(Factory.@NonNull Type t) { + final var builderClass = switch (t) { + case Type.Native -> + Class.forName("com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder"); + case Type.OkHttp -> + Class.forName("com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder"); + case Type.Apache -> Class.forName( + "com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder"); + }; + final var builderBuilder = builderClass.getDeclaredMethod("builder").invoke(null); + final var builderBuilderClass = builderBuilder.getClass(); + final var apiKeyMethod = builderBuilderClass.getMethod("apiKey", UUID.class); + final var apiSecretMethod = builderBuilderClass.getMethod("apiSecret", String.class); + final var loadHeadersMethod = builderBuilderClass.getMethod( + "loadHeaders", + LoadHeaders.class + ); + final var signMethod = builderBuilderClass.getMethod("sign", Sign.class); + final var timestampGeneratorMethod = builderBuilderClass.getMethod( + "timestampGenerator", + Supplier.class + ); + final var idGeneratorMethod = builderBuilderClass.getMethod( + "idGenerator", + Supplier.class + ); + final var buildBuilderMethod = builderBuilderClass.getDeclaredMethod("build"); + buildBuilderMethod.setAccessible(true); + this.create = () -> { + try { + apiKeyMethod.invoke(builderBuilder, this.apiKey); + apiSecretMethod.invoke(builderBuilder, this.apiSecret); + loadHeadersMethod.invoke( + builderBuilder, + (LoadHeaders) WikiBrokerOpenApi::addXHeaders + ); + signMethod.invoke(builderBuilder, (Sign) WikiBrokerOpenApi::sign); + timestampGeneratorMethod.invoke( + builderBuilder, + (Supplier) Instant::now + ); + idGeneratorMethod.invoke(builderBuilder, (Supplier) UUID::randomUUID); + @SuppressWarnings("unchecked") final var builder = ( + (RequestBuilder) buildBuilderMethod.invoke(builderBuilder) + ); + return builder; + } catch (Exception e) { + throw new RuntimeException(e); + } + }; + } + + @Override + public RequestBuilder create() { + return this.create.get(); + } + } } diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java deleted file mode 100644 index 956eb81..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiApacheRequestBuilderFactory.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wikiglobal.wikibroker.openapi; - -import com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder; -import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; -import org.apache.hc.core5.http.ClassicHttpRequest; -import org.jspecify.annotations.NonNull; - -public final class WikiBrokerOpenApiApacheRequestBuilderFactory extends AbstractBuilderFactory { - public WikiBrokerOpenApiApacheRequestBuilderFactory(String apiKey, String apiSecret) { - super(apiKey, apiSecret); - } - - @Override - public @NonNull RequestBuilder create() { - return ApacheHttpRequestBuilder.builder() - .apiKey(this.apiKey) - .apiSecret(this.apiSecret) - .loadHeaders(this.loadHeaders) - .sign(this.sign) - .timestampGenerator(this.timestampGenerator) - .idGenerator(this.idGenerator) - .build(); - } -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java deleted file mode 100644 index 1322d76..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiNativeRequestBuilderFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.wikiglobal.wikibroker.openapi; - -import com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder; -import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; -import org.jspecify.annotations.NonNull; - -import java.net.http.HttpRequest; - -public final class WikiBrokerOpenApiNativeRequestBuilderFactory extends AbstractBuilderFactory { - public WikiBrokerOpenApiNativeRequestBuilderFactory(String apiKey, String apiSecret) { - super(apiKey, apiSecret); - } - - @Override - public @NonNull RequestBuilder create() { - return HttpRequestBuilder.builder() - .apiKey(this.apiKey) - .apiSecret(this.apiSecret) - .loadHeaders(this.loadHeaders) - .sign(this.sign) - .timestampGenerator(this.timestampGenerator) - .idGenerator(this.idGenerator) - .build(); - } -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java deleted file mode 100644 index 4a2940d..0000000 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApiOkhttpRequestBuilderFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.wikiglobal.wikibroker.openapi; - -import com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder; -import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; -import okhttp3.Request; - -public class WikiBrokerOpenApiOkhttpRequestBuilderFactory extends AbstractBuilderFactory { - public WikiBrokerOpenApiOkhttpRequestBuilderFactory(String apiKey, String apiSecret) { - super(apiKey, apiSecret); - } - - @Override - public RequestBuilder create() { - return OkHttpRequestBuilder.builder() - .apiKey(this.apiKey) - .apiSecret(this.apiSecret) - .loadHeaders(this.loadHeaders) - .sign(this.sign) - .timestampGenerator(this.timestampGenerator) - .idGenerator(this.idGenerator) - .build(); - } -} diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java index c645881..2a8d4e5 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java @@ -1,5 +1,9 @@ package com.wikiglobal.wikibroker.openapi.common.interfaces; public interface Factory { + enum Type { + Native(), OkHttp(), Apache(); + } + T create(); } diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index 644a5ff..3d22275 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -9,14 +9,19 @@ import com.wikiglobal.wikibroker.openapi.common.enums.CustomHeaders; import com.wikiglobal.wikibroker.openapi.common.interfaces.RequestBuilder; import lombok.SneakyThrows; +import okhttp3.Request; +import org.apache.hc.core5.http.ClassicHttpRequest; import org.jetbrains.annotations.Contract; import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.Test; +import java.net.http.HttpRequest; import java.time.Instant; import java.util.Map; import java.util.UUID; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApi.RequestBuilderFactory; + public class OpenApiTest { private static final String baseURL = "https://api.example.com"; private static final String path = "test?q1=c&q2=b&q1=a"; @@ -100,9 +105,10 @@ void testOkHttp() { @Test @SneakyThrows void testNativeFactory() { - final var factory = new WikiBrokerOpenApiNativeRequestBuilderFactory( + final var factory = new RequestBuilderFactory( apiKey.toString(), - apiSecret + apiSecret, + RequestBuilderFactory.Type.Native ); final var builder = factory.create(); final var req = this.buildRequestWithString(builder); @@ -115,9 +121,10 @@ void testNativeFactory() { @Test @SneakyThrows void testApacheFactory() { - final var factory = new WikiBrokerOpenApiApacheRequestBuilderFactory( + final var factory = new RequestBuilderFactory( apiKey.toString(), - apiSecret + apiSecret, + RequestBuilderFactory.Type.Apache ); final var builder = factory.create(); final var req = this.buildRequestWithString(builder); @@ -128,9 +135,10 @@ void testApacheFactory() { @Test @SneakyThrows void testOkHttpFactory() { - final var factory = new WikiBrokerOpenApiOkhttpRequestBuilderFactory( + final var factory = new RequestBuilderFactory( apiKey.toString(), - apiSecret + apiSecret, + RequestBuilderFactory.Type.OkHttp ); final var builder = factory.create(); final var req = this.buildRequestWithString(builder); From 392dc8ce6ef24d1dddf4489fcdf7c130106e3d5a Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 3 Mar 2026 13:42:31 +0800 Subject: [PATCH 028/124] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0README?= =?UTF-8?q?=E4=B8=ADjava-sdk=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 237ecdb..67eba94 100644 --- a/README.md +++ b/README.md @@ -315,12 +315,17 @@ send_request() ```java import java.net.http.HttpClient; +import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiNativeRequestBuilderFactory; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApi.RequestBuilderFactory; // ... final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; -final var factory = new WikiBrokerOpenApiNativeRequestBuilderFactory(API_KEY, API_SECRET); +final var factory = new RequestBuilderFactory( + API_KEY, + API_SECRET, + RequestBuilderFactory.Type.Native +); try (var client = HttpClient.newHttpClient()) { var builder = factory.create(); @@ -338,11 +343,16 @@ try (var client = HttpClient.newHttpClient()) { ```java import okhttp3.OkHttpClient; -import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiOkhttpRequestBuilderFactory; +import okhttp3.Request; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApi.RequestBuilderFactory; // ... final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; -final var factory = new WikiBrokerOpenApiOkhttpRequestBuilderFactory(API_KEY, API_SECRET); +final var factory = new RequestBuilderFactory( + API_KEY, + API_SECRET, + RequestBuilderFactory.Type.OkHttp +); var client = new OkHttpClient(); try { @@ -363,11 +373,16 @@ try { ```java import org.apache.hc.client5.http.impl.classic.HttpClients; -import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApiApacheRequestBuilderFactory; +import org.apache.hc.core5.http.ClassicHttpRequest; +import com.wikiglobal.wikibroker.openapi.WikiBrokerOpenApi.RequestBuilderFactory; // ... final String API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; final String API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; -final var factory = new WikiBrokerOpenApiApacheRequestBuilderFactory(API_KEY, API_SECRET); +final var factory = new RequestBuilderFactory( + API_KEY, + API_SECRET, + RequestBuilderFactory.Type.Apache +); try (var client = HttpClients.createDefault()) { var builder = factory.create(); From a7e16dffc154d3c4df2d4b7ce81bc2a1d2d23b17 Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 3 Mar 2026 14:16:39 +0800 Subject: [PATCH 029/124] =?UTF-8?q?refactor:=20=E9=80=9A=E8=BF=87=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E8=B5=8B=E5=80=BC=E8=A1=A8=E9=A9=B1=E5=8A=A8=E6=B3=95?= =?UTF-8?q?=E4=BC=98=E5=8C=96java-sdk=E4=B8=AD=E5=8A=A8=E6=80=81=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=B1=BB=E7=9A=84=E5=B7=A5=E5=8E=82=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wikibroker/openapi/WikiBrokerOpenApi.java | 9 +-------- .../openapi/common/interfaces/Factory.java | 14 +++++++++++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java index 30704d9..bbfaa66 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -50,14 +50,7 @@ public RequestBuilderFactory(String apiKey, String apiSecret, Factory.Type type) @SneakyThrows private void init(Factory.@NonNull Type t) { - final var builderClass = switch (t) { - case Type.Native -> - Class.forName("com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder"); - case Type.OkHttp -> - Class.forName("com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder"); - case Type.Apache -> Class.forName( - "com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder"); - }; + final var builderClass = Class.forName(t.value()); final var builderBuilder = builderClass.getDeclaredMethod("builder").invoke(null); final var builderBuilderClass = builderBuilder.getClass(); final var apiKeyMethod = builderBuilderClass.getMethod("apiKey", UUID.class); diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java index 2a8d4e5..367bcc8 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java @@ -1,8 +1,20 @@ package com.wikiglobal.wikibroker.openapi.common.interfaces; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.experimental.Accessors; + + public interface Factory { + @AllArgsConstructor enum Type { - Native(), OkHttp(), Apache(); + Native("com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder"), + OkHttp("com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder"), + Apache("com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder"); + + @Getter + @Accessors(fluent = true) + private final String value; } T create(); From d52b0505d145d3a62cba24879509366c57327619 Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 3 Mar 2026 18:42:06 +0800 Subject: [PATCH 030/124] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0php-sdk?= =?UTF-8?q?=E4=B8=AD=E6=A0=B8=E5=BF=83=E7=AE=97=E6=B3=95=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95=E6=A1=86=E6=9E=B6=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/composer.json | 8 +- php-sdk/composer.lock | 1962 +++++++++++++++++++++++++++- php-sdk/src/Api.php | 34 + php-sdk/src/Core.php | 66 + php-sdk/src/Enum/CustomHeaders.php | 13 + php-sdk/tests/ApiTest.php | 12 + 6 files changed, 2091 insertions(+), 4 deletions(-) create mode 100644 php-sdk/src/Api.php create mode 100644 php-sdk/src/Core.php create mode 100644 php-sdk/src/Enum/CustomHeaders.php create mode 100644 php-sdk/tests/ApiTest.php diff --git a/php-sdk/composer.json b/php-sdk/composer.json index 45da282..aff0bf8 100644 --- a/php-sdk/composer.json +++ b/php-sdk/composer.json @@ -14,5 +14,11 @@ "email": "auston@wikiglobal.com" } ], - "require": {} + "require": { + "psr/http-message": "^2.0", + "ramsey/uuid": "^4.9" + }, + "require-dev": { + "phpunit/phpunit": "^12" + } } diff --git a/php-sdk/composer.lock b/php-sdk/composer.lock index 20b621d..a67ea49 100644 --- a/php-sdk/composer.lock +++ b/php-sdk/composer.lock @@ -4,9 +4,1965 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fc1763a73248da1ede092753adc493c1", - "packages": [], - "packages-dev": [], + "content-hash": "74b6cc24464822b1f17bfda8a96d0019", + "packages": [ + { + "name": "brick/math", + "version": "0.14.8", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629", + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpstan/phpstan": "2.1.22", + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.14.8" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2026-02-10T14:33:43+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "8429c78ca35a09f27565311b98101e2826affde0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.2" + }, + "time": "2025-12-14T04:43:48+00:00" + } + ], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "12.5.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2026-02-06T06:01:44+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-02-02T14:04:18+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:58+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:16+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:38+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "12.5.14", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47283cfd98d553edcb1353591f4e255dc1bb61f0", + "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.3", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.4", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.3", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.14" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2026-02-18T12:38:40+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" + } + ], + "time": "2025-09-14T09:36:45+00:00" + }, + { + "name": "sebastian/comparator", + "version": "7.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6", + "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.2" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-01-24T09:28:48+00:00" + }, + { + "name": "sebastian/complexity", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:46+00:00" + }, + { + "name": "sebastian/environment", + "version": "8.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-08-12T14:11:56+00:00" + }, + { + "name": "sebastian/exporter", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:16:11+00:00" + }, + { + "name": "sebastian/global-state", + "version": "8.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" + } + ], + "time": "2025-08-29T11:29:25+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:28+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:48+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:17+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:44:59+00:00" + }, + { + "name": "sebastian/type", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:57:12+00:00" + }, + { + "name": "sebastian/version", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^8.1" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-12-08T11:19:18+00:00" + } + ], "aliases": [], "minimum-stability": "stable", "stability-flags": [], diff --git a/php-sdk/src/Api.php b/php-sdk/src/Api.php new file mode 100644 index 0000000..ceee296 --- /dev/null +++ b/php-sdk/src/Api.php @@ -0,0 +1,34 @@ +withHeader(CustomHeaders::ApiKey->value, Uuid::fromString($apiKey)->toString()) + ->withHeader(CustomHeaders::Timestamp->value, $timestamp->format('Uv')) + ->withHeader(CustomHeaders::Nonce->value, Uuid::fromString($nonce)->toString()); + } + + public static function withSign(RequestInterface $req, string $key): RequestInterface + { + $canonicalString = Core::generateCanonicalString($req); + $signature = Core::generateSignature($key, $canonicalString); + return $req->withHeader(CustomHeaders::Signature->value, $signature); + } +} diff --git a/php-sdk/src/Core.php b/php-sdk/src/Core.php new file mode 100644 index 0000000..78c4135 --- /dev/null +++ b/php-sdk/src/Core.php @@ -0,0 +1,66 @@ +getMethod()); + $path = $req->getUri()->getPath(); + $canonicalQuery = self::buildCanonicalQuery($req); + $apiKey = $req->getHeader(CustomHeaders::ApiKey->value); + $timestamp = $req->getHeader(CustomHeaders::Timestamp->value); + $nonce = $req->getHeader(CustomHeaders::Nonce->value); + $bodyHash = self::calculateBodyHash($req); + return join("\n", [ + $method, + $path, + $canonicalQuery, + $apiKey, + $timestamp, + $nonce, + $bodyHash + ]); + } + + private static function calculateBodyHash(RequestInterface $req): string + { + $body = (string) $req->getBody(); + return hash(self::$algo, $body); + } + + private static function buildCanonicalQuery(RequestInterface $req): string + { + $queryString = $req->getUri()->getQuery(); + $query = []; + foreach (explode('&', $queryString) as $item) { + [$k, $v] = explode('=', $item); + if (!array_key_exists($k, $query)) { + $query[$k] = []; + } + array_push($query[$k], $v); + } + ksort($query); + $pairs = []; + foreach ($query as $key => $values) { + sort($values); + foreach ($values as $value) { + array_push($pairs, $key . '=' . $value); + } + } + return join('&', $pairs); + } +} diff --git a/php-sdk/src/Enum/CustomHeaders.php b/php-sdk/src/Enum/CustomHeaders.php new file mode 100644 index 0000000..4d34c37 --- /dev/null +++ b/php-sdk/src/Enum/CustomHeaders.php @@ -0,0 +1,13 @@ + Date: Wed, 4 Mar 2026 10:18:15 +0800 Subject: [PATCH 031/124] =?UTF-8?q?feat:=20=E5=B0=86java-sdk=E4=B8=AD?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=E7=B1=BB=E6=9E=84=E9=80=A0=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E7=9A=84=E5=B7=A5=E5=8E=82=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E5=8F=82=E6=95=B0=E6=94=B9=E4=B8=BAbuilder?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E7=94=A8=E6=88=B7=E5=AE=9E=E7=8E=B0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89builder=E6=8E=A5=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java | 8 ++++---- .../wikibroker/openapi/common/interfaces/Factory.java | 2 +- .../com/wikiglobal/wikibroker/openapi/OpenApiTest.java | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java index bbfaa66..1b3895f 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/WikiBrokerOpenApi.java @@ -40,17 +40,17 @@ public class RequestBuilderFactory implements Factory> { private final UUID apiKey; private final String apiSecret; - public RequestBuilderFactory(String apiKey, String apiSecret, Factory.Type type) { + public RequestBuilderFactory(String apiKey, String apiSecret, String builderClassName) { this.apiKey = UUID.fromString(apiKey); this.apiSecret = apiSecret; - this.init(type); + this.init(builderClassName); } private Supplier> create; @SneakyThrows - private void init(Factory.@NonNull Type t) { - final var builderClass = Class.forName(t.value()); + private void init(String builderClassName) { + final var builderClass = Class.forName(builderClassName); final var builderBuilder = builderClass.getDeclaredMethod("builder").invoke(null); final var builderBuilderClass = builderBuilder.getClass(); final var apiKeyMethod = builderBuilderClass.getMethod("apiKey", UUID.class); diff --git a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java index 367bcc8..f43d2d9 100644 --- a/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java +++ b/java-sdk/src/main/java/com/wikiglobal/wikibroker/openapi/common/interfaces/Factory.java @@ -7,7 +7,7 @@ public interface Factory { @AllArgsConstructor - enum Type { + enum BuiltInBuilder { Native("com.wikiglobal.wikibroker.openapi.adapters.HttpRequestBuilder"), OkHttp("com.wikiglobal.wikibroker.openapi.adapters.OkHttpRequestBuilder"), Apache("com.wikiglobal.wikibroker.openapi.adapters.ApacheHttpRequestBuilder"); diff --git a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java index 3d22275..67467e7 100644 --- a/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java +++ b/java-sdk/src/test/java/com/wikiglobal/wikibroker/openapi/OpenApiTest.java @@ -108,7 +108,7 @@ void testNativeFactory() { final var factory = new RequestBuilderFactory( apiKey.toString(), apiSecret, - RequestBuilderFactory.Type.Native + RequestBuilderFactory.BuiltInBuilder.Native.value() ); final var builder = factory.create(); final var req = this.buildRequestWithString(builder); @@ -124,7 +124,7 @@ void testApacheFactory() { final var factory = new RequestBuilderFactory( apiKey.toString(), apiSecret, - RequestBuilderFactory.Type.Apache + RequestBuilderFactory.BuiltInBuilder.Apache.value() ); final var builder = factory.create(); final var req = this.buildRequestWithString(builder); @@ -138,7 +138,7 @@ void testOkHttpFactory() { final var factory = new RequestBuilderFactory( apiKey.toString(), apiSecret, - RequestBuilderFactory.Type.OkHttp + RequestBuilderFactory.BuiltInBuilder.OkHttp.value() ); final var builder = factory.create(); final var req = this.buildRequestWithString(builder); From dec17d04019d0c018582163ba2c20c29f50465fe Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 4 Mar 2026 11:47:11 +0800 Subject: [PATCH 032/124] =?UTF-8?q?feat:=20=E4=BF=AE=E8=AE=A2php-sdk?= =?UTF-8?q?=E6=9A=B4=E9=9C=B2=E7=9A=84=E4=BD=8E=E5=B1=82=E7=BA=A7API?= =?UTF-8?q?=E4=BB=A5=E4=BD=BF=E5=85=B6=E7=AC=A6=E5=90=88PSR7=E8=A7=84?= =?UTF-8?q?=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/src/Api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php-sdk/src/Api.php b/php-sdk/src/Api.php index ceee296..3a24582 100644 --- a/php-sdk/src/Api.php +++ b/php-sdk/src/Api.php @@ -14,7 +14,7 @@ class Api private function __construct() {} public static function withXHeaders( - RequestInterface &$req, + RequestInterface $req, string $apiKey, DateTime $timestamp, string $nonce, From 2b815beeb1bbb3e079bc4e9d6ee48668219bdc43 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 4 Mar 2026 16:57:44 +0800 Subject: [PATCH 033/124] =?UTF-8?q?feat:=20php-sdk=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0guzzle=E9=80=82=E9=85=8D=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/composer.json | 5 +- php-sdk/composer.lock | 545 +++++++++++++++++++++++++++++++- php-sdk/src/Adapters/Guzzle.php | 58 ++++ 3 files changed, 605 insertions(+), 3 deletions(-) create mode 100644 php-sdk/src/Adapters/Guzzle.php diff --git a/php-sdk/composer.json b/php-sdk/composer.json index aff0bf8..e465746 100644 --- a/php-sdk/composer.json +++ b/php-sdk/composer.json @@ -19,6 +19,7 @@ "ramsey/uuid": "^4.9" }, "require-dev": { - "phpunit/phpunit": "^12" + "phpunit/phpunit": "^12", + "guzzlehttp/guzzle": "^7.0" } -} +} \ No newline at end of file diff --git a/php-sdk/composer.lock b/php-sdk/composer.lock index a67ea49..dcc0072 100644 --- a/php-sdk/composer.lock +++ b/php-sdk/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "74b6cc24464822b1f17bfda8a96d0019", + "content-hash": "0a4fc1e929885b8665a643ca659a4cfc", "packages": [ { "name": "brick/math", @@ -275,6 +275,331 @@ } ], "packages-dev": [ + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, { "name": "myclabs/deep-copy", "version": "1.13.4", @@ -963,6 +1288,157 @@ ], "time": "2026-02-18T12:38:40+00:00" }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, { "name": "sebastian/cli-parser", "version": "4.2.0", @@ -1912,6 +2388,73 @@ ], "time": "2024-10-20T05:08:20+00:00" }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, { "name": "theseer/tokenizer", "version": "2.0.1", diff --git a/php-sdk/src/Adapters/Guzzle.php b/php-sdk/src/Adapters/Guzzle.php new file mode 100644 index 0000000..0d59125 --- /dev/null +++ b/php-sdk/src/Adapters/Guzzle.php @@ -0,0 +1,58 @@ + Date: Wed, 4 Mar 2026 17:05:36 +0800 Subject: [PATCH 034/124] =?UTF-8?q?feat:=20php-sdk=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0psr18=E9=80=82=E9=85=8D=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/composer.json | 5 +- php-sdk/composer.lock | 106 +++++++++++++++++------------------ php-sdk/src/Adapters/Psr.php | 46 +++++++++++++++ 3 files changed, 102 insertions(+), 55 deletions(-) create mode 100644 php-sdk/src/Adapters/Psr.php diff --git a/php-sdk/composer.json b/php-sdk/composer.json index e465746..e4b03f0 100644 --- a/php-sdk/composer.json +++ b/php-sdk/composer.json @@ -16,10 +16,11 @@ ], "require": { "psr/http-message": "^2.0", - "ramsey/uuid": "^4.9" + "ramsey/uuid": "^4.9", + "psr/http-client": "^1.0" }, "require-dev": { "phpunit/phpunit": "^12", "guzzlehttp/guzzle": "^7.0" } -} \ No newline at end of file +} diff --git a/php-sdk/composer.lock b/php-sdk/composer.lock index dcc0072..56689cb 100644 --- a/php-sdk/composer.lock +++ b/php-sdk/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0a4fc1e929885b8665a643ca659a4cfc", + "content-hash": "07c766cefe427fcdc8632f7c30b5e28f", "packages": [ { "name": "brick/math", @@ -66,6 +66,58 @@ ], "time": "2026-02-10T14:33:43+00:00" }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, { "name": "psr/http-message", "version": "2.0", @@ -1288,58 +1340,6 @@ ], "time": "2026-02-18T12:38:40+00:00" }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, { "name": "psr/http-factory", "version": "1.1.0", diff --git a/php-sdk/src/Adapters/Psr.php b/php-sdk/src/Adapters/Psr.php new file mode 100644 index 0000000..c7bc67e --- /dev/null +++ b/php-sdk/src/Adapters/Psr.php @@ -0,0 +1,46 @@ +withHeaders)( + $request, + $this->apiKey, + ($this->timestampGenerator)(), + ($this->idGenerator)() + ); + $request = ($this->withSign)($request, $this->apiSecret); + return $this->rawClient->sendRequest($request); + } +} From f90a66302ea145a09a483b4fc07b8cf485a74f30 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 4 Mar 2026 18:48:41 +0800 Subject: [PATCH 035/124] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E5=B9=B6=E4=BF=AE=E6=AD=A3php-sdk?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E7=AE=97=E6=B3=95=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/composer.json | 7 +- php-sdk/composer.lock | 529 +++++++++++++++++++++++++++++++++++++- php-sdk/src/Core.php | 6 +- php-sdk/tests/ApiTest.php | 37 ++- 4 files changed, 573 insertions(+), 6 deletions(-) diff --git a/php-sdk/composer.json b/php-sdk/composer.json index e4b03f0..004487b 100644 --- a/php-sdk/composer.json +++ b/php-sdk/composer.json @@ -14,6 +14,9 @@ "email": "auston@wikiglobal.com" } ], + "scripts": { + "test": "phpunit tests" + }, "require": { "psr/http-message": "^2.0", "ramsey/uuid": "^4.9", @@ -21,6 +24,8 @@ }, "require-dev": { "phpunit/phpunit": "^12", - "guzzlehttp/guzzle": "^7.0" + "guzzlehttp/guzzle": "^7.0", + "symfony/http-client": "^7.4", + "nyholm/psr7": "^1.8" } } diff --git a/php-sdk/composer.lock b/php-sdk/composer.lock index 56689cb..c119275 100644 --- a/php-sdk/composer.lock +++ b/php-sdk/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "07c766cefe427fcdc8632f7c30b5e28f", + "content-hash": "1db5f7ccd916d4b8e714c6788b7cb1e5", "packages": [ { "name": "brick/math", @@ -770,6 +770,84 @@ }, "time": "2025-12-06T11:56:16+00:00" }, + { + "name": "nyholm/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2024-09-09T07:06:30+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.4", @@ -1340,6 +1418,59 @@ ], "time": "2026-02-18T12:38:40+00:00" }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, { "name": "psr/http-factory", "version": "1.1.0", @@ -1395,6 +1526,56 @@ }, "time": "2024-04-15T12:06:14+00:00" }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, { "name": "ralouphie/getallheaders", "version": "3.0.3", @@ -2455,6 +2636,352 @@ ], "time": "2024-09-25T14:21:43+00:00" }, + { + "name": "symfony/http-client", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154", + "reference": "2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-18T09:46:18+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-29T11:18:49+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, { "name": "theseer/tokenizer", "version": "2.0.1", diff --git a/php-sdk/src/Core.php b/php-sdk/src/Core.php index 78c4135..6109699 100644 --- a/php-sdk/src/Core.php +++ b/php-sdk/src/Core.php @@ -21,9 +21,9 @@ public static function generateCanonicalString(RequestInterface $req): string $method = strtoupper($req->getMethod()); $path = $req->getUri()->getPath(); $canonicalQuery = self::buildCanonicalQuery($req); - $apiKey = $req->getHeader(CustomHeaders::ApiKey->value); - $timestamp = $req->getHeader(CustomHeaders::Timestamp->value); - $nonce = $req->getHeader(CustomHeaders::Nonce->value); + $apiKey = $req->getHeader(CustomHeaders::ApiKey->value)[0]; + $timestamp = $req->getHeader(CustomHeaders::Timestamp->value)[0]; + $nonce = $req->getHeader(CustomHeaders::Nonce->value)[0]; $bodyHash = self::calculateBodyHash($req); return join("\n", [ $method, diff --git a/php-sdk/tests/ApiTest.php b/php-sdk/tests/ApiTest.php index 92125da..2524816 100644 --- a/php-sdk/tests/ApiTest.php +++ b/php-sdk/tests/ApiTest.php @@ -4,9 +4,44 @@ namespace WikibrokerOpenapiSdk\Test; +use DateTime; use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpClient\Psr18Client; +use WikibrokerOpenapiSdk\Api; +use WikibrokerOpenapiSdk\Enum\CustomHeaders; final class ApiTest extends TestCase { - public function testApi(): void {} + private static $baseURL = "https://api.example.com"; + private static $path = "test?q1=c&q2=b&q1=a"; + + private static function url(): string + { + return self::$baseURL . '/' . self::$path; + } + + private static $body = ["key" => "value"]; + private static $method = "POST"; + private static $apiKey = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; + private static $apiSecret = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; + private static $nonce = "4428a206-1afd-4b15-a98d-43e91f49a08d"; + private static $timestamp = 1798115622000; + private static $expectedSignature = "1b0c80dbbc30905719559ab5526dfd59bae04d7337c8843efd9e51ff0af6dfb4"; + + public function testApi(): void + { + $client = new Psr18Client(); + $body = $client->createStream(json_encode(self::$body)); + $request = $client->createRequest(self::$method, self::url())->withBody($body); + $timestamp = DateTime::createFromFormat('U.v', sprintf('%d.%03d', intdiv(self::$timestamp, 1000), self::$timestamp % 1000)); + $request = Api::withXHeaders( + $request, + self::$apiKey, + $timestamp, + self::$nonce + ); + $request = Api::withSign($request, self::$apiSecret); + $actualSignature = $request->getHeader(CustomHeaders::Signature->value)[0]; + $this->assertSame(self::$expectedSignature, $actualSignature); + } } From 472c4ebd6334d5af6b9583c0279fe145ed0c7191 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 4 Mar 2026 19:19:47 +0800 Subject: [PATCH 036/124] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96php-sdk?= =?UTF-8?q?=E4=B8=AD=E9=80=82=E9=85=8D=E5=99=A8=E6=A8=A1=E5=9D=97=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/src/Adapters/Guzzle.php | 58 ------------------- php-sdk/src/Adapters/GuzzleSignMiddleware.php | 43 ++++++++++++++ .../{Psr.php => PsrHttpClientWithSign.php} | 9 ++- 3 files changed, 47 insertions(+), 63 deletions(-) delete mode 100644 php-sdk/src/Adapters/Guzzle.php create mode 100644 php-sdk/src/Adapters/GuzzleSignMiddleware.php rename php-sdk/src/Adapters/{Psr.php => PsrHttpClientWithSign.php} (93%) diff --git a/php-sdk/src/Adapters/Guzzle.php b/php-sdk/src/Adapters/Guzzle.php deleted file mode 100644 index 0d59125..0000000 --- a/php-sdk/src/Adapters/Guzzle.php +++ /dev/null @@ -1,58 +0,0 @@ -withHeaders)( + $request, + $this->apiKey, + ($this->timestampGenerator)(), + ($this->idGenerator)() + ); + $request = ($this->withSign)($request, $this->apiSecret); + return $handler($request, $options); + }; + } +} diff --git a/php-sdk/src/Adapters/Psr.php b/php-sdk/src/Adapters/PsrHttpClientWithSign.php similarity index 93% rename from php-sdk/src/Adapters/Psr.php rename to php-sdk/src/Adapters/PsrHttpClientWithSign.php index c7bc67e..99f9a17 100644 --- a/php-sdk/src/Adapters/Psr.php +++ b/php-sdk/src/Adapters/PsrHttpClientWithSign.php @@ -9,8 +9,7 @@ use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; -class HttpClientWithSign implements ClientInterface -{ +class PsrHttpClientWithSign implements ClientInterface { /** * @param ClientInterface $rawClient * @param string $apiKey @@ -29,10 +28,10 @@ public function __construct( private Closure $withSign, private Closure $timestampGenerator, private Closure $idGenerator - ) {} + ) { + } - public function sendRequest(RequestInterface $request): ResponseInterface - { + public function sendRequest(RequestInterface $request): ResponseInterface { $request = ($this->withHeaders)( $request, From 72acf62b4e924aa76d76e8740faca53bf72ec6ba Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 4 Mar 2026 19:20:47 +0800 Subject: [PATCH 037/124] =?UTF-8?q?chore:=20=E9=87=8D=E6=96=B0=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96php-sdk=E9=A1=B9=E7=9B=AE=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/src/Api.php | 9 ++++----- php-sdk/src/Core.php | 18 +++++++----------- php-sdk/src/Enum/CustomHeaders.php | 3 +-- php-sdk/tests/ApiTest.php | 13 +++++-------- 4 files changed, 17 insertions(+), 26 deletions(-) diff --git a/php-sdk/src/Api.php b/php-sdk/src/Api.php index 3a24582..838cd8a 100644 --- a/php-sdk/src/Api.php +++ b/php-sdk/src/Api.php @@ -9,9 +9,9 @@ use Ramsey\Uuid\Uuid; use WikibrokerOpenapiSdk\Enum\CustomHeaders; -class Api -{ - private function __construct() {} +class Api { + private function __construct() { + } public static function withXHeaders( RequestInterface $req, @@ -25,8 +25,7 @@ public static function withXHeaders( ->withHeader(CustomHeaders::Nonce->value, Uuid::fromString($nonce)->toString()); } - public static function withSign(RequestInterface $req, string $key): RequestInterface - { + public static function withSign(RequestInterface $req, string $key): RequestInterface { $canonicalString = Core::generateCanonicalString($req); $signature = Core::generateSignature($key, $canonicalString); return $req->withHeader(CustomHeaders::Signature->value, $signature); diff --git a/php-sdk/src/Core.php b/php-sdk/src/Core.php index 6109699..d5f1629 100644 --- a/php-sdk/src/Core.php +++ b/php-sdk/src/Core.php @@ -7,17 +7,15 @@ use Psr\Http\Message\RequestInterface; use WikibrokerOpenapiSdk\Enum\CustomHeaders; -final class Core -{ - private function __construct() {} +final class Core { + private function __construct() { + } private static $algo = 'sha256'; - public static function generateSignature(string $key, string $message): string - { + public static function generateSignature(string $key, string $message): string { return hash_hmac(self::$algo, $message, $key); } - public static function generateCanonicalString(RequestInterface $req): string - { + public static function generateCanonicalString(RequestInterface $req): string { $method = strtoupper($req->getMethod()); $path = $req->getUri()->getPath(); $canonicalQuery = self::buildCanonicalQuery($req); @@ -36,14 +34,12 @@ public static function generateCanonicalString(RequestInterface $req): string ]); } - private static function calculateBodyHash(RequestInterface $req): string - { + private static function calculateBodyHash(RequestInterface $req): string { $body = (string) $req->getBody(); return hash(self::$algo, $body); } - private static function buildCanonicalQuery(RequestInterface $req): string - { + private static function buildCanonicalQuery(RequestInterface $req): string { $queryString = $req->getUri()->getQuery(); $query = []; foreach (explode('&', $queryString) as $item) { diff --git a/php-sdk/src/Enum/CustomHeaders.php b/php-sdk/src/Enum/CustomHeaders.php index 4d34c37..2108066 100644 --- a/php-sdk/src/Enum/CustomHeaders.php +++ b/php-sdk/src/Enum/CustomHeaders.php @@ -4,8 +4,7 @@ namespace WikibrokerOpenapiSdk\Enum; -enum CustomHeaders: string -{ +enum CustomHeaders: string { case ApiKey = 'X-Api-Key'; case Timestamp = 'X-Timestamp'; case Nonce = 'X-Nonce'; diff --git a/php-sdk/tests/ApiTest.php b/php-sdk/tests/ApiTest.php index 2524816..5da7ea1 100644 --- a/php-sdk/tests/ApiTest.php +++ b/php-sdk/tests/ApiTest.php @@ -10,26 +10,23 @@ use WikibrokerOpenapiSdk\Api; use WikibrokerOpenapiSdk\Enum\CustomHeaders; -final class ApiTest extends TestCase -{ +final class ApiTest extends TestCase { private static $baseURL = "https://api.example.com"; private static $path = "test?q1=c&q2=b&q1=a"; - private static function url(): string - { + private static function url(): string { return self::$baseURL . '/' . self::$path; } - private static $body = ["key" => "value"]; - private static $method = "POST"; + private static $body = ["key" => "value"]; + private static $method = "POST"; private static $apiKey = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; private static $apiSecret = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; private static $nonce = "4428a206-1afd-4b15-a98d-43e91f49a08d"; private static $timestamp = 1798115622000; private static $expectedSignature = "1b0c80dbbc30905719559ab5526dfd59bae04d7337c8843efd9e51ff0af6dfb4"; - public function testApi(): void - { + public function testApi(): void { $client = new Psr18Client(); $body = $client->createStream(json_encode(self::$body)); $request = $client->createRequest(self::$method, self::url())->withBody($body); From 9f2a17f91208e5b8b0bd2a6207240ea89616d981 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 4 Mar 2026 19:53:05 +0800 Subject: [PATCH 038/124] =?UTF-8?q?feat:=20=E5=9C=A8php-sdk=E4=B8=AD?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E4=BE=BF=E4=BA=8E=E6=8E=A5=E5=85=A5=E7=9A=84?= =?UTF-8?q?=E9=AB=98=E5=B1=82=E7=BA=A7API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/src/Api.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/php-sdk/src/Api.php b/php-sdk/src/Api.php index 838cd8a..e8ff4b0 100644 --- a/php-sdk/src/Api.php +++ b/php-sdk/src/Api.php @@ -5,8 +5,11 @@ namespace WikibrokerOpenapiSdk; use DateTime; +use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestInterface; use Ramsey\Uuid\Uuid; +use WikibrokerOpenapiSdk\Adapters\GuzzleSignMiddleware; +use WikibrokerOpenapiSdk\Adapters\PsrHttpClientWithSign; use WikibrokerOpenapiSdk\Enum\CustomHeaders; class Api { @@ -30,4 +33,27 @@ public static function withSign(RequestInterface $req, string $key): RequestInte $signature = Core::generateSignature($key, $canonicalString); return $req->withHeader(CustomHeaders::Signature->value, $signature); } + + public static function createGuzzleSignMiddleware(string $apiKey, string $apiSecret): callable { + return new GuzzleSignMiddleware( + $apiKey, + $apiSecret, + self::withXHeaders(...), + self::withSign(...), + fn() => new DateTime(), + Uuid::uuid4(...) + ); + } + + public static function createPsrHttpClientWithSign(ClientInterface $rawClient, string $apiKey, string $apiSecret): ClientInterface { + return new PsrHttpClientWithSign( + $rawClient, + $apiKey, + $apiSecret, + self::withXHeaders(...), + self::withSign(...), + fn() => new DateTime(), + Uuid::uuid4(...) + ); + } } From 00cbcc598fa4893b61b729e62fe8e8c5b3d878df Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 4 Mar 2026 20:10:18 +0800 Subject: [PATCH 039/124] =?UTF-8?q?test:=20=E5=AE=8C=E5=96=84php-sdk?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/tests/ApiTest.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/php-sdk/tests/ApiTest.php b/php-sdk/tests/ApiTest.php index 5da7ea1..1e22922 100644 --- a/php-sdk/tests/ApiTest.php +++ b/php-sdk/tests/ApiTest.php @@ -5,6 +5,7 @@ namespace WikibrokerOpenapiSdk\Test; use DateTime; +use GuzzleHttp\Psr7\Request; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\Psr18Client; use WikibrokerOpenapiSdk\Api; @@ -26,7 +27,7 @@ private static function url(): string { private static $timestamp = 1798115622000; private static $expectedSignature = "1b0c80dbbc30905719559ab5526dfd59bae04d7337c8843efd9e51ff0af6dfb4"; - public function testApi(): void { + public function testSymfony(): void { $client = new Psr18Client(); $body = $client->createStream(json_encode(self::$body)); $request = $client->createRequest(self::$method, self::url())->withBody($body); @@ -41,4 +42,19 @@ public function testApi(): void { $actualSignature = $request->getHeader(CustomHeaders::Signature->value)[0]; $this->assertSame(self::$expectedSignature, $actualSignature); } + + public function testGuzzle(): void { + $body = json_encode(self::$body); + $request = new Request(self::$method, self::url(), [], $body); + $timestamp = DateTime::createFromFormat('U.v', sprintf('%d.%03d', intdiv(self::$timestamp, 1000), self::$timestamp % 1000)); + $request = Api::withXHeaders( + $request, + self::$apiKey, + $timestamp, + self::$nonce + ); + $request = Api::withSign($request, self::$apiSecret); + $actualSignature = $request->getHeader(CustomHeaders::Signature->value)[0]; + $this->assertSame(self::$expectedSignature, $actualSignature); + } } From afcb1fd5de7867a01bb3005e4b0c1c8c2d6e79c1 Mon Sep 17 00:00:00 2001 From: auston Date: Wed, 4 Mar 2026 20:33:26 +0800 Subject: [PATCH 040/124] =?UTF-8?q?doc:=20README=E6=B7=BB=E5=8A=A0php-sdk?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 67eba94..8acc5ae 100644 --- a/README.md +++ b/README.md @@ -260,7 +260,7 @@ async def send_request(): send_request() ``` -#### `Java`/`Kotlin`接入 +#### `Java`接入 **安装** @@ -401,6 +401,65 @@ try (var client = HttpClients.createDefault()) { } ``` +#### `PHP`接入 + +**安装** + +```bash +// TODO +``` + +**示例** + +`guzzle` + +```php +use GuzzleHttp\Client; +use GuzzleHttp\Handler\CurlHandler; +use GuzzleHttp\HandlerStack; +use WikibrokerOpenapiSdk\Api; + +const API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; +const API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; +$stack = new HandlerStack(); +$stack->setHandler(new CurlHandler()); +$middleware = Api::createGuzzleSignMiddleware(API_KEY, API_SECRET); +$stack->push($middleware); +$client = new Client(['handler' => $stack]); + +$client->post( + "https://api.example.com/test?q1=c&q2=b&q1=a", + [ + 'query' => [ + "q1" => ["c", "a"], + "q2" => ["b"] + ], + 'json' => [ + "key" => "value" + ] + ] +); +``` + +`symfony/http-client` + +```php +use Symfony\Component\HttpClient\Psr18Client; +use WikibrokerOpenapiSdk\Api; + +const API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; +const API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; +$rawClient = new Psr18Client(); +$client = Api::createPsrHttpClientWithSign($rawClient, API_KEY, API_SECRET); + +$body = $rawClient->createStream(json_encode(["key" => "value"])); +$request = $rawClient->createRequest( + "POST", + "https://api.example.com/test?q1=c&q2=b&q1=a" +)->withBody($body); +$client->sendRequest($request); +``` + ### 通过API接入 如果你使用的编程语言没有可用的SDK,可以按照以下方式自行编写接入代码。 From 73c4c52d9dbaee09588f81a375d93f2236eb7ec4 Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 5 Mar 2026 10:44:02 +0800 Subject: [PATCH 041/124] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dphp-sdk?= =?UTF-8?q?=E4=B8=AD=E6=BD=9C=E5=9C=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/src/Adapters/GuzzleSignMiddleware.php | 2 +- php-sdk/src/Core.php | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/php-sdk/src/Adapters/GuzzleSignMiddleware.php b/php-sdk/src/Adapters/GuzzleSignMiddleware.php index 04642cc..231b2c6 100644 --- a/php-sdk/src/Adapters/GuzzleSignMiddleware.php +++ b/php-sdk/src/Adapters/GuzzleSignMiddleware.php @@ -28,7 +28,7 @@ public function __construct( ) { } - public function __invoke(callable $handler) { + public function __invoke(callable $handler): Closure { return function (RequestInterface $request, array $options) use ($handler) { $request = ($this->withHeaders)( $request, diff --git a/php-sdk/src/Core.php b/php-sdk/src/Core.php index d5f1629..cd1f706 100644 --- a/php-sdk/src/Core.php +++ b/php-sdk/src/Core.php @@ -41,20 +41,25 @@ private static function calculateBodyHash(RequestInterface $req): string { private static function buildCanonicalQuery(RequestInterface $req): string { $queryString = $req->getUri()->getQuery(); + if (empty($queryString)) { + return ''; + } $query = []; foreach (explode('&', $queryString) as $item) { + if (empty($item)) { + continue; + } [$k, $v] = explode('=', $item); - if (!array_key_exists($k, $query)) { - $query[$k] = []; + if (!empty($v)) { + $query[$k][] = $v; } - array_push($query[$k], $v); } ksort($query); $pairs = []; foreach ($query as $key => $values) { sort($values); foreach ($values as $value) { - array_push($pairs, $key . '=' . $value); + $pairs[] = "{$key}={$value}"; } } return join('&', $pairs); From 2d45d1c24239d7c152aa69559e50d71bb8a509a3 Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 5 Mar 2026 11:20:07 +0800 Subject: [PATCH 042/124] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BC=98?= =?UTF-8?q?=E5=8C=96php-sdk=E4=B8=AD=E9=80=82=E9=85=8D=E5=99=A8=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/src/Adapters/Adapter.php | 39 +++++++++++++++++++ php-sdk/src/Adapters/GuzzleSignMiddleware.php | 36 ++--------------- .../src/Adapters/PsrHttpClientWithSign.php | 38 ++++-------------- php-sdk/src/Api.php | 3 +- 4 files changed, 51 insertions(+), 65 deletions(-) create mode 100644 php-sdk/src/Adapters/Adapter.php diff --git a/php-sdk/src/Adapters/Adapter.php b/php-sdk/src/Adapters/Adapter.php new file mode 100644 index 0000000..1a74447 --- /dev/null +++ b/php-sdk/src/Adapters/Adapter.php @@ -0,0 +1,39 @@ +withHeaders)( + $request, + $this->apiKey, + ($this->timestampGenerator)(), + ($this->idGenerator)() + ); + return ($this->withSign)($request, $this->apiSecret); + } +} \ No newline at end of file diff --git a/php-sdk/src/Adapters/GuzzleSignMiddleware.php b/php-sdk/src/Adapters/GuzzleSignMiddleware.php index 231b2c6..980b9ae 100644 --- a/php-sdk/src/Adapters/GuzzleSignMiddleware.php +++ b/php-sdk/src/Adapters/GuzzleSignMiddleware.php @@ -5,39 +5,11 @@ namespace WikibrokerOpenapiSdk\Adapters; use Closure; -use DateTimeInterface; use Psr\Http\Message\RequestInterface; -class GuzzleSignMiddleware { - /** - * @param string $apiKey - * @param string $apiSecret - * @param callable(RequestInterface $req, string $apiKey, DateTimeInterface $timestamp, string $nonce):RequestInterface $withHeaders - * @param callable(RequestInterface $req, string $key):RequestInterface $withSign - * @param callable():DateTimeInterface $timestampGenerator - * @param callable():string $idGenerator - * @return callable(callable $handler):Closure - */ - public function __construct( - private string $apiKey, - private string $apiSecret, - private Closure $withHeaders, - private Closure $withSign, - private Closure $timestampGenerator, - private Closure $idGenerator - ) { - } - +final class GuzzleSignMiddleware extends Adapter { public function __invoke(callable $handler): Closure { - return function (RequestInterface $request, array $options) use ($handler) { - $request = ($this->withHeaders)( - $request, - $this->apiKey, - ($this->timestampGenerator)(), - ($this->idGenerator)() - ); - $request = ($this->withSign)($request, $this->apiSecret); - return $handler($request, $options); - }; + return fn(RequestInterface $request, array $options) => + $handler($this->signRequest($request), $options); } -} +} \ No newline at end of file diff --git a/php-sdk/src/Adapters/PsrHttpClientWithSign.php b/php-sdk/src/Adapters/PsrHttpClientWithSign.php index 99f9a17..f27ba50 100644 --- a/php-sdk/src/Adapters/PsrHttpClientWithSign.php +++ b/php-sdk/src/Adapters/PsrHttpClientWithSign.php @@ -4,42 +4,18 @@ namespace WikibrokerOpenapiSdk\Adapters; -use Closure; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; -class PsrHttpClientWithSign implements ClientInterface { - /** - * @param ClientInterface $rawClient - * @param string $apiKey - * @param string $apiSecret - * @param callable(RequestInterface $req, string $apiKey, DateTimeInterface $timestamp, string $nonce):RequestInterface $withHeaders - * @param callable(RequestInterface $req, string $key):RequestInterface $withSign - * @param callable():DateTimeInterface $timestampGenerator - * @param callable():string $idGenerator - * @return ClientInterface - */ - public function __construct( - private ClientInterface $rawClient, - private string $apiKey, - private string $apiSecret, - private Closure $withHeaders, - private Closure $withSign, - private Closure $timestampGenerator, - private Closure $idGenerator - ) { +final class PsrHttpClientWithSign extends Adapter implements ClientInterface { + private ClientInterface $rawClient; + public function setClient(ClientInterface $client): PsrHttpClientWithSign { + $this->rawClient = $client; + return $this; } public function sendRequest(RequestInterface $request): ResponseInterface { - - $request = ($this->withHeaders)( - $request, - $this->apiKey, - ($this->timestampGenerator)(), - ($this->idGenerator)() - ); - $request = ($this->withSign)($request, $this->apiSecret); - return $this->rawClient->sendRequest($request); + return $this->rawClient->sendRequest($this->signRequest($request)); } -} +} \ No newline at end of file diff --git a/php-sdk/src/Api.php b/php-sdk/src/Api.php index e8ff4b0..427640c 100644 --- a/php-sdk/src/Api.php +++ b/php-sdk/src/Api.php @@ -45,9 +45,8 @@ public static function createGuzzleSignMiddleware(string $apiKey, string $apiSec ); } - public static function createPsrHttpClientWithSign(ClientInterface $rawClient, string $apiKey, string $apiSecret): ClientInterface { + public static function createPsrHttpClientWithSign(string $apiKey, string $apiSecret): PsrHttpClientWithSign { return new PsrHttpClientWithSign( - $rawClient, $apiKey, $apiSecret, self::withXHeaders(...), From 0672a5de0d4dca61b47fc73b03f995ed2eb53f44 Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 5 Mar 2026 11:44:32 +0800 Subject: [PATCH 043/124] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0php-sdk?= =?UTF-8?q?=E7=9A=84symfony=E6=8E=A5=E5=85=A5=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8acc5ae..90f80ec 100644 --- a/README.md +++ b/README.md @@ -450,7 +450,7 @@ use WikibrokerOpenapiSdk\Api; const API_KEY = "ef05e5b0-9daf-49e3-a0f4-9a3c13f55c3b"; const API_SECRET = "4ae4bf20-0afa-4122-ade8-c0beca7bd5e4"; $rawClient = new Psr18Client(); -$client = Api::createPsrHttpClientWithSign($rawClient, API_KEY, API_SECRET); +$client = Api::createPsrHttpClientWithSign(API_KEY, API_SECRET)->setClient($rawClient); $body = $rawClient->createStream(json_encode(["key" => "value"])); $request = $rawClient->createRequest( From e5289e5d820f1b824dfaa93f38cafaa4df9a3c0a Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 5 Mar 2026 11:59:21 +0800 Subject: [PATCH 044/124] =?UTF-8?q?chore:=20=E9=85=8D=E7=BD=AEphp-sdk?= =?UTF-8?q?=E6=89=93=E5=8C=85composer=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/.gitignore | 3 ++- php-sdk/build.php | 18 ++++++++++++++++++ php-sdk/composer.json | 7 +++++-- php-sdk/composer.lock | 6 ++++-- 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 php-sdk/build.php diff --git a/php-sdk/.gitignore b/php-sdk/.gitignore index a725465..5fa2ed3 100644 --- a/php-sdk/.gitignore +++ b/php-sdk/.gitignore @@ -1 +1,2 @@ -vendor/ \ No newline at end of file +vendor/ +*.zip \ No newline at end of file diff --git a/php-sdk/build.php b/php-sdk/build.php new file mode 100644 index 0000000..638b5d0 --- /dev/null +++ b/php-sdk/build.php @@ -0,0 +1,18 @@ + Date: Thu, 5 Mar 2026 12:23:36 +0800 Subject: [PATCH 045/124] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E5=85=A8?= =?UTF-8?q?=E5=B1=80sdk=E6=9E=84=E5=BB=BA=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- Makefile | 30 ++++++++++++++++++------------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 09de447..08ac053 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.tgz *.whl -*.jar \ No newline at end of file +*.jar +*.zip \ No newline at end of file diff --git a/Makefile b/Makefile index d86795a..2716b2f 100644 --- a/Makefile +++ b/Makefile @@ -1,38 +1,44 @@ -.PHONY: build build-js build-go build-py build-java +.PHONY: build build-js build-go build-py build-java build-php -GO_SDK_VERSION=1.0.0 +GO_SDK_VERSION = 1.0.0 build: @echo "清理已构建SDK包..." @echo "" - @rm -rf wikibroker*.tgz wikibroker*.whl + @rm -rf wikibroker*.tgz wikibroker*.whl wikibroker*.jar wikibroker*.zip @echo "" @echo "开始构建所有SDK..." @echo "" - @$(MAKE) build-js && $(MAKE) build-go && $(MAKE) build-py && $(MAKE) build-java + @$(MAKE) build-js && $(MAKE) build-go && $(MAKE) build-py && $(MAKE) build-java && $(MAKE) build-php @echo "" @echo "所有SDK构建成功!" build-js: - @echo "[1/4] 开始构建 JavaScript SDK..." + @echo "[1/5] 开始构建 JavaScript SDK..." @cd javascript-sdk && rm -rf dist && pnpm pack && rename 's/openapi-sdk/openapi-js-sdk/' wikibroker-*.tgz && mv wikibroker-*.tgz .. - @echo "[1/4] JavaScript SDK 构建完成 ✓" + @echo "[1/5] JavaScript SDK 构建完成 ✓" @echo "" build-go: - @echo "[2/4] 开始构建 Go SDK..." + @echo "[2/5] 开始构建 Go SDK..." @cp -r golang-sdk wikibroker_openapi_sdk && tar zcf wikibroker-openapi-go-sdk-$(GO_SDK_VERSION).tgz wikibroker_openapi_sdk && rm -rf wikibroker_openapi_sdk - @echo "[2/4] Go SDK 构建完成 ✓" + @echo "[2/5] Go SDK 构建完成 ✓" @echo "" build-py: - @echo "[3/4] 开始构建 Python SDK..." + @echo "[3/5] 开始构建 Python SDK..." @cd python-sdk && rm -rf dist && uv build && mv dist/wikibroker*.whl .. - @echo "[3/4] Python SDK 构建完成 ✓" + @echo "[3/5] Python SDK 构建完成 ✓" @echo "" build-java: - @echo "[4/4] 开始构建 Java SDK..." + @echo "[4/5] 开始构建 Java SDK..." @cd java-sdk && rm -rf target && mvn package && mv target/wikibroker*.jar .. - @echo "[4/4] Java SDK 构建完成 ✓" + @echo "[4/5] Java SDK 构建完成 ✓" + @echo "" + +build-php: + @echo "[5/5] 开始构建 PHP SDK..." + @cd php-sdk && composer build && mv wikibroker*.zip .. + @echo "[5/5] PHP SDK 构建完成 ✓" @echo "" \ No newline at end of file From fbf12982ee819a037baae72af1b05d164d9556f4 Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 5 Mar 2026 12:26:08 +0800 Subject: [PATCH 046/124] =?UTF-8?q?chore:=20=E4=BD=BFgit=E5=BF=BD=E7=95=A5?= =?UTF-8?q?php-sdk=E4=B8=8B=E7=9A=84vscode=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- php-sdk/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/php-sdk/.gitignore b/php-sdk/.gitignore index 5fa2ed3..5a7b187 100644 --- a/php-sdk/.gitignore +++ b/php-sdk/.gitignore @@ -1,2 +1,3 @@ vendor/ -*.zip \ No newline at end of file +*.zip +.vscode \ No newline at end of file From 4373b64ae72d1c335785f25d82b63228388846fe Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 5 Mar 2026 12:37:24 +0800 Subject: [PATCH 047/124] =?UTF-8?q?chore:=20=E4=BC=98=E5=8C=96php-sdk?= =?UTF-8?q?=E6=89=93=E5=8C=85=E6=9E=84=E5=BB=BA=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- php-sdk/.gitattributes | 4 ++++ php-sdk/build.php | 18 ------------------ php-sdk/composer.json | 2 +- 4 files changed, 6 insertions(+), 20 deletions(-) create mode 100644 php-sdk/.gitattributes delete mode 100644 php-sdk/build.php diff --git a/Makefile b/Makefile index 2716b2f..6d4c897 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,6 @@ build-java: build-php: @echo "[5/5] 开始构建 PHP SDK..." - @cd php-sdk && composer build && mv wikibroker*.zip .. + @cd php-sdk && composer build && rename 's/wikiglobal-wikibroker-openapi-sdk/wikibroker-openapi-php-sdk/' wikiglobal*.zip && mv wikibroker*.zip .. @echo "[5/5] PHP SDK 构建完成 ✓" @echo "" \ No newline at end of file diff --git a/php-sdk/.gitattributes b/php-sdk/.gitattributes new file mode 100644 index 0000000..542c62e --- /dev/null +++ b/php-sdk/.gitattributes @@ -0,0 +1,4 @@ +/.vscode export-ignore +/vendor export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore \ No newline at end of file diff --git a/php-sdk/build.php b/php-sdk/build.php deleted file mode 100644 index 638b5d0..0000000 --- a/php-sdk/build.php +++ /dev/null @@ -1,18 +0,0 @@ - Date: Thu, 5 Mar 2026 13:48:13 +0800 Subject: [PATCH 048/124] =?UTF-8?q?doc:=20README=E6=B7=BB=E5=8A=A0php-sdk?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=91=BD=E4=BB=A4=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 90f80ec..7bfd948 100644 --- a/README.md +++ b/README.md @@ -406,7 +406,9 @@ try (var client = HttpClients.createDefault()) { **安装** ```bash -// TODO +mv wikibroker-openapi-php-sdk-0.1.0-alpha.zip ./ +composer config repositories.local artifact ./ +composer require wikiglobal/wikibroker-openapi-sdk:0.1.0-alpha ``` **示例** From 7c9873bacd0bfe092b48dcc0a69a42524c05b1bf Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 5 Mar 2026 14:24:58 +0800 Subject: [PATCH 049/124] =?UTF-8?q?chore:=20=E5=9C=A8Makefile=E4=B8=AD?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=B5=8B=E8=AF=95=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 29 ++++++++++++++++++++++++++++- javascript-sdk/package.json | 2 +- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 6d4c897..f525608 100644 --- a/Makefile +++ b/Makefile @@ -41,4 +41,31 @@ build-php: @echo "[5/5] 开始构建 PHP SDK..." @cd php-sdk && composer build && rename 's/wikiglobal-wikibroker-openapi-sdk/wikibroker-openapi-php-sdk/' wikiglobal*.zip && mv wikibroker*.zip .. @echo "[5/5] PHP SDK 构建完成 ✓" - @echo "" \ No newline at end of file + @echo "" + +.PHONY: test test-js test-go test-py test-java test-php + +test: + @echo "运行所有 SDK 测试..." + @$(MAKE) test-js && $(MAKE) test-go && $(MAKE) test-py && $(MAKE) test-java && $(MAKE) test-php + @echo "所有 SDK 测试完成!" + +test-js: + @echo "[1/5] 运行 JavaScript SDK 测试..." + @cd javascript-sdk && pnpm test + +test-go: + @echo "[2/5] 运行 Go SDK 测试..." + @cd golang-sdk && go test -v + +test-py: + @echo "[3/5] 运行 Python SDK 测试..." + @cd python-sdk && uv run pytest + +test-java: + @echo "[4/5] 运行 Java SDK 测试..." + @cd java-sdk && mvn test + +test-php: + @echo "[5/5] 运行 PHP SDK 测试..." + @cd php-sdk && composer test \ No newline at end of file diff --git a/javascript-sdk/package.json b/javascript-sdk/package.json index 05c884c..a6cbfc9 100644 --- a/javascript-sdk/package.json +++ b/javascript-sdk/package.json @@ -23,7 +23,7 @@ ], "scripts": { "build": "vite build && tsc -p tsconfig.json", - "test": "vitest", + "test": "vitest --run", "prepack": "pnpm build" }, "devDependencies": { From d9666d8093b8794b7f6450ca10e7d3199c029d89 Mon Sep 17 00:00:00 2001 From: auston Date: Thu, 5 Mar 2026 15:36:58 +0800 Subject: [PATCH 050/124] =?UTF-8?q?chore:=20=E5=9C=A8Makefile=E4=B8=AD?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BB=A3=E7=A0=81=E8=A1=8C=E6=95=B0=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f525608..de839e2 100644 --- a/Makefile +++ b/Makefile @@ -68,4 +68,36 @@ test-java: test-php: @echo "[5/5] 运行 PHP SDK 测试..." - @cd php-sdk && composer test \ No newline at end of file + @cd php-sdk && composer test + +.PHONY: cloc cloc-js cloc-go cloc-py cloc-java cloc-php + +cloc: + @echo "统计所有SDK代码行数..."; \ + TS=$$($(MAKE) cloc-js | grep TypeScript | awk '{print $$1 "\t" $$5}'); \ + GO=$$($(MAKE) cloc-go | grep "Go " | awk '{print $$1 "\t" $$5}'); \ + PY=$$($(MAKE) cloc-py | grep "Python " | awk '{print $$1 "\t" $$5}'); \ + JAVA=$$($(MAKE) cloc-java | grep "Java " | awk '{print $$1 "\t" $$5}'); \ + PHP=$$($(MAKE) cloc-php | grep "PHP " | awk '{print $$1 "\t" $$5}'); \ + printf "%-15s %15s\n" $$TS $$GO $$PY $$JAVA $$PHP + @echo "所有 SDK 代码行数统计完毕!" + +cloc-js: + @echo "统计 JavaScript SDK 代码行数..." + @cd javascript-sdk && cloc src + +cloc-go: + @echo "统计 Go SDK 代码行数..." + @cd golang-sdk && cloc . --exclude_list_file=wikibroker_openapi_sdk_test.go + +cloc-py: + @echo "统计 Python SDK 代码行数..." + @cd python-sdk && cloc src + +cloc-java: + @echo "统计 Java SDK 代码行数..." + @cd java-sdk && cloc src/main + +cloc-php: + @echo "统计 PHP SDK 代码行数..." + @cd php-sdk && cloc src \ No newline at end of file From 7e43756a90d5cf3f852d1224b25ec9e243fbbbf0 Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 24 Mar 2026 14:38:32 +0800 Subject: [PATCH 051/124] =?UTF-8?q?chore:=20=E5=9C=A8Makefile=E4=B8=AD?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=9E=84=E5=BB=BA=E5=8F=AF=E8=A7=86=E5=8C=96?= =?UTF-8?q?OpenAPI=E6=96=87=E6=A1=A3=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index de839e2..5ab1553 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,11 @@ GO_SDK_VERSION = 1.0.0 +doc: + @echo "生成可视化文档..." + @cd docs && npx @redocly/cli build-docs openapi.json -o index.html + @echo "可视化文档生成完成!" + build: @echo "清理已构建SDK包..." @echo "" From a1f2469ff0d05c6a925b0baac037116df97d2e13 Mon Sep 17 00:00:00 2001 From: auston Date: Tue, 24 Mar 2026 16:08:42 +0800 Subject: [PATCH 052/124] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0OpenAPI?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=B9=B6=E5=B0=86=E5=85=B6=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=8EWikiBroker=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/index.html | 2798 ++++++++++++++++++++++++++------------------- docs/openapi.json | 535 ++++++--- 2 files changed, 1997 insertions(+), 1336 deletions(-) diff --git a/docs/index.html b/docs/index.html index 2138d53..837b6f4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,7 +3,7 @@ - wlink + WikiBroker - + -

wlink (v1)

Download OpenAPI specification:

crm saas

-

公共接口(28)

修改密码-认证接口

修改密码

-
Request Body schema: application/json
email_code
string

邮箱验证码

-
new_password
required
string

新密码

-
old_password
required
string

原密码

-

Responses

Request samples

Content type
application/json
{
  • "email_code": "string",
  • "new_password": "string",
  • "old_password": "string"
}

Response samples

Content type
application/json
{ }

登录-认证接口

登录

-
header Parameters
Captcha-Token
string
Captcha-Action
string
Captcha-Randstr
string
Request Body schema: application/json
email
required
string
password
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{
  • "token": "string",
  • "user_info": {
    }
}

登出-认证接口

登出

-

Responses

Response samples

Content type
application/json
{ }

重置密码-认证接口

重置密码

-
Request Body schema: application/json
password
required
string
token
required
string

Responses

Request samples

Content type
application/json
{
  • "password": "string",
  • "token": "string"
}

Response samples

Content type
application/json
{ }

重置密码发送邮件-认证接口

重置密码发送邮件

-
Request Body schema: application/json
email
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "string"
}

Response samples

Content type
application/json
{ }

重置密码Token是否过期-认证接口

重置密码Token是否过期

-
query Parameters
token
required
string

Responses

Response samples

Content type
application/json
{
  • "expired": true
}

获取用户安全设置-认证接口

获取用户安全设置

-

Responses

Response samples

Content type
application/json
{
  • "email": "string",
  • "password": "string",
  • "required_password": "string"
}

获取登陆用户的按钮权限-权限管理模块

获取登陆用户的按钮权限

-

Responses

Response samples

Content type
application/json
{
  • "actions": {
    },
  • "menus": [
    ]
}

获取所有的菜单以及button列表用户的菜单列表-权限管理模块

获取所有的菜单以及button列表用户的菜单列表

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ]
}

获取投放列表-投放管理

获取投放列表(Client/IB端)

-
header Parameters
X-Language
string
Default: zh-CN

国际化语言,默认为zh-CN

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ]
}

屏蔽弹窗(不再展示)-弹窗管理

屏蔽弹窗(不再展示)

-
Request Body schema: application/json
ids
required
Array of integers

Responses

Request samples

Content type
application/json
{
  • "ids": [
    ]
}

Response samples

Content type
application/json
{ }

获取弹窗列表-弹窗管理

获取弹窗列表(Client/IB端)

-
header Parameters
X-Language
string
Default: zh-CN

国际化语言,默认为zh-CN

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ]
}

腾讯验证码验证-公共服务

腾讯验证码验证

-
Request Body schema: application/json
app_id
required
integer
rand_str
required
string
ticket
required
string
user_ip
required
string

Responses

Request samples

Content type
application/json
{
  • "app_id": 0,
  • "rand_str": "string",
  • "ticket": "string",
  • "user_ip": "string"
}

Response samples

Content type
application/json
{
  • "is_valid": true
}

发送邮箱验证码-验证码接口

发送邮箱验证码

-
Request Body schema: application/json
email
string

邮箱地址

-
received_at
required
integer

接收时间戳(Unix时间戳,单位:秒)

-
scene
required
string
Enum: "register" "withdrawal" "transfer" "password_change"

使用场景

-

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "received_at": 0,
  • "scene": "register"
}

Response samples

Content type
application/json
{
  • "can_resend_at": 0,
  • "expired_at": 0
}

校验邮箱是否已注册-验证码接口

校验邮箱是否已注册

-
Request Body schema: application/json
email
required
string

邮箱地址

-

Responses

Request samples

Content type
application/json
{
  • "email": "string"
}

Response samples

Content type
application/json
{
  • "is_registered": true
}

获取AliyunOss临时访问凭证-公共服务

获取AliyunOss临时访问凭证

-

Responses

Response samples

Content type
application/json
{
  • "access_key_id": "string",
  • "access_key_secret": "string",
  • "bucket_dir": "string",
  • "bucket_name": "string",
  • "bucket_region": "string",
  • "expiration": "string",
  • "security_token": "string"
}

查询APP key配置-公开设置接口

查询APP key配置

-

Responses

Response samples

Content type
application/json
{
  • "recaptcha_android_key": "string",
  • "recaptcha_web_key": "string",
  • "tencent_android_app_id": 0,
  • "tencent_ios_app_id": 0,
  • "tencent_web_app_id": 0
}

获取外观设置-公开设置接口

获取外观设置

-

Responses

Response samples

Content type
application/json
{
  • "admin_login_bg_image_url": "string",
  • "admin_login_copy_i18n": {
    },
  • "admin_login_layout": "string",
  • "client_login_bg_image_url": "string",
  • "client_login_copy_i18n": {
    },
  • "client_login_layout": "string",
  • "ib_login_bg_image_url": "string",
  • "ib_login_copy_i18n": {
    },
  • "ib_login_layout": "string"
}

获取公司设置-公开设置接口

获取公司设置

-

Responses

Response samples

Content type
application/json
{
  • "broker_name_i18n": {
    },
  • "company_logo_url": "string",
  • "email": "string",
  • "login_page_logo_url": "string",
  • "support_phone": "string",
  • "timezone": "string",
  • "watermark_logo_url": "string"
}

获取国家-公开设置接口

获取国家

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ]
}

获取所有可用的货币-公开设置接口

获取所有可用的货币

-
query Parameters
method
string
Enum: "all" "bank_transfer" "international_wire_transfer" "cryptocurrency"

出入金方式: normal为全部,bank_transfer为银行转账,international_wire_transfer为国际电汇,cryptocurrency为加密货币

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询全局杠杆列表-公开设置接口

查询全局杠杆列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取语言设置-公开设置接口

获取语言设置

-

Responses

Response samples

Content type
application/json
{
  • "language": [
    ]
}

获取安全设置-公开设置接口

获取安全设置

-

Responses

Response samples

Content type
application/json
{
  • "email_verification_scenarios": [
    ],
  • "google_two_factor_enabled": true,
  • "re_captcha_enabled": true,
  • "required_password_strength": "string",
  • "tencent_two_factor_enabled": true
}

获取当前租户版本号-公开设置接口

获取当前租户版本号

-

Responses

Response samples

Content type
application/json
{
  • "version": "string"
}

出金报表导出-报表接口

出金报表导出

-
Request Body schema: application/json
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
method
required
string
Enum: "all" "bank_transfer" "international_wire_transfer" "cryptocurrency"

出金方式: all为全部,bank_transfer为银行转账,international_wire_transfer为国际电汇,cryptocurrency为加密货币

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
status
required
string
Enum: "all" "auditing" "approved" "disapproved"

状态:all为全部(包含审核中和批准,不批准),auditing为审核中,approved为同意,disapproved为拒绝

-

Responses

Request samples

Content type
application/json
{
  • "end_time": "string",
  • "method": "all",
  • "start_time": "string",
  • "status": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

出金报表-报表接口

出金报表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
status
required
string
Enum: "all" "auditing" "approved" "disapproved"

状态:all为全部(包含审核中和批准,不批准),auditing为审核中,approved为批准,disapproved为拒绝

-
method
required
string
Enum: "all" "bank_transfer" "international_wire_transfer" "cryptocurrency"

出金方式: all为全部,bank_transfer为银行转账,international_wire_transfer为国际电汇,cryptocurrency为加密货币

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取当前登录用户的菜单权限(自动区分IB)-权限验证

获取当前登录用户的菜单权限(自动区分IB/Client)

-

Responses

Response samples

Content type
application/json
{
  • "actions": {
    },
  • "menus": [
    ]
}

Client接口(65)

查询所持账户的余额-申请接口

查询所持账户的余额

-
query Parameters
type
required
Array of strings

记录类型:只能入金(deposit_only)、只能出金(withdrawal_only),入金出金都可以(normal),入金传入deposit_only和normal,出金传入withdrawal_only和normal

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

创建开户申请-申请接口

创建开户申请-Client端接口

-
Request Body schema: application/json
currency
required
string
Value: "USD"

账户货币,目前只支持USD

-
leverage
required
integer

账户杠杆

-
observe_password
string

观摩密码

-
password
required
string

交易密码

-
trading_account_type_id
required
integer

交易账号类型ID

-
trading_platform
required
string
Enum: "MT4" "MT5"

交易平台,目前仅支持MT4

-

Responses

Request samples

Content type
application/json
{
  • "currency": "USD",
  • "leverage": 0,
  • "observe_password": "string",
  • "password": "string",
  • "trading_account_type_id": 0,
  • "trading_platform": "MT4"
}

Response samples

Content type
application/json
{
  • "application_account_id": 0
}

创建转账申请-申请接口

创建转账申请

-
Request Body schema: application/json
amount
required
string

转账金额

-
email_code
string

邮箱验证码

-
remark
required
string

注释

-
source_trading_account_id
required
integer

转出交易账户ID

-
target_trading_account_id
required
integer

转入交易账户ID

-

Responses

Request samples

Content type
application/json
{
  • "amount": "string",
  • "email_code": "string",
  • "remark": "string",
  • "source_trading_account_id": 0,
  • "target_trading_account_id": 0
}

Response samples

Content type
application/json
{
  • "audit_id": 0,
  • "audit_status": "string"
}

查询转账历史列表-申请接口

查询转账历史列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

创建电子认证会话-电子认证

创建电子认证会话

-
Request Body schema: application/json
failed_url
required
string

认证失败跳转URL

-
success_url
required
string

认证成功跳转URL

-

Responses

Request samples

Content type
application/json
{
  • "failed_url": "string",
  • "success_url": "string"
}

Response samples

Content type
application/json
{
  • "expire_at": "string",
  • "redirect_url": "string",
  • "session_id": "string"
}

查询电子认证结果-电子认证

查询电子认证结果

-
query Parameters
session_id
required
string

会话ID

-

Responses

Response samples

Content type
application/json
{
  • "attempt_times": 0,
  • "reason_code": "string",
  • "reason_msg": "string",
  • "retry_times": 0,
  • "status": "string"
}

消息详情-消息中心

消息详情

-
query Parameters
id
required
integer

消息ID

-

Responses

Response samples

Content type
application/json
{
  • "content": "string",
  • "created_at": "string",
  • "id": 0,
  • "sender": "string",
  • "title": "string"
}

隐藏消息-消息中心

隐藏消息

-
Request Body schema: application/json
id
required
integer

消息ID

-

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

消息列表-消息中心

消息列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

标记消息已读-消息中心

标记消息已读

-
Request Body schema: application/json
id
required
integer

消息ID

-

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

获取未读消息数量-消息中心

获取未读消息数量

-

Responses

Response samples

Content type
application/json
{
  • "count": 0
}

查询Client用户问卷答案-客户接口

查询Client用户问卷答案

-
query Parameters
id
required
integer

答卷记录ID

-

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "items": [
    ],
  • "name": "string"
}

保存Client用户问卷答案-客户接口

保存Client用户问卷答案

-
Request Body schema: application/json
required
Array of objects

答案列表

-
questionnaire_id
required
integer

问卷ID

-

Responses

Request samples

Content type
application/json
{
  • "answers": [
    ],
  • "questionnaire_id": 0
}

Response samples

Content type
application/json
{ }

获取软件下载工具列表-客户接口

获取软件下载工具列表

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取交易工具栏目多语言详情-交易工具

获取交易工具栏目多语言详情

-
query Parameters
column_id
required
integer

主表column_id

-

Responses

Response samples

Content type
application/json
{
  • "column_id": 0,
  • "id": 0,
  • "iframe_link": "string",
  • "is_read": true,
  • "language": "string",
  • "popup_content": "string",
  • "popup_title": "string",
  • "title": "string"
}

检查弹框是否已读-交易工具

检查弹框是否已读

-
query Parameters
column_id
required
integer

栏目ID

-

Responses

Response samples

Content type
application/json
{
  • "is_read": true
}

标记弹框已读-交易工具

标记弹框已读

-
Request Body schema: application/json
column_id
required
integer

栏目ID

-

Responses

Request samples

Content type
application/json
{
  • "column_id": 0
}

Response samples

Content type
application/json
{ }

获取加密货币USDT可用网络-申请接口

获取加密货币USDT可用网络

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

基于货币对返回汇率-申请接口

基于货币对返回汇率

-
query Parameters
from_currency
required
string

源货币

-
to_currency
required
string

目标货币

-

Responses

Response samples

Content type
application/json
{
  • "exchange_rate": "string"
}

获取可用货币列表-申请接口

获取可用货币列表

-
query Parameters
remittance_id
required
integer

汇款方式ID

-
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

虚拟账户入金-申请接口

虚拟账户入金

-
Request Body schema: application/json
amount
required
string

金额

-
trading_account_id
required
integer

交易账号ID

-

Responses

Request samples

Content type
application/json
{
  • "amount": "string",
  • "trading_account_id": 0
}

Response samples

Content type
application/json
{ }

取消入金申请-申请接口

取消入金申请

-
Request Body schema: application/json
order_number
required
string

入金订单号

-

Responses

Request samples

Content type
application/json
{
  • "order_number": "string"
}

Response samples

Content type
application/json
{
  • "order_number": "string",
  • "status": "string"
}

获取可用的入金渠道-申请接口

获取可用的入金渠道

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

创建入金申请草稿-申请接口

创建入金申请草稿

-
Request Body schema: application/json
deposit_amount
required
string

入金金额

-
remark
string

备注,可选

-
remittance_id
required
integer

汇款方式id

-
trading_account_id
required
integer

入金交易账号id(用户关联的交易账号ID(多选一))

-

Responses

Request samples

Content type
application/json
{
  • "deposit_amount": "string",
  • "remark": "string",
  • "remittance_id": 0,
  • "trading_account_id": 0
}

Response samples

Content type
application/json
{
  • "order_number": "string",
  • "pay_data": "string",
  • "pay_type": "string",
  • "pay_url": "string",
  • "status": "string"
}

获取未提交入金申请草稿-申请接口

获取未提交入金申请草稿

-
query Parameters
order_number
required
string

入金订单号

-

Responses

Response samples

Content type
application/json
{
  • "account_info": "string",
  • "deposit_amount": "string",
  • "order_number": "string",
  • "receipt_url": "string"
}

获取未处理入金申请订单的数量-申请接口

获取未处理入金申请订单的数量

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "count": 0
}

提交入金申请(支付确认)-申请接口

提交入金申请(支付确认)

-
Request Body schema: application/json
order_number
required
string

入金订单号

-
receipt_url
required
string

收据图片地址

-

Responses

Request samples

Content type
application/json
{
  • "order_number": "string",
  • "receipt_url": "string"
}

Response samples

Content type
application/json
{
  • "order_number": "string",
  • "status": "string"
}

查询入金历史记录-申请接口

查询入金历史记录

-
query Parameters
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询出金历史记录-申请接口

查询出金历史记录

-
query Parameters
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取可用的汇率列表-申请接口

获取可用的汇率列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取可用的出金渠道-申请接口

获取可用的出金渠道

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

创建出金申请-申请接口

创建出金申请

-
Request Body schema: application/json
object

银行转账信息

-
object

加密货币信息

-
currency
required
string

交易货币类型

-
email_code
string

邮箱验证码

-
exchange_rate
required
string

汇率

-
fee
required
string

手续费

-
object

国际电汇信息

-
method
required
string

汇款方式

-
remark
string

备注

-
remittance_amount
required
string

汇款金额

-
remittance_id
required
integer

汇款id 获取支付方式、最高最低出金,手续费等信息

-
trading_account_id
required
integer

出金交易账号id

-
withdrawal_amount
required
string

出金金额

-

Responses

Request samples

Content type
application/json
{
  • "bank_transfer_info": {
    },
  • "cryptocurrency_info": {
    },
  • "currency": "string",
  • "email_code": "string",
  • "exchange_rate": "string",
  • "fee": "string",
  • "international_wire_info": {
    },
  • "method": "string",
  • "remark": "string",
  • "remittance_amount": "string",
  • "remittance_id": 0,
  • "trading_account_id": 0,
  • "withdrawal_amount": "string"
}

Response samples

Content type
application/json
{
  • "order_number": "string"
}

Client用户信息-客户接口

Client用户信息

-

Responses

Response samples

Content type
application/json
{
  • "agreement_status": "filling",
  • "apply_status": "filling",
  • "completed_module": [
    ],
  • "identity_status": "filling",
  • "kyc_approved_at": "string",
  • "kyc_data": {
    },
  • "kyc_status": "filling",
  • "kyc_way": "string",
  • "register_datetime": "string"
}

获取Client用户注册模板-客户接口

获取Client用户注册模板

-

Responses

Response samples

Content type
application/json
{
  • "agreement": {
    },
  • "apply_status": "pending",
  • "e_verify": {
    },
  • "identity": {
    },
  • "kyc": {
    },
  • "remark": "string"
}

注册Client用户-客户接口

注册Client用户(Client端接口)

-
Request Body schema: application/json
email
required
string
email_code
string

邮箱验证码

-
invite_code
string
password
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "email_code": "string",
  • "invite_code": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{
  • "token": "string",
  • "user_info": {
    }
}

保存Client用户身份信息-客户接口

保存Client用户身份信息

-
Request Body schema: application/json
current_module
required
string
Enum: "identity" "questionnaire" "family" "contact" "job" "authentication_accessory" "authentication" "agreement" "e_verify" "all"

当前模块: identity: 身份信息, questionnaire: 问卷调查, family: 家庭信息, contact: 联络信息, job: 工作信息, authentication_accessory: 证明文件, authentication: 认证信息, e_verify: 电子验证, all: 全部

-
required
object

当前需要提交保存的KYC数据, key1: {module_key}, key2: {field_key}

-

Responses

Request samples

Content type
application/json
{
  • "current_module": "identity",
  • "kyc_data": {
    }
}

Response samples

Content type
application/json
{ }

创建收款账户-申请接口

创建收款账户

-
Request Body schema: application/json
object

银行转账信息

-
object

加密货币信息

-
object

国际电汇信息

-
payment_method
required
string

必填:支付方式 international_wire_transfer|bank_transfer|cryptocurrency

-
remark
string

选填:备注

-

Responses

Request samples

Content type
application/json
{
  • "bank_transfer_info": {
    },
  • "cryptocurrency_info": {
    },
  • "international_wire_info": {
    },
  • "payment_method": "string",
  • "remark": "string"
}

Response samples

Content type
application/json
{
  • "id": 0
}

删除收款账户-申请接口

删除收款账户

-
Request Body schema: application/json
id
required
integer

账户ID

-

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

获取收款账户详情-申请接口

获取收款账户详情

-
query Parameters
id
required
integer

账户ID

-

Responses

Response samples

Content type
application/json
{
  • "account_holder_name": "string",
  • "bank_transfer_info": {
    },
  • "created_at": "string",
  • "cryptocurrency_info": {
    },
  • "id": 0,
  • "international_wire_info": {
    },
  • "payment_method": "string",
  • "remark": "string",
  • "updated_at": "string"
}

获取收款账户列表-申请接口

获取收款账户列表

-
query Parameters
payment_method
string

选填:筛选支付方式(international_wire_transfer|bank_transfer|cryptocurrency)

-
start_time
string

选填:创建开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

选填:创建结束时间(格式:YYYY-MM-DD HH:MM:SS)

-

Responses

Response samples

Content type
application/json
{
  • "bank_transfer": [
    ],
  • "cryptocurrency": [
    ],
  • "international_wire_transfer": [
    ],
  • "total": 0
}

更新收款账户-申请接口

更新收款账户

-
Request Body schema: application/json
object

银行转账信息(更新时提供)

-
object

加密货币信息(更新时提供)

-
id
required
integer

账户ID

-
object

国际电汇信息(更新时提供)

-
is_default
boolean

是否设置为默认账户(true-设为默认,false-取消默认,不传-不修改)

-
remark
string

备注

-

Responses

Request samples

Content type
application/json
{
  • "bank_transfer_info": {
    },
  • "cryptocurrency_info": {
    },
  • "id": 0,
  • "international_wire_info": {
    },
  • "is_default": true,
  • "remark": "string"
}

Response samples

Content type
application/json
{ }

入金报表导出-报表接口

入金报表导出

-
Request Body schema: application/json
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
status
required
string
Enum: "all" "auditing" "approved" "disapproved"

状态:all为全部(包含审核中和批准,不批准),auditing为审核中,approved为同意,disapproved为拒绝

-

Responses

Request samples

Content type
application/json
{
  • "end_time": "string",
  • "start_time": "string",
  • "status": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

入金报表-报表接口

入金报表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
status
required
string
Enum: "all" "auditing" "approved" "disapproved"

状态:all为全部(包含审核中和批准,不批准),auditing为审核中,approved为批准,disapproved为拒绝

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出历史订单报表-报表接口

导出历史订单报表

-
Request Body schema: application/json
account
string

交易账号

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
order_number
string

订单号

-
page
required
integer
Default: 1

页码

-
server_id
integer

交易服务器ID

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
symbol
string

交易品种

-
time_type
string
Default: "open"
Enum: "open" "close"

时间类型,open为开仓时间,close为闭仓时间

-
trading_account_id
integer

交易账号的业务ID

-
trading_type
required
string
Enum: "all" "BUY" "SELL"

交易类型

-

Responses

Request samples

Content type
application/json
{
  • "account": "string",
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "server_id": 0,
  • "size": 20,
  • "start_time": "string",
  • "symbol": "string",
  • "time_type": "open",
  • "trading_account_id": 0,
  • "trading_type": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询历史订单报表-报表接口

查询历史订单报表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
time_type
string
Default: "open"
Enum: "open" "close"

时间类型,open为开仓时间,close为闭仓时间

-
order_number
string

订单号

-
account
string

交易账号

-
trading_type
required
string
Enum: "all" "BUY" "SELL"

交易类型

-
symbol
string

交易品种

-
server_id
integer

交易服务器ID

-
trading_account_id
integer

交易账号的业务ID

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出持仓报表-报表接口

导出持仓报表

-
Request Body schema: application/json
account
string

交易账号

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
order_number
string

订单号

-
page
required
integer
Default: 1

页码

-
server_id
integer

交易服务器ID

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
symbol
string

交易品种

-
trading_account_id
integer

交易账号的业务ID

-
trading_type
required
string
Enum: "all" "BUY" "SELL"

交易类型

-

Responses

Request samples

Content type
application/json
{
  • "account": "string",
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "server_id": 0,
  • "size": 20,
  • "start_time": "string",
  • "symbol": "string",
  • "trading_account_id": 0,
  • "trading_type": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询持仓报表-报表接口

查询持仓报表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
order_number
string

订单号

-
account
string

交易账号

-
trading_type
required
string
Enum: "all" "BUY" "SELL"

交易类型

-
symbol
string

交易品种

-
server_id
integer

交易服务器ID

-
trading_account_id
integer

交易账号的业务ID

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出挂单报表-报表接口

导出挂单报表

-
Request Body schema: application/json
account
string

交易账号

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
order_number
string

订单号

-
page
required
integer
Default: 1

页码

-
server_id
integer

交易服务器ID

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
symbol
string

交易品种

-
trading_account_id
integer

交易账号的业务ID

-
trading_type
required
string
Enum: "all" "BUY_LIMIT" "SELL_LIMIT" "BUY_STOP" "SELL_STOP" "BUY_STOP_LIMIT" "SELL_STOP_LIMIT"

交易类型

-

Responses

Request samples

Content type
application/json
{
  • "account": "string",
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "server_id": 0,
  • "size": 20,
  • "start_time": "string",
  • "symbol": "string",
  • "trading_account_id": 0,
  • "trading_type": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询挂单报表-报表接口

查询挂单报表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
order_number
string

订单号

-
account
string

交易账号

-
trading_type
required
string
Enum: "all" "BUY_LIMIT" "SELL_LIMIT" "BUY_STOP" "SELL_STOP" "BUY_STOP_LIMIT" "SELL_STOP_LIMIT"

交易类型

-
symbol
string

交易品种

-
server_id
integer

交易服务器ID

-
trading_account_id
integer

交易账号的业务ID

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取交易服务器选项列表-报表接口

获取交易服务器选项列表

-
query Parameters
order_type
required
string
Enum: "holding" "history" "pending"

订单类型

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询用户交易过的品种列表-报表接口

查询用户交易过的品种列表

-
query Parameters
order_type
required
string
Enum: "holding" "history" "pending"

订单类型

-
server_id
integer

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出转账报表-报表接口

导出转账报表

-
Request Body schema: application/json
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
order_number
string

订单号

-
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
status
required
string
Enum: "all" "pending" "auditing" "approved" "disapproved"

审核状态:all为全部,pending为待审核,auditing为审核中,approved为批准,disapproved为拒绝

-

Responses

Request samples

Content type
application/json
{
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "size": 20,
  • "start_time": "string",
  • "status": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询转账报表-报表接口

查询转账报表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

-
order_number
string

订单号

-
status
required
string
Enum: "all" "pending" "auditing" "approved" "disapproved"

审核状态:all为全部,pending为待审核,auditing为审核中,approved为批准,disapproved为拒绝

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

申请交易账号-用户ID从token获取-交易接口

申请交易账号-用户ID从token获取

-
Request Body schema: application/json
currency
required
string
Value: "USD"

账户货币,目前只支持USD

-
is_demo
required
boolean

是否为模拟账户

-
leverage
required
integer

账户杠杆

-
observe_password
string

观摩密码

-
password
required
string

交易密码

-
trading_account_type_id
required
integer

交易账号类型ID

-
trading_platform
required
string
Enum: "MT4" "MT5"

交易平台,目前仅支持MT4

-

Responses

Request samples

Content type
application/json
{
  • "currency": "USD",
  • "is_demo": true,
  • "leverage": 0,
  • "observe_password": "string",
  • "password": "string",
  • "trading_account_type_id": 0,
  • "trading_platform": "MT4"
}

Response samples

Content type
application/json
{
  • "id": 0
}

查询交易账号-交易接口

查询交易账号

-
query Parameters
id
required
integer

交易账户的业务ID

-

Responses

Response samples

Content type
application/json
{
  • "account": "string",
  • "balance": "string",
  • "credit": "string",
  • "currency": "USD",
  • "equity": "string",
  • "id": 0,
  • "is_demo": true,
  • "leverage": 0,
  • "observe_password": "string",
  • "password": "string",
  • "server_name": "string",
  • "trading_account_type_name": "string",
  • "trading_platform": "MT4"
}

查询是否允许开通模拟账户-交易接口

查询是否允许开通模拟账户

-

Responses

Response samples

Content type
application/json
{
  • "enabled": true
}

查询交易账户可用杠杆-交易接口

查询交易账户可用杠杆

-
query Parameters
id
required
integer

交易账户的业务ID

-

Responses

Response samples

Content type
application/json
{
  • "leverage_options": [
    ]
}

查询交易账号杠杆更新状态-交易接口

查询交易账号杠杆更新状态

-
query Parameters
id
required
integer

交易账号的业务ID

-

Responses

Response samples

Content type
application/json
{
  • "audit_id": 0,
  • "audit_status": "string"
}

查询可用交易账号类型列表-通过token获取用户ID匹配注册流程再查询-交易接口

查询可用交易账号类型列表-通过token获取用户ID匹配注册流程再查询

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
is_demo
boolean
trading_platform
required
string
Enum: "MT4" "MT5"

交易平台

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询交易账号列表-交易接口

查询交易账号列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
is_demo
boolean

是否为模拟账户

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询交易账号选项列表-交易接口

查询交易账号选项列表

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取可用交易平台选项列表-交易接口

获取可用交易平台选项列表

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

更新交易账号杠杆-交易接口

更新交易账号杠杆

-
Request Body schema: application/json
id
required
integer

交易账号的业务ID

-
leverage
required
integer

杠杆

-
remark
required
string

注释

-

Responses

Request samples

Content type
application/json
{
  • "id": 0,
  • "leverage": 0,
  • "remark": "string"
}

Response samples

Content type
application/json
{ }

更新交易账号密码-交易接口

更新交易账号密码

-
Request Body schema: application/json
id
required
integer

交易账号的业务ID

-
password
required
string

密码

-
type
required
string
Enum: "observe" "trade"

密码类型:observe表示只读密码,trade表示交易密码

-

Responses

Request samples

Content type
application/json
{
  • "id": 0,
  • "password": "string",
  • "type": "observe"
}

Response samples

Content type
application/json
{ }

检查当前用户是否有待审核的出金订单-交易接口

检查当前用户是否有待审核的出金订单

-

Responses

Response samples

Content type
application/json
{
  • "has_pending": true
}

IB接口(19)

IB的Client详情-代理接口

IB的Client详情

-
query Parameters
client_user_id
required
integer

客户用户id

-

Responses

Response samples

Content type
application/json
{
  • "agreement_status": "filling",
  • "apply_status": "filling",
  • "completed_module": [
    ],
  • "identity_status": "filling",
  • "kyc_approved_at": "string",
  • "kyc_data": {
    },
  • "kyc_status": "filling",
  • "kyc_way": "string",
  • "register_datetime": "string"
}

IB的Client列表-代理接口

IB的Client列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
client_user_id
integer

客户用户ID

-
kyc_status
string
Enum: "approved" "disapproved"

KYC认证状态: approved: 已验证, disapproved: 未验证

-
status
string
Enum: "enabled" "disabled"

用户状态: enabled: 启用, disabled: 禁用

-
email
string

邮箱(模糊查询)

-
client_name
string

姓名(模糊查询)

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

IB端-面板数据-仪表盘接口

IB端-面板数据

-
query Parameters
date_type
string

日期类型

-

Responses

Response samples

Content type
application/json
{
  • "cards": {
    }
}

IB端-面板数据-获取最后更新时间-仪表盘接口

IB端-面板数据-获取最后更新时间

-

Responses

Response samples

Content type
application/json
{
  • "last_update_time": "string"
}

ib查看返佣记录-资金接口

ib查看返佣记录

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

消息详情-消息中心

消息详情

-
query Parameters
id
required
integer

消息ID

-

Responses

Response samples

Content type
application/json
{
  • "content": "string",
  • "created_at": "string",
  • "id": 0,
  • "sender": "string",
  • "title": "string"
}

隐藏消息-消息中心

隐藏消息

-
Request Body schema: application/json
id
required
integer

消息ID

-

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

消息列表-消息中心

消息列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

标记消息已读-消息中心

标记消息已读

-
Request Body schema: application/json
id
required
integer

消息ID

-

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

获取未读消息数量-消息中心

获取未读消息数量

-

Responses

Response samples

Content type
application/json
{
  • "count": 0
}

查询返佣账号列表-代理接口

查询返佣账号列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
account_id
string

交易账户在MT4的ID

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

更改返佣账户权限-代理接口

更改返佣账户权限

-
Request Body schema: application/json
enabled
required
boolean

是否启用权限

-
id
required
integer

交易账户的业务ID

-

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "id": 0
}

Response samples

Content type
application/json
{
  • "account": "string"
}

获取软件下载工具列表-代理接口

获取软件下载工具列表

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询客户交易账户列表-代理接口

查询客户交易账户列表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
user_name
string

姓名

-
account_id
string

交易账户在MT4的ID

-
trading_account_type_name
string

交易账号类型名称

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取IB用户信息-代理接口

获取IB用户信息

-

Responses

Response samples

Content type
application/json
{
  • "QRCodeURL": "string",
  • "ReferralCode": "string",
  • "ReferralLink": "string",
  • "agreement_status": "filling",
  • "apply_status": "filling",
  • "completed_module": [
    ],
  • "identity_status": "filling",
  • "kyc_approved_at": "string",
  • "kyc_data": {
    },
  • "kyc_status": "filling",
  • "kyc_way": "string",
  • "register_datetime": "string"
}

导出佣金明细报表-报表接口

导出佣金明细报表

-
Request Body schema: application/json
client_user_name
string

客户用户名

-
end_time
string

结束日期 (格式: YYYY-MM-DD)

-
rebate_aggregation_id
string
start_time
string

开始日期 (格式: YYYY-MM-DD)

-
time_search_type
string
Enum: "calculate_at" "grant_at"

Responses

Request samples

Content type
application/json
{
  • "client_user_name": "string",
  • "end_time": "string",
  • "rebate_aggregation_id": "string",
  • "start_time": "string",
  • "time_search_type": "calculate_at"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询佣金明细报表-报表接口

查询佣金明细报表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
rebate_aggregation_id
integer
time_search_type
string
Enum: "calculate_at" "grant_at"
start_time
string

开始日期 (格式: YYYY-MM-DD)

-
end_time
string

结束日期 (格式: YYYY-MM-DD)

-
client_user_name
string

客户用户名

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出佣金报表-报表接口

导出佣金报表

-
Request Body schema: application/json
end_time
string

自定义结束时间 (格式: YYYY-MM-DD HH:MM:SS)

-
start_time
string

自定义开始时间 (格式: YYYY-MM-DD HH:MM:SS)

-
time_search_type
string
Enum: "calculate_at" "grant_at"

Responses

Request samples

Content type
application/json
{
  • "end_time": "string",
  • "start_time": "string",
  • "time_search_type": "calculate_at"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询佣金报表-报表接口

查询佣金报表

-
query Parameters
page
required
integer
Default: 1

页码

-
size
required
integer
Default: 20

每页数量

-
time_search_type
string
Enum: "calculate_at" "grant_at"
start_time
string

自定义开始时间 (格式: YYYY-MM-DD HH:MM:SS)

-
end_time
string

自定义结束时间 (格式: YYYY-MM-DD HH:MM:SS)

-

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}
+ " fill="currentColor">

WikiBroker (v1.4)

Download OpenAPI specification:

crm saas

+

公共接口(28)

修改密码-认证接口

修改密码

+
Request Body schema: application/json
email_code
string

邮箱验证码

+
new_password
required
string

新密码

+
old_password
required
string

原密码

+

Responses

Request samples

Content type
application/json
{
  • "email_code": "string",
  • "new_password": "string",
  • "old_password": "string"
}

Response samples

Content type
application/json
{ }

登录-认证接口

登录

+
header Parameters
Captcha-Token
string
Captcha-Action
string
Captcha-Randstr
string
Request Body schema: application/json
email
required
string
password
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{
  • "token": "string",
  • "user_info": {
    }
}

登出-认证接口

登出

+

Responses

Response samples

Content type
application/json
{ }

重置密码-认证接口

重置密码

+
Request Body schema: application/json
password
required
string
token
required
string

Responses

Request samples

Content type
application/json
{
  • "password": "string",
  • "token": "string"
}

Response samples

Content type
application/json
{ }

重置密码发送邮件-认证接口

重置密码发送邮件

+
Request Body schema: application/json
email
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "string"
}

Response samples

Content type
application/json
{ }

重置密码Token是否过期-认证接口

重置密码Token是否过期

+
query Parameters
token
required
string

Responses

Response samples

Content type
application/json
{
  • "expired": true
}

获取用户安全设置-认证接口

获取用户安全设置

+

Responses

Response samples

Content type
application/json
{
  • "email": "string",
  • "password": "string",
  • "required_password": "string"
}

获取登陆用户的按钮权限-权限管理模块

获取登陆用户的按钮权限

+

Responses

Response samples

Content type
application/json
{
  • "actions": {
    },
  • "menus": [
    ]
}

获取所有的菜单以及button列表用户的菜单列表-权限管理模块

获取所有的菜单以及button列表用户的菜单列表

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ]
}

获取投放列表-投放管理

获取投放列表(Client/IB端)

+
header Parameters
X-Language
string
Default: zh-CN

国际化语言,默认为zh-CN

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ]
}

屏蔽弹窗(不再展示)-弹窗管理

屏蔽弹窗(不再展示)

+
Request Body schema: application/json
ids
required
Array of integers

Responses

Request samples

Content type
application/json
{
  • "ids": [
    ]
}

Response samples

Content type
application/json
{ }

获取弹窗列表-弹窗管理

获取弹窗列表(Client/IB端)

+
header Parameters
X-Language
string
Default: zh-CN

国际化语言,默认为zh-CN

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ]
}

腾讯验证码验证-公共服务

腾讯验证码验证

+
Request Body schema: application/json
app_id
required
integer
rand_str
required
string
ticket
required
string
user_ip
required
string

Responses

Request samples

Content type
application/json
{
  • "app_id": 0,
  • "rand_str": "string",
  • "ticket": "string",
  • "user_ip": "string"
}

Response samples

Content type
application/json
{
  • "is_valid": true
}

发送邮箱验证码-验证码接口

发送邮箱验证码

+
Request Body schema: application/json
email
string

邮箱地址

+
received_at
required
integer

接收时间戳(Unix时间戳,单位:秒)

+
scene
required
string
Enum: "register" "withdrawal" "transfer" "password_change"

使用场景

+

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "received_at": 0,
  • "scene": "register"
}

Response samples

Content type
application/json
{
  • "can_resend_at": 0,
  • "expired_at": 0
}

校验邮箱是否已注册-验证码接口

校验邮箱是否已注册

+
Request Body schema: application/json
email
required
string

邮箱地址

+

Responses

Request samples

Content type
application/json
{
  • "email": "string"
}

Response samples

Content type
application/json
{
  • "is_registered": true
}

获取AliyunOss临时访问凭证-公共服务

获取AliyunOss临时访问凭证

+

Responses

Response samples

Content type
application/json
{
  • "access_key_id": "string",
  • "access_key_secret": "string",
  • "bucket_dir": "string",
  • "bucket_name": "string",
  • "bucket_region": "string",
  • "expiration": "string",
  • "security_token": "string"
}

查询APP key配置-公开设置接口

查询APP key配置

+

Responses

Response samples

Content type
application/json
{
  • "recaptcha_android_key": "string",
  • "recaptcha_web_key": "string",
  • "tencent_android_app_id": 0,
  • "tencent_ios_app_id": 0,
  • "tencent_web_app_id": 0
}

获取外观设置-公开设置接口

获取外观设置

+

Responses

Response samples

Content type
application/json
{
  • "admin_login_bg_image_url": "string",
  • "admin_login_copy_i18n": {
    },
  • "admin_login_layout": "string",
  • "client_login_bg_image_url": "string",
  • "client_login_copy_i18n": {
    },
  • "client_login_layout": "string",
  • "ib_login_bg_image_url": "string",
  • "ib_login_copy_i18n": {
    },
  • "ib_login_layout": "string"
}

获取公司设置-公开设置接口

获取公司设置

+

Responses

Response samples

Content type
application/json
{
  • "broker_name_i18n": {
    },
  • "company_logo_url": "string",
  • "email": "string",
  • "login_page_logo_url": "string",
  • "support_phone": "string",
  • "timezone": "string",
  • "watermark_logo_url": "string"
}

获取国家-公开设置接口

获取国家

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ]
}

获取所有可用的货币-公开设置接口

获取所有可用的货币

+
query Parameters
method
string
Enum: "all" "bank_transfer" "international_wire_transfer" "cryptocurrency"

出入金方式: normal为全部,bank_transfer为银行转账,international_wire_transfer为国际电汇,cryptocurrency为加密货币

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询全局杠杆列表-公开设置接口

查询全局杠杆列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取语言设置-公开设置接口

获取语言设置

+

Responses

Response samples

Content type
application/json
{
  • "language": [
    ]
}

获取安全设置-公开设置接口

获取安全设置

+

Responses

Response samples

Content type
application/json
{
  • "email_verification_scenarios": [
    ],
  • "google_two_factor_enabled": true,
  • "re_captcha_enabled": true,
  • "required_password_strength": "string",
  • "tencent_two_factor_enabled": true
}

获取当前租户版本号-公开设置接口

获取当前租户版本号

+

Responses

Response samples

Content type
application/json
{
  • "version": "string"
}

出金报表导出-报表接口

出金报表导出

+
Request Body schema: application/json
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
method
required
string
Enum: "all" "bank_transfer" "international_wire_transfer" "cryptocurrency"

出金方式: all为全部,bank_transfer为银行转账,international_wire_transfer为国际电汇,cryptocurrency为加密货币

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
status
required
string
Enum: "all" "auditing" "approved" "disapproved"

状态:all为全部(包含审核中和批准,不批准),auditing为审核中,approved为同意,disapproved为拒绝

+

Responses

Request samples

Content type
application/json
{
  • "end_time": "string",
  • "method": "all",
  • "start_time": "string",
  • "status": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

出金报表-报表接口

出金报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
status
required
string
Enum: "all" "auditing" "approved" "disapproved"

状态:all为全部(包含审核中和批准,不批准),auditing为审核中,approved为批准,disapproved为拒绝

+
method
required
string
Enum: "all" "bank_transfer" "international_wire_transfer" "cryptocurrency"

出金方式: all为全部,bank_transfer为银行转账,international_wire_transfer为国际电汇,cryptocurrency为加密货币

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取当前登录用户的菜单权限(自动区分IB)-权限验证

获取当前登录用户的菜单权限(自动区分IB/Client)

+

Responses

Response samples

Content type
application/json
{
  • "actions": {
    },
  • "menus": [
    ]
}

Client接口(68)

查询所持账户的余额-申请接口

查询所持账户的余额

+
query Parameters
type
required
Array of arrays
Items Enum: "deposit_only" "withdrawal_only" "normal" "wallet"

记录类型:只能入金(deposit_only)、只能出金(withdrawal_only),入金出金都可以(normal),入金传入deposit_only和normal,出金/转账转出传入withdrawal_only、normal和wallet,转账转入传入deposit_only、normal和wallet

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

创建开户申请-申请接口

创建开户申请-Client端接口

+
Request Body schema: application/json
currency
required
string
Value: "USD"

账户货币,目前只支持USD

+
leverage
required
integer

账户杠杆

+
observe_password
string

观摩密码

+
password
required
string

交易密码

+
trading_account_type_id
required
integer

交易账号类型ID

+
trading_platform
required
string
Enum: "MT4" "MT5"

交易平台,目前仅支持MT4

+

Responses

Request samples

Content type
application/json
{
  • "currency": "USD",
  • "leverage": 0,
  • "observe_password": "string",
  • "password": "string",
  • "trading_account_type_id": 0,
  • "trading_platform": "MT4"
}

Response samples

Content type
application/json
{
  • "application_account_id": 0
}

创建转账申请-申请接口

创建转账申请

+
Request Body schema: application/json
amount
required
string

转账金额

+
email_code
string

邮箱验证码

+
remark
required
string

注释

+
source_account_type
required
string
Default: "trading"
Enum: "trading" "wallet"

转出账户类型

+
source_trading_account_id
required
integer

转出交易账户ID

+
target_account_type
required
string
Default: "trading"
Enum: "trading" "wallet"

转入账户类型

+
target_trading_account_id
required
integer

转入交易账户ID

+

Responses

Request samples

Content type
application/json
{
  • "amount": "string",
  • "email_code": "string",
  • "remark": "string",
  • "source_account_type": "trading",
  • "source_trading_account_id": 0,
  • "target_account_type": "trading",
  • "target_trading_account_id": 0
}

Response samples

Content type
application/json
{
  • "audit_id": 0,
  • "audit_status": "string"
}

查询转账历史列表-申请接口

查询转账历史列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

创建电子认证会话-电子认证

创建电子认证会话

+
Request Body schema: application/json
failed_url
required
string

认证失败跳转URL

+
success_url
required
string

认证成功跳转URL

+

Responses

Request samples

Content type
application/json
{
  • "failed_url": "string",
  • "success_url": "string"
}

Response samples

Content type
application/json
{
  • "expire_at": "string",
  • "redirect_url": "string",
  • "session_id": "string"
}

查询电子认证结果-电子认证

查询电子认证结果

+
query Parameters
session_id
required
string

会话ID

+

Responses

Response samples

Content type
application/json
{
  • "attempt_times": 0,
  • "reason_code": "string",
  • "reason_msg": "string",
  • "retry_times": 0,
  • "status": "string"
}

消息详情-消息中心

消息详情

+
query Parameters
id
required
integer

消息ID

+

Responses

Response samples

Content type
application/json
{
  • "content": "string",
  • "created_at": "string",
  • "id": 0,
  • "sender": "string",
  • "title": "string"
}

隐藏消息-消息中心

隐藏消息

+
Request Body schema: application/json
id
required
integer

消息ID

+

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

消息列表-消息中心

消息列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

标记消息已读-消息中心

标记消息已读

+
Request Body schema: application/json
id
required
integer

消息ID

+

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

获取未读消息数量-消息中心

获取未读消息数量

+

Responses

Response samples

Content type
application/json
{
  • "count": 0
}

查询Client用户问卷答案-客户接口

查询Client用户问卷答案

+
query Parameters
id
required
integer

答卷记录ID

+

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "items": [
    ],
  • "name": "string"
}

保存Client用户问卷答案-客户接口

保存Client用户问卷答案

+
Request Body schema: application/json
required
Array of objects

答案列表

+
questionnaire_id
required
integer

问卷ID

+

Responses

Request samples

Content type
application/json
{
  • "answers": [
    ],
  • "questionnaire_id": 0
}

Response samples

Content type
application/json
{ }

获取软件下载工具列表-客户接口

获取软件下载工具列表

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取交易工具栏目多语言详情-交易工具

获取交易工具栏目多语言详情

+
query Parameters
column_id
required
integer

主表column_id

+

Responses

Response samples

Content type
application/json
{
  • "column_id": 0,
  • "id": 0,
  • "iframe_link": "string",
  • "is_read": true,
  • "language": "string",
  • "popup_content": "string",
  • "popup_title": "string",
  • "title": "string"
}

检查弹框是否已读-交易工具

检查弹框是否已读

+
query Parameters
column_id
required
integer

栏目ID

+

Responses

Response samples

Content type
application/json
{
  • "is_read": true
}

标记弹框已读-交易工具

标记弹框已读

+
Request Body schema: application/json
column_id
required
integer

栏目ID

+

Responses

Request samples

Content type
application/json
{
  • "column_id": 0
}

Response samples

Content type
application/json
{ }

获取加密货币USDT可用网络-申请接口

获取加密货币USDT可用网络

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

基于货币对返回汇率-申请接口

基于货币对返回汇率

+
query Parameters
from_currency
required
string

源货币

+
to_currency
required
string

目标货币

+

Responses

Response samples

Content type
application/json
{
  • "exchange_rate": "string"
}

获取可用货币列表-申请接口

获取可用货币列表

+
query Parameters
remittance_id
required
integer

汇款方式ID

+
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

虚拟账户入金-申请接口

虚拟账户入金

+
Request Body schema: application/json
amount
required
string

金额

+
trading_account_id
required
integer

交易账号ID

+

Responses

Request samples

Content type
application/json
{
  • "amount": "string",
  • "trading_account_id": 0
}

Response samples

Content type
application/json
{ }

取消入金申请-申请接口

取消入金申请

+
Request Body schema: application/json
order_number
required
string

入金订单号

+

Responses

Request samples

Content type
application/json
{
  • "order_number": "string"
}

Response samples

Content type
application/json
{
  • "order_number": "string",
  • "status": "string"
}

获取可用的入金渠道-申请接口

获取可用的入金渠道

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

创建入金申请草稿-申请接口

创建入金申请草稿

+
Request Body schema: application/json
deposit_amount
required
string

入金金额

+
remark
string

备注,可选

+
remittance_id
required
integer

汇款方式id

+
trading_account_id
required
integer

入金交易账号id(用户关联的交易账号ID(多选一))

+

Responses

Request samples

Content type
application/json
{
  • "deposit_amount": "string",
  • "remark": "string",
  • "remittance_id": 0,
  • "trading_account_id": 0
}

Response samples

Content type
application/json
{
  • "order_number": "string",
  • "pay_data": "string",
  • "pay_type": "string",
  • "pay_url": "string",
  • "status": "string"
}

获取未提交入金申请草稿-申请接口

获取未提交入金申请草稿

+
query Parameters
order_number
required
string

入金订单号

+

Responses

Response samples

Content type
application/json
{
  • "account_info": "string",
  • "deposit_amount": "string",
  • "order_number": "string",
  • "receipt_url": "string"
}

获取未处理入金申请订单的数量-申请接口

获取未处理入金申请订单的数量

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "count": 0
}

提交入金申请(支付确认)-申请接口

提交入金申请(支付确认)

+
Request Body schema: application/json
order_number
required
string

入金订单号

+
receipt_url
required
string

收据图片地址

+

Responses

Request samples

Content type
application/json
{
  • "order_number": "string",
  • "receipt_url": "string"
}

Response samples

Content type
application/json
{
  • "order_number": "string",
  • "status": "string"
}

查询入金历史记录-申请接口

查询入金历史记录

+
query Parameters
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询出金历史记录-申请接口

查询出金历史记录

+
query Parameters
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取可用的汇率列表-申请接口

获取可用的汇率列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取可用的出金渠道-申请接口

获取可用的出金渠道

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

创建出金申请-申请接口

创建出金申请

+
Request Body schema: application/json
object

银行转账信息

+
object

加密货币信息

+
currency
required
string

交易货币类型

+
email_code
string

邮箱验证码

+
exchange_rate
required
string

汇率

+
fee
required
string

手续费

+
object

国际电汇信息

+
method
required
string

汇款方式

+
remark
string

备注

+
remittance_amount
required
string

汇款金额

+
remittance_id
required
integer

汇款id 获取支付方式、最高最低出金,手续费等信息

+
trading_account_id
required
integer

出金交易账号id

+
withdrawal_amount
required
string

出金金额

+

Responses

Request samples

Content type
application/json
{
  • "bank_transfer_info": {
    },
  • "cryptocurrency_info": {
    },
  • "currency": "string",
  • "email_code": "string",
  • "exchange_rate": "string",
  • "fee": "string",
  • "international_wire_info": {
    },
  • "method": "string",
  • "remark": "string",
  • "remittance_amount": "string",
  • "remittance_id": 0,
  • "trading_account_id": 0,
  • "withdrawal_amount": "string"
}

Response samples

Content type
application/json
{
  • "order_number": "string"
}

Client用户信息-客户接口

Client用户信息

+

Responses

Response samples

Content type
application/json
{
  • "agreement_status": "filling",
  • "apply_status": "filling",
  • "completed_module": [
    ],
  • "identity_status": "filling",
  • "kyc_approved_at": "string",
  • "kyc_data": {
    },
  • "kyc_status": "filling",
  • "kyc_way": "string",
  • "register_datetime": "string"
}

获取Client用户注册模板-客户接口

获取Client用户注册模板

+

Responses

Response samples

Content type
application/json
{
  • "agreement": {
    },
  • "apply_status": "pending",
  • "e_verify": {
    },
  • "identity": {
    },
  • "kyc": {
    },
  • "remark": "string"
}

注册Client用户-客户接口

注册Client用户(Client端接口)

+
Request Body schema: application/json
email
required
string
email_code
string

邮箱验证码

+
invite_code
string
password
required
string

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "email_code": "string",
  • "invite_code": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{
  • "token": "string",
  • "user_info": {
    }
}

保存Client用户身份信息-客户接口

保存Client用户身份信息

+
Request Body schema: application/json
current_module
required
string
Enum: "identity" "questionnaire" "family" "contact" "job" "authentication_accessory" "authentication" "agreement" "e_verify" "all"

当前模块: identity: 身份信息, questionnaire: 问卷调查, family: 家庭信息, contact: 联络信息, job: 工作信息, authentication_accessory: 证明文件, authentication: 认证信息, e_verify: 电子验证, all: 全部

+
required
object

当前需要提交保存的KYC数据, key1: {module_key}, key2: {field_key}

+

Responses

Request samples

Content type
application/json
{
  • "current_module": "identity",
  • "kyc_data": {
    }
}

Response samples

Content type
application/json
{ }

创建收款账户-申请接口

创建收款账户

+
Request Body schema: application/json
object

银行转账信息

+
object

加密货币信息

+
object

国际电汇信息

+
payment_method
required
string

必填:支付方式 international_wire_transfer|bank_transfer|cryptocurrency

+
remark
string

选填:备注

+

Responses

Request samples

Content type
application/json
{
  • "bank_transfer_info": {
    },
  • "cryptocurrency_info": {
    },
  • "international_wire_info": {
    },
  • "payment_method": "string",
  • "remark": "string"
}

Response samples

Content type
application/json
{
  • "id": 0
}

删除收款账户-申请接口

删除收款账户

+
Request Body schema: application/json
id
required
integer

账户ID

+

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

获取收款账户详情-申请接口

获取收款账户详情

+
query Parameters
id
required
integer

账户ID

+

Responses

Response samples

Content type
application/json
{
  • "account_holder_name": "string",
  • "bank_transfer_info": {
    },
  • "created_at": "string",
  • "cryptocurrency_info": {
    },
  • "id": 0,
  • "international_wire_info": {
    },
  • "payment_method": "string",
  • "remark": "string",
  • "updated_at": "string"
}

获取收款账户列表-申请接口

获取收款账户列表

+
query Parameters
payment_method
string

选填:筛选支付方式(international_wire_transfer|bank_transfer|cryptocurrency)

+
start_time
string

选填:创建开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

选填:创建结束时间(格式:YYYY-MM-DD HH:MM:SS)

+

Responses

Response samples

Content type
application/json
{
  • "bank_transfer": [
    ],
  • "cryptocurrency": [
    ],
  • "international_wire_transfer": [
    ],
  • "total": 0
}

更新收款账户-申请接口

更新收款账户

+
Request Body schema: application/json
object

银行转账信息(更新时提供)

+
object

加密货币信息(更新时提供)

+
id
required
integer

账户ID

+
object

国际电汇信息(更新时提供)

+
is_default
boolean

是否设置为默认账户(true-设为默认,false-取消默认,不传-不修改)

+
remark
string

备注

+

Responses

Request samples

Content type
application/json
{
  • "bank_transfer_info": {
    },
  • "cryptocurrency_info": {
    },
  • "id": 0,
  • "international_wire_info": {
    },
  • "is_default": true,
  • "remark": "string"
}

Response samples

Content type
application/json
{ }

入金报表导出-报表接口

入金报表导出

+
Request Body schema: application/json
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
status
required
string
Enum: "all" "auditing" "approved" "disapproved"

状态:all为全部(包含审核中和批准,不批准),auditing为审核中,approved为同意,disapproved为拒绝

+

Responses

Request samples

Content type
application/json
{
  • "end_time": "string",
  • "start_time": "string",
  • "status": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

入金报表-报表接口

入金报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
status
required
string
Enum: "all" "auditing" "approved" "disapproved"

状态:all为全部(包含审核中和批准,不批准),auditing为审核中,approved为批准,disapproved为拒绝

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出历史订单报表-报表接口

导出历史订单报表

+
Request Body schema: application/json
account
string

交易账号

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
order_number
string

订单号

+
page
required
integer
Default: 1

页码

+
server_id
integer

交易服务器ID

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
symbol
string

交易品种

+
time_type
string
Default: "open"
Enum: "open" "close"

时间类型,open为开仓时间,close为闭仓时间

+
trading_account_id
integer

交易账号的业务ID

+
trading_type
required
string
Enum: "all" "BUY" "SELL"

交易类型

+

Responses

Request samples

Content type
application/json
{
  • "account": "string",
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "server_id": 0,
  • "size": 20,
  • "start_time": "string",
  • "symbol": "string",
  • "time_type": "open",
  • "trading_account_id": 0,
  • "trading_type": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询历史订单报表-报表接口

查询历史订单报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
time_type
string
Default: "open"
Enum: "open" "close"

时间类型,open为开仓时间,close为闭仓时间

+
order_number
string

订单号

+
account
string

交易账号

+
trading_type
required
string
Enum: "all" "BUY" "SELL"

交易类型

+
symbol
string

交易品种

+
server_id
integer

交易服务器ID

+
trading_account_id
integer

交易账号的业务ID

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出持仓报表-报表接口

导出持仓报表

+
Request Body schema: application/json
account
string

交易账号

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
order_number
string

订单号

+
page
required
integer
Default: 1

页码

+
server_id
integer

交易服务器ID

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
symbol
string

交易品种

+
trading_account_id
integer

交易账号的业务ID

+
trading_type
required
string
Enum: "all" "BUY" "SELL"

交易类型

+

Responses

Request samples

Content type
application/json
{
  • "account": "string",
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "server_id": 0,
  • "size": 20,
  • "start_time": "string",
  • "symbol": "string",
  • "trading_account_id": 0,
  • "trading_type": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询持仓报表-报表接口

查询持仓报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
order_number
string

订单号

+
account
string

交易账号

+
trading_type
required
string
Enum: "all" "BUY" "SELL"

交易类型

+
symbol
string

交易品种

+
server_id
integer

交易服务器ID

+
trading_account_id
integer

交易账号的业务ID

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出挂单报表-报表接口

导出挂单报表

+
Request Body schema: application/json
account
string

交易账号

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
order_number
string

订单号

+
page
required
integer
Default: 1

页码

+
server_id
integer

交易服务器ID

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
symbol
string

交易品种

+
trading_account_id
integer

交易账号的业务ID

+
trading_type
required
string
Enum: "all" "BUY_LIMIT" "SELL_LIMIT" "BUY_STOP" "SELL_STOP" "BUY_STOP_LIMIT" "SELL_STOP_LIMIT"

交易类型

+

Responses

Request samples

Content type
application/json
{
  • "account": "string",
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "server_id": 0,
  • "size": 20,
  • "start_time": "string",
  • "symbol": "string",
  • "trading_account_id": 0,
  • "trading_type": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询挂单报表-报表接口

查询挂单报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
order_number
string

订单号

+
account
string

交易账号

+
trading_type
required
string
Enum: "all" "BUY_LIMIT" "SELL_LIMIT" "BUY_STOP" "SELL_STOP" "BUY_STOP_LIMIT" "SELL_STOP_LIMIT"

交易类型

+
symbol
string

交易品种

+
server_id
integer

交易服务器ID

+
trading_account_id
integer

交易账号的业务ID

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取交易服务器选项列表-报表接口

获取交易服务器选项列表

+
query Parameters
order_type
required
string
Enum: "holding" "history" "pending"

订单类型

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询用户交易过的品种列表-报表接口

查询用户交易过的品种列表

+
query Parameters
order_type
required
string
Enum: "holding" "history" "pending"

订单类型

+
server_id
integer

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出转账报表-报表接口

导出转账报表

+
Request Body schema: application/json
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
order_number
string

订单号

+
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
status
required
string
Enum: "all" "pending" "auditing" "approved" "disapproved"

审核状态:all为全部,pending为待审核,auditing为审核中,approved为批准,disapproved为拒绝

+

Responses

Request samples

Content type
application/json
{
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "size": 20,
  • "start_time": "string",
  • "status": "all"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询转账报表-报表接口

查询转账报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
order_number
string

订单号

+
status
required
string
Enum: "all" "pending" "auditing" "approved" "disapproved"

审核状态:all为全部,pending为待审核,auditing为审核中,approved为批准,disapproved为拒绝

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

申请交易账号-用户ID从token获取-交易接口

申请交易账号-用户ID从token获取

+
Request Body schema: application/json
currency
required
string
Value: "USD"

账户货币,目前只支持USD

+
is_demo
required
boolean

是否为模拟账户

+
leverage
required
integer

账户杠杆

+
observe_password
string

观摩密码

+
password
required
string

交易密码

+
trading_account_type_id
required
integer

交易账号类型ID

+
trading_platform
required
string
Enum: "MT4" "MT5"

交易平台,目前仅支持MT4

+

Responses

Request samples

Content type
application/json
{
  • "currency": "USD",
  • "is_demo": true,
  • "leverage": 0,
  • "observe_password": "string",
  • "password": "string",
  • "trading_account_type_id": 0,
  • "trading_platform": "MT4"
}

Response samples

Content type
application/json
{
  • "id": 0
}

查询交易账号-交易接口

查询交易账号

+
query Parameters
id
required
integer

交易账户的业务ID

+

Responses

Response samples

Content type
application/json
{
  • "account": "string",
  • "balance": "string",
  • "credit": "string",
  • "currency": "USD",
  • "equity": "string",
  • "id": 0,
  • "is_demo": true,
  • "leverage": 0,
  • "observe_password": "string",
  • "password": "string",
  • "server_name": "string",
  • "trading_account_type_name": "string",
  • "trading_platform": "MT4"
}

查询是否允许开通模拟账户-交易接口

查询是否允许开通模拟账户

+

Responses

Response samples

Content type
application/json
{
  • "enabled": true
}

查询交易账户可用杠杆-交易接口

查询交易账户可用杠杆

+
query Parameters
id
required
integer

交易账户的业务ID

+

Responses

Response samples

Content type
application/json
{
  • "leverage_options": [
    ]
}

查询交易账号杠杆更新状态-交易接口

查询交易账号杠杆更新状态

+
query Parameters
id
required
integer

交易账号的业务ID

+

Responses

Response samples

Content type
application/json
{
  • "audit_id": 0,
  • "audit_status": "string"
}

查询可用交易账号类型列表-通过token获取用户ID匹配注册流程再查询-交易接口

查询可用交易账号类型列表-通过token获取用户ID匹配注册流程再查询

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
is_demo
boolean
trading_platform
required
string
Enum: "MT4" "MT5"

交易平台

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询交易账号列表-交易接口

查询交易账号列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
is_demo
boolean

是否为模拟账户

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询交易账号选项列表-交易接口

查询交易账号选项列表

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取可用交易平台选项列表-交易接口

获取可用交易平台选项列表

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

更新交易账号杠杆-交易接口

更新交易账号杠杆

+
Request Body schema: application/json
id
required
integer

交易账号的业务ID

+
leverage
required
integer

杠杆

+
remark
required
string

注释

+

Responses

Request samples

Content type
application/json
{
  • "id": 0,
  • "leverage": 0,
  • "remark": "string"
}

Response samples

Content type
application/json
{ }

更新交易账号密码-交易接口

更新交易账号密码

+
Request Body schema: application/json
id
required
integer

交易账号的业务ID

+
password
required
string

密码

+
type
required
string
Enum: "observe" "trade"

密码类型:observe表示只读密码,trade表示交易密码

+

Responses

Request samples

Content type
application/json
{
  • "id": 0,
  • "password": "string",
  • "type": "observe"
}

Response samples

Content type
application/json
{ }

检查当前用户是否有待审核的出金订单-交易接口

检查当前用户是否有待审核的出金订单

+

Responses

Response samples

Content type
application/json
{
  • "has_pending": true
}

获取钱包余额-钱包管理

获取钱包余额

+

Responses

Response samples

Content type
application/json
{
  • "balance": "string"
}

查询钱包流水报表-报表接口

查询钱包流水报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
serial_number
string

钱包流水编号

+
order_number
string

交易订单号

+
account
string

交易账号

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出钱包流水报表-报表接口

导出钱包流水报表

+
Request Body schema: application/json
account
string

交易账号

+
end_time
string

自定义结束时间(格式:YYYY-MM-DD HH:MM:SS)

+
order_number
string

交易订单号

+
page
required
integer
Default: 1

页码

+
serial_number
string

钱包流水编号

+
size
required
integer
Default: 20

每页数量

+
start_time
string

自定义开始时间(格式:YYYY-MM-DD HH:MM:SS)

+

Responses

Request samples

Content type
application/json
{
  • "account": "string",
  • "end_time": "string",
  • "order_number": "string",
  • "page": 1,
  • "serial_number": "string",
  • "size": 20,
  • "start_time": "string"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

IB接口(19)

IB的Client详情-代理接口

IB的Client详情

+
query Parameters
client_user_id
required
integer

客户用户id

+

Responses

Response samples

Content type
application/json
{
  • "agreement_status": "filling",
  • "apply_status": "filling",
  • "completed_module": [
    ],
  • "identity_status": "filling",
  • "kyc_approved_at": "string",
  • "kyc_data": {
    },
  • "kyc_status": "filling",
  • "kyc_way": "string",
  • "register_datetime": "string"
}

IB的Client列表-代理接口

IB的Client列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
client_user_id
integer

客户用户ID

+
kyc_status
string
Enum: "approved" "disapproved"

KYC认证状态: approved: 已验证, disapproved: 未验证

+
status
string
Enum: "enabled" "disabled"

用户状态: enabled: 启用, disabled: 禁用

+
email
string

邮箱(模糊查询)

+
client_name
string

姓名(模糊查询)

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

IB端-面板数据-仪表盘接口

IB端-面板数据

+
query Parameters
date_type
string

日期类型

+

Responses

Response samples

Content type
application/json
{
  • "cards": {
    }
}

IB端-面板数据-获取最后更新时间-仪表盘接口

IB端-面板数据-获取最后更新时间

+

Responses

Response samples

Content type
application/json
{
  • "last_update_time": "string"
}

ib查看返佣记录-资金接口

ib查看返佣记录

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

消息详情-消息中心

消息详情

+
query Parameters
id
required
integer

消息ID

+

Responses

Response samples

Content type
application/json
{
  • "content": "string",
  • "created_at": "string",
  • "id": 0,
  • "sender": "string",
  • "title": "string"
}

隐藏消息-消息中心

隐藏消息

+
Request Body schema: application/json
id
required
integer

消息ID

+

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

消息列表-消息中心

消息列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

标记消息已读-消息中心

标记消息已读

+
Request Body schema: application/json
id
required
integer

消息ID

+

Responses

Request samples

Content type
application/json
{
  • "id": 0
}

Response samples

Content type
application/json
{ }

获取未读消息数量-消息中心

获取未读消息数量

+

Responses

Response samples

Content type
application/json
{
  • "count": 0
}

查询返佣账号列表-代理接口

查询返佣账号列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
account_id
string

交易账户在MT4的ID

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

更改返佣账户权限-代理接口

更改返佣账户权限

+
Request Body schema: application/json
enabled
required
boolean

是否启用权限

+
id
required
integer

交易账户的业务ID

+

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "id": 0
}

Response samples

Content type
application/json
{
  • "account": "string"
}

获取软件下载工具列表-代理接口

获取软件下载工具列表

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

查询客户交易账户列表-代理接口

查询客户交易账户列表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
user_name
string

姓名

+
account_id
string

交易账户在MT4的ID

+
trading_account_type_name
string

交易账号类型名称

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

获取IB用户信息-代理接口

获取IB用户信息

+

Responses

Response samples

Content type
application/json
{
  • "QRCodeURL": "string",
  • "ReferralCode": "string",
  • "ReferralLink": "string",
  • "agreement_status": "filling",
  • "apply_status": "filling",
  • "completed_module": [
    ],
  • "identity_status": "filling",
  • "kyc_approved_at": "string",
  • "kyc_data": {
    },
  • "kyc_status": "filling",
  • "kyc_way": "string",
  • "register_datetime": "string"
}

导出佣金明细报表-报表接口

导出佣金明细报表

+
Request Body schema: application/json
client_user_name
string

客户用户名

+
end_time
string

结束日期 (格式: YYYY-MM-DD)

+
rebate_aggregation_id
string
start_time
string

开始日期 (格式: YYYY-MM-DD)

+
time_search_type
string
Enum: "calculate_at" "grant_at"

Responses

Request samples

Content type
application/json
{
  • "client_user_name": "string",
  • "end_time": "string",
  • "rebate_aggregation_id": "string",
  • "start_time": "string",
  • "time_search_type": "calculate_at"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询佣金明细报表-报表接口

查询佣金明细报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
rebate_aggregation_id
integer
time_search_type
string
Enum: "calculate_at" "grant_at"
start_time
string

开始日期 (格式: YYYY-MM-DD)

+
end_time
string

结束日期 (格式: YYYY-MM-DD)

+
client_user_name
string

客户用户名

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}

导出佣金报表-报表接口

导出佣金报表

+
Request Body schema: application/json
end_time
string

自定义结束时间 (格式: YYYY-MM-DD HH:MM:SS)

+
start_time
string

自定义开始时间 (格式: YYYY-MM-DD HH:MM:SS)

+
time_search_type
string
Enum: "calculate_at" "grant_at"

Responses

Request samples

Content type
application/json
{
  • "end_time": "string",
  • "start_time": "string",
  • "time_search_type": "calculate_at"
}

Response samples

Content type
application/json
{
  • "download_url": "string"
}

查询佣金报表-报表接口

查询佣金报表

+
query Parameters
page
required
integer
Default: 1

页码

+
size
required
integer
Default: 20

每页数量

+
time_search_type
string
Enum: "calculate_at" "grant_at"
start_time
string

自定义开始时间 (格式: YYYY-MM-DD HH:MM:SS)

+
end_time
string

自定义结束时间 (格式: YYYY-MM-DD HH:MM:SS)

+

Responses

Response samples

Content type
application/json
{
  • "list": [
    ],
  • "total": 0
}