microlens-submit 0.16.2__tar.gz → 0.16.4__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 (47) hide show
  1. microlens_submit-0.16.4/CHANGELOG.md +282 -0
  2. microlens_submit-0.16.4/CITATION.cff +9 -0
  3. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/MANIFEST.in +4 -0
  4. {microlens_submit-0.16.2/microlens_submit.egg-info → microlens_submit-0.16.4}/PKG-INFO +15 -10
  5. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/README.md +13 -9
  6. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/__init__.py +1 -1
  7. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/commands/export.py +49 -8
  8. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/commands/init.py +16 -12
  9. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/commands/solutions.py +87 -34
  10. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/main.py +2 -1
  11. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/error_messages.py +2 -1
  12. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/models/solution.py +6 -0
  13. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/models/submission.py +33 -2
  14. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/text_symbols.py +22 -1
  15. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/tier_validation.py +41 -35
  16. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/utils.py +8 -1
  17. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/validate_parameters.py +46 -0
  18. {microlens_submit-0.16.2 → microlens_submit-0.16.4/microlens_submit.egg-info}/PKG-INFO +15 -10
  19. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit.egg-info/SOURCES.txt +2 -0
  20. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit.egg-info/requires.txt +1 -0
  21. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/pyproject.toml +2 -1
  22. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/setup.py +1 -1
  23. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/tests/test_cli.py +7 -7
  24. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/tests/test_dossier_generation.py +1 -1
  25. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/tests/test_dossier_pages.py +1 -1
  26. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/tests/test_tier_validation.py +57 -56
  27. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/LICENSE +0 -0
  28. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/assets/github-desktop_logo.png +0 -0
  29. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/assets/rges-pit_logo.png +0 -0
  30. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/__init__.py +0 -0
  31. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/__main__.py +0 -0
  32. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/commands/__init__.py +0 -0
  33. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/commands/dossier.py +0 -0
  34. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/cli/commands/validation.py +0 -0
  35. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/dossier/__init__.py +0 -0
  36. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/dossier/dashboard.py +0 -0
  37. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/dossier/event_page.py +0 -0
  38. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/dossier/full_report.py +0 -0
  39. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/dossier/solution_page.py +0 -0
  40. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/dossier/utils.py +0 -0
  41. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/models/__init__.py +0 -0
  42. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit/models/event.py +0 -0
  43. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit.egg-info/dependency_links.txt +0 -0
  44. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit.egg-info/entry_points.txt +0 -0
  45. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/microlens_submit.egg-info/top_level.txt +0 -0
  46. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/setup.cfg +0 -0
  47. {microlens_submit-0.16.2 → microlens_submit-0.16.4}/tests/test_api.py +0 -0
