|
1 | | -# Copyright (C) 2019 Dmitry Marakasov <amdmi3@amdmi3.ru> |
| 1 | +# Copyright (C) 2019-2026 Dmitry Marakasov <amdmi3@amdmi3.ru> |
2 | 2 | # |
3 | 3 | # This file is part of repology |
4 | 4 | # |
|
17 | 17 |
|
18 | 18 | from typing import Any, Iterable |
19 | 19 |
|
20 | | -from pyparsing import Empty, Forward, QuotedString, Regex, Suppress, ZeroOrMore |
| 20 | +from libversion import version_compare |
21 | 21 |
|
22 | 22 | from repology.packagemaker import NameType, PackageFactory, PackageMaker |
23 | 23 | from repology.parsers import Parser |
24 | | - |
25 | | - |
26 | | -def _parse_data(data: str) -> dict[str, Any]: |
27 | | - lcur, rcur, lbrk, rbrk, comma, eq = map(Suppress, '{}[],=') |
28 | | - |
29 | | - tablekey = Regex(r'[a-z][a-z0-9_]*') | (lbrk + QuotedString(quoteChar="'") + rbrk) |
30 | | - qstring = QuotedString(quoteChar='"') |
31 | | - |
32 | | - value = Forward() |
33 | | - |
34 | | - keyval = (tablekey + eq + value).setParseAction(lambda s, l, t: [(str(t[0]), t[1])]) |
35 | | - |
36 | | - array_table = (value + ZeroOrMore(comma + value)).setParseAction(lambda s, l, t: [list(t)]) |
37 | | - dict_table = (keyval + ZeroOrMore(comma + keyval)).setParseAction(lambda s, l, t: [{k: v for k, v in t}]) |
38 | | - |
39 | | - # mypy: Call to untyped function "Empty" in typed context |
40 | | - # srsly? why only Empty, why not other pyparsing classes? how can I fix it? |
41 | | - table = lcur + (dict_table | array_table | Empty().setParseAction(lambda s, l, t: [None])) + rcur |
42 | | - value << (qstring | table) |
43 | | - |
44 | | - root = ZeroOrMore(keyval).setParseAction(lambda s, l, t: {k: v for k, v in t}) |
45 | | - |
46 | | - return root.parseString(data, parseAll=True)[0] # type: ignore |
| 24 | +from repology.parsers.json import iter_json_dict |
| 25 | +from repology.parsers.versions import VersionStripper |
47 | 26 |
|
48 | 27 |
|
49 | 28 | class LuaRocksParser(Parser): |
50 | 29 | def iter_parse(self, path: str, factory: PackageFactory) -> Iterable[PackageMaker]: |
51 | | - with open(path, encoding='utf-8', errors='ignore') as contents: |
52 | | - data = contents.read() |
| 30 | + normalize_version = VersionStripper().strip_right('-') |
53 | 31 |
|
54 | | - for pkgname, pkgdata in _parse_data(data)['repository'].items(): |
55 | | - with factory.begin() as pkg: |
| 32 | + for pkgname, pkgversions in iter_json_dict(path, ('repository', None)): |
| 33 | + with factory.begin(pkgname) as pkg: |
56 | 34 | pkg.add_name(pkgname, NameType.LUAROCKS_NAME) |
57 | | - |
58 | | - for version, versiondatas in pkgdata.items(): |
59 | | - for versiondata in versiondatas: |
60 | | - verpkg = pkg.clone() |
61 | | - |
62 | | - verpkg.set_rawversion(version) |
63 | | - verpkg.set_version(version.rsplit('-', 1)[0]) |
64 | | - verpkg.set_arch(versiondata['arch']) |
65 | | - |
66 | | - yield verpkg |
| 35 | + version = max(pkgversions.keys(), key=cmp_to_key(version_compare)) |
| 36 | + verpkg.set_version(version, normalize_version) |
0 commit comments