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.
Files changed (398) hide show
  1. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/.gitignore +1 -2
  2. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/CHANGELOG.md +12 -0
  3. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/PKG-INFO +10 -5
  4. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/README.md +8 -3
  5. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/pyproject.toml +1 -1
  6. rxiv_maker-1.16.7/src/docs/api/README.md +4 -0
  7. rxiv_maker-1.16.7/src/docs/api/index.md +4 -0
  8. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/__version__.py +1 -1
  9. rxiv_maker-1.16.7/src/rxiv_maker/cli/commands/upgrade.py +52 -0
  10. rxiv_maker-1.16.7/src/rxiv_maker/utils/rich_upgrade_notifier.py +162 -0
  11. rxiv_maker-1.16.7/tests/unit/test_rich_upgrade_notifier.py +206 -0
  12. rxiv_maker-1.16.7/tests/unit/test_upgrade_command.py +134 -0
  13. rxiv_maker-1.16.6/src/docs/api/README.md +0 -28
  14. rxiv_maker-1.16.6/src/docs/api/__version__.py.md +0 -9
  15. rxiv_maker-1.16.6/src/docs/api/author_name_formatter.py.md +0 -165
  16. rxiv_maker-1.16.6/src/docs/api/bibliography_parser.py.md +0 -123
  17. rxiv_maker-1.16.6/src/docs/api/cache_utils.py.md +0 -150
  18. rxiv_maker-1.16.6/src/docs/api/changelog_parser.py.md +0 -260
  19. rxiv_maker-1.16.6/src/docs/api/citation_utils.py.md +0 -78
  20. rxiv_maker-1.16.6/src/docs/api/email_encoder.py.md +0 -126
  21. rxiv_maker-1.16.6/src/docs/api/error_codes.py.md +0 -49
  22. rxiv_maker-1.16.6/src/docs/api/figure_utils.py.md +0 -253
  23. rxiv_maker-1.16.6/src/docs/api/github.py.md +0 -312
  24. rxiv_maker-1.16.6/src/docs/api/homebrew_checker.py.md +0 -99
  25. rxiv_maker-1.16.6/src/docs/api/index.md +0 -28
  26. rxiv_maker-1.16.6/src/docs/api/install_detector.py.md +0 -81
  27. rxiv_maker-1.16.6/src/docs/api/logging_config.py.md +0 -371
  28. rxiv_maker-1.16.6/src/docs/api/operation_ids.py.md +0 -218
  29. rxiv_maker-1.16.6/src/docs/api/platform.py.md +0 -527
  30. rxiv_maker-1.16.6/src/docs/api/python_execution_reporter.py.md +0 -302
  31. rxiv_maker-1.16.6/src/docs/api/text_utils.py.md +0 -71
  32. rxiv_maker-1.16.6/src/docs/api/unicode_safe.py.md +0 -230
  33. rxiv_maker-1.16.6/src/docs/api/url_to_doi.py.md +0 -80
  34. rxiv_maker-1.16.6/src/docs/api/validate.py.md +0 -142
  35. rxiv_maker-1.16.6/src/rxiv_maker/cli/commands/upgrade.py +0 -164
  36. rxiv_maker-1.16.6/tests/unit/test_upgrade_command.py +0 -193
  37. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/LICENSE +0 -0
  38. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/logo/logo-rxiv-maker.afdesign +0 -0
  39. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/logo/logo-rxiv-maker.png +0 -0
  40. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/logo/logo-rxiv-maker.svg +0 -0
  41. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/__init__.py +0 -0
  42. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/__init__.py +0 -0
  43. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/__main__.py +0 -0
  44. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/__init__.py +0 -0
  45. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/arxiv.py +0 -0
  46. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/bibliography.py +0 -0
  47. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/build.py +0 -0
  48. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/cache_management.py +0 -0
  49. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/changelog.py +0 -0
  50. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/check_installation.py +0 -0
  51. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/clean.py +0 -0
  52. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/completion.py +0 -0
  53. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/config.py +0 -0
  54. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/create_repo.py +0 -0
  55. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/docx.py +0 -0
  56. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/figures.py +0 -0
  57. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/get_rxiv_preprint.py +0 -0
  58. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/init.py +0 -0
  59. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/install_deps.py +0 -0
  60. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/repo_init.py +0 -0
  61. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/repos.py +0 -0
  62. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/repos_search.py +0 -0
  63. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/setup.py +0 -0
  64. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/track_changes.py +0 -0
  65. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/validate.py +0 -0
  66. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/commands/version.py +0 -0
  67. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/__init__.py +0 -0
  68. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/base.py +0 -0
  69. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/cache_commands.py +0 -0
  70. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/config_commands.py +0 -0
  71. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/content_commands.py +0 -0
  72. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/decorators.py +0 -0
  73. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/utility_commands.py +0 -0
  74. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework/workflow_commands.py +0 -0
  75. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/framework.py +0 -0
  76. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/interactive.py +0 -0
  77. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/interactive_prompts.py +0 -0
  78. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/cli/main.py +0 -0
  79. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/config/defaults.py +0 -0
  80. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/config/validator.py +0 -0
  81. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/__init__.py +0 -0
  82. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/citation_processor.py +0 -0
  83. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/code_processor.py +0 -0
  84. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/comment_processor.py +0 -0
  85. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/custom_command_processor.py +0 -0
  86. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/figure_processor.py +0 -0
  87. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/html_processor.py +0 -0
  88. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/list_processor.py +0 -0
  89. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/math_processor.py +0 -0
  90. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/md2tex.py +0 -0
  91. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/python_executor.py +0 -0
  92. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/section_processor.py +0 -0
  93. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/supplementary_note_processor.py +0 -0
  94. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/table_processor.py +0 -0
  95. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/text_formatters.py +0 -0
  96. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/types.py +0 -0
  97. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/converters/url_processor.py +0 -0
  98. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/__init__.py +0 -0
  99. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/advanced_cache.py +0 -0
  100. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/bibliography_cache.py +0 -0
  101. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/cache_utils.py +0 -0
  102. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/doi_cache.py +0 -0
  103. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/cache/secure_cache_utils.py +0 -0
  104. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/content_processor.py +0 -0
  105. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/environment_bootstrap.py +0 -0
  106. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/environment_manager.py +0 -0
  107. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/error_codes.py +0 -0
  108. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/error_recovery.py +0 -0
  109. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/logging_config.py +0 -0
  110. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/__init__.py +0 -0
  111. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/cache_manager.py +0 -0
  112. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/config_manager.py +0 -0
  113. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/dependency_manager.py +0 -0
  114. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/execution_manager.py +0 -0
  115. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/file_manager.py +0 -0
  116. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/install_manager.py +0 -0
  117. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/state_manager.py +0 -0
  118. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/unified_config_manager.py +0 -0
  119. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/validation_manager.py +0 -0
  120. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/managers/workflow_manager.py +0 -0
  121. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/path_manager.py +0 -0
  122. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/progress_framework.py +0 -0
  123. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/repo_config.py +0 -0
  124. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/repository.py +0 -0
  125. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/session_optimizer.py +0 -0
  126. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/core/validation_framework.py +0 -0
  127. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/data/tips.yaml +0 -0
  128. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/__init__.py +0 -0
  129. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/__init__.py +0 -0
  130. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/add_bibliography.py +0 -0
  131. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/build_manager.py +0 -0
  132. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/cleanup.py +0 -0
  133. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/fix_bibliography.py +0 -0
  134. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/generate_docs.py +0 -0
  135. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/generate_figures.py +0 -0
  136. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/generate_preprint.py +0 -0
  137. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/prepare_arxiv.py +0 -0
  138. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/setup_environment.py +0 -0
  139. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/track_changes.py +0 -0
  140. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/validate.py +0 -0
  141. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/engines/operations/validate_pdf.py +0 -0
  142. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/__init__.py +0 -0
  143. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/docx_citation_mapper.py +0 -0
  144. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/docx_content_processor.py +0 -0
  145. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/docx_exporter.py +0 -0
  146. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/exporters/docx_writer.py +0 -0
  147. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/__init__.py +0 -0
  148. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/dependency_handlers/__init__.py +0 -0
  149. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/dependency_handlers/latex.py +0 -0
  150. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/dependency_handlers/r_lang.py +0 -0
  151. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/dependency_handlers/system_libs.py +0 -0
  152. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/__init__.py +0 -0
  153. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/base.py +0 -0
  154. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/linux.py +0 -0
  155. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/macos.py +0 -0
  156. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/platform_installers/windows.py +0 -0
  157. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/utils/__init__.py +0 -0
  158. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/utils/logging.py +0 -0
  159. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/utils/progress.py +0 -0
  160. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/install/utils/verification.py +0 -0
  161. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/manuscript_utils/__init__.py +0 -0
  162. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/manuscript_utils/figure_utils.py +0 -0
  163. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/__init__.py +0 -0
  164. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/author_processor.py +0 -0
  165. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/markdown_preprocessor.py +0 -0
  166. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/template_processor.py +0 -0
  167. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/processors/yaml_processor.py +0 -0
  168. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/rxiv_maker_cli.py +0 -0
  169. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/scripts/__init__.py +0 -0
  170. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/scripts/custom_doc_generator.py +0 -0
  171. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/scripts/validate_manuscript.py +0 -0
  172. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/__init__.py +0 -0
  173. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/base.py +0 -0
  174. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/build_service.py +0 -0
  175. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/configuration_service.py +0 -0
  176. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/manuscript_service.py +0 -0
  177. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/publication_service.py +0 -0
  178. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/services/validation_service.py +0 -0
  179. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/templates/__init__.py +0 -0
  180. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/templates/manager.py +0 -0
  181. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/templates/registry.py +0 -0
  182. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/tex/python_execution_section.tex +0 -0
  183. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/__init__.py +0 -0
  184. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/author_name_formatter.py +0 -0
  185. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/bibliography_checksum.py +0 -0
  186. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/bibliography_parser.py +0 -0
  187. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/bst_generator.py +0 -0
  188. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/changelog_parser.py +0 -0
  189. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/citation_utils.py +0 -0
  190. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/dependency_checker.py +0 -0
  191. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/docx_helpers.py +0 -0
  192. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/doi_resolver.py +0 -0
  193. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/email_encoder.py +0 -0
  194. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/figure_checksum.py +0 -0
  195. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/file_helpers.py +0 -0
  196. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/github.py +0 -0
  197. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/homebrew_checker.py +0 -0
  198. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/install_detector.py +0 -0
  199. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/operation_ids.py +0 -0
  200. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/pdf_utils.py +0 -0
  201. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/performance.py +0 -0
  202. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/platform.py +0 -0
  203. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/python_execution_reporter.py +0 -0
  204. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/retry.py +0 -0
  205. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/text_utils.py +0 -0
  206. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/tips.py +0 -0
  207. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/title_sync.py +0 -0
  208. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/unicode_safe.py +0 -0
  209. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/update_checker.py +0 -0
  210. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/utils/url_to_doi.py +0 -0
  211. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validate.py +0 -0
  212. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/__init__.py +0 -0
  213. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/base_validator.py +0 -0
  214. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/citation_validator.py +0 -0
  215. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/doi/__init__.py +0 -0
  216. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/doi/api_clients.py +0 -0
  217. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/doi/metadata_comparator.py +0 -0
  218. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/doi_validator.py +0 -0
  219. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/figure_validator.py +0 -0
  220. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/latex_error_parser.py +0 -0
  221. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/math_validator.py +0 -0
  222. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/pdf_validator.py +0 -0
  223. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/reference_validator.py +0 -0
  224. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/rxiv_maker/validators/syntax_validator.py +0 -0
  225. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/tex/style/rxiv_maker_style.bst +0 -0
  226. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/tex/style/rxiv_maker_style.cls +0 -0
  227. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/src/tex/template.tex +0 -0
  228. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/__init__.py +0 -0
  229. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/__init__.py +0 -0
  230. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/test_build.py +0 -0
  231. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/test_changelog_command.py +0 -0
  232. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/test_init_command.py +0 -0
  233. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/cli/test_main.py +0 -0
  234. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/conftest.py +0 -0
  235. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/e2e/__init__.py +0 -0
  236. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/e2e/test_dummy_manuscript_generator.py +0 -0
  237. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/e2e/test_figure_workflow_validation.py +0 -0
  238. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/00_CONFIG.yml +0 -0
  239. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/01_MAIN.md +0 -0
  240. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/03_REFERENCES.bib +0 -0
  241. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/FIGURES/Fig1.png +0 -0
  242. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/FIGURES/Fig2.png +0 -0
  243. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/FIGURES/Fig3.png +0 -0
  244. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/README.md +0 -0
  245. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/01_MAIN.md +0 -0
  246. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/02_SUPPLEMENTARY_INFO.md +0 -0
  247. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/03_REFERENCES.bib +0 -0
  248. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/2025__unknown_et_al__rxiv.docx +0 -0
  249. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/fixtures/docx_export/sample_manuscript/sample_manuscript.docx +0 -0
  250. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/__init__.py +0 -0
  251. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_article_generation.py +0 -0
  252. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_bibliography_author_format_docx.py +0 -0
  253. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_binary_distribution.py +0 -0
  254. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_centralized_components.py +0 -0
  255. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_citation_injection.py +0 -0
  256. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_comment_system_integration.py +0 -0
  257. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_docx_export_integration.py +0 -0
  258. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_doi_fallback_integration.py +0 -0
  259. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_doi_validation_integration.py +0 -0
  260. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_example_manuscript.py +0 -0
  261. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_guillaume_fixtures.py +0 -0
  262. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_homebrew_workflow_validation.py +0 -0
  263. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_infrastructure_suite.py +0 -0
  264. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_init_build_workflow.py +0 -0
  265. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_install_verification_integration.py +0 -0
  266. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_latex_dependency_integration.py +0 -0
  267. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_manuscript_directory_integration.py +0 -0
  268. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_manuscript_python_execution_reporting.py +0 -0
  269. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_practical_manuscript_workflows.py +0 -0
  270. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_pypi_package_integration.py +0 -0
  271. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_python_execution_integration.py +0 -0
  272. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_repository_cli_integration.py +0 -0
  273. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_supplementary_formatting.py +0 -0
  274. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_user_reported_issue.py +0 -0
  275. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/integration/test_validation_workflow.py +0 -0
  276. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/README.md +0 -0
  277. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/conftest.py +0 -0
  278. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_cli_argument_parsing.py +0 -0
  279. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_discord_reported_issues.py +0 -0
  280. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_error_message_quality.py +0 -0
  281. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_google_colab_integration.py +0 -0
  282. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_guillaume_edge_cases.py +0 -0
  283. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_guillaume_pr131_rewrite.py +0 -0
  284. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_path_resolution.py +0 -0
  285. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_widget_author_behavior.py +0 -0
  286. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/regression/test_widget_interactions_playwright.py +0 -0
  287. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/smoke/__init__.py +0 -0
  288. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/smoke/test_basic_functionality.py +0 -0
  289. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/smoke/test_cli_smoke.py +0 -0
  290. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/system/__init__.py +0 -0
  291. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/system/test_ci_matrix.py +0 -0
  292. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/system/test_cli_workflows.py +0 -0
  293. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/system/test_end_to_end.py +0 -0
  294. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/test_homebrew_checker.py +0 -0
  295. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/test_install_detector.py +0 -0
  296. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/__init__.py +0 -0
  297. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/exporters/__init__.py +0 -0
  298. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/exporters/test_docx_citation_mapper.py +0 -0
  299. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/exporters/test_docx_content_processor.py +0 -0
  300. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_add_bibliography.py +0 -0
  301. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_arxiv_command.py +0 -0
  302. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_async_execution_manager.py +0 -0
  303. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_author_name_formatter.py +0 -0
  304. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_author_processor.py +0 -0
  305. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_build_command.py +0 -0
  306. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_build_manager.py +0 -0
  307. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_build_manager_manuscript_path.py +0 -0
  308. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cache_security.py +0 -0
  309. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cache_utils.py +0 -0
  310. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_check_installation_command.py +0 -0
  311. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_citation_processor.py +0 -0
  312. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_citation_rendering.py +0 -0
  313. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_citation_style.py +0 -0
  314. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_citation_utils.py +0 -0
  315. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cli_cleanup_integration.py +0 -0
  316. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cli_structure.py +0 -0
  317. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_comment_processor.py +0 -0
  318. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_conda_installation_manager.py +0 -0
  319. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_conda_platform_detection.py +0 -0
  320. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_cross_platform_optimizations.py +0 -0
  321. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_custom_command_processor.py +0 -0
  322. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_dependency_manager.py +0 -0
  323. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_dependency_package_names.py +0 -0
  324. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_docx_helpers.py +0 -0
  325. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_doi_fallback_system.py +0 -0
  326. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_doi_resolver.py +0 -0
  327. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_doi_validator.py +0 -0
  328. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_email_encoder.py +0 -0
  329. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_environment_manager.py +0 -0
  330. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_error_handling_scenarios.py +0 -0
  331. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_execution_manager_comprehensive.py +0 -0
  332. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_figure_generator.py +0 -0
  333. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_figure_processor.py +0 -0
  334. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_figure_processor_error_handling.py +0 -0
  335. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_file_helpers.py +0 -0
  336. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_fix_bibliography.py +0 -0
  337. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_generate_docs.py +0 -0
  338. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_generate_preprint.py +0 -0
  339. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_github.py +0 -0
  340. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_github_actions_integration.py +0 -0
  341. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_importlib_edge_cases.py +0 -0
  342. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_install_platform_installers.py +0 -0
  343. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_install_system_libs.py +0 -0
  344. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_install_verification.py +0 -0
  345. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_interactive_path_change.py +0 -0
  346. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_interactive_validators.py +0 -0
  347. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_latex_dependency_handler.py +0 -0
  348. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_manuscript_figure_utils.py +0 -0
  349. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_manuscript_repository.py +0 -0
  350. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_math_processor.py +0 -0
  351. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_md2tex.py +0 -0
  352. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_mermaid_fallback.py +0 -0
  353. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_path_manager.py +0 -0
  354. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_pdf_validator.py +0 -0
  355. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_platform_comprehensive.py +0 -0
  356. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_platform_detector.py +0 -0
  357. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_processor_suite.py +0 -0
  358. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_python_execution_reporter.py +0 -0
  359. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_python_executor.py +0 -0
  360. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_release_orchestrator.py +0 -0
  361. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_repository_manager.py +0 -0
  362. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_rxiv_setup_command.py +0 -0
  363. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_security_features.py +0 -0
  364. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_security_scanner.py +0 -0
  365. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_setup_environment.py +0 -0
  366. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_style_file_resolution.py +0 -0
  367. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_supplementary_note_processor.py +0 -0
  368. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_table_rotation.py +0 -0
  369. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_template_processor.py +0 -0
  370. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_text_formatters.py +0 -0
  371. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_text_utils.py +0 -0
  372. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_tips.py +0 -0
  373. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_title_sync.py +0 -0
  374. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_title_sync_validation.py +0 -0
  375. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_track_changes.py +0 -0
  376. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_trailing_slash_regression.py +0 -0
  377. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_url_to_doi.py +0 -0
  378. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_utils.py +0 -0
  379. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validate_backticks.py +0 -0
  380. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validate_command_fixed.py +0 -0
  381. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validate_manuscript.py +0 -0
  382. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validation_suite.py +0 -0
  383. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_validators.py +0 -0
  384. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/unit/test_yaml_processor.py +0 -0
  385. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/README.md +0 -0
  386. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/00_CONFIG.yml +0 -0
  387. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/01_MAIN.md +0 -0
  388. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/03_REFERENCES.bib +0 -0
  389. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/FIGURES/Figure__positioning_test.png +0 -0
  390. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/FIGURES/Figure__positioning_test.py +0 -0
  391. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/FIGURES/ReadyFig.png +0 -0
  392. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/FIGURES/ReadyFig.py +0 -0
  393. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/figure-positioning/README.md +0 -0
  394. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/00_CONFIG.yml +0 -0
  395. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/01_MAIN.md +0 -0
  396. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/02_SUPPLEMENTARY_INFO.md +0 -0
  397. {rxiv_maker-1.16.6 → rxiv_maker-1.16.7}/tests/visual/methods-placement/03_REFERENCES.bib +0 -0
  398. {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.6
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.1.3
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
- rxiv upgrade # Upgrade to latest version
362
- rxiv changelog # View changelog and release notes
363
- rxiv changelog --recent 5 # View last 5 versions
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
- rxiv upgrade # Upgrade to latest version
285
- rxiv changelog # View changelog and release notes
286
- rxiv changelog --recent 5 # View last 5 versions
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.
@@ -53,7 +53,7 @@ dependencies = [
53
53
  "GitPython>=3.1.0",
54
54
  "prompt_toolkit>=3.0.0",
55
55
  # Update checking
56
- "henriqueslab-updater>=1.1.3",
56
+ "henriqueslab-updater>=1.2.0",
57
57
  ]
58
58
 
59
59
  [project.urls]
@@ -0,0 +1,4 @@
1
+ # API Documentation
2
+
3
+ Welcome to the API documentation for rxiv-maker.
4
+
@@ -0,0 +1,4 @@
1
+ # API Documentation
2
+
3
+ Welcome to the API documentation for rxiv-maker.
4
+
@@ -1,3 +1,3 @@
1
1
  """Version information."""
2
2
 
3
- __version__ = "1.16.6"
3
+ __version__ = "1.16.7"
@@ -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"