btx-lib-mail 1.0.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.
Files changed (60) hide show
  1. btx_lib_mail-1.0.0/.devcontainer/devcontainer.json +22 -0
  2. btx_lib_mail-1.0.0/.devcontainer/settings.json +6 -0
  3. btx_lib_mail-1.0.0/.env.example +56 -0
  4. btx_lib_mail-1.0.0/.github/dependabot.yml +22 -0
  5. btx_lib_mail-1.0.0/.github/workflows/ci.yml +175 -0
  6. btx_lib_mail-1.0.0/.github/workflows/codeql.yml +39 -0
  7. btx_lib_mail-1.0.0/.github/workflows/release.yml +45 -0
  8. btx_lib_mail-1.0.0/.gitignore +180 -0
  9. btx_lib_mail-1.0.0/.qlty/qlty.toml +2 -0
  10. btx_lib_mail-1.0.0/.snyk +5 -0
  11. btx_lib_mail-1.0.0/AGENTS.md +207 -0
  12. btx_lib_mail-1.0.0/CHANGELOG.md +65 -0
  13. btx_lib_mail-1.0.0/CONTRIBUTING.md +48 -0
  14. btx_lib_mail-1.0.0/DEVELOPMENT.md +134 -0
  15. btx_lib_mail-1.0.0/INSTALL.md +75 -0
  16. btx_lib_mail-1.0.0/LICENSE +22 -0
  17. btx_lib_mail-1.0.0/Makefile +54 -0
  18. btx_lib_mail-1.0.0/PKG-INFO +341 -0
  19. btx_lib_mail-1.0.0/README.md +306 -0
  20. btx_lib_mail-1.0.0/codecov.yml +28 -0
  21. btx_lib_mail-1.0.0/concept.md +312 -0
  22. btx_lib_mail-1.0.0/docs/systemdesign/module_reference.md +496 -0
  23. btx_lib_mail-1.0.0/notebooks/Quickstart.ipynb +165 -0
  24. btx_lib_mail-1.0.0/pyproject.toml +107 -0
  25. btx_lib_mail-1.0.0/reset_git_history.sh +54 -0
  26. btx_lib_mail-1.0.0/scripts/__init__.py +3 -0
  27. btx_lib_mail-1.0.0/scripts/__main__.py +7 -0
  28. btx_lib_mail-1.0.0/scripts/_utils.py +581 -0
  29. btx_lib_mail-1.0.0/scripts/build.py +52 -0
  30. btx_lib_mail-1.0.0/scripts/bump.py +32 -0
  31. btx_lib_mail-1.0.0/scripts/bump_major.py +20 -0
  32. btx_lib_mail-1.0.0/scripts/bump_minor.py +20 -0
  33. btx_lib_mail-1.0.0/scripts/bump_patch.py +20 -0
  34. btx_lib_mail-1.0.0/scripts/bump_version.py +80 -0
  35. btx_lib_mail-1.0.0/scripts/clean.py +48 -0
  36. btx_lib_mail-1.0.0/scripts/cli.py +213 -0
  37. btx_lib_mail-1.0.0/scripts/dev.py +19 -0
  38. btx_lib_mail-1.0.0/scripts/help.py +41 -0
  39. btx_lib_mail-1.0.0/scripts/install.py +19 -0
  40. btx_lib_mail-1.0.0/scripts/menu.py +568 -0
  41. btx_lib_mail-1.0.0/scripts/push.py +77 -0
  42. btx_lib_mail-1.0.0/scripts/release.py +90 -0
  43. btx_lib_mail-1.0.0/scripts/run_cli.py +154 -0
  44. btx_lib_mail-1.0.0/scripts/target_metadata.py +174 -0
  45. btx_lib_mail-1.0.0/scripts/test.py +535 -0
  46. btx_lib_mail-1.0.0/scripts/version_current.py +20 -0
  47. btx_lib_mail-1.0.0/src/btx_lib_mail/__init__.py +24 -0
  48. btx_lib_mail-1.0.0/src/btx_lib_mail/__init__conf__.py +67 -0
  49. btx_lib_mail-1.0.0/src/btx_lib_mail/__main__.py +92 -0
  50. btx_lib_mail-1.0.0/src/btx_lib_mail/behaviors.py +133 -0
  51. btx_lib_mail-1.0.0/src/btx_lib_mail/cli.py +734 -0
  52. btx_lib_mail-1.0.0/src/btx_lib_mail/lib_mail.py +770 -0
  53. btx_lib_mail-1.0.0/src/btx_lib_mail/py.typed +0 -0
  54. btx_lib_mail-1.0.0/tests/conftest.py +99 -0
  55. btx_lib_mail-1.0.0/tests/test_behaviors.py +78 -0
  56. btx_lib_mail-1.0.0/tests/test_cli.py +561 -0
  57. btx_lib_mail-1.0.0/tests/test_lib_mail.py +359 -0
  58. btx_lib_mail-1.0.0/tests/test_metadata.py +101 -0
  59. btx_lib_mail-1.0.0/tests/test_module_entry.py +174 -0
  60. btx_lib_mail-1.0.0/tests/test_scripts.py +266 -0
