exist-shell 0.1.0__tar.gz → 0.1.1__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 (106) hide show
  1. {exist_shell-0.1.0 → exist_shell-0.1.1}/CHANGELOG.md +7 -0
  2. exist_shell-0.1.1/LICENSE +21 -0
  3. exist_shell-0.1.1/PKG-INFO +258 -0
  4. exist_shell-0.1.1/pyproject.toml +62 -0
  5. {exist_shell-0.1.0 → exist_shell-0.1.1}/uv.lock +1 -1
  6. exist_shell-0.1.0/PKG-INFO +0 -10
  7. exist_shell-0.1.0/pyproject.toml +0 -37
  8. {exist_shell-0.1.0 → exist_shell-0.1.1}/.gitguardian.yaml +0 -0
  9. {exist_shell-0.1.0 → exist_shell-0.1.1}/.github/dependabot.yml +0 -0
  10. {exist_shell-0.1.0 → exist_shell-0.1.1}/.github/workflows/docs.yml +0 -0
  11. {exist_shell-0.1.0 → exist_shell-0.1.1}/.github/workflows/e2e.yml +0 -0
  12. {exist_shell-0.1.0 → exist_shell-0.1.1}/.github/workflows/release.yml +0 -0
  13. {exist_shell-0.1.0 → exist_shell-0.1.1}/.github/workflows/ruff.yml +0 -0
  14. {exist_shell-0.1.0 → exist_shell-0.1.1}/.github/workflows/tests.yml +0 -0
  15. {exist_shell-0.1.0 → exist_shell-0.1.1}/.github/workflows/ty.yml +0 -0
  16. {exist_shell-0.1.0 → exist_shell-0.1.1}/.gitignore +0 -0
  17. {exist_shell-0.1.0 → exist_shell-0.1.1}/CLAUDE.md +0 -0
  18. {exist_shell-0.1.0 → exist_shell-0.1.1}/Makefile +0 -0
  19. {exist_shell-0.1.0 → exist_shell-0.1.1}/README.md +0 -0
  20. {exist_shell-0.1.0 → exist_shell-0.1.1}/docs/api.md +0 -0
  21. {exist_shell-0.1.0 → exist_shell-0.1.1}/docs/commands.md +0 -0
  22. {exist_shell-0.1.0 → exist_shell-0.1.1}/docs/completion.md +0 -0
  23. {exist_shell-0.1.0 → exist_shell-0.1.1}/docs/configuration.md +0 -0
  24. {exist_shell-0.1.0 → exist_shell-0.1.1}/docs/development.md +0 -0
  25. {exist_shell-0.1.0 → exist_shell-0.1.1}/docs/index.md +0 -0
  26. {exist_shell-0.1.0 → exist_shell-0.1.1}/docs/installation.md +0 -0
  27. {exist_shell-0.1.0 → exist_shell-0.1.1}/docs/sync.md +0 -0
  28. {exist_shell-0.1.0 → exist_shell-0.1.1}/mkdocs.yml +0 -0
  29. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/docker.sh +0 -0
  30. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/lib.sh +0 -0
  31. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T02_server.sh +0 -0
  32. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T03_collection.sh +0 -0
  33. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T04_ls.sh +0 -0
  34. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T05_put.sh +0 -0
  35. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T06_ls_after.sh +0 -0
  36. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T07_cat.sh +0 -0
  37. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T08_cp.sh +0 -0
  38. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T09_rm.sh +0 -0
  39. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T10_mkdir.sh +0 -0
  40. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T11_edit.sh +0 -0
  41. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T12_sync.sh +0 -0
  42. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T13_mv.sh +0 -0
  43. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T14_exec.sh +0 -0
  44. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T15_user.sh +0 -0
  45. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T16_group.sh +0 -0
  46. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T17_chown.sh +0 -0
  47. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e/sections/T18_chmod.sh +0 -0
  48. {exist_shell-0.1.0 → exist_shell-0.1.1}/scripts/e2e.sh +0 -0
  49. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/__init__.py +0 -0
  50. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/cache.py +0 -0
  51. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/client/__init__.py +0 -0
  52. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/client/_base.py +0 -0
  53. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/client/_collections.py +0 -0
  54. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/client/_documents.py +0 -0
  55. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/client/_groups.py +0 -0
  56. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/client/_permissions.py +0 -0
  57. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/client/_queries.py +0 -0
  58. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/client/_users.py +0 -0
  59. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/__init__.py +0 -0
  60. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/cat.py +0 -0
  61. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/chmod.py +0 -0
  62. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/chown.py +0 -0
  63. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/collection.py +0 -0
  64. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/cp.py +0 -0
  65. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/edit.py +0 -0
  66. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/exec.py +0 -0
  67. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/group.py +0 -0
  68. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/ls.py +0 -0
  69. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/mkdir.py +0 -0
  70. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/mv.py +0 -0
  71. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/put.py +0 -0
  72. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/rm.py +0 -0
  73. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/server.py +0 -0
  74. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/sync.py +0 -0
  75. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/commands/user.py +0 -0
  76. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/completions.py +0 -0
  77. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/config.py +0 -0
  78. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/exceptions.py +0 -0
  79. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/main.py +0 -0
  80. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/models.py +0 -0
  81. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/utils.py +0 -0
  82. {exist_shell-0.1.0 → exist_shell-0.1.1}/src/exist_shell/xquery.py +0 -0
  83. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/__init__.py +0 -0
  84. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/conftest.py +0 -0
  85. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_cache.py +0 -0
  86. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_client.py +0 -0
  87. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_cat.py +0 -0
  88. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_chmod.py +0 -0
  89. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_chown.py +0 -0
  90. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_collection.py +0 -0
  91. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_cp.py +0 -0
  92. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_edit.py +0 -0
  93. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_exec.py +0 -0
  94. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_group.py +0 -0
  95. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_ls.py +0 -0
  96. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_mkdir.py +0 -0
  97. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_mv.py +0 -0
  98. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_put.py +0 -0
  99. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_rm.py +0 -0
  100. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_server.py +0 -0
  101. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_sync.py +0 -0
  102. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_commands_user.py +0 -0
  103. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_completions.py +0 -0
  104. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_config.py +0 -0
  105. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_utils.py +0 -0
  106. {exist_shell-0.1.0 → exist_shell-0.1.1}/tests/test_xquery.py +0 -0
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## unreleased
4
4
 
