adsfolio 0.5.1__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 (185) hide show
  1. adsfolio-0.5.1/LICENSE +28 -0
  2. adsfolio-0.5.1/PKG-INFO +168 -0
  3. adsfolio-0.5.1/README.md +122 -0
  4. adsfolio-0.5.1/pyproject.toml +114 -0
  5. adsfolio-0.5.1/setup.cfg +4 -0
  6. adsfolio-0.5.1/src/adsfolio/__init__.py +16 -0
  7. adsfolio-0.5.1/src/adsfolio/api/__init__.py +9 -0
  8. adsfolio-0.5.1/src/adsfolio/api/export.py +293 -0
  9. adsfolio-0.5.1/src/adsfolio/api/journals.py +138 -0
  10. adsfolio-0.5.1/src/adsfolio/api/libraries.py +505 -0
  11. adsfolio-0.5.1/src/adsfolio/api/metrics.py +151 -0
  12. adsfolio-0.5.1/src/adsfolio/api/search.py +324 -0
  13. adsfolio-0.5.1/src/adsfolio/bibtex/__init__.py +22 -0
  14. adsfolio-0.5.1/src/adsfolio/bibtex/formatter.py +105 -0
  15. adsfolio-0.5.1/src/adsfolio/bibtex/io.py +118 -0
  16. adsfolio-0.5.1/src/adsfolio/bibtex/parser.py +287 -0
  17. adsfolio-0.5.1/src/adsfolio/bibtex/sanitize.py +188 -0
  18. adsfolio-0.5.1/src/adsfolio/citations.py +579 -0
  19. adsfolio-0.5.1/src/adsfolio/cli/__init__.py +12 -0
  20. adsfolio-0.5.1/src/adsfolio/cli/__main__.py +5 -0
  21. adsfolio-0.5.1/src/adsfolio/cli/commands.py +926 -0
  22. adsfolio-0.5.1/src/adsfolio/client.py +762 -0
  23. adsfolio-0.5.1/src/adsfolio/config.py +478 -0
  24. adsfolio-0.5.1/src/adsfolio/cv/__init__.py +70 -0
  25. adsfolio-0.5.1/src/adsfolio/cv/cli.py +303 -0
  26. adsfolio-0.5.1/src/adsfolio/cv/config.py +442 -0
  27. adsfolio-0.5.1/src/adsfolio/cv/config_starter.py +108 -0
  28. adsfolio-0.5.1/src/adsfolio/cv/query.py +103 -0
  29. adsfolio-0.5.1/src/adsfolio/cv/render_factory.py +43 -0
  30. adsfolio-0.5.1/src/adsfolio/cv/render_legend.py +64 -0
  31. adsfolio-0.5.1/src/adsfolio/cv/renderer.py +396 -0
  32. adsfolio-0.5.1/src/adsfolio/cv/template.py +372 -0
  33. adsfolio-0.5.1/src/adsfolio/data_migration.py +119 -0
  34. adsfolio-0.5.1/src/adsfolio/formatting.py +396 -0
  35. adsfolio-0.5.1/src/adsfolio/gui/__init__.py +1 -0
  36. adsfolio-0.5.1/src/adsfolio/gui/about.py +200 -0
  37. adsfolio-0.5.1/src/adsfolio/gui/ads_library_dialog.py +681 -0
  38. adsfolio-0.5.1/src/adsfolio/gui/ads_library_export_dialog.py +382 -0
  39. adsfolio-0.5.1/src/adsfolio/gui/ads_library_jobs.py +269 -0
  40. adsfolio-0.5.1/src/adsfolio/gui/annotation_merge.py +529 -0
  41. adsfolio-0.5.1/src/adsfolio/gui/app.py +55 -0
  42. adsfolio-0.5.1/src/adsfolio/gui/appearance.py +626 -0
  43. adsfolio-0.5.1/src/adsfolio/gui/assets/adsfolio.icns +0 -0
  44. adsfolio-0.5.1/src/adsfolio/gui/assets/adsfolio.ico +0 -0
  45. adsfolio-0.5.1/src/adsfolio/gui/assets/adsfolio.png +0 -0
  46. adsfolio-0.5.1/src/adsfolio/gui/assets/adsfolio.svg +108 -0
  47. adsfolio-0.5.1/src/adsfolio/gui/citation_styles.py +637 -0
  48. adsfolio-0.5.1/src/adsfolio/gui/config.py +483 -0
  49. adsfolio-0.5.1/src/adsfolio/gui/cv_dialog.py +1160 -0
  50. adsfolio-0.5.1/src/adsfolio/gui/detail_pane.py +1660 -0
  51. adsfolio-0.5.1/src/adsfolio/gui/dialogs.py +1014 -0
  52. adsfolio-0.5.1/src/adsfolio/gui/icons.py +157 -0
  53. adsfolio-0.5.1/src/adsfolio/gui/jobs.py +196 -0
  54. adsfolio-0.5.1/src/adsfolio/gui/library.py +321 -0
  55. adsfolio-0.5.1/src/adsfolio/gui/main_window.py +3583 -0
  56. adsfolio-0.5.1/src/adsfolio/gui/models.py +562 -0
  57. adsfolio-0.5.1/src/adsfolio/gui/notifications.py +230 -0
  58. adsfolio-0.5.1/src/adsfolio/gui/osint.py +297 -0
  59. adsfolio-0.5.1/src/adsfolio/gui/references_dialog.py +435 -0
  60. adsfolio-0.5.1/src/adsfolio/gui/refresh_job.py +82 -0
  61. adsfolio-0.5.1/src/adsfolio/gui/token_dialog.py +186 -0
  62. adsfolio-0.5.1/src/adsfolio/gui/update_dialog.py +382 -0
  63. adsfolio-0.5.1/src/adsfolio/gui/updates.py +538 -0
  64. adsfolio-0.5.1/src/adsfolio/gui/watch.py +699 -0
  65. adsfolio-0.5.1/src/adsfolio/gui/welcome.py +149 -0
  66. adsfolio-0.5.1/src/adsfolio/journal_utils.py +272 -0
  67. adsfolio-0.5.1/src/adsfolio/library_sync.py +531 -0
  68. adsfolio-0.5.1/src/adsfolio/pdf/__init__.py +38 -0
  69. adsfolio-0.5.1/src/adsfolio/pdf/annotation_merge.py +771 -0
  70. adsfolio-0.5.1/src/adsfolio/pdf/annotations.py +393 -0
  71. adsfolio-0.5.1/src/adsfolio/pdf/arxiv.py +85 -0
  72. adsfolio-0.5.1/src/adsfolio/pdf/catalog.py +2008 -0
  73. adsfolio-0.5.1/src/adsfolio/pdf/cli.py +2267 -0
  74. adsfolio-0.5.1/src/adsfolio/pdf/cli_common.py +99 -0
  75. adsfolio-0.5.1/src/adsfolio/pdf/cli_upgrade.py +81 -0
  76. adsfolio-0.5.1/src/adsfolio/pdf/doi_providers.py +436 -0
  77. adsfolio-0.5.1/src/adsfolio/pdf/files.py +70 -0
  78. adsfolio-0.5.1/src/adsfolio/pdf/identifier.py +1694 -0
  79. adsfolio-0.5.1/src/adsfolio/pdf/identify.py +731 -0
  80. adsfolio-0.5.1/src/adsfolio/pdf/identify_settings.py +316 -0
  81. adsfolio-0.5.1/src/adsfolio/pdf/obsidian.py +208 -0
  82. adsfolio-0.5.1/src/adsfolio/pdf/prefetch.py +324 -0
  83. adsfolio-0.5.1/src/adsfolio/pdf/readiness.py +109 -0
  84. adsfolio-0.5.1/src/adsfolio/pdf/registry.py +792 -0
  85. adsfolio-0.5.1/src/adsfolio/pdf/rename_settings.py +187 -0
  86. adsfolio-0.5.1/src/adsfolio/pdf/renamer.py +454 -0
  87. adsfolio-0.5.1/src/adsfolio/pdf/sidecar.py +420 -0
  88. adsfolio-0.5.1/src/adsfolio/pdf/tracked_move.py +150 -0
  89. adsfolio-0.5.1/src/adsfolio/pdf/upgrade.py +364 -0
  90. adsfolio-0.5.1/src/adsfolio/pdf/upgrade_utils.py +318 -0
  91. adsfolio-0.5.1/src/adsfolio/pdf/watch_session.py +738 -0
  92. adsfolio-0.5.1/src/adsfolio/pdf/watcher.py +676 -0
  93. adsfolio-0.5.1/src/adsfolio/pubcache.py +146 -0
  94. adsfolio-0.5.1/src/adsfolio/reference_cli.py +230 -0
  95. adsfolio-0.5.1/src/adsfolio/references.py +438 -0
  96. adsfolio-0.5.1/src/adsfolio/user_profile.py +225 -0
  97. adsfolio-0.5.1/src/adsfolio.egg-info/PKG-INFO +168 -0
  98. adsfolio-0.5.1/src/adsfolio.egg-info/SOURCES.txt +183 -0
  99. adsfolio-0.5.1/src/adsfolio.egg-info/dependency_links.txt +1 -0
  100. adsfolio-0.5.1/src/adsfolio.egg-info/entry_points.txt +3 -0
  101. adsfolio-0.5.1/src/adsfolio.egg-info/requires.txt +17 -0
  102. adsfolio-0.5.1/src/adsfolio.egg-info/top_level.txt +1 -0
  103. adsfolio-0.5.1/tests/test_api_export_complete.py +167 -0
  104. adsfolio-0.5.1/tests/test_api_libraries.py +191 -0
  105. adsfolio-0.5.1/tests/test_bibtex_rawfile.py +42 -0
  106. adsfolio-0.5.1/tests/test_bibtex_sanitize.py +155 -0
  107. adsfolio-0.5.1/tests/test_citations.py +486 -0
  108. adsfolio-0.5.1/tests/test_cli_module.py +20 -0
  109. adsfolio-0.5.1/tests/test_cli_set.py +272 -0
  110. adsfolio-0.5.1/tests/test_client_http.py +175 -0
  111. adsfolio-0.5.1/tests/test_client_pdf.py +590 -0
  112. adsfolio-0.5.1/tests/test_config_setup.py +275 -0
  113. adsfolio-0.5.1/tests/test_cv_cli.py +169 -0
  114. adsfolio-0.5.1/tests/test_cv_config.py +154 -0
  115. adsfolio-0.5.1/tests/test_cv_query.py +88 -0
  116. adsfolio-0.5.1/tests/test_cv_renderer.py +114 -0
  117. adsfolio-0.5.1/tests/test_cv_template.py +295 -0
  118. adsfolio-0.5.1/tests/test_data_migration.py +122 -0
  119. adsfolio-0.5.1/tests/test_formatting.py +228 -0
  120. adsfolio-0.5.1/tests/test_gui_ads_library_dialog.py +608 -0
  121. adsfolio-0.5.1/tests/test_gui_ads_library_export_dialog.py +404 -0
  122. adsfolio-0.5.1/tests/test_gui_ads_library_jobs.py +539 -0
  123. adsfolio-0.5.1/tests/test_gui_ads_library_main_window.py +740 -0
  124. adsfolio-0.5.1/tests/test_gui_annotation_merge.py +223 -0
  125. adsfolio-0.5.1/tests/test_gui_appearance.py +335 -0
  126. adsfolio-0.5.1/tests/test_gui_citation_styles.py +532 -0
  127. adsfolio-0.5.1/tests/test_gui_config.py +297 -0
  128. adsfolio-0.5.1/tests/test_gui_cv_dialog.py +364 -0
  129. adsfolio-0.5.1/tests/test_gui_detail_layout.py +172 -0
  130. adsfolio-0.5.1/tests/test_gui_detail_links.py +162 -0
  131. adsfolio-0.5.1/tests/test_gui_detail_pane.py +1319 -0
  132. adsfolio-0.5.1/tests/test_gui_dialogs.py +908 -0
  133. adsfolio-0.5.1/tests/test_gui_icons.py +178 -0
  134. adsfolio-0.5.1/tests/test_gui_jobs.py +125 -0
  135. adsfolio-0.5.1/tests/test_gui_library.py +199 -0
  136. adsfolio-0.5.1/tests/test_gui_local_references_main_window.py +87 -0
  137. adsfolio-0.5.1/tests/test_gui_main_window_watch.py +2003 -0
  138. adsfolio-0.5.1/tests/test_gui_models.py +379 -0
  139. adsfolio-0.5.1/tests/test_gui_navigation.py +342 -0
  140. adsfolio-0.5.1/tests/test_gui_notifications.py +225 -0
  141. adsfolio-0.5.1/tests/test_gui_osint.py +109 -0
  142. adsfolio-0.5.1/tests/test_gui_references_dialog.py +209 -0
  143. adsfolio-0.5.1/tests/test_gui_resolution_marker.py +69 -0
  144. adsfolio-0.5.1/tests/test_gui_token_dialog.py +195 -0
  145. adsfolio-0.5.1/tests/test_gui_update_install.py +403 -0
  146. adsfolio-0.5.1/tests/test_gui_updates.py +494 -0
  147. adsfolio-0.5.1/tests/test_gui_verification_display.py +224 -0
  148. adsfolio-0.5.1/tests/test_gui_watch_controller.py +490 -0
  149. adsfolio-0.5.1/tests/test_gui_welcome.py +93 -0
  150. adsfolio-0.5.1/tests/test_library_export.py +300 -0
  151. adsfolio-0.5.1/tests/test_library_sync.py +326 -0
  152. adsfolio-0.5.1/tests/test_macos_dmg.py +158 -0
  153. adsfolio-0.5.1/tests/test_pdf_annotation_merge.py +353 -0
  154. adsfolio-0.5.1/tests/test_pdf_annotations.py +260 -0
  155. adsfolio-0.5.1/tests/test_pdf_arxiv.py +115 -0
  156. adsfolio-0.5.1/tests/test_pdf_bibcode_linking.py +207 -0
  157. adsfolio-0.5.1/tests/test_pdf_catalog.py +884 -0
  158. adsfolio-0.5.1/tests/test_pdf_catalog_lookup.py +396 -0
  159. adsfolio-0.5.1/tests/test_pdf_catalog_stale.py +310 -0
  160. adsfolio-0.5.1/tests/test_pdf_cli.py +2412 -0
  161. adsfolio-0.5.1/tests/test_pdf_doi_providers.py +232 -0
  162. adsfolio-0.5.1/tests/test_pdf_files.py +63 -0
  163. adsfolio-0.5.1/tests/test_pdf_identifier.py +1420 -0
  164. adsfolio-0.5.1/tests/test_pdf_identifier_providers.py +203 -0
  165. adsfolio-0.5.1/tests/test_pdf_identify_paths.py +43 -0
  166. adsfolio-0.5.1/tests/test_pdf_identify_relocation.py +882 -0
  167. adsfolio-0.5.1/tests/test_pdf_identify_settings.py +156 -0
  168. adsfolio-0.5.1/tests/test_pdf_metrics_refresh.py +181 -0
  169. adsfolio-0.5.1/tests/test_pdf_obsidian.py +181 -0
  170. adsfolio-0.5.1/tests/test_pdf_prefetch.py +222 -0
  171. adsfolio-0.5.1/tests/test_pdf_readiness.py +195 -0
  172. adsfolio-0.5.1/tests/test_pdf_registry.py +928 -0
  173. adsfolio-0.5.1/tests/test_pdf_rename_settings.py +113 -0
  174. adsfolio-0.5.1/tests/test_pdf_renamer.py +340 -0
  175. adsfolio-0.5.1/tests/test_pdf_sidecar.py +235 -0
  176. adsfolio-0.5.1/tests/test_pdf_upgrade.py +264 -0
  177. adsfolio-0.5.1/tests/test_pdf_watch_session.py +596 -0
  178. adsfolio-0.5.1/tests/test_pdf_watcher.py +1193 -0
  179. adsfolio-0.5.1/tests/test_pubcache.py +51 -0
  180. adsfolio-0.5.1/tests/test_pubcache_cli.py +33 -0
  181. adsfolio-0.5.1/tests/test_reference_cli.py +160 -0
  182. adsfolio-0.5.1/tests/test_references.py +400 -0
  183. adsfolio-0.5.1/tests/test_release_tools.py +139 -0
  184. adsfolio-0.5.1/tests/test_search_query_all.py +175 -0
  185. adsfolio-0.5.1/tests/test_user_profile.py +96 -0
