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.
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/CHANGELOG.md +6 -0
- {lixplore_cli-1.2.2/lixplore_cli.egg-info → lixplore_cli-1.2.3}/PKG-INFO +9 -1
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/README.md +8 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/search-sources.md +26 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/pubmed.py +16 -7
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3/lixplore_cli.egg-info}/PKG-INFO +9 -1
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/pyproject.toml +1 -1
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/LICENSE +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/MANIFEST.in +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/README.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/about/changelog.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/about/contributing.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/about/faq.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/about/license.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/ai-integration.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/automation.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/custom-apis.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/profiles.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/advanced/zotero.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/examples/automation-examples.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/examples/integrations.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/examples/use-cases.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/examples/workflows.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/getting-started/basic-usage.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/getting-started/first-search.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/getting-started/installation.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/getting-started/quickstart.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/alerts.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/annotations.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/export.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/filtering.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/interactive.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/pdf.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/guide/search.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/index.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/lixplore.1 +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/lixplore.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/annotation-flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/display-flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/export-flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/filter-flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/flags-overview.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/interactive-flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/search-flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/source-flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/docs/reference/utility-flags.md +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/__init__.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/__main__.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/__init__.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/__main__.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/config.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/env.example +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/gate.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/notify.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/render.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/runner.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/alerts/state.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/cli.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/commands.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/dispatcher.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/search.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/__init__.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/arxiv.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/crossref.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/doaj.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/sources/europepmc.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/templates/__init__.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/templates/ieee.json +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/templates/nature.json +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/templates/science.json +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/tui/__init__.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/tui/app.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/tui/modals.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/annotations.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/cache.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/citations.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/custom_apis.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/enhanced_tui.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/enrichment.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/export.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/interactive_tui.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/pdf_downloader.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/profiles.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/reference_managers.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/rich_check.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/shell_mode.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/statistics.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/template_engine.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/terminal.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore/utils/wizard_mode.py +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/SOURCES.txt +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/dependency_links.txt +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/entry_points.txt +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/requires.txt +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/lixplore_cli.egg-info/top_level.txt +0 -0
- {lixplore_cli-1.2.2 → lixplore_cli-1.2.3}/requirements.txt +0 -0
- {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.
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|