@@ -0,0 +1,22 @@
1
+ {
2
+ "image": "mcr.microsoft.com/devcontainers/python:3.13",
3
+
4
+ "postCreateCommand": "bash -lc '\nPY=/usr/local/bin/python;\n$PY -m pip install -U pip && \\\n$PY -m pip install ipykernel && \\\n$PY -m pip install -e . && \\\n# register kernel using this exact interpreter\n$PY -m ipykernel install --name=python3 --display-name=\"Python 3 (3.13)\" --user && \\\n# patch the notebook to point to the python3 kernelspec (VS Code will bind to /usr/local/bin/python)\n$PY - <<\"PY\"\nimport json, pathlib\np = pathlib.Path(\"notebooks/Quickstart.ipynb\")\nif p.exists():\n nb = json.loads(p.read_text(encoding=\"utf-8\"))\n md = nb.setdefault(\"metadata\", {})\n md[\"kernelspec\"] = {\n \"name\": \"python3\",\n \"display_name\": \"Python 3 (3.13)\",\n \"language\": \"python\"\n }\n md[\"language_info\"] = {\"name\": \"python\"}\n p.write_text(json.dumps(nb, ensure_ascii=False, indent=1), encoding=\"utf-8\")\n print(\"Pinned kernelspec to python3 in\", p)\nelse:\n print(\"Notebook not found:\", p)\nPY'\n",
5
+
6
+ "customizations": {
7
+ "vscode": {
8
+ "extensions": ["ms-toolsai.jupyter", "ms-python.python"],
9
+ "settings": {
10
+ "workbench.startupEditor": "none",
11
+ "jupyter.alwaysTrustNotebooks": true,
12
+ "jupyter.kernelPickerType": "OnlyRecommended",
13
+ "python.defaultInterpreterPath": "/usr/local/bin/python"
14
+ }
15
+ },
16
+ "codespaces": {
17
+ "openFiles": ["README.md"]
18
+ }
19
+ },
20
+
21
+ "postAttachCommand": "bash -lc 'if [ -f notebooks/Quickstart.ipynb ]; then code -r notebooks/Quickstart.ipynb; fi'"
22
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "python.defaultInterpreterPath": "/usr/local/bin/python3.13",
3
+ "jupyter.alwaysTrustNotebooks": true,
4
+ "jupyter.kernelPickerType": "OnlyRecommended",
5
+ "jupyter.askForKernelRestart": false
6
+ }
@@ -0,0 +1,56 @@
1
+ # Copy to .env and fill values as needed.
2
+
3
+ # Codecov upload token (required for private repos; optional for public repos)
4
+ CODECOV_TOKEN=
5
+
6
+ # PyPI API token for release workflow (.github/workflows/release.yml)
7
+ # Format: pypi-AgENdGVzdC5weXBpLm9yZwIk...
8
+ PYPI_API_TOKEN=
9
+
10
+ # Optional: GitHub token for API-limited tasks
11
+ GITHUB_TOKEN=
12
+
13
+ ######################################################################################
14
+ ### Optional SMTP integration knobs for tests (leave blank to disable live sends)
15
+ ######################################################################################
16
+
17
+ # comma-separated hostnames or `host:port` entries tried
18
+ TEST_SMTP_HOSTS=
19
+
20
+ # comma-separated email addresses that should receive the smoke message.
21
+ TEST_RECIPIENTS=
22
+
23
+ # optional envelope sender; defaults to the first recipient when unset.
24
+ TEST_SENDER=
25
+
26
+ # optional boolean toggle (`1`, `true`, `yes`, `on`) enabling STARTTLS before authentication, default = ENABLED
27
+ TEST_SMTP_USE_STARTTLS=
28
+
29
+ # optional credentials used when both values are supplied.
30
+ TEST_SMTP_USERNAME=
31
+ TEST_SMTP_PASSWORD=
32
+
33
+ ######################################################################################
34
+ ### CLI ``send`` command defaults.
35
+ ### only .env files in the current working directory are considered
36
+ ### those values can be also passed as environment variables and ONLY apply to CLI-Usage
37
+ ######################################################################################
38
+
39
+ # comma-separated hostnames or `host:port` entries tried
40
+ BTX_MAIL_SMTP_HOSTS=
41
+
42
+ # comma-separated email addresses that should receive the smoke message.
43
+ BTX_MAIL_RECIPIENTS=
44
+
45
+ # optional envelope sender; defaults to the first recipient when unset.
46
+ BTX_MAIL_SENDER=
47
+
48
+ # optional boolean toggle (`1`, `true`, `yes`, `on`) enabling STARTTLS before authentication, default = ENABLED
49
+ BTX_MAIL_SMTP_USE_STARTTLS=
50
+
51
+ # optional credentials used when both values are supplied.
52
+ BTX_MAIL_SMTP_USERNAME=
53
+ BTX_MAIL_SMTP_PASSWORD=
54
+
55
+ # optional socket timeout in seconds, default = 30
56
+ BTX_MAIL_SMTP_TIMEOUT=
@@ -0,0 +1,22 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ allow:
8
+ - dependency-type: "direct"
9
+ labels:
10
+ - "dependencies"
11
+ commit-message:
12
+ prefix: "deps"
13
+ include: "scope"
14
+ - package-ecosystem: "github-actions"
15
+ directory: "/"
16
+ schedule:
17
+ interval: "weekly"
18
+ labels:
19
+ - "dependencies"
20
+ commit-message:
21
+ prefix: "deps"
22
+ include: "scope"
@@ -0,0 +1,175 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, master ]
6
+ pull_request:
7
+ branches: [ main, master ]
8
+
9
+ jobs:
10
+ test:
11
+ name: Tests (Python ${{ matrix.python }}, ${{ matrix.os }})
12
+ runs-on: ${{ matrix.os }}
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ os: [ubuntu-latest, macos-latest, windows-latest]
17
+ # Test against Python 3.13 and the latest 3.x available on Actions runners
18
+ python: ["3.13", "3.x"]
19
+ steps:
20
+ - uses: actions/checkout@v5
21
+ - uses: actions/setup-python@v6
22
+ with:
23
+ python-version: ${{ matrix.python }}
24
+ cache: pip
25
+ cache-dependency-path: pyproject.toml
26
+ - name: Extract project metadata
27
+ shell: python
28
+ run: |
29
+ import os
30
+ import tomllib
31
+ from pathlib import Path
32
+
33
+ data = tomllib.loads(Path('pyproject.toml').read_text('utf-8'))
34
+ project = data['project']['name']
35
+ module = project.replace('-', '_')
36
+ dash = project.replace('_', '-')
37
+ scripts = list(data['project'].get('scripts', {}).keys())
38
+ cli_bin = scripts[0] if scripts else dash
39
+
40
+ with open(os.environ['GITHUB_ENV'], 'a', encoding='utf-8') as env:
41
+ env.write(f"PROJECT_NAME={project}\n")
42
+ env.write(f"PACKAGE_MODULE={module}\n")
43
+ env.write(f"CLI_BIN={cli_bin}\n")
44
+ - name: Install make on Windows
45
+ if: runner.os == 'Windows'
46
+ shell: pwsh
47
+ run: |
48
+ choco install -y make
49
+ echo "C:\\ProgramData\\chocolatey\\bin" >> $env:GITHUB_PATH
50
+ - name: Install journald prerequisites
51
+ if: runner.os == 'Linux'
52
+ shell: bash
53
+ run: |
54
+ sudo apt-get update
55
+ sudo apt-get install -y python3-systemd
56
+
57
+ - name: Upgrade pip
58
+ shell: bash
59
+ run: python -m pip install --upgrade pip
60
+
61
+ - name: Install dev deps
62
+ shell: bash
63
+ run: |
64
+ pip install -e .[dev]
65
+
66
+ - name: Install Windows Event Log prerequisites
67
+ if: runner.os == 'Windows'
68
+ shell: bash
69
+ run: |
70
+ pip install pywin32
71
+ - name: Run full test suite (lint, types, tests, coverage, codecov)
72
+ shell: bash
73
+ env:
74
+ TEST_VERBOSE: "1"
75
+ run: make test
76
+ - name: Build wheel/sdist
77
+ shell: bash
78
+ run: python -m build
79
+ - name: Verify wheel install in clean env
80
+ shell: bash
81
+ run: |
82
+ python -m venv .venv_wheel
83
+ . .venv_wheel/bin/activate 2>/dev/null || . .venv_wheel/Scripts/activate 2>/dev/null
84
+ pip install dist/*.whl
85
+ "$CLI_BIN" --version 2>/dev/null || python -m "$PACKAGE_MODULE" --version
86
+
87
+ pipx-uv:
88
+ name: pipx/uv verification (ubuntu)
89
+ runs-on: ubuntu-latest
90
+ steps:
91
+ - uses: actions/checkout@v5
92
+ - uses: actions/setup-python@v6
93
+ with:
94
+ python-version: "3.13"
95
+ cache: pip
96
+ cache-dependency-path: pyproject.toml
97
+ - name: Extract project metadata
98
+ shell: python
99
+ run: |
100
+ import os
101
+ import tomllib
102
+ from pathlib import Path
103
+
104
+ data = tomllib.loads(Path('pyproject.toml').read_text('utf-8'))
105
+ project = data['project']['name']
106
+ module = project.replace('-', '_')
107
+ dash = project.replace('_', '-')
108
+ scripts = list(data['project'].get('scripts', {}).keys())
109
+ cli_bin = scripts[0] if scripts else dash
110
+
111
+ with open(os.environ['GITHUB_ENV'], 'a', encoding='utf-8') as env:
112
+ env.write(f"PROJECT_NAME={project}\n")
113
+ env.write(f"PACKAGE_MODULE={module}\n")
114
+ env.write(f"CLI_BIN={cli_bin}\n")
115
+ - name: Build wheel
116
+ run: |
117
+ python -m pip install --upgrade pip build
118
+ python -m build
119
+ - name: pipx install from wheel
120
+ run: |
121
+ python -m pip install pipx
122
+ pipx install dist/*.whl
123
+ "$CLI_BIN" --version 2>/dev/null || python -m "$PACKAGE_MODULE" --version
124
+ - name: Install uv
125
+ uses: astral-sh/setup-uv@v7
126
+ with:
127
+ enable-cache: true
128
+ - name: uv tool install
129
+ run: |
130
+ uv tool install .
131
+ "$CLI_BIN" --version 2>/dev/null || python -m "$PACKAGE_MODULE" --version
132
+
133
+ notebooks:
134
+ name: Execute notebooks (ubuntu, Python 3.13)
135
+ runs-on: ubuntu-latest
136
+ steps:
137
+ - uses: actions/checkout@v5
138
+ - uses: actions/setup-python@v6
139
+ with:
140
+ python-version: "3.13"
141
+ cache: pip
142
+ cache-dependency-path: pyproject.toml
143
+ - name: Install notebook runner deps
144
+ run: |
145
+ python -m pip install --upgrade pip
146
+ pip install nbclient nbformat ipykernel jupyter_client
147
+ python -m ipykernel install --user --name python3 --display-name "Python 3"
148
+ - name: Execute Quickstart notebook
149
+ env:
150
+ PIP_DISABLE_PIP_VERSION_CHECK: "1"
151
+ PIP_NO_INPUT: "1"
152
+ run: |
153
+ python - << 'PY'
154
+ from pathlib import Path
155
+
156
+ import nbformat
157
+ from nbclient import NotebookClient
158
+
159
+ nb_path = Path('notebooks/Quickstart.ipynb')
160
+ if not nb_path.exists():
161
+ raise SystemExit(f"Notebook not found: {nb_path}")
162
+
163
+ notebook = nbformat.read(nb_path, as_version=4)
164
+ client = NotebookClient(
165
+ notebook,
166
+ timeout=900,
167
+ kernel_name='python3',
168
+ allow_errors=False,
169
+ )
170
+ client.execute()
171
+
172
+ out_path = Path('notebooks/Quickstart-executed.ipynb')
173
+ nbformat.write(notebook, out_path)
174
+ print(f"Executed notebook written to: {out_path}")
175
+ PY
@@ -0,0 +1,39 @@
1
+ name: CodeQL
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, master ]
6
+ pull_request:
7
+ branches: [ main, master ]
8
+ schedule:
9
+ - cron: '0 8 * * 1'
10
+
11
+ jobs:
12
+ analyze:
13
+ name: CodeQL Analyze
14
+ runs-on: ubuntu-latest
15
+ permissions:
16
+ actions: read
17
+ contents: read
18
+ security-events: write
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ language: [ 'python' ]
23
+
24
+ steps:
25
+ - name: Checkout repository
26
+ uses: actions/checkout@v5
27
+
28
+ - name: Initialize CodeQL
29
+ uses: github/codeql-action/init@v4.30.8
30
+ with:
31
+ languages: ${{ matrix.language }}
32
+
33
+ - name: Autobuild
34
+ uses: github/codeql-action/autobuild@v4.30.8
35
+
36
+ - name: Perform CodeQL Analysis
37
+ uses: github/codeql-action/analyze@v4.30.8
38
+ with:
39
+ category: "/language:${{ matrix.language }}"
@@ -0,0 +1,45 @@
1
+ name: Release
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ push:
7
+ tags:
8
+ - 'v*'
9
+ workflow_dispatch: {}
10
+
11
+ jobs:
12
+ build-and-publish:
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ contents: read
16
+ steps:
17
+ - uses: actions/checkout@v5
18
+ - name: Verify PyPI token is set
19
+ run: |
20
+ if [ -z "${{ secrets.PYPI_API_TOKEN }}" ]; then
21
+ echo "::error title=Missing PyPI token::Set the PYPI_API_TOKEN secret in GitHub repository settings to enable PyPI publishing on releases."
22
+ echo "See: https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions"
23
+ exit 1
24
+ fi
25
+ - uses: actions/setup-python@v6
26
+ with:
27
+ python-version: '3.13'
28
+ cache: pip
29
+ cache-dependency-path: pyproject.toml
30
+ - name: Build artifacts
31
+ run: |
32
+ python -m pip install --upgrade pip build
33
+ python -m build
34
+ - name: Publish to PyPI
35
+ # Use the rolling major tag to get latest Twine/standards support (e.g., Core Metadata 2.4)
36
+ uses: pypa/gh-action-pypi-publish@release/v1
37
+ with:
38
+ password: ${{ secrets.PYPI_API_TOKEN }}
39
+ attestations: false
40
+ skip-existing: true
41
+ - name: Upload artifacts
42
+ uses: actions/upload-artifact@v4
43
+ with:
44
+ name: dist
45
+ path: dist/*
@@ -0,0 +1,180 @@
1
+ # ====================================
2
+ # ROTEK SPEZIFISCH: Git commands you might run once
3
+ # git add .gitignore && git commit -m "Ignore IDE settings"
4
+ # git push
5
+ # git rm -r --cached .idea
6
+ # git commit -m "Remove .idea and add to .gitignore"
7
+ # git push
8
+ # alternative : BE CAREFUL: overwrites remote history
9
+ # git push origin master --force
10
+
11
+ # ====================================
12
+ # APP
13
+ # ====================================
14
+ website/build/
15
+ website/.docusaurus/
16
+ website/node_modules/
17
+ node_modules/
18
+ web-local-preview/
19
+ translation_app*.log
20
+ translation_web*.log
21
+ tmp_github_web_pages/
22
+ tmp_linkcheck_web_pages/
23
+ .eslintcache
24
+ .vitest/
25
+ npm-debug.log*
26
+ yarn-error.log*
27
+ pnpm-debug.log*
28
+ .env.*
29
+ !.env.example
30
+ todo.md
31
+ tmp_*
32
+
33
+ # ====================================
34
+ # IDEs & Editors
35
+ # ====================================
36
+ # IntelliJ, PyCharm, etc.
37
+ .idea/
38
+ # VS Code workspace settings
39
+ .vscode/
40
+ *.code-workspace
41
+
42
+ # ====================================
43
+ # Python bytecode & caches
44
+ # ====================================
45
+ # __pycache__: compiled .pyc files at any depth
46
+ # *.py[cod]: catches .pyc, .pyo, .pyd
47
+ __pycache__/
48
+ *.py[cod]
49
+ *$py.class # other compiled artifacts
50
+
51
+ # pytest, coverage, MyPy, Hypothesis
52
+ .pytest_cache/
53
+ .mypy_cache/
54
+ .pyright/
55
+ .coverage*
56
+ htmlcov/
57
+ nosetests.xml
58
+ coverage.xml
59
+ *.cover
60
+ .hypothesis/
61
+ .tox/
62
+ .nox/
63
+
64
+ # general cache directories (any project-level caching)
65
+ .cache/
66
+ .run/
67
+ .import_linter_cache/
68
+
69
+ # ====================================
70
+ # Build & distribution artifacts
71
+ # ====================================
72
+ # source/package builds
73
+ build/
74
+ dist/
75
+ *.egg-info/ # metadata for pip installs
76
+ *.egg
77
+ *.whl
78
+ pip-wheel-metadata/
79
+ *.manifest # PyInstaller metadata
80
+ *.spec # PyInstaller spec files
81
+
82
+ # Eggs, parts, wheels, sdist, etc.
83
+ develop-eggs/
84
+ .eggs/
85
+ parts/
86
+ sdist/
87
+ wheels/
88
+ downloads/
89
+ var/
90
+
91
+ # pip logs & installer leftovers
92
+ pip-log.txt
93
+ pip-delete-this-directory.txt
94
+ .installed.cfg
95
+
96
+ # ====================================
97
+ # Virtual environments & secrets
98
+ # ====================================
99
+ # common venv folder names
100
+ env/
101
+ venv/
102
+ ENV/
103
+ .venv/
104
+ # backups, alternate names
105
+ env.bak/
106
+ venv.bak/
107
+ # dotenv files with credentials
108
+ .env
109
+
110
+ # ====================================
111
+ # Project-specific & framework files
112
+ # ====================================
113
+ # Django logs & local overrides
114
+ *.log
115
+ local_settings.py
116
+
117
+ # Flask instance folder
118
+ instance/
119
+ .webassets-cache
120
+
121
+ # Scrapy cache
122
+ .scrapy
123
+
124
+ # Sphinx docs
125
+ docs/_build/
126
+
127
+ # PyBuilder output
128
+ target/
129
+
130
+ # Jupyter notebooks checkpoints
131
+ .ipynb_checkpoints
132
+
133
+ # pyenv Python version file
134
+ .python-version
135
+
136
+ # Celery beat schedule
137
+ celerybeat-schedule
138
+
139
+ # SageMath parsed files
140
+ *.sage.py
141
+
142
+ # Spyder IDE
143
+ .spyderproject
144
+ .spyproject
145
+
146
+ # Rope IDE
147
+ .ropeproject
148
+
149
+ # MkDocs static site folder
150
+ /site
151
+
152
+ # ====================================
153
+ # OS-specific files
154
+ # ====================================
155
+ # macOS
156
+ .DS_Store
157
+ # Windows
158
+ Thumbs.db
159
+ ehthumbs.db
160
+
161
+ # Archives
162
+ *.zip
163
+
164
+ # Thunderbird build artifact (created temporarily by pack script)
165
+ sources/manifest.json
166
+
167
+ # ====================================
168
+ # Tool-specific extras
169
+ # ====================================
170
+ # Codecov uploader script (downloaded during local uploads)
171
+ codecov.sh
172
+ codecov.xml
173
+
174
+ # Nix build result symlink
175
+ result
176
+
177
+ # Optional lockfiles (for alternative managers)
178
+ poetry.lock
179
+ pdm.lock
180
+ uv.lock
@@ -0,0 +1,2 @@
1
+ exclude_patterns = ["scripts/**"]
2
+ test_patterns = ["tests/**"]
@@ -0,0 +1,5 @@
1
+ # Snyk (https://snyk.io) policy file
2
+ exclude:
3
+ global:
4
+ - scripts/**
5
+ - tests/**