devboard 0.1.0__tar.gz → 0.2.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 (80) hide show
  1. devboard-0.2.0/AI_POLICY.md +15 -0
  2. {devboard-0.1.0 → devboard-0.2.0}/CHANGELOG.md +15 -0
  3. {devboard-0.1.0 → devboard-0.2.0}/CONTRIBUTING.md +6 -16
  4. {devboard-0.1.0 → devboard-0.2.0}/LICENSE +1 -1
  5. {devboard-0.1.0 → devboard-0.2.0}/PKG-INFO +2 -3
  6. {devboard-0.1.0 → devboard-0.2.0}/README.md +1 -2
  7. {devboard-0.1.0 → devboard-0.2.0}/config/git-changelog.toml +1 -1
  8. {devboard-0.1.0 → devboard-0.2.0}/config/ruff.toml +8 -23
  9. devboard-0.2.0/config/ty.toml +6 -0
  10. {devboard-0.1.0 → devboard-0.2.0}/config/vscode/launch.json +1 -2
  11. {devboard-0.1.0 → devboard-0.2.0}/config/vscode/settings.json +1 -3
  12. devboard-0.2.0/config/zed/debug.json +44 -0
  13. devboard-0.2.0/config/zed/settings.json +43 -0
  14. devboard-0.2.0/config/zed/tasks.json +72 -0
  15. {devboard-0.1.0 → devboard-0.2.0}/docs/.overrides/main.html +5 -1
  16. {devboard-0.1.0 → devboard-0.2.0}/docs/.overrides/partials/comments.html +1 -1
  17. devboard-0.2.0/docs/css/apidocs.css +21 -0
  18. {devboard-0.1.0 → devboard-0.2.0}/docs/tutorial.md +21 -8
  19. {devboard-0.1.0 → devboard-0.2.0}/duties.py +72 -44
  20. {devboard-0.1.0 → devboard-0.2.0}/pyproject.toml +9 -14
  21. {devboard-0.1.0 → devboard-0.2.0}/scripts/gen_credits.py +32 -15
  22. {devboard-0.1.0 → devboard-0.2.0}/scripts/get_version.py +18 -0
  23. {devboard-0.1.0 → devboard-0.2.0}/scripts/make.py +34 -8
  24. devboard-0.2.0/src/devboard/__init__.py +49 -0
  25. devboard-0.2.0/src/devboard/__main__.py +32 -0
  26. devboard-0.2.0/src/devboard/_internal/__init__.py +17 -0
  27. devboard-0.2.0/src/devboard/_internal/app.py +320 -0
  28. {devboard-0.1.0 → devboard-0.2.0}/src/devboard/_internal/board.py +63 -46
  29. devboard-0.2.0/src/devboard/_internal/cache.py +87 -0
  30. {devboard-0.1.0 → devboard-0.2.0}/src/devboard/_internal/cli.py +18 -0
  31. {devboard-0.1.0 → devboard-0.2.0}/src/devboard/_internal/datatable.py +18 -0
  32. {devboard-0.1.0 → devboard-0.2.0}/src/devboard/_internal/debug.py +19 -1
  33. {devboard-0.1.0 → devboard-0.2.0}/src/devboard/_internal/default_board.py +27 -7
  34. devboard-0.2.0/src/devboard/_internal/modal.py +70 -0
  35. {devboard-0.1.0 → devboard-0.2.0}/src/devboard/_internal/notifications.py +18 -0
  36. devboard-0.2.0/src/devboard/_internal/projects.py +269 -0
  37. devboard-0.2.0/tests/__init__.py +25 -0
  38. devboard-0.2.0/tests/conftest.py +19 -0
  39. {devboard-0.1.0 → devboard-0.2.0}/tests/test_api.py +23 -5
  40. {devboard-0.1.0 → devboard-0.2.0}/tests/test_cli.py +18 -0
  41. devboard-0.2.0/tests/test_modal.py +67 -0
  42. devboard-0.2.0/zensical.toml +192 -0
  43. devboard-0.1.0/config/mypy.ini +0 -5
  44. devboard-0.1.0/docs/.overrides/partials/path-item.html +0 -22
  45. devboard-0.1.0/docs/css/material.css +0 -4
  46. devboard-0.1.0/docs/css/mkdocstrings.css +0 -72
  47. devboard-0.1.0/mkdocs.yml +0 -177
  48. devboard-0.1.0/src/devboard/__init__.py +0 -31
  49. devboard-0.1.0/src/devboard/__main__.py +0 -14
  50. devboard-0.1.0/src/devboard/_internal/__init__.py +0 -0
  51. devboard-0.1.0/src/devboard/_internal/app.py +0 -152
  52. devboard-0.1.0/src/devboard/_internal/modal.py +0 -45
  53. devboard-0.1.0/src/devboard/_internal/projects.py +0 -203
  54. devboard-0.1.0/tests/__init__.py +0 -7
  55. devboard-0.1.0/tests/conftest.py +0 -1
  56. {devboard-0.1.0 → devboard-0.2.0}/CODE_OF_CONDUCT.md +0 -0
  57. {devboard-0.1.0 → devboard-0.2.0}/config/coverage.ini +0 -0
  58. {devboard-0.1.0 → devboard-0.2.0}/config/pytest.ini +0 -0
  59. {devboard-0.1.0 → devboard-0.2.0}/config/vscode/tasks.json +0 -0
  60. {devboard-0.1.0 → devboard-0.2.0}/docs/changelog.md +0 -0
  61. {devboard-0.1.0 → devboard-0.2.0}/docs/code_of_conduct.md +0 -0
  62. {devboard-0.1.0 → devboard-0.2.0}/docs/contributing.md +0 -0
  63. {devboard-0.1.0 → devboard-0.2.0}/docs/credits.md +0 -0
  64. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/columns/commit.py +0 -0
  65. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/columns/commit_pull.py +0 -0
  66. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/columns/commit_pull_push.py +0 -0
  67. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/columns/commit_pull_push_release.py +0 -0
  68. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/columns/notify.py +0 -0
  69. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/columns/pull.py +0 -0
  70. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/columns/push.py +0 -0
  71. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/columns/release.py +0 -0
  72. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/repositories.py +0 -0
  73. {devboard-0.1.0 → devboard-0.2.0}/docs/examples/screenshot.py +0 -0
  74. {devboard-0.1.0 → devboard-0.2.0}/docs/index.md +0 -0
  75. {devboard-0.1.0 → devboard-0.2.0}/docs/js/feedback.js +0 -0
  76. {devboard-0.1.0 → devboard-0.2.0}/docs/license.md +0 -0
  77. {devboard-0.1.0 → devboard-0.2.0}/docs/reference/api.md +0 -0
  78. {devboard-0.1.0 → devboard-0.2.0}/scripts/make +0 -0
  79. {devboard-0.1.0 → devboard-0.2.0}/src/devboard/_internal/devboard.tcss +0 -0
  80. {devboard-0.1.0 → devboard-0.2.0}/src/devboard/py.typed +0 -0
