diff options
| author | V1K1NGbg <victor@ilchev.com> | 2024-08-04 14:28:12 +0300 |
|---|---|---|
| committer | V1K1NGbg <victor@ilchev.com> | 2024-08-05 20:51:31 +0300 |
| commit | 151d06b9e19f2664e23787bf60ea46bf62cc87f2 (patch) | |
| tree | daa6f596e170bd40be66e4abbb91419d41333241 /src | |
| parent | 509d553d5d6003a92add3b7b30af02171280c052 (diff) | |
| download | luarocks-151d06b9e19f2664e23787bf60ea46bf62cc87f2.tar.gz luarocks-151d06b9e19f2664e23787bf60ea46bf62cc87f2.tar.bz2 luarocks-151d06b9e19f2664e23787bf60ea46bf62cc87f2.zip | |
type_check and rockspec
Diffstat (limited to 'src')
| -rw-r--r-- | src/luarocks/type/rockspec.tl | 352 | ||||
| -rw-r--r-- | src/luarocks/type_check.tl | 2 |
2 files changed, 253 insertions, 101 deletions
diff --git a/src/luarocks/type/rockspec.tl b/src/luarocks/type/rockspec.tl index 4b9aecf9..365f5d3d 100644 --- a/src/luarocks/type/rockspec.tl +++ b/src/luarocks/type/rockspec.tl | |||
| @@ -1,8 +1,11 @@ | |||
| 1 | local record type_rockspec | 1 | local record type_rockspec |
| 2 | 2 | order: util.Ordering<string> | |
| 3 | end | 3 | end |
| 4 | 4 | ||
| 5 | local type_check = require("luarocks.type_check") | 5 | local type_check = require("luarocks.type_check") |
| 6 | local util = require("luarocks.core.util") --! | ||
| 7 | |||
| 8 | local type TableSchema = type_check.TableSchema | ||
| 6 | 9 | ||
| 7 | type_rockspec.rockspec_format = "3.0" | 10 | type_rockspec.rockspec_format = "3.0" |
| 8 | 11 | ||
| @@ -19,121 +22,271 @@ type_rockspec.rockspec_format = "3.0" | |||
| 19 | -- _more (boolean) indicates that the table accepts unspecified keys and does not type-check them. | 22 | -- _more (boolean) indicates that the table accepts unspecified keys and does not type-check them. |
| 20 | -- Any other string keys that don't start with an underscore represent known keys and are type-checking tables, recursively checked. | 23 | -- Any other string keys that don't start with an underscore represent known keys and are type-checking tables, recursively checked. |
| 21 | 24 | ||
| 25 | -- local rockspec_formats, versions = type_check.declare_schemas({ | ||
| 26 | -- ["1.0"] = { | ||
| 27 | -- rockspec_format = { _type = "string" }, | ||
| 28 | -- package = { _type = "string", _mandatory = true }, | ||
| 29 | -- version = { _type = "string", _pattern = "[%w.]+-[%d]+", _mandatory = true }, | ||
| 30 | -- description = { | ||
| 31 | -- summary = { _type = "string" }, | ||
| 32 | -- detailed = { _type = "string" }, | ||
| 33 | -- homepage = { _type = "string" }, | ||
| 34 | -- license = { _type = "string" }, | ||
| 35 | -- maintainer = { _type = "string" }, | ||
| 36 | -- }, | ||
| 37 | -- dependencies = { | ||
| 38 | -- platforms = type_check.MAGIC_PLATFORMS, | ||
| 39 | -- _any = { | ||
| 40 | -- _type = "string", | ||
| 41 | -- _name = "a valid dependency string", | ||
| 42 | -- _pattern = "%s*([a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 43 | -- }, | ||
| 44 | -- }, | ||
| 45 | -- supported_platforms = { | ||
| 46 | -- _any = { _type = "string" }, | ||
| 47 | -- }, | ||
| 48 | -- external_dependencies = { | ||
| 49 | -- platforms = type_check.MAGIC_PLATFORMS, | ||
| 50 | -- _any = { | ||
| 51 | -- program = { _type = "string" }, | ||
| 52 | -- header = { _type = "string" }, | ||
| 53 | -- library = { _type = "string" }, | ||
| 54 | -- } | ||
| 55 | -- }, | ||
| 56 | -- source = { | ||
| 57 | -- _mandatory = true, | ||
| 58 | -- platforms = type_check.MAGIC_PLATFORMS, | ||
| 59 | -- url = { _type = "string", _mandatory = true }, | ||
| 60 | -- md5 = { _type = "string" }, | ||
| 61 | -- file = { _type = "string" }, | ||
| 62 | -- dir = { _type = "string" }, | ||
| 63 | -- tag = { _type = "string" }, | ||
| 64 | -- branch = { _type = "string" }, | ||
| 65 | -- module = { _type = "string" }, | ||
| 66 | -- cvs_tag = { _type = "string" }, | ||
| 67 | -- cvs_module = { _type = "string" }, | ||
| 68 | -- }, | ||
| 69 | -- build = { | ||
| 70 | -- platforms = type_check.MAGIC_PLATFORMS, | ||
| 71 | -- type = { _type = "string" }, | ||
| 72 | -- install = { | ||
| 73 | -- lua = { | ||
| 74 | -- _more = true | ||
| 75 | -- }, | ||
| 76 | -- lib = { | ||
| 77 | -- _more = true | ||
| 78 | -- }, | ||
| 79 | -- conf = { | ||
| 80 | -- _more = true | ||
| 81 | -- }, | ||
| 82 | -- bin = { | ||
| 83 | -- _more = true | ||
| 84 | -- } | ||
| 85 | -- }, | ||
| 86 | -- copy_directories = { | ||
| 87 | -- _any = { _type = "string" }, | ||
| 88 | -- }, | ||
| 89 | -- _more = true, | ||
| 90 | -- _mandatory = true | ||
| 91 | -- }, | ||
| 92 | -- hooks = { | ||
| 93 | -- platforms = type_check.MAGIC_PLATFORMS, | ||
| 94 | -- post_install = { _type = "string" }, | ||
| 95 | -- }, | ||
| 96 | -- }, | ||
| 97 | |||
| 98 | -- ["1.1"] = { | ||
| 99 | -- deploy = { | ||
| 100 | -- wrap_bin_scripts = { _type = "boolean" }, | ||
| 101 | -- } | ||
| 102 | -- }, | ||
| 103 | |||
| 104 | -- ["3.0"] = { | ||
| 105 | -- description = { | ||
| 106 | -- labels = { | ||
| 107 | -- _any = { _type = "string" } | ||
| 108 | -- }, | ||
| 109 | -- issues_url = { _type = "string" }, | ||
| 110 | -- }, | ||
| 111 | -- dependencies = { | ||
| 112 | -- _any = { | ||
| 113 | -- _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 114 | -- }, | ||
| 115 | -- }, | ||
| 116 | -- build_dependencies = { | ||
| 117 | -- platforms = type_check.MAGIC_PLATFORMS, | ||
| 118 | -- _any = { | ||
| 119 | -- _type = "string", | ||
| 120 | -- _name = "a valid dependency string", | ||
| 121 | -- _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 122 | -- }, | ||
| 123 | -- }, | ||
| 124 | -- test_dependencies = { | ||
| 125 | -- platforms = type_check.MAGIC_PLATFORMS, | ||
| 126 | -- _any = { | ||
| 127 | -- _type = "string", | ||
| 128 | -- _name = "a valid dependency string", | ||
| 129 | -- _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 130 | -- }, | ||
| 131 | -- }, | ||
| 132 | -- build = { | ||
| 133 | -- _mandatory = false, | ||
| 134 | -- }, | ||
| 135 | -- test = { | ||
| 136 | -- platforms = type_check.MAGIC_PLATFORMS, | ||
| 137 | -- type = { _type = "string" }, | ||
| 138 | -- _more = true, | ||
| 139 | -- }, | ||
| 140 | -- } | ||
| 141 | -- }) | ||
| 142 | |||
| 22 | local rockspec_formats, versions = type_check.declare_schemas({ | 143 | local rockspec_formats, versions = type_check.declare_schemas({ |
| 23 | ["1.0"] = { | 144 | ["1.0"] = { |
| 24 | rockspec_format = { _type = "string" }, | 145 | fields = { |
| 25 | package = { _type = "string", _mandatory = true }, | 146 | rockspec_format = { _type = "string" }, |
| 26 | version = { _type = "string", _pattern = "[%w.]+-[%d]+", _mandatory = true }, | 147 | package = { _type = "string", _mandatory = true }, |
| 27 | description = { | 148 | version = { _type = "string", _pattern = "[%w.]+-[%d]+", _mandatory = true }, |
| 28 | summary = { _type = "string" }, | 149 | description = { |
| 29 | detailed = { _type = "string" }, | 150 | fields = { |
| 30 | homepage = { _type = "string" }, | 151 | summary = { _type = "string" }, |
| 31 | license = { _type = "string" }, | 152 | detailed = { _type = "string" }, |
| 32 | maintainer = { _type = "string" }, | 153 | homepage = { _type = "string" }, |
| 33 | }, | 154 | license = { _type = "string" }, |
| 34 | dependencies = { | 155 | maintainer = { _type = "string" }, |
| 35 | platforms = type_check.MAGIC_PLATFORMS, | ||
| 36 | _any = { | ||
| 37 | _type = "string", | ||
| 38 | _name = "a valid dependency string", | ||
| 39 | _pattern = "%s*([a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 40 | }, | ||
| 41 | }, | ||
| 42 | supported_platforms = { | ||
| 43 | _any = { _type = "string" }, | ||
| 44 | }, | ||
| 45 | external_dependencies = { | ||
| 46 | platforms = type_check.MAGIC_PLATFORMS, | ||
| 47 | _any = { | ||
| 48 | program = { _type = "string" }, | ||
| 49 | header = { _type = "string" }, | ||
| 50 | library = { _type = "string" }, | ||
| 51 | } | ||
| 52 | }, | ||
| 53 | source = { | ||
| 54 | _mandatory = true, | ||
| 55 | platforms = type_check.MAGIC_PLATFORMS, | ||
| 56 | url = { _type = "string", _mandatory = true }, | ||
| 57 | md5 = { _type = "string" }, | ||
| 58 | file = { _type = "string" }, | ||
| 59 | dir = { _type = "string" }, | ||
| 60 | tag = { _type = "string" }, | ||
| 61 | branch = { _type = "string" }, | ||
| 62 | module = { _type = "string" }, | ||
| 63 | cvs_tag = { _type = "string" }, | ||
| 64 | cvs_module = { _type = "string" }, | ||
| 65 | }, | ||
| 66 | build = { | ||
| 67 | platforms = type_check.MAGIC_PLATFORMS, | ||
| 68 | type = { _type = "string" }, | ||
| 69 | install = { | ||
| 70 | lua = { | ||
| 71 | _more = true | ||
| 72 | }, | 156 | }, |
| 73 | lib = { | 157 | }, |
| 74 | _more = true | 158 | dependencies = { |
| 159 | fields = { | ||
| 160 | platforms = type_check.MAGIC_PLATFORMS, | ||
| 75 | }, | 161 | }, |
| 76 | conf = { | 162 | _any = { |
| 77 | _more = true | 163 | _type = "string", |
| 164 | _name = "a valid dependency string", | ||
| 165 | _pattern = "%s*([a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 78 | }, | 166 | }, |
| 79 | bin = { | ||
| 80 | _more = true | ||
| 81 | } | ||
| 82 | }, | 167 | }, |
| 83 | copy_directories = { | 168 | supported_platforms = { |
| 84 | _any = { _type = "string" }, | 169 | _any = { _type = "string" }, |
| 85 | }, | 170 | }, |
| 86 | _more = true, | 171 | external_dependencies = { |
| 87 | _mandatory = true | 172 | fields = { |
| 88 | }, | 173 | platforms = type_check.MAGIC_PLATFORMS, |
| 89 | hooks = { | 174 | }, |
| 90 | platforms = type_check.MAGIC_PLATFORMS, | 175 | _any = { |
| 91 | post_install = { _type = "string" }, | 176 | fields = { |
| 177 | program = { _type = "string" }, | ||
| 178 | header = { _type = "string" }, | ||
| 179 | library = { _type = "string" }, | ||
| 180 | } | ||
| 181 | }, | ||
| 182 | }, | ||
| 183 | source = { | ||
| 184 | _mandatory = true, | ||
| 185 | fields = { | ||
| 186 | platforms = type_check.MAGIC_PLATFORMS, | ||
| 187 | url = { _type = "string", _mandatory = true }, | ||
| 188 | md5 = { _type = "string" }, | ||
| 189 | file = { _type = "string" }, | ||
| 190 | dir = { _type = "string" }, | ||
| 191 | tag = { _type = "string" }, | ||
| 192 | branch = { _type = "string" }, | ||
| 193 | module = { _type = "string" }, | ||
| 194 | cvs_tag = { _type = "string" }, | ||
| 195 | cvs_module = { _type = "string" }, | ||
| 196 | }, | ||
| 197 | }, | ||
| 198 | build = { | ||
| 199 | fields = { | ||
| 200 | platforms = type_check.MAGIC_PLATFORMS, | ||
| 201 | type = { _type = "string" }, | ||
| 202 | install = { | ||
| 203 | fields = { | ||
| 204 | lua = { | ||
| 205 | _more = true | ||
| 206 | }, | ||
| 207 | lib = { | ||
| 208 | _more = true | ||
| 209 | }, | ||
| 210 | conf = { | ||
| 211 | _more = true | ||
| 212 | }, | ||
| 213 | bin = { | ||
| 214 | _more = true | ||
| 215 | } | ||
| 216 | } | ||
| 217 | }, | ||
| 218 | copy_directories = { | ||
| 219 | _any = { _type = "string" }, | ||
| 220 | }, | ||
| 221 | }, | ||
| 222 | _more = true, | ||
| 223 | _mandatory = true | ||
| 224 | }, | ||
| 225 | hooks = { | ||
| 226 | fields = { | ||
| 227 | platforms = type_check.MAGIC_PLATFORMS, | ||
| 228 | post_install = { _type = "string" }, | ||
| 229 | } | ||
| 230 | }, | ||
| 92 | }, | 231 | }, |
| 93 | }, | 232 | }, |
| 94 | 233 | ||
| 95 | ["1.1"] = { | 234 | ["1.1"] = { |
| 96 | deploy = { | 235 | fields = { |
| 97 | wrap_bin_scripts = { _type = "boolean" }, | 236 | deploy = { |
| 98 | } | 237 | fields = { |
| 238 | wrap_bin_scripts = { _type = "boolean" }, | ||
| 239 | }, | ||
| 240 | } | ||
| 241 | }, | ||
| 99 | }, | 242 | }, |
| 100 | 243 | ||
| 101 | ["3.0"] = { | 244 | ["3.0"] = { |
| 102 | description = { | 245 | fields = { |
| 103 | labels = { | 246 | description = { |
| 104 | _any = { _type = "string" } | 247 | fields = { |
| 248 | labels = { | ||
| 249 | _any = { _type = "string" } | ||
| 250 | }, | ||
| 251 | issues_url = { _type = "string" }, | ||
| 252 | }, | ||
| 105 | }, | 253 | }, |
| 106 | issues_url = { _type = "string" }, | 254 | dependencies = { |
| 107 | }, | 255 | _any = { |
| 108 | dependencies = { | 256 | _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", |
| 109 | _any = { | 257 | }, |
| 110 | _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 111 | }, | 258 | }, |
| 112 | }, | 259 | build_dependencies = { |
| 113 | build_dependencies = { | 260 | fields = { |
| 114 | platforms = type_check.MAGIC_PLATFORMS, | 261 | platforms = type_check.MAGIC_PLATFORMS, |
| 115 | _any = { | 262 | }, |
| 116 | _type = "string", | 263 | _any = { |
| 117 | _name = "a valid dependency string", | 264 | _type = "string", |
| 118 | _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | 265 | _name = "a valid dependency string", |
| 266 | _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 267 | }, | ||
| 119 | }, | 268 | }, |
| 120 | }, | 269 | test_dependencies = { |
| 121 | test_dependencies = { | 270 | fields = { |
| 122 | platforms = type_check.MAGIC_PLATFORMS, | 271 | platforms = type_check.MAGIC_PLATFORMS, |
| 123 | _any = { | 272 | }, |
| 124 | _type = "string", | 273 | _any = { |
| 125 | _name = "a valid dependency string", | 274 | _type = "string", |
| 126 | _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | 275 | _name = "a valid dependency string", |
| 276 | _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)", | ||
| 277 | }, | ||
| 127 | }, | 278 | }, |
| 128 | }, | 279 | build = { |
| 129 | build = { | 280 | _mandatory = false, |
| 130 | _mandatory = false, | 281 | }, |
| 131 | }, | 282 | test = { |
| 132 | test = { | 283 | fields = { |
| 133 | platforms = type_check.MAGIC_PLATFORMS, | 284 | platforms = type_check.MAGIC_PLATFORMS, |
| 134 | type = { _type = "string" }, | 285 | type = { _type = "string" }, |
| 135 | _more = true, | 286 | }, |
| 136 | }, | 287 | _more = true, |
| 288 | }, | ||
| 289 | } | ||
| 137 | } | 290 | } |
| 138 | }) | 291 | }) |
| 139 | 292 | ||
| @@ -167,7 +320,7 @@ type_rockspec.order = { | |||
| 167 | } | 320 | } |
| 168 | } | 321 | } |
| 169 | 322 | ||
| 170 | local function check_rockspec_using_version(rockspec, globals, version) | 323 | local function check_rockspec_using_version(rockspec: {any: any}, globals: {string: any}, version: string): boolean, string |
| 171 | local schema = rockspec_formats[version] | 324 | local schema = rockspec_formats[version] |
| 172 | if not schema then | 325 | if not schema then |
| 173 | return nil, "unknown rockspec format " .. version | 326 | return nil, "unknown rockspec format " .. version |
| @@ -189,8 +342,7 @@ end | |||
| 189 | -- mismatches. | 342 | -- mismatches. |
| 190 | -- @return boolean or (nil, string): true if type checking | 343 | -- @return boolean or (nil, string): true if type checking |
| 191 | -- succeeded, or nil and an error message if it failed. | 344 | -- succeeded, or nil and an error message if it failed. |
| 192 | function type_rockspec.check(rockspec, globals) | 345 | function type_rockspec.check(rockspec: {any: any}, globals: {string: any}): boolean, string |
| 193 | assert(type(rockspec) == "table") | ||
| 194 | 346 | ||
| 195 | local version = rockspec.rockspec_format or "1.0" | 347 | local version = rockspec.rockspec_format or "1.0" |
| 196 | local ok, err = check_rockspec_using_version(rockspec, globals, version) | 348 | local ok, err = check_rockspec_using_version(rockspec, globals, version) |
diff --git a/src/luarocks/type_check.tl b/src/luarocks/type_check.tl index d36debc4..1ff490b8 100644 --- a/src/luarocks/type_check.tl +++ b/src/luarocks/type_check.tl | |||
| @@ -207,7 +207,7 @@ function type_check.type_check_table(version: string, tbl: {any: any}, typetbl: | |||
| 207 | return true | 207 | return true |
| 208 | end | 208 | end |
| 209 | 209 | ||
| 210 | function type_check.check_undeclared_globals(globals: {string: any}, typetbl: {string: string}): boolean, string --! tbl and typetbl types | 210 | function type_check.check_undeclared_globals(globals: {string: any}, typetbl: TableSchema): boolean, string --! tbl and typetbl types |
| 211 | local undeclared = {} | 211 | local undeclared = {} |
| 212 | for glob, _ in pairs(globals) do | 212 | for glob, _ in pairs(globals) do |
| 213 | if not (typetbl[glob] or typetbl["MUST_"..glob]) then | 213 | if not (typetbl[glob] or typetbl["MUST_"..glob]) then |
