iolanta 2.0.6__py3-none-any.whl → 2.0.7__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.
iolanta/__init__.py CHANGED
@@ -1,4 +1,3 @@
1
1
  from iolanta.base_plugin import IolantaBase
2
2
  from iolanta.facets import Facet
3
3
  from iolanta.plugin import Plugin
4
- from iolanta.shortcuts import as_document
iolanta/facets/facet.py CHANGED
@@ -85,13 +85,6 @@ class Facet(Generic[FacetOutput]):
85
85
  """Preferred language for Iolanta output."""
86
86
  return self.iolanta.language
87
87
 
88
- def find_triple(
89
- self,
90
- triple: TripleTemplate,
91
- ) -> Triple | None:
92
- """Lightweight procedure to find a triple by template."""
93
- return self.iolanta.find_triple(triple_template=triple)
94
-
95
88
  @cached_property
96
89
  def logger(self):
97
90
  """Logger."""
@@ -1,5 +1,6 @@
1
1
  from pathlib import Path
2
2
 
3
+ import funcy
3
4
  from rich.markdown import Markdown
4
5
  from textual.containers import Vertical
5
6
  from yarl import URL
@@ -15,6 +16,7 @@ TEXT = """
15
16
  * Or, no edges might exist which involve it;
16
17
  * Or maybe Iolanta does not know of such edges.
17
18
  {content}
19
+ {subgraphs}
18
20
  **What can you do?**
19
21
 
20
22
  * If you feel this might indicate a bug 🐛, please do let us know at GitHub
@@ -29,6 +31,12 @@ CONTENT_TEMPLATE = """
29
31
  ```
30
32
  """
31
33
 
34
+ SUBGRAPHS_TEMPLATE = """
35
+ **Subgraphs**
36
+
37
+ {formatted_subgraphs}
38
+ """
39
+
32
40
 
33
41
  class TextualNoFacetFound(Facet):
34
42
  """Facet to handle the case when no facet is found."""
@@ -55,14 +63,38 @@ class TextualNoFacetFound(Facet):
55
63
  content=file_content,
56
64
  type={
57
65
  '.yamlld': 'yaml',
66
+ '.jsonld': 'json',
58
67
  }.get(path.suffix, ''),
59
68
  )
60
69
 
70
+ @property
71
+ def subgraphs_description(self) -> str:
72
+ """Return a formatted description of subgraphs, if any exist."""
73
+ rows = self.query(
74
+ 'SELECT ?subgraph WHERE { $this iolanta:has-sub-graph ?subgraph }',
75
+ this=self.this,
76
+ )
77
+ subgraphs = funcy.lpluck('subgraph', rows)
78
+ if subgraphs:
79
+ return SUBGRAPHS_TEMPLATE.format(
80
+ formatted_subgraphs='\n'.join([
81
+ f'- {subgraph}'
82
+ for subgraph in subgraphs
83
+ ]),
84
+ )
85
+
86
+ return ''
87
+
61
88
  def show(self):
62
89
  """Compose the page."""
63
90
  return Vertical(
64
91
  PageTitle(self.this),
65
92
  Description(
66
- Markdown(TEXT.format(content=self.raw_content or '')),
93
+ Markdown(
94
+ TEXT.format(
95
+ content=self.raw_content or '',
96
+ subgraphs=self.subgraphs_description or '',
97
+ ),
98
+ ),
67
99
  ),
68
100
  )
iolanta/iolanta.py CHANGED
@@ -4,22 +4,19 @@ from pathlib import Path
4
4
  from typing import ( # noqa: WPS235
5
5
  Annotated,
6
6
  Any,
7
- Dict,
8
7
  Iterable,
9
8
  List,
10
9
  Mapping,
11
10
  Optional,
12
11
  Protocol,
13
12
  Set,
14
- Tuple,
15
13
  Type,
16
14
  )
17
15
 
18
- import funcy
19
16
  import loguru
20
17
  import yaml_ld
21
18
  from pyparsing import ParseException
22
- from rdflib import ConjunctiveGraph, Graph, Literal, Namespace, URIRef
19
+ from rdflib import ConjunctiveGraph, Graph, Literal, URIRef
23
20
  from rdflib.namespace import NamespaceManager
24
21
  from rdflib.plugins.sparql.processor import SPARQLResult
25
22
  from rdflib.term import Node
@@ -32,18 +29,9 @@ from iolanta.errors import UnresolvedIRI
32
29
  from iolanta.facets.errors import FacetError
33
30
  from iolanta.facets.facet import Facet
34
31
  from iolanta.facets.locator import FacetFinder
35
- from iolanta.loaders.base import SourceType
36
- from iolanta.loaders.local_directory import merge_contexts
37
- from iolanta.models import (
38
- ComputedQName,
39
- LDContext,
40
- NotLiteralNode,
41
- Triple,
42
- TripleTemplate,
43
- )
32
+ from iolanta.models import ComputedQName, LDContext, NotLiteralNode
44
33
  from iolanta.node_to_qname import node_to_qname
45
34
  from iolanta.parse_quads import parse_quads
46
- from iolanta.parsers.yaml import YAML
47
35
  from iolanta.plugin import Plugin
48
36
  from iolanta.query_result import (
49
37
  QueryResult,
@@ -103,12 +91,6 @@ class Iolanta: # noqa: WPS214
103
91
 
104
92
  logger: LoggerProtocol = loguru.logger
105
93
 
106
- sources_added_not_yet_inferred: list[SourceType] = field(
107
- default_factory=list,
108
- init=False,
109
- repr=False,
110
- )
111
-
112
94
  could_not_retrieve_nodes: Set[Node] = field(
113
95
  default_factory=set,
114
96
  init=False,
@@ -182,23 +164,6 @@ class Iolanta: # noqa: WPS214
182
164
 
183
165
  return format_query_bindings(sparql_result.bindings)
184
166
 
185
- @functools.cached_property
186
- def namespaces_to_bind(self) -> Dict[str, Namespace]:
187
- """
188
- Namespaces globally specified for the graph.
189
-
190
- FIXME: Probably get rid of this, I do not know.
191
- """
192
- return {
193
- key: Namespace(value)
194
- for key, value in self.default_context['@context'].items() # noqa
195
- if (
196
- isinstance(value, str)
197
- and not value.startswith('@') # noqa: W503
198
- and not key.startswith('@') # noqa: W503
199
- )
200
- }
201
-
202
167
  def reset(self):
203
168
  """Reset Iolanta graph."""
204
169
  self.graph = _create_default_graph() # noqa: WPS601
@@ -212,7 +177,6 @@ class Iolanta: # noqa: WPS214
212
177
  ) -> 'Iolanta':
213
178
  """Parse & load information from given URL into the graph."""
214
179
  self.logger.info(f'Adding to graph: {source}')
215
- self.sources_added_not_yet_inferred.append(source)
216
180
 
217
181
  if not isinstance(source, Path):
218
182
  source = Path(source)
@@ -262,17 +226,7 @@ class Iolanta: # noqa: WPS214
262
226
  self.logger.info(f'{source_file} | No data found')
263
227
  continue
264
228
 
265
- quad_tuples = [
266
- tuple([
267
- normalize_term(term) for term in replace(
268
- quad,
269
- graph=graph,
270
- ).as_tuple()
271
- ])
272
- for quad in quads
273
- ]
274
-
275
- self.graph.addN(quad_tuples)
229
+ self.graph.addN(quads)
276
230
 
277
231
  return self
278
232
 
@@ -317,20 +271,6 @@ class Iolanta: # noqa: WPS214
317
271
  if path := plugin.context_path:
318
272
  yield path
319
273
 
320
- @functools.cached_property
321
- def default_context(self) -> LDContext:
322
- """Construct default context from plugins."""
323
- context_documents = [
324
- YAML().as_jsonld_document(path.open('r'))
325
- for path in self.context_paths
326
- ]
327
-
328
- for context in context_documents:
329
- if isinstance(context, list):
330
- raise ValueError('Context cannot be a list: %s', context)
331
-
332
- return merge_contexts(*context_documents) # type: ignore
333
-
334
274
  def add_files_from_plugins(self):
335
275
  """
336
276
  Load files from plugins.
@@ -434,44 +374,6 @@ class Iolanta: # noqa: WPS214
434
374
  error=err,
435
375
  ) from err
436
376
 
437
- def retrieve_triple(self, triple_template: TripleTemplate) -> Triple:
438
- """Retrieve remote data to project directory."""
439
- for plugin in self.plugins:
440
- # FIXME Parallelization?
441
- plugin.retrieve_triple(triple_template)
442
-
443
- if not downloaded_files:
444
- self.could_not_retrieve_nodes.add(node)
445
-
446
- for path in downloaded_files:
447
- self.add(path)
448
-
449
- return self
450
-
451
- def maybe_infer(self):
452
- """
453
- Apply inference lazily.
454
-
455
- Only run inference if there are new files added after last inference.
456
- """
457
- if self.sources_added_not_yet_inferred:
458
- self.infer()
459
-
460
- def find_triple(
461
- self,
462
- triple_template: TripleTemplate,
463
- ) -> Triple | None:
464
- """Lightweight procedure to find a triple by template."""
465
- triples = self.graph.triples(
466
- (triple_template.subject, triple_template.predicate, triple_template.object),
467
- )
468
-
469
- raw_triple = funcy.first(triples)
470
- if raw_triple:
471
- return Triple(*raw_triple)
472
-
473
- return self.retrieve_triple(triple_template)
474
-
475
377
  def node_as_qname(self, node: Node):
476
378
  """
477
379
  Render node as a QName if possible.
iolanta/models.py CHANGED
@@ -1,4 +1,4 @@
1
- from dataclasses import dataclass
1
+ import re
2
2
  from enum import Enum
3
3
  from typing import Any, Dict, List, NamedTuple, Union
4
4
 
@@ -82,8 +82,14 @@ class TripleTemplate(NamedTuple):
82
82
  object: Node | None
83
83
 
84
84
 
85
- @dataclass
86
- class Quad:
85
+ def _normalize_term(term: Node):
86
+ if isinstance(term, URIRef) and term.startswith('http://'):
87
+ return URIRef(re.sub('^http', 'https', term))
88
+
89
+ return term
90
+
91
+
92
+ class Quad(NamedTuple):
87
93
  """Triple assigned to a named graph."""
88
94
 
89
95
  subject: Node
@@ -107,6 +113,19 @@ class Quad:
107
113
  f'{rendered_graph})' # noqa: WPS326
108
114
  )
109
115
 
110
- def as_tuple(self):
111
- """Represent quad as a tuple which `Graph.addN()` would understand."""
112
- return self.subject, self.predicate, self.object, self.graph
116
+ def replace(self, mapping: dict[Node, URIRef]):
117
+ """Replace variables in the quad."""
118
+ terms = [
119
+ mapping.get(term, term)
120
+ for term in self
121
+ ]
122
+
123
+ return Quad(*terms)
124
+
125
+ def normalize(self) -> 'Quad':
126
+ """Normalize the quad by applying normalization to all its terms."""
127
+ terms = [
128
+ _normalize_term(term)
129
+ for term in self
130
+ ]
131
+ return Quad(*terms)
iolanta/namespaces.py CHANGED
@@ -8,6 +8,8 @@ NP = rdflib.Namespace('https://www.nanopub.org/nschema#')
8
8
  RDFG = rdflib.Namespace('https://www.w3.org/2004/03/trix/rdfg-1/')
9
9
  SDO = rdflib.SDO
10
10
 
11
+ META = rdflib.URIRef('iolanta://_meta')
12
+
11
13
 
12
14
  class DC(rdflib.DC):
13
15
  _NS = rdflib.Namespace('https://purl.org/dc/elements/1.1/')
iolanta/parse_quads.py CHANGED
@@ -1,14 +1,20 @@
1
1
  import dataclasses
2
2
  import hashlib
3
- from typing import Iterable
3
+ from types import MappingProxyType
4
+ from typing import Iterable, Optional
4
5
 
6
+ from documented import DocumentedError
5
7
  from rdflib import BNode, Literal, URIRef
6
8
  from rdflib.term import Node
7
9
 
8
10
  from iolanta.errors import UnresolvedIRI
9
11
  from iolanta.models import Quad
10
- from iolanta.namespaces import IOLANTA, RDF
11
- from iolanta.parsers.errors import SpaceInProperty
12
+ from iolanta.namespaces import IOLANTA, META
13
+
14
+ NORMALIZE_TERMS_MAP = MappingProxyType({
15
+ URIRef(_url := 'https://www.w3.org/2002/07/owl'): URIRef(f'{_url}#'),
16
+ URIRef(_url := 'https://www.w3.org/2000/01/rdf-schema'): URIRef(f'{_url}#'),
17
+ })
12
18
 
13
19
 
14
20
  def parse_term( # noqa: C901
@@ -48,6 +54,40 @@ def parse_term( # noqa: C901
48
54
  raise ValueError(f'Unknown term: {term}')
49
55
 
50
56
 
57
+ def construct_subgraph_name(subgraph_name: str, graph: URIRef) -> URIRef:
58
+ """
59
+ Construct a proper subgraph name URI from a base name and graph.
60
+
61
+ If the subgraph name already starts with the graph URI, return it as is.
62
+ Otherwise, append the name as a fragment to the graph URI.
63
+ """
64
+ if subgraph_name.startswith(str(graph)):
65
+ return URIRef(subgraph_name)
66
+
67
+ return URIRef(f'{graph}#{subgraph_name}')
68
+
69
+
70
+ def _parse_quads_per_subgraph(
71
+ raw_quads,
72
+ blank_node_prefix: str,
73
+ graph: URIRef,
74
+ subgraph: URIRef,
75
+ ) -> Iterable[Quad]:
76
+ for quad in raw_quads:
77
+ try:
78
+ yield Quad(
79
+ subject=parse_term(quad['subject'], blank_node_prefix),
80
+ predicate=parse_term(quad['predicate'], blank_node_prefix),
81
+ object=parse_term(quad['object'], blank_node_prefix),
82
+ graph=subgraph,
83
+ )
84
+ except SpaceInProperty as err:
85
+ raise dataclasses.replace(
86
+ err,
87
+ iri=graph,
88
+ )
89
+
90
+
51
91
  def parse_quads(
52
92
  quads_document,
53
93
  graph: URIRef,
@@ -59,33 +99,44 @@ def parse_quads(
59
99
  ).hexdigest()
60
100
  blank_node_prefix = f'_:{blank_node_prefix}'
61
101
 
62
- for graph_name, quads in quads_document.items():
63
- if graph_name == '@default':
64
- graph_name = graph # noqa: WPS440
102
+ subgraph_names = {
103
+ URIRef(subgraph_name): construct_subgraph_name(
104
+ subgraph_name,
105
+ graph=graph,
106
+ )
107
+ for subgraph_name in quads_document.keys()
108
+ if subgraph_name != '@default'
109
+ }
110
+ subgraph_names[graph] = graph
111
+
112
+ for subgraph, quads in quads_document.items():
113
+ if subgraph == '@default':
114
+ subgraph = graph # noqa: WPS440
65
115
 
66
116
  else:
67
- graph_name = URIRef(graph_name)
117
+ subgraph = URIRef(subgraph)
68
118
 
69
119
  yield Quad(
70
120
  graph,
71
121
  IOLANTA['has-sub-graph'],
72
- graph_name,
73
- graph,
122
+ subgraph_names[subgraph],
123
+ META,
74
124
  )
75
125
 
76
- for quad in quads:
77
- try:
78
- yield Quad(
79
- subject=parse_term(quad['subject'], blank_node_prefix),
80
- predicate=parse_term(quad['predicate'], blank_node_prefix),
81
- object=parse_term(quad['object'], blank_node_prefix),
82
- graph=graph_name,
83
- )
84
- except SpaceInProperty as err:
85
- raise dataclasses.replace(
86
- err,
87
- iri=graph,
88
- )
126
+ quads = _parse_quads_per_subgraph(
127
+ quads,
128
+ blank_node_prefix=blank_node_prefix,
129
+ graph=subgraph,
130
+ subgraph=subgraph_names[subgraph],
131
+ )
132
+
133
+ for quad in quads: # noqa: WPS526
134
+ yield quad.replace(
135
+ subgraph_names | NORMALIZE_TERMS_MAP | {
136
+ # To enable nanopub rendering
137
+ URIRef('http://purl.org/nanopub/temp/np/'): graph,
138
+ },
139
+ ).normalize()
89
140
 
90
141
 
91
142
  def raise_if_term_is_qname(term_value: str):
@@ -102,3 +153,19 @@ def raise_if_term_is_qname(term_value: str):
102
153
  iri=term_value,
103
154
  prefix=prefix,
104
155
  )
156
+
157
+
158
+ @dataclasses.dataclass
159
+ class SpaceInProperty(DocumentedError):
160
+ """
161
+ Space in property.
162
+
163
+ That impedes JSON-LD parsing.
164
+
165
+ Please do not use spaces in property names in JSON or YAML data; use `title`
166
+ or other methods instead.
167
+
168
+ Document IRI: {self.iri}
169
+ """
170
+
171
+ iri: Optional[URIRef] = None
@@ -24,8 +24,7 @@ from rdflib.plugins.sparql.parserutils import CompValue
24
24
  from rdflib.plugins.sparql.sparql import Query
25
25
  from rdflib.query import Processor
26
26
  from rdflib.term import BNode, Literal, Node
27
- from requests import HTTPError
28
- from requests.exceptions import ConnectionError
27
+ from requests.exceptions import ConnectionError, InvalidSchema
29
28
  from yaml_ld.document_loaders.content_types import ParserNotFound
30
29
  from yaml_ld.errors import NotFound, YAMLLDError
31
30
  from yarl import URL
@@ -36,19 +35,14 @@ from iolanta.namespaces import ( # noqa: WPS235
36
35
  DCTERMS,
37
36
  FOAF,
38
37
  IOLANTA,
38
+ META,
39
39
  OWL,
40
40
  PROV,
41
41
  RDF,
42
42
  RDFS,
43
43
  VANN,
44
44
  )
45
- from iolanta.parse_quads import parse_quads
46
-
47
- NORMALIZE_TERMS_MAP = MappingProxyType({
48
- URIRef(_url := 'https://www.w3.org/2002/07/owl'): URIRef(f'{_url}#'),
49
- URIRef(_url := 'https://www.w3.org/2000/01/rdf-schema'): URIRef(f'{_url}#'),
50
- })
51
-
45
+ from iolanta.parse_quads import NORMALIZE_TERMS_MAP, parse_quads
52
46
 
53
47
  REASONING_ENABLED = True
54
48
  OWL_REASONING_ENABLED = False
@@ -94,9 +88,7 @@ def find_retractions_for(nanopublication: URIRef) -> set[URIRef]:
94
88
  # context of this dirty hack.
95
89
  use_server = 'http://grlc.nanopubs.lod.labs.vu.nl/api/local/local/'
96
90
 
97
- client = NanopubClient(
98
- use_server=use_server,
99
- )
91
+ client = NanopubClient(use_server=use_server)
100
92
  client.grlc_urls = [use_server]
101
93
 
102
94
  http_url = str(nanopublication).replace(
@@ -106,7 +98,7 @@ def find_retractions_for(nanopublication: URIRef) -> set[URIRef]:
106
98
 
107
99
  try:
108
100
  retractions = client.find_retractions_of(http_url)
109
- except HTTPError:
101
+ except (requests.HTTPError, InvalidSchema):
110
102
  return set()
111
103
 
112
104
  return {URIRef(retraction) for retraction in retractions}
@@ -331,7 +323,7 @@ class NanopubQueryPlugin:
331
323
  if potential_type == original_RDF.type:
332
324
  yield potential_class
333
325
 
334
- @funcy.retry(errors=HTTPError, tries=3, timeout=3)
326
+ @funcy.retry(errors=requests.HTTPError, tries=3, timeout=3)
335
327
  def _load_instances(self, class_uri: URIRef):
336
328
  """
337
329
  Load instances from Nanopub Registry.
@@ -537,7 +529,7 @@ class GlobalSPARQLProcessor(Processor): # noqa: WPS338, WPS214
537
529
  uri,
538
530
  IOLANTA['last-loaded-time'],
539
531
  None,
540
- URIRef('iolanta://_meta'),
532
+ META,
541
533
  )),
542
534
  ) is not None
543
535
 
@@ -546,7 +538,7 @@ class GlobalSPARQLProcessor(Processor): # noqa: WPS338, WPS214
546
538
  uri,
547
539
  IOLANTA['last-loaded-time'],
548
540
  Literal(datetime.datetime.now()),
549
- URIRef('iolanta://_meta'),
541
+ META,
550
542
  ))
551
543
 
552
544
  def _follow_is_visualized_with_links(self, uri: URIRef):
@@ -692,14 +684,7 @@ class GlobalSPARQLProcessor(Processor): # noqa: WPS338, WPS214
692
684
  self.logger.info('{source} | No data found', source=source)
693
685
  return Loaded()
694
686
 
695
- quad_tuples = [
696
- tuple([
697
- normalize_term(term) for term in quad.as_tuple()
698
- ])
699
- for quad in quads
700
- ]
701
-
702
- self.graph.addN(quad_tuples)
687
+ self.graph.addN(quads)
703
688
  self.graph.last_not_inferred_source = source
704
689
 
705
690
  into_graphs = ', '.join({
@@ -1,12 +1,31 @@
1
+ from rich.markdown import Markdown
2
+ from textual.containers import VerticalScroll
1
3
  from textual.widgets import Label
2
4
 
3
5
 
4
- class Description(Label):
6
+ class Description(VerticalScroll):
5
7
  """Free form textual description."""
6
8
 
7
9
  DEFAULT_CSS = """
8
10
  Description {
9
- padding: 1;
10
- padding-left: 4;
11
+ padding: 4;
12
+ padding-top: 1;
13
+ padding-bottom: 1;
14
+ max-height: 100%;
11
15
  }
12
16
  """ # noqa: WPS115
17
+
18
+ def __init__(self, renderable: str | Markdown):
19
+ """
20
+ Initialize a Description widget with a renderable content.
21
+
22
+ Args:
23
+ renderable: Content to display, either as a string or
24
+ Markdown object
25
+ """
26
+ self.renderable = renderable
27
+ super().__init__()
28
+
29
+ def compose(self):
30
+ """Build and return the widget's component structure."""
31
+ yield Label(self.renderable)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iolanta
3
- Version: 2.0.6
3
+ Version: 2.0.7
4
4
  Summary: Semantic Web browser
5
5
  License: MIT
6
6
  Author: Anatoly Scherbakov
@@ -1,4 +1,4 @@
1
- iolanta/__init__.py,sha256=BvLP-LYFmNYS5F8VPXdzpEEMk8zcm9NMmlUWw9yEtj0,153
1
+ iolanta/__init__.py,sha256=d6a_MUaocIgrpgC49Bu5N3DHLP0uBc07CLTjPRpKArI,111
2
2
  iolanta/base_plugin.py,sha256=vI4DRSIITlKZw8x7Q58BFkChWlg1h8zV-tuNvIKURBI,86
3
3
  iolanta/cli/__init__.py,sha256=IV6_RPmrbpPWbdKojuFczwaJAaKm1DIDQh5aZWbeR1U,69
4
4
  iolanta/cli/formatters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -28,7 +28,7 @@ iolanta/facets/cli/record.py,sha256=lBsECxLkwVSXC-yHmUwfosxAdLBI-0UoqHe8GOCablY,
28
28
  iolanta/facets/cli/sparql/link.sparql,sha256=WtWEfLAvdGc2gP0IhZil6Vglkydc3VO24vk4GwRnR5I,163
29
29
  iolanta/facets/cli/sparql/record.sparql,sha256=GBWkmNelvaSDbvl7v0-LsJHdjFPbsSAW49kNFOUeoGQ,63
30
30
  iolanta/facets/errors.py,sha256=sEBmnzhFcRIgOT18hfNwyMMjry0waa6IB-jC2NVTA50,4124
31
- iolanta/facets/facet.py,sha256=QByUVrvt_XVBoVhfuyk6lKO--pauhMEN79GWmgejdIo,2822
31
+ iolanta/facets/facet.py,sha256=gAOkosh9B_Lufh3ia9W24hgt4LEIhG-UJcQF4BzMvno,2600
32
32
  iolanta/facets/foaf_person_title/__init__.py,sha256=oj4MNVQvv8Dysb27xiWjtZCii8-nT7-WFa3WMWUwbtU,67
33
33
  iolanta/facets/foaf_person_title/facet.py,sha256=Q9TajjGp1v729quDzAM_Lfzawls3yujp1Z_6jXrG3gY,632
34
34
  iolanta/facets/foaf_person_title/sparql/names.sparql,sha256=p_2hHZXhEaJ8IwGlvLoN0vb0vhGqo44uAVRpDyTzflU,107
@@ -79,7 +79,7 @@ iolanta/facets/textual_nanopublication/models.py,sha256=MphggSvKmYac6v866GOKW5lc
79
79
  iolanta/facets/textual_nanopublication/nanopublication_widget.py,sha256=sQPgEx25XJ15VqB5zjZuz2q2bf_B5GWXEp32FAufxQ4,2387
80
80
  iolanta/facets/textual_nanopublication/term_list_widget.py,sha256=NZNATKjFmgI2sE5R0ebyQh5Qk2g-kf-MT4YZ-Vw78M4,992
81
81
  iolanta/facets/textual_nanopublication/term_widget.py,sha256=uI5msCTSIYumAIS3I8nBfUz57_vRzvCKkouevrS3Qwk,3536
82
- iolanta/facets/textual_no_facet_found.py,sha256=gYRSAYDX0t6EHln0S8msLZE27Svfef8iPVfZQ3Vf8Ns,1625
82
+ iolanta/facets/textual_no_facet_found.py,sha256=xNAQslZuMU-HLZh6250Siz3EnSE_ZVt-YhksUTiU_Ag,2485
83
83
  iolanta/facets/textual_ontology/__init__.py,sha256=3H6bfYaEbXFr90C6ZpGWC4O-24uaO18tnTXx7mckQSA,94
84
84
  iolanta/facets/textual_ontology/facets.py,sha256=60g8ANmePb9_i_-d4ui-FdtNwg9aktrOKXHkTQtLp1w,3338
85
85
  iolanta/facets/textual_ontology/sparql/terms.sparql,sha256=oVLxN452nqog_95qRaTWnvar6rxPNxPrRonSo7oFFTg,324
@@ -95,44 +95,27 @@ iolanta/facets/title/sparql/title.sparql,sha256=4rz47tjwX2OJavWMzftaYKil1-ZHB76Z
95
95
  iolanta/facets/wikibase_statement_title/__init__.py,sha256=_yk1akxgSJOiUBJIc8QGrD2vovvmx_iw_vJDuv1rD7M,91
96
96
  iolanta/facets/wikibase_statement_title/facets.py,sha256=mUH7twlAgoeX7DgLQuRBQv4ORT6GWbN-0eJ1aliSfiQ,724
97
97
  iolanta/facets/wikibase_statement_title/sparql/statement-title.sparql,sha256=n07DQWxKqB5c3CA4kacq2HSN0R0dLgnMnLP1AxMo5YA,320
98
- iolanta/iolanta.py,sha256=wCt_7aUz9TOvZTJvpJQ-qVWkOpmM531uyxIk9l3n-lk,14229
99
- iolanta/loaders/__init__.py,sha256=QTiKCsQc1BTS-IlY2CQsN9iVpEIPqYFvI9ERMYVZCbU,99
100
- iolanta/loaders/base.py,sha256=-DxYwqG1bfDXB2p_S-mKpkc_3Sh14OHhePbe65Iq3-s,3381
101
- iolanta/loaders/data_type_choice.py,sha256=zRUXBIzjvuW28P_dhMDVevE9C8EFEIx2_X39WydWrtM,1982
102
- iolanta/loaders/dict_loader.py,sha256=8eklbLFsNoQNuR7UDXY6oMXH2nekaK1WQLb42MjjYuk,1696
103
- iolanta/loaders/errors.py,sha256=EfalDnabuC2YjmJUOhTfs-5yeskVclhYcSoMuxJCRL4,472
104
- iolanta/loaders/http.py,sha256=mJMmprcl2X7a8p1YjfuWcOaJQm3xSM00E9sfDK_PMNo,3654
105
- iolanta/loaders/local_directory.py,sha256=tYOmtKkct8lcWM_dqm75932mPyc6ulMc4_9mseWCd9I,4557
106
- iolanta/loaders/local_file.py,sha256=MCbcu7DtiuoJye1xvTfuts-b2KCYjfg4tAYRZqgFelo,3064
107
- iolanta/loaders/scheme_choice.py,sha256=GHA4JAD-Qq3uNdej4vs_bCrN1WMRshVRvOMxaYyPHsE,2104
108
- iolanta/models.py,sha256=L0iFaga4-PCaWP18WmT03NLK_oT7q49V0WMTQskoffI,2824
109
- iolanta/namespaces.py,sha256=fyWDCGPwU8Cs8d-Vmci4H0-fuIe7BMSevvEKFvG7Gf4,1153
98
+ iolanta/iolanta.py,sha256=y95nu0BbllQqWIBv19FUAbS-l4-qNFA4LWcbZdseTyU,11330
99
+ iolanta/models.py,sha256=M-1dTxPwjTyUgQ4VCOiH6Q7ltNJiDPG0l1XQH430Omo,3250
100
+ iolanta/namespaces.py,sha256=VJ3BLTji3UmqD3N1Om2voAoyYPtF4o-8FXN2Uq_4sPc,1194
110
101
  iolanta/node_to_qname.py,sha256=a82_qpgT87cbekY_76tTkl4Z-6Rz6am4UGIQChUf9Y0,794
111
- iolanta/parse_quads.py,sha256=2UydATeDassOrpjWfjwWnMjnSS5RZw5KBFIeKHGJ36M,2660
112
- iolanta/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
- iolanta/parsers/base.py,sha256=ZFjj0BLzW4985BdC6PwbngenhMuSYW5mNLpprZRWjhA,1048
114
- iolanta/parsers/dict_parser.py,sha256=t_OK2meUh49DqSaOYkSgEwxMKUNNgjJY8rZAyL4NQKI,4546
115
- iolanta/parsers/errors.py,sha256=4Tqi9WD8-AmnZ2efHGty9VSLb--Efd4A6tMqGF3ffDY,600
116
- iolanta/parsers/json.py,sha256=3VrDiz-SaVXP9_B03Gl62VSIk2fKeRrrb2hpTLxqBk4,967
117
- iolanta/parsers/markdown.py,sha256=wv-PhszgoDOzWdisykIeZyYBD1edCVmw7UQ8jEn4siw,1669
118
- iolanta/parsers/yaml.py,sha256=MeTe5_OaDK27XB38AzxjqWfCxybAm4tqgqn7LLh-YB0,1244
102
+ iolanta/parse_quads.py,sha256=w1GlfABG6EYKQ9iFFQHKFp8juPGdsjYmadQE6hH0gC8,4499
119
103
  iolanta/plugin.py,sha256=MSxpuOIx93AgBahfS8bYh31MEgcwtUSQhj4Js7fgdSI,1096
120
104
  iolanta/query_result.py,sha256=VLLBkewUEymtzfB0jeIeRE3Np6pAgo959RPgNsEmiq8,1545
121
105
  iolanta/reformat_blank_nodes.py,sha256=MAVcXusUioKzAoTEHAMume5Gt9vBEpxJGrngqFzmkJI,712
122
106
  iolanta/resolvers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
107
  iolanta/resolvers/base.py,sha256=cc9bcrVZ0wTwn85I-IYCwcIRU5Lwaph8D00C0dwSOm8,302
124
108
  iolanta/resolvers/python_import.py,sha256=kDOhApBDFfxnrDgK9M7ztMkqXfcny81Zo86FgPFb-LI,1301
125
- iolanta/shortcuts.py,sha256=j8b0E_yeoas8GumsPOfxO2v2jO0noqpmKJ6LFxFfsu4,1892
126
109
  iolanta/sparqlspace/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
110
  iolanta/sparqlspace/cli.py,sha256=pb6q03lzrU8OaZ4A3QAQEmaFYcQ_-sHUrPhRs6GE88w,1590
128
111
  iolanta/sparqlspace/inference/wikibase-claim.sparql,sha256=JSawj3VTc9ZPoU9mvh1w1AMYb3cWyZ3x1rEYWUsKZ6A,209
129
112
  iolanta/sparqlspace/inference/wikibase-statement-property.sparql,sha256=SkSHZZlxWVDwBM3aLo0Q7hLuOj9BsIQnXtcuAuwaxqU,240
130
- iolanta/sparqlspace/processor.py,sha256=CXxdi7ORpddXxPh0UlnRG7oqNT9q-WdSPMxqB4CgOis,23570
113
+ iolanta/sparqlspace/processor.py,sha256=tYIGIqh-1kbzIfYgirU77QoyFwsF8t6jv5BdHAEXjM0,23191
131
114
  iolanta/sparqlspace/sparqlspace.py,sha256=Y8_ZPXwuGEXbEes6XQjaQWA2Zv9y8SWxMPDFdqVBGFo,796
132
115
  iolanta/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
- iolanta/widgets/description.py,sha256=Qj5R2wgxJzlAHU0LHyKIoZSCkGk4VBuImWIyiUallhs,215
116
+ iolanta/widgets/description.py,sha256=98Qd3FwT9r8sYqKjl9ZEptaVX9jJ2ULWf0uy3j52p5o,800
134
117
  iolanta/widgets/mixin.py,sha256=nDRCOc-gizCf1a5DAcYs4hW8eZEd6pHBPFsfm0ncv7E,251
135
- iolanta-2.0.6.dist-info/METADATA,sha256=zqVS0cP1WoIfWm-4NCgDrrryi5uxKwILIyquK8khpGA,2230
136
- iolanta-2.0.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
137
- iolanta-2.0.6.dist-info/entry_points.txt,sha256=z9RPLmGuz3tYGPV7Qf4nNjuSJYdTUS9enC4595poe-M,221
138
- iolanta-2.0.6.dist-info/RECORD,,
118
+ iolanta-2.0.7.dist-info/METADATA,sha256=CjOyQqdHPRnClEWEC0nllINZGGdUznLk_C04P0_B5aI,2230
119
+ iolanta-2.0.7.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
120
+ iolanta-2.0.7.dist-info/entry_points.txt,sha256=z9RPLmGuz3tYGPV7Qf4nNjuSJYdTUS9enC4595poe-M,221
121
+ iolanta-2.0.7.dist-info/RECORD,,