qlever 0.5.11__py3-none-any.whl → 0.5.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of qlever might be problematic. Click here for more details.

qlever/commands/query.py CHANGED
@@ -18,42 +18,82 @@ class QueryCommand(QleverCommand):
18
18
  pass
19
19
 
20
20
  def description(self) -> str:
21
- return ("Send a query to a SPARQL endpoint")
21
+ return "Send a query to a SPARQL endpoint"
22
22
 
23
23
  def should_have_qleverfile(self) -> bool:
24
24
  return False
25
25
 
26
- def relevant_qleverfile_arguments(self) -> dict[str: list[str]]:
27
- return {"server": ["port"]}
26
+ def relevant_qleverfile_arguments(self) -> dict[str : list[str]]:
27
+ return {"server": ["port", "access_token"]}
28
28
 
29
29
  def additional_arguments(self, subparser) -> None:
30
- subparser.add_argument("--query", type=str,
31
- default="SELECT * WHERE { ?s ?p ?o } LIMIT 10",
32
- help="SPARQL query to send")
33
- subparser.add_argument("--sparql-endpoint", type=str,
34
- help="URL of the SPARQL endpoint")
35
- subparser.add_argument("--accept", type=str,
36
- choices=["text/tab-separated-values",
37
- "text/csv",
38
- "application/sparql-results+json",
39
- "application/sparql-results+xml",
40
- "application/qlever-results+json"],
41
- default="text/tab-separated-values",
42
- help="Accept header for the SPARQL query")
43
- subparser.add_argument("--no-time", action="store_true",
44
- default=False,
45
- help="Do not print the (end-to-end) time taken")
30
+ subparser.add_argument(
31
+ "query",
32
+ type=str,
33
+ nargs="?",
34
+ default="SELECT * WHERE { ?s ?p ?o } LIMIT 10",
35
+ help="SPARQL query to send",
36
+ )
37
+ subparser.add_argument(
38
+ "--pin-to-cache",
39
+ action="store_true",
40
+ default=False,
41
+ help="Pin the query to the cache",
42
+ )
43
+ subparser.add_argument(
44
+ "--sparql-endpoint", type=str, help="URL of the SPARQL endpoint"
45
+ )
46
+ subparser.add_argument(
47
+ "--accept",
48
+ type=str,
49
+ choices=[
50
+ "text/tab-separated-values",
51
+ "text/csv",
52
+ "application/sparql-results+json",
53
+ "application/sparql-results+xml",
54
+ "application/qlever-results+json",
55
+ ],
56
+ default="text/tab-separated-values",
57
+ help="Accept header for the SPARQL query",
58
+ )
59
+ subparser.add_argument(
60
+ "--no-time",
61
+ action="store_true",
62
+ default=False,
63
+ help="Do not print the (end-to-end) time taken",
64
+ )
46
65
 
47
66
  def execute(self, args) -> bool:
67
+ # When pinning to the cache, set `send=0` and request media type
68
+ # `application/qlever-results+json` so that we get the result size.
69
+ # Also, we need to provide the access token.
70
+ if args.pin_to_cache:
71
+ args.accept = "application/qlever-results+json"
72
+ curl_cmd_additions = (
73
+ f" --data pinresult=true --data send=0"
74
+ f" --data access-token="
75
+ f"{shlex.quote(args.access_token)}"
76
+ f" | jq .resultsize | numfmt --grouping"
77
+ f" | xargs -I {{}} printf"
78
+ f' "Result pinned to cache,'
79
+ f' number of rows: {{}}\\n"'
80
+ )
81
+ else:
82
+ curl_cmd_additions = ""
83
+
48
84
  # Show what the command will do.
49
- sparql_endpoint = (args.sparql_endpoint if args.sparql_endpoint
50
- else f"localhost:{args.port}")
51
- curl_cmd = (f"curl -s {sparql_endpoint}"
52
- f" -H \"Accept: {args.accept}\""
53
- f" --data-urlencode query={shlex.quote(args.query)}")
85
+ sparql_endpoint = (
86
+ args.sparql_endpoint if args.sparql_endpoint else f"localhost:{args.port}"
87
+ )
88
+ curl_cmd = (
89
+ f"curl -s {sparql_endpoint}"
90
+ f' -H "Accept: {args.accept}"'
91
+ f" --data-urlencode query={shlex.quote(args.query)}"
92
+ f"{curl_cmd_additions}"
93
+ )
54
94
  self.show(curl_cmd, only_show=args.show)
