From b8fa101569c3f5a0cf68291954a38cf128ff8442 Mon Sep 17 00:00:00 2001 From: V1K1NGbg Date: Thu, 22 Aug 2024 17:48:58 -0300 Subject: Teal: convert luarocks.type.rockspec --- src/luarocks/type/rockspec.tl | 282 ++++++++++++++++++++++++++---------------- 1 file changed, 172 insertions(+), 110 deletions(-) diff --git a/src/luarocks/type/rockspec.tl b/src/luarocks/type/rockspec.tl index 0b4b5dcf..5db0c4c4 100644 --- a/src/luarocks/type/rockspec.tl +++ b/src/luarocks/type/rockspec.tl @@ -1,7 +1,16 @@ -local type_rockspec = {} +local record type_rockspec + order: Ordering + rockspec_format: string +end + +local type Ordering = require("luarocks.core.types.ordering").Ordering + +local type Rockspec = require("luarocks.core.types.rockspec").Rockspec local type_check = require("luarocks.type_check") +-- local type TableSchema = type_check.TableSchema + type_rockspec.rockspec_format = "3.0" -- Syntax for type-checking tables: @@ -19,138 +28,192 @@ type_rockspec.rockspec_format = "3.0" local rockspec_formats, versions = type_check.declare_schemas({ ["1.0"] = { - rockspec_format = { _type = "string" }, - package = { _type = "string", _mandatory = true }, - version = { _type = "string", _pattern = "[%w.]+-[%d]+", _mandatory = true }, - description = { - summary = { _type = "string" }, - detailed = { _type = "string" }, - homepage = { _type = "string" }, - license = { _type = "string" }, - maintainer = { _type = "string" }, - }, - dependencies = { - platforms = type_check.MAGIC_PLATFORMS, - _any = { - _type = "string", - _name = "a valid dependency string", - _pattern = "%s*([a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", - }, - }, - supported_platforms = { - _any = { _type = "string" }, - }, - external_dependencies = { - platforms = type_check.MAGIC_PLATFORMS, - _any = { - program = { _type = "string" }, - header = { _type = "string" }, - library = { _type = "string" }, - } - }, - source = { - _mandatory = true, - platforms = type_check.MAGIC_PLATFORMS, - url = { _type = "string", _mandatory = true }, - md5 = { _type = "string" }, - file = { _type = "string" }, - dir = { _type = "string" }, - tag = { _type = "string" }, - branch = { _type = "string" }, - module = { _type = "string" }, - cvs_tag = { _type = "string" }, - cvs_module = { _type = "string" }, - }, - build = { - platforms = type_check.MAGIC_PLATFORMS, - type = { _type = "string" }, - install = { - lua = { - _more = true + fields = { + rockspec_format = { _type = "string" }, + package = { _type = "string", _mandatory = true }, + version = { _type = "string", _pattern = "[%w.]+-[%d]+", _mandatory = true }, + description = { + fields = { + summary = { _type = "string" }, + detailed = { _type = "string" }, + homepage = { _type = "string" }, + license = { _type = "string" }, + maintainer = { _type = "string" }, }, - lib = { - _more = true + }, + dependencies = { + fields = { + platforms = type_check.MAGIC_PLATFORMS, }, - conf = { - _more = true + _any = { + _type = "string", + _name = "a valid dependency string", + _pattern = "%s*([a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", }, - bin = { - _more = true - } }, - copy_directories = { + supported_platforms = { _any = { _type = "string" }, }, - _more = true, - _mandatory = true - }, - hooks = { - platforms = type_check.MAGIC_PLATFORMS, - post_install = { _type = "string" }, + external_dependencies = { + fields = { + platforms = type_check.MAGIC_PLATFORMS, + }, + _any = { + fields = { + program = { _type = "string" }, + header = { _type = "string" }, + library = { _type = "string" }, + } + }, + }, + source = { + _mandatory = true, + fields = { + platforms = type_check.MAGIC_PLATFORMS, + url = { _type = "string", _mandatory = true }, + md5 = { _type = "string" }, + file = { _type = "string" }, + dir = { _type = "string" }, + tag = { _type = "string" }, + branch = { _type = "string" }, + module = { _type = "string" }, + cvs_tag = { _type = "string" }, + cvs_module = { _type = "string" }, + }, + }, + build = { + fields = { + platforms = type_check.MAGIC_PLATFORMS, + type = { _type = "string" }, + install = { + fields = { + lua = { + _more = true + }, + lib = { + _more = true + }, + conf = { + _more = true + }, + bin = { + _more = true + } + } + }, + copy_directories = { + _any = { _type = "string" }, + }, + }, + _more = true, + _mandatory = true + }, + hooks = { + fields = { + platforms = type_check.MAGIC_PLATFORMS, + post_install = { _type = "string" }, + } + }, }, }, ["1.1"] = { - deploy = { - wrap_bin_scripts = { _type = "boolean" }, - } + fields = { + deploy = { + fields = { + wrap_bin_scripts = { _type = "boolean" }, + }, + } + }, }, ["3.0"] = { - description = { - labels = { - _any = { _type = "string" } + fields = { + description = { + fields = { + labels = { + _any = { _type = "string" } + }, + issues_url = { _type = "string" }, + }, }, - issues_url = { _type = "string" }, - }, - dependencies = { - _any = { - _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", + dependencies = { + _any = { + _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", + }, }, - }, - build_dependencies = { - platforms = type_check.MAGIC_PLATFORMS, - _any = { - _type = "string", - _name = "a valid dependency string", - _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", + build_dependencies = { + fields = { + platforms = type_check.MAGIC_PLATFORMS, + }, + _any = { + _type = "string", + _name = "a valid dependency string", + _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", + }, }, - }, - test_dependencies = { - platforms = type_check.MAGIC_PLATFORMS, - _any = { - _type = "string", - _name = "a valid dependency string", - _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", + test_dependencies = { + fields = { + platforms = type_check.MAGIC_PLATFORMS, + }, + _any = { + _type = "string", + _name = "a valid dependency string", + _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", + }, }, - }, - build = { - _mandatory = false, - }, - test = { - platforms = type_check.MAGIC_PLATFORMS, - type = { _type = "string" }, - _more = true, - }, + build = { + _mandatory = false, + }, + test = { + fields = { + platforms = type_check.MAGIC_PLATFORMS, + type = { _type = "string" }, + }, + _more = true, + }, + } } }) -type_rockspec.order = {"rockspec_format", "package", "version", - { "source", { "url", "tag", "branch", "md5" } }, - { "description", {"summary", "detailed", "homepage", "license" } }, - "supported_platforms", "dependencies", "build_dependencies", "external_dependencies", - { "build", {"type", "modules", "copy_directories", "platforms"} }, - "test_dependencies", { "test", {"type"} }, - "hooks"} +-- type_rockspec.order = {"rockspec_format", "package", "version", +-- { "source", { "url", "tag", "branch", "md5" } }, +-- { "description", {"summary", "detailed", "homepage", "license" } }, +-- "supported_platforms", "dependencies", "build_dependencies", "external_dependencies", +-- { "build", {"type", "modules", "copy_directories", "platforms"} }, +-- "test_dependencies", { "test", {"type"} }, +-- "hooks"} + +type_rockspec.order = { + "rockspec_format", + "package", + "version", + "source", + "description", + "supported_platforms", + "dependencies", + "build_dependencies", + "external_dependencies", + "build", + "test_dependencies", + "test", + "hooks", + sub_orders = { + ["source"] = { "url", "tag", "branch", "md5" }, + ["description"] = {"summary", "detailed", "homepage", "license" }, + ["build"] = { "type", "modules", "copy_directories", "platforms" }, + ["test"] = { "type" } + } +} -local function check_rockspec_using_version(rockspec, globals, version) +local function check_rockspec_using_version(rockspec: Rockspec, globals: {string: any}, version: string): boolean, string local schema = rockspec_formats[version] if not schema then return nil, "unknown rockspec format " .. version end local ok, err = type_check.check_undeclared_globals(globals, schema) if ok then - ok, err = type_check.type_check_table(version, rockspec, schema, "") + ok, err = type_check.type_check_table(version, rockspec as {any: any}, schema, "") end if ok then return true @@ -165,10 +228,9 @@ end -- mismatches. -- @return boolean or (nil, string): true if type checking -- succeeded, or nil and an error message if it failed. -function type_rockspec.check(rockspec, globals) - assert(type(rockspec) == "table") +function type_rockspec.check(rockspec: Rockspec, globals: {string: any}): boolean, string - local version = rockspec.rockspec_format or "1.0" + local version: string = rockspec.rockspec_format as string or "1.0" local ok, err = check_rockspec_using_version(rockspec, globals, version) if ok then return true @@ -184,7 +246,7 @@ function type_rockspec.check(rockspec, globals) found = true end else - local v_ok, v_err = check_rockspec_using_version(rockspec, globals, v) + local v_ok = check_rockspec_using_version(rockspec, globals, v) if v_ok then return nil, err .. " (using rockspec format " .. version .. " -- " .. [[adding 'rockspec_format = "]] .. v .. [["' to the rockspec ]] .. -- cgit v1.2.3-55-g6feb