@@ -0,0 +1,282 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.16.4] - 2026-01-14
9
+
10
+ ### Added
11
+ - Added `remove-event`/`remove-solution` CLI commands and `remove_event`/`remove_solution` API helpers with a `--force` guard for hard deletes.
12
+ - Added `git_dir` metadata plus `set-git-dir` to capture Git info when the repo lives outside the submission directory.
13
+ - Added optional GPU fields in `hardware_info` (`gpu.model`, `gpu.count`, `gpu.memory_gb`) alongside platform/OS capture.
14
+ - Added non-Nexus hardware auto-fill using `psutil` for CPU and memory details.
15
+ - Added conda-forge recipe (`conda/recipe/meta.yaml`) to the version bump script (`scripts/bump_version`).
16
+ - Added sha256 update in `conda/recipe/meta.yaml` to the release workflow.
17
+ - Added a workflow release job to copy the local updated version on the conda-forge recipe to the feedstock fork (`AmberLee2427/microlens-submit-feedstock`) and send a PR, after PyPI release.
18
+
19
+
20
+ ### Changed
21
+ - Updated tiers to `beginner`/`experienced`; event ID validation now uses inclusive ranges and 3-digit IDs for `2018-test`.
22
+ - CLI numeric parsing now accepts leading decimals like `.001`.
23
+ - Clarified quickstart/tutorial guidance around working directories and hardware info requirements.
24
+
25
+
26
+ ### Fixed
27
+ - CSV import now skips blank rows to avoid NoneType parsing errors.
28
+ - Validation messaging now highlights missing bands when flux parameters are provided.
29
+ - Improved Windows notes editor fallback for better default editor selection.
30
+
31
+
32
+ ## [0.16.3] - 2025-10-28
33
+
34
+ ### Added
35
+ - Publish to `conda-forge`.
36
+
37
+ ### Fixed
38
+ - Include `pyproject.toml` and other metadata in the sdist so `pip install .` works (fixes conda builds).
39
+
40
+ ## [0.16.2] - 2025-10-28
41
+
42
+ ### Added
43
+ - conda build to release action
44
+ - local `.env` support
45
+ - Zenodo doi automation
46
+ - build wheel and conda build install smoke tests on Mac, Linux, and Windows, python 3.8 and 3.11
47
+
48
+
49
+ ## [0.16.1] - 2025-10-27
50
+
51
+ ### Added
52
+ - Release automation
53
+ - CI now installs from the wheel across 3.8/3.12 to mirror beta testers’ reports
54
+
55
+ ### Changed
56
+ - `README.md` to clarify Quickstart
57
+
58
+ ### Fixed
59
+ - `importlib_resources` version bug
60
+
61
+
62
+ ## [0.16.0] - 2024-12-19
63
+
64
+ ### Added
65
+ - **Tier Validation System**: Comprehensive tier-based validation for challenge submissions
66
+ - New `tier_validation.py` module with support for "standard", "advanced", "test", "2018-test", and "None" tiers
67
+ - Event ID validation against tier-specific event lists
68
+ - CLI tier validation with fallback to "None" for invalid tiers
69
+ - Comprehensive tier validation tests in `tests/test_tier_validation.py`
70
+ - **Enhanced Validation Logic**: Improved parameter validation and solution completeness checking
71
+ - Enhanced `validate_parameters.py` with better error messages and validation rules
72
+ - Improved validation for higher-order effects and parameter consistency
73
+ - Better handling of parameter uncertainties and type validation
74
+ - Enhanced solution completeness checking with more detailed feedback
75
+ - **Dossier Generation Enhancements**: Improved HTML dossier generation and browser integration
76
+ - Added model_type display at the top of each solution section in full dossier reports
77
+ - Added `--open` flag to `microlens-submit generate-dossier` CLI command for automatic browser opening
78
+ - Added `open: bool = False` parameter to `generate_dashboard_html()` API function
79
+ - Enhanced dossier navigation and metadata display
80
+ - **Submission Manual Integration**: Converted SUBMISSION_MANUAL.md to reStructuredText format and integrated into Sphinx documentation
81
+ - Moved submission manual to `docs/submission_manual.rst` for better documentation integration
82
+ - Updated all internal links and references to point to the new documentation location
83
+ - Added GitHub link to validate_submission.py script in the submission manual
84
+ - Removed old markdown file and logo references for cleaner documentation structure
85
+
86
+ ### Changed
87
+ - **Validation System Architecture**: Improved validation workflow and error handling
88
+ - Enhanced CLI validation commands with better error reporting
89
+ - Improved validation integration across all CLI commands
90
+ - Better handling of validation warnings vs errors
91
+ - Enhanced parameter validation with more detailed feedback
92
+ - **Code Quality & Pre-commit Integration**: Comprehensive code cleanup and formatting improvements
93
+ - Fixed all pre-commit hook violations including line length, unused imports, and style issues
94
+ - Resolved f-string formatting issues in CLI commands
95
+ - Fixed line length violations in dossier generation code
96
+ - Removed unused imports across the codebase
97
+ - Ensured all tests pass in both Python 3.8 and 3.11 environments
98
+ - **Documentation Structure**: Improved documentation organization and accessibility
99
+ - Integrated submission manual into main documentation site
100
+ - Updated internal documentation links and references
101
+ - Enhanced documentation consistency and maintainability
102
+ - Updated API documentation and tutorial examples
103
+
104
+ ### Fixed
105
+ - **Code Quality**: Resolved all pre-commit hook violations
106
+ - Fixed f-string formatting issues in CLI commands
107
+ - Resolved line length violations in dossier generation code
108
+ - Removed unused imports across the codebase
109
+ - Improved code consistency and maintainability
110
+ - **Validation Logic**: Enhanced parameter validation and error handling
111
+ - Improved validation for higher-order effects
112
+ - Better handling of parameter uncertainties
113
+ - Enhanced solution completeness checking
114
+ - More detailed validation feedback and error messages
115
+
116
+ ## [0.15.0] - 2024-12-19
117
+
118
+ ### Added
119
+ - New tier validation system with support for "standard", "advanced", "test", "2018-test", and "None" tiers
120
+ - Event ID validation against tier-specific event lists
121
+ - CLI tier validation with fallback to "None" for invalid tiers
122
+ - Comprehensive tier validation tests
123
+
124
+ ### Changed
125
+ - Renamed "basic" tier to "standard" for better naming
126
+ - Updated tier hierarchy: standard < advanced (removed "expert" tier)
127
+ - Simplified to two challenge tiers: "standard" and "advanced"
128
+
129
+ ## [0.14.0] - 2024-12-19
130
+
131
+ ### Added
132
+ - **Modular Architecture**: Complete refactoring of the codebase for improved maintainability
133
+ - Split monolithic `dossier.py` into modular `dossier/` package with specialized modules
134
+ - Refactored CLI into `cli/` package with commands organized into separate modules
135
+ - Created `dossier/generator.py` for HTML generation logic
136
+ - Created `dossier/templates.py` for template management
137
+ - Created `dossier/utils.py` for dossier-specific utilities
138
+ - Created `cli/commands/` directory with specialized command modules
139
+ - Created `cli/utils.py` for CLI-specific utilities
140
+ - **Enhanced Error Messaging**: Comprehensive error handling improvements
141
+ - Added actionable suggestions for common typos and parameter errors
142
+ - Integrated validation warnings with helpful guidance
143
+ - Enhanced CLI error messages with specific recommendations
144
+ - Added parameter validation with user-friendly error descriptions
145
+ - **Improved CLI Help**: Enhanced command-line interface usability
146
+ - Added [BASIC] and [ADVANCED] tags to help users understand option complexity
147
+ - Improved option descriptions with practical usage examples
148
+ - Enhanced help text for complex parameters like `--limb-darkening-model`
149
+ - Added usage examples in command docstrings for better user guidance
150
+
151
+ ### Changed
152
+ - **Code Organization**: Improved project structure and maintainability
153
+ - Separated concerns between dossier generation, CLI commands, and utilities
154
+ - Enhanced code readability and debugging capabilities
155
+ - Maintained backward compatibility with existing API and CLI interfaces
156
+ - Preserved all existing functionality while improving internal organization
157
+ - **Documentation**: Updated internal documentation to reflect new modular structure
158
+ - Enhanced docstrings with usage examples and parameter descriptions
159
+ - Improved code comments for better developer experience
160
+ - Maintained user-facing documentation consistency
161
+
162
+ ### Fixed
163
+ - **Maintainability**: Resolved technical debt through modularization
164
+ - Eliminated monolithic files that were difficult to maintain
165
+ - Improved test organization and coverage
166
+ - Enhanced code reusability and separation of concerns
167
+ - **User Experience**: Better error handling and guidance
168
+ - More helpful error messages with actionable suggestions
169
+ - Clearer CLI help text with practical examples
170
+ - Improved parameter validation with user-friendly feedback
171
+
172
+ ## [0.13.0] - 2024-12-19
173
+
174
+ ### Added
175
+ - **Bulk CSV Import**: New CLI command `import-solutions` and API function `import_solutions_from_csv()` for importing multiple solutions from a CSV file in one step
176
+ - Supports column mapping via YAML parameter map files
177
+ - Handles solution aliases with uniqueness validation within events
178
+ - Supports duplicate handling (error/override/ignore), notes, dry-run, and validation options
179
+ - Properly converts literal `\n` characters to actual newlines in notes from CSV files
180
+ - See the tutorial and README for usage examples
181
+ - **Solution Aliases**: Human-readable identifiers for solutions with automatic uniqueness validation
182
+ - Aliases are displayed prominently in dossier generation and CLI output
183
+ - Integrated into all CLI commands that reference solutions
184
+ - Supports alias-based solution identification and management
185
+ - **Enhanced Notes Handling**: Improved handling of notes with literal escape sequences
186
+ - CSV import automatically converts literal `\n` and `\r` to actual newlines
187
+ - Added `convert_escapes` parameter to `set_notes()` method for controlled conversion
188
+ - Maintains backward compatibility with existing notes functionality
189
+ - **Test Data**: Added `tests/data/test_import.csv` as a comprehensive test file for CSV import functionality
190
+ - Used in both CLI and API tests as a real-world example and template for users
191
+ - Includes various parameter types, aliases, notes, and edge cases for testing
192
+
193
+ ### Changed
194
+ - **Code Quality**: Improved formatting and readability throughout the codebase
195
+ - Added proper spacing and logical grouping in dense functions
196
+ - Enhanced code maintainability and debugging capabilities
197
+ - **Documentation**: Updated tutorial, README, and API documentation to cover CSV import and alias features
198
+ - **CLI Enhancements**: Added alias support to all solution-related CLI commands
199
+
200
+ ### Fixed
201
+ - **Notes Rendering**: Fixed issue where literal `\n` characters in notes were rendered as text instead of line breaks in HTML
202
+ - CSV import now properly converts escape sequences to actual newlines
203
+ - Maintains compatibility with existing notes that don't need conversion
204
+
205
+ ## [0.12.2] - 2024-12-19
206
+
207
+ ### Fixed
208
+ - **Critical Bug Fix**: Renamed `Solution.validate()` method to `Solution.run_validation()` to resolve Pydantic conflict
209
+ - Pydantic was interpreting the `validate` method as a field validator, causing import errors
210
+ - This was breaking Sphinx documentation generation and module imports
211
+ - All references updated across API, CLI, tests, and documentation
212
+ - Method functionality remains identical, only the name changed
213
+
214
+ ### Changed
215
+ - Updated all documentation and examples to use `run_validation()` instead of `validate()`
216
+ - Updated CLI commands and help text for consistency
217
+ - Updated test suite to use the new method name
218
+
219
+ ## [0.12.1] - 2024-12-19
220
+
221
+ ### Added
222
+ - **New CLI Command**: `set-hardware-info` for managing compute platform information
223
+ - Supports setting CPU, memory, platform, and Nexus image details
224
+ - Includes `--clear`, `--dry-run`, and update options
225
+ - Integrates with dossier generation for hardware documentation
226
+ - **Enhanced Documentation**: Comprehensive improvements to Sphinx documentation
227
+ - Expanded API reference with detailed examples and best practices
228
+ - Enhanced tutorial with step-by-step workflow and troubleshooting
229
+ - Improved index page with key features and quick start guide
230
+ - Added custom CSS styling for RGES-PIT color scheme
231
+ - **Example Parameter Files**: Created comprehensive example parameter files
232
+ - `tests/example_params.yaml` and `tests/example_params.json`
233
+ - Demonstrates different parameter formats, uncertainties, and model types
234
+ - Useful for testing and tutorial purposes
235
+
236
+ ### Changed
237
+ - **Version Update**: Bumped version from v0.12.0-dev to v0.12.1
238
+ - **Documentation**: Updated all version references across codebase
239
+ - **Tutorial**: Updated CLI commands in `Submission_Tool_Tutorial.ipynb` to match current syntax
240
+ - **GitHub Logo**: Ensured GitHub logo is properly packaged and included in dossier generation
241
+
242
+ ### Fixed
243
+ - **CI Test Failures**: Fixed test assertions for CLI comparison and validation commands
244
+ - Updated table header counting logic for solution comparison output
245
+ - Added missing repo_url setting in validation tests
246
+ - **Documentation Build**: Improved Sphinx configuration for better autodoc and theme options
247
+
248
+ ## [0.12.0] - 2024-12-18
249
+
250
+ ### Added
251
+ - **Comprehensive Documentation**: Complete Sphinx documentation with API reference, tutorial, and examples
252
+ - **Enhanced Dossier Generation**: Improved HTML dashboard with better styling and navigation
253
+ - **Parameter File Support**: Added support for JSON and YAML parameter files in CLI
254
+ - **Validation System**: Centralized parameter validation with comprehensive error checking
255
+ - **Hardware Information**: Automatic detection and manual setting of compute platform details
256
+ - **Notes Management**: Enhanced markdown notes support with file-based editing
257
+ - **Solution Comparison**: BIC-based solution ranking and relative probability calculation
258
+ - **Export Improvements**: Better handling of external files and automatic path updates
259
+
260
+ ### Changed
261
+ - **API Improvements**: Enhanced Solution and Submission classes with better validation
262
+ - **CLI Enhancements**: More robust command-line interface with better error handling
263
+ - **Project Structure**: Improved organization with better separation of concerns
264
+
265
+ ### Fixed
266
+ - **Bug Fixes**: Various fixes for data persistence, validation, and export functionality
267
+ - **Documentation**: Comprehensive docstring updates with Google style formatting
268
+
269
+ ## [0.11.0] - 2024-12-17
270
+
271
+ ### Added
272
+ - **Initial Release**: Basic submission management functionality
273
+ - **Core API**: Solution, Event, and Submission classes
274
+ - **CLI Interface**: Basic command-line tools for project management
275
+ - **Export Functionality**: ZIP archive creation for submissions
276
+
277
+ ### Changed
278
+ - **Project Structure**: Organized code into logical modules
279
+ - **Documentation**: Basic README and docstrings
280
+
281
+ ### Fixed
282
+ - **Initial Implementation**: Core functionality for microlensing submission management
@@ -0,0 +1,9 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use microlens-submit, please cite it as below."
3
+ title: "microlens-submit"
4
+ version: "0.16.4"
5
+ authors:
6
+ - family-names: Malpas
7
+ given-names: Amber
8
+ url: "https://github.com/AmberLee2427/microlens-submit"
9
+ doi: "10.5281/zenodo.18246117"
@@ -1,2 +1,6 @@
1
1
  include microlens_submit/assets/rges-pit_logo.png
