scholarcli 1.20__tar.gz → 1.23__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 (83) hide show
  1. {scholarcli-1.20/src/scholarcli.egg-info → scholarcli-1.23}/PKG-INFO +4 -3
  2. {scholarcli-1.20 → scholarcli-1.23}/README.md +1 -1
  3. {scholarcli-1.20 → scholarcli-1.23}/pyproject.toml +4 -3
  4. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/__init__.py +2 -1
  5. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/cli.py +955 -57
  6. scholarcli-1.23/src/scholar/crossref.py +210 -0
  7. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/llm_review.py +93 -11
  8. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/pdf.py +384 -1
  9. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/review.py +84 -21
  10. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/scholar.py +149 -23
  11. {scholarcli-1.20 → scholarcli-1.23/src/scholarcli.egg-info}/PKG-INFO +4 -3
  12. {scholarcli-1.20 → scholarcli-1.23}/src/scholarcli.egg-info/SOURCES.txt +2 -0
  13. {scholarcli-1.20 → scholarcli-1.23}/src/scholarcli.egg-info/requires.txt +1 -0
  14. scholarcli-1.23/tests/test_cli.py +1626 -0
  15. scholarcli-1.23/tests/test_crossref.py +205 -0
  16. {scholarcli-1.20 → scholarcli-1.23}/tests/test_llm_review.py +76 -0
  17. {scholarcli-1.20 → scholarcli-1.23}/tests/test_pdf.py +145 -1
  18. {scholarcli-1.20 → scholarcli-1.23}/tests/test_review.py +52 -0
  19. {scholarcli-1.20 → scholarcli-1.23}/tests/test_scholar.py +227 -0
  20. scholarcli-1.20/tests/test_cli.py +0 -739
  21. {scholarcli-1.20 → scholarcli-1.23}/LICENSE +0 -0
  22. {scholarcli-1.20 → scholarcli-1.23}/setup.cfg +0 -0
  23. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/__main__.py +0 -0
  24. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/cache.py +0 -0
  25. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/enrich.py +0 -0
  26. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/notes.py +0 -0
  27. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/providers.py +0 -0
  28. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/questionary.py +0 -0
  29. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/tui.py +0 -0
  30. {scholarcli-1.20 → scholarcli-1.23}/src/scholar/utils.py +0 -0
  31. {scholarcli-1.20 → scholarcli-1.23}/src/scholarcli.egg-info/dependency_links.txt +0 -0
  32. {scholarcli-1.20 → scholarcli-1.23}/src/scholarcli.egg-info/entry_points.txt +0 -0
  33. {scholarcli-1.20 → scholarcli-1.23}/src/scholarcli.egg-info/top_level.txt +0 -0
  34. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/__init__.py +0 -0
  35. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/__init__.py +0 -0
  36. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/aggregator.py +0 -0
  37. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/arxiv.py +0 -0
  38. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/base.py +0 -0
  39. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/crossref.py +0 -0
  40. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/google_scholar.py +0 -0
  41. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/openalex.py +0 -0
  42. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/opencitations.py +0 -0
  43. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/apis/semantic_scholar.py +0 -0
  44. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/cli.py +0 -0
  45. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/exporters/__init__.py +0 -0
  46. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/exporters/bibtex.py +0 -0
  47. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/exporters/csv_exporter.py +0 -0
  48. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/exporters/tikz.py +0 -0
  49. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/filters/__init__.py +0 -0
  50. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/filters/filter_engine.py +0 -0
  51. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/models.py +0 -0
  52. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/paper_utils.py +0 -0
  53. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/parsers/__init__.py +0 -0
  54. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/parsers/pdf_parser.py +0 -0
  55. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/scoring/__init__.py +0 -0
  56. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/scoring/base.py +0 -0
  57. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/scoring/llm_scorer.py +0 -0
  58. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/scoring/tfidf_scorer.py +0 -0
  59. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/services.py +0 -0
  60. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/snowballing.py +0 -0
  61. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/storage/__init__.py +0 -0
  62. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/storage/json_storage.py +0 -0
  63. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/tui/__init__.py +0 -0
  64. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/tui/app.py +0 -0
  65. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/tui/dialogs.py +0 -0
  66. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/tui/setup.py +0 -0
  67. {scholarcli-1.20 → scholarcli-1.23}/src/snowball/visualization.py +0 -0
  68. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/__init__.py +0 -0
  69. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/analysis.py +0 -0
  70. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/cli.py +0 -0
  71. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/clustering.py +0 -0
  72. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/database.py +0 -0
  73. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/grobid.py +0 -0
  74. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/logging.py +0 -0
  75. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/models.py +0 -0
  76. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/project.py +0 -0
  77. {scholarcli-1.20 → scholarcli-1.23}/src/tuxedo/tui.py +0 -0
  78. {scholarcli-1.20 → scholarcli-1.23}/tests/test_cache.py +0 -0
  79. {scholarcli-1.20 → scholarcli-1.23}/tests/test_enrich.py +0 -0
  80. {scholarcli-1.20 → scholarcli-1.23}/tests/test_notes.py +0 -0
  81. {scholarcli-1.20 → scholarcli-1.23}/tests/test_providers.py +0 -0
  82. {scholarcli-1.20 → scholarcli-1.23}/tests/test_tui.py +0 -0
  83. {scholarcli-1.20 → scholarcli-1.23}/tests/test_utils.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scholarcli
