ivs-sessions-browser 4.0.2__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 (48) hide show
  1. ivs_sessions_browser-4.0.2/.github/workflows/publish.yml +56 -0
  2. ivs_sessions_browser-4.0.2/.gitignore +66 -0
  3. ivs_sessions_browser-4.0.2/.vscode/extensions.json +11 -0
  4. ivs_sessions_browser-4.0.2/.vscode/keybindings.json.crap +8 -0
  5. ivs_sessions_browser-4.0.2/.vscode/launch.json +31 -0
  6. ivs_sessions_browser-4.0.2/.vscode/python.code-snippets +30 -0
  7. ivs_sessions_browser-4.0.2/.vscode/settings.json +50 -0
  8. ivs_sessions_browser-4.0.2/LICENSE +21 -0
  9. ivs_sessions_browser-4.0.2/PKG-INFO +323 -0
  10. ivs_sessions_browser-4.0.2/README.md +266 -0
  11. ivs_sessions_browser-4.0.2/Untitled 1.xlsx +0 -0
  12. ivs_sessions_browser-4.0.2/docs/ARCHITECTURE.md +143 -0
  13. ivs_sessions_browser-4.0.2/docs/FILTER_SYNTAX.md +212 -0
  14. ivs_sessions_browser-4.0.2/docs/KEY_BINDINGS.md +93 -0
  15. ivs_sessions_browser-4.0.2/docs/ROADMAP.md +252 -0
  16. ivs_sessions_browser-4.0.2/docs/USER_GUIDE.md +481 -0
  17. ivs_sessions_browser-4.0.2/docs/mark_down_cheats.png +0 -0
  18. ivs_sessions_browser-4.0.2/docs/session_notes.md +61 -0
  19. ivs_sessions_browser-4.0.2/operator_assignments.json.sos +21 -0
  20. ivs_sessions_browser-4.0.2/operators.json +20 -0
  21. ivs_sessions_browser-4.0.2/pdf_columns +3 -0
  22. ivs_sessions_browser-4.0.2/pyproject.toml +68 -0
  23. ivs_sessions_browser-4.0.2/requirements.txt +17 -0
  24. ivs_sessions_browser-4.0.2/run_browser +20 -0
  25. ivs_sessions_browser-4.0.2/scripts/run_sessions_browser.py +6 -0
  26. ivs_sessions_browser-4.0.2/setup.cfg +4 -0
  27. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/__init__.py +327 -0
  28. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/__main__.py +8 -0
  29. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/certs/README.md +15 -0
  30. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/certs/ivscc_chain.pem +37 -0
  31. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/defs.py +186 -0
  32. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/fetch_sessions.py +352 -0
  33. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/filter_and_sort.py +256 -0
  34. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/ivstypes.py +26 -0
  35. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/operators.json +18 -0
  36. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/operators.py +102 -0
  37. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/pdf_export.py +695 -0
  38. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/sessions_browser.py +901 -0
  39. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/statistics.py +810 -0
  40. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/tui.py +618 -0
  41. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/tui_state.py +123 -0
  42. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/version.py +24 -0
  43. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/PKG-INFO +323 -0
  44. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/SOURCES.txt +46 -0
  45. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/dependency_links.txt +1 -0
  46. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/entry_points.txt +2 -0
  47. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/requires.txt +9 -0
  48. ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/top_level.txt +1 -0