55
95
  if args.show:
56
- return False
96
+ return True
57
97
 
58
98
  # Launch query.
59
99
  try:
@@ -62,8 +102,7 @@ class QueryCommand(QleverCommand):
62
102
  time_msecs = round(1000 * (time.time() - start_time))
63
103
  if not args.no_time and args.log_level != "NO_LOG":
64
104
  log.info("")
65
- log.info(f"Query processing time (end-to-end):"
66
- f" {time_msecs:,d} ms")
105
+ log.info(f"Query processing time (end-to-end):" f" {time_msecs:,d} ms")
67
106
  except Exception as e:
68
107
  if args.log_level == "DEBUG":
69
108
  traceback.print_exc()
@@ -60,7 +60,7 @@ class SetupConfigCommand(QleverCommand):
60
60
  setup_config_cmd += "> Qleverfile"
61
61
  self.show(setup_config_cmd, only_show=args.show)
62
62
  if args.show:
63
- return False
63
+ return True
64
64
 
65
65
  # If there is already a Qleverfile in the current directory, exit.
66
66
  qleverfile_path = Path("Qleverfile")
qlever/commands/start.py CHANGED
@@ -72,7 +72,9 @@ class StartCommand(QleverCommand):
72
72
  if args.kill_existing_with_same_port:
73
73
  args.cmdline_regex = f"^ServerMain.* -p {args.port}"
74
74
  args.no_containers = True
75
- StopCommand().execute(args)
75
+ if not StopCommand().execute(args):
76
+ log.error("Stopping the existing server failed")
77
+ return False
76
78
  log.info("")
77
79
 
78
80
  # Construct the command line based on the config file.
@@ -115,7 +117,7 @@ class StartCommand(QleverCommand):
115
117
  # Show the command line.
116
118
  self.show(start_cmd, only_show=args.show)
117
119
  if args.show:
118
- return False
120
+ return True
119
121
 
120
122
  # When running natively, check if the binary exists and works.
121
123
  if args.system == "native":
@@ -192,6 +194,7 @@ class StartCommand(QleverCommand):
192
194
  run_command(curl_cmd)
193
195
  except Exception as e:
194
196
  log.error(f"Setting the index description failed ({e})")
197
+ return False
195
198
  if args.text_description:
196
199
  text_desc = args.text_description
197
200
  curl_cmd = (f"curl -Gs http://localhost:{port}/api"
@@ -202,6 +205,7 @@ class StartCommand(QleverCommand):
202
205
  run_command(curl_cmd)
203
206
  except Exception as e:
204
207
  log.error(f"Setting the text description failed ({e})")
208
+ return False
205
209
 
206
210
  # Kill the tail process. NOTE: `tail_proc.kill()` does not work.
207
211
  tail_proc.terminate()
@@ -209,7 +213,9 @@ class StartCommand(QleverCommand):
209
213
  # Execute the warmup command.
210
214
  if args.warmup_cmd and not args.no_warmup:
211
215
  log.info("")
212
- WarmupCommand().execute(args)
216
+ if not WarmupCommand().execute(args):
217
+ log.error("Warmup failed")
218
+ return False
213
219
 
214
220
  # Show cache stats.
215
221
  log.info("")
qlever/commands/status.py CHANGED
@@ -35,7 +35,7 @@ class StatusCommand(QleverCommand):
35
35
  f"the command line matches {args.cmdline_regex}"
36
36
  f" using Python's psutil library", only_show=args.show)
37
37
  if args.show:
38
- return False
38
+ return True
39
39
 
40
40
  # Show the results as a table.
41
41
  num_processes_found = 0
@@ -47,3 +47,4 @@ class StatusCommand(QleverCommand):
47
47
  num_processes_found += 1
48
48
  if num_processes_found == 0:
49
49
  print("No processes found")
