countdown-cli 1.1.1__tar.gz → 2.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 (66) hide show
  1. countdown_cli-2.0.0/.claude/settings.local.json +24 -0
  2. countdown_cli-2.0.0/.envrc +1 -0
  3. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.github/workflows/tests.yml +6 -3
  4. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/PKG-INFO +11 -9
  5. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/README.rst +10 -8
  6. countdown_cli-2.0.0/htmlcov/.gitignore +2 -0
  7. countdown_cli-2.0.0/htmlcov/class_index.html +263 -0
  8. countdown_cli-2.0.0/htmlcov/coverage_html_cb_6fb7b396.js +733 -0
  9. countdown_cli-2.0.0/htmlcov/coverage_html_cb_da166b87.js +717 -0
  10. countdown_cli-2.0.0/htmlcov/favicon_32_cb_58284776.png +0 -0
  11. countdown_cli-2.0.0/htmlcov/function_index.html +1323 -0
  12. countdown_cli-2.0.0/htmlcov/index.html +236 -0
  13. countdown_cli-2.0.0/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  14. countdown_cli-2.0.0/htmlcov/status.json +1 -0
  15. countdown_cli-2.0.0/htmlcov/style_cb_6b508a39.css +377 -0
  16. countdown_cli-2.0.0/htmlcov/style_cb_8e611ae1.css +337 -0
  17. countdown_cli-2.0.0/htmlcov/z_55719c21e2af63da___init___py.html +104 -0
  18. countdown_cli-2.0.0/htmlcov/z_55719c21e2af63da___main___py.html +216 -0
  19. countdown_cli-2.0.0/htmlcov/z_55719c21e2af63da_digits_py.html +157 -0
  20. countdown_cli-2.0.0/htmlcov/z_55719c21e2af63da_display_py.html +197 -0
  21. countdown_cli-2.0.0/htmlcov/z_55719c21e2af63da_keys_py.html +119 -0
  22. countdown_cli-2.0.0/htmlcov/z_55719c21e2af63da_terminal_py.html +159 -0
  23. countdown_cli-2.0.0/htmlcov/z_55719c21e2af63da_timer_py.html +148 -0
  24. countdown_cli-2.0.0/htmlcov/z_a44f0ac069e85531___init___py.html +100 -0
  25. countdown_cli-2.0.0/htmlcov/z_a44f0ac069e85531_conftest_py.html +128 -0
  26. countdown_cli-2.0.0/htmlcov/z_a44f0ac069e85531_test_display_py.html +320 -0
  27. countdown_cli-2.0.0/htmlcov/z_a44f0ac069e85531_test_keys_py.html +133 -0
  28. countdown_cli-2.0.0/htmlcov/z_a44f0ac069e85531_test_main_py.html +650 -0
  29. countdown_cli-2.0.0/htmlcov/z_a44f0ac069e85531_test_terminal_py.html +117 -0
  30. countdown_cli-2.0.0/htmlcov/z_a44f0ac069e85531_test_timer_py.html +241 -0
  31. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/pyproject.toml +1 -1
  32. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/src/countdown/__init__.py +1 -2
  33. countdown_cli-2.0.0/src/countdown/__main__.py +117 -0
  34. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/src/countdown/digits.py +1 -1
  35. countdown_cli-2.0.0/src/countdown/display.py +98 -0
  36. countdown_cli-2.0.0/src/countdown/keys.py +20 -0
  37. countdown_cli-2.0.0/src/countdown/terminal.py +60 -0
  38. countdown_cli-2.0.0/src/countdown/timer.py +49 -0
  39. countdown_cli-2.0.0/tests/test_display.py +221 -0
  40. countdown_cli-2.0.0/tests/test_keys.py +34 -0
  41. countdown_cli-2.0.0/tests/test_main.py +551 -0
  42. countdown_cli-2.0.0/tests/test_terminal.py +18 -0
  43. countdown_cli-2.0.0/tests/test_timer.py +142 -0
  44. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/uv.lock +1 -1
  45. countdown_cli-1.1.1/src/countdown/__main__.py +0 -137
  46. countdown_cli-1.1.1/tests/test_main.py +0 -546
  47. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.gitattributes +0 -0
  48. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.github/labels.yml +0 -0
  49. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.github/release-drafter.yml +0 -0
  50. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.github/workflows/labeler.yml +0 -0
  51. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.github/workflows/release.yml +0 -0
  52. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.gitignore +0 -0
  53. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.pre-commit-config.yaml +0 -0
  54. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/.python-version-default +0 -0
  55. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/CODE_OF_CONDUCT.rst +0 -0
  56. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/CONTRIBUTING.rst +0 -0
  57. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/LICENSE.rst +0 -0
  58. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/codecov.yml +0 -0
  59. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/images/1457.png +0 -0
  60. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/images/3253.png +0 -0
  61. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/images/python-morsels-logo.png +0 -0
  62. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/justfile +0 -0
  63. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/noxfile.py +0 -0
  64. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/src/countdown/numbers.txt +0 -0
  65. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/tests/__init__.py +0 -0
  66. {countdown_cli-1.1.1 → countdown_cli-2.0.0}/tests/conftest.py +0 -0
