rxiv-maker 1.16.6__tar.gz → 1.16.7__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.
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/.gitignore +1 -2
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/CHANGELOG.md +12 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/PKG-INFO +10 -5
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/README.md +8 -3
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/pyproject.toml +1 -1
- rxiv_maker-1.16.7/src/docs/api/README.md +4 -0
- rxiv_maker-1.16.7/src/docs/api/index.md +4 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/__version__.py +1 -1
- rxiv_maker-1.16.7/src/rxiv_maker/cli/commands/upgrade.py +52 -0
- rxiv_maker-1.16.7/src/rxiv_maker/utils/rich_upgrade_notifier.py +162 -0
- rxiv_maker-1.16.7/tests/unit/test_rich_upgrade_notifier.py +206 -0
- rxiv_maker-1.16.7/tests/unit/test_upgrade_command.py +134 -0
- rxiv_maker-1.16.6/src/docs/api/README.md +0 -28
- rxiv_maker-1.16.6/src/docs/api/__version__.py.md +0 -9
- rxiv_maker-1.16.6/src/docs/api/author_name_formatter.py.md +0 -165
- rxiv_maker-1.16.6/src/docs/api/bibliography_parser.py.md +0 -123
- rxiv_maker-1.16.6/src/docs/api/cache_utils.py.md +0 -150
- rxiv_maker-1.16.6/src/docs/api/changelog_parser.py.md +0 -260
- rxiv_maker-1.16.6/src/docs/api/citation_utils.py.md +0 -78
- rxiv_maker-1.16.6/src/docs/api/email_encoder.py.md +0 -126
- rxiv_maker-1.16.6/src/docs/api/error_codes.py.md +0 -49
- rxiv_maker-1.16.6/src/docs/api/figure_utils.py.md +0 -253
- rxiv_maker-1.16.6/src/docs/api/github.py.md +0 -312
- rxiv_maker-1.16.6/src/docs/api/homebrew_checker.py.md +0 -99
- rxiv_maker-1.16.6/src/docs/api/index.md +0 -28
- rxiv_maker-1.16.6/src/docs/api/install_detector.py.md +0 -81
- rxiv_maker-1.16.6/src/docs/api/logging_config.py.md +0 -371
- rxiv_maker-1.16.6/src/docs/api/operation_ids.py.md +0 -218
- rxiv_maker-1.16.6/src/docs/api/platform.py.md +0 -527
- rxiv_maker-1.16.6/src/docs/api/python_execution_reporter.py.md +0 -302
- rxiv_maker-1.16.6/src/docs/api/text_utils.py.md +0 -71
- rxiv_maker-1.16.6/src/docs/api/unicode_safe.py.md +0 -230
- rxiv_maker-1.16.6/src/docs/api/url_to_doi.py.md +0 -80
- rxiv_maker-1.16.6/src/docs/api/validate.py.md +0 -142
- rxiv_maker-1.16.6/src/rxiv_maker/cli/commands/upgrade.py +0 -164
- rxiv_maker-1.16.6/tests/unit/test_upgrade_command.py +0 -193
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/LICENSE +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/logo/logo-rxiv-maker.afdesign +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/logo/logo-rxiv-maker.png +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/logo/logo-rxiv-maker.svg +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/__main__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/arxiv.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/bibliography.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/build.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/cache_management.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/changelog.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/check_installation.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/clean.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/completion.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/config.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/create_repo.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/docx.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/figures.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/get_rxiv_preprint.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/init.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/install_deps.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/repo_init.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/repos.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/repos_search.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/setup.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/track_changes.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/validate.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/version.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/base.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/cache_commands.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/config_commands.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/content_commands.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/decorators.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/utility_commands.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/workflow_commands.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/interactive.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/interactive_prompts.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/main.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/config/defaults.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/config/validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/citation_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/code_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/comment_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/custom_command_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/figure_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/html_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/list_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/math_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/md2tex.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/python_executor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/section_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/supplementary_note_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/table_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/text_formatters.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/types.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/url_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/advanced_cache.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/bibliography_cache.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/cache_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/doi_cache.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/secure_cache_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/content_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/environment_bootstrap.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/environment_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/error_codes.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/error_recovery.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/logging_config.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/cache_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/config_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/dependency_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/execution_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/file_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/install_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/state_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/unified_config_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/validation_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/workflow_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/path_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/progress_framework.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/repo_config.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/repository.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/session_optimizer.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/validation_framework.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/data/tips.yaml +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/add_bibliography.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/build_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/cleanup.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/fix_bibliography.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/generate_docs.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/generate_figures.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/generate_preprint.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/prepare_arxiv.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/setup_environment.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/track_changes.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/validate.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/validate_pdf.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/docx_citation_mapper.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/docx_content_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/docx_exporter.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/docx_writer.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/dependency_handlers/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/dependency_handlers/latex.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/dependency_handlers/r_lang.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/dependency_handlers/system_libs.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/base.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/linux.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/macos.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/windows.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/utils/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/utils/logging.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/utils/progress.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/utils/verification.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/manuscript_utils/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/manuscript_utils/figure_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/author_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/markdown_preprocessor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/template_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/yaml_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/rxiv_maker_cli.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/scripts/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/scripts/custom_doc_generator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/scripts/validate_manuscript.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/base.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/build_service.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/configuration_service.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/manuscript_service.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/publication_service.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/validation_service.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/templates/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/templates/manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/templates/registry.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/tex/python_execution_section.tex +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/author_name_formatter.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/bibliography_checksum.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/bibliography_parser.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/bst_generator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/changelog_parser.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/citation_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/dependency_checker.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/docx_helpers.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/doi_resolver.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/email_encoder.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/figure_checksum.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/file_helpers.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/github.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/homebrew_checker.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/install_detector.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/operation_ids.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/pdf_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/performance.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/platform.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/python_execution_reporter.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/retry.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/text_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/tips.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/title_sync.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/unicode_safe.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/update_checker.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/url_to_doi.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validate.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/base_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/citation_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/doi/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/doi/api_clients.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/doi/metadata_comparator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/doi_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/figure_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/latex_error_parser.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/math_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/pdf_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/reference_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/syntax_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/tex/style/rxiv_maker_style.bst +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/tex/style/rxiv_maker_style.cls +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/tex/template.tex +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/test_build.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/test_changelog_command.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/test_init_command.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/test_main.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/conftest.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/e2e/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/e2e/test_dummy_manuscript_generator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/e2e/test_figure_workflow_validation.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/00_CONFIG.yml +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/01_MAIN.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/03_REFERENCES.bib +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/FIGURES/Fig1.png +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/FIGURES/Fig2.png +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/FIGURES/Fig3.png +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/README.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/01_MAIN.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/02_SUPPLEMENTARY_INFO.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/03_REFERENCES.bib +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/2025__unknown_et_al__rxiv.docx +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/sample_manuscript.docx +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_article_generation.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_bibliography_author_format_docx.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_binary_distribution.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_centralized_components.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_citation_injection.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_comment_system_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_docx_export_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_doi_fallback_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_doi_validation_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_example_manuscript.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_guillaume_fixtures.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_homebrew_workflow_validation.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_infrastructure_suite.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_init_build_workflow.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_install_verification_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_latex_dependency_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_manuscript_directory_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_manuscript_python_execution_reporting.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_practical_manuscript_workflows.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_pypi_package_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_python_execution_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_repository_cli_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_supplementary_formatting.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_user_reported_issue.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_validation_workflow.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/README.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/conftest.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_cli_argument_parsing.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_discord_reported_issues.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_error_message_quality.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_google_colab_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_guillaume_edge_cases.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_guillaume_pr131_rewrite.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_path_resolution.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_widget_author_behavior.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_widget_interactions_playwright.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/smoke/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/smoke/test_basic_functionality.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/smoke/test_cli_smoke.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/system/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/system/test_ci_matrix.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/system/test_cli_workflows.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/system/test_end_to_end.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/test_homebrew_checker.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/test_install_detector.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/exporters/__init__.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/exporters/test_docx_citation_mapper.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/exporters/test_docx_content_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_add_bibliography.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_arxiv_command.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_async_execution_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_author_name_formatter.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_author_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_build_command.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_build_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_build_manager_manuscript_path.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cache_security.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cache_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_check_installation_command.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_citation_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_citation_rendering.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_citation_style.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_citation_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cli_cleanup_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cli_structure.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_comment_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_conda_installation_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_conda_platform_detection.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cross_platform_optimizations.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_custom_command_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_dependency_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_dependency_package_names.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_docx_helpers.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_doi_fallback_system.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_doi_resolver.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_doi_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_email_encoder.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_environment_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_error_handling_scenarios.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_execution_manager_comprehensive.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_figure_generator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_figure_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_figure_processor_error_handling.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_file_helpers.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_fix_bibliography.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_generate_docs.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_generate_preprint.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_github.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_github_actions_integration.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_importlib_edge_cases.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_install_platform_installers.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_install_system_libs.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_install_verification.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_interactive_path_change.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_interactive_validators.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_latex_dependency_handler.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_manuscript_figure_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_manuscript_repository.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_math_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_md2tex.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_mermaid_fallback.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_path_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_pdf_validator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_platform_comprehensive.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_platform_detector.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_processor_suite.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_python_execution_reporter.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_python_executor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_release_orchestrator.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_repository_manager.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_rxiv_setup_command.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_security_features.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_security_scanner.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_setup_environment.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_style_file_resolution.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_supplementary_note_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_table_rotation.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_template_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_text_formatters.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_text_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_tips.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_title_sync.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_title_sync_validation.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_track_changes.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_trailing_slash_regression.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_url_to_doi.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_utils.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validate_backticks.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validate_command_fixed.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validate_manuscript.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validation_suite.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validators.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_yaml_processor.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/README.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/00_CONFIG.yml +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/01_MAIN.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/03_REFERENCES.bib +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/FIGURES/Figure__positioning_test.png +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/FIGURES/Figure__positioning_test.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/FIGURES/ReadyFig.png +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/FIGURES/ReadyFig.py +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/README.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/00_CONFIG.yml +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/01_MAIN.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/02_SUPPLEMENTARY_INFO.md +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/03_REFERENCES.bib +0 -0
- {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/README.md +0 -0
|
@@ -52,7 +52,6 @@ output.txt
|
|
|
52
52
|
*~
|
|
53
53
|
|
|
54
54
|
# Claude Code configuration
|
|
55
|
-
!CLAUDE.md
|
|
56
55
|
.claude
|
|
57
56
|
|
|
58
57
|
# Byte-compiled / optimized / DLL files
|
|
@@ -316,6 +315,7 @@ GEMINI.md
|
|
|
316
315
|
!CHANGELOG.md
|
|
317
316
|
!CONTRIBUTING.md
|
|
318
317
|
!CODE_OF_CONDUCT.md
|
|
318
|
+
!CLAUDE.md
|
|
319
319
|
!docs/**/*.md
|
|
320
320
|
!EXAMPLE_MANUSCRIPT/**/*.md
|
|
321
321
|
!MANUSCRIPT/**/*.md
|
|
@@ -330,7 +330,6 @@ GEMINI.md
|
|
|
330
330
|
todo*.md
|
|
331
331
|
DOCKER_ACCELERATION.md
|
|
332
332
|
GEMINI.md
|
|
333
|
-
CLAUDE.md
|
|
334
333
|
output.md
|
|
335
334
|
|
|
336
335
|
# Temporary analysis files
|
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.16.7] - 2025-12-18
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Upgrade Workflow Centralization**: Migrated to henriqueslab-updater v1.2.0 for centralized upgrade management
|
|
15
|
+
- Simplified upgrade command implementation from 165 to 53 lines (68% reduction)
|
|
16
|
+
- Created custom `RxivUpgradeNotifier` implementing `UpgradeNotifier` protocol
|
|
17
|
+
- Integrated with existing changelog parser for rich change summaries with breaking change highlighting
|
|
18
|
+
- Maintains backward compatibility with all existing flags (`--yes`, `--check-only`)
|
|
19
|
+
- Reduces code duplication across HenriquesLab CLI tools
|
|
20
|
+
- Provides consistent upgrade UX across all HenriquesLab projects
|
|
21
|
+
|
|
10
22
|
## [1.16.6] - 2025-12-17
|
|
11
23
|
|
|
12
24
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rxiv-maker
|
|
3
|
-
Version: 1.16.
|
|
3
|
+
Version: 1.16.7
|
|
4
4
|
Summary: Write scientific preprints in Markdown. Generate publication-ready PDFs efficiently.
|
|
5
5
|
Project-URL: Homepage, https://github.com/HenriquesLab/rxiv-maker
|
|
6
6
|
Project-URL: Documentation, https://github.com/HenriquesLab/rxiv-maker#readme
|
|
@@ -27,7 +27,7 @@ Requires-Python: >=3.10
|
|
|
27
27
|
Requires-Dist: click>=8.0.0
|
|
28
28
|
Requires-Dist: crossref-commons>=0.0.7
|
|
29
29
|
Requires-Dist: gitpython>=3.1.0
|
|
30
|
-
Requires-Dist: henriqueslab-updater>=1.
|
|
30
|
+
Requires-Dist: henriqueslab-updater>=1.2.0
|
|
31
31
|
Requires-Dist: latex2mathml>=3.78.0
|
|
32
32
|
Requires-Dist: matplotlib>=3.7.0
|
|
33
33
|
Requires-Dist: numpy>=1.24.0
|
|
@@ -358,9 +358,14 @@ rxiv config --non-interactive # Show current settings
|
|
|
358
358
|
|
|
359
359
|
### Maintenance
|
|
360
360
|
```bash
|
|
361
|
-
|
|
362
|
-
rxiv
|
|
363
|
-
rxiv
|
|
361
|
+
# Upgrade commands (auto-detects Homebrew, pip, uv, pipx)
|
|
362
|
+
rxiv upgrade # Interactive upgrade with confirmation
|
|
363
|
+
rxiv upgrade --yes # Upgrade without confirmation
|
|
364
|
+
rxiv upgrade --check-only # Check for updates only
|
|
365
|
+
|
|
366
|
+
# Changelog and version information
|
|
367
|
+
rxiv changelog # View changelog and release notes
|
|
368
|
+
rxiv changelog --recent 5 # View last 5 versions
|
|
364
369
|
```
|
|
365
370
|
|
|
366
371
|
> **💡 CI/Automation Note:** All interactive commands support non-interactive mode or configuration files for use in CI/CD pipelines and automated workflows. Use `--non-interactive` flag or configure via `~/.rxiv-maker/config` for non-TTY environments.
|
|
@@ -281,9 +281,14 @@ rxiv config --non-interactive # Show current settings
|
|
|
281
281
|
|
|
282
282
|
### Maintenance
|
|
283
283
|
```bash
|
|
284
|
-
|
|
285
|
-
rxiv
|
|
286
|
-
rxiv
|
|
284
|
+
# Upgrade commands (auto-detects Homebrew, pip, uv, pipx)
|
|
285
|
+
rxiv upgrade # Interactive upgrade with confirmation
|
|
286
|
+
rxiv upgrade --yes # Upgrade without confirmation
|
|
287
|
+
rxiv upgrade --check-only # Check for updates only
|
|
288
|
+
|
|
289
|
+
# Changelog and version information
|
|
290
|
+
rxiv changelog # View changelog and release notes
|
|
291
|
+
rxiv changelog --recent 5 # View last 5 versions
|
|
287
292
|
```
|
|
288
293
|
|
|
289
294
|
> **💡 CI/Automation Note:** All interactive commands support non-interactive mode or configuration files for use in CI/CD pipelines and automated workflows. Use `--non-interactive` flag or configure via `~/.rxiv-maker/config` for non-TTY environments.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Upgrade command for rxiv-maker CLI."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
import click
|
|
6
|
+
from henriqueslab_updater import handle_upgrade_workflow
|
|
7
|
+
from rich.console import Console
|
|
8
|
+
|
|
9
|
+
from ... import __version__
|
|
10
|
+
from ...utils.install_detector import detect_install_method
|
|
11
|
+
from ...utils.rich_upgrade_notifier import RxivUpgradeNotifier
|
|
12
|
+
|
|
13
|
+
console = Console()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@click.command()
|
|
17
|
+
@click.option("--yes", "-y", is_flag=True, help="Skip confirmation prompt")
|
|
18
|
+
@click.option("--check-only", "-c", is_flag=True, help="Only check for updates, don't upgrade")
|
|
19
|
+
@click.pass_context
|
|
20
|
+
def upgrade(ctx: click.Context, yes: bool, check_only: bool) -> None:
|
|
21
|
+
"""Upgrade rxiv-maker to the latest version.
|
|
22
|
+
|
|
23
|
+
This command automatically detects how rxiv-maker was installed
|
|
24
|
+
(Homebrew, pip, uv, pipx, etc.) and runs the appropriate upgrade command.
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
rxiv upgrade # Check and upgrade with confirmation
|
|
28
|
+
rxiv upgrade --yes # Upgrade without confirmation
|
|
29
|
+
rxiv upgrade --check-only # Only check for updates
|
|
30
|
+
"""
|
|
31
|
+
# Handle development installations specially
|
|
32
|
+
install_method = detect_install_method()
|
|
33
|
+
if install_method == "dev":
|
|
34
|
+
console.print("⚠️ Development installation detected", style="yellow")
|
|
35
|
+
console.print(" To update, pull the latest changes from git:", style="yellow")
|
|
36
|
+
console.print(" [cyan]cd <repo> && git pull && uv sync[/cyan]", style="yellow")
|
|
37
|
+
sys.exit(0)
|
|
38
|
+
|
|
39
|
+
# Use centralized upgrade workflow
|
|
40
|
+
notifier = RxivUpgradeNotifier(console)
|
|
41
|
+
success, error = handle_upgrade_workflow(
|
|
42
|
+
package_name="rxiv-maker",
|
|
43
|
+
current_version=__version__,
|
|
44
|
+
check_only=check_only,
|
|
45
|
+
skip_confirmation=yes,
|
|
46
|
+
notifier=notifier,
|
|
47
|
+
github_org="HenriquesLab",
|
|
48
|
+
github_repo="rxiv-maker",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if not success and error:
|
|
52
|
+
sys.exit(1)
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""Rich console adapter for upgrade notifications in rxiv-maker."""
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
from rich.console import Console
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class RxivUpgradeNotifier:
|
|
8
|
+
"""Adapt Rich console to UpgradeNotifier protocol for rxiv-maker.
|
|
9
|
+
|
|
10
|
+
Integrates with rxiv-maker's changelog parser to show rich change summaries.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(self, console: Console):
|
|
14
|
+
"""Initialize with Rich console instance.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
console: Rich Console instance for styled output
|
|
18
|
+
"""
|
|
19
|
+
self.console = console
|
|
20
|
+
|
|
21
|
+
def show_checking(self) -> None:
|
|
22
|
+
"""Show 'checking for updates' message."""
|
|
23
|
+
self.console.print("🔍 Checking for updates...", style="blue")
|
|
24
|
+
|
|
25
|
+
def show_version_check(self, current: str, latest: str, available: bool) -> None:
|
|
26
|
+
"""Show version check results.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
current: Current installed version
|
|
30
|
+
latest: Latest available version
|
|
31
|
+
available: Whether an update is available
|
|
32
|
+
"""
|
|
33
|
+
if available:
|
|
34
|
+
self.console.print(
|
|
35
|
+
f"📦 Update available: [cyan]v{current}[/cyan] → [green bold]v{latest}[/green bold]",
|
|
36
|
+
style="yellow",
|
|
37
|
+
)
|
|
38
|
+
else:
|
|
39
|
+
self.console.print(
|
|
40
|
+
f"✅ You already have the latest version ([cyan]v{current}[/cyan])",
|
|
41
|
+
style="green",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def show_update_info(self, current: str, latest: str, release_url: str) -> None:
|
|
45
|
+
"""Show update available information with changelog integration.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
current: Current version
|
|
49
|
+
latest: Latest version
|
|
50
|
+
release_url: URL to release notes
|
|
51
|
+
"""
|
|
52
|
+
# Import here to avoid circular dependencies
|
|
53
|
+
from .changelog_parser import fetch_and_format_changelog
|
|
54
|
+
|
|
55
|
+
# Fetch and display changelog
|
|
56
|
+
summary, error = fetch_and_format_changelog(
|
|
57
|
+
current_version=current,
|
|
58
|
+
latest_version=latest,
|
|
59
|
+
highlights_per_version=3,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
if summary and not error:
|
|
63
|
+
self.console.print("\n📋 What's changing:", style="bold blue")
|
|
64
|
+
# Display changelog - format_summary returns rich-formatted text
|
|
65
|
+
# Parse and display with proper styling
|
|
66
|
+
for line in summary.split("\n"):
|
|
67
|
+
if line.startswith("⚠️"):
|
|
68
|
+
# Highlight breaking changes prominently
|
|
69
|
+
self.console.print(line, style="bold red")
|
|
70
|
+
elif "What's New:" in line or "What's changing:" in line:
|
|
71
|
+
self.console.print(line, style="bold cyan")
|
|
72
|
+
elif line.strip().startswith("v"):
|
|
73
|
+
# Version headers
|
|
74
|
+
self.console.print(line, style="bold yellow")
|
|
75
|
+
elif line.strip().startswith(("✨", "🔄", "🐛", "🗑️", "🔒", "📝")):
|
|
76
|
+
# Change items with emojis
|
|
77
|
+
self.console.print(f" {line.strip()}", style="white")
|
|
78
|
+
elif line.strip().startswith("•"):
|
|
79
|
+
# Breaking change items
|
|
80
|
+
self.console.print(f" {line.strip()}", style="yellow")
|
|
81
|
+
elif line.strip():
|
|
82
|
+
self.console.print(f" {line}", style="dim")
|
|
83
|
+
else:
|
|
84
|
+
# Fallback if changelog unavailable
|
|
85
|
+
self.console.print(
|
|
86
|
+
f"\nView release notes: [link]{release_url}[/link]",
|
|
87
|
+
style="blue",
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def show_installer_info(self, friendly_name: str, command: str) -> None:
|
|
91
|
+
"""Show detected installer information.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
friendly_name: Human-readable installer name
|
|
95
|
+
command: The upgrade command that will be executed
|
|
96
|
+
"""
|
|
97
|
+
self.console.print()
|
|
98
|
+
self.console.print(
|
|
99
|
+
f"🔍 Detected installation method: [bold]{friendly_name}[/bold]",
|
|
100
|
+
style="blue",
|
|
101
|
+
)
|
|
102
|
+
self.console.print(f"📦 Running: [yellow]{command}[/yellow]")
|
|
103
|
+
|
|
104
|
+
def show_success(self, version: str) -> None:
|
|
105
|
+
"""Show successful upgrade message.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
version: Version that was successfully installed
|
|
109
|
+
"""
|
|
110
|
+
self.console.print()
|
|
111
|
+
self.console.print("✅ Upgrade completed successfully!", style="green bold")
|
|
112
|
+
self.console.print(f" Now running: [green]v{version}[/green]")
|
|
113
|
+
self.console.print()
|
|
114
|
+
self.console.print(" Run [blue]'rxiv --version'[/blue] to verify the installation", style="dim")
|
|
115
|
+
|
|
116
|
+
def show_error(self, error: str | None) -> None:
|
|
117
|
+
"""Show upgrade error message.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
error: Error message or None
|
|
121
|
+
"""
|
|
122
|
+
self.console.print()
|
|
123
|
+
self.console.print("❌ Upgrade failed", style="red bold")
|
|
124
|
+
if error:
|
|
125
|
+
self.console.print(f" {error}", style="red")
|
|
126
|
+
|
|
127
|
+
def show_manual_instructions(self, install_method: str) -> None:
|
|
128
|
+
"""Show manual upgrade instructions.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
install_method: The detected installation method
|
|
132
|
+
"""
|
|
133
|
+
self.console.print("\n💡 Try running manually:", style="yellow bold")
|
|
134
|
+
|
|
135
|
+
if install_method == "homebrew":
|
|
136
|
+
self.console.print(" [cyan]brew update && brew upgrade rxiv-maker[/cyan]")
|
|
137
|
+
elif install_method == "pipx":
|
|
138
|
+
self.console.print(" [cyan]pipx upgrade rxiv-maker[/cyan]")
|
|
139
|
+
elif install_method == "uv":
|
|
140
|
+
self.console.print(" [cyan]uv tool upgrade rxiv-maker[/cyan]")
|
|
141
|
+
elif install_method == "dev":
|
|
142
|
+
self.console.print(" [cyan]cd <repo> && git pull && uv sync[/cyan]", style="dim")
|
|
143
|
+
else:
|
|
144
|
+
self.console.print(" [cyan]pip install --upgrade rxiv-maker[/cyan]")
|
|
145
|
+
self.console.print(" [dim]# Or with --user flag:[/dim]")
|
|
146
|
+
self.console.print(" [cyan]pip install --upgrade --user rxiv-maker[/cyan]")
|
|
147
|
+
|
|
148
|
+
def confirm_upgrade(self, version: str) -> bool:
|
|
149
|
+
"""Prompt user for confirmation using click.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
version: Version to upgrade to
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
True if user confirms, False otherwise
|
|
156
|
+
"""
|
|
157
|
+
try:
|
|
158
|
+
self.console.print()
|
|
159
|
+
return click.confirm(f"Upgrade rxiv-maker to v{version}?", default=True)
|
|
160
|
+
except (KeyboardInterrupt, EOFError):
|
|
161
|
+
self.console.print("\n⚠️ Upgrade cancelled.", style="yellow")
|
|
162
|
+
return False
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""Tests for RxivUpgradeNotifier."""
|
|
2
|
+
|
|
3
|
+
from unittest.mock import Mock, patch
|
|
4
|
+
|
|
5
|
+
from rich.console import Console
|
|
6
|
+
|
|
7
|
+
from src.rxiv_maker.utils.rich_upgrade_notifier import RxivUpgradeNotifier
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TestRxivUpgradeNotifier:
|
|
11
|
+
"""Test RxivUpgradeNotifier functionality."""
|
|
12
|
+
|
|
13
|
+
def setup_method(self):
|
|
14
|
+
"""Set up test environment."""
|
|
15
|
+
self.console = Mock(spec=Console)
|
|
16
|
+
self.notifier = RxivUpgradeNotifier(self.console)
|
|
17
|
+
|
|
18
|
+
def test_show_checking(self):
|
|
19
|
+
"""Test show_checking displays checking message."""
|
|
20
|
+
self.notifier.show_checking()
|
|
21
|
+
|
|
22
|
+
self.console.print.assert_called_once()
|
|
23
|
+
call_args = self.console.print.call_args[0]
|
|
24
|
+
assert "Checking for updates" in call_args[0]
|
|
25
|
+
|
|
26
|
+
def test_show_version_check_update_available(self):
|
|
27
|
+
"""Test version check with update available."""
|
|
28
|
+
self.notifier.show_version_check("1.0.0", "1.1.0", True)
|
|
29
|
+
|
|
30
|
+
assert self.console.print.called
|
|
31
|
+
# Check that output mentions update available
|
|
32
|
+
call_text = str(self.console.print.call_args)
|
|
33
|
+
assert "1.0.0" in call_text and "1.1.0" in call_text
|
|
34
|
+
|
|
35
|
+
def test_show_version_check_no_update(self):
|
|
36
|
+
"""Test version check with no update."""
|
|
37
|
+
self.notifier.show_version_check("1.0.0", "1.0.0", False)
|
|
38
|
+
|
|
39
|
+
assert self.console.print.called
|
|
40
|
+
call_text = str(self.console.print.call_args)
|
|
41
|
+
assert "latest version" in call_text
|
|
42
|
+
|
|
43
|
+
@patch("src.rxiv_maker.utils.changelog_parser.fetch_and_format_changelog")
|
|
44
|
+
def test_show_update_info_with_changelog(self, mock_fetch):
|
|
45
|
+
"""Test update info with changelog integration."""
|
|
46
|
+
mock_fetch.return_value = ("✨ Added new feature\n🐛 Fixed bug", None)
|
|
47
|
+
|
|
48
|
+
self.notifier.show_update_info("1.0.0", "1.1.0", "https://github.com/...")
|
|
49
|
+
|
|
50
|
+
mock_fetch.assert_called_once_with(
|
|
51
|
+
current_version="1.0.0",
|
|
52
|
+
latest_version="1.1.0",
|
|
53
|
+
highlights_per_version=3,
|
|
54
|
+
)
|
|
55
|
+
assert self.console.print.called
|
|
56
|
+
|
|
57
|
+
@patch("src.rxiv_maker.utils.changelog_parser.fetch_and_format_changelog")
|
|
58
|
+
def test_show_update_info_changelog_error(self, mock_fetch):
|
|
59
|
+
"""Test update info when changelog unavailable."""
|
|
60
|
+
mock_fetch.return_value = (None, "Network error")
|
|
61
|
+
|
|
62
|
+
self.notifier.show_update_info("1.0.0", "1.1.0", "https://github.com/...")
|
|
63
|
+
|
|
64
|
+
# Should show release URL as fallback
|
|
65
|
+
assert self.console.print.called
|
|
66
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
67
|
+
assert "release notes" in calls_text.lower() or "github.com" in calls_text
|
|
68
|
+
|
|
69
|
+
@patch("src.rxiv_maker.utils.changelog_parser.fetch_and_format_changelog")
|
|
70
|
+
def test_show_update_info_breaking_changes(self, mock_fetch):
|
|
71
|
+
"""Test that breaking changes are highlighted prominently."""
|
|
72
|
+
mock_fetch.return_value = (
|
|
73
|
+
"⚠️ Breaking changes:\n• Removed old API\n✨ Added new feature",
|
|
74
|
+
None,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
self.notifier.show_update_info("1.0.0", "2.0.0", "https://github.com/...")
|
|
78
|
+
|
|
79
|
+
# Verify breaking changes are printed with bold red style
|
|
80
|
+
calls = self.console.print.call_args_list
|
|
81
|
+
# Find calls with breaking change indicator
|
|
82
|
+
breaking_calls = [c for c in calls if "⚠️" in str(c)]
|
|
83
|
+
assert len(breaking_calls) > 0
|
|
84
|
+
|
|
85
|
+
def test_show_installer_info(self):
|
|
86
|
+
"""Test installer info display."""
|
|
87
|
+
self.notifier.show_installer_info("Homebrew", "brew update && brew upgrade rxiv-maker")
|
|
88
|
+
|
|
89
|
+
assert self.console.print.called
|
|
90
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
91
|
+
assert "Homebrew" in calls_text
|
|
92
|
+
assert "brew" in calls_text
|
|
93
|
+
|
|
94
|
+
def test_show_success(self):
|
|
95
|
+
"""Test success message display."""
|
|
96
|
+
self.notifier.show_success("1.1.0")
|
|
97
|
+
|
|
98
|
+
assert self.console.print.called
|
|
99
|
+
# Check for success indicators
|
|
100
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
101
|
+
assert "success" in calls_text.lower() or "✅" in calls_text
|
|
102
|
+
assert "1.1.0" in calls_text
|
|
103
|
+
|
|
104
|
+
def test_show_error_with_message(self):
|
|
105
|
+
"""Test error message display with error text."""
|
|
106
|
+
self.notifier.show_error("Installation failed")
|
|
107
|
+
|
|
108
|
+
assert self.console.print.called
|
|
109
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
110
|
+
assert "failed" in calls_text.lower() or "❌" in calls_text
|
|
111
|
+
assert "Installation failed" in calls_text
|
|
112
|
+
|
|
113
|
+
def test_show_error_without_message(self):
|
|
114
|
+
"""Test error message display without error text."""
|
|
115
|
+
self.notifier.show_error(None)
|
|
116
|
+
|
|
117
|
+
assert self.console.print.called
|
|
118
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
119
|
+
assert "failed" in calls_text.lower() or "❌" in calls_text
|
|
120
|
+
|
|
121
|
+
def test_show_manual_instructions_homebrew(self):
|
|
122
|
+
"""Test manual instructions for Homebrew."""
|
|
123
|
+
self.notifier.show_manual_instructions("homebrew")
|
|
124
|
+
|
|
125
|
+
assert self.console.print.called
|
|
126
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
127
|
+
assert "brew" in calls_text
|
|
128
|
+
|
|
129
|
+
def test_show_manual_instructions_pipx(self):
|
|
130
|
+
"""Test manual instructions for pipx."""
|
|
131
|
+
self.notifier.show_manual_instructions("pipx")
|
|
132
|
+
|
|
133
|
+
assert self.console.print.called
|
|
134
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
135
|
+
assert "pipx" in calls_text
|
|
136
|
+
|
|
137
|
+
def test_show_manual_instructions_uv(self):
|
|
138
|
+
"""Test manual instructions for uv."""
|
|
139
|
+
self.notifier.show_manual_instructions("uv")
|
|
140
|
+
|
|
141
|
+
assert self.console.print.called
|
|
142
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
143
|
+
assert "uv tool" in calls_text
|
|
144
|
+
|
|
145
|
+
def test_show_manual_instructions_pip(self):
|
|
146
|
+
"""Test manual instructions for pip."""
|
|
147
|
+
self.notifier.show_manual_instructions("pip")
|
|
148
|
+
|
|
149
|
+
assert self.console.print.called
|
|
150
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
151
|
+
assert "pip install" in calls_text
|
|
152
|
+
|
|
153
|
+
def test_show_manual_instructions_dev(self):
|
|
154
|
+
"""Test manual instructions for dev installation."""
|
|
155
|
+
self.notifier.show_manual_instructions("dev")
|
|
156
|
+
|
|
157
|
+
assert self.console.print.called
|
|
158
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
159
|
+
assert "git pull" in calls_text
|
|
160
|
+
|
|
161
|
+
@patch("src.rxiv_maker.utils.rich_upgrade_notifier.click.confirm")
|
|
162
|
+
def test_confirm_upgrade_accepted(self, mock_confirm):
|
|
163
|
+
"""Test user confirms upgrade."""
|
|
164
|
+
mock_confirm.return_value = True
|
|
165
|
+
|
|
166
|
+
result = self.notifier.confirm_upgrade("1.1.0")
|
|
167
|
+
|
|
168
|
+
assert result is True
|
|
169
|
+
mock_confirm.assert_called_once()
|
|
170
|
+
# Check that version is in the confirmation prompt
|
|
171
|
+
call_args = mock_confirm.call_args[0]
|
|
172
|
+
assert "1.1.0" in call_args[0]
|
|
173
|
+
|
|
174
|
+
@patch("src.rxiv_maker.utils.rich_upgrade_notifier.click.confirm")
|
|
175
|
+
def test_confirm_upgrade_declined(self, mock_confirm):
|
|
176
|
+
"""Test user declines upgrade."""
|
|
177
|
+
mock_confirm.return_value = False
|
|
178
|
+
|
|
179
|
+
result = self.notifier.confirm_upgrade("1.1.0")
|
|
180
|
+
|
|
181
|
+
assert result is False
|
|
182
|
+
mock_confirm.assert_called_once()
|
|
183
|
+
|
|
184
|
+
@patch("src.rxiv_maker.utils.rich_upgrade_notifier.click.confirm")
|
|
185
|
+
def test_confirm_upgrade_keyboard_interrupt(self, mock_confirm):
|
|
186
|
+
"""Test keyboard interrupt during confirmation."""
|
|
187
|
+
mock_confirm.side_effect = KeyboardInterrupt()
|
|
188
|
+
|
|
189
|
+
result = self.notifier.confirm_upgrade("1.1.0")
|
|
190
|
+
|
|
191
|
+
assert result is False
|
|
192
|
+
# Check that cancellation message was shown
|
|
193
|
+
assert self.console.print.called
|
|
194
|
+
calls_text = " ".join(str(call) for call in self.console.print.call_args_list)
|
|
195
|
+
assert "cancel" in calls_text.lower()
|
|
196
|
+
|
|
197
|
+
@patch("src.rxiv_maker.utils.rich_upgrade_notifier.click.confirm")
|
|
198
|
+
def test_confirm_upgrade_eof_error(self, mock_confirm):
|
|
199
|
+
"""Test EOF error during confirmation."""
|
|
200
|
+
mock_confirm.side_effect = EOFError()
|
|
201
|
+
|
|
202
|
+
result = self.notifier.confirm_upgrade("1.1.0")
|
|
203
|
+
|
|
204
|
+
assert result is False
|
|
205
|
+
# Check that cancellation message was shown
|
|
206
|
+
assert self.console.print.called
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"""Tests for the upgrade command."""
|
|
2
|
+
|
|
3
|
+
from unittest.mock import patch
|
|
4
|
+
|
|
5
|
+
from click.testing import CliRunner
|
|
6
|
+
|
|
7
|
+
from src.rxiv_maker.cli.commands.upgrade import upgrade
|
|
8
|
+
|
|
9
|
+
# Patch paths for the upgrade module
|
|
10
|
+
PATCH_PATH_DETECT = "src.rxiv_maker.cli.commands.upgrade.detect_install_method"
|
|
11
|
+
PATCH_PATH_WORKFLOW = "src.rxiv_maker.cli.commands.upgrade.handle_upgrade_workflow"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestUpgradeCommand:
|
|
15
|
+
"""Test upgrade command functionality."""
|
|
16
|
+
|
|
17
|
+
def setup_method(self):
|
|
18
|
+
"""Set up test environment."""
|
|
19
|
+
self.runner = CliRunner()
|
|
20
|
+
|
|
21
|
+
@patch(PATCH_PATH_DETECT)
|
|
22
|
+
def test_upgrade_dev_installation_warning(self, mock_detect):
|
|
23
|
+
"""Test that dev installations show a warning and exit."""
|
|
24
|
+
mock_detect.return_value = "dev"
|
|
25
|
+
|
|
26
|
+
result = self.runner.invoke(upgrade)
|
|
27
|
+
|
|
28
|
+
assert result.exit_code == 0
|
|
29
|
+
assert "Development installation detected" in result.output
|
|
30
|
+
assert "git pull" in result.output
|
|
31
|
+
|
|
32
|
+
@patch(PATCH_PATH_DETECT)
|
|
33
|
+
@patch(PATCH_PATH_WORKFLOW)
|
|
34
|
+
def test_upgrade_success(self, mock_workflow, mock_detect):
|
|
35
|
+
"""Test successful upgrade."""
|
|
36
|
+
mock_detect.return_value = "pip"
|
|
37
|
+
mock_workflow.return_value = (True, None)
|
|
38
|
+
|
|
39
|
+
result = self.runner.invoke(upgrade, ["--yes"])
|
|
40
|
+
|
|
41
|
+
assert result.exit_code == 0
|
|
42
|
+
mock_workflow.assert_called_once()
|
|
43
|
+
# Verify workflow called with correct parameters
|
|
44
|
+
call_args = mock_workflow.call_args
|
|
45
|
+
assert call_args[1]["package_name"] == "rxiv-maker"
|
|
46
|
+
assert call_args[1]["skip_confirmation"] is True
|
|
47
|
+
assert call_args[1]["check_only"] is False
|
|
48
|
+
|
|
49
|
+
@patch(PATCH_PATH_DETECT)
|
|
50
|
+
@patch(PATCH_PATH_WORKFLOW)
|
|
51
|
+
def test_upgrade_check_only(self, mock_workflow, mock_detect):
|
|
52
|
+
"""Test --check-only flag."""
|
|
53
|
+
mock_detect.return_value = "pip"
|
|
54
|
+
mock_workflow.return_value = (True, None)
|
|
55
|
+
|
|
56
|
+
result = self.runner.invoke(upgrade, ["--check-only"])
|
|
57
|
+
|
|
58
|
+
assert result.exit_code == 0
|
|
59
|
+
call_args = mock_workflow.call_args
|
|
60
|
+
assert call_args[1]["check_only"] is True
|
|
61
|
+
|
|
62
|
+
@patch(PATCH_PATH_DETECT)
|
|
63
|
+
@patch(PATCH_PATH_WORKFLOW)
|
|
64
|
+
def test_upgrade_without_yes_flag(self, mock_workflow, mock_detect):
|
|
65
|
+
"""Test upgrade without --yes flag (interactive mode)."""
|
|
66
|
+
mock_detect.return_value = "pip"
|
|
67
|
+
mock_workflow.return_value = (True, None)
|
|
68
|
+
|
|
69
|
+
result = self.runner.invoke(upgrade)
|
|
70
|
+
|
|
71
|
+
assert result.exit_code == 0
|
|
72
|
+
call_args = mock_workflow.call_args
|
|
73
|
+
assert call_args[1]["skip_confirmation"] is False
|
|
74
|
+
|
|
75
|
+
@patch(PATCH_PATH_DETECT)
|
|
76
|
+
@patch(PATCH_PATH_WORKFLOW)
|
|
77
|
+
def test_upgrade_failure(self, mock_workflow, mock_detect):
|
|
78
|
+
"""Test failed upgrade."""
|
|
79
|
+
mock_detect.return_value = "pip"
|
|
80
|
+
mock_workflow.return_value = (False, "Network error")
|
|
81
|
+
|
|
82
|
+
result = self.runner.invoke(upgrade, ["--yes"])
|
|
83
|
+
|
|
84
|
+
assert result.exit_code == 1
|
|
85
|
+
|
|
86
|
+
@patch(PATCH_PATH_DETECT)
|
|
87
|
+
@patch(PATCH_PATH_WORKFLOW)
|
|
88
|
+
def test_upgrade_homebrew(self, mock_workflow, mock_detect):
|
|
89
|
+
"""Test upgrade with Homebrew installation."""
|
|
90
|
+
mock_detect.return_value = "homebrew"
|
|
91
|
+
mock_workflow.return_value = (True, None)
|
|
92
|
+
|
|
93
|
+
result = self.runner.invoke(upgrade, ["--yes"])
|
|
94
|
+
|
|
95
|
+
assert result.exit_code == 0
|
|
96
|
+
mock_workflow.assert_called_once()
|
|
97
|
+
|
|
98
|
+
@patch(PATCH_PATH_DETECT)
|
|
99
|
+
@patch(PATCH_PATH_WORKFLOW)
|
|
100
|
+
def test_upgrade_uv(self, mock_workflow, mock_detect):
|
|
101
|
+
"""Test upgrade with uv installation."""
|
|
102
|
+
mock_detect.return_value = "uv"
|
|
103
|
+
mock_workflow.return_value = (True, None)
|
|
104
|
+
|
|
105
|
+
result = self.runner.invoke(upgrade, ["--yes"])
|
|
106
|
+
|
|
107
|
+
assert result.exit_code == 0
|
|
108
|
+
mock_workflow.assert_called_once()
|
|
109
|
+
|
|
110
|
+
@patch(PATCH_PATH_DETECT)
|
|
111
|
+
@patch(PATCH_PATH_WORKFLOW)
|
|
112
|
+
def test_upgrade_pipx(self, mock_workflow, mock_detect):
|
|
113
|
+
"""Test upgrade with pipx installation."""
|
|
114
|
+
mock_detect.return_value = "pipx"
|
|
115
|
+
mock_workflow.return_value = (True, None)
|
|
116
|
+
|
|
117
|
+
result = self.runner.invoke(upgrade, ["--yes"])
|
|
118
|
+
|
|
119
|
+
assert result.exit_code == 0
|
|
120
|
+
mock_workflow.assert_called_once()
|
|
121
|
+
|
|
122
|
+
@patch(PATCH_PATH_DETECT)
|
|
123
|
+
@patch(PATCH_PATH_WORKFLOW)
|
|
124
|
+
def test_upgrade_github_params(self, mock_workflow, mock_detect):
|
|
125
|
+
"""Test that GitHub organization and repo are passed correctly."""
|
|
126
|
+
mock_detect.return_value = "pip"
|
|
127
|
+
mock_workflow.return_value = (True, None)
|
|
128
|
+
|
|
129
|
+
result = self.runner.invoke(upgrade, ["--yes"])
|
|
130
|
+
|
|
131
|
+
assert result.exit_code == 0
|
|
132
|
+
call_args = mock_workflow.call_args
|
|
133
|
+
assert call_args[1]["github_org"] == "HenriquesLab"
|
|
134
|
+
assert call_args[1]["github_repo"] == "rxiv-maker"
|