3
- Version: 1.20
3
+ Version: 1.23
4
4
  Summary: A tool for structured literature searches across bibliographic databases
5
5
  Author-email: Daniel Bosk <dbosk@kth.se>, Ric Glassey <glassey@kth.se>
6
6
  License-Expression: MIT
7
- Requires-Python: >=3.12
7
+ Requires-Python: <4.0,>=3.12
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
10
10
  Requires-Dist: requests>=2.32.5
@@ -35,6 +35,7 @@ Requires-Dist: openai>=1.0.0
35
35
  Requires-Dist: pyyaml>=6.0
36
36
  Requires-Dist: questionary>=2.0.0
37
37
  Requires-Dist: llm-github-copilot>=0.3.1
38
+ Requires-Dist: llm-mistral<0.16,>=0.15
38
39
  Dynamic: license-file
39
40
 
40
41
  # Scholar
@@ -302,7 +303,7 @@ scholar llm classify "session-name" --count 10
302
303
 
303
304
  ### How It Works
304
305
 
305
- 1. **Tag some papers manually** - The LLM needs examples to learn from. Review at least 5 papers with tags (themes for kept, motivations for discarded).
306
+ 1. **Tag some papers manually** (recommended) - Examples help the LLM learn your criteria. Tagging ~5 papers (themes for kept, motivations for discarded) improves quality, but classification will still run — with a warning — if you have fewer or none.
306
307
 
307
308
  2. **Set research context** (optional) - Describe your review's focus to help the LLM understand relevance criteria.
308
309
 
@@ -263,7 +263,7 @@ scholar llm classify "session-name" --count 10
263
263
 
264
264
  ### How It Works
265
265
 
266
- 1. **Tag some papers manually** - The LLM needs examples to learn from. Review at least 5 papers with tags (themes for kept, motivations for discarded).
266
+ 1. **Tag some papers manually** (recommended) - Examples help the LLM learn your criteria. Tagging ~5 papers (themes for kept, motivations for discarded) improves quality, but classification will still run — with a warning — if you have fewer or none.
267
267
 
268
268
  2. **Set research context** (optional) - Describe your review's focus to help the LLM understand relevance criteria.
269
269
 
@@ -1,12 +1,12 @@
1
1
  [project]
2
2
  name = "scholarcli"
3
- version = "1.20"
3
+ version = "1.23"
4
4
  description = "A tool for structured literature searches across bibliographic databases"
5
5
  authors = [{ name = "Daniel Bosk", email = "dbosk@kth.se" },
6
6
  { name = "Ric Glassey", email = "glassey@kth.se" }]
7
7
  readme = "README.md"
8
8
  license = "MIT"
9
- requires-python = ">= 3.12"
9
+ requires-python = ">=3.12,<4.0"
10
10
  dependencies = [
11
11
  "requests>=2.32.5",
12
12
  "typer>=0.21.0",
@@ -38,6 +38,7 @@ dependencies = [
38
38
  "pyyaml>=6.0",
39
39
  "questionary>=2.0.0",
40
40
  "llm-github-copilot>=0.3.1",
41
+ "llm-mistral (>=0.15,<0.16)",
41
42
  ]
42
43
 
43
44
  [project.scripts]
@@ -64,6 +65,6 @@ line-length = 78
64
65
  dev = [
65
66
  "pytest (>=9.0.2,<10.0.0)",
66
67
  "pytest-cov (>=7.0.0,<8.0.0)",
67
- "black (>=25.12.0,<26.0.0)",
68
+ "black>=25.12.0,<27.0.0",
68
69
  "mypy (>=1.19.1,<2.0.0)"
69
70
  ]
@@ -3,7 +3,7 @@ Scholar package for structured literature searches.
3
3
  """
4
4
 
5
5
  from .scholar import Search, SearchResult, Paper, SearchFilters
6
- from .scholar import search, filter_papers
6
+ from .scholar import search, filter_papers, deduplicate_papers
7
7
  from .scholar import get_registry, isolated_registry
8
8
  from .utils import safe_get_nested, ensure_list
9
9
 
@@ -14,6 +14,7 @@ __all__ = [
14
14
  "SearchFilters",
15
15
  "search",
16
16
  "filter_papers",
17
+ "deduplicate_papers",
17
18
  "get_registry",
18
19
  "isolated_registry",
19
20
  "safe_get_nested",