2
2
  include microlens_submit/assets/github-desktop_logo.png
3
+ include pyproject.toml
4
+ include README.md
5
+ include CHANGELOG.md
6
+ include CITATION.cff
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microlens-submit
3
- Version: 0.16.2
3
+ Version: 0.16.4
4
4
  Summary: A tool for managing and submitting microlensing solutions
5
5
  Home-page: https://github.com/AmberLee2427/microlens-submit
6
6
  Author: Amber Malpas
@@ -29,6 +29,7 @@ Requires-Dist: typer[all]>=0.9.0
29
29
  Requires-Dist: rich>=13.0.0
30
30
  Requires-Dist: pyyaml>=6.0
31
31
  Requires-Dist: markdown>=3.4.0
32
+ Requires-Dist: psutil>=5.9.0
32
33
  Requires-Dist: importlib_resources>=1.0.0; python_version < "3.9"
33
34
  Provides-Extra: dev
34
35
  Requires-Dist: pytest; extra == "dev"
@@ -97,15 +98,19 @@ You can pass ``--no-color`` to any command if your terminal does not support ANS
97
98
  1. Initialize your project:
98
99
 
99
100
  ```bash
100
- microlens-submit init --team-name "Planet Pounders" --tier "advanced"
101
- # if a project directory was provided to `init`, you should now `cd` into that project
101
+ microlens-submit init --team-name "Planet Pounders" --tier "experienced" ./my_submission
102
+ cd ./my_submission
102
103
  ```
