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.
- adsfolio-0.5.1/LICENSE +28 -0
- adsfolio-0.5.1/PKG-INFO +168 -0
- adsfolio-0.5.1/README.md +122 -0
- adsfolio-0.5.1/pyproject.toml +114 -0
- adsfolio-0.5.1/setup.cfg +4 -0
- adsfolio-0.5.1/src/adsfolio/__init__.py +16 -0
- adsfolio-0.5.1/src/adsfolio/api/__init__.py +9 -0
- adsfolio-0.5.1/src/adsfolio/api/export.py +293 -0
- adsfolio-0.5.1/src/adsfolio/api/journals.py +138 -0
- adsfolio-0.5.1/src/adsfolio/api/libraries.py +505 -0
- adsfolio-0.5.1/src/adsfolio/api/metrics.py +151 -0
- adsfolio-0.5.1/src/adsfolio/api/search.py +324 -0
- adsfolio-0.5.1/src/adsfolio/bibtex/__init__.py +22 -0
- adsfolio-0.5.1/src/adsfolio/bibtex/formatter.py +105 -0
- adsfolio-0.5.1/src/adsfolio/bibtex/io.py +118 -0
- adsfolio-0.5.1/src/adsfolio/bibtex/parser.py +287 -0
- adsfolio-0.5.1/src/adsfolio/bibtex/sanitize.py +188 -0
- adsfolio-0.5.1/src/adsfolio/citations.py +579 -0
- adsfolio-0.5.1/src/adsfolio/cli/__init__.py +12 -0
- adsfolio-0.5.1/src/adsfolio/cli/__main__.py +5 -0
- adsfolio-0.5.1/src/adsfolio/cli/commands.py +926 -0
- adsfolio-0.5.1/src/adsfolio/client.py +762 -0
- adsfolio-0.5.1/src/adsfolio/config.py +478 -0
- adsfolio-0.5.1/src/adsfolio/cv/__init__.py +70 -0
- adsfolio-0.5.1/src/adsfolio/cv/cli.py +303 -0
- adsfolio-0.5.1/src/adsfolio/cv/config.py +442 -0
- adsfolio-0.5.1/src/adsfolio/cv/config_starter.py +108 -0
- adsfolio-0.5.1/src/adsfolio/cv/query.py +103 -0
- adsfolio-0.5.1/src/adsfolio/cv/render_factory.py +43 -0
- adsfolio-0.5.1/src/adsfolio/cv/render_legend.py +64 -0
- adsfolio-0.5.1/src/adsfolio/cv/renderer.py +396 -0
- adsfolio-0.5.1/src/adsfolio/cv/template.py +372 -0
- adsfolio-0.5.1/src/adsfolio/data_migration.py +119 -0
- adsfolio-0.5.1/src/adsfolio/formatting.py +396 -0
- adsfolio-0.5.1/src/adsfolio/gui/__init__.py +1 -0
- adsfolio-0.5.1/src/adsfolio/gui/about.py +200 -0
- adsfolio-0.5.1/src/adsfolio/gui/ads_library_dialog.py +681 -0
- adsfolio-0.5.1/src/adsfolio/gui/ads_library_export_dialog.py +382 -0
- adsfolio-0.5.1/src/adsfolio/gui/ads_library_jobs.py +269 -0
- adsfolio-0.5.1/src/adsfolio/gui/annotation_merge.py +529 -0
- adsfolio-0.5.1/src/adsfolio/gui/app.py +55 -0
- adsfolio-0.5.1/src/adsfolio/gui/appearance.py +626 -0
- adsfolio-0.5.1/src/adsfolio/gui/assets/adsfolio.icns +0 -0
- adsfolio-0.5.1/src/adsfolio/gui/assets/adsfolio.ico +0 -0
- adsfolio-0.5.1/src/adsfolio/gui/assets/adsfolio.png +0 -0
- adsfolio-0.5.1/src/adsfolio/gui/assets/adsfolio.svg +108 -0
- adsfolio-0.5.1/src/adsfolio/gui/citation_styles.py +637 -0
- adsfolio-0.5.1/src/adsfolio/gui/config.py +483 -0
- adsfolio-0.5.1/src/adsfolio/gui/cv_dialog.py +1160 -0
- adsfolio-0.5.1/src/adsfolio/gui/detail_pane.py +1660 -0
- adsfolio-0.5.1/src/adsfolio/gui/dialogs.py +1014 -0
- adsfolio-0.5.1/src/adsfolio/gui/icons.py +157 -0
- adsfolio-0.5.1/src/adsfolio/gui/jobs.py +196 -0
- adsfolio-0.5.1/src/adsfolio/gui/library.py +321 -0
- adsfolio-0.5.1/src/adsfolio/gui/main_window.py +3583 -0
- adsfolio-0.5.1/src/adsfolio/gui/models.py +562 -0
- adsfolio-0.5.1/src/adsfolio/gui/notifications.py +230 -0
- adsfolio-0.5.1/src/adsfolio/gui/osint.py +297 -0
- adsfolio-0.5.1/src/adsfolio/gui/references_dialog.py +435 -0
- adsfolio-0.5.1/src/adsfolio/gui/refresh_job.py +82 -0
- adsfolio-0.5.1/src/adsfolio/gui/token_dialog.py +186 -0
- adsfolio-0.5.1/src/adsfolio/gui/update_dialog.py +382 -0
- adsfolio-0.5.1/src/adsfolio/gui/updates.py +538 -0
- adsfolio-0.5.1/src/adsfolio/gui/watch.py +699 -0
- adsfolio-0.5.1/src/adsfolio/gui/welcome.py +149 -0
- adsfolio-0.5.1/src/adsfolio/journal_utils.py +272 -0
- adsfolio-0.5.1/src/adsfolio/library_sync.py +531 -0
- adsfolio-0.5.1/src/adsfolio/pdf/__init__.py +38 -0
- adsfolio-0.5.1/src/adsfolio/pdf/annotation_merge.py +771 -0
- adsfolio-0.5.1/src/adsfolio/pdf/annotations.py +393 -0
- adsfolio-0.5.1/src/adsfolio/pdf/arxiv.py +85 -0
- adsfolio-0.5.1/src/adsfolio/pdf/catalog.py +2008 -0
- adsfolio-0.5.1/src/adsfolio/pdf/cli.py +2267 -0
- adsfolio-0.5.1/src/adsfolio/pdf/cli_common.py +99 -0
- adsfolio-0.5.1/src/adsfolio/pdf/cli_upgrade.py +81 -0
- adsfolio-0.5.1/src/adsfolio/pdf/doi_providers.py +436 -0
- adsfolio-0.5.1/src/adsfolio/pdf/files.py +70 -0
- adsfolio-0.5.1/src/adsfolio/pdf/identifier.py +1694 -0
- adsfolio-0.5.1/src/adsfolio/pdf/identify.py +731 -0
- adsfolio-0.5.1/src/adsfolio/pdf/identify_settings.py +316 -0
- adsfolio-0.5.1/src/adsfolio/pdf/obsidian.py +208 -0
- adsfolio-0.5.1/src/adsfolio/pdf/prefetch.py +324 -0
- adsfolio-0.5.1/src/adsfolio/pdf/readiness.py +109 -0
- adsfolio-0.5.1/src/adsfolio/pdf/registry.py +792 -0
- adsfolio-0.5.1/src/adsfolio/pdf/rename_settings.py +187 -0
- adsfolio-0.5.1/src/adsfolio/pdf/renamer.py +454 -0
- adsfolio-0.5.1/src/adsfolio/pdf/sidecar.py +420 -0
- adsfolio-0.5.1/src/adsfolio/pdf/tracked_move.py +150 -0
- adsfolio-0.5.1/src/adsfolio/pdf/upgrade.py +364 -0
- adsfolio-0.5.1/src/adsfolio/pdf/upgrade_utils.py +318 -0
- adsfolio-0.5.1/src/adsfolio/pdf/watch_session.py +738 -0
- adsfolio-0.5.1/src/adsfolio/pdf/watcher.py +676 -0
- adsfolio-0.5.1/src/adsfolio/pubcache.py +146 -0
- adsfolio-0.5.1/src/adsfolio/reference_cli.py +230 -0
- adsfolio-0.5.1/src/adsfolio/references.py +438 -0
- adsfolio-0.5.1/src/adsfolio/user_profile.py +225 -0
- adsfolio-0.5.1/src/adsfolio.egg-info/PKG-INFO +168 -0
- adsfolio-0.5.1/src/adsfolio.egg-info/SOURCES.txt +183 -0
- adsfolio-0.5.1/src/adsfolio.egg-info/dependency_links.txt +1 -0
- adsfolio-0.5.1/src/adsfolio.egg-info/entry_points.txt +3 -0
- adsfolio-0.5.1/src/adsfolio.egg-info/requires.txt +17 -0
- adsfolio-0.5.1/src/adsfolio.egg-info/top_level.txt +1 -0
- adsfolio-0.5.1/tests/test_api_export_complete.py +167 -0
- adsfolio-0.5.1/tests/test_api_libraries.py +191 -0
- adsfolio-0.5.1/tests/test_bibtex_rawfile.py +42 -0
- adsfolio-0.5.1/tests/test_bibtex_sanitize.py +155 -0
- adsfolio-0.5.1/tests/test_citations.py +486 -0
- adsfolio-0.5.1/tests/test_cli_module.py +20 -0
- adsfolio-0.5.1/tests/test_cli_set.py +272 -0
- adsfolio-0.5.1/tests/test_client_http.py +175 -0
- adsfolio-0.5.1/tests/test_client_pdf.py +590 -0
- adsfolio-0.5.1/tests/test_config_setup.py +275 -0
- adsfolio-0.5.1/tests/test_cv_cli.py +169 -0
- adsfolio-0.5.1/tests/test_cv_config.py +154 -0
- adsfolio-0.5.1/tests/test_cv_query.py +88 -0
- adsfolio-0.5.1/tests/test_cv_renderer.py +114 -0
- adsfolio-0.5.1/tests/test_cv_template.py +295 -0
- adsfolio-0.5.1/tests/test_data_migration.py +122 -0
- adsfolio-0.5.1/tests/test_formatting.py +228 -0
- adsfolio-0.5.1/tests/test_gui_ads_library_dialog.py +608 -0
- adsfolio-0.5.1/tests/test_gui_ads_library_export_dialog.py +404 -0
- adsfolio-0.5.1/tests/test_gui_ads_library_jobs.py +539 -0
- adsfolio-0.5.1/tests/test_gui_ads_library_main_window.py +740 -0
- adsfolio-0.5.1/tests/test_gui_annotation_merge.py +223 -0
- adsfolio-0.5.1/tests/test_gui_appearance.py +335 -0
- adsfolio-0.5.1/tests/test_gui_citation_styles.py +532 -0
- adsfolio-0.5.1/tests/test_gui_config.py +297 -0
- adsfolio-0.5.1/tests/test_gui_cv_dialog.py +364 -0
- adsfolio-0.5.1/tests/test_gui_detail_layout.py +172 -0
- adsfolio-0.5.1/tests/test_gui_detail_links.py +162 -0
- adsfolio-0.5.1/tests/test_gui_detail_pane.py +1319 -0
- adsfolio-0.5.1/tests/test_gui_dialogs.py +908 -0
- adsfolio-0.5.1/tests/test_gui_icons.py +178 -0
- adsfolio-0.5.1/tests/test_gui_jobs.py +125 -0
- adsfolio-0.5.1/tests/test_gui_library.py +199 -0
- adsfolio-0.5.1/tests/test_gui_local_references_main_window.py +87 -0
- adsfolio-0.5.1/tests/test_gui_main_window_watch.py +2003 -0
- adsfolio-0.5.1/tests/test_gui_models.py +379 -0
- adsfolio-0.5.1/tests/test_gui_navigation.py +342 -0
- adsfolio-0.5.1/tests/test_gui_notifications.py +225 -0
- adsfolio-0.5.1/tests/test_gui_osint.py +109 -0
- adsfolio-0.5.1/tests/test_gui_references_dialog.py +209 -0
- adsfolio-0.5.1/tests/test_gui_resolution_marker.py +69 -0
- adsfolio-0.5.1/tests/test_gui_token_dialog.py +195 -0
- adsfolio-0.5.1/tests/test_gui_update_install.py +403 -0
- adsfolio-0.5.1/tests/test_gui_updates.py +494 -0
- adsfolio-0.5.1/tests/test_gui_verification_display.py +224 -0
- adsfolio-0.5.1/tests/test_gui_watch_controller.py +490 -0
- adsfolio-0.5.1/tests/test_gui_welcome.py +93 -0
- adsfolio-0.5.1/tests/test_library_export.py +300 -0
- adsfolio-0.5.1/tests/test_library_sync.py +326 -0
- adsfolio-0.5.1/tests/test_macos_dmg.py +158 -0
- adsfolio-0.5.1/tests/test_pdf_annotation_merge.py +353 -0
- adsfolio-0.5.1/tests/test_pdf_annotations.py +260 -0
- adsfolio-0.5.1/tests/test_pdf_arxiv.py +115 -0
- adsfolio-0.5.1/tests/test_pdf_bibcode_linking.py +207 -0
- adsfolio-0.5.1/tests/test_pdf_catalog.py +884 -0
- adsfolio-0.5.1/tests/test_pdf_catalog_lookup.py +396 -0
- adsfolio-0.5.1/tests/test_pdf_catalog_stale.py +310 -0
- adsfolio-0.5.1/tests/test_pdf_cli.py +2412 -0
- adsfolio-0.5.1/tests/test_pdf_doi_providers.py +232 -0
- adsfolio-0.5.1/tests/test_pdf_files.py +63 -0
- adsfolio-0.5.1/tests/test_pdf_identifier.py +1420 -0
- adsfolio-0.5.1/tests/test_pdf_identifier_providers.py +203 -0
- adsfolio-0.5.1/tests/test_pdf_identify_paths.py +43 -0
- adsfolio-0.5.1/tests/test_pdf_identify_relocation.py +882 -0
- adsfolio-0.5.1/tests/test_pdf_identify_settings.py +156 -0
- adsfolio-0.5.1/tests/test_pdf_metrics_refresh.py +181 -0
- adsfolio-0.5.1/tests/test_pdf_obsidian.py +181 -0
- adsfolio-0.5.1/tests/test_pdf_prefetch.py +222 -0
- adsfolio-0.5.1/tests/test_pdf_readiness.py +195 -0
- adsfolio-0.5.1/tests/test_pdf_registry.py +928 -0
- adsfolio-0.5.1/tests/test_pdf_rename_settings.py +113 -0
- adsfolio-0.5.1/tests/test_pdf_renamer.py +340 -0
- adsfolio-0.5.1/tests/test_pdf_sidecar.py +235 -0
- adsfolio-0.5.1/tests/test_pdf_upgrade.py +264 -0
- adsfolio-0.5.1/tests/test_pdf_watch_session.py +596 -0
- adsfolio-0.5.1/tests/test_pdf_watcher.py +1193 -0
- adsfolio-0.5.1/tests/test_pubcache.py +51 -0
- adsfolio-0.5.1/tests/test_pubcache_cli.py +33 -0
- adsfolio-0.5.1/tests/test_reference_cli.py +160 -0
- adsfolio-0.5.1/tests/test_references.py +400 -0
- adsfolio-0.5.1/tests/test_release_tools.py +139 -0
- adsfolio-0.5.1/tests/test_search_query_all.py +175 -0
- 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.
|
adsfolio-0.5.1/PKG-INFO
ADDED
|
@@ -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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
adsfolio-0.5.1/README.md
ADDED
|
@@ -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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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"
|
adsfolio-0.5.1/setup.cfg
ADDED
|
@@ -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"]
|