snapquery 0.2.1__tar.gz → 0.2.2__tar.gz

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.
Files changed (118) hide show
  1. {snapquery-0.2.1 → snapquery-0.2.2}/PKG-INFO +1 -1
  2. snapquery-0.2.2/snapquery/__init__.py +1 -0
  3. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/endpoints.yaml +12 -0
  4. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/version.py +1 -1
  5. snapquery-0.2.2/tests/action_stats.py +43 -0
  6. snapquery-0.2.2/tests/test_endpoints.py +83 -0
  7. snapquery-0.2.1/snapquery/__init__.py +0 -1
  8. snapquery-0.2.1/tests/test_endpoints.py +0 -61
  9. {snapquery-0.2.1 → snapquery-0.2.2}/.github/workflows/build.yml +0 -0
  10. {snapquery-0.2.1 → snapquery-0.2.2}/.github/workflows/upload-to-pypi.yml +0 -0
  11. {snapquery-0.2.1 → snapquery-0.2.2}/.gitignore +0 -0
  12. {snapquery-0.2.1 → snapquery-0.2.2}/.project +0 -0
  13. {snapquery-0.2.1 → snapquery-0.2.2}/.pydevproject +0 -0
  14. {snapquery-0.2.1 → snapquery-0.2.2}/LICENSE +0 -0
  15. {snapquery-0.2.1 → snapquery-0.2.2}/README.md +0 -0
  16. {snapquery-0.2.1 → snapquery-0.2.2}/docs/index.md +0 -0
  17. {snapquery-0.2.1 → snapquery-0.2.2}/mkdocs.yml +0 -0
  18. {snapquery-0.2.1 → snapquery-0.2.2}/pyproject.toml +0 -0
  19. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/blackisort +0 -0
  20. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/doc +0 -0
  21. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/fixdomain +0 -0
  22. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/install +0 -0
  23. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/qlv +0 -0
  24. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/release +0 -0
  25. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/restore_db +0 -0
  26. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/test +0 -0
  27. {snapquery-0.2.1 → snapquery-0.2.2}/scripts/test_queries +0 -0
  28. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/authorization.py +0 -0
  29. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/basequeryview.py +0 -0
  30. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/ceurws.py +0 -0
  31. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/dblp.py +0 -0
  32. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/error_filter.py +0 -0
  33. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/execution.py +0 -0
  34. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/github_access.py +0 -0
  35. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/graph.py +0 -0
  36. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/models/__init__.py +0 -0
  37. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/models/person.py +0 -0
  38. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/models/sparql_components.py +0 -0
  39. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/mwlogin.py +0 -0
  40. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/namespace_stats_view.py +0 -0
  41. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/orcid.py +0 -0
  42. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/params_view.py +0 -0
  43. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/person_selector.py +0 -0
  44. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/pid.py +0 -0
  45. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/pid_lookup.py +0 -0
  46. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/prefix_merger.py +0 -0
  47. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/qimport.py +0 -0
  48. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/qimport_view.py +0 -0
  49. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/qlever.py +0 -0
  50. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/query_annotate.py +0 -0
  51. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/query_selector.py +0 -0
  52. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/resources/sparql_language.json +0 -0
  53. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/WikiProject_LSEThesisProject.wiki +0 -0
  54. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/ceur-ws.json +0 -0
  55. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/dblp.json +0 -0
  56. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/endpoints_optional.yaml +0 -0
  57. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/federated-query-examples.json +0 -0
  58. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/graphs.yaml +0 -0
  59. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/meta_query.yaml +0 -0
  60. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/orkg.json +0 -0
  61. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/qlever.json +0 -0
  62. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/qlever_performance.json +0 -0
  63. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/query_stats.yaml +0 -0
  64. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/scholia.json +0 -0
  65. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/snapquery.json +0 -0
  66. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/wikidata-WikidataThesisToolkit.json +0 -0
  67. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/wikidata-WikidataThesisToolkitAlt.json +0 -0
  68. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/wikidata-examples.json +0 -0
  69. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/samples/wikidata-short-urls.json +0 -0
  70. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/scholia.py +0 -0
  71. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/sib_sparql_examples.py +0 -0
  72. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/snapquery_cmd.py +0 -0
  73. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/snapquery_core.py +0 -0
  74. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/snapquery_view.py +0 -0
  75. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/snapquery_webserver.py +0 -0
  76. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/sparql_analyzer.py +0 -0
  77. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/stats_view.py +0 -0
  78. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/wd_page_query_extractor.py +0 -0
  79. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery/wd_short_url.py +0 -0
  80. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery.puml +0 -0
  81. {snapquery-0.2.1 → snapquery-0.2.2}/snapquery.yaml +0 -0
  82. {snapquery-0.2.1 → snapquery-0.2.2}/tests/__init__.py +0 -0
  83. {snapquery-0.2.1 → snapquery-0.2.2}/tests/query_extractors/__init__.py +0 -0
  84. {snapquery-0.2.1 → snapquery-0.2.2}/tests/query_extractors/sparql_standard_queries.py +0 -0
  85. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/qlever/ask_unsupported.txt +0 -0
  86. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/qlever/invalid_literal.txt +0 -0
  87. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/qlever/invalid_regex_func.txt +0 -0
  88. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/qlever/memory_limit.txt +0 -0
  89. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/qlever/timeout.txt +0 -0
  90. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/triplydb/parser_error.txt +0 -0
  91. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/wdqs/duplicate_prefix.txt +0 -0
  92. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/wdqs/invalid_iri_declaration.txt +0 -0
  93. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/wdqs/invalid_sparql_syntax.txt +0 -0
  94. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/wdqs/timeout.txt +0 -0
  95. {snapquery-0.2.1 → snapquery-0.2.2}/tests/resources/error_messages/wdqs/undefined_prefix.txt +0 -0
  96. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_authorization.py +0 -0
  97. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_ceurws.py +0 -0
  98. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_cmdline.py +0 -0
  99. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_error_filter.py +0 -0
  100. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_graph.py +0 -0
  101. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_import.py +0 -0
  102. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_namedqueries.py +0 -0
  103. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_oauth.py +0 -0
  104. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_orcid.py +0 -0
  105. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_pids.py +0 -0
  106. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_prefix_merger.py +0 -0
  107. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_qlever.py +0 -0
  108. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_query_annotate.py +0 -0
  109. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_query_execution.py +0 -0
  110. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_query_name.py +0 -0
  111. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_restful_api.py +0 -0
  112. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_scholia.py +0 -0
  113. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_scholia_q.py +0 -0
  114. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_sib_examples.py +0 -0
  115. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_sparql_analyzer.py +0 -0
  116. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_sparql_components.py +0 -0
  117. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_wd_query_parsing.py +0 -0
  118. {snapquery-0.2.1 → snapquery-0.2.2}/tests/test_wd_short_url.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snapquery
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Just Query wikidata and other SPARQL endpoints by query name - a frontend to Introduce Named Queries and Named Query Middleware to wikidata and other SPARQL endpoints
5
5
  Project-URL: Home, https://github.com/WolfgangFahl/snapquery