103
104
 
104
- To pass validation, you need to have provided a `repo_url` and `hardware_info` to the project and have a git project initialized in your sumission-project directory.
105
+ If you prefer to initialize inside an existing folder, run `microlens-submit init` without a path after `cd` into it.
106
+
107
+ To pass validation, you need to have provided a `repo_url` and `hardware_info` to the project and have a git project initialized in your sumission-project directory. On Roman Nexus, you can use `microlens-submit nexus-init` to auto-populate hardware info.
105
108
 
106
109
  ```bash
107
110
  microlens-submit set-repo-url <url> ./
108
111
  microlens-submit set-hardware-info --cpu-details "intel i7 xxx" --ram-gb 32 ./
112
+ # if your git repo lives elsewhere:
113
+ microlens-submit set-git-dir /path/to/repo ./
109
114
  ```
110
115
  2. Add a new solution to an event:
111
116
 
@@ -152,7 +157,7 @@ import microlens_submit
152
157
  # Load or create the project
153
158
  sub = microlens_submit.load(project_path="./my_challenge_submission")
154
159
  sub.team_name = "Planet Pounders"
155
- sub.tier = "advanced"
160
+ sub.tier = "experienced"
156
161
 
157
162
  # Get an event and add a solution
158
163
  evt = sub.get_event("ogle-2025-blg-0042")