adsfolio-0.5.1/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Yoonsoo P. Bach
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,168 @@
1
+ Metadata-Version: 2.4
2
+ Name: adsfolio
3
+ Version: 0.5.1
4
+ Summary: Research PDF management with ADS, Crossref, DataCite, and local references
5
+ Author-email: "Yoonsoo P. Bach" <ysbach20766@gmail.com>
6
+ License-Expression: BSD-3-Clause
7
+ Project-URL: Homepage, https://github.com/ysBach/adsfolio
8
+ Project-URL: Documentation, https://ysbach.github.io/adsfolio/docs/
9
+ Project-URL: Repository, https://github.com/ysBach/adsfolio
10
+ Project-URL: Issues, https://github.com/ysBach/adsfolio/issues
11
+ Keywords: ads,scixplorer,astronomy,astrophysics,heliophysics,physics,life-sciences,space-biology,microgravity,materials-science,earth-science,atmospheric-science,oceanography,planetary-science,bibliography,scientific-literature
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Scientific/Engineering
20
+ Classifier: Topic :: Scientific/Engineering :: Astronomy
21
+ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
22
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
23
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
24
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
25
+ Classifier: Topic :: Scientific/Engineering :: Oceanography
26
+ Classifier: Topic :: Scientific/Engineering :: Physics
27
+ Requires-Python: >=3.10
28
+ Description-Content-Type: text/markdown
29
+ License-File: LICENSE
30
+ Requires-Dist: requests>=2.28
31
+ Requires-Dist: click>=8.0
32
+ Requires-Dist: platformdirs>=3.0
33
+ Requires-Dist: tqdm>=4.66
34
+ Requires-Dist: pypdf>=4.0
35
+ Requires-Dist: pyyaml>=6.0
36
+ Requires-Dist: bibtexparser<2,>=1.4.3
37
+ Requires-Dist: pyparsing>=3.0
38
+ Provides-Extra: full
39
+ Requires-Dist: pymupdf>=1.24; extra == "full"
40
+ Requires-Dist: watchdog>=3.0; extra == "full"
41
+ Requires-Dist: iso4>=0.0.2; extra == "full"
42
+ Provides-Extra: gui
43
+ Requires-Dist: PySide6>=6.6; extra == "gui"
44
+ Requires-Dist: packaging>=23.2; extra == "gui"
45
+ Dynamic: license-file
46
+
47
+ # ADSfolio
48
+
49
+ A desktop application and Python toolkit for organizing research PDFs with NASA
50
+ ADS / SciXplorer, Crossref, and DataCite metadata. ADSfolio is an independent
51
+ project, not an official ADS application.
52
+
53
+ ![ADSfolio logo](https://raw.githubusercontent.com/ysBach/adsfolio/main/docs/_static/adsfolio.png)
54
+
55
+ ## Start with the PDFs you already have
56
+
57
+ Add your existing PDF folder. Identify papers in a batch, inspect their metadata,
58
+ and preview useful filenames before you rename anything. You can keep your
59
+ current folder structure. You do not need to import PDFs into managed storage.
60
+
61
+ Identification checks saved results before online lookups. Lookup time depends on
62
+ PDF text quality, cache coverage, provider limits, and your connection. No fixed
63
+ speed claim applies to every collection. Start with one folder to check results.
64
+
65
+ ![ADSfolio library window](https://raw.githubusercontent.com/ysBach/adsfolio/main/docs/_static/app-overview.png)
66
+
67
+ *Application screenshot with illustrative sample data. Version 0.5.0 shown.*
68
+
69
+ [Website](https://ysbach.github.io/adsfolio/) · [First-library tutorial](https://ysbach.github.io/adsfolio/docs/getting-started.html) · [Application guide](https://ysbach.github.io/adsfolio/docs/gui.html)
70
+
71
+ ## Three everyday workflows
72
+
73
+ - **Keep a BibTeX file for your paper.** Add the papers you cite to a NASA ADS
74
+ library, then choose **Tools → Export ADS Library…** to save a `.bib` file for
75
+ LaTeX or Overleaf. `adsfolio library watch` keeps that file current while you
76
+ write.
77
+ - **Watch a folder and rename new papers.** Right-click a library and choose
78
+ **Watch Current Library** and **Automatically Identify & Rename**. Each new PDF
79
+ gets publication details and a filename from your Rename template.
80
+ - **Make your CV from your publications.** **Tools → CV Generator…** builds your
81
+ publication list from NASA ADS in LaTeX, HTML, Markdown, plain text, or your
82
+ own template. You choose how to highlight your name and how each entry looks.
83
+
84
+ [See the three workflows with screenshots and a short video](https://ysbach.github.io/adsfolio/docs/workflows.html).
85
+
86
+ ## Install the desktop app
87
+
88
+ Download [ADSfolio 0.5.1](https://github.com/ysBach/adsfolio/releases/latest).
89
+ macOS downloads include DMG installers and ZIP archives.
90
+ Desktop downloads include Python and the application dependencies. You do not
91
+ need a Python environment or an ADS token to browse your local library.
92
+
93
+ | System | Download and open |
94
+ | --- | --- |
95
+ | macOS 15+, Apple Silicon | Open `adsfolio-macos-arm64.dmg`, drag `ADSfolio.app` to Applications, then open it. |
96
+ | macOS 15+, Intel | Open `adsfolio-macos-x86_64.dmg`, drag `ADSfolio.app` to Applications, then open it. |
97
+ | Windows x86-64 | Extract `adsfolio-windows-x86_64.zip`, then open `adsfolio.exe` inside the extracted folder. |
98
+ | Linux x86-64 | Extract `adsfolio-linux-x86_64.tar.gz`, then run `adsfolio` inside the extracted folder. Requires glibc 2.39+ and system desktop libraries. |
99
+
100
+ Keep the complete extracted folder together on Windows and Linux.
101
+ See the [platform requirements](https://ysbach.github.io/adsfolio/docs/desktop.html) for details.
102
+
103
+ ### macOS with Homebrew
104
+
105
+ ```sh
106
+ brew install --cask ysBach/adsfolio/adsfolio
107
+ open -a ADSfolio
108
+ ```
109
+
110
+ **Version 0.5.1 is unsigned and not notarized.** macOS can block opening even
111
+ when Homebrew installation succeeds. After attempting to open ADSfolio, review
112
+ **System Settings → Privacy & Security → Open Anyway** if macOS offers that
113
+ option. Approve it only if you trust the release. Installation alone does not
114
+ establish that the app can open. Windows can also show publisher warnings.
115
+
116
+ ### Start using your library
117
+
118
+ ![ADSfolio welcome page with three setup steps](https://raw.githubusercontent.com/ysBach/adsfolio/main/docs/_static/welcome.png)
119
+
120
+ *Welcome page of a new installation. Version 0.5.0 shown.*
121
+
122
+ [Watch the 28-second first-run video](https://ysbach.github.io/adsfolio/docs/getting-started.html#watch-the-first-run).
123
+
124
+ 1. Open ADSfolio. Choose **Add PDF Folder…** on the welcome page and select your
125
+ PDF folder. If it has subfolders, choose **Include Subfolders** or
126
+ **This Folder Only**.
127
+ 2. Select a PDF to inspect or edit its metadata. Double-click a row to open it
128
+ in your system PDF viewer.
129
+ 3. Choose **OK** in the **Identify** prompt to look up publication metadata.
130
+ The prompt also opens after adding a folder. Token setup opens if ADS needs it.
131
+ **Advanced options…** changes the provider order. Crossref and DataCite can
132
+ look up DOIs without an ADS token. Files keep their names and locations.
133
+ 4. Preview **Rename** before applying filename changes. Papers with sufficient
134
+ metadata can be renamed without an ADS bibcode. Use **File → Local References…**
135
+ for manual entries and BibTeX import/export, including references without PDFs.
136
+ 5. Press **Refresh** or **F5** after moving or deleting files outside ADSfolio.
137
+ This reconciles local files. Use the separate ADS refresh actions to update
138
+ remote metadata. Permanent cleanup remains a separate operation.
139
+
140
+ See the [interactive application guide](https://ysbach.github.io/adsfolio/docs/gui.html) for watching folders,
141
+ selection, metadata editing, notifications, and refresh options.
142
+
143
+ ### Updates and existing libraries
144
+
145
+ Quit ADSfolio before replacing the app, or run `brew upgrade --cask adsfolio`.
146
+ The catalog, metadata, and history live in your user data directory, outside the
147
+ application bundle. Retain that directory when upgrading or uninstalling.
148
+
149
+ Earlier settings and catalogs are copied into ADSfolio storage on first use.
150
+ The source remains intact. Close the earlier application before migration and
151
+ keep its data until you check the migrated library. Saved automatic watch and
152
+ rename settings remain active, so review them before resuming library work.
153
+
154
+ ## CLI and Python
155
+
156
+ ADSfolio also provides search, bibliography export, and scripted PDF workflows.
157
+ See the [CLI and Python workflows](https://ysbach.github.io/adsfolio/docs/command-line-and-python.html),
158
+ [CLI tutorials](https://ysbach.github.io/adsfolio/docs/cli-tutorials/index.html), and [API reference](https://ysbach.github.io/adsfolio/docs/api/index.html).
159
+ Version 0.5.1 and later are on PyPI and need Python 3.10 or newer:
160
+
161
+ ```sh
162
+ pip install adsfolio # CLI and Python client
163
+ pip install "adsfolio[full,gui]" # also the desktop application (adsfolio-gui)
164
+ ```
165
+
166
+ ## License
167
+
168
+ BSD-3-Clause
@@ -0,0 +1,122 @@
1
+ # ADSfolio
2
+
3
+ A desktop application and Python toolkit for organizing research PDFs with NASA
4
+ ADS / SciXplorer, Crossref, and DataCite metadata. ADSfolio is an independent
5
+ project, not an official ADS application.
6
+
7
+ ![ADSfolio logo](https://raw.githubusercontent.com/ysBach/adsfolio/main/docs/_static/adsfolio.png)
8
+
9
+ ## Start with the PDFs you already have
10
+
11
+ Add your existing PDF folder. Identify papers in a batch, inspect their metadata,
12
+ and preview useful filenames before you rename anything. You can keep your
13
+ current folder structure. You do not need to import PDFs into managed storage.
14
+
15
+ Identification checks saved results before online lookups. Lookup time depends on
16
+ PDF text quality, cache coverage, provider limits, and your connection. No fixed
17
+ speed claim applies to every collection. Start with one folder to check results.
18
+
19
+ ![ADSfolio library window](https://raw.githubusercontent.com/ysBach/adsfolio/main/docs/_static/app-overview.png)
20
+
21
+ *Application screenshot with illustrative sample data. Version 0.5.0 shown.*
22
+
23
+ [Website](https://ysbach.github.io/adsfolio/) · [First-library tutorial](https://ysbach.github.io/adsfolio/docs/getting-started.html) · [Application guide](https://ysbach.github.io/adsfolio/docs/gui.html)
24
+
25
+ ## Three everyday workflows
26
+
27
+ - **Keep a BibTeX file for your paper.** Add the papers you cite to a NASA ADS
28
+ library, then choose **Tools → Export ADS Library…** to save a `.bib` file for
29
+ LaTeX or Overleaf. `adsfolio library watch` keeps that file current while you
30
+ write.
31
+ - **Watch a folder and rename new papers.** Right-click a library and choose
32
+ **Watch Current Library** and **Automatically Identify & Rename**. Each new PDF
33
+ gets publication details and a filename from your Rename template.
34
+ - **Make your CV from your publications.** **Tools → CV Generator…** builds your
35
+ publication list from NASA ADS in LaTeX, HTML, Markdown, plain text, or your
36
+ own template. You choose how to highlight your name and how each entry looks.
37
+
38
+ [See the three workflows with screenshots and a short video](https://ysbach.github.io/adsfolio/docs/workflows.html).
39
+
40
+ ## Install the desktop app
41
+
42
+ Download [ADSfolio 0.5.1](https://github.com/ysBach/adsfolio/releases/latest).
43
+ macOS downloads include DMG installers and ZIP archives.
44
+ Desktop downloads include Python and the application dependencies. You do not
45
+ need a Python environment or an ADS token to browse your local library.
46
+
47
+ | System | Download and open |
48
+ | --- | --- |
49
+ | macOS 15+, Apple Silicon | Open `adsfolio-macos-arm64.dmg`, drag `ADSfolio.app` to Applications, then open it. |
50
+ | macOS 15+, Intel | Open `adsfolio-macos-x86_64.dmg`, drag `ADSfolio.app` to Applications, then open it. |
51
+ | Windows x86-64 | Extract `adsfolio-windows-x86_64.zip`, then open `adsfolio.exe` inside the extracted folder. |
52
+ | Linux x86-64 | Extract `adsfolio-linux-x86_64.tar.gz`, then run `adsfolio` inside the extracted folder. Requires glibc 2.39+ and system desktop libraries. |
53
+
54
+ Keep the complete extracted folder together on Windows and Linux.
55
+ See the [platform requirements](https://ysbach.github.io/adsfolio/docs/desktop.html) for details.
56
+
57
+ ### macOS with Homebrew
58
+
59
+ ```sh
60
+ brew install --cask ysBach/adsfolio/adsfolio
61
+ open -a ADSfolio
62
+ ```
63
+
64
+ **Version 0.5.1 is unsigned and not notarized.** macOS can block opening even
65
+ when Homebrew installation succeeds. After attempting to open ADSfolio, review
66
+ **System Settings → Privacy & Security → Open Anyway** if macOS offers that
67
+ option. Approve it only if you trust the release. Installation alone does not
68
+ establish that the app can open. Windows can also show publisher warnings.
69
+
70
+ ### Start using your library
71
+
72
+ ![ADSfolio welcome page with three setup steps](https://raw.githubusercontent.com/ysBach/adsfolio/main/docs/_static/welcome.png)
73
+
74
+ *Welcome page of a new installation. Version 0.5.0 shown.*
75
+
76
+ [Watch the 28-second first-run video](https://ysbach.github.io/adsfolio/docs/getting-started.html#watch-the-first-run).
77
+
78
+ 1. Open ADSfolio. Choose **Add PDF Folder…** on the welcome page and select your
79
+ PDF folder. If it has subfolders, choose **Include Subfolders** or
80
+ **This Folder Only**.
81
+ 2. Select a PDF to inspect or edit its metadata. Double-click a row to open it
82
+ in your system PDF viewer.
83
+ 3. Choose **OK** in the **Identify** prompt to look up publication metadata.
84
+ The prompt also opens after adding a folder. Token setup opens if ADS needs it.
85
+ **Advanced options…** changes the provider order. Crossref and DataCite can
86
+ look up DOIs without an ADS token. Files keep their names and locations.
87
+ 4. Preview **Rename** before applying filename changes. Papers with sufficient
88
+ metadata can be renamed without an ADS bibcode. Use **File → Local References…**
89
+ for manual entries and BibTeX import/export, including references without PDFs.
90
+ 5. Press **Refresh** or **F5** after moving or deleting files outside ADSfolio.
91
+ This reconciles local files. Use the separate ADS refresh actions to update
92
+ remote metadata. Permanent cleanup remains a separate operation.
93
+
94
+ See the [interactive application guide](https://ysbach.github.io/adsfolio/docs/gui.html) for watching folders,
95
+ selection, metadata editing, notifications, and refresh options.
96
+
97
+ ### Updates and existing libraries
98
+
99
+ Quit ADSfolio before replacing the app, or run `brew upgrade --cask adsfolio`.
100
+ The catalog, metadata, and history live in your user data directory, outside the
101
+ application bundle. Retain that directory when upgrading or uninstalling.
102
+
103
+ Earlier settings and catalogs are copied into ADSfolio storage on first use.
104
+ The source remains intact. Close the earlier application before migration and
105
+ keep its data until you check the migrated library. Saved automatic watch and
106
+ rename settings remain active, so review them before resuming library work.
107
+
108
+ ## CLI and Python
109
+
110
+ ADSfolio also provides search, bibliography export, and scripted PDF workflows.
111
+ See the [CLI and Python workflows](https://ysbach.github.io/adsfolio/docs/command-line-and-python.html),
112
+ [CLI tutorials](https://ysbach.github.io/adsfolio/docs/cli-tutorials/index.html), and [API reference](https://ysbach.github.io/adsfolio/docs/api/index.html).
113
+ Version 0.5.1 and later are on PyPI and need Python 3.10 or newer:
114
+
115
+ ```sh
116
+ pip install adsfolio # CLI and Python client
117
+ pip install "adsfolio[full,gui]" # also the desktop application (adsfolio-gui)
118
+ ```
119
+
120
+ ## License
121
+
122
+ BSD-3-Clause
@@ -0,0 +1,114 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77.0.3", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "adsfolio"
7
+ dynamic = ["version"]
8
+ description = "Research PDF management with ADS, Crossref, DataCite, and local references"
9
+ authors = [
10
+ {name = "Yoonsoo P. Bach", email = "ysbach20766@gmail.com"}
11
+ ]
12
+ license = "BSD-3-Clause"
13
+ license-files = ["LICENSE"]
14
+ readme = "README.md"
15
+ keywords = [
16
+ "ads",
17
+ "scixplorer",
18
+ "astronomy",
19
+ "astrophysics",
20
+ "heliophysics",
21
+ "physics",
22
+ "life-sciences",
23
+ "space-biology",
24
+ "microgravity",
25
+ "materials-science",
26
+ "earth-science",
27
+ "atmospheric-science",
28
+ "oceanography",
29
+ "planetary-science",
30
+ "bibliography",
31
+ "scientific-literature",
32
+ ]
33
+ classifiers = [
34
+ "Development Status :: 3 - Alpha",
35
+ "Intended Audience :: Science/Research",
36
+ "Operating System :: OS Independent",
37
+ "Programming Language :: Python :: 3",
38
+ "Programming Language :: Python :: 3.10",
39
+ "Programming Language :: Python :: 3.11",
40
+ "Programming Language :: Python :: 3.12",
41
+ "Topic :: Scientific/Engineering",
42
+ "Topic :: Scientific/Engineering :: Astronomy",
43
+ "Topic :: Scientific/Engineering :: Atmospheric Science",
44
+ "Topic :: Scientific/Engineering :: Bio-Informatics",
45
+ "Topic :: Scientific/Engineering :: Chemistry",
46
+ "Topic :: Scientific/Engineering :: Information Analysis",
47
+ "Topic :: Scientific/Engineering :: Oceanography",
48
+ "Topic :: Scientific/Engineering :: Physics",
49
+ ]
50
+ requires-python = ">=3.10"
51
+ dependencies = [
52
+ "requests>=2.28",
53
+ "click>=8.0",
54
+ "platformdirs>=3.0",
55
+ "tqdm>=4.66",
56
+ "pypdf>=4.0",
57
+ "pyyaml>=6.0",
58
+ "bibtexparser>=1.4.3,<2",
59
+ "pyparsing>=3.0",
60
+ ]
61
+
62
+ [project.optional-dependencies]
63
+ full = [
64
+ "pymupdf>=1.24",
65
+ "watchdog>=3.0",
66
+ "iso4>=0.0.2",
67
+ ]
68
+ gui = ["PySide6>=6.6", "packaging>=23.2"]
69
+
70
+ [dependency-groups]
71
+ dev = [
72
+ "pytest>=7.0",
73
+ "pytest-cov>=4.0",
74
+ "pytest-qt>=4.2",
75
+ "isort>=5.13",
76
+ "ruff>=0.6",
77
+ ]
78
+ desktop = ["pyinstaller>=6.16,<7"]
79
+ docs = [
80
+ "sphinx>=7.4",
81
+ "myst-parser>=2.0",
82
+ "sphinx-click>=6.0",
83
+ "sphinx-rtd-theme>=2.0",
84
+ ]
85
+
86
+ [project.urls]
87
+ Homepage = "https://github.com/ysBach/adsfolio"
88
+ Documentation = "https://ysbach.github.io/adsfolio/docs/"
89
+ Repository = "https://github.com/ysBach/adsfolio"
90
+ Issues = "https://github.com/ysBach/adsfolio/issues"
91
+
92
+ [project.scripts]
93
+ adsfolio = "adsfolio.cli.commands:main"
94
+ adsfolio-gui = "adsfolio.cli.commands:gui_command"
95
+
96
+ [tool.setuptools.packages.find]
97
+ where = ["src"]
98
+
99
+ [tool.setuptools.package-data]
100
+ "adsfolio.gui" = ["assets/*"]
101
+
102
+ [tool.setuptools.dynamic]
103
+ version = {attr = "adsfolio.__version__"}
104
+
105
+ [tool.ruff]
106
+ target-version = "py310"
107
+
108
+ [tool.isort]
109
+ profile = "black"
110
+ known_third_party = ["packaging"]
111
+
112
+ [tool.pytest.ini_options]
113
+ testpaths = ["tests"]
114
+ python_files = "test_*.py"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,16 @@
1
+ """ADSfolio research library tools and NASA ADS client."""
2
+
3
+ from .client import ADSClient
4
+ from .config import Config
5
+ from .formatting import format_author_list_cv, format_title_latex
6
+ from .journal_utils import format_journal
7
+
8
+ __version__ = "0.5.1"
9
+ __all__ = [
10
+ "ADSClient",
11
+ "Config",
12
+ "__version__",
13
+ "format_author_list_cv",
14
+ "format_journal",
15
+ "format_title_latex",
16
+ ]
@@ -0,0 +1,9 @@
1
+ """API module exports."""
2
+
3
+ from .export import ExportAPI
4
+ from .journals import JournalsAPI
5
+ from .libraries import LibrariesAPI
6
+ from .metrics import MetricsAPI
7
+ from .search import SearchAPI
8
+
9
+ __all__ = ["ExportAPI", "JournalsAPI", "LibrariesAPI", "MetricsAPI", "SearchAPI"]