Skip to content

Commit de40a76

Browse files
committed
tries fixing CI
1 parent 6c3a012 commit de40a76

File tree

3 files changed

+102
-21
lines changed

3 files changed

+102
-21
lines changed

lodstorage/query.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717
from lodstorage.mwTable import MediaWikiTable
1818
from lodstorage.params import Param, Params
1919
from lodstorage.prefix_config import PrefixConfigs
20+
from lodstorage.prefixes import Prefixes
2021
from pygments import highlight
2122
from pygments.formatters.html import HtmlFormatter
2223
from pygments.formatters.latex import LatexFormatter
2324
from pygments.lexers import get_lexer_by_name
2425
from tabulate import tabulate
2526
import yaml
27+
2628
from lodstorage.yaml_path import YamlPath
2729

2830

@@ -424,11 +426,29 @@ def getLink(self, url, title, tablefmt):
424426
markup = r"\href{%s}{%s}" % (url, title)
425427
return markup
426428

427-
def add_endpoint_prefixes(self, endpoint: "Endpoint", prefix_configs: PrefixConfigs):
429+
430+
def add_endpoint_prefixes(self, endpoint: "Endpoint", prefix_configs: PrefixConfigs) -> None:
431+
"""
432+
Add endpoint-specific PREFIX declarations to this query (via prefix_sets or legacy prefixes).
433+
434+
Merges (deduplicates by prefix name) endpoint prefixes into self.query using Prefixes.merge_prefixes().
435+
Updates self.prefixes to full unique PREFIX lines list. Safe/idempotent (no-op if prefixes_str empty).
436+
437+
Args:
438+
endpoint (Endpoint): Endpoint config with prefix_sets or legacy prefixes.
439+
prefix_configs (PrefixConfigs): Loaded prefix configurations resolver.
440+
"""
428441
prefixes_str = endpoint.get_prefixes(prefix_configs)
429-
if prefixes_str:
430-
self.prefixes = prefixes_str.splitlines()
431-
self.query = f"{prefixes_str}\n{self.query}"
442+
if not prefixes_str.strip():
443+
return
444+
445+
# Merge: Prepend ONLY missing prefixes (no dups like 'rdfs')
446+
self.query = Prefixes.merge_prefixes(self.query, prefixes_str)
447+
448+
# Update self.prefixes: Full unique lines from merged query
449+
prefix_dict = Prefixes.extract_prefixes(self.query)
450+
self.prefixes = [Prefixes.prefix_line(prefix_dict, prefix) for prefix in sorted(prefix_dict)]
451+
432452

433453
def prefixToLink(self, lod: list, prefix: str, tablefmt: str):
434454
"""

lodstorage/querymain.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,33 @@
44
@author: wf
55
"""
66

7+
from argparse import ArgumentParser, RawDescriptionHelpFormatter
78
import logging
9+
import os
10+
import re
11+
import sys
12+
import traceback
813
import urllib.parse
914

1015
from lodstorage.mysql import MySqlQuery
16+
from lodstorage.prefix_config import PrefixConfigs
17+
from lodstorage.query import Endpoint, EndpointManager, Format, ValueFormatter
18+
from lodstorage.query_cmd import QueryCmd
1119
from lodstorage.rate_limiter import RateLimiter
20+
from lodstorage.sparql import SPARQL
21+
from lodstorage.sql import SQLDB
1222
from lodstorage.version import Version # Use sqlq.py module for MySQL endpoints
23+
import requests
24+
1325

1426
__version__ = Version.version
1527
__date__ = Version.date
1628
__updated__ = Version.updated
1729

1830
DEBUG = 0
1931

20-
import os
21-
import re
22-
import sys
23-
import traceback
24-
from argparse import ArgumentParser, RawDescriptionHelpFormatter
2532

26-
import requests
2733

28-
from lodstorage.query import Endpoint, EndpointManager, Format, ValueFormatter
29-
from lodstorage.query_cmd import QueryCmd
30-
from lodstorage.sparql import SPARQL
31-
from lodstorage.sql import SQLDB
3234

3335