@@ -201,15 +206,15 @@ import this file directly.
201
206
 
202
207
  Bibtex:
203
208
  ```
204
- @software{malpas_2025_17460500,
209
+ @software{malpas_2025_18246117,
205
210
  author = {Malpas, Amber},
206
211
  title = {microlens-submit},
207
212
  month = oct,
208
213
  year = 2025,
209
214
  publisher = {Zenodo},
210
- version = {v0.16.1},
211
- doi = {10.5281/zenodo.17460500},
212
- url = {https://doi.org/10.5281/zenodo.17460500},
215
+ version = {v0.16.3},
216
+ doi = {10.5281/zenodo.18246117},
217
+ url = {https://doi.org/10.5281/zenodo.18246117},
213
218
  }
214
219
  ```
215
220
 
@@ -217,4 +222,4 @@ Cite without version:
217
222
  Malpas, A. (2025). microlens-submit. Zenodo. https://doi.org/10.5281/zenodo.17459752
218
223
 
219
224
  Cite current version:
220
- Malpas, A. (2025). microlens-submit (v0.16.1). Zenodo. https://doi.org/10.5281/zenodo.17459753
225
+ Malpas, A. (2025). microlens-submit (v0.16.3). Zenodo. https://doi.org/10.5281/zenodo.17468488
@@ -48,15 +48,19 @@ You can pass ``--no-color`` to any command if your terminal does not support ANS
48
48
  1. Initialize your project:
