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.
- ivs_sessions_browser-4.0.2/.github/workflows/publish.yml +56 -0
- ivs_sessions_browser-4.0.2/.gitignore +66 -0
- ivs_sessions_browser-4.0.2/.vscode/extensions.json +11 -0
- ivs_sessions_browser-4.0.2/.vscode/keybindings.json.crap +8 -0
- ivs_sessions_browser-4.0.2/.vscode/launch.json +31 -0
- ivs_sessions_browser-4.0.2/.vscode/python.code-snippets +30 -0
- ivs_sessions_browser-4.0.2/.vscode/settings.json +50 -0
- ivs_sessions_browser-4.0.2/LICENSE +21 -0
- ivs_sessions_browser-4.0.2/PKG-INFO +323 -0
- ivs_sessions_browser-4.0.2/README.md +266 -0
- ivs_sessions_browser-4.0.2/Untitled 1.xlsx +0 -0
- ivs_sessions_browser-4.0.2/docs/ARCHITECTURE.md +143 -0
- ivs_sessions_browser-4.0.2/docs/FILTER_SYNTAX.md +212 -0
- ivs_sessions_browser-4.0.2/docs/KEY_BINDINGS.md +93 -0
- ivs_sessions_browser-4.0.2/docs/ROADMAP.md +252 -0
- ivs_sessions_browser-4.0.2/docs/USER_GUIDE.md +481 -0
- ivs_sessions_browser-4.0.2/docs/mark_down_cheats.png +0 -0
- ivs_sessions_browser-4.0.2/docs/session_notes.md +61 -0
- ivs_sessions_browser-4.0.2/operator_assignments.json.sos +21 -0
- ivs_sessions_browser-4.0.2/operators.json +20 -0
- ivs_sessions_browser-4.0.2/pdf_columns +3 -0
- ivs_sessions_browser-4.0.2/pyproject.toml +68 -0
- ivs_sessions_browser-4.0.2/requirements.txt +17 -0
- ivs_sessions_browser-4.0.2/run_browser +20 -0
- ivs_sessions_browser-4.0.2/scripts/run_sessions_browser.py +6 -0
- ivs_sessions_browser-4.0.2/setup.cfg +4 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/__init__.py +327 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/__main__.py +8 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/certs/README.md +15 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/certs/ivscc_chain.pem +37 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/defs.py +186 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/fetch_sessions.py +352 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/filter_and_sort.py +256 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/ivstypes.py +26 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/operators.json +18 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/operators.py +102 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/pdf_export.py +695 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/sessions_browser.py +901 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/statistics.py +810 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/tui.py +618 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/tui_state.py +123 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser/version.py +24 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/PKG-INFO +323 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/SOURCES.txt +46 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/dependency_links.txt +1 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/entry_points.txt +2 -0
- ivs_sessions_browser-4.0.2/src/ivs_sessions_browser.egg-info/requires.txt +9 -0
- 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,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
|