@@ -0,0 +1,24 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(uv sync:*)",
5
+ "Bash(just --list:*)",
6
+ "Bash(just test:*)",
7
+ "Bash(uv run pytest:*)",
8
+ "Bash(just check:*)",
9
+ "Bash(uv run python:*)",
10
+ "Bash(just lint:*)",
11
+ "Bash(uv run:*)",
12
+ "Bash(uvx nox:*)",
13
+ "Bash(just test-all)",
14
+ "WebSearch",
15
+ "WebFetch(domain:nox.thea.codes)",
16
+ "Bash(uv build:*)",
17
+ "Bash(unzip:*)",
18
+ "Bash(python3:*)",
19
+ "Bash(timeout 2 uv run pytest:*)"
20
+ ],
21
+ "deny": [],
22
+ "ask": []
23
+ }
24
+ }
@@ -0,0 +1 @@
1
+ export UV_PUBLISH_TOKEN=pypi-AgEIcHlwaS5vcmcCJGFkMGQ5YTQ5LTY5YjMtNDdhYS04YjYyLTFjZTA3ZjViM2U5NwACKlszLCIxMjdiZGQyMS02Y2M2LTRjMTYtYjE1Ny01YmIxNTRmNGVmM2EiXQAABiDG0OMv5kvOwbPGnLprNzdoBBteMpqfHp2KTz66LE5izA
@@ -21,13 +21,14 @@ jobs:
21
21
  python-versions: ${{ steps.baipp.outputs.supported_python_classifiers_json_array }}
22
22
 
23
23
  tests:
24
- name: Tests on ${{ matrix.python-version }}
24
+ name: Tests on ${{ matrix.os }} - ${{ matrix.python-version }}
25
25
  needs: build-package
26
- runs-on: ubuntu-latest
26
+ runs-on: ${{ matrix.os }}
27
27
  strategy:
28
28
  fail-fast: false
29
29
  matrix:
30
30
  python-version: ${{ fromJson(needs.build-package.outputs.python-versions) }}
31
+ os: [ubuntu-latest, windows-latest]
31
32
 
32
33
  steps:
33
34
  - uses: actions/checkout@v4
@@ -36,7 +37,9 @@ jobs:
36
37
  with:
37
38
  name: Packages
38
39
  path: dist