49
49
 
50
50
  ```bash
51
- microlens-submit init --team-name "Planet Pounders" --tier "advanced"
52
- # if a project directory was provided to `init`, you should now `cd` into that project
51
+ microlens-submit init --team-name "Planet Pounders" --tier "experienced" ./my_submission
52
+ cd ./my_submission
53
53
  ```
54
54
 
55
- To pass validation, you need to have provided a `repo_url` and `hardware_info` to the project and have a git project initialized in your sumission-project directory.
55
+ If you prefer to initialize inside an existing folder, run `microlens-submit init` without a path after `cd` into it.
56
+
57
+ To pass validation, you need to have provided a `repo_url` and `hardware_info` to the project and have a git project initialized in your sumission-project directory. On Roman Nexus, you can use `microlens-submit nexus-init` to auto-populate hardware info.
56
58
 
57
59
  ```bash
58
60
  microlens-submit set-repo-url <url> ./
59
61
  microlens-submit set-hardware-info --cpu-details "intel i7 xxx" --ram-gb 32 ./
62
+ # if your git repo lives elsewhere:
63
+ microlens-submit set-git-dir /path/to/repo ./
60
64
  ```
61
65
  2. Add a new solution to an event:
62
66
 
@@ -103,7 +107,7 @@ import microlens_submit
103
107
  # Load or create the project
104
108
  sub = microlens_submit.load(project_path="./my_challenge_submission")
105
109
  sub.team_name = "Planet Pounders"
106
- sub.tier = "advanced"
110
+ sub.tier = "experienced"
107
111
 
108
112
  # Get an event and add a solution
109
113
  evt = sub.get_event("ogle-2025-blg-0042")
@@ -152,15 +156,15 @@ import this file directly.
152
156
 
153
157
  Bibtex:
154
158
  ```
155
- @software{malpas_2025_17460500,
159
+ @software{malpas_2025_18246117,
156
160
  author = {Malpas, Amber},
157
161
  title = {microlens-submit},
158
162
  month = oct,
159
163
  year = 2025,
160
164
  publisher = {Zenodo},
161
- version = {v0.16.1},
162
- doi = {10.5281/zenodo.17460500},
163
- url = {https://doi.org/10.5281/zenodo.17460500},
165
+ version = {v0.16.3},
166
+ doi = {10.5281/zenodo.18246117},
167
+ url = {https://doi.org/10.5281/zenodo.18246117},
164
168
  }
165
169
  ```
166
170
 
@@ -168,4 +172,4 @@ Cite without version:
168
172
  Malpas, A. (2025). microlens-submit. Zenodo. https://doi.org/10.5281/zenodo.17459752
169
173
 
170
174
  Cite current version:
171
- Malpas, A. (2025). microlens-submit (v0.16.1). Zenodo. https://doi.org/10.5281/zenodo.17459753
175
+ Malpas, A. (2025). microlens-submit (v0.16.3). Zenodo. https://doi.org/10.5281/zenodo.17468488
@@ -5,7 +5,7 @@ validate, and export a challenge submission using either the Python API or
5
5
  the command line interface.
