primarysource 0.1.0__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.
- primarysource/__init__.py +5 -0
- primarysource/bbf/__init__.py +56 -0
- primarysource/bbf/_xml.py +63 -0
- primarysource/bbf/catalogue.json +777 -0
- primarysource/bbf/catalogue.py +137 -0
- primarysource/bbf/cli.py +79 -0
- primarysource/bbf/datamodel.py +281 -0
- primarysource/bbf/importer.py +151 -0
- primarysource/bbf/library.py +380 -0
- primarysource/bbf/server.py +72 -0
- primarysource/budget.py +63 -0
- primarysource/c2sp/__init__.py +53 -0
- primarysource/c2sp/_fetch.py +5 -0
- primarysource/c2sp/catalogue.json +231 -0
- primarysource/c2sp/catalogue.py +95 -0
- primarysource/c2sp/cli.py +62 -0
- primarysource/c2sp/importer.py +90 -0
- primarysource/c2sp/library.py +309 -0
- primarysource/c2sp/markdown.py +31 -0
- primarysource/c2sp/server.py +68 -0
- primarysource/cavp/__init__.py +42 -0
- primarysource/cavp/cli.py +84 -0
- primarysource/cavp/data/vectors.toml +47 -0
- primarysource/cavp/importer.py +156 -0
- primarysource/cavp/model.py +279 -0
- primarysource/cavp/parse.py +269 -0
- primarysource/cavp/paths.py +17 -0
- primarysource/cavp/server.py +67 -0
- primarysource/cavp/tools.py +169 -0
- primarysource/cli.py +107 -0
- primarysource/cursor.py +82 -0
- primarysource/cve/__init__.py +5 -0
- primarysource/cve/__main__.py +6 -0
- primarysource/cve/cli.py +144 -0
- primarysource/cve/collection.py +20 -0
- primarysource/cve/config.py +58 -0
- primarysource/cve/errors.py +16 -0
- primarysource/cve/kernel.py +232 -0
- primarysource/cve/mcp.py +139 -0
- primarysource/cve/parse.py +318 -0
- primarysource/cve/py.typed +0 -0
- primarysource/cve/service.py +760 -0
- primarysource/cve/store.py +214 -0
- primarysource/cve/sync.py +438 -0
- primarysource/cve/views.py +304 -0
- primarysource/debpolicy/__init__.py +16 -0
- primarysource/debpolicy/catalogue.py +263 -0
- primarysource/debpolicy/cli.py +12 -0
- primarysource/debpolicy/server.py +11 -0
- primarysource/draft/__init__.py +11 -0
- primarysource/draft/catalogue.py +117 -0
- primarysource/draft/cli.py +149 -0
- primarysource/draft/collection.py +21 -0
- primarysource/draft/datatracker.py +158 -0
- primarysource/draft/importer.py +163 -0
- primarysource/draft/licence.py +89 -0
- primarysource/draft/names.py +64 -0
- primarysource/draft/net.py +133 -0
- primarysource/draft/segment.py +192 -0
- primarysource/draft/server.py +91 -0
- primarysource/draft/status.py +146 -0
- primarysource/draft/store.py +199 -0
- primarysource/draft/tracked.json +104 -0
- primarysource/draft/views.py +430 -0
- primarysource/draft/xmlmeta.py +74 -0
- primarysource/ecma/__init__.py +52 -0
- primarysource/ecma/_pdf.py +143 -0
- primarysource/ecma/catalogue.json +22 -0
- primarysource/ecma/catalogue.py +100 -0
- primarysource/ecma/cli.py +67 -0
- primarysource/ecma/identify.py +25 -0
- primarysource/ecma/importer.py +108 -0
- primarysource/ecma/library.py +240 -0
- primarysource/ecma/server.py +67 -0
- primarysource/errors.py +29 -0
- primarysource/fetch.py +360 -0
- primarysource/fsutil.py +150 -0
- primarysource/gitdocs/__init__.py +15 -0
- primarysource/gitdocs/catalogue.py +116 -0
- primarysource/gitdocs/cli.py +12 -0
- primarysource/gitdocs/server.py +8 -0
- primarysource/home.py +65 -0
- primarysource/iana/__init__.py +32 -0
- primarysource/iana/catalogue.json +244 -0
- primarysource/iana/catalogue.py +69 -0
- primarysource/iana/cli.py +69 -0
- primarysource/iana/importer.py +157 -0
- primarysource/iana/model.py +325 -0
- primarysource/iana/reader.py +315 -0
- primarysource/iana/server.py +67 -0
- primarysource/iana/store.py +83 -0
- primarysource/iana/xmlsafe.py +47 -0
- primarysource/identify.py +186 -0
- primarysource/ieee/__init__.py +58 -0
- primarysource/ieee/_html.py +49 -0
- primarysource/ieee/catalogue.json +74 -0
- primarysource/ieee/catalogue.py +123 -0
- primarysource/ieee/cli.py +79 -0
- primarysource/ieee/identify.py +24 -0
- primarysource/ieee/ieee802.py +47 -0
- primarysource/ieee/importer.py +305 -0
- primarysource/ieee/posix.py +233 -0
- primarysource/ieee/server.py +79 -0
- primarysource/index.py +446 -0
- primarysource/iso/__init__.py +51 -0
- primarysource/iso/cli.py +98 -0
- primarysource/iso/designation.py +95 -0
- primarysource/iso/identify.py +100 -0
- primarysource/iso/importer.py +224 -0
- primarysource/iso/library.py +249 -0
- primarysource/iso/server.py +69 -0
- primarysource/itu/__init__.py +41 -0
- primarysource/itu/__main__.py +8 -0
- primarysource/itu/asn1mod.py +478 -0
- primarysource/itu/catalog.py +472 -0
- primarysource/itu/cli.py +445 -0
- primarysource/itu/collection.py +20 -0
- primarysource/itu/corpus.py +118 -0
- primarysource/itu/errata.py +16 -0
- primarysource/itu/formal.py +565 -0
- primarysource/itu/identify.py +26 -0
- primarysource/itu/index.py +490 -0
- primarysource/itu/mcp.py +474 -0
- primarysource/itu/py.typed +0 -0
- primarysource/itu/sources.py +600 -0
- primarysource/itu/text.py +609 -0
- primarysource/kconfig/__init__.py +16 -0
- primarysource/kconfig/catalogue.py +98 -0
- primarysource/kconfig/cli.py +12 -0
- primarysource/kconfig/server.py +8 -0
- primarysource/model.py +63 -0
- primarysource/nist/__init__.py +5 -0
- primarysource/nist/collection.py +46 -0
- primarysource/nist/data/acquired-nist.json +1657 -0
- primarysource/nist/data/nist-catalog.json +12090 -0
- primarysource/nist/data/sources.toml +1996 -0
- primarysource/nist/identify.py +41 -0
- primarysource/nist/ingest/__init__.py +1 -0
- primarysource/nist/ingest/acquire_nist.py +128 -0
- primarysource/nist/ingest/controls.py +82 -0
- primarysource/nist/ingest/discover_nist.py +218 -0
- primarysource/nist/ingest/extract.py +48 -0
- primarysource/nist/ingest/fetch.py +211 -0
- primarysource/nist/ingest/index.py +14 -0
- primarysource/nist/ingest/oscal.py +480 -0
- primarysource/nist/ingest/prose_layouts.py +236 -0
- primarysource/nist/ingest/sources.py +94 -0
- primarysource/nist/ingest/status.py +255 -0
- primarysource/nist/models.py +7 -0
- primarysource/nist/paths.py +33 -0
- primarysource/nist/server/__init__.py +3 -0
- primarysource/nist/server/corpus.py +38 -0
- primarysource/nist/server/mcp.py +19 -0
- primarysource/nist/server/tools.py +35 -0
- primarysource/nist/spec.py +38 -0
- primarysource/pdfcorpus/__init__.py +16 -0
- primarysource/pdfcorpus/corpus.py +159 -0
- primarysource/pdfcorpus/fts.py +175 -0
- primarysource/pdfcorpus/index.py +70 -0
- primarysource/pdfcorpus/models.py +30 -0
- primarysource/pdfcorpus/server.py +96 -0
- primarysource/pdfcorpus/spec.py +37 -0
- primarysource/pdfcorpus/split.py +391 -0
- primarysource/pdfcorpus/tools.py +244 -0
- primarysource/pep/__init__.py +15 -0
- primarysource/pep/catalogue.py +191 -0
- primarysource/pep/cli.py +12 -0
- primarysource/pep/server.py +8 -0
- primarysource/pkgdocs/__init__.py +19 -0
- primarysource/pkgdocs/fetch.py +356 -0
- primarysource/pkgdocs/index.py +89 -0
- primarysource/pkgdocs/model.py +76 -0
- primarysource/pkgdocs/readers/__init__.py +1 -0
- primarysource/pkgdocs/readers/_common.py +134 -0
- primarysource/pkgdocs/readers/asciidoc.py +160 -0
- primarysource/pkgdocs/readers/latex.py +315 -0
- primarysource/pkgdocs/readers/markdown.py +173 -0
- primarysource/pkgdocs/readers/pod.py +132 -0
- primarysource/pkgdocs/readers/rst.py +239 -0
- primarysource/pkgdocs/readers/scdoc.py +108 -0
- primarysource/pkgdocs/runtime.py +552 -0
- primarysource/pkgdocs/serving.py +158 -0
- primarysource/pkgdocs/store.py +167 -0
- primarysource/pms/__init__.py +16 -0
- primarysource/pms/catalogue.py +88 -0
- primarysource/pms/cli.py +12 -0
- primarysource/pms/server.py +8 -0
- primarysource/py.typed +0 -0
- primarysource/readers/__init__.py +10 -0
- primarysource/readers/bookmarks.py +192 -0
- primarysource/readers/html.py +1312 -0
- primarysource/readers/markdown.py +189 -0
- primarysource/readers/pdf.py +187 -0
- primarysource/readers/xml.py +230 -0
- primarysource/refs.py +87 -0
- primarysource/registry.py +161 -0
- primarysource/render.py +49 -0
- primarysource/rfc/__init__.py +3 -0
- primarysource/rfc/__main__.py +6 -0
- primarysource/rfc/cite.py +204 -0
- primarysource/rfc/cli.py +903 -0
- primarysource/rfc/collection.py +19 -0
- primarysource/rfc/config.py +138 -0
- primarysource/rfc/errata.py +203 -0
- primarysource/rfc/fsutil.py +82 -0
- primarysource/rfc/graph.py +213 -0
- primarysource/rfc/index/__init__.py +1 -0
- primarysource/rfc/index/chunker.py +281 -0
- primarysource/rfc/index/embed.py +166 -0
- primarysource/rfc/index/hybrid.py +305 -0
- primarysource/rfc/index/lexical.py +223 -0
- primarysource/rfc/index/rfcxml.py +673 -0
- primarysource/rfc/index/search.py +508 -0
- primarysource/rfc/index/txtseg.py +585 -0
- primarysource/rfc/library.py +294 -0
- primarysource/rfc/mcp/__init__.py +1 -0
- primarysource/rfc/mcp/server.py +381 -0
- primarysource/rfc/packs/__init__.py +1 -0
- primarysource/rfc/packs/builder.py +228 -0
- primarysource/rfc/packs/collections/all-current-txt.json +10 -0
- primarysource/rfc/packs/collections/essentials.json +19 -0
- primarysource/rfc/packs/collections/fyi-current.json +10 -0
- primarysource/rfc/packs/collections/standards-current.json +10 -0
- primarysource/rfc/packs/collections/year-2025.json +10 -0
- primarysource/rfc/packs/collections/year-2026.json +10 -0
- primarysource/rfc/packs/collections.py +163 -0
- primarysource/rfc/packs/docsetexport.py +163 -0
- primarysource/rfc/packs/epub.py +159 -0
- primarysource/rfc/packs/export.py +306 -0
- primarysource/rfc/packs/htmlexport.py +82 -0
- primarysource/rfc/packs/serve.py +143 -0
- primarysource/rfc/packs/zimexport.py +171 -0
- primarysource/rfc/query.py +466 -0
- primarysource/rfc/subjects.py +457 -0
- primarysource/rfc/sync/__init__.py +1 -0
- primarysource/rfc/sync/downloader.py +132 -0
- primarysource/rfc/sync/manifest.py +162 -0
- primarysource/rfc/sync/scanner.py +49 -0
- primarysource/rfc/sync/state.py +464 -0
- primarysource/rfc/views.py +1067 -0
- primarysource/rpmdocs/__init__.py +15 -0
- primarysource/rpmdocs/catalogue.py +117 -0
- primarysource/rpmdocs/cli.py +12 -0
- primarysource/rpmdocs/server.py +8 -0
- primarysource/scaffold.py +223 -0
- primarysource/serve.py +75 -0
- primarysource/settings.py +152 -0
- primarysource/usb/__init__.py +5 -0
- primarysource/usb/collection.py +37 -0
- primarysource/usb/data/acquired.json +2025 -0
- primarysource/usb/data/sources-usb.toml +852 -0
- primarysource/usb/data/sources.toml +10 -0
- primarysource/usb/data/usb-catalog.json +1663 -0
- primarysource/usb/data/usb-classification.json +1986 -0
- primarysource/usb/data/usb-corpus-build.json +608 -0
- primarysource/usb/data/usb-pdf-choice.json +839 -0
- primarysource/usb/data/usb-split-measure.json +1803 -0
- primarysource/usb/ingest/__init__.py +1 -0
- primarysource/usb/ingest/acquire.py +130 -0
- primarysource/usb/ingest/discover_usb.py +88 -0
- primarysource/usb/ingest/extract.py +48 -0
- primarysource/usb/ingest/fetch.py +197 -0
- primarysource/usb/ingest/index.py +14 -0
- primarysource/usb/ingest/sources.py +85 -0
- primarysource/usb/models.py +7 -0
- primarysource/usb/paths.py +33 -0
- primarysource/usb/server/__init__.py +3 -0
- primarysource/usb/server/corpus.py +38 -0
- primarysource/usb/server/mcp.py +19 -0
- primarysource/usb/server/tools.py +35 -0
- primarysource/usb/spec.py +20 -0
- primarysource/usbids/__init__.py +56 -0
- primarysource/usbids/cli.py +65 -0
- primarysource/usbids/importer.py +272 -0
- primarysource/usbids/parse.py +283 -0
- primarysource/usbids/server.py +55 -0
- primarysource/usbids/store.py +80 -0
- primarysource/usbids/tools.py +174 -0
- primarysource/zim/__init__.py +5 -0
- primarysource/zim/__main__.py +8 -0
- primarysource/zim/_libzim.py +37 -0
- primarysource/zim/catalog.py +594 -0
- primarysource/zim/cli.py +555 -0
- primarysource/zim/collection.py +41 -0
- primarysource/zim/errors.py +100 -0
- primarysource/zim/groups.py +30 -0
- primarysource/zim/library.py +668 -0
- primarysource/zim/manage.py +636 -0
- primarysource/zim/markdown.py +1247 -0
- primarysource/zim/mcp.py +201 -0
- primarysource/zim/purl.py +130 -0
- primarysource/zim/py.typed +0 -0
- primarysource/zim/refs.py +90 -0
- primarysource/zim/service.py +1182 -0
- primarysource/zim/snapshot.py +197 -0
- primarysource/zim/sync.py +269 -0
- primarysource/zim/views.py +230 -0
- primarysource-0.1.0.dist-info/METADATA +118 -0
- primarysource-0.1.0.dist-info/RECORD +303 -0
- primarysource-0.1.0.dist-info/WHEEL +4 -0
- primarysource-0.1.0.dist-info/entry_points.txt +2 -0
- primarysource-0.1.0.dist-info/licenses/LICENSE +203 -0
- primarysource-0.1.0.dist-info/licenses/NOTICE +51 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""Broadband Forum: the TR-181 and other CWMP/USP data models (XML) and Technical Reports such as TR-069.
|
|
2
|
+
|
|
3
|
+
Two sources in one collection, because one consumer (cwmp) needs both and a ref reads the same way:
|
|
4
|
+
- data-model XML from https://github.com/BroadbandForum/cwmp-data-models, pinned to one commit, BSD-3-Clause
|
|
5
|
+
notice in every file (image layer allowed): `bbf:tr-181-2-22-0-ip§Device.IP.Interface.{i}.Enable`;
|
|
6
|
+
- Technical Report PDFs fetched by the user into a volume (TR-069 Amendment 6 Corrigendum 1 so far):
|
|
7
|
+
`bbf:tr-069-1-6-1§3.5¶2`.
|
|
8
|
+
|
|
9
|
+
Reading XML needs only the standard library (hardened parser in `_xml.py`); importing a PDF needs `pypdf` (the
|
|
10
|
+
`[bbf]` extra). `docs/bbf.md` is the user-facing description.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from primarysource.model import Unit
|
|
16
|
+
from primarysource.refs import Ref, RefGrammar
|
|
17
|
+
from primarysource.registry import Collection
|
|
18
|
+
|
|
19
|
+
BBF_DOC = r"[a-z][a-z0-9]*(?:-[a-z0-9]+)*"
|
|
20
|
+
"""A document by its Forum file stem: `tr-069-1-6-1` (a report), `tr-181-2-22-0-ip` (a data-model file)."""
|
|
21
|
+
|
|
22
|
+
BBF_SECTION = r"[^\s#¶§][^\s#¶§]*"
|
|
23
|
+
"""A report clause (`3.5`, `A.3.2.3`, a slug) or a data-model node (`Device.IP.Interface.{i}.Enable`,
|
|
24
|
+
`Device.Reboot()`, `Device.Boot!`, `Baseline:1`). No spaces, never `#`, `¶` or `§`."""
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class _Refs:
|
|
28
|
+
"""The collection's ref parser: `library.parse_ref` (which also takes the `bbf:` prefix and refuses what the
|
|
29
|
+
collection has no meaning for), imported on first use so the collection loads without its reader."""
|
|
30
|
+
|
|
31
|
+
_grammar = RefGrammar(BBF_DOC, BBF_SECTION)
|
|
32
|
+
|
|
33
|
+
def parse(self, text: str) -> Ref:
|
|
34
|
+
from primarysource.bbf.library import parse_ref
|
|
35
|
+
|
|
36
|
+
return parse_ref(text)
|
|
37
|
+
|
|
38
|
+
def format(self, ref: Ref) -> str:
|
|
39
|
+
return self._grammar.format(ref)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
BBF = Collection(
|
|
43
|
+
name="bbf",
|
|
44
|
+
title="Broadband Forum data models and Technical Reports (TR-069, TR-181)",
|
|
45
|
+
prefix="bbf_",
|
|
46
|
+
unit=Unit.BLOCK,
|
|
47
|
+
grammar=_Refs(),
|
|
48
|
+
server="primarysource.bbf.server:server",
|
|
49
|
+
cli="primarysource.bbf.cli:main",
|
|
50
|
+
)
|
|
51
|
+
"""Refs: `bbf:tr-069-1-6-1§3.5¶2` and `bbf:tr-181-2-22-0-ip§Device.IP.Interface.{i}.Enable¶1`. `§` names a report
|
|
52
|
+
clause by its number or a data-model node by its full path. `¶n` is the nth sentence of a report clause's span
|
|
53
|
+
(a PDF gives sentences) and the nth paragraph of a data-model node's description; every result's `unit:` footer
|
|
54
|
+
says which. The collection's declared unit is therefore `block`. The `bbf:` prefix is optional."""
|
|
55
|
+
|
|
56
|
+
__all__ = ["BBF", "BBF_DOC", "BBF_SECTION"]
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""The bbf collection's XML reader: the core's hardened `primarysource.readers.xml` with bbf's bounds and names.
|
|
2
|
+
|
|
3
|
+
The parser moved to the core (`cl.reader_xml_hardened`); this wrapper keeps what the data-model reader and its
|
|
4
|
+
tests rely on:
|
|
5
|
+
|
|
6
|
+
- the bounds below, and a refusal over the byte bound or a structural bound in bbf's own words;
|
|
7
|
+
- namespace prefixes dropped from element names and namespaced attributes (`xsi:schemaLocation`) ignored, because
|
|
8
|
+
the BBF files qualify only the root (`dm:document`). Prefixes are not resolved, so an undeclared one is not an
|
|
9
|
+
error;
|
|
10
|
+
- processing instructions dropped, never acted on.
|
|
11
|
+
|
|
12
|
+
Everything else the core refuses is still refused: any document type declaration (so no entity, internal or
|
|
13
|
+
external, and no parameter entity), notations, encodings other than UTF-8, malformed input and a second root.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import xml.etree.ElementTree as ET # noqa: S405 - only `Element` objects are renamed here; parsing is the core's
|
|
19
|
+
|
|
20
|
+
from primarysource.errors import LibError
|
|
21
|
+
from primarysource.readers.xml import XmlRefused, XmlTooDeep, XmlTooLarge
|
|
22
|
+
from primarysource.readers.xml import parse as _parse
|
|
23
|
+
|
|
24
|
+
MAX_BYTES = 16 * 1024 * 1024
|
|
25
|
+
MAX_ELEMENTS = 1_500_000
|
|
26
|
+
MAX_DEPTH = 64
|
|
27
|
+
MAX_ATTRIBUTES = 64
|
|
28
|
+
MAX_ATTRIBUTE_LENGTH = 64 * 1024
|
|
29
|
+
HINT = "data-model files have none; refusing to parse"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _local(name: str) -> str:
|
|
33
|
+
return name.rpartition(":")[2]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def parse(data: bytes) -> ET.Element:
|
|
37
|
+
"""The root element of `data`, or a `LibError`. Never resolves an entity or reads outside `data`."""
|
|
38
|
+
if len(data) > MAX_BYTES:
|
|
39
|
+
raise LibError(f"XML is {len(data)} bytes, over the {MAX_BYTES} byte bound", "")
|
|
40
|
+
try:
|
|
41
|
+
root = _parse(
|
|
42
|
+
data,
|
|
43
|
+
MAX_BYTES,
|
|
44
|
+
max_depth=MAX_DEPTH,
|
|
45
|
+
max_elements=MAX_ELEMENTS,
|
|
46
|
+
max_attributes=MAX_ATTRIBUTES,
|
|
47
|
+
max_attribute_length=MAX_ATTRIBUTE_LENGTH,
|
|
48
|
+
max_text=MAX_BYTES,
|
|
49
|
+
ignore_processing_instructions=True,
|
|
50
|
+
namespaces=False,
|
|
51
|
+
hint=HINT,
|
|
52
|
+
)
|
|
53
|
+
except (XmlTooDeep, XmlTooLarge) as exc:
|
|
54
|
+
message = f"the XML exceeds the parser's bounds: {exc.reason}"
|
|
55
|
+
raise LibError(message, "this is not a Broadband Forum data-model file") from exc
|
|
56
|
+
except XmlRefused:
|
|
57
|
+
raise
|
|
58
|
+
for element in root.iter():
|
|
59
|
+
element.tag = _local(element.tag)
|
|
60
|
+
kept = {k: v for k, v in element.attrib.items() if ":" not in k and k != "xmlns"}
|
|
61
|
+
if len(kept) != len(element.attrib):
|
|
62
|
+
element.attrib = kept
|
|
63
|
+
return root
|