-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyproject.toml
More file actions
148 lines (136 loc) · 5.19 KB
/
Copy pathpyproject.toml
File metadata and controls
148 lines (136 loc) · 5.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "convilyn"
dynamic = ["version"]
description = "Official Convilyn client SDK — file conversion, agentic workflows, community library"
readme = "docs/README.md"
license = "Apache-2.0"
license-files = ["LICENSE"]
requires-python = ">=3.10"
authors = [
{ name = "Convilyn", email = "sdk@convilyn.corenovus.com" },
]
keywords = [
"convilyn",
"ai",
"agent",
"workflow",
"file-conversion",
"mcp",
]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Internet :: WWW/HTTP",
"Typing :: Typed",
]
dependencies = [
"httpx>=0.25.0,<1.0.0",
"pydantic>=2.0.0,<3.0.0",
"click>=8.0.0,<9.0.0",
"websockets>=13.0,<17.0",
"typing-extensions>=4.7.0; python_version < '3.11'",
]
[project.urls]
Homepage = "https://convilyn.corenovus.com"
Documentation = "https://docs.convilyn.corenovus.com"
Issues = "https://github.com/CoreNovus/convilyn-python/issues"
Repository = "https://github.com/CoreNovus/convilyn-python"
"Source Code" = "https://github.com/CoreNovus/convilyn-python"
Changelog = "https://github.com/CoreNovus/convilyn-python/blob/main/CHANGELOG.md"
[project.scripts]
convilyn = "convilyn.cli.main:cli"
# Dev tooling lives in a PEP 735 dependency group (uv-native: `uv sync`
# installs it by default). Kept out of the wheel/sdist METADATA. The
# consumer-facing `author` extra above stays a project optional-dependency.
[dependency-groups]
dev = [
"pytest>=7.0.0",
"pytest-asyncio>=0.23.0",
"pytest-cov>=4.1.0",
"respx>=0.22.0",
"ruff==0.15.6",
]
[tool.hatch.version]
path = "src/convilyn/_version.py"
[tool.hatch.build.targets.wheel]
packages = ["src/convilyn"]
[tool.hatch.build.targets.sdist]
# Ship CHANGELOG + examples + docs in the sdist so source-install workflows
# (e.g. `pip install --no-binary :all:`) get the user-facing repo surface. The
# wheel intentionally stays lean — README is bundled in METADATA (rendered on
# PyPI); LICENSE is picked up via `license-files = ["LICENSE"]` per PEP 639;
# CHANGELOG ships in the sdist + wheel (see `include` below) — no public GitHub
# URL exists during the beta. AGENT.md and any docs/internal paths are
# explicitly excluded — they are agent-operating instructions, not user-facing
# documentation, and must not ship to PyPI.
#
# Supply-chain invariant — SHIPPED == SCANNED: every vocabulary-bearing surface
# shipped here MUST be covered by the black-box blacklist lint's scan_roots
# (`sdk/sdks.json` → consumer-python, read by
# `scripts/ci/sdk_blackbox/lint_blacklist.py`). `examples/` ships AND is scanned
# (mirrors author-python). The `tests/` suite is neither user-facing nor
# scanned, so it is NOT shipped — dropping it keeps shipped == scanned and
# removes unnecessary attack surface from the published artifact.
include = [
"src/convilyn",
"examples",
"docs",
"CHANGELOG.md",
"LICENSE",
"pyproject.toml",
]
exclude = [
"AGENT.md",
# Whole-subtree exclusion (not the single-level `docs/internal/*`) so a
# nested internal doc can never leak into the published sdist.
"docs/internal",
# hatchling's sdist otherwise ships the repo-root `.gitignore` (there is no
# package-local one) into the public, immutable PyPI artifact — leaking
# internal repo structure, operator secret-file naming conventions, and PII
# fixture filenames, and bypassing the SHIPPED==SCANNED blackbox lint (which
# has no `.gitignore` scan suffix). Exclude it explicitly.
".gitignore",
]
[tool.ruff]
target-version = "py310"
line-length = 100
[tool.ruff.lint]
select = ["E", "F", "I", "N", "W", "UP", "B"]
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
# Coverage is measured AND enforced on every pytest invocation so
# regressions get caught locally before CI. Threshold is line ≥ 80%
# (`--cov-fail-under=80`) per `.claude/skills/unit-testing/SKILL.md`.
# Branch coverage is enabled (`--cov-branch`) to surface uncovered
# conditionals that line coverage hides; the threshold is line-only
# because branch behaviour varies per Python minor version.
addopts = "--cov=src/convilyn --cov-branch --cov-fail-under=80 --cov-report=term-missing --cov-report=xml"
[tool.coverage.run]
source = ["src/convilyn"]
branch = true
# Omit zero-logic modules so they don't dilute the percentage: the
# generated `_version.py` only declares __version__; the package
# `__init__.py` is re-exports only. Both are exercised by every
# import-based test indirectly.
omit = [
"src/convilyn/_version.py",
"src/convilyn/__init__.py",
]
[tool.coverage.report]
show_missing = true
skip_covered = false
# Hard floor: any drop below 80% line coverage fails pytest. Current
# measurement sits at ~93%, leaving 13 points of
# headroom — future contributors can land coverage-neutral PRs
# without triggering the gate, but a sweeping regression will fire it.
fail_under = 80