39
- - run: tar xf dist/*.tar.gz --strip-components=1
40
+ - name: Extract source tarball
41
+ shell: bash
42
+ run: tar xf dist/*.tar.gz --strip-components=1
40
43
  - uses: actions/setup-python@v5
41
44
  with:
42
45
  python-version: ${{ matrix.python-version }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: countdown-cli
3
- Version: 1.1.1
3
+ Version: 2.0.0
4
4
  Summary: Terminal program to display countdown timer
5
5
  Project-URL: homepage, https://github.com/treyhunner/countdown-cli
6
6
  Project-URL: repository, https://github.com/treyhunner/countdown-cli
@@ -71,8 +71,11 @@ Instead, try implementing this package with the `Python Morsels "countdown" exer
71
71
  Features
72
72
  --------
73
73
 
74
- * Full-screen countdown timer, centered in the terminal window
75
- * Command-line interface for Linux/Mac/Windows
74
+ - Full-screen countdown timer, centered in the terminal window
75
+ - Responsive timer size based on terminal window width/height
76
+ - Command-line interface for Linux/Mac/Windows
77
+ - Pause/resume with ``p``, ``k``, ``Space``, or ``Enter``
78
+ - Add / remove time with ``+`` or ``-``
76
79
 
77
80
  |32:53|
78
81
 
@@ -90,17 +93,17 @@ Features
90
93
  Requirements
91
94
  ------------
92
95
 
93
- * Python 3.10+
96
+ - Python 3.10+
94
97
 
95
98
 
96
99
  Installation
97
100
  ------------
98
101
 
99
- You can install *countdown-cli* via pip_ from PyPI_:
102
+ You can install **countdown-cli** via uv_ from PyPI_:
100
103
 
101
104
  .. code:: console
102
105
 
103
- $ python3 -m pip install countdown-cli
106
+ $ uv tool install countdown-cli
104
107
 
105
108
 
106
109
  Contributing
@@ -114,7 +117,7 @@ License
114
117
  -------
115
118
 
116
119
  Distributed under the terms of the `MIT license`_,
117
- *countdown-cli* is free and open source software.
120
+ **countdown-cli** is free and open source software.
118
121
 
119
122
 
120
123
  Issues
@@ -125,10 +128,9 @@ please `file an issue`_ along with a detailed description.
125
128
 
126
129
 
127
130
  .. _Python Morsels: https://www.pythonmorsels.com
128
- .. _Cookiecutter: https://github.com/audreyr/cookiecutter
129
131
  .. _MIT license: https://opensource.org/licenses/MIT
130
132
  .. _PyPI: https://pypi.org/project/countdown-cli/
131
133
  .. _file an issue: https://github.com/treyhunner/countdown-cli/issues
132
- .. _pip: https://pip.pypa.io/
134
+ .. _uv: https://docs.astral.sh/uv/concepts/tools/
133
135
  .. github-only
134
136
  .. _Contributor Guide: CONTRIBUTING.rst
@@ -50,8 +50,11 @@ Instead, try implementing this package with the `Python Morsels "countdown" exer
50
50
  Features
51
51
  --------
52
52
 
53
- * Full-screen countdown timer, centered in the terminal window
54
- * Command-line interface for Linux/Mac/Windows
53
+ - Full-screen countdown timer, centered in the terminal window
54
+ - Responsive timer size based on terminal window width/height
55
+ - Command-line interface for Linux/Mac/Windows
56
+ - Pause/resume with ``p``, ``k``, ``Space``, or ``Enter``
57
+ - Add / remove time with ``+`` or ``-``
55
58
 
56
59
  |32:53|
57
60
 
@@ -69,17 +72,17 @@ Features
69
72
  Requirements
70
73
  ------------
71
74
 
72
- * Python 3.10+
75
+ - Python 3.10+
73
76
 
74
77
 
75
78
  Installation
76
79
  ------------
77
80
 
78
- You can install *countdown-cli* via pip_ from PyPI_:
81
+ You can install **countdown-cli** via uv_ from PyPI_:
79
82
 
80
83
  .. code:: console
81
84
 
82
- $ python3 -m pip install countdown-cli
85
+ $ uv tool install countdown-cli
83
86
 
84
87
 
85
88
  Contributing
@@ -93,7 +96,7 @@ License
93
96
  -------
94
97
 
95
98
  Distributed under the terms of the `MIT license`_,
96
- *countdown-cli* is free and open source software.
99
+ **countdown-cli** is free and open source software.
97
100
 
98
101
 
99
102
  Issues
@@ -104,10 +107,9 @@ please `file an issue`_ along with a detailed description.
104
107
 
105
108
 
106
109
  .. _Python Morsels: https://www.pythonmorsels.com
107
- .. _Cookiecutter: https://github.com/audreyr/cookiecutter
108
110
  .. _MIT license: https://opensource.org/licenses/MIT
109
111
  .. _PyPI: https://pypi.org/project/countdown-cli/
110
112
  .. _file an issue: https://github.com/treyhunner/countdown-cli/issues
111
- .. _pip: https://pip.pypa.io/
113
+ .. _uv: https://docs.astral.sh/uv/concepts/tools/
112
114
  .. github-only
113
115
  .. _Contributor Guide: CONTRIBUTING.rst
@@ -0,0 +1,2 @@
1
+ # Created by coverage.py
2
+ *
@@ -0,0 +1,263 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage report</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_58284776.png">
7
+ <link rel="stylesheet" href="style_cb_6b508a39.css" type="text/css">
8
+ <script src="coverage_html_cb_6fb7b396.js" defer></script>
9
+ </head>
10
+ <body class="indexfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>Coverage report:
14
+ <span class="pc_cov">100%</span>
15
+ </h1>
16
+ <aside id="help_panel_wrapper">
17
+ <input id="help_panel_state" type="checkbox">
18
+ <label for="help_panel_state">
19
+ <img id="keyboard_icon" src="keybd_closed_cb_ce680311.png" alt="Show/hide keyboard shortcuts">
20
+ </label>
21
+ <div id="help_panel">
22
+ <p class="legend">Shortcuts on this page</p>
23
+ <div class="keyhelp">
24
+ <p>
25
+ <kbd>f</kbd>
26
+ <kbd>n</kbd>
27
+ <kbd>s</kbd>
28
+ <kbd>m</kbd>
29
+ <kbd>x</kbd>
30
+ <kbd>b</kbd>
31
+ <kbd>p</kbd>
32
+ <kbd>c</kbd>
33
+ &nbsp; change column sorting
34
+ </p>
35
+ <p>
36
+ <kbd>[</kbd>
37
+ <kbd>]</kbd>
38
+ &nbsp; prev/next file
39
+ </p>
40
+ <p>
41
+ <kbd>?</kbd> &nbsp; show/hide this help
42
+ </p>
43
+ </div>
44
+ </div>
45
+ </aside>
46
+ <form id="filter_container">
47
+ <input id="filter" type="text" value="" placeholder="filter...">
48
+ <div>
49
+ <input id="hide100" type="checkbox" >
50
+ <label for="hide100">hide covered</label>
51
+ </div>
52
+ </form>
53
+ <h2>
54
+ <a class="button" href="index.html">Files</a>
55
+ <a class="button" href="function_index.html">Functions</a>
56
+ <a class="button current">Classes</a>
57
+ </h2>
58
+ <p class="text">
59
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.11.0">coverage.py v7.11.0</a>,
60
+ created at 2025-11-07 20:46 -0800
61
+ </p>
62
+ </div>
63
+ </header>
64
+ <main id="index">
65
+ <table class="index" data-sortable>
66
+ <thead>
67
+ <tr class="tablehead" title="Click to sort">
68
+ <th id="file" class="name left" aria-sort="none" data-shortcut="f">File<span class="arrows"></span></th>
69
+ <th id="region" class="name left" aria-sort="none" data-default-sort-order="ascending" data-shortcut="n">class<span class="arrows"></span></th>
70
+ <th id="statements" aria-sort="none" data-default-sort-order="descending" data-shortcut="s">statements<span class="arrows"></span></th>
71
+ <th id="missing" aria-sort="none" data-default-sort-order="descending" data-shortcut="m">missing<span class="arrows"></span></th>
72
+ <th id="excluded" aria-sort="none" data-default-sort-order="descending" data-shortcut="x">excluded<span class="arrows"></span></th>
73
+ <th id="branches" aria-sort="none" data-default-sort-order="descending" data-shortcut="b">branches<span class="arrows"></span></th>
74
+ <th id="partial" aria-sort="none" data-default-sort-order="descending" data-shortcut="p">partial<span class="arrows"></span></th>
75
+ <th id="coverage" class="right" aria-sort="none" data-shortcut="c">coverage<span class="arrows"></span></th>
76
+ </tr>
77
+ </thead>
78
+ <tbody>
79
+ <tr class="region">
80
+ <td class="name left"><a href="z_55719c21e2af63da___init___py.html">src/countdown/__init__.py</a></td>
81
+ <td class="name left"><a href="z_55719c21e2af63da___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
82
+ <td>0</td>
83
+ <td>0</td>
84
+ <td>0</td>
85
+ <td>0</td>
86
+ <td>0</td>
87
+ <td class="right" data-ratio="0 0">100%</td>
88
+ </tr>
89
+ <tr class="region">
90
+ <td class="name left"><a href="z_55719c21e2af63da___main___py.html">src/countdown/__main__.py</a></td>
91
+ <td class="name left"><a href="z_55719c21e2af63da___main___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
92
+ <td>54</td>
93
+ <td>0</td>
94
+ <td>1</td>
95
+ <td>18</td>
96
+ <td>0</td>
97
+ <td class="right" data-ratio="72 72">100%</td>
98
+ </tr>
99
+ <tr class="region">
100
+ <td class="name left"><a href="z_55719c21e2af63da_digits_py.html">src/countdown/digits.py</a></td>
101
+ <td class="name left"><a href="z_55719c21e2af63da_digits_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
102
+ <td>36</td>
103
+ <td>0</td>
104
+ <td>0</td>
105
+ <td>12</td>
106
+ <td>0</td>
107
+ <td class="right" data-ratio="48 48">100%</td>
108
+ </tr>
109
+ <tr class="region">
110
+ <td class="name left"><a href="z_55719c21e2af63da_display_py.html">src/countdown/display.py</a></td>
111
+ <td class="name left"><a href="z_55719c21e2af63da_display_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
112
+ <td>43</td>
113
+ <td>0</td>
114
+ <td>16</td>
115
+ <td>10</td>
116
+ <td>0</td>
117
+ <td class="right" data-ratio="53 53">100%</td>
118
+ </tr>
119
+ <tr class="region">
120
+ <td class="name left"><a href="z_55719c21e2af63da_keys_py.html">src/countdown/keys.py</a></td>
121
+ <td class="name left"><a href="z_55719c21e2af63da_keys_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
122
+ <td>10</td>
123
+ <td>0</td>
124
+ <td>0</td>
125
+ <td>4</td>
126
+ <td>0</td>
127
+ <td class="right" data-ratio="14 14">100%</td>
128
+ </tr>
129
+ <tr class="region">
130
+ <td class="name left"><a href="z_55719c21e2af63da_terminal_py.html">src/countdown/terminal.py</a></td>
131
+ <td class="name left"><a href="z_55719c21e2af63da_terminal_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
132
+ <td>1</td>
133
+ <td>0</td>
134
+ <td>46</td>
135
+ <td>0</td>
136
+ <td>0</td>
137
+ <td class="right" data-ratio="1 1">100%</td>
138
+ </tr>
139
+ <tr class="region">
140
+ <td class="name left"><a href="z_55719c21e2af63da_timer_py.html">src/countdown/timer.py</a></td>
141
+ <td class="name left"><a href="z_55719c21e2af63da_timer_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
142
+ <td>18</td>
143
+ <td>0</td>
144
+ <td>0</td>
145
+ <td>6</td>
146
+ <td>0</td>
147
+ <td class="right" data-ratio="24 24">100%</td>
148
+ </tr>
149
+ <tr class="region">
150
+ <td class="name left"><a href="z_a44f0ac069e85531___init___py.html">tests/__init__.py</a></td>
151
+ <td class="name left"><a href="z_a44f0ac069e85531___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
152
+ <td>0</td>
153
+ <td>0</td>
154
+ <td>0</td>
155
+ <td>0</td>
156
+ <td>0</td>
157
+ <td class="right" data-ratio="0 0">100%</td>
158
+ </tr>
159
+ <tr class="region">
160
+ <td class="name left"><a href="z_a44f0ac069e85531_conftest_py.html">tests/conftest.py</a></td>
161
+ <td class="name left"><a href="z_a44f0ac069e85531_conftest_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
162
+ <td>3</td>
163
+ <td>0</td>
164
+ <td>21</td>
165
+ <td>0</td>
166
+ <td>0</td>
167
+ <td class="right" data-ratio="3 3">100%</td>
168
+ </tr>
169
+ <tr class="region">
170
+ <td class="name left"><a href="z_a44f0ac069e85531_test_display_py.html">tests/test_display.py</a></td>
171
+ <td class="name left"><a href="z_a44f0ac069e85531_test_display_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
172
+ <td>118</td>
173
+ <td>0</td>
174
+ <td>0</td>
175
+ <td>6</td>
176
+ <td>0</td>
177
+ <td class="right" data-ratio="124 124">100%</td>
178
+ </tr>
179
+ <tr class="region">
180
+ <td class="name left"><a href="z_a44f0ac069e85531_test_keys_py.html">tests/test_keys.py</a></td>
181
+ <td class="name left"><a href="z_a44f0ac069e85531_test_keys_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
182
+ <td>21</td>
183
+ <td>0</td>
184
+ <td>0</td>
185
+ <td>0</td>
186
+ <td>0</td>
187
+ <td class="right" data-ratio="21 21">100%</td>
188
+ </tr>
189
+ <tr class="region">
190
+ <td class="name left"><a href="z_a44f0ac069e85531_test_main_py.html#t12">tests/test_main.py</a></td>
191
+ <td class="name left"><a href="z_a44f0ac069e85531_test_main_py.html#t12"><data value='FakeSleep'>FakeSleep</data></a></td>
192
+ <td>6</td>
193
+ <td>0</td>
194
+ <td>0</td>
195
+ <td>4</td>
196
+ <td>0</td>
197
+ <td class="right" data-ratio="10 10">100%</td>
198
+ </tr>
199
+ <tr class="region">
200
+ <td class="name left"><a href="z_a44f0ac069e85531_test_main_py.html">tests/test_main.py</a></td>
201
+ <td class="name left"><a href="z_a44f0ac069e85531_test_main_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
202
+ <td>257</td>
203
+ <td>0</td>
204
+ <td>0</td>
205
+ <td>8</td>
206
+ <td>0</td>
207
+ <td class="right" data-ratio="265 265">100%</td>
208
+ </tr>
209
+ <tr class="region">
210
+ <td class="name left"><a href="z_a44f0ac069e85531_test_terminal_py.html">tests/test_terminal.py</a></td>
211
+ <td class="name left"><a href="z_a44f0ac069e85531_test_terminal_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
212
+ <td>9</td>
213
+ <td>0</td>
214
+ <td>0</td>
215
+ <td>0</td>
216
+ <td>0</td>
217
+ <td class="right" data-ratio="9 9">100%</td>
218
+ </tr>
219
+ <tr class="region">
220
+ <td class="name left"><a href="z_a44f0ac069e85531_test_timer_py.html">tests/test_timer.py</a></td>
221
+ <td class="name left"><a href="z_a44f0ac069e85531_test_timer_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
222
+ <td>44</td>
223
+ <td>0</td>
224
+ <td>0</td>
225
+ <td>0</td>
226
+ <td>0</td>
227
+ <td class="right" data-ratio="44 44">100%</td>
228
+ </tr>
229
+ </tbody>
230
+ <tfoot>
231
+ <tr class="total">
232
+ <td class="name left">Total</td>
233
+ <td class="name left">&nbsp;</td>
234
+ <td>620</td>
235
+ <td>0</td>
236
+ <td>84</td>
237
+ <td>68</td>
238
+ <td>0</td>
239
+ <td class="right" data-ratio="688 688">100%</td>
240
+ </tr>
241
+ </tfoot>
242
+ </table>
243
+ <p id="no_rows">
244
+ No items found using the specified filter.
245
+ </p>
246
+ </main>
247
+ <footer>
248
+ <div class="content">
249
+ <p>
250
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.11.0">coverage.py v7.11.0</a>,
251
+ created at 2025-11-07 20:46 -0800
252
+ </p>
253
+ </div>
254
+ <aside class="hidden">
255
+ <a id="prevFileLink" class="nav" href=""></a>
256
+ <a id="nextFileLink" class="nav" href=""></a>
257
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
258
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
259
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
260
+ </aside>
261
+ </footer>
262
+ </body>
263
+ </html>