aer1-all 0.1.0__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.
- aer1_all-0.1.0/PKG-INFO +67 -0
- aer1_all-0.1.0/README.md +42 -0
- aer1_all-0.1.0/aer1_all/__init__.py +181 -0
- aer1_all-0.1.0/aer1_all.egg-info/PKG-INFO +67 -0
- aer1_all-0.1.0/aer1_all.egg-info/SOURCES.txt +9 -0
- aer1_all-0.1.0/aer1_all.egg-info/dependency_links.txt +1 -0
- aer1_all-0.1.0/aer1_all.egg-info/requires.txt +9 -0
- aer1_all-0.1.0/aer1_all.egg-info/top_level.txt +1 -0
- aer1_all-0.1.0/pyproject.toml +38 -0
- aer1_all-0.1.0/setup.cfg +4 -0
- aer1_all-0.1.0/tests/test_aer1_all.py +52 -0
aer1_all-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aer1-all
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: One install for every AER-1 framework collector: verifiable AI agent execution receipts, auto-detected.
|
|
5
|
+
License: Apache-2.0
|
|
6
|
+
Project-URL: Homepage, https://zambo.dev
|
|
7
|
+
Project-URL: IETF Draft, https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
|
|
8
|
+
Project-URL: Verify a receipt, https://zambo.dev/verify/
|
|
9
|
+
Keywords: aer-1,ai-agents,verifiable-receipts,audit,tracing,audit-trail,zambo,metapackage
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
Requires-Dist: aer1-haystack>=0.1.0
|
|
17
|
+
Requires-Dist: aer1-pydantic>=0.1.0
|
|
18
|
+
Requires-Dist: aer1-langgraph>=0.1.4
|
|
19
|
+
Requires-Dist: aer1-llamaindex>=0.1.1
|
|
20
|
+
Requires-Dist: aer1-crewai>=0.1.5
|
|
21
|
+
Requires-Dist: aer1-autogen>=0.1.2
|
|
22
|
+
Requires-Dist: aer1-smolagents>=0.1.7
|
|
23
|
+
Requires-Dist: aer1-middleware>=0.2.1
|
|
24
|
+
Requires-Dist: aer1-openai-agents>=0.1.6
|
|
25
|
+
|
|
26
|
+
# aer1-all
|
|
27
|
+
|
|
28
|
+
One install for every AER-1 framework collector. Verifiable execution receipts for AI agents, whichever framework you use.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install aer1-all
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
import aer1_all
|
|
36
|
+
|
|
37
|
+
report = aer1_all.instrument()
|
|
38
|
+
for framework, info in report.items():
|
|
39
|
+
if info["ready"]:
|
|
40
|
+
print(framework, "ready:", info["snippet"])
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`instrument()` detects which collectors (and their underlying frameworks) are importable in your environment and reports readiness. It never raises on missing pieces. Each ready framework ships a two-line wiring snippet in the report.
|
|
44
|
+
|
|
45
|
+
Included collectors (all live on PyPI):
|
|
46
|
+
|
|
47
|
+
- CrewAI (`aer1-crewai`)
|
|
48
|
+
- LangGraph (`aer1-langgraph`)
|
|
49
|
+
- LlamaIndex (`aer1-llamaindex`)
|
|
50
|
+
- AutoGen (`aer1-autogen`)
|
|
51
|
+
- SmolAgents (`aer1-smolagents`)
|
|
52
|
+
- Haystack (`aer1-haystack`)
|
|
53
|
+
- Pydantic AI (`aer1-pydantic`)
|
|
54
|
+
- OpenAI Agents SDK (`aer1-openai-agents`)
|
|
55
|
+
- Framework-agnostic middleware (`aer1-middleware`)
|
|
56
|
+
|
|
57
|
+
`aer1-langchain` and `aer1-strands` join this list as soon as they land on PyPI.
|
|
58
|
+
|
|
59
|
+
## What a verifiable receipt proves
|
|
60
|
+
|
|
61
|
+
A verifiable receipt proves the recorded result bytes were not changed after capture. It does not prove the model was right, and it does not prove the upstream capture was honest. That boundary is deliberate: the receipt is a claim about bytes, and the bytes are re-checkable by anyone.
|
|
62
|
+
|
|
63
|
+
Verify any receipt at https://zambo.dev/verify/.
|
|
64
|
+
|
|
65
|
+
## Spec
|
|
66
|
+
|
|
67
|
+
AER-1 is an IETF Internet-Draft by Brennan Zambo: https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
|
aer1_all-0.1.0/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# aer1-all
|
|
2
|
+
|
|
3
|
+
One install for every AER-1 framework collector. Verifiable execution receipts for AI agents, whichever framework you use.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pip install aer1-all
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
import aer1_all
|
|
11
|
+
|
|
12
|
+
report = aer1_all.instrument()
|
|
13
|
+
for framework, info in report.items():
|
|
14
|
+
if info["ready"]:
|
|
15
|
+
print(framework, "ready:", info["snippet"])
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`instrument()` detects which collectors (and their underlying frameworks) are importable in your environment and reports readiness. It never raises on missing pieces. Each ready framework ships a two-line wiring snippet in the report.
|
|
19
|
+
|
|
20
|
+
Included collectors (all live on PyPI):
|
|
21
|
+
|
|
22
|
+
- CrewAI (`aer1-crewai`)
|
|
23
|
+
- LangGraph (`aer1-langgraph`)
|
|
24
|
+
- LlamaIndex (`aer1-llamaindex`)
|
|
25
|
+
- AutoGen (`aer1-autogen`)
|
|
26
|
+
- SmolAgents (`aer1-smolagents`)
|
|
27
|
+
- Haystack (`aer1-haystack`)
|
|
28
|
+
- Pydantic AI (`aer1-pydantic`)
|
|
29
|
+
- OpenAI Agents SDK (`aer1-openai-agents`)
|
|
30
|
+
- Framework-agnostic middleware (`aer1-middleware`)
|
|
31
|
+
|
|
32
|
+
`aer1-langchain` and `aer1-strands` join this list as soon as they land on PyPI.
|
|
33
|
+
|
|
34
|
+
## What a verifiable receipt proves
|
|
35
|
+
|
|
36
|
+
A verifiable receipt proves the recorded result bytes were not changed after capture. It does not prove the model was right, and it does not prove the upstream capture was honest. That boundary is deliberate: the receipt is a claim about bytes, and the bytes are re-checkable by anyone.
|
|
37
|
+
|
|
38
|
+
Verify any receipt at https://zambo.dev/verify/.
|
|
39
|
+
|
|
40
|
+
## Spec
|
|
41
|
+
|
|
42
|
+
AER-1 is an IETF Internet-Draft by Brennan Zambo: https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"""aer1-all: one install for every AER-1 framework collector.
|
|
2
|
+
|
|
3
|
+
``pip install aer1-all`` pulls in every published AER-1 framework collector.
|
|
4
|
+
``aer1_all.instrument()`` then detects which collectors (and their underlying
|
|
5
|
+
frameworks) are actually importable in your environment and reports what is
|
|
6
|
+
ready, without ever raising on missing pieces.
|
|
7
|
+
|
|
8
|
+
A verifiable receipt proves the recorded result bytes were not changed after
|
|
9
|
+
capture. It does not prove the model was right or the upstream capture was
|
|
10
|
+
honest. That boundary is deliberate and documented in every collector.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import importlib
|
|
16
|
+
|
|
17
|
+
__version__ = "0.1.0"
|
|
18
|
+
|
|
19
|
+
# framework -> (collector pypi name, collector module, collector class,
|
|
20
|
+
# framework import probe, two-line wiring snippet)
|
|
21
|
+
FRAMEWORKS = {
|
|
22
|
+
"crewai": (
|
|
23
|
+
"aer1-crewai",
|
|
24
|
+
"aer1_crewai",
|
|
25
|
+
"AER1CrewAIListener",
|
|
26
|
+
"crewai",
|
|
27
|
+
'from aer1_crewai import AER1CrewAIListener\n'
|
|
28
|
+
'listener = AER1CrewAIListener(goal="...") # pass to Crew(...)',
|
|
29
|
+
),
|
|
30
|
+
"langgraph": (
|
|
31
|
+
"aer1-langgraph",
|
|
32
|
+
"aer1_langgraph",
|
|
33
|
+
"AER1LangGraphHandler",
|
|
34
|
+
"langgraph",
|
|
35
|
+
'from aer1_langgraph import AER1LangGraphHandler\n'
|
|
36
|
+
'handler = AER1LangGraphHandler() # attach to your StateGraph',
|
|
37
|
+
),
|
|
38
|
+
"llamaindex": (
|
|
39
|
+
"aer1-llamaindex",
|
|
40
|
+
"aer1_llamaindex",
|
|
41
|
+
"AER1ReceiptCollector",
|
|
42
|
+
"llama_index",
|
|
43
|
+
'from aer1_llamaindex import AER1ReceiptCollector\n'
|
|
44
|
+
'collector = AER1ReceiptCollector() # pass via CallbackManager',
|
|
45
|
+
),
|
|
46
|
+
"autogen": (
|
|
47
|
+
"aer1-autogen",
|
|
48
|
+
"aer1_autogen",
|
|
49
|
+
"AER1AutoGenCollector",
|
|
50
|
+
"autogen_agentchat",
|
|
51
|
+
'from aer1_autogen import AER1AutoGenCollector, AER1AgentWrapper\n'
|
|
52
|
+
'collector = AER1AutoGenCollector(goal="...") # wrap your agents',
|
|
53
|
+
),
|
|
54
|
+
"smolagents": (
|
|
55
|
+
"aer1-smolagents",
|
|
56
|
+
"aer1_smolagents",
|
|
57
|
+
"AER1ReceiptCollector",
|
|
58
|
+
"smolagents",
|
|
59
|
+
'from aer1_smolagents import AER1ReceiptCollector\n'
|
|
60
|
+
'collector = AER1ReceiptCollector() # step_callbacks={TaskStep: collector, ...}',
|
|
61
|
+
),
|
|
62
|
+
"haystack": (
|
|
63
|
+
"aer1-haystack",
|
|
64
|
+
"aer1_haystack",
|
|
65
|
+
"AER1ReceiptCollector",
|
|
66
|
+
"haystack",
|
|
67
|
+
'from aer1_haystack import AER1ReceiptCollector\n'
|
|
68
|
+
'collector = AER1ReceiptCollector() # connect to your Pipeline',
|
|
69
|
+
),
|
|
70
|
+
"pydantic-ai": (
|
|
71
|
+
"aer1-pydantic",
|
|
72
|
+
"aer1_pydantic",
|
|
73
|
+
"AER1ReceiptCollector",
|
|
74
|
+
"pydantic_ai",
|
|
75
|
+
'from aer1_pydantic import AER1ReceiptCollector\n'
|
|
76
|
+
'collector = AER1ReceiptCollector() # wrap your Pydantic AI agent',
|
|
77
|
+
),
|
|
78
|
+
"openai-agents": (
|
|
79
|
+
"aer1-openai-agents",
|
|
80
|
+
"aer1_openai_agents",
|
|
81
|
+
"AER1TracingProcessor",
|
|
82
|
+
"agents",
|
|
83
|
+
'from aer1_openai_agents import AER1TracingProcessor\n'
|
|
84
|
+
'from agents.tracing import add_trace_processor\n'
|
|
85
|
+
'add_trace_processor(AER1TracingProcessor(goal="..."))',
|
|
86
|
+
),
|
|
87
|
+
"middleware": (
|
|
88
|
+
"aer1-middleware",
|
|
89
|
+
"aer1_middleware",
|
|
90
|
+
"create_receipt",
|
|
91
|
+
None, # framework-agnostic toolkit, no single framework probe
|
|
92
|
+
'from aer1_middleware import create_receipt, verify_receipt\n'
|
|
93
|
+
'receipt = create_receipt(tool_name="...", inputs={...}, output={...})',
|
|
94
|
+
),
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _probe(module_name):
|
|
99
|
+
"""Return True if module_name imports, False otherwise. Never raises."""
|
|
100
|
+
if not module_name:
|
|
101
|
+
return True
|
|
102
|
+
try:
|
|
103
|
+
importlib.import_module(module_name)
|
|
104
|
+
return True
|
|
105
|
+
except Exception:
|
|
106
|
+
return False
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def available():
|
|
110
|
+
"""Return {framework: info} for every collector that is importable here."""
|
|
111
|
+
out = {}
|
|
112
|
+
for framework, (pypi_name, module, cls, fw_probe, snippet) in FRAMEWORKS.items():
|
|
113
|
+
if not _probe(module):
|
|
114
|
+
continue
|
|
115
|
+
out[framework] = {
|
|
116
|
+
"pypi": pypi_name,
|
|
117
|
+
"module": module,
|
|
118
|
+
"class": cls,
|
|
119
|
+
"framework_present": _probe(fw_probe),
|
|
120
|
+
"snippet": snippet,
|
|
121
|
+
}
|
|
122
|
+
return out
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def get_collector(framework):
|
|
126
|
+
"""Return the collector class for a framework, or None if unavailable."""
|
|
127
|
+
info = available().get(framework)
|
|
128
|
+
if not info:
|
|
129
|
+
return None
|
|
130
|
+
try:
|
|
131
|
+
module = importlib.import_module(info["module"])
|
|
132
|
+
return getattr(module, info["class"], None)
|
|
133
|
+
except Exception:
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def instrument():
|
|
138
|
+
"""Detect installed AER-1 collectors and report readiness.
|
|
139
|
+
|
|
140
|
+
Returns a dict mapping framework name to a status dict with keys:
|
|
141
|
+
``pypi`` (package name), ``ready`` (collector importable AND its
|
|
142
|
+
framework importable, or framework-agnostic), ``reason`` (human string),
|
|
143
|
+
and ``snippet`` (the two-line wiring example).
|
|
144
|
+
|
|
145
|
+
Never raises on missing packages or frameworks. A verifiable receipt
|
|
146
|
+
proves recorded bytes were unchanged, not that the model was right.
|
|
147
|
+
"""
|
|
148
|
+
report = {}
|
|
149
|
+
for framework, (pypi_name, module, cls, fw_probe, snippet) in FRAMEWORKS.items():
|
|
150
|
+
if not _probe(module):
|
|
151
|
+
report[framework] = {
|
|
152
|
+
"pypi": pypi_name,
|
|
153
|
+
"ready": False,
|
|
154
|
+
"reason": "collector %s not installed" % pypi_name,
|
|
155
|
+
"snippet": snippet,
|
|
156
|
+
}
|
|
157
|
+
continue
|
|
158
|
+
if fw_probe is None or _probe(fw_probe):
|
|
159
|
+
report[framework] = {
|
|
160
|
+
"pypi": pypi_name,
|
|
161
|
+
"ready": True,
|
|
162
|
+
"reason": "collector and framework importable",
|
|
163
|
+
"snippet": snippet,
|
|
164
|
+
}
|
|
165
|
+
else:
|
|
166
|
+
report[framework] = {
|
|
167
|
+
"pypi": pypi_name,
|
|
168
|
+
"ready": False,
|
|
169
|
+
"reason": "collector installed but framework '%s' not importable" % fw_probe,
|
|
170
|
+
"snippet": snippet,
|
|
171
|
+
}
|
|
172
|
+
return report
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
__all__ = [
|
|
176
|
+
"__version__",
|
|
177
|
+
"FRAMEWORKS",
|
|
178
|
+
"available",
|
|
179
|
+
"get_collector",
|
|
180
|
+
"instrument",
|
|
181
|
+
]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aer1-all
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: One install for every AER-1 framework collector: verifiable AI agent execution receipts, auto-detected.
|
|
5
|
+
License: Apache-2.0
|
|
6
|
+
Project-URL: Homepage, https://zambo.dev
|
|
7
|
+
Project-URL: IETF Draft, https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
|
|
8
|
+
Project-URL: Verify a receipt, https://zambo.dev/verify/
|
|
9
|
+
Keywords: aer-1,ai-agents,verifiable-receipts,audit,tracing,audit-trail,zambo,metapackage
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
Requires-Dist: aer1-haystack>=0.1.0
|
|
17
|
+
Requires-Dist: aer1-pydantic>=0.1.0
|
|
18
|
+
Requires-Dist: aer1-langgraph>=0.1.4
|
|
19
|
+
Requires-Dist: aer1-llamaindex>=0.1.1
|
|
20
|
+
Requires-Dist: aer1-crewai>=0.1.5
|
|
21
|
+
Requires-Dist: aer1-autogen>=0.1.2
|
|
22
|
+
Requires-Dist: aer1-smolagents>=0.1.7
|
|
23
|
+
Requires-Dist: aer1-middleware>=0.2.1
|
|
24
|
+
Requires-Dist: aer1-openai-agents>=0.1.6
|
|
25
|
+
|
|
26
|
+
# aer1-all
|
|
27
|
+
|
|
28
|
+
One install for every AER-1 framework collector. Verifiable execution receipts for AI agents, whichever framework you use.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install aer1-all
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
import aer1_all
|
|
36
|
+
|
|
37
|
+
report = aer1_all.instrument()
|
|
38
|
+
for framework, info in report.items():
|
|
39
|
+
if info["ready"]:
|
|
40
|
+
print(framework, "ready:", info["snippet"])
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`instrument()` detects which collectors (and their underlying frameworks) are importable in your environment and reports readiness. It never raises on missing pieces. Each ready framework ships a two-line wiring snippet in the report.
|
|
44
|
+
|
|
45
|
+
Included collectors (all live on PyPI):
|
|
46
|
+
|
|
47
|
+
- CrewAI (`aer1-crewai`)
|
|
48
|
+
- LangGraph (`aer1-langgraph`)
|
|
49
|
+
- LlamaIndex (`aer1-llamaindex`)
|
|
50
|
+
- AutoGen (`aer1-autogen`)
|
|
51
|
+
- SmolAgents (`aer1-smolagents`)
|
|
52
|
+
- Haystack (`aer1-haystack`)
|
|
53
|
+
- Pydantic AI (`aer1-pydantic`)
|
|
54
|
+
- OpenAI Agents SDK (`aer1-openai-agents`)
|
|
55
|
+
- Framework-agnostic middleware (`aer1-middleware`)
|
|
56
|
+
|
|
57
|
+
`aer1-langchain` and `aer1-strands` join this list as soon as they land on PyPI.
|
|
58
|
+
|
|
59
|
+
## What a verifiable receipt proves
|
|
60
|
+
|
|
61
|
+
A verifiable receipt proves the recorded result bytes were not changed after capture. It does not prove the model was right, and it does not prove the upstream capture was honest. That boundary is deliberate: the receipt is a claim about bytes, and the bytes are re-checkable by anyone.
|
|
62
|
+
|
|
63
|
+
Verify any receipt at https://zambo.dev/verify/.
|
|
64
|
+
|
|
65
|
+
## Spec
|
|
66
|
+
|
|
67
|
+
AER-1 is an IETF Internet-Draft by Brennan Zambo: https://datatracker.ietf.org/doc/draft-zambo-aer1/12/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
aer1_all
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "aer1-all"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "One install for every AER-1 framework collector: verifiable AI agent execution receipts, auto-detected."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = { text = "Apache-2.0" }
|
|
12
|
+
dependencies = [
|
|
13
|
+
"aer1-haystack>=0.1.0",
|
|
14
|
+
"aer1-pydantic>=0.1.0",
|
|
15
|
+
"aer1-langgraph>=0.1.4",
|
|
16
|
+
"aer1-llamaindex>=0.1.1",
|
|
17
|
+
"aer1-crewai>=0.1.5",
|
|
18
|
+
"aer1-autogen>=0.1.2",
|
|
19
|
+
"aer1-smolagents>=0.1.7",
|
|
20
|
+
"aer1-middleware>=0.2.1",
|
|
21
|
+
"aer1-openai-agents>=0.1.6",
|
|
22
|
+
]
|
|
23
|
+
keywords = ["aer-1", "ai-agents", "verifiable-receipts", "audit", "tracing", "audit-trail", "zambo", "metapackage"]
|
|
24
|
+
classifiers = [
|
|
25
|
+
"Development Status :: 3 - Alpha",
|
|
26
|
+
"Intended Audience :: Developers",
|
|
27
|
+
"Programming Language :: Python :: 3",
|
|
28
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[project.urls]
|
|
32
|
+
Homepage = "https://zambo.dev"
|
|
33
|
+
"IETF Draft" = "https://datatracker.ietf.org/doc/draft-zambo-aer1/12/"
|
|
34
|
+
"Verify a receipt" = "https://zambo.dev/verify/"
|
|
35
|
+
|
|
36
|
+
[tool.setuptools.packages.find]
|
|
37
|
+
where = ["."]
|
|
38
|
+
include = ["aer1_all*"]
|
aer1_all-0.1.0/setup.cfg
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Unit tests for aer1_all (run against the source tree)."""
|
|
2
|
+
|
|
3
|
+
import aer1_all
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_version():
|
|
7
|
+
assert aer1_all.__version__ == "0.1.0"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_frameworks_registry_shape():
|
|
11
|
+
for fw, entry in aer1_all.FRAMEWORKS.items():
|
|
12
|
+
assert len(entry) == 5, fw
|
|
13
|
+
pypi_name, module, cls, fw_probe, snippet = entry
|
|
14
|
+
assert pypi_name.startswith("aer1-"), fw
|
|
15
|
+
assert module.startswith("aer1_"), fw
|
|
16
|
+
assert isinstance(snippet, str) and "from " in snippet, fw
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_probe_never_raises():
|
|
20
|
+
assert aer1_all._probe("definitely_not_a_real_module_xyz") is False
|
|
21
|
+
assert aer1_all._probe(None) is True
|
|
22
|
+
assert aer1_all._probe("sys") is True
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_instrument_never_raises_and_covers_all_frameworks():
|
|
26
|
+
report = aer1_all.instrument()
|
|
27
|
+
assert set(report.keys()) == set(aer1_all.FRAMEWORKS.keys())
|
|
28
|
+
for fw, info in report.items():
|
|
29
|
+
assert set(info.keys()) == {"pypi", "ready", "reason", "snippet"}, fw
|
|
30
|
+
assert isinstance(info["ready"], bool), fw
|
|
31
|
+
assert isinstance(info["reason"], str) and info["reason"], fw
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_instrument_zero_collectors_reports_not_installed():
|
|
35
|
+
# In this dev environment collectors may or may not be installed;
|
|
36
|
+
# the invariant is the shape, not the values.
|
|
37
|
+
report = aer1_all.instrument()
|
|
38
|
+
for fw, info in report.items():
|
|
39
|
+
if not info["ready"]:
|
|
40
|
+
assert "not installed" in info["reason"] or "not importable" in info["reason"], fw
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_get_collector_missing_returns_none():
|
|
44
|
+
assert aer1_all.get_collector("no_such_framework_xyz") is None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_no_banned_phrasing():
|
|
48
|
+
import pathlib
|
|
49
|
+
for f in list(pathlib.Path("aer1_all").glob("*.py")) + [pathlib.Path("README.md")]:
|
|
50
|
+
text = f.read_text()
|
|
51
|
+
assert "signed receipt" not in text.lower(), f
|
|
52
|
+
assert "—" not in text and "–" not in text, f
|