@@ -0,0 +1,56 @@
1
+ name: Publish Python package
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ build:
13
+ name: Build distributions
14
+ runs-on: ubuntu-latest
15
+
16
+ steps:
17
+ - name: Check out repository
18
+ uses: actions/checkout@v4
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Set up Python
23
+ uses: actions/setup-python@v5
24
+ with:
25
+ python-version: "3.x"
26
+
27
+ - name: Install build backend
28
+ run: python -m pip install --upgrade build
29
+
30
+ - name: Build package
31
+ run: python -m build
32
+
33
+ - name: Store distributions
34
+ uses: actions/upload-artifact@v4
35
+ with:
36
+ name: python-package-distributions
37
+ path: dist/
38
+
39
+ publish:
40
+ name: Publish to PyPI
41
+ needs: build
42
+ runs-on: ubuntu-latest
43
+ environment: pypi
44
+ permissions:
45
+ contents: read
46
+ id-token: write
47
+
48
+ steps:
49
+ - name: Download distributions
50
+ uses: actions/download-artifact@v4
51
+ with:
52
+ name: python-package-distributions
53
+ path: dist/
54
+
55
+ - name: Publish package distributions to PyPI
56
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,66 @@
1
+ # Python bytecode and caches
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Virtual environments
7
+ .venv/
8
+ venv/
9
+ env/
10
+ ENV/
11
+
12
+ # Build / packaging
13
+ build/
14
+ dist/
15
+ .eggs/
16
+ *.egg-info/
17
+ *.egg
18
+ pip-wheel-metadata/
19
+
20
+ # Test / type-check / lint caches
21
+ .pytest_cache/
22
+ .mypy_cache/
23
+ .pytype/
24
+ .ruff_cache/
25
+ .coverage
26
+ .coverage.*
27
+ htmlcov/
28
+
29
+ # Jupyter
30
+ .ipynb_checkpoints/
31
+
32
+ # IDE / editor files
33
+ .idea/
34
+ *.swp
35
+ *.swo
36
+ *~
37
+
38
+ # OS files
39
+ .DS_Store
40
+ Thumbs.db
41
+
42
+ # Logs
43
+ *.log
44
+
45
+ # Local environment files
46
+ .env
47
+ .env.*
48
+
49
+ # Local runtime artifacts
50
+ .codex
51
+ *.pid
52
+ *.tmp
53
+
54
+ operator_assignments.json
55
+ src/ivs_sessions_browser/version.py
56
+
57
+ # Files suggested to be ignored by user
58
+ .editorconfig
59
+ .pre-commit-config.yaml
60
+ pyrightconfig.json
61
+ pytest.ini
62
+ ruff.toml
63
+ src/ivs_sessions_browser/_version.py
64
+ sessions*.pdf
65
+ software_flow.md
66
+ *.png
@@ -0,0 +1,11 @@
1
+ {
2
+ "recommendations": [
3
+ "ms-python.python",
4
+ "ms-python.vscode-pylance",
5
+ "ms-python.debugpy",
6
+ "charliermarsh.ruff",
7
+ "tamasfe.even-better-toml"
8
+ , "ryuta46.multi-command"
9
+ ]
10
+ }
11
+
@@ -0,0 +1,8 @@
1
+ [
2
+ {
3
+ "key": "ctrl+numpad_divide",
4
+ "command": "multiCommand.commentAndNextLine",
5
+ "when": "editorTextFocus && !editorReadonly"
6
+ }
7
+ ]
8
+
@@ -0,0 +1,31 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "configurations": [
4
+ {
5
+ "name": "ivs_sessions_browser (module)",
6
+ "type": "debugpy",
7
+ "request": "launch",
8
+ "module": "ivs_sessions_browser",
9
+ "args":["--scope", "both", "--filters", "stations:Ns|Nn", "--year", "2022-2024"],
10
+ "cwd": "${workspaceFolder}",
11
+ "env": {
12
+ "PYTHONPATH": "${workspaceFolder}/src"
13
+ },
14
+ "console": "integratedTerminal",
15
+ "justMyCode": true
16
+ },
17
+ {
18
+ "name": "run_sessions_browser.py (script)",
19
+ "type": "debugpy",
20
+ "request": "launch",
21
+ "program": "${workspaceFolder}/scripts/run_sessions_browser.py",
22
+ "cwd": "${workspaceFolder}",
23
+ "env": {
24
+ "PYTHONPATH": "${workspaceFolder}/src"
25
+ },
26
+ "console": "integratedTerminal",
27
+ "justMyCode": true
28
+ }
29
+ ]
30
+ }
31
+
@@ -0,0 +1,30 @@
1
+ {
2
+ "Docstring with filename": {
3
+ "scope": "python",
4
+ "prefix": "docf",
5
+ "description": "Docstring header with current filename",
6
+ "body": [
7
+ "\"\"\"",
8
+ "Defined in ${TM_FILENAME}",
9
+ "",
10
+ "${1:Describe what this function does.}",
11
+ "\"\"\""
12
+ ]
13
+ },
14
+ "Module docstring with filename": {
15
+ "scope": "python",
16
+ "prefix": "moddocf",
17
+ "description": "Module docstring including metadata and current filename",
18
+ "body": [
19
+ "\"\"\"",
20
+ "Defined in ${TM_FILENAME}",
21
+ "",
22
+ "Filename: ${TM_FILENAME}",
23
+ "Author: ${1:your_name}",
24
+ "Created: ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}",
25
+ "",
26
+ "Description: ${2:Module description}",
27
+ "\"\"\""
28
+ ]
29
+ }
30
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ // Use the repo venv
3
+ "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
4
+ // Make 'src' layout import-friendly for analysis/autocomplete
5
+ "python.analysis.extraPaths": [
6
+ "${workspaceFolder}/src"
7
+ ],
8
+ // Testing
9
+ "python.testing.pytestEnabled": true,
10
+ "python.testing.unittestEnabled": false,
11
+ "python.testing.pytestArgs": [
12
+ "-q"
13
+ ],
14
+ // Editor hygiene
15
+ "files.exclude": {
16
+ "**/__pycache__": true,
17
+ "**/*.pyc": true
18
+ },
19
+ "search.exclude": {
20
+ "**/__pycache__": true,
21
+ "**/*.pyc": true,
22
+ ".venv": true
23
+ },
24
+ // Optional but strongly recommended: format-on-save
25
+ "editor.formatOnSave": false,
26
+ "editor.codeActionsOnSave": {
27
+ "source.organizeImports": "never",
28
+ "source.fixAll": "never"
29
+ },
30
+ "editor.tabSize": 4,
31
+ "editor.insertSpaces": true,
32
+ "editor.detectIndentation": false,
33
+ // Show vertical ruler at column 80
34
+ "editor.rulers": [80],
35
+ "editor.wordWrap": "off",
36
+ // Configure the multi-command sequences (requires ryuta46.multi-command extension)
37
+ "multiCommand.commands": [
38
+ {
39
+ "command": "multiCommand.commentAndNextLine",
40
+ "sequence": [
41
+ "editor.action.commentLine",
42
+ "cursorDown"
43
+ ]
44
+ }
45
+ ],
46
+ // Workbench color customizations: dim unused code instead of error color
47
+ "workbench.colorCustomizations": {
48
+ "editorUnnecessary.foreground": "#6c757d"
49
+ }
50
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Jon Leithe
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,323 @@
1
+ Metadata-Version: 2.4
2
+ Name: ivs-sessions-browser
3
+ Version: 4.0.2
4
+ Summary: A terminal-based TUI for browsing IVS session schedules with fast filtering and keyboard navigation
5
+ Author: jole
6
+ License: MIT License
7
+
8
+ Copyright (c) 2025 Jon Leithe
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/jonleithe/ivs_sessions_browser
29
+ Project-URL: Repository, https://github.com/jonleithe/ivs_sessions_browser
30
+ Project-URL: Documentation, https://github.com/jonleithe/ivs_sessions_browser/tree/v4/docs
31
+ Project-URL: Issues, https://github.com/jonleithe/ivs_sessions_browser/issues
32
+ Keywords: ivs,vlbi,sessions,tui,curses
33
+ Classifier: Development Status :: 4 - Beta
34
+ Classifier: Environment :: Console :: Curses
35
+ Classifier: Intended Audience :: Science/Research
36
+ Classifier: License :: OSI Approved :: MIT License
37
+ Classifier: Operating System :: POSIX :: Linux
38
+ Classifier: Programming Language :: Python :: 3
39
+ Classifier: Programming Language :: Python :: 3.10
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Programming Language :: Python :: 3.13
43
+ Classifier: Programming Language :: Python :: 3.14
44
+ Classifier: Topic :: Scientific/Engineering
45
+ Requires-Python: >=3.10
46
+ Description-Content-Type: text/markdown
47
+ License-File: LICENSE
48
+ Requires-Dist: requests>=2.31
49
+ Requires-Dist: beautifulsoup4>=4.12
50
+ Requires-Dist: python-dateutil>=2.8
51
+ Requires-Dist: reportlab>=4.0
52
+ Requires-Dist: matplotlib>=3.8
53
+ Requires-Dist: tqdm>=4.65
54
+ Provides-Extra: dev
55
+ Requires-Dist: pytest>=7.0; extra == "dev"
56
+ Dynamic: license-file
57
+
58
+ # IVS Sessions Browser v4 (dev)
59
+
60
+ A terminal-based TUI for browsing [IVS session schedules](https://ivscc.gsfc.nasa.gov/sessions/): master and intensives, with fast filtering, keyboard navigation, and colorized status.
61
+
62
+ It is worth noting that this script is developed on Linux, for Linux terminal and optimized for a dark background!
63
+ It is not tested by me on anything else.
64
+ If you have any question, comment or feedback to this script; [Send email](mailto:dev@jonleithe.no?subject=Contact%20from%20github)
65
+ -jole 2026
66
+
67
+ - **TUI**: curses interface with smooth navigation
68
+ - **Filters**: powerful, composable query language
69
+ - **Colors**: quick status scanning (Released / Processing / Waiting / Cancelled / None)
70
+ - **Open in browser**: jump to the IVS page for a session
71
+ - **Station filtering**: filter active/removed/all station sets in expressions
72
+ - **Jump to today**: one-key shortcut to the current session row
73
+ - **Inline help**: `?` shows a centered help box
74
+
75
+ See also:
76
+ - 📄 [`docs/USER_GUIDE.md`](docs/USER_GUIDE.md)
77
+ - 🔎 [`docs/FILTER_SYNTAX.md`](docs/FILTER_SYNTAX.md)
78
+ - ⌨️ [`docs/KEY_BINDINGS.md`](docs/KEY_BINDINGS.md)
79
+ - 🗺️ [`docs/ROADMAP.md`](docs/ROADMAP.md)
80
+
81
+ ---
82
+
83
+ ## Project layout
84
+
85
+ ```
86
+ ivs_sessions_browser/
87
+ ├─ docs/
88
+ │ ├─ ARCHITECTURE.md
89
+ │ ├─ FILTER_SYNTAX.md
90
+ │ ├─ KEY_BINDINGS.md
91
+ │ ├─ ROADMAP.md
92
+ │ └─ USER_GUIDE.md
93
+ ├─ scripts/
94
+ │ └─ run_sessions_browser.py # launcher (imports package main)
95
+ ├─ src/
96
+ │ └─ ivs_sessions_browser/
97
+ │ ├─ __init__.py # CLI entry point (main())
98
+ │ ├─ __main__.py # allows `python -m ivs_sessions_browser`
99
+ │ ├─ operators.json # packaged default operator bindings
100
+ │ ├─ defs.py # constants, headers, argument help text
101
+ │ ├─ fetch_sessions.py # network fetch + response handling
102
+ │ ├─ filter_and_sort.py # filtering and sorting logic
103
+ │ ├─ ivstypes.py # type definitions and data classes
104
+ │ ├─ operators.py # operator management and persistence
105
+ │ ├─ sessions_browser.py # main TUI loop and orchestration
106
+ │ ├─ tui.py # TUI rendering (headers, rows, help)
107
+ │ ├─ tui_state.py # UI state dataclass and theme
108
+ │ └─ version.py # version info (generated by setuptools-scm)
109
+ ├─ operators.json # source copy of default operator bindings
110
+ ├─ operator_assignments.json # local assignment file, ignored by git
111
+ ├─ pyproject.toml
112
+ ├─ requirements.txt # python requirements for the project
113
+ ├─ run_browser # bash wrapper script
114
+ ├─ LICENSE
115
+ └─ README.md
116
+ ```
117
+
118
+ > **Note:** The project uses the **src/** layout. For development, install it with `pip install -e .`.
119
+ > Inside PyCharm, mark `src/` as **Sources Root** or use the editable virtualenv interpreter.
120
+ > User-editable settings are read from `~/.config/ivs_sessions_browser/`.
121
+
122
+ ---
123
+
124
+ ## Requirements
125
+
126
+ - Python **3.10+**
127
+ - Linux/macOS terminal with curses support
128
+ Windows users: `pip install windows-curses`
129
+ - Internet access to fetch schedules from ivscc.gsfc.nasa.gov, or any of the mirror sites
130
+
131
+ ---
132
+
133
+ ## Installation
134
+
135
+ ```bash
136
+ git clone git@github.com:jonleithe/ivs_sessions_browser.git
137
+ cd ivs_sessions_browser
138
+
139
+ python3 -m venv .venv
140
+ source .venv/bin/activate # Windows PowerShell: .\.venv\Scripts\Activate.ps1
141
+
142
+ pip install -r requirements.txt
143
+ ```
144
+
145
+ ### Editable development install
146
+
147
+ ```bash
148
+ pip install -e .
149
+ ```
150
+
151
+ You can now run:
152
+ ```bash
153
+ ivs-sessions-browser
154
+ ```
155
+ On Windows, use `.\.venv\Scripts\ivs-sessions-browser.exe`.
156
+
157
+ ---
158
+
159
+ ## How to run (terminal)
160
+
161
+ You have multiple equivalent ways. Pick your favorite:
162
+
163
+ ### A) Console script (recommended after install)
164
+
165
+ ```bash
166
+ ivs-sessions-browser
167
+ ```
168
+
169
+ ### B) Wrapper script
170
+
171
+ `run_browser` is included in the project root:
172
+
173
+ ```bash
174
+ ./run_browser
175
+ ```
176
+
177
+ ### C) Run the package as a module
178
+
179
+ ```bash
180
+ python -m ivs_sessions_browser
181
+ ```
182
+
183
+ ---
184
+
185
+ ## Usage
186
+
187
+ Most usage is interactive (TUI). Command-line flags typically include:
188
+
189
+ ```
190
+ --year 2025 # single year
191
+ --year "2022,2023" # explicit multi-year list
192
+ --year "2022-2025" # inclusive year range
193
+ --scope master|intensive|both # select scope
194
+ --filters "code:R1|R4" # initial filter expression
195
+ --output - # write text output to stdout and exit
196
+ --pretty-print OP|TYPE|STATIONS
197
+ --format pdf # write a colored PDF using the same pretty-printed lines
198
+ --verbose-fetch # show fetch/progress output even with --output
199
+ ```
200
+
201
+ Run with `-h/--help` (help) to see current options.
202
+
203
+ Once inside the TUI:
204
+ - Use arrow keys / PgUp / PgDn / Home / End to navigate
205
+ - Press `T` to jump to today
206
+ - Press `/` to enter/edit a filter
207
+ - Press `C` to clear filters
208
+ - Press `0-5` to assign an operator to the selected session (or clear with '0')
209
+ - Press `Enter` to open the selected session in your browser
210
+ - Press `?` for inline help
211
+ - Press `q/Q` to quit
212
+
213
+ ### Inline help (`?`)
214
+
215
+ ```
216
+ Navigation:
217
+ ↑ ↓ PgUp PgDn Home End Move around the session list
218
+ T Jump to today’s session
219
+ Enter Open session page in web browser
220
+ q or Q Quit
221
+
222
+ Filtering:
223
+ / Enter a filter expression
224
+ C Clear current filters
225
+ Examples:
226
+ code:R1|R4 → match sessions with code R1 or R4
227
+ stations:Nn&Ns → sessions including both Nn and Ns
228
+ stations_removed:Ft|Ur → removed stations include Ft or Ur
229
+
230
+ Operator Assignment:
231
+ 0-5 Assign operator to selected session
232
+ (operators configured in ~/.config/ivs_sessions_browser/operators.json)
233
+
234
+ Other:
235
+ ? Show this help screen
236
+
237
+ Notes:
238
+ - Station names are **case-sensitive**
239
+ - Other fields are **case-insensitive**
240
+ - Clauses separated by `;` are AND
241
+ - Tokens separated by space, `,`, `+`, or `|` are OR
242
+ ```
243
+
244
+ Full details:
245
+ - 🔎 Filtering: [`docs/FILTER_SYNTAX.md`](docs/FILTER_SYNTAX.md)
246
+ - ⌨️ Keys: [`docs/KEY_BINDINGS.md`](docs/KEY_BINDINGS.md)
247
+
248
+ ## Export formats
249
+
250
+ - `--format text` writes the ANSI-colored textual listing.
251
+ - `--format pdf` writes a monospaced PDF that preserves the existing header and row colors from the textual export.
252
+ - `--append` only applies to text output; PDF export always writes a new file.
253
+
254
+ Example:
255
+
256
+ ```bash
257
+ ./run_browser --year 2025 --output sessions.pdf --format pdf
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Filter basics (quick primer)
263
+
264
+ - Clauses separated by `;` are **AND**.
265
+ - **Stations** fields are **case-sensitive**.
266
+ - Other fields are **case-insensitive**.
267
+ - Within a non-station field, tokens split by space/comma/`+`/`|` are **OR**.
268
+
269
+ Examples:
270
+ - `code:R1|R4` → codes matching R1 **or** R4
271
+ - `stations:Nn&Ns` → requires **both** Nn **and** Ns present (active stations)
272
+ - `stations_removed:Ag|Kk` → removed stations include Ag **or** Kk
273
+ - `stations_active:Ft|Ur` → active stations include Ft **or** Ur
274
+ - `stations_all:Ke|Oe` → any stations (active or removed) include Ke **or** Oe
275
+ - Combine filters: `code:R1|R4; stations:Nn&Ns; status:released`
276
+
277
+ ---
278
+
279
+ ## Troubleshooting
280
+
281
+ **`ModuleNotFoundError: No module named 'ivs_sessions_browser'`**
282
+ Use one of:
283
+ - `pip install -e .`, then `ivs-sessions-browser`
284
+ - `./run_browser` wrapper
285
+ - In PyCharm, use the project virtualenv or mark `src/` as Sources Root
286
+
287
+ **Windows: curses import error**
288
+ Install: `pip install windows-curses`.
289
+
290
+ **No colors / weird characters**
291
+ Use a modern terminal with UTF-8 and 256-color support; ensure `$TERM` is e.g. `xterm-256color`.
292
+
293
+ ---
294
+
295
+ ## Versioning
296
+
297
+ This project uses **setuptools-scm**. Version strings are derived from Git tags.
298
+ To cut a release:
299
+ ```bash
300
+ git tag v3.0
301
+ git push --tags
302
+ ```
303
+
304
+ ---
305
+
306
+ ## Contributing
307
+
308
+ - Keep the TUI responsive; avoid blocking network calls on the UI thread.
309
+ - Prefer small, focused modules under `src/ivs_sessions_browser/`.
310
+ - Write clear commit messages; tag releases for versioning.
311
+
312
+ ---
313
+
314
+ ## License
315
+
316
+ MIT — see [LICENSE](LICENSE).
317
+
318
+ ---
319
+
320
+ ## Acknowledgments
321
+
322
+ - IVS Central Bureau & Goddard Space Flight Center for session listings
323
+ - Contributors and testers across Ny-Ålesund & Brandal observatories