From b00f266e2319cb0a10b5e1c5a09e9cbf65ee722f Mon Sep 17 00:00:00 2001 From: LamGC Date: Tue, 21 Feb 2023 20:23:26 +0800 Subject: [PATCH] =?UTF-8?q?ci(github-action):=20=E5=90=AF=E7=94=A8=20API?= =?UTF-8?q?=20=E4=BA=8C=E8=BF=9B=E5=88=B6=E5=85=BC=E5=AE=B9=E6=80=A7?= =?UTF-8?q?=E9=AA=8C=E8=AF=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用二进制兼容验证, 可以快速了解 API 是否出现修改, 这个功能有利于防止无意中修改 API. 引入该过程后, 需谨慎检查 api 列表, 以确保改动是必须的. 当 api 出现改动时, 需按照改动类型分配合适的版本号(遵循 SemVer 规范). --- .../binary-compatibility-verification.yml | 36 ++++ scalabot-extension/api/scalabot-extension.api | 9 + scalabot-meta/api/scalabot-meta.api | 195 ++++++++++++++++++ 3 files changed, 240 insertions(+) create mode 100644 .github/workflows/binary-compatibility-verification.yml create mode 100644 scalabot-extension/api/scalabot-extension.api create mode 100644 scalabot-meta/api/scalabot-meta.api diff --git a/.github/workflows/binary-compatibility-verification.yml b/.github/workflows/binary-compatibility-verification.yml new file mode 100644 index 0000000..9f9ff72 --- /dev/null +++ b/.github/workflows/binary-compatibility-verification.yml @@ -0,0 +1,36 @@ +name: Binary compatibility verification (for API) + +on: + push: + paths: + - 'scalabot-meta/**' + - 'scalabot-extension/**' + pull_request: + paths: + - 'scalabot-meta/**' + - 'scalabot-extension/**' + +permissions: + contents: read + +jobs: + apiCompatibilityCheck: + timeout-minutes: 8 + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'adopt-hotspot' + cache: 'gradle' + - uses: gradle/wrapper-validation-action@v1 + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build and run binary compatibility verification + uses: gradle/gradle-build-action@v2.4.0 + with: + gradle-version: 'wrapper' + arguments: apiCheck diff --git a/scalabot-extension/api/scalabot-extension.api b/scalabot-extension/api/scalabot-extension.api new file mode 100644 index 0000000..1720928 --- /dev/null +++ b/scalabot-extension/api/scalabot-extension.api @@ -0,0 +1,9 @@ +public abstract interface class net/lamgc/scalabot/extension/BotExtensionFactory { + public abstract fun createExtensionInstance (Lorg/telegram/abilitybots/api/bot/BaseAbilityBot;Ljava/io/File;)Lorg/telegram/abilitybots/api/util/AbilityExtension; +} + +public class net/lamgc/scalabot/extension/util/AbilityBots { + public static fun cancelReplyState (Lorg/telegram/abilitybots/api/bot/BaseAbilityBot;J)Z + public static fun getBotAccountId (Lorg/telegram/abilitybots/api/bot/BaseAbilityBot;)J +} + diff --git a/scalabot-meta/api/scalabot-meta.api b/scalabot-meta/api/scalabot-meta.api new file mode 100644 index 0000000..cc8e3a2 --- /dev/null +++ b/scalabot-meta/api/scalabot-meta.api @@ -0,0 +1,195 @@ +public final class net/lamgc/scalabot/config/AppConfig { + public fun ()V + public fun (Lnet/lamgc/scalabot/config/ProxyConfig;Lnet/lamgc/scalabot/config/MetricsConfig;Ljava/util/List;Ljava/lang/String;)V + public synthetic fun (Lnet/lamgc/scalabot/config/ProxyConfig;Lnet/lamgc/scalabot/config/MetricsConfig;Ljava/util/List;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lnet/lamgc/scalabot/config/ProxyConfig; + public final fun component2 ()Lnet/lamgc/scalabot/config/MetricsConfig; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/lang/String; + public final fun copy (Lnet/lamgc/scalabot/config/ProxyConfig;Lnet/lamgc/scalabot/config/MetricsConfig;Ljava/util/List;Ljava/lang/String;)Lnet/lamgc/scalabot/config/AppConfig; + public static synthetic fun copy$default (Lnet/lamgc/scalabot/config/AppConfig;Lnet/lamgc/scalabot/config/ProxyConfig;Lnet/lamgc/scalabot/config/MetricsConfig;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lnet/lamgc/scalabot/config/AppConfig; + public fun equals (Ljava/lang/Object;)Z + public final fun getMavenLocalRepository ()Ljava/lang/String; + public final fun getMavenRepositories ()Ljava/util/List; + public final fun getMetrics ()Lnet/lamgc/scalabot/config/MetricsConfig; + public final fun getProxy ()Lnet/lamgc/scalabot/config/ProxyConfig; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class net/lamgc/scalabot/config/BotAccount { + public fun (Ljava/lang/String;Ljava/lang/String;J)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()J + public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lnet/lamgc/scalabot/config/BotAccount; + public static synthetic fun copy$default (Lnet/lamgc/scalabot/config/BotAccount;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lnet/lamgc/scalabot/config/BotAccount; + public fun equals (Ljava/lang/Object;)Z + public final fun getCreatorId ()J + public final fun getId ()J + public final fun getName ()Ljava/lang/String; + public final fun getToken ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class net/lamgc/scalabot/config/BotConfig { + public fun (ZLnet/lamgc/scalabot/config/BotAccount;ZZLjava/util/Set;Lnet/lamgc/scalabot/config/ProxyConfig;Ljava/lang/String;)V + public synthetic fun (ZLnet/lamgc/scalabot/config/BotAccount;ZZLjava/util/Set;Lnet/lamgc/scalabot/config/ProxyConfig;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Z + public final fun component2 ()Lnet/lamgc/scalabot/config/BotAccount; + public final fun component3 ()Z + public final fun component4 ()Z + public final fun component5 ()Ljava/util/Set; + public final fun component6 ()Lnet/lamgc/scalabot/config/ProxyConfig; + public final fun component7 ()Ljava/lang/String; + public final fun copy (ZLnet/lamgc/scalabot/config/BotAccount;ZZLjava/util/Set;Lnet/lamgc/scalabot/config/ProxyConfig;Ljava/lang/String;)Lnet/lamgc/scalabot/config/BotConfig; + public static synthetic fun copy$default (Lnet/lamgc/scalabot/config/BotConfig;ZLnet/lamgc/scalabot/config/BotAccount;ZZLjava/util/Set;Lnet/lamgc/scalabot/config/ProxyConfig;Ljava/lang/String;ILjava/lang/Object;)Lnet/lamgc/scalabot/config/BotConfig; + public fun equals (Ljava/lang/Object;)Z + public final fun getAccount ()Lnet/lamgc/scalabot/config/BotAccount; + public final fun getAutoUpdateCommandList ()Z + public final fun getBaseApiUrl ()Ljava/lang/String; + public final fun getDisableBuiltInAbility ()Z + public final fun getEnabled ()Z + public final fun getExtensions ()Ljava/util/Set; + public final fun getProxy ()Lnet/lamgc/scalabot/config/ProxyConfig; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class net/lamgc/scalabot/config/MavenRepositoryConfig { + public fun (Ljava/lang/String;Ljava/net/URL;Lorg/eclipse/aether/repository/Proxy;Ljava/lang/String;ZZLorg/eclipse/aether/repository/Authentication;)V + public synthetic fun (Ljava/lang/String;Ljava/net/URL;Lorg/eclipse/aether/repository/Proxy;Ljava/lang/String;ZZLorg/eclipse/aether/repository/Authentication;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/net/URL; + public final fun component3 ()Lorg/eclipse/aether/repository/Proxy; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Z + public final fun component6 ()Z + public final fun component7 ()Lorg/eclipse/aether/repository/Authentication; + public final fun copy (Ljava/lang/String;Ljava/net/URL;Lorg/eclipse/aether/repository/Proxy;Ljava/lang/String;ZZLorg/eclipse/aether/repository/Authentication;)Lnet/lamgc/scalabot/config/MavenRepositoryConfig; + public static synthetic fun copy$default (Lnet/lamgc/scalabot/config/MavenRepositoryConfig;Ljava/lang/String;Ljava/net/URL;Lorg/eclipse/aether/repository/Proxy;Ljava/lang/String;ZZLorg/eclipse/aether/repository/Authentication;ILjava/lang/Object;)Lnet/lamgc/scalabot/config/MavenRepositoryConfig; + public fun equals (Ljava/lang/Object;)Z + public final fun getAuthentication ()Lorg/eclipse/aether/repository/Authentication; + public final fun getEnableReleases ()Z + public final fun getEnableSnapshots ()Z + public final fun getId ()Ljava/lang/String; + public final fun getLayout ()Ljava/lang/String; + public final fun getProxy ()Lorg/eclipse/aether/repository/Proxy; + public final fun getUrl ()Ljava/net/URL; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class net/lamgc/scalabot/config/MetricsConfig { + public fun ()V + public fun (ZILjava/lang/String;Lnet/lamgc/scalabot/config/UsernameAuthenticator;)V + public synthetic fun (ZILjava/lang/String;Lnet/lamgc/scalabot/config/UsernameAuthenticator;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Z + public final fun component2 ()I + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lnet/lamgc/scalabot/config/UsernameAuthenticator; + public final fun copy (ZILjava/lang/String;Lnet/lamgc/scalabot/config/UsernameAuthenticator;)Lnet/lamgc/scalabot/config/MetricsConfig; + public static synthetic fun copy$default (Lnet/lamgc/scalabot/config/MetricsConfig;ZILjava/lang/String;Lnet/lamgc/scalabot/config/UsernameAuthenticator;ILjava/lang/Object;)Lnet/lamgc/scalabot/config/MetricsConfig; + public fun equals (Ljava/lang/Object;)Z + public final fun getAuthenticator ()Lnet/lamgc/scalabot/config/UsernameAuthenticator; + public final fun getBindAddress ()Ljava/lang/String; + public final fun getEnable ()Z + public final fun getPort ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class net/lamgc/scalabot/config/ProxyConfig { + public fun ()V + public fun (Lnet/lamgc/scalabot/config/ProxyType;Ljava/lang/String;I)V + public synthetic fun (Lnet/lamgc/scalabot/config/ProxyType;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lnet/lamgc/scalabot/config/ProxyType; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()I + public final fun copy (Lnet/lamgc/scalabot/config/ProxyType;Ljava/lang/String;I)Lnet/lamgc/scalabot/config/ProxyConfig; + public static synthetic fun copy$default (Lnet/lamgc/scalabot/config/ProxyConfig;Lnet/lamgc/scalabot/config/ProxyType;Ljava/lang/String;IILjava/lang/Object;)Lnet/lamgc/scalabot/config/ProxyConfig; + public fun equals (Ljava/lang/Object;)Z + public final fun getHost ()Ljava/lang/String; + public final fun getPort ()I + public final fun getType ()Lnet/lamgc/scalabot/config/ProxyType; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class net/lamgc/scalabot/config/ProxyType : java/lang/Enum { + public static final field HTTP Lnet/lamgc/scalabot/config/ProxyType; + public static final field HTTPS Lnet/lamgc/scalabot/config/ProxyType; + public static final field NO_PROXY Lnet/lamgc/scalabot/config/ProxyType; + public static final field SOCKS4 Lnet/lamgc/scalabot/config/ProxyType; + public static final field SOCKS5 Lnet/lamgc/scalabot/config/ProxyType; + public static fun valueOf (Ljava/lang/String;)Lnet/lamgc/scalabot/config/ProxyType; + public static fun values ()[Lnet/lamgc/scalabot/config/ProxyType; +} + +public final class net/lamgc/scalabot/config/UsernameAuthenticator : com/sun/net/httpserver/BasicAuthenticator { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public fun checkCredentials (Ljava/lang/String;Ljava/lang/String;)Z + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public final fun toJsonObject ()Lcom/google/gson/JsonObject; +} + +public final class net/lamgc/scalabot/config/serializer/ArtifactSerializer : com/google/gson/JsonDeserializer, com/google/gson/JsonSerializer { + public static final field INSTANCE Lnet/lamgc/scalabot/config/serializer/ArtifactSerializer; + public synthetic fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Ljava/lang/Object; + public fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lorg/eclipse/aether/artifact/Artifact; + public synthetic fun serialize (Ljava/lang/Object;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; + public fun serialize (Lorg/eclipse/aether/artifact/Artifact;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; +} + +public final class net/lamgc/scalabot/config/serializer/AuthenticationSerializer : com/google/gson/JsonDeserializer { + public static final field INSTANCE Lnet/lamgc/scalabot/config/serializer/AuthenticationSerializer; + public synthetic fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Ljava/lang/Object; + public fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lorg/eclipse/aether/repository/Authentication; +} + +public final class net/lamgc/scalabot/config/serializer/BotAccountSerializer : com/google/gson/JsonDeserializer { + public static final field INSTANCE Lnet/lamgc/scalabot/config/serializer/BotAccountSerializer; + public synthetic fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Ljava/lang/Object; + public fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/lamgc/scalabot/config/BotAccount; +} + +public final class net/lamgc/scalabot/config/serializer/BotConfigSerializer : com/google/gson/JsonDeserializer, com/google/gson/JsonSerializer { + public static final field INSTANCE Lnet/lamgc/scalabot/config/serializer/BotConfigSerializer; + public synthetic fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Ljava/lang/Object; + public fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/lamgc/scalabot/config/BotConfig; + public synthetic fun serialize (Ljava/lang/Object;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; + public fun serialize (Lnet/lamgc/scalabot/config/BotConfig;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; +} + +public final class net/lamgc/scalabot/config/serializer/MavenRepositoryConfigSerializer : com/google/gson/JsonDeserializer { + public static final field INSTANCE Lnet/lamgc/scalabot/config/serializer/MavenRepositoryConfigSerializer; + public synthetic fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Ljava/lang/Object; + public fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/lamgc/scalabot/config/MavenRepositoryConfig; +} + +public final class net/lamgc/scalabot/config/serializer/ProxyConfigSerializer : com/google/gson/JsonDeserializer, com/google/gson/JsonSerializer { + public static final field INSTANCE Lnet/lamgc/scalabot/config/serializer/ProxyConfigSerializer; + public synthetic fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Ljava/lang/Object; + public fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/lamgc/scalabot/config/ProxyConfig; + public synthetic fun serialize (Ljava/lang/Object;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; + public fun serialize (Lnet/lamgc/scalabot/config/ProxyConfig;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; +} + +public final class net/lamgc/scalabot/config/serializer/ProxyTypeSerializer : com/google/gson/JsonDeserializer, com/google/gson/JsonSerializer { + public static final field INSTANCE Lnet/lamgc/scalabot/config/serializer/ProxyTypeSerializer; + public synthetic fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Ljava/lang/Object; + public fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/lamgc/scalabot/config/ProxyType; + public synthetic fun serialize (Ljava/lang/Object;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; + public fun serialize (Lnet/lamgc/scalabot/config/ProxyType;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; +} + +public final class net/lamgc/scalabot/config/serializer/UsernameAuthenticatorSerializer : com/google/gson/JsonDeserializer, com/google/gson/JsonSerializer { + public static final field INSTANCE Lnet/lamgc/scalabot/config/serializer/UsernameAuthenticatorSerializer; + public synthetic fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Ljava/lang/Object; + public fun deserialize (Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/lamgc/scalabot/config/UsernameAuthenticator; + public synthetic fun serialize (Ljava/lang/Object;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; + public fun serialize (Lnet/lamgc/scalabot/config/UsernameAuthenticator;Ljava/lang/reflect/Type;Lcom/google/gson/JsonSerializationContext;)Lcom/google/gson/JsonElement; +} +