@@ -0,0 +1,15 @@
1
+ # AI Contribution Policy
2
+
3
+ We accept AI-*assisted* contributions, both for code and documentation, with the following expectations:
4
+
5
+ - AI-assisted contributions must disclaim their use of AI.
6
+ - Contributors must fully understand the proposed changes and be able to explain why they are the correct approach.
7
+ - Issues must be created before creating pull requests (unless there is already a relevant issue).
8
+ - Issue and pull request templates must be followed.
9
+ - Comments (including bodies) in issues and pull requests must be written by humans. If you use LLMs to translate from one language to another, please include your original comment and the translated one.
10
+ - Git commits must be authored by humans, not AI/bot accounts or identities.
11
+ - Git commit messages must be written by humans, in English. If you cannot write English, please state so in the pull request body and we will write the commit messages ourselves.
12
+
13
+ Failure to comply with any of these requirements will result in issues or pull requests being closed immediately without comment. Repeated violations of this policy will result in a ban of the offending accounts/identities from contributing to this project and any related project from the same author/organization.
14
+
15
+ We do not accept AI-generated content in community spaces we maintain or moderate, such as GitHub discussions or Matrix rooms.
@@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  <!-- insertion marker -->
9
+ ## [0.2.0](https://github.com/pawamoy/devboard/releases/tag/0.2.0) - 2026-09-10
10
+
11
+ <small>[Compare with 0.1.0](https://github.com/pawamoy/devboard/compare/0.1.0...0.2.0)</small>
12
+
13
+ The project is update to support latest version of Textual.
14
+
15
+ ### Bug Fixes
16
+
17
+ - Prevent event propagation from modal ([e61eadd](https://github.com/pawamoy/devboard/commit/e61eaddaca58f91c02150c2f11465fcb82d576d1) by Timothée Mazzucotelli).
18
+ - Fix script entrypoint ([acb054d](https://github.com/pawamoy/devboard/commit/acb054d11395861c34a60e2a60711379a3b48019) by Timothée Mazzucotelli).
19
+
20
+ ### Performance Improvements
21
+
22
+ - Start faster (cache), scan faster ([9a740e5](https://github.com/pawamoy/devboard/commit/9a740e55aff8add3016b438d1b0912376a5552aa) by Timothée Mazzucotelli).
23
+
9
24
  ## [0.1.0](https://github.com/pawamoy/devboard/releases/tag/0.1.0) - 2025-11-08
10
25
 
11
26
  <small>[Compare with first commit](https://github.com/pawamoy/devboard/compare/286120e957168a9162d5a8dc19c7dd72fb0a6d65...0.1.0)</small>
@@ -1,28 +1,19 @@
1
1
  # Contributing
2
2
 
3
- Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.
3
+ Contributions are welcome, and they are greatly appreciated. Every little bit helps, and credit will always be given.
4
4
 
5
- ## Environment setup
5
+ **Please always create an issue before working on a new feature or a bug fix, so that we can discuss the implementation and make sure that your work will be merged.**
6
6
 
7
- Nothing easier!
7
+ ## Environment setup
8
8
 
9
- Fork and clone the repository, then:
9
+ Install [uv](https://github.com/astral-sh/uv) and [direnv](https://direnv.net/), fork and clone the repository, then:
10
10
 
11
11
  ```bash
12
12
  cd devboard
13
+ direnv allow
13
14
  make setup
14
15
  ```
15
16
 
16
- > NOTE: If it fails for some reason, you'll need to install [uv](https://github.com/astral-sh/uv) manually.
17
- >
18
- > You can install it with:
19
- >
20
- > ```bash
21
- > curl -LsSf https://astral.sh/uv/install.sh | sh
22
- > ```
23
- >
24
- > Now you can try running `make setup` again, or simply `uv sync`.
25
-
26
17
  You now have the dependencies installed.
27
18
 
28
19
  You can run the application with `make run devboard [ARGS...]`.
@@ -31,8 +22,7 @@ Run `make help` to see all the available actions!
31
22
 
32
23
  ## Tasks
33
24
 
34
- The entry-point to run commands and tasks is the `make` Python script, located in the `scripts` directory. Try running `make` to show the available commands and tasks. The *commands* do not need the Python dependencies to be installed,
35
- while the *tasks* do. The cross-platform tasks are written in Python, thanks to [duty](https://github.com/pawamoy/duty).
25
+ The entry-point to run commands and tasks is the `make` Python script, located in the `scripts` directory. Try running `make` to show the available commands and tasks. The *commands* do not need the Python dependencies to be installed, while the *tasks* do. The cross-platform tasks are written in Python, thanks to [duty](https://github.com/pawamoy/duty).
36
26
 
37
27
  If you work in VSCode, we provide [an action to configure VSCode](https://pawamoy.github.io/copier-uv/work/#vscode-setup) for the project.
38
28
 
@@ -1,6 +1,6 @@
1
1
  ISC License
2
2
 
3
- Copyright (c) 2023, Timothée Mazzucotelli
3
+ Copyright (c) 2023, Timothée Mazzucotelli and contributors
4
4
 
5
5
  Permission to use, copy, modify, and/or distribute this software for any
6
6
  purpose with or without fee is hereby granted, provided that the above
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devboard
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: A development dashboard for your projects.
5
5
  Author-Email: =?utf-8?q?Timoth=C3=A9e_Mazzucotelli?= <dev@pawamoy.fr>
6
6
  License-Expression: ISC
@@ -37,7 +37,7 @@ Description-Content-Type: text/markdown
37
37
  # Devboard
38
38
 
39
39
  [![ci](https://github.com/pawamoy/devboard/workflows/ci/badge.svg)](https://github.com/pawamoy/devboard/actions?query=workflow%3Aci)
40
- [![documentation](https://img.shields.io/badge/docs-mkdocs-708FCC.svg?style=flat)](https://pawamoy.github.io/devboard/)
40
+ [![documentation](https://img.shields.io/badge/docs-zensical-FF9100.svg?style=flat)](https://pawamoy.github.io/devboard/)
41
41
  [![pypi version](https://img.shields.io/pypi/v/devboard.svg)](https://pypi.org/project/devboard/)
42
42
  [![gitter](https://img.shields.io/badge/matrix-chat-4DB798.svg?style=flat)](https://app.gitter.im/#/room/#devboard:gitter.im)
43
43
 
@@ -59,4 +59,3 @@ uv tool install devboard
59
59
 
60
60
  <!-- sponsors-start -->
61
61
  <!-- sponsors-end -->
62
-
@@ -1,7 +1,7 @@
1
1
  # Devboard
2
2
 
3
3
  [![ci](https://github.com/pawamoy/devboard/workflows/ci/badge.svg)](https://github.com/pawamoy/devboard/actions?query=workflow%3Aci)
4
- [![documentation](https://img.shields.io/badge/docs-mkdocs-708FCC.svg?style=flat)](https://pawamoy.github.io/devboard/)
4
+ [![documentation](https://img.shields.io/badge/docs-zensical-FF9100.svg?style=flat)](https://pawamoy.github.io/devboard/)
5
5
  [![pypi version](https://img.shields.io/pypi/v/devboard.svg)](https://pypi.org/project/devboard/)
6
6
  [![gitter](https://img.shields.io/badge/matrix-chat-4DB798.svg?style=flat)](https://app.gitter.im/#/room/#devboard:gitter.im)
7
7
 
@@ -23,4 +23,3 @@ uv tool install devboard
23
23
 
24
24
  <!-- sponsors-start -->
25
25
  <!-- sponsors-end -->
26
-
@@ -4,6 +4,6 @@ in-place = true
4
4
  output = "CHANGELOG.md"
5
5
  parse-refs = false
6
6
  parse-trailers = true
7
- sections = ["build", "deps", "feat", "fix", "refactor"]
7
+ sections = ["build", "deps", "feat", "fix", "perf", "refactor"]
8
8
  template = "keepachangelog"
9
9
  versioning = "pep440"
@@ -1,34 +1,14 @@
1
- target-version = "py39"
1
+ target-version = "py310"
2
2
  line-length = 120
3
+ output-format = "concise"
3
4
 
4
5
  [lint]
5
6
  exclude = [
6
7
  "tests/fixtures/*.py",
7
8
  ]
8
- select = [
9
- "A", "ANN", "ARG",
10
- "B", "BLE",
11
- "C", "C4",
12
- "COM",
13
- "D", "DTZ",
14
- "E", "ERA", "EXE",
15
- "F", "FBT",
16
- "G",
17
- "I", "ICN", "INP", "ISC",
18
- "N",
19
- "PGH", "PIE", "PL", "PLC", "PLE", "PLR", "PLW", "PT", "PYI",
20
- "Q",
21
- "RUF", "RSE", "RET",
22
- "S", "SIM", "SLF",
23
- "T", "T10", "T20", "TCH", "TID", "TRY",
24
- "UP",
25
- "W",
26
- "YTT",
27
- ]
9
+ select = ["ALL"]
28
10
  ignore = [
29
11
  "A001", # Variable is shadowing a Python builtin
30
- "ANN101", # Missing type annotation for self
31
- "ANN102", # Missing type annotation for cls
32
12
  "ANN204", # Missing return type annotation for special method __str__
33
13
  "ANN401", # Dynamically typed expressions (typing.Any) are disallowed
34
14
  "ARG005", # Unused lambda argument
@@ -36,13 +16,18 @@ ignore = [
36
16
  "D105", # Missing docstring in magic method
37
17
  "D417", # Missing argument description in the docstring
38
18
  "E501", # Line too long
19
+ "EM101", # String literal when raising exception
20
+ "EM102", # f-string when raising exception
39
21
  "ERA001", # Commented out code
22
+ "FIX", # TODO, FIXME, etc.
40
23
  "G004", # Logging statement uses f-string
41
24
  "PLR0911", # Too many return statements
42
25
  "PLR0912", # Too many branches
43
26
  "PLR0913", # Too many arguments to function call
44
27
  "PLR0915", # Too many statements
45
28
  "SLF001", # Private member accessed
29
+ "TD002", # Missing author in TODO
30
+ "TD003", # Missing issue link for TODO
46
31
  "TRY003", # Avoid specifying long messages outside the exception class
47
32
  ]
48
33
 
@@ -0,0 +1,6 @@
1
+ [src]
2
+ exclude = ["tests/fixtures"]
3
+
4
+ [terminal]
5
+ error-on-warning = true
6
+ output-format = "concise"
@@ -23,11 +23,10 @@
23
23
  "name": "docs",
24
24
  "type": "debugpy",
25
25
  "request": "launch",
26
- "module": "mkdocs",
26
+ "module": "zensical",
27
27
  "justMyCode": false,
28
28
  "args": [
29
29
  "serve",
30
- "-v"
31
30
  ]
32
31
  },
33
32
  {
@@ -4,9 +4,6 @@
4
4
  "**/.venvs*/**": true,
5
5
  "**/venv*/**": true
6
6
  },
7
- "mypy-type-checker.args": [
8
- "--config-file=config/mypy.ini"
9
- ],
10
7
  "python.testing.unittestEnabled": false,
11
8
  "python.testing.pytestEnabled": true,
12
9
  "python.testing.pytestArgs": [
@@ -19,6 +16,7 @@
19
16
  "ruff.lint.args": [
20
17
  "--config=config/ruff.toml"
21
18
  ],
19
+ "ty.configurationFile": "config/ty.toml",
22
20
  "yaml.schemas": {
23
21
  "https://squidfunk.github.io/mkdocs-material/schema.json": "mkdocs.yml"
24
22
  },
@@ -0,0 +1,44 @@
1
+ // Project-local debug tasks
2
+ //
3
+ // For more documentation on how to configure debug tasks,
4
+ // see: https://zed.dev/docs/debugger
5
+ [
6
+ {
7
+ "label": "python (current file)",
8
+ "adapter": "Debugpy",
9
+ "request": "launch",
10
+ "program": "$ZED_FILE",
11
+ "justMyCode": false
12
+ },
13
+ {
14
+ "label": "run",
15
+ "adapter": "Debugpy",
16
+ "request": "launch",
17
+ "module": "devboard",
18
+ "justMyCode": false
19
+ },
20
+ {
21
+ "label": "docs",
22
+ "adapter": "Debugpy",
23
+ "request": "launch",
24
+ "module": "zensical",
25
+ "args": [
26
+ "serve"
27
+ ],
28
+ "justMyCode": false
29
+ },
30
+ {
31
+ "label": "test",
32
+ "adapter": "Debugpy",
33
+ "request": "launch",
34
+ "module": "pytest",
35
+ "args": [
36
+ "-c=config/pytest.ini",
37
+ "-vvv",
38
+ "--no-cov",
39
+ "--dist=no",
40
+ "tests"
41
+ ],
42
+ "justMyCode": false
43
+ }
44
+ ]
@@ -0,0 +1,43 @@
1
+ // Zed settings
2
+ //
3
+ // For information on how to configure Zed, see the Zed
4
+ // documentation: https://zed.dev/docs/configuring-zed
5
+ //
6
+ // To see all of Zed's default settings without changing your
7
+ // custom settings, run `zed: open default settings` from the
8
+ // command palette (cmd-shift-p / ctrl-shift-p)
9
+ {
10
+ "languages": {
11
+ "YAML": {
12
+ "auto_indent_on_paste": false,
13
+ "auto_indent": "preserve_indent",
14
+ "format_on_save": "off"
15
+ },
16
+ "Python": {
17
+ "language_servers": ["ty", "ruff"],
18
+ "code_actions_on_format": {
19
+ "source.organizeImports.ruff": true
20
+ },
21
+ "formatter": {
22
+ "language_server": {
23
+ "name": "ruff"
24
+ }
25
+ }
26
+ }
27
+ },
28
+ "lsp": {
29
+ "ty": {
30
+ "settings": {
31
+ "configurationFile": "config/ty.toml"
32
+ }
33
+ },
34
+ "ruff": {
35
+ "initialization_options": {
36
+ "settings": {
37
+ "configurationPreference": "filesystemFirst",
38
+ "configuration": "config/ruff.toml"
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,72 @@
1
+ [
2
+ {
3
+ "label": "changelog",
4
+ "command": "scripts/make",
5
+ "args": ["changelog"]
6
+ },
7
+ {
8
+ "label": "check",
9
+ "command": "scripts/make",
10
+ "args": ["check"]
11
+ },
12
+ {
13
+ "label": "check-quality",
14
+ "command": "scripts/make",
15
+ "args": ["check-quality"]
16
+ },
17
+ {
18
+ "label": "check-types",
19
+ "command": "scripts/make",
20
+ "args": ["check-types"]
21
+ },
22
+ {
23
+ "label": "check-docs",
24
+ "command": "scripts/make",
25
+ "args": ["check-docs"]
26
+ },
27
+ {
28
+ "label": "check-api",
29
+ "command": "scripts/make",
30
+ "args": ["check-api"]
31
+ },
32
+ {
33
+ "label": "clean",
34
+ "command": "scripts/make",
35
+ "args": ["clean"]
36
+ },
37
+ {
38
+ "label": "docs",
39
+ "command": "scripts/make",
40
+ "args": ["docs"]
41
+ },
42
+ {
43
+ "label": "docs-deploy",
44
+ "command": "scripts/make",
45
+ "args": ["docs-deploy"]
46
+ },
47
+ {
48
+ "label": "format",
49
+ "command": "scripts/make",
50
+ "args": ["format"]
51
+ },
52
+ {
53
+ "label": "release",
54
+ "command": "scripts/make",
55
+ "args": ["release"]
56
+ },
57
+ {
58
+ "label": "setup",
59
+ "command": "scripts/make",
60
+ "args": ["setup"]
61
+ },
62
+ {
63
+ "label": "test",
64
+ "command": "scripts/make",
65
+ "args": ["test", "coverage"]
66
+ },
67
+ {
68
+ "label": "vscode",
69
+ "command": "scripts/make",
70
+ "args": ["vscode"]
71
+ }
72
+ ]
@@ -1,7 +1,11 @@
1
1
  {% extends "base.html" %}
2
2
 
3
3
  {% block announce %}
4
-
4
+ <strong>Fund this project</strong> through
5
+ <a href="https://github.com/sponsors/pawamoy"><strong>sponsorship</strong></a>
6
+ <span class="twemoji heart pulse">
7
+ {% include ".icons/octicons/heart-fill-16.svg" %}
8
+ </span> &mdash;
5
9
  Follow
6
10
  <strong>@pawamoy</strong> on
7
11
  <a rel="me" href="https://fosstodon.org/@pawamoy">
@@ -1,5 +1,5 @@
1
1
  <!-- Giscus -->
2
- <!-- https://squidfunk.github.io/mkdocs-material/setup/adding-a-comment-system/#giscus-integration -->
2
+ <!-- https://zensical.org/docs/setup/comment-system/#giscus-integration -->
3
3
  <div id="feedback" style="display: none;">
4
4
  <h2 id="__comments">Feedback</h2>
5
5
  <script src="https://giscus.app/client.js"
@@ -0,0 +1,21 @@
1
+ /* Mark external links as such. */
2
+ a.external::after,
3
+ a.autorefs-external::after {
4
+ /* https://primer.style/octicons/arrow-up-right-24 */
5
+ mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z"></path></svg>');
6
+ -webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z"></path></svg>');
7
+ content: ' ';
8
+
9
+ display: inline-block;
10
+ vertical-align: middle;
11
+ position: relative;
12
+
13
+ height: 1em;
14
+ width: 1em;
15
+ background-color: currentColor;
16
+ }
17
+
18
+ a.external:hover::after,
19
+ a.autorefs-external:hover::after {
20
+ background-color: var(--md-accent-fg-color);
21
+ }
@@ -67,6 +67,16 @@ and change the board value to "tutorial":
67
67
  board = "tutorial"
68
68
  ```
69
69
 
70
+ The configuration file supports one more setting: `workers`,
71
+ the number of projects Devboard scans concurrently (4 by default).
72
+ Raise it if your repositories live on a fast SSD,
73
+ lower it if they live on a spinning disk and cold starts feel slow:
74
+
75
+ ```toml
76
+ board = "tutorial"
77
+ workers = 4
78
+ ```
79
+
70
80
  Now open the `tutorial.py` file in your favorite editor,
71
81
  and you'll be ready to start building.
72
82
 
@@ -150,7 +160,7 @@ Of course, it doesn't know what to do with these projects.
150
160
  We will tell it how to scan a project to add rows to our table
151
161
  by implementing the `populate_rows` method.
152
162
 
153
- ```python hl_lines="7 15-17"
163
+ ```python hl_lines="7 15-18"
154
164
  from pathlib import Path
155
165
  from devboard import Column, Project
156
166
 
@@ -167,7 +177,8 @@ class ToCommit(Column):
167
177
 
168
178
  @staticmethod
169
179
  def populate_rows(project):
170
- return [(project, project.status_line)] if project.is_dirty else []
180
+ status_line = project.status_line
181
+ return [(project, status_line)] if status_line else []
171
182
 
172
183
 
173
184
  columns = [
@@ -180,8 +191,8 @@ We declare the table headers with the `HEADERS` class variable.
180
191
  Then we build and return rows in the `populate_rows` method.
181
192
  The number of element in each row must be equal to the number of headers.
182
193
  Fortunately, the status line functionality is built into [`devboard.Project`][],
183
- so we can use it directly. We don't bother computing a status line
184
- if the project is not "dirty", i.e. has no current modifications.
194
+ so we can use it directly. An empty status line means the project is clean
195
+ (no current modifications), in which case we don't add any row.
185
196
 
186
197
  You may have noticed that the method is a `staticmethod`.
187
198
  This is required by Devboard for technical reasons that are beyond this tutorial's scope.
@@ -199,7 +210,7 @@ and the output of `git diff` when hitting ++d++.
199
210
  We do that by declaring the `BINDINGS` class variable,
200
211
  and by implementing the `apply` method:
201
212
 
202
- ```python hl_lines="2 8-12 24-29"
213
+ ```python hl_lines="2 8-12 26-32"
203
214
  from pathlib import Path
204
215
  from devboard import Column, Project, Row
205
216
 
@@ -221,14 +232,16 @@ class ToCommit(Column):
221
232
 
222
233
  @staticmethod
223
234
  def populate_rows(project):
224
- return [(project, project.status_line)] if project.is_dirty else []
235
+ status_line = project.status_line
236
+ return [(project, status_line)] if status_line else []
225
237
 
226
238
  def apply(self, action, row):
227
239
  if action == "status":
228
240
  self.modal(text=row.project.repo.git(c="color.status=always").status())
229
- if action == "diff":
241
+ elif action == "diff":
230
242
  self.modal(text=row.project.repo.git(c="color.ui=always").diff())
231
- raise ValueError(f"Unknown action '{action}'")```
243
+ else:
244
+ raise ValueError(f"Unknown action '{action}'")
232
245
 
233
246
 
234
247
  columns = [