mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-10 18:40:15 +08:00
Deploy SemVersion
This commit is contained in:
parent
a6411005f5
commit
eb7cd3811d
@ -101,8 +101,8 @@ tasks {
|
|||||||
})"""
|
})"""
|
||||||
}
|
}
|
||||||
.replace(
|
.replace(
|
||||||
Regex("""val version: Semver = Semver\(".*", Semver.SemverType.LOOSE\)""")
|
Regex("""val version: SemVersion = SemVersion.parse\(".*"\)""")
|
||||||
) { """val version: Semver = Semver("${project.version}", Semver.SemverType.LOOSE)""" }
|
) { """val version: SemVersion = SemVersion.parse("${project.version}")""" }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console
|
package net.mamoe.mirai.console
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import net.mamoe.mirai.Bot
|
import net.mamoe.mirai.Bot
|
||||||
@ -29,6 +28,7 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
|||||||
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
||||||
import net.mamoe.mirai.console.util.ConsoleInternalApi
|
import net.mamoe.mirai.console.util.ConsoleInternalApi
|
||||||
import net.mamoe.mirai.console.util.CoroutineScopeUtils.childScopeContext
|
import net.mamoe.mirai.console.util.CoroutineScopeUtils.childScopeContext
|
||||||
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
import net.mamoe.mirai.utils.BotConfiguration
|
import net.mamoe.mirai.utils.BotConfiguration
|
||||||
import net.mamoe.mirai.utils.MiraiLogger
|
import net.mamoe.mirai.utils.MiraiLogger
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@ -79,7 +79,7 @@ public interface MiraiConsole : CoroutineScope {
|
|||||||
/**
|
/**
|
||||||
* 此 Console 后端版本号
|
* 此 Console 后端版本号
|
||||||
*/
|
*/
|
||||||
public val version: Semver
|
public val version: SemVersion
|
||||||
|
|
||||||
|
|
||||||
@ConsoleExperimentalApi
|
@ConsoleExperimentalApi
|
||||||
|
@ -9,7 +9,8 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console
|
package net.mamoe.mirai.console
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 有关前端实现的信息
|
* 有关前端实现的信息
|
||||||
@ -28,7 +29,7 @@ public interface MiraiConsoleFrontEndDescription {
|
|||||||
/**
|
/**
|
||||||
* 此前端实现的名称
|
* 此前端实现的名称
|
||||||
*/
|
*/
|
||||||
public val version: Semver
|
public val version: SemVersion
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 兼容的 [MiraiConsole] 后端版本号
|
* 兼容的 [MiraiConsole] 后端版本号
|
||||||
@ -37,7 +38,7 @@ public interface MiraiConsoleFrontEndDescription {
|
|||||||
*
|
*
|
||||||
* 返回 `null` 表示禁止 [MiraiConsole] 后端检查版本兼容性.
|
* 返回 `null` 表示禁止 [MiraiConsole] 后端检查版本兼容性.
|
||||||
*/
|
*/
|
||||||
public val compatibleBackendVersion: Semver? get() = null
|
public val compatibleBackendVersion: SemVersion? get() = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 返回显示在 [MiraiConsole] 启动时的信息
|
* 返回显示在 [MiraiConsole] 启动时的信息
|
||||||
|
@ -9,13 +9,13 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console.internal
|
package net.mamoe.mirai.console.internal
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|
||||||
internal object MiraiConsoleBuildConstants { // auto-filled on build (task :mirai-console:fillBuildConstants)
|
internal object MiraiConsoleBuildConstants { // auto-filled on build (task :mirai-console:fillBuildConstants)
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
val buildDate: Instant = Instant.ofEpochSecond(1600522812)
|
val buildDate: Instant = Instant.ofEpochSecond(1600596035)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
val version: Semver = Semver("1.0-RC-dev-28", Semver.SemverType.LOOSE)
|
val version: SemVersion = SemVersion.parse("1.0-RC-dev-28")
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console.internal
|
package net.mamoe.mirai.console.internal
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
|
||||||
import kotlinx.coroutines.CoroutineExceptionHandler
|
import kotlinx.coroutines.CoroutineExceptionHandler
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
@ -47,6 +46,7 @@ import net.mamoe.mirai.console.plugin.jvm.AbstractJvmPlugin
|
|||||||
import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
||||||
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
||||||
import net.mamoe.mirai.console.util.ConsoleInput
|
import net.mamoe.mirai.console.util.ConsoleInput
|
||||||
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
import net.mamoe.mirai.utils.*
|
import net.mamoe.mirai.utils.*
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
@ -66,7 +66,7 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI
|
|||||||
|
|
||||||
private val instance: MiraiConsoleImplementation by MiraiConsoleImplementation.Companion::instance
|
private val instance: MiraiConsoleImplementation by MiraiConsoleImplementation.Companion::instance
|
||||||
override val buildDate: Instant by MiraiConsoleBuildConstants::buildDate
|
override val buildDate: Instant by MiraiConsoleBuildConstants::buildDate
|
||||||
override val version: Semver by MiraiConsoleBuildConstants::version
|
override val version: SemVersion by MiraiConsoleBuildConstants::version
|
||||||
override val rootPath: Path by instance::rootPath
|
override val rootPath: Path by instance::rootPath
|
||||||
override val frontEndDescription: MiraiConsoleFrontEndDescription by instance::frontEndDescription
|
override val frontEndDescription: MiraiConsoleFrontEndDescription by instance::frontEndDescription
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoadException
|
|||||||
import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
||||||
import net.mamoe.mirai.console.plugin.name
|
import net.mamoe.mirai.console.plugin.name
|
||||||
import net.mamoe.mirai.console.util.CoroutineScopeUtils.childScope
|
import net.mamoe.mirai.console.util.CoroutineScopeUtils.childScope
|
||||||
|
import net.mamoe.mirai.console.util.SemVersion.Companion.contains
|
||||||
import net.mamoe.mirai.utils.info
|
import net.mamoe.mirai.utils.info
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console.plugin
|
package net.mamoe.mirai.console.plugin
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
|
||||||
import net.mamoe.mirai.console.command.CommandOwner
|
import net.mamoe.mirai.console.command.CommandOwner
|
||||||
import net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.disable
|
import net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.disable
|
||||||
import net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.enable
|
import net.mamoe.mirai.console.plugin.PluginManager.INSTANCE.enable
|
||||||
@ -20,6 +19,7 @@ import net.mamoe.mirai.console.plugin.description.PluginDependency
|
|||||||
import net.mamoe.mirai.console.plugin.description.PluginDescription
|
import net.mamoe.mirai.console.plugin.description.PluginDescription
|
||||||
import net.mamoe.mirai.console.plugin.jvm.JvmPlugin
|
import net.mamoe.mirai.console.plugin.jvm.JvmPlugin
|
||||||
import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
||||||
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 表示一个 mirai-console 插件.
|
* 表示一个 mirai-console 插件.
|
||||||
@ -62,7 +62,7 @@ public inline val Plugin.name: String get() = this.description.name
|
|||||||
/**
|
/**
|
||||||
* 获取 [PluginDescription.version]
|
* 获取 [PluginDescription.version]
|
||||||
*/
|
*/
|
||||||
public inline val Plugin.version: Semver get() = this.description.version
|
public inline val Plugin.version: SemVersion get() = this.description.version
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取 [PluginDescription.info]
|
* 获取 [PluginDescription.info]
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console.plugin.description
|
package net.mamoe.mirai.console.plugin.description
|
||||||
|
|
||||||
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 插件的一个依赖的信息.
|
* 插件的一个依赖的信息.
|
||||||
*
|
*
|
||||||
@ -29,7 +31,7 @@ public data class PluginDependency @JvmOverloads constructor(
|
|||||||
* ### 示例
|
* ### 示例
|
||||||
* `Requirement.buildIvy("[1.0, 2.0)")`
|
* `Requirement.buildIvy("[1.0, 2.0)")`
|
||||||
*/
|
*/
|
||||||
public val versionRequirement: VersionRequirement? = null,
|
public val versionRequirement: SemVersion.RangeRequirement? = null,
|
||||||
/**
|
/**
|
||||||
* 若为 `false`, 插件在找不到此依赖时也能正常加载.
|
* 若为 `false`, 插件在找不到此依赖时也能正常加载.
|
||||||
*/
|
*/
|
||||||
|
@ -9,10 +9,10 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console.plugin.description
|
package net.mamoe.mirai.console.plugin.description
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
|
||||||
import net.mamoe.mirai.console.compiler.common.ResolveContext
|
import net.mamoe.mirai.console.compiler.common.ResolveContext
|
||||||
import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.*
|
import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.*
|
||||||
import net.mamoe.mirai.console.plugin.Plugin
|
import net.mamoe.mirai.console.plugin.Plugin
|
||||||
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -93,7 +93,7 @@ public interface PluginDescription {
|
|||||||
* @see Semver 语义化版本. 允许 [宽松][Semver.SemverType.LOOSE] 类型版本.
|
* @see Semver 语义化版本. 允许 [宽松][Semver.SemverType.LOOSE] 类型版本.
|
||||||
*/
|
*/
|
||||||
@ResolveContext(PLUGIN_VERSION)
|
@ResolveContext(PLUGIN_VERSION)
|
||||||
public val version: Semver
|
public val version: SemVersion
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 插件信息, 允许为空
|
* 插件信息, 允许为空
|
||||||
|
@ -1,242 +0,0 @@
|
|||||||
package net.mamoe.mirai.console.plugin.description
|
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Requirement
|
|
||||||
import com.vdurmont.semver4j.Semver
|
|
||||||
|
|
||||||
public sealed class VersionRequirement {
|
|
||||||
public abstract operator fun contains(version: Semver): Boolean
|
|
||||||
public fun contains(version: String): Boolean = contains(Semver(version, Semver.SemverType.LOOSE))
|
|
||||||
|
|
||||||
public class Exact
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
constructor(
|
|
||||||
version: Semver,
|
|
||||||
) : VersionRequirement() {
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
public val version: Semver = version.toStrict()
|
|
||||||
|
|
||||||
@Suppress("DEPRECATION_ERROR")
|
|
||||||
public constructor(version: String) : this(Semver(version, Semver.SemverType.LOOSE))
|
|
||||||
|
|
||||||
@Suppress("DEPRECATION_ERROR")
|
|
||||||
override fun contains(version: Semver): Boolean = this.version.isEquivalentTo(version.toStrict())
|
|
||||||
}
|
|
||||||
|
|
||||||
public data class MatchesNpmPattern(
|
|
||||||
val pattern: String,
|
|
||||||
) : VersionRequirement() {
|
|
||||||
private val requirement = Requirement.buildNPM(pattern)
|
|
||||||
override fun contains(version: Semver): Boolean = requirement.isSatisfiedBy(version.toStrict())
|
|
||||||
}
|
|
||||||
|
|
||||||
public data class MatchesIvyPattern(
|
|
||||||
val pattern: String,
|
|
||||||
) : VersionRequirement() {
|
|
||||||
private val requirement = Requirement.buildIvy(pattern)
|
|
||||||
override fun contains(version: Semver): Boolean = requirement.isSatisfiedBy(version.toStrict())
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public data class MatchesCocoapodsPattern(
|
|
||||||
val pattern: String,
|
|
||||||
) : VersionRequirement() {
|
|
||||||
private val requirement = Requirement.buildCocoapods(pattern)
|
|
||||||
override fun contains(version: Semver): Boolean = requirement.isSatisfiedBy(version.toStrict())
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class Custom : VersionRequirement()
|
|
||||||
|
|
||||||
@Suppress("MemberVisibilityCanBePrivate")
|
|
||||||
public class InRange(
|
|
||||||
begin: Semver,
|
|
||||||
public val beginInclusive: Boolean,
|
|
||||||
end: Semver,
|
|
||||||
public val endInclusive: Boolean,
|
|
||||||
) : VersionRequirement() {
|
|
||||||
public val end: Semver = end.toStrict()
|
|
||||||
public val begin: Semver = begin.toStrict()
|
|
||||||
|
|
||||||
public constructor(
|
|
||||||
begin: String,
|
|
||||||
beginInclusive: Boolean,
|
|
||||||
end: Semver,
|
|
||||||
endInclusive: Boolean,
|
|
||||||
) : this(Semver(begin, Semver.SemverType.LOOSE), beginInclusive, end, endInclusive)
|
|
||||||
|
|
||||||
public constructor(
|
|
||||||
begin: String,
|
|
||||||
beginInclusive: Boolean,
|
|
||||||
end: String,
|
|
||||||
endInclusive: Boolean,
|
|
||||||
) : this(Semver(begin, Semver.SemverType.LOOSE),
|
|
||||||
beginInclusive,
|
|
||||||
Semver(end, Semver.SemverType.LOOSE),
|
|
||||||
endInclusive)
|
|
||||||
|
|
||||||
public constructor(
|
|
||||||
begin: Semver,
|
|
||||||
beginInclusive: Boolean,
|
|
||||||
end: String,
|
|
||||||
endInclusive: Boolean,
|
|
||||||
) : this(begin, beginInclusive, Semver(end, Semver.SemverType.LOOSE), endInclusive)
|
|
||||||
|
|
||||||
override fun contains(version: Semver): Boolean {
|
|
||||||
val strict = version.toStrict()
|
|
||||||
return if (beginInclusive) {
|
|
||||||
strict.isGreaterThanOrEqualTo(begin)
|
|
||||||
} else {
|
|
||||||
strict.isGreaterThan(begin)
|
|
||||||
} && if (endInclusive) {
|
|
||||||
strict.isLowerThanOrEqualTo(end)
|
|
||||||
} else {
|
|
||||||
strict.isLowerThan(end)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String {
|
|
||||||
return buildString {
|
|
||||||
append(if (beginInclusive) "[" else "(")
|
|
||||||
append(begin)
|
|
||||||
append(",")
|
|
||||||
append(end)
|
|
||||||
append(if (endInclusive) "]" else ")")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Suppress("unused", "DeprecatedCallableAddReplaceWith")
|
|
||||||
public class Builder {
|
|
||||||
@Suppress("DEPRECATION_ERROR")
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun exact(version: Semver): VersionRequirement = Exact(version)
|
|
||||||
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun exact(version: String): VersionRequirement = Exact(version)
|
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun custom(checker: (version: Semver) -> Boolean): VersionRequirement {
|
|
||||||
return object : Custom() {
|
|
||||||
override fun contains(version: Semver): Boolean = checker(version)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see Semver.SemverType.NPM
|
|
||||||
*/
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun npmPattern(versionPattern: String): VersionRequirement {
|
|
||||||
return MatchesNpmPattern(versionPattern)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see Semver.SemverType.IVY
|
|
||||||
*/
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun ivyPattern(versionPattern: String): VersionRequirement {
|
|
||||||
return MatchesIvyPattern(versionPattern)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see Semver.SemverType.COCOAPODS
|
|
||||||
*/
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun cocoapodsPattern(versionPattern: String): VersionRequirement {
|
|
||||||
return MatchesCocoapodsPattern(versionPattern)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun range(
|
|
||||||
begin: Semver,
|
|
||||||
beginInclusive: Boolean,
|
|
||||||
end: Semver,
|
|
||||||
endInclusive: Boolean,
|
|
||||||
): VersionRequirement = InRange(begin, beginInclusive, end, endInclusive)
|
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun range(
|
|
||||||
begin: String,
|
|
||||||
beginInclusive: Boolean,
|
|
||||||
end: Semver,
|
|
||||||
endInclusive: Boolean,
|
|
||||||
): VersionRequirement = InRange(begin, beginInclusive, end, endInclusive)
|
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun range(
|
|
||||||
begin: Semver,
|
|
||||||
beginInclusive: Boolean,
|
|
||||||
end: String,
|
|
||||||
endInclusive: Boolean,
|
|
||||||
): VersionRequirement = InRange(begin, beginInclusive, end, endInclusive)
|
|
||||||
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public fun range(
|
|
||||||
begin: String,
|
|
||||||
beginInclusive: Boolean,
|
|
||||||
end: String,
|
|
||||||
endInclusive: Boolean,
|
|
||||||
): VersionRequirement = InRange(begin, beginInclusive, end, endInclusive)
|
|
||||||
|
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public operator fun Semver.rangeTo(endInclusive: Semver): VersionRequirement {
|
|
||||||
return InRange(this, true, endInclusive, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public operator fun Semver.rangeTo(endInclusive: String): VersionRequirement {
|
|
||||||
return InRange(this, true, Semver(endInclusive, Semver.SemverType.LOOSE), true)
|
|
||||||
}
|
|
||||||
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public operator fun String.rangeTo(endInclusive: String): VersionRequirement {
|
|
||||||
return InRange(Semver(this, Semver.SemverType.LOOSE),
|
|
||||||
true,
|
|
||||||
Semver(endInclusive, Semver.SemverType.LOOSE),
|
|
||||||
true)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public operator fun String.rangeTo(endInclusive: Semver): VersionRequirement {
|
|
||||||
return InRange(Semver(this, Semver.SemverType.LOOSE), true, endInclusive, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public infix fun Semver.until(endExclusive: Semver): VersionRequirement {
|
|
||||||
return InRange(this, true, endExclusive, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public infix fun Semver.until(endExclusive: String): VersionRequirement {
|
|
||||||
return InRange(this, true, Semver(endExclusive, Semver.SemverType.LOOSE), false)
|
|
||||||
}
|
|
||||||
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public infix fun String.until(endExclusive: String): VersionRequirement {
|
|
||||||
return InRange(Semver(this, Semver.SemverType.LOOSE),
|
|
||||||
true,
|
|
||||||
Semver(endExclusive, Semver.SemverType.LOOSE),
|
|
||||||
false)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKafuuChinoForever
|
|
||||||
public infix fun String.until(endExclusive: Semver): VersionRequirement {
|
|
||||||
return InRange(Semver(this, Semver.SemverType.LOOSE), true, endExclusive, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("SpellCheckingInspection")
|
|
||||||
@Retention(AnnotationRetention.BINARY)
|
|
||||||
@DslMarker
|
|
||||||
internal annotation class ILoveKafuuChinoForever
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,12 +11,12 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console.plugin.jvm
|
package net.mamoe.mirai.console.plugin.jvm
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
|
||||||
import net.mamoe.mirai.console.compiler.common.ResolveContext
|
import net.mamoe.mirai.console.compiler.common.ResolveContext
|
||||||
import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.*
|
import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.*
|
||||||
import net.mamoe.mirai.console.plugin.description.PluginDependency
|
import net.mamoe.mirai.console.plugin.description.PluginDependency
|
||||||
import net.mamoe.mirai.console.plugin.description.PluginDescription
|
import net.mamoe.mirai.console.plugin.description.PluginDescription
|
||||||
import net.mamoe.mirai.console.plugin.description.VersionRequirement
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
|
import net.mamoe.mirai.console.util.SemVersionRangeRequirementBuilder
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JVM 插件的描述. 通常作为 `plugin.yml`
|
* JVM 插件的描述. 通常作为 `plugin.yml`
|
||||||
@ -66,7 +66,7 @@ public interface JvmPluginDescription : PluginDescription {
|
|||||||
/**
|
/**
|
||||||
* @see [PluginDescription.version]
|
* @see [PluginDescription.version]
|
||||||
*/
|
*/
|
||||||
@ResolveContext(PLUGIN_VERSION) version: Semver,
|
@ResolveContext(PLUGIN_VERSION) version: SemVersion,
|
||||||
/**
|
/**
|
||||||
* @see [PluginDescription.name]
|
* @see [PluginDescription.name]
|
||||||
*/
|
*/
|
||||||
@ -97,17 +97,15 @@ public interface JvmPluginDescription : PluginDescription {
|
|||||||
*
|
*
|
||||||
* @see [JvmPluginDescription.invoke]
|
* @see [JvmPluginDescription.invoke]
|
||||||
*/
|
*/
|
||||||
public class JvmPluginDescriptionBuilder
|
public class JvmPluginDescriptionBuilder(
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
constructor(
|
|
||||||
private var id: String,
|
private var id: String,
|
||||||
private var version: Semver,
|
private var version: SemVersion,
|
||||||
) {
|
) {
|
||||||
@Suppress("DEPRECATION_ERROR")
|
@Suppress("DEPRECATION_ERROR")
|
||||||
public constructor(
|
public constructor(
|
||||||
@ResolveContext(PLUGIN_NAME) id: String,
|
@ResolveContext(PLUGIN_NAME) id: String,
|
||||||
@ResolveContext(PLUGIN_VERSION) version: String,
|
@ResolveContext(PLUGIN_VERSION) version: String,
|
||||||
) : this(id, Semver(version, Semver.SemverType.LOOSE))
|
) : this(id, SemVersion.parse(version))
|
||||||
|
|
||||||
private var name: String = id
|
private var name: String = id
|
||||||
private var author: String = ""
|
private var author: String = ""
|
||||||
@ -118,14 +116,12 @@ constructor(
|
|||||||
public fun name(@ResolveContext(PLUGIN_NAME) value: String): JvmPluginDescriptionBuilder =
|
public fun name(@ResolveContext(PLUGIN_NAME) value: String): JvmPluginDescriptionBuilder =
|
||||||
apply { this.name = value.trim() }
|
apply { this.name = value.trim() }
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKuriyamaMiraiForever
|
@ILoveKuriyamaMiraiForever
|
||||||
public fun version(@ResolveContext(PLUGIN_VERSION) value: String): JvmPluginDescriptionBuilder =
|
public fun version(@ResolveContext(PLUGIN_VERSION) value: String): JvmPluginDescriptionBuilder =
|
||||||
apply { this.version = Semver(value, Semver.SemverType.LOOSE) }
|
apply { this.version = SemVersion.parse(value) }
|
||||||
|
|
||||||
@Deprecated("Semver 将会在 1.0-RC 被替换为 Console 自己实现的版本。请临时使用 String。", level = DeprecationLevel.ERROR)
|
|
||||||
@ILoveKuriyamaMiraiForever
|
@ILoveKuriyamaMiraiForever
|
||||||
public fun version(@ResolveContext(PLUGIN_VERSION) value: Semver): JvmPluginDescriptionBuilder =
|
public fun version(@ResolveContext(PLUGIN_VERSION) value: SemVersion): JvmPluginDescriptionBuilder =
|
||||||
apply { this.version = value }
|
apply { this.version = value }
|
||||||
|
|
||||||
@ILoveKuriyamaMiraiForever
|
@ILoveKuriyamaMiraiForever
|
||||||
@ -161,7 +157,7 @@ constructor(
|
|||||||
public fun dependsOn(
|
public fun dependsOn(
|
||||||
@ResolveContext(PLUGIN_ID) pluginId: String,
|
@ResolveContext(PLUGIN_ID) pluginId: String,
|
||||||
isOptional: Boolean = false,
|
isOptional: Boolean = false,
|
||||||
versionRequirement: VersionRequirement,
|
versionRequirement: SemVersion.RangeRequirement,
|
||||||
): JvmPluginDescriptionBuilder = apply {
|
): JvmPluginDescriptionBuilder = apply {
|
||||||
this.dependencies.add(PluginDependency(pluginId, versionRequirement, isOptional))
|
this.dependencies.add(PluginDependency(pluginId, versionRequirement, isOptional))
|
||||||
}
|
}
|
||||||
@ -174,7 +170,7 @@ constructor(
|
|||||||
@ILoveKuriyamaMiraiForever
|
@ILoveKuriyamaMiraiForever
|
||||||
public fun dependsOn(
|
public fun dependsOn(
|
||||||
@ResolveContext(PLUGIN_ID) pluginId: String,
|
@ResolveContext(PLUGIN_ID) pluginId: String,
|
||||||
versionRequirement: VersionRequirement,
|
versionRequirement: SemVersion.RangeRequirement,
|
||||||
): JvmPluginDescriptionBuilder = apply {
|
): JvmPluginDescriptionBuilder = apply {
|
||||||
this.dependencies.add(PluginDependency(pluginId, versionRequirement, false))
|
this.dependencies.add(PluginDependency(pluginId, versionRequirement, false))
|
||||||
}
|
}
|
||||||
@ -203,17 +199,17 @@ constructor(
|
|||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @see PluginDependency
|
* @see PluginDependency
|
||||||
* @see VersionRequirement.Builder
|
* @see SemVersionRangeRequirementBuilder
|
||||||
*/
|
*/
|
||||||
@ILoveKuriyamaMiraiForever
|
@ILoveKuriyamaMiraiForever
|
||||||
public fun dependsOn(
|
public fun dependsOn(
|
||||||
@ResolveContext(PLUGIN_ID) pluginId: String,
|
@ResolveContext(PLUGIN_ID) pluginId: String,
|
||||||
isOptional: Boolean = false,
|
isOptional: Boolean = false,
|
||||||
versionRequirement: VersionRequirement.Builder.() -> VersionRequirement,
|
versionRequirement: SemVersionRangeRequirementBuilder.() -> SemVersion.RangeRequirement,
|
||||||
): JvmPluginDescriptionBuilder =
|
): JvmPluginDescriptionBuilder =
|
||||||
apply {
|
apply {
|
||||||
this.dependencies.add(PluginDependency(pluginId,
|
this.dependencies.add(PluginDependency(pluginId,
|
||||||
VersionRequirement.Builder().run(versionRequirement),
|
SemVersionRangeRequirementBuilder.run(versionRequirement),
|
||||||
isOptional))
|
isOptional))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,7 +255,7 @@ public data class SimpleJvmPluginDescription
|
|||||||
)
|
)
|
||||||
@JvmOverloads public constructor(
|
@JvmOverloads public constructor(
|
||||||
public override val name: String,
|
public override val name: String,
|
||||||
public override val version: Semver,
|
public override val version: SemVersion,
|
||||||
public override val id: String = name,
|
public override val id: String = name,
|
||||||
public override val author: String = "",
|
public override val author: String = "",
|
||||||
public override val info: String = "",
|
public override val info: String = "",
|
||||||
@ -285,7 +281,7 @@ public data class SimpleJvmPluginDescription
|
|||||||
author: String = "",
|
author: String = "",
|
||||||
info: String = "",
|
info: String = "",
|
||||||
dependencies: Set<PluginDependency> = setOf(),
|
dependencies: Set<PluginDependency> = setOf(),
|
||||||
) : this(name, Semver(version, Semver.SemverType.LOOSE), id, author, info, dependencies)
|
) : this(name, SemVersion.parse(version), id, author, info, dependencies)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
require(!name.contains(':')) { "':' is forbidden in plugin name" }
|
require(!name.contains(':')) { "':' is forbidden in plugin name" }
|
||||||
|
@ -20,6 +20,7 @@ import kotlinx.serialization.KSerializer
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import kotlinx.serialization.Transient
|
import kotlinx.serialization.Transient
|
||||||
import kotlinx.serialization.builtins.serializer
|
import kotlinx.serialization.builtins.serializer
|
||||||
|
import net.mamoe.mirai.console.compiler.common.ResolveContext
|
||||||
import net.mamoe.mirai.console.internal.data.map
|
import net.mamoe.mirai.console.internal.data.map
|
||||||
import net.mamoe.mirai.console.internal.util.SemVersionInternal
|
import net.mamoe.mirai.console.internal.util.SemVersionInternal
|
||||||
import net.mamoe.mirai.console.util.SemVersion.Companion.equals
|
import net.mamoe.mirai.console.util.SemVersion.Companion.equals
|
||||||
@ -89,7 +90,7 @@ public data class SemVersion internal constructor(
|
|||||||
*/
|
*/
|
||||||
@Throws(IllegalArgumentException::class, NumberFormatException::class)
|
@Throws(IllegalArgumentException::class, NumberFormatException::class)
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
public fun parse(version: String): SemVersion = SemVersionInternal.parse(version)
|
public fun parse(@ResolveContext(ResolveContext.Kind.PLUGIN_VERSION) version: String): SemVersion = SemVersionInternal.parse(version)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析一条依赖需求描述, 在无法解析的时候抛出 [IllegalArgumentException]
|
* 解析一条依赖需求描述, 在无法解析的时候抛出 [IllegalArgumentException]
|
||||||
|
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Mamoe Technologies and contributors.
|
||||||
|
*
|
||||||
|
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
|
||||||
|
* Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found via the following link.
|
||||||
|
*
|
||||||
|
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.mamoe.mirai.console.util
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造 [SemVersion.RangeRequirement] 的 DSL
|
||||||
|
*/
|
||||||
|
public object SemVersionRangeRequirementBuilder {
|
||||||
|
/** @see [SemVersion.parseRangeRequirement] */
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public fun parse(rule: String): SemVersion.RangeRequirement = SemVersion.parseRangeRequirement(rule)
|
||||||
|
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public infix fun SemVersion.RangeRequirement.or(other: SemVersion.RangeRequirement): SemVersion.RangeRequirement {
|
||||||
|
return object : SemVersion.RangeRequirement {
|
||||||
|
override fun test(version: SemVersion): Boolean {
|
||||||
|
return this@or.test(version) || other.test(version)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "(${this@or}) or ($other)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public infix fun String.or(other: String): SemVersion.RangeRequirement = parse(this) or parse(other)
|
||||||
|
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public infix fun SemVersion.RangeRequirement.or(other: String): SemVersion.RangeRequirement = or(parse(other))
|
||||||
|
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public infix fun String.or(other: SemVersion.RangeRequirement): SemVersion.RangeRequirement = parse(this) or other
|
||||||
|
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public infix fun SemVersion.RangeRequirement.and(other: SemVersion.RangeRequirement): SemVersion.RangeRequirement {
|
||||||
|
return object : SemVersion.RangeRequirement {
|
||||||
|
override fun test(version: SemVersion): Boolean {
|
||||||
|
return this@and.test(version) && other.test(version)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "(${this@and}) or ($other)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public infix fun String.and(other: String): SemVersion.RangeRequirement = parse(this) and parse(other)
|
||||||
|
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public infix fun SemVersion.RangeRequirement.and(other: String): SemVersion.RangeRequirement = and(parse(other))
|
||||||
|
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public infix fun String.and(other: SemVersion.RangeRequirement): SemVersion.RangeRequirement = parse(this) and other
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
@ILoveHim188moeForever
|
||||||
|
public inline fun custom(rule: SemVersion.RangeRequirement): SemVersion.RangeRequirement = rule
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标注一个 [SemVersionRangeRequirementBuilder] DSL
|
||||||
|
*/
|
||||||
|
@Suppress("SpellCheckingInspection")
|
||||||
|
@Retention(AnnotationRetention.BINARY)
|
||||||
|
@DslMarker
|
||||||
|
internal annotation class ILoveHim188moeForever
|
||||||
|
|
||||||
|
/** [SemVersionRangeRequirementBuilder] 的使用示例 */
|
||||||
|
@Suppress("unused")
|
||||||
|
private class ExampleOfBuilder {
|
||||||
|
val e1 = SemVersionRangeRequirementBuilder.run {
|
||||||
|
"1.0.0" or "1.1.5"
|
||||||
|
}
|
||||||
|
val e2 = SemVersionRangeRequirementBuilder.run {
|
||||||
|
parse("> 1.0.0") and parse("< 1.2.3")
|
||||||
|
}
|
||||||
|
val e3 = SemVersionRangeRequirementBuilder.run {
|
||||||
|
("> 1.0.0" and "< 1.2.3") or "2.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console
|
package net.mamoe.mirai.console
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start
|
import net.mamoe.mirai.console.MiraiConsoleImplementation.Companion.start
|
||||||
import net.mamoe.mirai.console.command.CommandManager
|
import net.mamoe.mirai.console.command.CommandManager
|
||||||
@ -20,6 +19,7 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
|||||||
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
||||||
import net.mamoe.mirai.console.util.ConsoleInput
|
import net.mamoe.mirai.console.util.ConsoleInput
|
||||||
import net.mamoe.mirai.console.util.ConsoleInternalApi
|
import net.mamoe.mirai.console.util.ConsoleInternalApi
|
||||||
|
import net.mamoe.mirai.console.util.SemVersion
|
||||||
import net.mamoe.mirai.message.data.Message
|
import net.mamoe.mirai.message.data.Message
|
||||||
import net.mamoe.mirai.utils.BotConfiguration
|
import net.mamoe.mirai.utils.BotConfiguration
|
||||||
import net.mamoe.mirai.utils.LoginSolver
|
import net.mamoe.mirai.utils.LoginSolver
|
||||||
@ -43,8 +43,8 @@ fun initTestEnvironment() {
|
|||||||
get() = "Test"
|
get() = "Test"
|
||||||
override val vendor: String
|
override val vendor: String
|
||||||
get() = "Test"
|
get() = "Test"
|
||||||
override val version: Semver
|
override val version: SemVersion
|
||||||
get() = Semver("1.0.0")
|
get() = SemVersion.parse("1.0.0")
|
||||||
|
|
||||||
}
|
}
|
||||||
override val builtInPluginLoaders: List<Lazy<PluginLoader<*, *>>> = listOf(lazy { JvmPluginLoader })
|
override val builtInPluginLoaders: List<Lazy<PluginLoader<*, *>>> = listOf(lazy { JvmPluginLoader })
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
package net.mamoe.mirai.console.terminal
|
package net.mamoe.mirai.console.terminal
|
||||||
|
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver
|
|
||||||
import kotlinx.coroutines.CancellationException
|
import kotlinx.coroutines.CancellationException
|
||||||
import kotlinx.coroutines.CoroutineExceptionHandler
|
import kotlinx.coroutines.CoroutineExceptionHandler
|
||||||
import kotlinx.coroutines.CoroutineName
|
import kotlinx.coroutines.CoroutineName
|
||||||
@ -39,10 +38,7 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
|||||||
import net.mamoe.mirai.console.terminal.ConsoleInputImpl.requestInput
|
import net.mamoe.mirai.console.terminal.ConsoleInputImpl.requestInput
|
||||||
import net.mamoe.mirai.console.terminal.noconsole.AllEmptyLineReader
|
import net.mamoe.mirai.console.terminal.noconsole.AllEmptyLineReader
|
||||||
import net.mamoe.mirai.console.terminal.noconsole.NoConsole
|
import net.mamoe.mirai.console.terminal.noconsole.NoConsole
|
||||||
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
import net.mamoe.mirai.console.util.*
|
||||||
import net.mamoe.mirai.console.util.ConsoleInput
|
|
||||||
import net.mamoe.mirai.console.util.ConsoleInternalApi
|
|
||||||
import net.mamoe.mirai.console.util.NamedSupervisorJob
|
|
||||||
import net.mamoe.mirai.utils.*
|
import net.mamoe.mirai.utils.*
|
||||||
import org.fusesource.jansi.Ansi
|
import org.fusesource.jansi.Ansi
|
||||||
import org.jline.reader.LineReader
|
import org.jline.reader.LineReader
|
||||||
@ -155,7 +151,7 @@ val terminal: Terminal = run {
|
|||||||
private object ConsoleFrontEndDescImpl : MiraiConsoleFrontEndDescription {
|
private object ConsoleFrontEndDescImpl : MiraiConsoleFrontEndDescription {
|
||||||
override val name: String get() = "Terminal"
|
override val name: String get() = "Terminal"
|
||||||
override val vendor: String get() = "Mamoe Technologies"
|
override val vendor: String get() = "Mamoe Technologies"
|
||||||
override val version: Semver = net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants.version
|
override val version: SemVersion = net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants.version
|
||||||
}
|
}
|
||||||
|
|
||||||
private val ANSI_RESET = Ansi().reset().toString()
|
private val ANSI_RESET = Ansi().reset().toString()
|
||||||
|
Loading…
Reference in New Issue
Block a user