6
6
  """
7
7
 
8
- __version__ = "0.16.2"
8
+ __version__ = "0.16.4"
9
9
 
10
10
  from .models import Event, Solution, Submission
11
11
  from .utils import load
@@ -42,10 +42,13 @@ def export(
42
42
 
43
43
  def remove_event(
44
44
  event_id: str,
45
- force: bool = typer.Option(False, "--force", help="Force removal even if event has saved solutions"),
45
+ force: bool = typer.Option(False, "--force", help="Required to remove an event (prevents accidents)"),
46
46
  project_path: Path = typer.Argument(Path("."), help="Project directory"),
47
47
  ) -> None:
48
- """Remove an entire event and all its solutions from the submission."""
48
+ """Remove an entire event and all its solutions from the submission.
49
+
50
+ This action is destructive and requires --force to proceed.
51
+ """
49
52
  submission = load(str(project_path))
50
53
 
51
54
  if event_id not in submission.events:
@@ -57,13 +60,11 @@ def remove_event(
57
60
 
58
61
  if not force:
59
62
  typer.echo(
60
- f"{symbol('warning')} This will permanently remove event '{event_id}' and all {solution_count} solutions."
63
+ f"{symbol('warning')} Refusing to remove event '{event_id}' without --force "
64
+ f"({solution_count} solutions)."
61
65
  )
62
- typer.echo(" This action cannot be undone.")
63
- confirm = typer.confirm("Are you sure you want to continue?")
64
- if not confirm:
65
- typer.echo(f"{symbol('error')} Operation cancelled")
66
- raise typer.Exit(0)
66
+ typer.echo(f"{symbol('hint')} Consider deactivating solutions instead, or re-run with --force to proceed.")
67
+ raise typer.Exit(0)
67
68
 
68
69
  try:
69
70
  removed = submission.remove_event(event_id, force=force)
@@ -94,11 +95,33 @@ def set_repo_url(
94
95
  )
95
96
 
96
97
 
98
+ def set_git_dir(
99
+ git_dir: Path = typer.Argument(..., help="Path to the git working tree"),
100
+ project_path: Path = typer.Argument(Path("."), help="Project directory"),
101
+ ) -> None:
102
+ """Set or update the git working tree path in the submission metadata."""
103
+ sub = load(str(project_path))
104
+ git_dir_path = git_dir.expanduser().resolve()
105
+ if not git_dir_path.exists():
106
+ raise typer.BadParameter(f"git_dir does not exist: {git_dir_path}")
107
+ sub.git_dir = str(git_dir_path)
108
+ sub.save()
109
+ console.print(
110
+ Panel(
111
+ f"Set git_dir to {git_dir_path} in {project_path}/submission.json",
112
+ style="bold green",
113
+ )
114
+ )
115
+
116
+
97
117
  def set_hardware_info(
98
118
  cpu: Optional[str] = typer.Option(None, "--cpu", help="CPU model/description"),
99
119
  cpu_details: Optional[str] = typer.Option(None, "--cpu-details", help="Detailed CPU information"),
100
120
  memory_gb: Optional[float] = typer.Option(None, "--memory-gb", help="Memory in GB"),
101
121
  ram_gb: Optional[float] = typer.Option(None, "--ram-gb", help="RAM in GB (alternative to --memory-gb)"),
122
+ gpu: Optional[str] = typer.Option(None, "--gpu", help="GPU model/description"),
123
+ gpu_count: Optional[int] = typer.Option(None, "--gpu-count", help="Number of GPUs"),
124
+ gpu_memory_gb: Optional[float] = typer.Option(None, "--gpu-memory-gb", help="GPU memory per device in GB"),
102
125
  platform: Optional[str] = typer.Option(
103
126
  None,
104
127
  "--platform",
@@ -153,6 +176,24 @@ def set_hardware_info(
153
176
  changes.append(f"Set nexus_image: {nexus_image}")
154
177
  sub.hardware_info["nexus_image"] = nexus_image
155
178
 
179
+ if any(value is not None for value in (gpu, gpu_count, gpu_memory_gb)):
180
+ gpu_info = sub.hardware_info.get("gpu")
181
+ if not isinstance(gpu_info, dict):
182
+ gpu_info = {}
183
+ if gpu is not None:
184
+ if gpu_info.get("model") != gpu:
185
+ changes.append(f"Set gpu.model: {gpu}")
186
+ gpu_info["model"] = gpu
187
+ if gpu_count is not None:
188
+ if gpu_info.get("count") != gpu_count:
189
+ changes.append(f"Set gpu.count: {gpu_count}")
190
+ gpu_info["count"] = gpu_count
191
+ if gpu_memory_gb is not None:
192
+ if gpu_info.get("memory_gb") != gpu_memory_gb:
193
+ changes.append(f"Set gpu.memory_gb: {gpu_memory_gb}")
194
+ gpu_info["memory_gb"] = gpu_memory_gb
195
+ sub.hardware_info["gpu"] = gpu_info
196
+
156
197
  # Show dry run results
157
198
  if dry_run:
158
199
  if changes:
@@ -17,6 +17,7 @@ def init(
17
17
  team_name: str = typer.Option(..., help="Team name"),
18
18
  tier: str = typer.Option(..., help="Challenge tier"),
19
19
  project_path: Path = typer.Argument(Path("."), help="Project directory"),
20
+ show_warnings: bool = True,
20
21
  ) -> None:
21
22
  """Create a new submission project in the specified directory.