6
6
  Project-URL: Documentation, https://wiki.bitplan.com/index.php/snapquery
@@ -0,0 +1 @@
1
+ __version__ = "0.2.2"
@@ -89,6 +89,18 @@ endpoints:
89
89
  - wikidata
90
90
  - commons
91
91
 
92
+ wikidata-triply:
93
+ description: TriplyDB mirror.
94
+ lang: sparql
95
+ method: POST
96
+ database: TriplyDB
97
+ endpoint: https://api.triplydb.com/datasets/wikimedia/wikidata/sparql
98
+ website: https://triplydb.com/wikimedia/wikidata/sparql
99
+ calls_per_minute: 30
100
+ prefix_sets:
101
+ - rdf
102
+ - wikidata
103
+
92
104
  wikidata-qlever-dbis:
93
105
  description: QLever RWTH Wikidata.
94
106
  lang: sparql
@@ -18,7 +18,7 @@ class Version:
18
18
  name = "snapquery"
19
19
  version = snapquery.__version__
20
20
  date = "2024-05-03"
21
- updated = "2025-12-02"
21
+ updated = "2025-12-03"
22
22
  description = "Introduce Named Queries and Named Query Middleware to wikidata"
23
23
 
24
24
  authors = "Wolfgang Fahl"
@@ -0,0 +1,43 @@
1
+ """
2
+ Created on 2025-11-23
3
+
4
+ @author: wf
5
+ """
6
+
7
+
8
+ class ActionStats:
9
+ """Helper class to track success rates of actions."""
10
+
11
+ def __init__(self):
12
+ self.success_count = 0
13
+ self.total_count = 0
14
+ self.current = None
15
+
16
+ def add(self, is_success: bool):
17
+ """adds a single result."""
18
+ self.current = is_success
19
+ self.total_count += 1
20
+ if is_success:
21
+ self.success_count += 1
22
+
23
+ @property
24
+ def ratio(self) -> float:
25
+ """Returns the success/total ratio."""
26
+ ratio = self.success_count / self.total_count if self.total_count > 0 else 0.0
27
+ return ratio
28
+
29
+ def state(self, success_msg, fail_msg) -> str:
30
+ """
31
+ return the current state
32
+ """
33
+ if self.current:
34
+ msg = f"✅{success_msg}"
35
+ else:
36
+ msg = f"❌: {fail_msg}"
37
+ return msg
38
+
39
+ def __str__(self):
40
+ """Returns the formatted summary string."""
41
+ marker = "❌ " if self.success_count < self.total_count else "✅"
42
+ text = f"{marker}:{self.success_count}/{self.total_count} available"
43
+ return text
@@ -0,0 +1,83 @@
1
+ """
2
+ Created on 2024-05-03
3
+ ActionStats integrated with Grok4 Free suppport on 2025-12-03
4
+
5
+ @author: wf
6
+ """
7
+
8
+ import requests
9
+ from basemkit.basetest import Basetest
10
+ from lodstorage.sparql import SPARQL
11
+
12
+ from snapquery.snapquery_core import NamedQueryManager
13
+ from tests.action_stats import ActionStats
14
+
15
+
16
+ class TestEndpoints(Basetest):
17
+ """
18
+ test endpoint handling according to https://github.com/WolfgangFahl/snapquery/issues/1
19
+ """
20
+
21
+ def setUp(self, debug=True, profile=True):
22
+ Basetest.setUp(self, debug=debug, profile=profile)
23
+ self.nqm = NamedQueryManager()
24
+ self.user_agent = "snapquery-test/1.0 (https://github.com/WolfgangFahl/snapquery)"
25
+ self.timeout = 10
26
+ self.minRatio= 0.8
27
+
28
+ def testEndpoints(self):
29
+ """
30
+ test the endpoint handling
31
+ """
32
+ ep_names = list(self.nqm.endpoints.keys())
33
+ if self.debug:
34
+ print(ep_names)
35
+ self.assertGreater(len(ep_names), 0)
36
+ self.assertIn("wikidata", ep_names)
37
+
38
+ def test_website_availability(self):
39
+ """
40
+ Test website availability for endpoints (HTTP 200).
41
+ """
42
+ stats = ActionStats()
43
+ for ep in self.nqm.endpoints.values():
44
+ try:
45
+ self.assertTrue(hasattr(ep, "website"))
46
+ resp = requests.get(ep.website, headers={"User-Agent": self.user_agent}, timeout=self.timeout)
47
+ is_success = (resp.status_code == 200)
48
+ stats.add(is_success)
49
+ if self.debug:
50
+ if is_success:
51
+ print(f"✅ {ep.name} website OK: {ep.website}")
52
+ else:
53
+ print(f"❌ {ep.name} website failed: {ep.website} (status: {resp.status_code})")
54
+ except Exception as e:
55
+ stats.add(False)
56
+ if self.debug:
57
+ print(f"❌ {ep.name} website exception: {str(e)}")
58
+ msg = f"Websites availability {stats} ({stats.ratio:.1%}), need >=60%"
59
+ self.assertGreaterEqual(stats.ratio, self.minRatio, msg)
60
+ if self.debug:
61
+ print(f"SUMMARY websites: {stats}")
62
+
63
+ def test_sparql_availability(self):
64
+ """
65
+ Test SPARQL endpoint availability with dummy query: SELECT * WHERE {?s ?p ?o} LIMIT 1.
66
+ """
67
+ dummy_query = "SELECT * WHERE { ?s ?p ?o. } LIMIT 1"
68
+ stats = ActionStats()
69
+ for ep in self.nqm.endpoints.values():
70
+ try:
71
+ sparql = SPARQL.fromEndpointConf(ep)
72
+ lod = sparql.queryAsListOfDicts(dummy_query)
73
+ stats.add(True)
74
+ if self.debug:
75
+ print(f"✅ {ep.name} SPARQL OK: {len(lod)} rows from {ep.endpoint}")
76
+ except Exception as e:
77
+ stats.add(False)
78
+ if self.debug:
79
+ print(f"❌ {ep.name} SPARQL failed: {ep.endpoint} ({str(e)})")
80
+ msg = f"SPARQL availability {stats} ({stats.ratio:.1%}), need >=60%"
81
+ self.assertGreaterEqual(stats.ratio, self.minRatio, msg)
82
+ if self.debug:
83
+ print(f"SUMMARY SPARQL: {stats}")
@@ -1 +0,0 @@
1
- __version__ = "0.2.1"
@@ -1,61 +0,0 @@
1
- """
2
- Created on 2024-05-03
3
-
4
- @author: wf
5
- """
6
-
7
- import requests
8
- from basemkit.basetest import Basetest
9
- from lodstorage.sparql import SPARQL
10
-
11
- from snapquery.snapquery_core import NamedQueryManager
12
-
13
-
14
- class TestEndpoints(Basetest):
15
- """
16
- test endpoint handling according to https://github.com/WolfgangFahl/snapquery/issues/1
17
- """
18
-
19
- def setUp(self, debug=True, profile=True):
20
- Basetest.setUp(self, debug=debug, profile=profile)
21
- self.nqm = NamedQueryManager()
22
- self.user_agent = "snapquery-test/1.0 (https://github.com/WolfgangFahl/snapquery)"
23
- self.timeout = 10
24
-
25
- def testEndpoints(self):
26
- """
27
- test the endpoint handling
28
- """
29
- ep_names = self.nqm.endpoints.keys()
30
- if self.debug:
31
- print(ep_names)
32
- self.assertTrue("wikidata" in ep_names)
33
- pass
34
-
35
- def test_website_availability(self):
36
- """
37
- Test website availability forendpoints (HTTP 200).
38
- """
39
- for ep in self.nqm.endpoints.values():
40
- self.assertTrue(hasattr(ep, "website"))
41
- resp = requests.get(ep.website, headers={"User-Agent": self.user_agent}, timeout=self.timeout)
42
- self.assertEqual(
43
- resp.status_code, 200, f"Website {ep.website} for {ep.name} unavailable (status: {resp.status_code})"
44
- )
45
- if self.debug:
46
- print(f"✅ {ep.name} website OK: {ep.website}")
47
-
48
- def test_sparql_availability(self):
49
- """
50
- Test SPARQL endpoint availability with dummy query: SELECT * WHERE {?s ?p ?o} LIMIT 1.
51
- """
52
- dummy_query = "SELECT * WHERE { ?s ?p ?o. } LIMIT 1"
53
- for ep in self.nqm.endpoints.values():
54
- try:
55
- sparql = SPARQL.fromEndpointConf(ep)
56
- lod = sparql.queryAsListOfDicts(dummy_query)
57
- self.assertGreaterEqual(len(lod), 0, f"SPARQL {ep.endpoint} for {ep.name} returned no results")
58
- if self.debug:
59
- print(f"✅ {ep.name} SPARQL OK: {len(lod)} rows from {ep.endpoint}")
60
- except Exception as e:
61
- self.fail(f"SPARQL check failed for {ep.name}: {str(e)}")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes