lixplore-cli 1.2.2__tar.gz → 1.2.3__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 (98) hide show
  1. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/CHANGELOG.md +6 -0
  2. {lixplore_cli-1.2.2/lixplore_cli.egg-info → lixplore_cli-1.2.3}/PKG-INFO +9 -1
  3. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/README.md +8 -0
  4. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/search-sources.md +26 -0
  5. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/pubmed.py +16 -7
  6. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3/lixplore_cli.egg-info}/PKG-INFO +9 -1
  7. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/pyproject.toml +1 -1
  8. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/LICENSE +0 -0
  9. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/MANIFEST.in +0 -0
  10. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/README.md +0 -0
  11. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/about/changelog.md +0 -0
  12. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/about/contributing.md +0 -0
  13. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/about/faq.md +0 -0
  14. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/about/license.md +0 -0
  15. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/ai-integration.md +0 -0
  16. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/automation.md +0 -0
  17. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/custom-apis.md +0 -0
  18. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/profiles.md +0 -0
  19. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/zotero.md +0 -0
  20. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/examples/automation-examples.md +0 -0
  21. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/examples/integrations.md +0 -0
  22. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/examples/use-cases.md +0 -0
  23. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/examples/workflows.md +0 -0
  24. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/getting-started/basic-usage.md +0 -0
  25. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/getting-started/first-search.md +0 -0
  26. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/getting-started/installation.md +0 -0
  27. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/getting-started/quickstart.md +0 -0
  28. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/alerts.md +0 -0
  29. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/annotations.md +0 -0
  30. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/export.md +0 -0
  31. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/filtering.md +0 -0
  32. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/interactive.md +0 -0
  33. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/pdf.md +0 -0
  34. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/search.md +0 -0
  35. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/index.md +0 -0
  36. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/lixplore.1 +0 -0
  37. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/lixplore.md +0 -0
  38. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/annotation-flags.md +0 -0
  39. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/display-flags.md +0 -0
  40. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/export-flags.md +0 -0
  41. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/filter-flags.md +0 -0
  42. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/flags-overview.md +0 -0
  43. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/flags.md +0 -0
  44. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/interactive-flags.md +0 -0
  45. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/search-flags.md +0 -0
  46. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/source-flags.md +0 -0
  47. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/utility-flags.md +0 -0
  48. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/__init__.py +0 -0
  49. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/__main__.py +0 -0
  50. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/__init__.py +0 -0
  51. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/__main__.py +0 -0
  52. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/config.py +0 -0
  53. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/env.example +0 -0
  54. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/gate.py +0 -0
  55. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/notify.py +0 -0
  56. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/render.py +0 -0
  57. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/runner.py +0 -0
  58. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/state.py +0 -0
  59. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/cli.py +0 -0
  60. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/commands.py +0 -0
  61. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/dispatcher.py +0 -0
  62. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/search.py +0 -0
  63. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/__init__.py +0 -0
  64. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/arxiv.py +0 -0
  65. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/crossref.py +0 -0
  66. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/doaj.py +0 -0
  67. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/europepmc.py +0 -0
  68. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/templates/__init__.py +0 -0
  69. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/templates/ieee.json +0 -0
  70. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/templates/nature.json +0 -0
  71. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/templates/science.json +0 -0
  72. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/tui/__init__.py +0 -0
  73. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/tui/app.py +0 -0
  74. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/tui/modals.py +0 -0
  75. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/annotations.py +0 -0
  76. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/cache.py +0 -0
  77. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/citations.py +0 -0
  78. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/custom_apis.py +0 -0
  79. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/enhanced_tui.py +0 -0
  80. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/enrichment.py +0 -0
  81. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/export.py +0 -0
  82. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/interactive_tui.py +0 -0
  83. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/pdf_downloader.py +0 -0
  84. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/profiles.py +0 -0
  85. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/reference_managers.py +0 -0
  86. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/rich_check.py +0 -0
  87. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/shell_mode.py +0 -0
  88. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/statistics.py +0 -0
  89. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/template_engine.py +0 -0
  90. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/terminal.py +0 -0
  91. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/wizard_mode.py +0 -0
  92. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/SOURCES.txt +0 -0
  93. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/dependency_links.txt +0 -0
  94. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/entry_points.txt +0 -0
  95. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/requires.txt +0 -0
  96. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/top_level.txt +0 -0
  97. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/requirements.txt +0 -0
  98. {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/setup.cfg +0 -0
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.3] - 2026-09-27
11
+
12
+ ### Added
13
+ - PubMed email and API key can be set in `~/.lixplore/config.json`, which also works for pip,
14
+ AUR and Homebrew installs (before, only `PUBMED_EMAIL` / `PUBMED_API_KEY` did)
15
+
10
16
  ## [1.2.2] - 2026-09-27
11
17
 
12
18
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lixplore-cli
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: Unix-inspired CLI for searching PubMed, arXiv, Crossref, DOAJ and Europe PMC, with deduplication, 8 export formats and scheduled paper alerts
5
5
  Author-email: Balasubramanian Periannan <balathepharmacist@gmail.com>
6
6
  Maintainer-email: Balasubramanian Periannan <balathepharmacist@gmail.com>
@@ -364,6 +364,14 @@ pip install "lixplore-cli[tui]"
364
364
  sudo pacman -S python-textual
365
365
  ```
366
366
 
367
+ ### 🔑 Optional: PubMed email and API key
368
+
369
+ An NCBI API key raises PubMed's rate limit from 3 to 10 requests per second ([get one free](https://www.ncbi.nlm.nih.gov/account/settings/)). Set `PUBMED_EMAIL` / `PUBMED_API_KEY` in your environment, or create `~/.lixplore/config.json`:
370
+
371
+ ```json
372
+ {"pubmed": {"email": "you@example.org", "api_key": "your-ncbi-key"}}
373
+ ```
374
+
367
375
  ### ✅ Verify Installation
368
376
 
369
377
  ```bash
@@ -314,6 +314,14 @@ pip install "lixplore-cli[tui]"
314
314
  sudo pacman -S python-textual
315
315
  ```
316
316
 
317
+ ### 🔑 Optional: PubMed email and API key
318
+
319
+ An NCBI API key raises PubMed's rate limit from 3 to 10 requests per second ([get one free](https://www.ncbi.nlm.nih.gov/account/settings/)). Set `PUBMED_EMAIL` / `PUBMED_API_KEY` in your environment, or create `~/.lixplore/config.json`:
320
+
321
+ ```json
322
+ {"pubmed": {"email": "you@example.org", "api_key": "your-ncbi-key"}}
323
+ ```
324
+
317
325
  ### ✅ Verify Installation
318
326
 
319
327
  ```bash
@@ -26,6 +26,32 @@
26
26
  lixplore -P -q "diabetes treatment" -m 20
27
27
  ```
28
28
 
29
+ ### Email and API key (optional)
30
+
31
+ NCBI asks every tool to send a contact email, and an API key raises the rate
32
+ limit from 3 to 10 requests per second. Get a free key under
33
+ [NCBI account settings](https://www.ncbi.nlm.nih.gov/account/settings/). Set either:
34
+
35
+ ```bash
36
+ # Environment variables (e.g. in ~/.bashrc)
37
+ export PUBMED_EMAIL="you@example.org"
38
+ export PUBMED_API_KEY="your-ncbi-key"
39
+ ```
40
+
41
+ or `~/.lixplore/config.json`:
42
+
43
+ ```json
44
+ {"pubmed": {"email": "you@example.org", "api_key": "your-ncbi-key"}}
45
+ ```
46
+
47
+ The config file wins over the environment variables.
48
+
49
+ ### If PubMed reports "temporarily unavailable"
50
+
51
+ That message comes from NCBI's own servers (for example "Cannot connect to
52
+ SOLR"). Lixplore retries twice; if NCBI is still down, try again a few
53
+ minutes later. Other sources keep working meanwhile.
54
+
29
55
  ### Advanced Search Techniques
30
56
 
31
57
  **1. MeSH Terms (Medical Subject Headings)**
@@ -17,17 +17,26 @@ import time
17
17
 
18
18
  # Load configuration
19
19
  def _load_config():
20
- """Load email from config.json, fallback to environment or default"""
21
- config_path = os.path.join(os.path.dirname(__file__), "..", "..", "config.json")
22
- try:
23
- with open(config_path, 'r') as f:
24
- config = json.load(f)
20
+ """Load email from config.json, fallback to environment or default.
21
+
22
+ Looks in config.json of a source checkout first, then in
23
+ ~/.lixplore/config.json (works for pip, AUR and Homebrew installs):
24
+ {"pubmed": {"email": "you@example.org", "api_key": "..."}}
25
+ """
26
+ config_paths = [
27
+ os.path.join(os.path.dirname(__file__), "..", "..", "config.json"),
28
+ os.path.join(os.path.expanduser("~"), ".lixplore", "config.json"),
29
+ ]
30
+ for config_path in config_paths:
31
+ try:
32
+ with open(config_path, 'r') as f:
33
+ config = json.load(f)
25
34
  email = config.get("pubmed", {}).get("email", "")
26
35
  api_key = config.get("pubmed", {}).get("api_key", "")
27
36
  if email and email != "your_email@example.com":
28
37
  return email, api_key
29
- except (FileNotFoundError, json.JSONDecodeError):
30
- pass
38
+ except (OSError, ValueError, AttributeError):
39
+ pass
31
40
 
32
41
  # Fallback to environment variable or default
33
42
  email = os.environ.get("PUBMED_EMAIL", "user@example.com")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lixplore-cli
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: Unix-inspired CLI for searching PubMed, arXiv, Crossref, DOAJ and Europe PMC, with deduplication, 8 export formats and scheduled paper alerts
5
5
  Author-email: Balasubramanian Periannan <balathepharmacist@gmail.com>
6
6
  Maintainer-email: Balasubramanian Periannan <balathepharmacist@gmail.com>
@@ -364,6 +364,14 @@ pip install "lixplore-cli[tui]"
364
364
  sudo pacman -S python-textual
365
365
  ```
366
366
 
367
+ ### 🔑 Optional: PubMed email and API key
368
+
369
+ An NCBI API key raises PubMed's rate limit from 3 to 10 requests per second ([get one free](https://www.ncbi.nlm.nih.gov/account/settings/)). Set `PUBMED_EMAIL` / `PUBMED_API_KEY` in your environment, or create `~/.lixplore/config.json`:
370
+
371
+ ```json
372
+ {"pubmed": {"email": "you@example.org", "api_key": "your-ncbi-key"}}
373
+ ```
374
+
367
375
  ### ✅ Verify Installation
368
376
 
369
377
  ```bash
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "lixplore-cli"
7
- version = "1.2.2"
7
+ version = "1.2.3"
8
8
  description = "Unix-inspired CLI for searching PubMed, arXiv, Crossref, DOAJ and Europe PMC, with deduplication, 8 export formats and scheduled paper alerts"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
File without changes
File without changes
File without changes
File without changes