22
23
 
@@ -29,7 +30,7 @@ def init(
29
30
 
30
31
  Args:
31
32
  team_name: Name of the participating team (e.g., "Team Alpha").
32
- tier: Challenge tier level (e.g., "basic", "advanced").
33
+ tier: Challenge tier level (e.g., "beginner", "experienced").
33
34
  project_path: Directory where the project will be created.
34
35
  Defaults to current directory if not specified.
35
36
 
@@ -38,10 +39,10 @@ def init(
38
39
 
39
40
  Example:
40
41
  # Create project in current directory
41
- microlens-submit init --team-name "Team Alpha" --tier "advanced"
42
+ microlens-submit init --team-name "Team Alpha" --tier "experienced"
42
43
 
43
44
  # Create project in specific directory
44
- microlens-submit init --team-name "Team Beta" --tier "basic" ./my_submission
45
+ microlens-submit init --team-name "Team Beta" --tier "beginner" ./my_submission
45
46
 
46
47
  # Project structure created:
47
48
  # ./my_submission/
@@ -100,12 +101,15 @@ def init(
100
101
  )
101
102
 
102
103
  # Run warnings-only validation
103
- warnings = sub.run_validation_warnings()
104
- if warnings:
105
- console.print(f"[yellow]{symbol('warning')} Project initialized with warnings:[/yellow]")
106
- for warning in warnings:
107
- console.print(f" [yellow]• {warning}[/yellow]")
108
- console.print(f"[yellow]{symbol('hint')} These warnings will become errors when saving or exporting.[/yellow]")
104
+ if show_warnings:
105
+ warnings = sub.run_validation_warnings()
106
+ if warnings:
107
+ console.print(f"[yellow]{symbol('warning')} Project initialized with warnings:[/yellow]")
108
+ for warning in warnings:
109
+ console.print(f" [yellow]{warning}[/yellow]")
110
+ console.print(
111
+ f"[yellow]{symbol('hint')} These warnings will become errors when saving or exporting.[/yellow]"
112
+ )
109
113
 
110
114
  # Try to save, but don't fail if there are validation errors
111
115
  try:
@@ -134,13 +138,13 @@ def nexus_init(
134
138
 
135
139
  Args:
136
140
  team_name: Name of the participating team (e.g., "Team Alpha").
137
- tier: Challenge tier level (e.g., "basic", "advanced").
141
+ tier: Challenge tier level (e.g., "beginner", "experienced").
138
142
  project_path: Directory where the project will be created.
139
143
  Defaults to current directory if not specified.
140
144
 
141
145
  Example:
142
146
  # Initialize project with Nexus platform info
143
- microlens-submit nexus-init --team-name "Team Alpha" --tier "advanced" ./project
147
+ microlens-submit nexus-init --team-name "Team Alpha" --tier "experienced" ./project
144
148
 
145
149
  # This will automatically detect:
146
150
  # - CPU model from /proc/cpuinfo
@@ -152,7 +156,7 @@ def nexus_init(
152
156
  environment. It will silently skip any environment information that
153
157
  cannot be detected (e.g., if running outside of Nexus).
154
158
  """
155
- init(team_name=team_name, tier=tier, project_path=project_path)
159
+ init(team_name=team_name, tier=tier, project_path=project_path, show_warnings=False)
156
160
  sub = load(str(project_path))
157
161
  sub.autofill_nexus_info()
158
162