50
+ return True
qlever/commands/stop.py CHANGED
@@ -49,7 +49,7 @@ class StopCommand(QleverCommand):
49
49
  f"\"{args.server_container}\"")
50
50
  self.show(description, only_show=args.show)
51
51
  if args.show:
52
- return False
52
+ return True
53
53
 
54
54
  # First check if there is container running and if yes, stop and remove
55
55
  # it (unless the user has specified `--no-containers`).
@@ -90,14 +90,12 @@ class StopCommand(QleverCommand):
90
90
  return False
91
91
  return True
92
92
 
93
- # No matching process found.
93
+ # If no matching process found, show a message and the output of the
94
+ # status command.
94
95
  message = "No matching process found" if args.no_containers else \
95
96
  "No matching process or container found"
96
97
  log.error(message)
97
-
98
- # Show output of status command.
99
98
  args.cmdline_regex = "^ServerMain.* -i [^ ]*"
100
99
  log.info("")
101
100
  StatusCommand().execute(args)
102
-
103
- return False
101
+ return True
@@ -58,7 +58,7 @@ class SystemInfoCommand(QleverCommand):
58
58
  # Say what the command is doing.
59
59
  self.show("Show system information and Qleverfile", only_show=args.show)
60
60
  if args.show:
61
- return False
61
+ return True
62
62
 
63
63
  # Show system information.
64
64
  show_heading("System Information")
qlever/commands/ui.py CHANGED
@@ -70,8 +70,10 @@ class UiCommand(QleverCommand):
70
70
  "\n".join(["Stop running containers", pull_cmd, run_cmd, exec_cmd]),
71
71
  only_show=args.show,
72
72
  )
73
- if qlever_is_running_in_container or args.show:
73
+ if qlever_is_running_in_container:
74
74
  return False
75
+ if args.show:
76
+ return True
75
77
 
76
78
  # Stop running containers.
77
79
  for container_system in Containerize.supported_systems():
qlever/commands/warmup.py CHANGED
@@ -30,7 +30,7 @@ class WarmupCommand(QleverCommand):
30
30
  # Show what the command is doing.
31
31
  self.show(args.warmup_cmd, only_show=args.show)
32
32
  if args.show:
33
- return False
33
+ return True
34
34
 
35
35
  # Execute the command.
36
36
  try:
qlever/qlever_main.py CHANGED
@@ -35,31 +35,38 @@ def main():
35
35
  log.info("")
36
36
  log.info(colored(f"Command: {args.command}", attrs=["bold"]))
37
37
  log.info("")
38
- command_object.execute(args)
38
+ commandWasSuccesful = command_object.execute(args)
39
39
  log.info("")
40
+ if not commandWasSuccesful:
41
+ exit(1)
40
42
  except KeyboardInterrupt:
41
43
  log.info("")
42
44
  log.info("Ctrl-C pressed, exiting ...")
43
45
  log.info("")
44
- exit(0)
46
+ exit(1)
45
47
  except Exception as e:
46
48
  # Check if it's a certain kind of `AttributeError` and give a hint in
47
49
  # that case.
48
50
  match_error = re.search(r"object has no attribute '(.+)'", str(e))
49
- match_trace = re.search(r"(qlever/commands/.+\.py)\", line (\d+)",
50
- traceback.format_exc())
51
+ match_trace = re.search(
52
+ r"(qlever/commands/.+\.py)\", line (\d+)", traceback.format_exc()
53
+ )
51
54
  if isinstance(e, AttributeError) and match_error and match_trace:
52
55
  attribute = match_error.group(1)
53
56
  trace_command = match_trace.group(1)
54
57
  trace_line = match_trace.group(2)
55
58
  log.error(f"{e} in `{trace_command}` at line {trace_line}")
56
59
  log.info("")
57
- log.info(f"Likely cause: you used `args.{attribute}`, but it was "
58
- f"neither defined in `relevant_qleverfile_arguments` "
59
- f"nor in `additional_arguments`")
60
+ log.info(
61
+ f"Likely cause: you used `args.{attribute}`, but it was "
62
+ f"neither defined in `relevant_qleverfile_arguments` "
63
+ f"nor in `additional_arguments`"
64
+ )
60
65
  log.info("")