5
+ ## 0.1.1 - 2026-06-23
6
+
7
+ ### Fixes
8
+
9
+ - Complete PyPI project metadata: `readme`, `license` (MIT), `authors`, `classifiers`, `project.urls`, and `keywords` were all missing, leaving the 0.1.0 PyPI listing with no description, license, or links
10
+ - Add `LICENSE` file (MIT)
11
+
5
12
  ## 0.1.0 - 2026-06-23
6
13
 
7
14
  ### Commands
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Alberto Simões
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.
@@ -0,0 +1,258 @@
1
+ Metadata-Version: 2.4
2
+ Name: exist-shell
3
+ Version: 0.1.1
4
+ Summary: Command-line tool to interact with eXist-db via REST
5
+ Project-URL: Homepage, https://github.com/ambs/exist-shell
6
+ Project-URL: Repository, https://github.com/ambs/exist-shell
7
+ Project-URL: Documentation, https://ambs.github.io/exist-shell/
8
+ Project-URL: Issues, https://github.com/ambs/exist-shell/issues
9
+ Project-URL: Changelog, https://github.com/ambs/exist-shell/blob/main/CHANGELOG.md
10
+ Author-email: Alberto Simões <ambs@zbr.pt>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: cli,exist-db,xml,xquery
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Environment :: Console
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Database
22
+ Classifier: Topic :: Software Development :: Libraries
23
+ Classifier: Topic :: Utilities
24
+ Requires-Python: >=3.11
25
+ Requires-Dist: httpx>=0.27
26
+ Requires-Dist: platformdirs>=4.10.0; sys_platform == 'win32'
27
+ Requires-Dist: pydantic>=2.13.4
28
+ Requires-Dist: tomlkit>=0.15.0
29
+ Requires-Dist: typer>=0.26.7
30
+ Description-Content-Type: text/markdown
31
+
32
+ # exsh — eXist-db Shell
33
+
34
+ [![Tests](https://github.com/ambs/exist-shell/actions/workflows/tests.yml/badge.svg)](https://github.com/ambs/exist-shell/actions/workflows/tests.yml)
35
+ [![Coverage](https://codecov.io/gh/ambs/exist-shell/graph/badge.svg)](https://codecov.io/gh/ambs/exist-shell)
36
+ [![e2e](https://github.com/ambs/exist-shell/actions/workflows/e2e.yml/badge.svg)](https://github.com/ambs/exist-shell/actions/workflows/e2e.yml)
37
+ [![Ruff](https://github.com/ambs/exist-shell/actions/workflows/ruff.yml/badge.svg)](https://github.com/ambs/exist-shell/actions/workflows/ruff.yml)
38
+ [![ty](https://github.com/ambs/exist-shell/actions/workflows/ty.yml/badge.svg)](https://github.com/ambs/exist-shell/actions/workflows/ty.yml)
39
+ [![docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue)](https://ambs.github.io/exist-shell/)
40
+
41
+ A command-line tool to interact with an [eXist-db](https://exist-db.org) server via its REST API. Designed for shell scripting and pipe-friendly workflows.
42
+
43
+ ## Requirements
44
+
45
+ - Python 3.11+
46
+ - [uv](https://docs.astral.sh/uv/)
47
+
48
+ ## Installation
49
+
50
+ Install system-wide with `uv tool`:
51
+
52
+ ```bash
53
+ uv tool install git+https://github.com/ambs/exist-shell
54
+ ```
55
+
56
+ This places `exsh` on your `PATH`. Verify with:
57
+
58
+ ```bash
59
+ exsh --version
60
+ ```
61
+
62
+ To uninstall:
63
+
64
+ ```bash
65
+ uv tool uninstall exist-shell
66
+ ```
67
+
68
+ ## Configuration
69
+
70
+ ### Add a server
71
+
72
+ ```bash
73
+ exsh server add localhost --port 8080 --user admin
74
+ ```
75
+
76
+ A nickname is derived from the hostname by default (e.g. `localhost`). Override with `--nick`.
77
+
78
+ ### Add an existing collection
79
+
80
+ ```bash
81
+ exsh collection add mydata@localhost
82
+ ```
83
+
84
+ This registers the `/db/mydata` collection on the `localhost` server under the nick `mydata`.
85
+
86
+ ### Create and register a new collection
87
+
88
+ ```bash
89
+ exsh collection new mydata@localhost
90
+ ```
91
+
92
+ Creates `/db/mydata` on the server and registers it in one step. If the collection already exists, it prints a message and exits without modifying the config. Use `--nick` to register it under a different name:
93
+
94
+ ```bash
95
+ exsh collection new mydata@localhost --nick md
96
+ ```
97
+
98
+ List configured servers and collections:
99
+
100
+ ```bash
101
+ exsh server ls
102
+ exsh collection ls
103
+ ```
104
+
105
+ Configuration is stored at `~/.config/exsh/config.toml`.
106
+
107
+ ## Commands
108
+
109
+ | Command | Description |
110
+ |---------|-------------|
111
+ | `exsh ls <nick>[:<path>]` | List subcollections and documents at a path |
112
+ | `exsh cat <nick>:<path>` | Print a document to stdout |
113
+ | `exsh put <file> <nick>:<path>` | Upload a local file to a collection |
114
+ | `exsh cp <src> <dst>` | Copy a document (local ↔ remote or remote ↔ remote) |
115
+ | `exsh edit <nick>:<path>` | Open a document in `$EDITOR`, re-upload if changed |
116
+ | `exsh rm <nick>:<path>...` | Delete one or more documents |
117
+ | `exsh mkdir <nick>:<path>` | Create a collection |
118
+ | `exsh sync <local> <nick>[:<path>]` | Push a local folder to a remote collection |
119
+ | `exsh sync <nick>[:<path>] <local>` | Pull a remote collection to a local folder |
120
+ | `exsh exec <nick>[:<path>]` | Execute an XQuery script on a server |
121
+ | `exsh server add <host>` | Register a server |
122
+ | `exsh server ls` | List registered servers |
123
+ | `exsh server rm <nick>` | Remove a server (and its collections) |
124
+ | `exsh server rename <old> <new>` | Rename a server nick (updates collection references) |
125
+ | `exsh collection add <name>[@<server>]` | Register an existing collection |
126
+ | `exsh collection new <name>[@<server>]` | Create a collection on the server and register it |
127
+ | `exsh collection ls` | List registered collections |
128
+ | `exsh collection rm <nick>` | Remove a collection from the config |
129
+ | `exsh user ls [@server]` | List user accounts and their groups |
130
+ | `exsh user add <user[@server]>` | Create a user account (prompts for password) |
131
+ | `exsh user rm <user[@server]>` | Remove a user account |
132
+ | `exsh user info <user[@server]>` | Show user account details |
133
+ | `exsh group ls [@server]` | List groups and their members |
134
+ | `exsh group add <group[@server]>` | Create a group |
135
+ | `exsh group rm <group[@server]>` | Remove a group |
136
+ | `exsh chown <spec> <nick>:<path>` | Change owner and/or group of a document or collection |
137
+ | `exsh chmod <mode> <nick>:<path>` | Change POSIX permissions of a document or collection |
138
+
139
+ ### Examples
140
+
141
+ ```bash
142
+ # List the root of a collection
143
+ exsh ls mydata
144
+
145
+ # List a subdirectory
146
+ exsh ls mydata:reports/2025
147
+
148
+ # Print a document
149
+ exsh cat mydata:reports/2025/summary.xml
150
+
151
+ # Upload a file
152
+ exsh put report.xml mydata:reports/2025/report.xml
153
+
154
+ # Copy from remote to local
155
+ exsh cp mydata:reports/2025/report.xml ./report.xml
156
+
157
+ # Edit in place
158
+ exsh edit mydata:reports/2025/report.xml
159
+
160
+ # Delete a document
161
+ exsh rm mydata:reports/2025/old.xml
162
+
163
+ # Delete multiple documents
164
+ exsh rm mydata:reports/2025/a.xml mydata:reports/2025/b.xml
165
+
166
+ # Create a subcollection
167
+ exsh mkdir mydata:reports/2026
168
+
169
+ # Execute an XQuery script from a file
170
+ exsh exec mydata:/ -f query.xq
171
+
172
+ # Execute an XQuery script from stdin
173
+ echo 'count(collection("/db/mydata"))' | exsh exec mydata:/
174
+
175
+ # Execute without local preprocessing
176
+ exsh exec mydata:/ --no-fix -f query.xq
177
+
178
+ # List locally available XQuery validators
179
+ exsh exec --list-validators
180
+
181
+ # Push a local folder to the server (only transfers changed files)
182
+ exsh sync ./reports mydata:reports
183
+
184
+ # Pull a remote collection to a local folder
185
+ exsh sync mydata:reports ./reports
186
+
187
+ # Preview what would be transferred without doing it
188
+ exsh sync --dry-run ./reports mydata:reports
189
+
190
+ # Push and remove files on the server that no longer exist locally
191
+ exsh sync --delete ./reports mydata:reports
192
+
193
+ # Change owner and group of a document
194
+ exsh chown alice:editors mydata:reports/annual.xml
195
+
196
+ # Recursively reassign a collection tree
197
+ exsh chown -R alice mydata:reports
198
+
199
+ # Set permissions with octal mode
200
+ exsh chmod 0644 mydata:reports/annual.xml
201
+
202
+ # Add execute permission for the owner
203
+ exsh chmod u+x mydata:scripts/run.xq
204
+
205
+ # Recursively set permissions for a collection
206
+ exsh chmod -R 0644 mydata:data
207
+ ```
208
+
209
+ ## Sync
210
+
211
+ `exsh sync` transfers only files that have changed, using a local manifest stored at `~/.cache/exsh/sync/`. Direction is inferred from the argument order: local-first means push, remote-first means pull.
212
+
213
+ **Change detection:**
214
+ - **Push**: SHA-256 hash of the local file is compared against the manifest. Same-size edits are caught.
215
+ - **Pull**: `last_modified` timestamp from the eXist listing is compared against the manifest.
216
+
217
+ **Conflicts** (both sides changed since last sync) are reported and skipped — use `--force` to override.
218
+
219
+ **Options:**
220
+
221
+ | Flag | Effect |
222
+ |------|--------|
223
+ | `--force` / `-f` | Transfer all files, bypassing change detection |
224
+ | `--dry-run` / `-n` | Show what would happen without transferring |
225
+ | `--delete` | Remove files and empty folders on the destination that no longer exist on the source |
226
+ | `--verbose` / `-v` | Also print unchanged (skipped) files |
227
+ | `--checkpoint-every N` | Flush the manifest every N files (default: 100); allows interrupted syncs to resume near the point of failure |
228
+
229
+ ## Shell completion
230
+
231
+ Generate and install tab-completion for your shell:
232
+
233
+ ```bash
234
+ # bash
235
+ exsh --install-completion bash
236
+
237
+ # zsh
238
+ exsh --install-completion zsh
239
+
240
+ # fish
241
+ exsh --install-completion fish
242
+ ```
243
+
244
+ ## Development
245
+
246
+ ```bash
247
+ git clone https://github.com/ambs/exist-shell
248
+ cd exist-shell
249
+ uv sync
250
+ exsh --help
251
+ ```
252
+
253
+ Run checks:
254
+
255
+ ```bash
256
+ make checks # lint, type-check, and tests
257
+ make test # tests only
258
+ ```
@@ -0,0 +1,62 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "exist-shell"
7
+ version = "0.1.1"
8
+ description = "Command-line tool to interact with eXist-db via REST"
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ authors = [
12
+ { name = "Alberto Simões", email = "ambs@zbr.pt" },
13
+ ]
14
+ keywords = ["exist-db", "xml", "xquery", "cli"]
15
+ classifiers = [
16
+ "Development Status :: 4 - Beta",
17
+ "Environment :: Console",
18
+ "Intended Audience :: Developers",
19
+ "Topic :: Database",
20
+ "Topic :: Software Development :: Libraries",
21
+ "Topic :: Utilities",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ ]
27
+ requires-python = ">=3.11"
28
+ dependencies = [
29
+ "typer>=0.26.7",
30
+ "httpx>=0.27",
31
+ "pydantic>=2.13.4",
32
+ "tomlkit>=0.15.0",
33
+ "platformdirs>=4.10.0; sys_platform == 'win32'",
34
+ ]
35
+
36
+ [project.urls]
37
+ Homepage = "https://github.com/ambs/exist-shell"
38
+ Repository = "https://github.com/ambs/exist-shell"
39
+ Documentation = "https://ambs.github.io/exist-shell/"
40
+ Issues = "https://github.com/ambs/exist-shell/issues"
41
+ Changelog = "https://github.com/ambs/exist-shell/blob/main/CHANGELOG.md"
42
+
43
+ [project.scripts]
44
+ exsh = "exist_shell.main:app"
45
+
46
+ [tool.hatch.build.targets.wheel]
47
+ packages = ["src/exist_shell"]
48
+
49
+ [tool.ruff.lint]
50
+ select = ["D"]
51
+
52
+ [tool.ruff.lint.pydocstyle]
53
+ convention = "google"
54
+
55
+ [dependency-groups]
56
+ dev = [
57
+ "pytest>=8",
58
+ "pytest-cov>=5",
59
+ "pytest-httpx>=0.30",
60
+ "ruff>=0.15.16",
61
+ "ty>=0.0.46",
62
+ ]
@@ -157,7 +157,7 @@ toml = [
157
157
 
158
158
  [[package]]
159
159
  name = "exist-shell"
160
- version = "0.1.0"
160
+ version = "0.1.1"
161
161
  source = { editable = "." }
162
162
  dependencies = [
163
163
  { name = "httpx" },
@@ -1,10 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: exist-shell
3
- Version: 0.1.0
4
- Summary: Command-line tool to interact with eXist-db via REST
5
- Requires-Python: >=3.11
6
- Requires-Dist: httpx>=0.27
7
- Requires-Dist: platformdirs>=4.10.0; sys_platform == 'win32'
8
- Requires-Dist: pydantic>=2.13.4
9
- Requires-Dist: tomlkit>=0.15.0
10
- Requires-Dist: typer>=0.26.7
@@ -1,37 +0,0 @@
1
- [build-system]
2
- requires = ["hatchling"]
3
- build-backend = "hatchling.build"
4
-
5
- [project]
6
- name = "exist-shell"
7
- version = "0.1.0"
8
- description = "Command-line tool to interact with eXist-db via REST"
9
- requires-python = ">=3.11"
10
- dependencies = [
11
- "typer>=0.26.7",
12
- "httpx>=0.27",
13
- "pydantic>=2.13.4",
14
- "tomlkit>=0.15.0",
15
- "platformdirs>=4.10.0; sys_platform == 'win32'",
16
- ]
17
-
18
- [project.scripts]
19
- exsh = "exist_shell.main:app"
20
-
21
- [tool.hatch.build.targets.wheel]
22
- packages = ["src/exist_shell"]
23
-
24
- [tool.ruff.lint]
25
- select = ["D"]
26
-
27
- [tool.ruff.lint.pydocstyle]
28
- convention = "google"
29
-
30
- [dependency-groups]
31
- dev = [
32
- "pytest>=8",
33
- "pytest-cov>=5",
34
- "pytest-httpx>=0.30",
35
- "ruff>=0.15.16",
36
- "ty>=0.0.46",
37
- ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes