aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorV1K1NGbg <victor@ilchev.com>2024-07-30 20:53:21 +0300
committerV1K1NGbg <victor@ilchev.com>2024-08-05 20:51:31 +0300
commite8fffcffbb06ad2a77771af5e452645937675066 (patch)
treeeedb3d02a02cb9d3e709cb23a90be3b052eb64a3
parent9d69cffa1446e03b6c425f974b14c33551a5e07a (diff)
downloadluarocks-e8fffcffbb06ad2a77771af5e452645937675066.tar.gz
luarocks-e8fffcffbb06ad2a77771af5e452645937675066.tar.bz2
luarocks-e8fffcffbb06ad2a77771af5e452645937675066.zip
added manifest and rockspec tl files
-rw-r--r--src/luarocks/type/manifest.tl80
-rw-r--r--src/luarocks/type/rockspec.tl221
2 files changed, 301 insertions, 0 deletions
diff --git a/src/luarocks/type/manifest.tl b/src/luarocks/type/manifest.tl
new file mode 100644
index 00000000..043366ea
--- /dev/null
+++ b/src/luarocks/type/manifest.tl
@@ -0,0 +1,80 @@
1local type_manifest = {}
2
3local type_check = require("luarocks.type_check")
4
5local manifest_formats = type_check.declare_schemas({
6 ["3.0"] = {
7 repository = {
8 _mandatory = true,
9 -- packages
10 _any = {
11 -- versions
12 _any = {
13 -- items
14 _any = {
15 arch = { _type = "string", _mandatory = true },
16 modules = { _any = { _type = "string" } },
17 commands = { _any = { _type = "string" } },
18 dependencies = { _any = { _type = "string" } },
19 -- TODO: to be extended with more metadata.
20 }
21 }
22 }
23 },
24 modules = {
25 _mandatory = true,
26 -- modules
27 _any = {
28 -- providers
29 _any = { _type = "string" }
30 }
31 },
32 commands = {
33 _mandatory = true,
34 -- modules
35 _any = {
36 -- commands
37 _any = { _type = "string" }
38 }
39 },
40 dependencies = {
41 -- each module
42 _any = {
43 -- each version
44 _any = {
45 -- each dependency
46 _any = {
47 name = { _type = "string" },
48 namespace = { _type = "string" },
49 constraints = {
50 _any = {
51 no_upgrade = { _type = "boolean" },
52 op = { _type = "string" },
53 version = {
54 string = { _type = "string" },
55 _any = { _type = "number" },
56 }
57 }
58 }
59 }
60 }
61 }
62 }
63 }
64})
65
66--- Type check a manifest table.
67-- Verify the correctness of elements from a
68-- manifest table, reporting on unknown fields and type
69-- mismatches.
70-- @return boolean or (nil, string): true if type checking
71-- succeeded, or nil and an error message if it failed.
72function type_manifest.check(manifest, globals)
73 assert(type(manifest) == "table")
74 local format = manifest_formats["3.0"]
75 local ok, err = type_check.check_undeclared_globals(globals, format)
76 if not ok then return nil, err end
77 return type_check.type_check_table("3.0", manifest, format, "")
78end
79
80return type_manifest
diff --git a/src/luarocks/type/rockspec.tl b/src/luarocks/type/rockspec.tl
new file mode 100644
index 00000000..0b3cf31f
--- /dev/null
+++ b/src/luarocks/type/rockspec.tl
@@ -0,0 +1,221 @@
1local type_rockspec = {}
2
3local type_check = require("luarocks.type_check")
4
5type_rockspec.rockspec_format = "3.0"
6
7-- Syntax for type-checking tables:
8--
9-- A type-checking table describes typing data for a value.
10-- Any key starting with an underscore has a special meaning:
11-- _type (string) is the Lua type of the value. Default is "table".
12-- _mandatory (boolean) indicates if the value is a mandatory key in its container table. Default is false.
13-- For "string" types only:
14-- _pattern (string) is the string-matching pattern, valid for string types only. Default is ".*".
15-- For "table" types only:
16-- _any (table) is the type-checking table for unspecified keys, recursively checked.
17-- _more (boolean) indicates that the table accepts unspecified keys and does not type-check them.
18-- Any other string keys that don't start with an underscore represent known keys and are type-checking tables, recursively checked.
19
20local rockspec_formats, versions = type_check.declare_schemas({
21 ["1.0"] = {
22 rockspec_format = { _type = "string" },
23 package = { _type = "string", _mandatory = true },
24 version = { _type = "string", _pattern = "[%w.]+-[%d]+", _mandatory = true },
25 description = {
26 summary = { _type = "string" },
27 detailed = { _type = "string" },
28 homepage = { _type = "string" },
29 license = { _type = "string" },
30 maintainer = { _type = "string" },
31 },
32 dependencies = {
33 platforms = type_check.MAGIC_PLATFORMS,
34 _any = {
35 _type = "string",
36 _name = "a valid dependency string",
37 _pattern = "%s*([a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)",
38 },
39 },
40 supported_platforms = {
41 _any = { _type = "string" },
42 },
43 external_dependencies = {
44 platforms = type_check.MAGIC_PLATFORMS,
45 _any = {
46 program = { _type = "string" },
47 header = { _type = "string" },
48 library = { _type = "string" },
49 }
50 },
51 source = {
52 _mandatory = true,
53 platforms = type_check.MAGIC_PLATFORMS,
54 url = { _type = "string", _mandatory = true },
55 md5 = { _type = "string" },
56 file = { _type = "string" },
57 dir = { _type = "string" },
58 tag = { _type = "string" },
59 branch = { _type = "string" },
60 module = { _type = "string" },
61 cvs_tag = { _type = "string" },
62 cvs_module = { _type = "string" },
63 },
64 build = {
65 platforms = type_check.MAGIC_PLATFORMS,
66 type = { _type = "string" },
67 install = {
68 lua = {
69 _more = true
70 },
71 lib = {
72 _more = true
73 },
74 conf = {
75 _more = true
76 },
77 bin = {
78 _more = true
79 }
80 },
81 copy_directories = {
82 _any = { _type = "string" },
83 },
84 _more = true,
85 _mandatory = true
86 },
87 hooks = {
88 platforms = type_check.MAGIC_PLATFORMS,
89 post_install = { _type = "string" },
90 },
91 },
92
93 ["1.1"] = {
94 deploy = {
95 wrap_bin_scripts = { _type = "boolean" },
96 }
97 },
98
99 ["3.0"] = {
100 description = {
101 labels = {
102 _any = { _type = "string" }
103 },
104 issues_url = { _type = "string" },
105 },
106 dependencies = {
107 _any = {
108 _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)",
109 },
110 },
111 build_dependencies = {
112 platforms = type_check.MAGIC_PLATFORMS,
113 _any = {
114 _type = "string",
115 _name = "a valid dependency string",
116 _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)",
117 },
118 },
119 test_dependencies = {
120 platforms = type_check.MAGIC_PLATFORMS,
121 _any = {
122 _type = "string",
123 _name = "a valid dependency string",
124 _pattern = "%s*([a-zA-Z0-9%.%-%_]*/?[a-zA-Z0-9][a-zA-Z0-9%.%-%_]*)%s*([^/]*)",
125 },
126 },
127 build = {
128 _mandatory = false,
129 },
130 test = {
131 platforms = type_check.MAGIC_PLATFORMS,
132 type = { _type = "string" },
133 _more = true,
134 },
135 }
136})
137
138-- type_rockspec.order = {"rockspec_format", "package", "version",
139-- { "source", { "url", "tag", "branch", "md5" } },
140-- { "description", {"summary", "detailed", "homepage", "license" } },
141-- "supported_platforms", "dependencies", "build_dependencies", "external_dependencies",
142-- { "build", {"type", "modules", "copy_directories", "platforms"} },
143-- "test_dependencies", { "test", {"type"} },
144-- "hooks"}
145
146type_rockspec.order = {
147 "rockspec_format",
148 "package",
149 "version",
150 "source",
151 "description",
152 "supported_platforms",
153 "dependencies",
154 "build_dependencies",
155 "external_dependencies",
156 "build",
157 "test_dependencies",
158 "test",
159 "hooks",
160 sub_orders = {
161 ["source"] = { "url", "tag", "branch", "md5" },
162 ["description"] = {"summary", "detailed", "homepage", "license" },
163 ["build"] = { "type", "modules", "copy_directories", "platforms" },
164 ["test"] = { "type" }
165 }
166}
167
168local function check_rockspec_using_version(rockspec, globals, version)
169 local schema = rockspec_formats[version]
170 if not schema then
171 return nil, "unknown rockspec format " .. version
172 end
173 local ok, err = type_check.check_undeclared_globals(globals, schema)
174 if ok then
175 ok, err = type_check.type_check_table(version, rockspec, schema, "")
176 end
177 if ok then
178 return true
179 else
180 return nil, err
181 end
182end
183
184--- Type check a rockspec table.
185-- Verify the correctness of elements from a
186-- rockspec table, reporting on unknown fields and type
187-- mismatches.
188-- @return boolean or (nil, string): true if type checking
189-- succeeded, or nil and an error message if it failed.
190function type_rockspec.check(rockspec, globals)
191 assert(type(rockspec) == "table")
192
193 local version = rockspec.rockspec_format or "1.0"
194 local ok, err = check_rockspec_using_version(rockspec, globals, version)
195 if ok then
196 return true
197 end
198
199 -- Rockspec parsing failed.
200 -- Let's see if it would pass using a later version.
201
202 local found = false
203 for _, v in ipairs(versions) do
204 if not found then
205 if v == version then
206 found = true
207 end
208 else
209 local v_ok, v_err = check_rockspec_using_version(rockspec, globals, v)
210 if v_ok then
211 return nil, err .. " (using rockspec format " .. version .. " -- " ..
212 [[adding 'rockspec_format = "]] .. v .. [["' to the rockspec ]] ..
213 [[will fix this)]]
214 end
215 end
216 end
217
218 return nil, err .. " (using rockspec format " .. version .. ")"
219end
220
221return type_rockspec