tlmtc 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.
- tlmtc-0.1.0/.github/dependabot.yml +49 -0
- tlmtc-0.1.0/.github/labeler.yml +41 -0
- tlmtc-0.1.0/.github/workflows/ci.yml +123 -0
- tlmtc-0.1.0/.github/workflows/pr-labeler.yml +46 -0
- tlmtc-0.1.0/.github/workflows/release.yml +141 -0
- tlmtc-0.1.0/.gitignore +39 -0
- tlmtc-0.1.0/CONTRIBUTING.md +102 -0
- tlmtc-0.1.0/LICENSE.md +21 -0
- tlmtc-0.1.0/PKG-INFO +223 -0
- tlmtc-0.1.0/README.md +178 -0
- tlmtc-0.1.0/SECURITY.md +18 -0
- tlmtc-0.1.0/assets/tlmtc-bright.png +0 -0
- tlmtc-0.1.0/assets/tlmtc-dark.png +0 -0
- tlmtc-0.1.0/examples/paired_example.csv +1001 -0
- tlmtc-0.1.0/examples/paired_example_unlabeled.csv +1001 -0
- tlmtc-0.1.0/pyproject.toml +110 -0
- tlmtc-0.1.0/src/tlmtc/__init__.py +54 -0
- tlmtc-0.1.0/src/tlmtc/__main__.py +6 -0
- tlmtc-0.1.0/src/tlmtc/api.py +455 -0
- tlmtc-0.1.0/src/tlmtc/cli.py +345 -0
- tlmtc-0.1.0/src/tlmtc/data_contracts.py +160 -0
- tlmtc-0.1.0/src/tlmtc/data_pipeline.py +257 -0
- tlmtc-0.1.0/src/tlmtc/data_preparation.py +221 -0
- tlmtc-0.1.0/src/tlmtc/evaluation.py +291 -0
- tlmtc-0.1.0/src/tlmtc/evaluation_pipeline.py +309 -0
- tlmtc-0.1.0/src/tlmtc/finetune_pipeline.py +355 -0
- tlmtc-0.1.0/src/tlmtc/hpo.py +157 -0
- tlmtc-0.1.0/src/tlmtc/meta.py +86 -0
- tlmtc-0.1.0/src/tlmtc/paths.py +371 -0
- tlmtc-0.1.0/src/tlmtc/prediction.py +154 -0
- tlmtc-0.1.0/src/tlmtc/reporting.py +605 -0
- tlmtc-0.1.0/src/tlmtc/runtime_output.py +100 -0
- tlmtc-0.1.0/src/tlmtc/settings.py +456 -0
- tlmtc-0.1.0/src/tlmtc/training.py +339 -0
- tlmtc-0.1.0/tests/data/tiny_tokenizer/config.json +5 -0
- tlmtc-0.1.0/tests/data/tiny_tokenizer/vocab.txt +9 -0
- tlmtc-0.1.0/tests/integration/test_predict_tlmtc.py +491 -0
- tlmtc-0.1.0/tests/integration/test_train_tlmtc.py +506 -0
- tlmtc-0.1.0/tests/unit/test_api.py +875 -0
- tlmtc-0.1.0/tests/unit/test_cli.py +492 -0
- tlmtc-0.1.0/tests/unit/test_data_contracts.py +281 -0
- tlmtc-0.1.0/tests/unit/test_data_pipeline.py +631 -0
- tlmtc-0.1.0/tests/unit/test_data_preparation.py +416 -0
- tlmtc-0.1.0/tests/unit/test_evaluation.py +652 -0
- tlmtc-0.1.0/tests/unit/test_evaluation_pipeline.py +422 -0
- tlmtc-0.1.0/tests/unit/test_finetune_pipeline.py +930 -0
- tlmtc-0.1.0/tests/unit/test_hpo.py +185 -0
- tlmtc-0.1.0/tests/unit/test_meta.py +163 -0
- tlmtc-0.1.0/tests/unit/test_paths.py +559 -0
- tlmtc-0.1.0/tests/unit/test_prediction.py +191 -0
- tlmtc-0.1.0/tests/unit/test_public_api.py +165 -0
- tlmtc-0.1.0/tests/unit/test_reporting.py +941 -0
- tlmtc-0.1.0/tests/unit/test_runtime_output.py +182 -0
- tlmtc-0.1.0/tests/unit/test_settings.py +836 -0
- tlmtc-0.1.0/tests/unit/test_training.py +345 -0
- tlmtc-0.1.0/uv.lock +2835 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
updates:
|
|
4
|
+
- package-ecosystem: "uv"
|
|
5
|
+
directory: "/"
|
|
6
|
+
schedule:
|
|
7
|
+
interval: "monthly"
|
|
8
|
+
day: "monday"
|
|
9
|
+
time: "06:00"
|
|
10
|
+
timezone: "Europe/Berlin"
|
|
11
|
+
cooldown:
|
|
12
|
+
default-days: 14
|
|
13
|
+
open-pull-requests-limit: 5
|
|
14
|
+
versioning-strategy: "lockfile-only"
|
|
15
|
+
commit-message:
|
|
16
|
+
prefix: "deps"
|
|
17
|
+
labels:
|
|
18
|
+
- "dependencies"
|
|
19
|
+
groups:
|
|
20
|
+
minor-and-patch:
|
|
21
|
+
applies-to: version-updates
|
|
22
|
+
patterns:
|
|
23
|
+
- "*"
|
|
24
|
+
update-types:
|
|
25
|
+
- "minor"
|
|
26
|
+
- "patch"
|
|
27
|
+
|
|
28
|
+
- package-ecosystem: "github-actions"
|
|
29
|
+
directory: "/"
|
|
30
|
+
schedule:
|
|
31
|
+
interval: "monthly"
|
|
32
|
+
day: "monday"
|
|
33
|
+
time: "06:00"
|
|
34
|
+
timezone: "Europe/Berlin"
|
|
35
|
+
cooldown:
|
|
36
|
+
default-days: 14
|
|
37
|
+
open-pull-requests-limit: 5
|
|
38
|
+
commit-message:
|
|
39
|
+
prefix: "deps"
|
|
40
|
+
labels:
|
|
41
|
+
- "dependencies"
|
|
42
|
+
groups:
|
|
43
|
+
minor-and-patch:
|
|
44
|
+
applies-to: version-updates
|
|
45
|
+
patterns:
|
|
46
|
+
- "*"
|
|
47
|
+
update-types:
|
|
48
|
+
- "minor"
|
|
49
|
+
- "patch"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
feature:
|
|
2
|
+
- head-branch:
|
|
3
|
+
- '^feat/'
|
|
4
|
+
- '^feature/'
|
|
5
|
+
|
|
6
|
+
fix:
|
|
7
|
+
- head-branch:
|
|
8
|
+
- '^fix/'
|
|
9
|
+
- '^bugfix/'
|
|
10
|
+
|
|
11
|
+
refactor:
|
|
12
|
+
- head-branch:
|
|
13
|
+
- '^refactor/'
|
|
14
|
+
|
|
15
|
+
tests:
|
|
16
|
+
- head-branch:
|
|
17
|
+
- '^test/'
|
|
18
|
+
- '^tests/'
|
|
19
|
+
|
|
20
|
+
documentation:
|
|
21
|
+
- head-branch:
|
|
22
|
+
- '^docs/'
|
|
23
|
+
- '^doc/'
|
|
24
|
+
|
|
25
|
+
ci:
|
|
26
|
+
- head-branch:
|
|
27
|
+
- '^ci/'
|
|
28
|
+
|
|
29
|
+
release:
|
|
30
|
+
- head-branch:
|
|
31
|
+
- '^release/'
|
|
32
|
+
|
|
33
|
+
chore:
|
|
34
|
+
- head-branch:
|
|
35
|
+
- '^chore/'
|
|
36
|
+
- '^build/'
|
|
37
|
+
|
|
38
|
+
dependencies:
|
|
39
|
+
- head-branch:
|
|
40
|
+
- '^deps/'
|
|
41
|
+
- '^dependabot/'
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ "main" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ "main" ]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
env:
|
|
11
|
+
UV_VERSION: "0.9.30"
|
|
12
|
+
PYTHON_VERSION: "3.12"
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
lint:
|
|
16
|
+
name: Lint
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout code
|
|
21
|
+
uses: actions/checkout@v6
|
|
22
|
+
|
|
23
|
+
- name: Set up uv
|
|
24
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
25
|
+
with:
|
|
26
|
+
version: ${{ env.UV_VERSION }}
|
|
27
|
+
enable-cache: true
|
|
28
|
+
cache-dependency-glob: "uv.lock"
|
|
29
|
+
|
|
30
|
+
- name: Set up Python
|
|
31
|
+
run: uv python install ${{ env.PYTHON_VERSION }}
|
|
32
|
+
|
|
33
|
+
- name: Check lockfile is current
|
|
34
|
+
run: uv lock --check
|
|
35
|
+
|
|
36
|
+
- name: Install lint dependencies
|
|
37
|
+
run: uv sync --group lint --frozen
|
|
38
|
+
|
|
39
|
+
- name: Run Ruff formatter
|
|
40
|
+
run: uv run ruff format --check .
|
|
41
|
+
|
|
42
|
+
- name: Run Ruff linter
|
|
43
|
+
run: uv run ruff check .
|
|
44
|
+
|
|
45
|
+
type:
|
|
46
|
+
name: Type check
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
|
|
49
|
+
steps:
|
|
50
|
+
- name: Checkout code
|
|
51
|
+
uses: actions/checkout@v6
|
|
52
|
+
|
|
53
|
+
- name: Set up uv
|
|
54
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
55
|
+
with:
|
|
56
|
+
version: ${{ env.UV_VERSION }}
|
|
57
|
+
enable-cache: true
|
|
58
|
+
cache-dependency-glob: "uv.lock"
|
|
59
|
+
|
|
60
|
+
- name: Set up Python
|
|
61
|
+
run: uv python install ${{ env.PYTHON_VERSION }}
|
|
62
|
+
|
|
63
|
+
- name: Check lockfile is current
|
|
64
|
+
run: uv lock --check
|
|
65
|
+
|
|
66
|
+
- name: Install type-check dependencies
|
|
67
|
+
run: uv sync --group type --frozen
|
|
68
|
+
|
|
69
|
+
- name: Run mypy
|
|
70
|
+
run: uv run mypy src/tlmtc
|
|
71
|
+
|
|
72
|
+
test:
|
|
73
|
+
name: Test
|
|
74
|
+
runs-on: ubuntu-latest
|
|
75
|
+
|
|
76
|
+
steps:
|
|
77
|
+
- name: Checkout code
|
|
78
|
+
uses: actions/checkout@v6
|
|
79
|
+
|
|
80
|
+
- name: Set up uv
|
|
81
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
82
|
+
with:
|
|
83
|
+
version: ${{ env.UV_VERSION }}
|
|
84
|
+
enable-cache: true
|
|
85
|
+
cache-dependency-glob: "uv.lock"
|
|
86
|
+
|
|
87
|
+
- name: Set up Python
|
|
88
|
+
run: uv python install ${{ env.PYTHON_VERSION }}
|
|
89
|
+
|
|
90
|
+
- name: Check lockfile is current
|
|
91
|
+
run: uv lock --check
|
|
92
|
+
|
|
93
|
+
- name: Install test dependencies
|
|
94
|
+
run: uv sync --group test --extra full --frozen
|
|
95
|
+
|
|
96
|
+
- name: Run unit tests
|
|
97
|
+
run: uv run pytest -q -m "not integration"
|
|
98
|
+
|
|
99
|
+
build:
|
|
100
|
+
name: Build package
|
|
101
|
+
runs-on: ubuntu-latest
|
|
102
|
+
|
|
103
|
+
steps:
|
|
104
|
+
- name: Checkout code
|
|
105
|
+
uses: actions/checkout@v6
|
|
106
|
+
|
|
107
|
+
- name: Set up uv
|
|
108
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
109
|
+
with:
|
|
110
|
+
version: ${{ env.UV_VERSION }}
|
|
111
|
+
enable-cache: true
|
|
112
|
+
cache-dependency-glob: "uv.lock"
|
|
113
|
+
|
|
114
|
+
- name: Set up Python
|
|
115
|
+
run: uv python install ${{ env.PYTHON_VERSION }}
|
|
116
|
+
|
|
117
|
+
- name: Check lockfile is current
|
|
118
|
+
run: uv lock --check
|
|
119
|
+
|
|
120
|
+
- name: Build package
|
|
121
|
+
run: uv build
|
|
122
|
+
|
|
123
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: Pull Request Labeler
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request_target:
|
|
5
|
+
types:
|
|
6
|
+
- opened
|
|
7
|
+
- reopened
|
|
8
|
+
- synchronize
|
|
9
|
+
- edited
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
pull-requests: write
|
|
14
|
+
issues: write
|
|
15
|
+
|
|
16
|
+
concurrency:
|
|
17
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
|
18
|
+
cancel-in-progress: true
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
label:
|
|
22
|
+
name: Label pull request
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
|
|
25
|
+
steps:
|
|
26
|
+
- name: Apply type labels
|
|
27
|
+
uses: actions/labeler@v6
|
|
28
|
+
with:
|
|
29
|
+
sync-labels: true
|
|
30
|
+
|
|
31
|
+
- name: Apply size label
|
|
32
|
+
if: github.event.action != 'edited'
|
|
33
|
+
uses: codelytv/pr-size-labeler@v1
|
|
34
|
+
with:
|
|
35
|
+
xs_label: 'size: XS'
|
|
36
|
+
xs_max_size: '49'
|
|
37
|
+
s_label: 'size: S'
|
|
38
|
+
s_max_size: '199'
|
|
39
|
+
m_label: 'size: M'
|
|
40
|
+
m_max_size: '499'
|
|
41
|
+
l_label: 'size: L'
|
|
42
|
+
l_max_size: '999'
|
|
43
|
+
xl_label: 'size: XL'
|
|
44
|
+
fail_if_xl: 'false'
|
|
45
|
+
files_to_ignore: |
|
|
46
|
+
uv.lock
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
build_package:
|
|
7
|
+
description: "Run full release preflight including package build"
|
|
8
|
+
required: false
|
|
9
|
+
type: boolean
|
|
10
|
+
default: false
|
|
11
|
+
|
|
12
|
+
push:
|
|
13
|
+
tags:
|
|
14
|
+
- "v*.*.*"
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
env:
|
|
20
|
+
UV_VERSION: "0.9.30"
|
|
21
|
+
PYTHON_VERSION: "3.12"
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
integration-tests:
|
|
25
|
+
name: Run integration tests
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
timeout-minutes: 30
|
|
28
|
+
|
|
29
|
+
steps:
|
|
30
|
+
- name: Checkout code
|
|
31
|
+
uses: actions/checkout@v6
|
|
32
|
+
with:
|
|
33
|
+
fetch-depth: 0
|
|
34
|
+
|
|
35
|
+
- name: Check release tag is on main
|
|
36
|
+
if: github.event_name == 'push'
|
|
37
|
+
run: |
|
|
38
|
+
git fetch origin main
|
|
39
|
+
git merge-base --is-ancestor HEAD origin/main
|
|
40
|
+
|
|
41
|
+
- name: Set up uv
|
|
42
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
43
|
+
with:
|
|
44
|
+
version: ${{ env.UV_VERSION }}
|
|
45
|
+
enable-cache: true
|
|
46
|
+
cache-dependency-glob: "uv.lock"
|
|
47
|
+
|
|
48
|
+
- name: Set up Python
|
|
49
|
+
run: uv python install ${{ env.PYTHON_VERSION }}
|
|
50
|
+
|
|
51
|
+
- name: Check lockfile is current
|
|
52
|
+
run: uv lock --check
|
|
53
|
+
|
|
54
|
+
- name: Install dependencies
|
|
55
|
+
run: uv sync --frozen --extra full --group test
|
|
56
|
+
|
|
57
|
+
- name: Run integration tests
|
|
58
|
+
run: uv run --frozen pytest -m integration
|
|
59
|
+
|
|
60
|
+
build:
|
|
61
|
+
name: Build package
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
needs: integration-tests
|
|
64
|
+
if: github.event_name == 'push' || inputs.build_package
|
|
65
|
+
|
|
66
|
+
steps:
|
|
67
|
+
- name: Checkout code
|
|
68
|
+
uses: actions/checkout@v6
|
|
69
|
+
|
|
70
|
+
- name: Set up uv
|
|
71
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
72
|
+
with:
|
|
73
|
+
version: ${{ env.UV_VERSION }}
|
|
74
|
+
enable-cache: true
|
|
75
|
+
cache-dependency-glob: "uv.lock"
|
|
76
|
+
|
|
77
|
+
- name: Set up Python
|
|
78
|
+
run: uv python install ${{ env.PYTHON_VERSION }}
|
|
79
|
+
|
|
80
|
+
- name: Check tag matches package version
|
|
81
|
+
if: github.event_name == 'push'
|
|
82
|
+
run: |
|
|
83
|
+
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
84
|
+
PACKAGE_VERSION="$(uv run --no-sync python - <<'PY'
|
|
85
|
+
import tomllib
|
|
86
|
+
from pathlib import Path
|
|
87
|
+
|
|
88
|
+
pyproject = tomllib.loads(Path("pyproject.toml").read_text())
|
|
89
|
+
print(pyproject["project"]["version"])
|
|
90
|
+
PY
|
|
91
|
+
)"
|
|
92
|
+
|
|
93
|
+
echo "Tag version: ${TAG_VERSION}"
|
|
94
|
+
echo "Package version: ${PACKAGE_VERSION}"
|
|
95
|
+
|
|
96
|
+
test "${TAG_VERSION}" = "${PACKAGE_VERSION}"
|
|
97
|
+
|
|
98
|
+
- name: Check lockfile is current
|
|
99
|
+
run: uv lock --check
|
|
100
|
+
|
|
101
|
+
- name: Build package
|
|
102
|
+
run: uv build
|
|
103
|
+
|
|
104
|
+
- name: Check build artifacts
|
|
105
|
+
run: |
|
|
106
|
+
echo "Built files:"
|
|
107
|
+
ls -l dist/
|
|
108
|
+
|
|
109
|
+
- name: Check package metadata
|
|
110
|
+
run: uvx --from twine twine check dist/*
|
|
111
|
+
|
|
112
|
+
- name: Upload package distributions
|
|
113
|
+
uses: actions/upload-artifact@v6
|
|
114
|
+
with:
|
|
115
|
+
name: python-package-distributions
|
|
116
|
+
path: dist/*
|
|
117
|
+
if-no-files-found: error
|
|
118
|
+
|
|
119
|
+
publish:
|
|
120
|
+
name: Publish package to PyPI
|
|
121
|
+
runs-on: ubuntu-latest
|
|
122
|
+
needs: build
|
|
123
|
+
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
|
|
124
|
+
|
|
125
|
+
environment:
|
|
126
|
+
name: pypi
|
|
127
|
+
url: https://pypi.org/p/tlmtc
|
|
128
|
+
|
|
129
|
+
permissions:
|
|
130
|
+
contents: read
|
|
131
|
+
id-token: write
|
|
132
|
+
|
|
133
|
+
steps:
|
|
134
|
+
- name: Download package distributions
|
|
135
|
+
uses: actions/download-artifact@v6
|
|
136
|
+
with:
|
|
137
|
+
name: python-package-distributions
|
|
138
|
+
path: dist/
|
|
139
|
+
|
|
140
|
+
- name: Publish package distributions to PyPI
|
|
141
|
+
uses: pypa/gh-action-pypi-publish@v1.14.0
|
tlmtc-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# OS
|
|
2
|
+
.DS_Store
|
|
3
|
+
Thumbs.db
|
|
4
|
+
|
|
5
|
+
# Editor / IDE
|
|
6
|
+
.idea/
|
|
7
|
+
*.iml
|
|
8
|
+
.vscode/
|
|
9
|
+
*.swp
|
|
10
|
+
*.swo
|
|
11
|
+
*~
|
|
12
|
+
|
|
13
|
+
# Python bytecode
|
|
14
|
+
__pycache__/
|
|
15
|
+
*.pyc
|
|
16
|
+
|
|
17
|
+
# Virtual environments
|
|
18
|
+
.venv/
|
|
19
|
+
venv/
|
|
20
|
+
env/
|
|
21
|
+
|
|
22
|
+
# Build artifacts
|
|
23
|
+
build/
|
|
24
|
+
dist/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.eggs/
|
|
27
|
+
|
|
28
|
+
# Test / lint / type-check caches
|
|
29
|
+
.pytest_cache/
|
|
30
|
+
.mypy_cache/
|
|
31
|
+
.ruff_cache/
|
|
32
|
+
.coverage
|
|
33
|
+
htmlcov/
|
|
34
|
+
|
|
35
|
+
# Environment files
|
|
36
|
+
.env
|
|
37
|
+
.env.*
|
|
38
|
+
!.env.example
|
|
39
|
+
!.env.*.example
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
Thanks for your interest in contributing to **tlmtc**.
|
|
2
|
+
|
|
3
|
+
Contributions are welcome, including:
|
|
4
|
+
|
|
5
|
+
- asking questions about usage or design
|
|
6
|
+
- reporting bugs
|
|
7
|
+
- suggesting features or improvements
|
|
8
|
+
- improving documentation, examples, or error messages
|
|
9
|
+
- adding or improving tests
|
|
10
|
+
- contributing code
|
|
11
|
+
|
|
12
|
+
## Before you start
|
|
13
|
+
|
|
14
|
+
### Issue first, then PR
|
|
15
|
+
|
|
16
|
+
Unless your change is trivial, such as a typo correction or minor documentation improvement, please open an issue before submitting a pull request.
|
|
17
|
+
|
|
18
|
+
Opening an issue first helps avoid wasted work and keeps design decisions visible.
|
|
19
|
+
|
|
20
|
+
### AI-assisted contributions
|
|
21
|
+
|
|
22
|
+
AI-assisted work is welcome when there is clear human ownership.
|
|
23
|
+
|
|
24
|
+
You may use AI tools to help draft, revise, explore, or implement contributions, but you are responsible for the final result. Before submitting, you must review every change, verify behavior against the codebase, run the relevant checks, and make sure the contribution matches the project style and intent.
|
|
25
|
+
|
|
26
|
+
Unreviewed AI-agent or bulk-generated contributions are not accepted. Please do not submit issues or pull requests that were generated autonomously, submitted at scale, or opened without careful human review and testing.
|
|
27
|
+
|
|
28
|
+
Pull requests that appear automated, low-effort, spam-like, or submitted without clear human ownership may be closed without review, regardless of how they were produced.
|
|
29
|
+
|
|
30
|
+
### Issues
|
|
31
|
+
|
|
32
|
+
When reporting a bug, please include:
|
|
33
|
+
|
|
34
|
+
- what you expected to happen
|
|
35
|
+
- what actually happened
|
|
36
|
+
- a minimal example, if possible
|
|
37
|
+
- the relevant package version, Python version, and operating system
|
|
38
|
+
- the relevant error message or traceback, if applicable
|
|
39
|
+
|
|
40
|
+
When suggesting a feature, please describe:
|
|
41
|
+
|
|
42
|
+
- the use case
|
|
43
|
+
- why the current behavior is insufficient
|
|
44
|
+
- the expected behavior or API, if you have a concrete proposal
|
|
45
|
+
|
|
46
|
+
### Pull requests
|
|
47
|
+
|
|
48
|
+
All changes must be submitted through pull requests.
|
|
49
|
+
|
|
50
|
+
Each pull request should represent one substantively coherent change. Large, mixed-scope pull requests may be closed or split before review.
|
|
51
|
+
|
|
52
|
+
A good pull request should include:
|
|
53
|
+
|
|
54
|
+
- a short summary of what changed and why the change is needed
|
|
55
|
+
- a scoped list of key changes
|
|
56
|
+
- tests, or an explanation of why tests were not added
|
|
57
|
+
- documentation updates when user-facing behavior changes
|
|
58
|
+
- notes on how the change was tested
|
|
59
|
+
|
|
60
|
+
## Branches and commits
|
|
61
|
+
|
|
62
|
+
The `main` branch is protected. Direct commits to `main` by non-admins are not allowed.
|
|
63
|
+
|
|
64
|
+
Work should happen on short-lived, task-specific branches scoped to a single pull request.
|
|
65
|
+
|
|
66
|
+
Use simple branch names such as:
|
|
67
|
+
|
|
68
|
+
- `feature/short-description`
|
|
69
|
+
- `fix/short-description`
|
|
70
|
+
- `refactor/short-description`
|
|
71
|
+
- `docs/short-description`
|
|
72
|
+
- `tests/short-description`
|
|
73
|
+
- `ci/short-description`
|
|
74
|
+
- `chore/short-description`
|
|
75
|
+
|
|
76
|
+
Commits should follow a simple, consistent style:
|
|
77
|
+
|
|
78
|
+
- `feat: add new functionality`
|
|
79
|
+
- `fix: correct a bug`
|
|
80
|
+
- `refactor: restructure code without changing behavior`
|
|
81
|
+
- `docs: update documentation`
|
|
82
|
+
- `tests: add or adjust tests`
|
|
83
|
+
- `ci: update CI configuration`
|
|
84
|
+
- `chore: update maintenance files`
|
|
85
|
+
|
|
86
|
+
## Tests and checks
|
|
87
|
+
|
|
88
|
+
Before opening a pull request, please run the relevant local checks: `ruff`, `mypy`, and `pytest`.
|
|
89
|
+
|
|
90
|
+
The project uses Python 3.12 or newer. We recommend using `uv` for local development. Install the project with the optional dependencies when working on training, prediction, or integration behavior.
|
|
91
|
+
|
|
92
|
+
When your change affects end-to-end training or prediction behavior, please also run the integration tests.
|
|
93
|
+
|
|
94
|
+
Not every pull request needs to run every expensive check locally, but pull requests should not knowingly rely on GitHub Actions to catch obvious failures.
|
|
95
|
+
|
|
96
|
+
## Review and merge policy
|
|
97
|
+
|
|
98
|
+
Pull requests require passing CI checks and maintainer approval before merging.
|
|
99
|
+
|
|
100
|
+
Community review is welcome and may inform maintainer decisions, but final merge decisions are made by maintainers.
|
|
101
|
+
|
|
102
|
+
Pull requests are merged using squash merge.
|
tlmtc-0.1.0/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sascha Göbel
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|