3436
class QueryMain(QueryCmd):
@@ -78,9 +80,7 @@ def handle_args(self) -> bool:
7880
if args.language == "sparql":
7981
sparql = SPARQL.fromEndpointConf(endpointConf)
8082
if args.prefixes and endpointConf is not None:
81-
prefixes_list = endpointConf.prefixes.split("\n")
82-
self.query.prefixes = prefixes_list
83-
self.queryCode = f"{endpointConf.prefixes}\n{self.queryCode}"
83+
self.query.add_endpoint_prefixes(endpointConf, PrefixConfigs.get_instance())
8484
if args.raw:
8585
qres = self.rawQuery(
8686
endpointConf,

tests/test_queries.py

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@
44
@author: wf
55
"""
66

7+
from argparse import Namespace
8+
from contextlib import redirect_stdout
79
import copy
810
import io
911
import json
1012
import os
1113
import traceback
12-
from argparse import Namespace
13-
from contextlib import redirect_stdout
1414

15-
import tests.test_sqlite3
16-
from tests.action_stats import ActionStats
15+
from lodstorage.prefix_config import PrefixConfigs
1716
from lodstorage.prefixes import Prefixes
1817
from lodstorage.query import (
1918
EndpointManager,
@@ -27,7 +26,11 @@
2726
from lodstorage.querymain import QueryMain
2827
from lodstorage.querymain import main as queryMain
2928
from lodstorage.sparql import SPARQL
29+
30+
from tests.action_stats import ActionStats
3031
from tests.endpoint_test import EndpointTest
32+
import tests.test_sqlite3
33+
3134

3235
class TestQueries(EndpointTest):
3336
"""
@@ -171,6 +174,64 @@ def testQueryCommandLine(self):
171174
print(f"{resultFormat}:{result}")
172175
self.assertTrue(expected in result, f"{expected}({resultFormat})")
173176

177+
def test_add_endpoint_prefixes(self):
178+
"""
179+
Test Query.add_endpoint_prefixes() merges endpoint prefixes without duplicates.
180+
https://github.com/WolfgangFahl/pyLoDStorage/issues/140 (related prefix handling)
181+
"""
182+
debug = self.debug
183+
#debug=True
184+
endpoints = EndpointManager.getEndpoints(lang="sparql")
185+
wikidata_ep = endpoints["wikidata"]
186+
prefix_configs = PrefixConfigs.get_instance()
187+
188+
qm = QueryManager(lang="sparql", debug=False)
189+
cities_query = qm.queriesByName["cities"] # Has rdfs, wd, wdt
190+
191+
original_query = cities_query.query
192+
original_prefixes = Prefixes.extract_prefixes(original_query)
193+
self.assertEqual(3, len(original_prefixes)) # rdfs, wd, wdt
194+
195+
# Add endpoint prefixes (Wikidata full set → overlaps)
196+
cities_query.add_endpoint_prefixes(wikidata_ep, prefix_configs)
197+
198+
# Debug: Always show merged state (before asserts → visible on fail)
199+
merged_query = cities_query.query
200+
prefix_dict = Prefixes.extract_prefixes(merged_query)
201+
prefix_lines = [line for line in merged_query.splitlines() if line.strip().startswith('PREFIX')]
202+
if debug:
203+
print("Merged query prefixes:")
204+
print('\n'.join(prefix_lines))
205+
print(f"Unique prefixes: {len(prefix_dict)}")
206+
print(f"self.prefixes len: {len(cities_query.prefixes)}")
207+
print("self.prefixes sample:", cities_query.prefixes[:3])
208+
209+
# Verify: Unique prefixes (no dups like 'rdfs')
210+
self.assertEqual(len(prefix_dict), len(prefix_lines)) # 1:1 → no dup lines
211+
212+
# Specific: 'rdfs', 'wd', 'wdt' appear exactly once
213+
for prefix in ['rdfs', 'wd', 'wdt']:
214+
count = sum(1 for line in prefix_lines if f'{prefix}: ' in line)
215+
self.assertEqual(1, count)
216+
217+
# Full Wikidata set merged (many more)
218+
self.assertGreater(len(prefix_dict), 10)
219+
220+
# Query body preserved
221+
self.assertIn('SELECT ?city_id ?name', merged_query)
222+
223+
# self.prefixes: Unique PREFIX lines list (len + sorted names match)
224+
self.assertEqual(len(prefix_lines), len(cities_query.prefixes)) # same count
225+
def get_prefix_names(lines):
226+
return sorted([line.split(':')[0].strip('PREFIX ').strip() for line in lines])
227+
self.assertEqual(
228+
get_prefix_names(prefix_lines),
229+
get_prefix_names(cities_query.prefixes)
230+
) # same set (order-insensitive)
231+
used_prefixes = {line.split(':')[0].strip() for line in cities_query.prefixes}
232+
self.assertEqual(len(used_prefixes), len(cities_query.prefixes)) # no dups
233+
234+
174235
def testQueryEndpoints(self):
175236
"""
176237
tests the sparql endpoint commandline endpoint selection

0 commit comments

Comments
 (0)