61
- log.info(f"If you did not implement `{trace_command}` yourself, "
62
- f"please report this issue")
66
+ log.info(
67
+ f"If you did not implement `{trace_command}` yourself, "
68
+ f"please report this issue"
69
+ )
63
70
  log.info("")
64
71
  else:
65
72
  log.error(f"An unexpected error occurred: {e}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qlever
3
- Version: 0.5.11
3
+ Version: 0.5.15
4
4
  Summary: Script for using the QLever SPARQL engine.
5
5
  Author-email: Hannah Bast <bast@cs.uni-freiburg.de>
6
6
  License: Apache-2.0
@@ -3,11 +3,11 @@ qlever/command.py,sha256=yOr0Uc8D8-AM7EjwDsVzbc3KNYjPH-FVOZhIHkqO588,2749
3
3
  qlever/config.py,sha256=qYPy-MQ7BwGrvKSazQWhs0lnlOFqm-d47mpZhc3fptc,10254
4
4
  qlever/containerize.py,sha256=bnHmjKIFEe-NcuAMRNnXAFjRVLcLnk9f5JspCCyhgt8,5210
5
5
  qlever/log.py,sha256=2O_RvFymnu_dB10ErBTAOsI8bgjORfdD0tE3USH-siM,1315
6
- qlever/qlever_main.py,sha256=tA_xqOs_FjvqlDIvKTprwuysfTwzsUjE7at26gRhCVA,2336
6
+ qlever/qlever_main.py,sha256=-E4W8YdZ_teszGwXu6bQgBcH3y47TFJU8JLPIDwc_-g,2449
7
7
  qlever/qlever_old.py,sha256=X-JxmepFKYeFgSLLp0TRDNqXSxDwIbc8_0Xstiems8c,62026
8
8
  qlever/qleverfile.py,sha256=lygAjI5_wV_e-JoIGIqVTdd4yyvApzZiSlqSsmdlJpU,14529
9
9
  qlever/util.py,sha256=qLxBRyHPT2VTj0xcOCFcP6HV-Lm-g-64QpvOc4V0_a8,8029
10
- qlever/Qleverfiles/Qleverfile.dblp,sha256=wXZweNfYgEx-IGF1vIJMgqYUSWanQlzPj1EzUOGVuXA,1340
10
+ qlever/Qleverfiles/Qleverfile.dblp,sha256=RaTJrabloAdaHwSl5V7Ws9phWyM_oXPSeZpKodZXA6c,1256
11
11
  qlever/Qleverfiles/Qleverfile.dblp-plus,sha256=TJHxp8I1P6JKJjbuAllEpB32-huuY1gH0FlenqPVJ5g,1334
12
12
  qlever/Qleverfiles/Qleverfile.dbpedia,sha256=aaNZZayE-zVePGSwPzXemkX__Ns8-kP_E7DNNKZPnqg,1160
13
13
  qlever/Qleverfiles/Qleverfile.default,sha256=Kj-J1Kkv8PWN7wuMdZU6DUUlEuBIcSNysJCE-R63we8,2407
@@ -20,33 +20,33 @@ qlever/Qleverfiles/Qleverfile.olympics,sha256=5w9BOFwEBhdSzPz-0LRxwhv-7Gj6xbF539
20
20
  qlever/Qleverfiles/Qleverfile.orkg,sha256=Uizz-RhlSeExgfckWztewa4l_v3zMN8IR7NaGYKrqt4,937
21
21
  qlever/Qleverfiles/Qleverfile.osm-country,sha256=Pb9o5H3b7wVlVRgdiPHWCvrnkIRS1YUhxOazbUmoKZE,1897
22
22
  qlever/Qleverfiles/Qleverfile.osm-planet,sha256=555aaMOIzAILvzwpCjucd_GE7TlYxmT2Qh8hME68stU,1418
23
- qlever/Qleverfiles/Qleverfile.pubchem,sha256=YuDzWQmukSvL1opu7cf1KX9407_P21lmecYZ9cdbuvA,5611
23
+ qlever/Qleverfiles/Qleverfile.pubchem,sha256=ooSj2gqTzbGY_pMCvfL-MfE7Z0d5hQB4_EF5Pp2Mn6M,14465
24
24
  qlever/Qleverfiles/Qleverfile.scientists,sha256=9eZ2c6P9a3E3VHa3RR7LdOQbF4k3oyyrn56Z3u4LZYs,1164
25
- qlever/Qleverfiles/Qleverfile.uniprot,sha256=9kAKseomdUnIt7EAZge39g1MTuaLVaSW9JYLHzIMolM,2338
25
+ qlever/Qleverfiles/Qleverfile.uniprot,sha256=Yejez7uel9Vp8e4w-fI8-qLSqWyDUvjlq33gpebVC5k,6329
26
26
  qlever/Qleverfiles/Qleverfile.vvz,sha256=cLzm85erKoFCDllH5eFcSi35MdR6Tahj1MgtvGRxanM,922
27
- qlever/Qleverfiles/Qleverfile.wikidata,sha256=JyWB7haqulineO3aPEsXqx12OpantxfxueeofcvMjpk,2343
27
+ qlever/Qleverfiles/Qleverfile.wikidata,sha256=zVUXF75XJyK1h-J-7EjFemzmkSyoPtng1mNY3U7S78M,2061
28
28
  qlever/Qleverfiles/Qleverfile.wikipathways,sha256=UFEVLrtOBiSQfibBN9xc2wDXrnWcnx5f8PY9khcE6bc,1983
29
29
  qlever/Qleverfiles/Qleverfile.yago-4,sha256=hAS_2ZmC1zxNsKXip7t1F_iqu3CC-6O7v6HZhuFbnWY,1819
30
30
  qlever/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- qlever/commands/add_text_index.py,sha256=dkqYtwgOhgnXiei_eyhBWYCtdAiQUEmjWoa3JMlMb4c,3641
32
- qlever/commands/cache_stats.py,sha256=6JjueQstAqc8dNfgY8TP2EitFMxdUvCwrcyd7KUEb2o,4157
33
- qlever/commands/clear_cache.py,sha256=AnE1MOoj1ZexxrRT8FGeBLlv8rtQIVV4DP8VBn5-X-s,2843
34
- qlever/commands/example_queries.py,sha256=rtMOQw7cJe0Aia_1O7UyKcxHbz7ln9BSZYWUQI9OFA8,16389
35
- qlever/commands/get_data.py,sha256=f9kjZI3TKad6JHSuXWNkeoajmW8h0Sx8ShvjauDCtNo,1412
36
- qlever/commands/index.py,sha256=G4SPxJ1PW8KsLYl4OBV4rOLKSo-O3aR6nTT_0K6zAgU,10376
37
- qlever/commands/index_stats.py,sha256=_BiUNBhmbYd9RPxrlm4HF0oENO6JmqnRiAkwkyOdN4U,11722
38
- qlever/commands/log.py,sha256=8Krt3MsTUDapYqVw1zUu5X15SF8mV97Uj0qKOWK8jXk,1861
39
- qlever/commands/query.py,sha256=_IDH-M8gKL_f1i5wzu0X452pZSUD0_qXl6bPXC85wX0,2750
40
- qlever/commands/setup_config.py,sha256=p0-wJcalzEOrSkIiaicQjOkp_WVNEeLsd0A_WZrlGfs,3345
41
- qlever/commands/start.py,sha256=2rOtk3NmhEs28D5csL_a1BdjSWU9VkcH6AqYT0vdww0,9285
42
- qlever/commands/status.py,sha256=5S6EdapZEwFKV9cQZtNYcZhMbAXAY-FP6ggjIhfX8ek,1631
43
- qlever/commands/stop.py,sha256=TZs4bxKHvujlZAU8BZmFjA5eXSZNAa6EeNzvPpEZsuI,4139
44
- qlever/commands/system_info.py,sha256=SShsnEV7QROgdbABeJ6Wk4U_CNjqlYO1J5HrpNCVNMs,4615
45
- qlever/commands/ui.py,sha256=rZxIYHZr-PqgQKfvVwl8woDnTGR-sFc-f6cPjcORaOk,3611
46
- qlever/commands/warmup.py,sha256=WOZSxeV8U_F6pEEnAb6YybXLQMxZFTRJXs4BPHUhsmc,1030
47
- qlever-0.5.11.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
48
- qlever-0.5.11.dist-info/METADATA,sha256=Cy1xk-ZJLRR1r5LPwvAFwzuvJZwdTpDW8puG57Un-0Y,4583
49
- qlever-0.5.11.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
50
- qlever-0.5.11.dist-info/entry_points.txt,sha256=U_gbYYi0wwdsn884eb0XoOXfvhACOsxhlO330dZ9bi0,87
51
- qlever-0.5.11.dist-info/top_level.txt,sha256=kd3zsYqiFd0--Czh5XTVkfEq6XR-XgRFW35X0v0GT-c,7
52
- qlever-0.5.11.dist-info/RECORD,,
31
+ qlever/commands/add_text_index.py,sha256=cvBhX5rooRAXsn1Oput6b0B10w-MGMfS4ZPAhDfm7OQ,3669
32
+ qlever/commands/cache_stats.py,sha256=zGPLSWDNn7dwAAt2o-2ExqHmw1FeN8i6nEQbaaqF830,4156
33
+ qlever/commands/clear_cache.py,sha256=n52ohE1EE4M_B4kId_v8tbAlW-BGwG1K-ZYQ9QgxIJU,2974
34
+ qlever/commands/example_queries.py,sha256=g5s9nPDj9SmvLYF_sexESDJxl7YzM9cAbNqPVU5-wZg,19526
35
+ qlever/commands/get_data.py,sha256=nHOHMjv0tSLWJDOR0ba_LK-Bk-mcGnphb8hbqcVYFhE,1411
36
+ qlever/commands/index.py,sha256=02o_-EFwxyCOY7Pl49O1tVvMQELWTb5tCwdmSlNgM8w,12777
37
+ qlever/commands/index_stats.py,sha256=9EBo1Oq5PGjajrvWJNafJ-Wg_d90DaO5AGq9a5plSRM,11720
38
+ qlever/commands/log.py,sha256=vLqkgtx1udnQqoUBMWB5G9rwr-l7UKrDpyFYSMuoXWw,1987
39
+ qlever/commands/query.py,sha256=vu6vTeTqtKhuKbv_wzloHvbJFj_2GTHPIfDpQfrc8FE,3603
40
+ qlever/commands/setup_config.py,sha256=wEy1LAunpOnqrUCbazMpt1u9HJCKgXJEMxF3zjh0jb0,3344
41
+ qlever/commands/start.py,sha256=TdAulZqkTv9W0QBPwQqg-ixYI3iHMpZ1SHHvFRO_jbs,9524
42
+ qlever/commands/status.py,sha256=TtnBqcdkF3zTDKft07zpVcIX7kFu7d_nOy9b6Ohh9vQ,1650
43
+ qlever/commands/stop.py,sha256=AVafaoNb1JYmhulZ9_Bvq5gKcxBekb-S1QQRjBFo_-k,4160
44
+ qlever/commands/system_info.py,sha256=Y3DtUJAlnh6uSvIVoToE10G7SStu-L5NbalIXvBB6D0,4614
45
+ qlever/commands/ui.py,sha256=Ppo6YXA8JXNDPvC5D5duKGMPyhRvXfc1CaoSwjL-jBg,3644
46
+ qlever/commands/warmup.py,sha256=kJHzS7HJo8pD2CphJuaXDj_CYP02YDo2DVM-pun3A80,1029
47
+ qlever-0.5.15.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
48
+ qlever-0.5.15.dist-info/METADATA,sha256=A9M3q3eqWpFdUBOgKMNiPE8LnR5u78LCHJqCIZaQAfY,4583
49
+ qlever-0.5.15.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
50
+ qlever-0.5.15.dist-info/entry_points.txt,sha256=U_gbYYi0wwdsn884eb0XoOXfvhACOsxhlO330dZ9bi0,87
51
+ qlever-0.5.15.dist-info/top_level.txt,sha256=kd3zsYqiFd0--Czh5XTVkfEq6XR-XgRFW35X0v0GT-c,7
52
+ qlever-0.5.15.dist-info/RECORD,,