scitex 2.17.3__py3-none-any.whl → 2.17.4__py3-none-any.whl

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 (57) hide show
  1. scitex/_dev/_dashboard/_routes.py +13 -0
  2. scitex/_dev/_dashboard/_scripts.py +144 -23
  3. scitex/_dev/_dashboard/_styles.py +90 -0
  4. scitex/_dev/_dashboard/_templates.py +14 -1
  5. scitex/_dev/_rtd.py +122 -0
  6. scitex/_dev/_ssh.py +38 -8
  7. scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +90 -0
  8. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +1571 -0
  9. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +6262 -0
  10. scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +1274 -0
  11. scitex/dev/plt/data/mpl/dir_ax.txt +459 -0
  12. scitex/scholar/_mcp/crossref_handlers.py +45 -7
  13. scitex/scholar/_mcp/openalex_handlers.py +45 -7
  14. scitex/scholar/config/default.yaml +2 -0
  15. scitex/scholar/data/.gitkeep +0 -0
  16. scitex/scholar/data/README.md +44 -0
  17. scitex/scholar/data/bib_files/bibliography.bib +1952 -0
  18. scitex/scholar/data/bib_files/neurovista.bib +277 -0
  19. scitex/scholar/data/bib_files/neurovista_enriched.bib +441 -0
  20. scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +441 -0
  21. scitex/scholar/data/bib_files/neurovista_processed.bib +338 -0
  22. scitex/scholar/data/bib_files/openaccess.bib +89 -0
  23. scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +2178 -0
  24. scitex/scholar/data/bib_files/pac.bib +698 -0
  25. scitex/scholar/data/bib_files/pac_enriched.bib +1061 -0
  26. scitex/scholar/data/bib_files/pac_processed.bib +0 -0
  27. scitex/scholar/data/bib_files/pac_titles.txt +75 -0
  28. scitex/scholar/data/bib_files/paywalled.bib +98 -0
  29. scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +58 -0
  30. scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +87 -0
  31. scitex/scholar/data/bib_files/seizure_prediction.bib +694 -0
  32. scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
  33. scitex/scholar/data/bib_files/test_complete_enriched.bib +437 -0
  34. scitex/scholar/data/bib_files/test_final_enriched.bib +437 -0
  35. scitex/scholar/data/bib_files/test_seizure.bib +46 -0
  36. scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
  37. scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
  38. scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
  39. scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
  40. scitex/scholar/data/impact_factor.db +0 -0
  41. scitex/scholar/local_dbs/__init__.py +5 -1
  42. scitex/scholar/local_dbs/export.py +93 -0
  43. scitex/scholar/local_dbs/unified.py +505 -0
  44. scitex/scholar/metadata_engines/ScholarEngine.py +11 -0
  45. scitex/scholar/metadata_engines/individual/OpenAlexLocalEngine.py +346 -0
  46. scitex/scholar/metadata_engines/individual/__init__.py +1 -0
  47. {scitex-2.17.3.dist-info → scitex-2.17.4.dist-info}/METADATA +1 -1
  48. {scitex-2.17.3.dist-info → scitex-2.17.4.dist-info}/RECORD +51 -22
  49. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +0 -462
  50. scitex/scholar/url_finder/.tmp/open_url/README.md +0 -223
  51. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +0 -694
  52. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +0 -1160
  53. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +0 -344
  54. scitex/scholar/url_finder/.tmp/open_url/__init__.py +0 -24
  55. {scitex-2.17.3.dist-info → scitex-2.17.4.dist-info}/WHEEL +0 -0
  56. {scitex-2.17.3.dist-info → scitex-2.17.4.dist-info}/entry_points.txt +0 -0
  57. {scitex-2.17.3.dist-info → scitex-2.17.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,346 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: "2026-02-03"
3
+ # File: src/scitex/scholar/metadata_engines/individual/OpenAlexLocalEngine.py
4
+ # ----------------------------------------
5
+ from __future__ import annotations
6
+
7
+ import os
8
+
9
+ __FILE__ = __file__
10
+ __DIR__ = os.path.dirname(__FILE__)
11
+ # ----------------------------------------
12
+
13
+ import json
14
+ from typing import Dict, List, Optional, Union
15
+
16
+ from scitex import logging
17
+
18
+ from ..utils import standardize_metadata
19
+ from ._BaseDOIEngine import BaseDOIEngine
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ class OpenAlexLocalEngine(BaseDOIEngine):
25
+ """OpenAlex Local Engine using local FastAPI or external public API
26
+
27
+ Supports both:
28
+ - Internal API: http://openalex:31292 (Docker network)
29
+ - External API: https://scitex.ai/scholar/api/openalex (Public internet)
30
+
31
+ Automatically detects API format and adjusts endpoints accordingly.
32
+ """
33
+
34
+ def __init__(
35
+ self,
36
+ email: str = "research@example.com",
37
+ api_url: str = "http://127.0.0.1:31292",
38
+ ):
39
+ super().__init__(email)
40
+ self.api_url = api_url.rstrip("/")
41
+
42
+ # Detect API type: external (public) vs internal (Docker/local)
43
+ self._is_external_api = (
44
+ "/api/openalex" in self.api_url or "scitex.ai" in self.api_url
45
+ )
46
+
47
+ @property
48
+ def name(self) -> str:
49
+ return "OpenAlexLocal"
50
+
51
+ @property
52
+ def rate_limit_delay(self) -> float:
53
+ return 0.01
54
+
55
+ def _build_endpoint_url(self, endpoint: str) -> str:
56
+ """Build the correct endpoint URL based on API type
57
+
58
+ Args:
59
+ endpoint: Endpoint name (e.g., 'works', 'info')
60
+
61
+ Returns
62
+ -------
63
+ Full URL for the endpoint
64
+
65
+ Examples
66
+ --------
67
+ Internal: http://openalex:31292/works
68
+ External: https://scitex.ai/scholar/api/openalex/works
69
+ """
70
+ if self._is_external_api:
71
+ # External API: base URL already includes /scholar/api/openalex
72
+ return f"{self.api_url}/{endpoint}"
73
+ else:
74
+ # Internal API: direct endpoint
75
+ return f"{self.api_url}/{endpoint}"
76
+
77
+ def search(
78
+ self,
79
+ title: Optional[str] = None,
80
+ year: Optional[Union[int, str]] = None,
81
+ authors: Optional[List[str]] = None,
82
+ doi: Optional[str] = None,
83
+ max_results=1,
84
+ return_as: Optional[str] = "dict",
85
+ **kwargs,
86
+ ) -> Optional[Dict]:
87
+ """Search using local OpenAlex API with all parameters"""
88
+ if doi:
89
+ return self._search_by_doi(doi, return_as)
90
+ else:
91
+ return self._search_by_metadata(title, year, authors, max_results, return_as)
92
+
93
+ def _search_by_doi(self, doi: str, return_as: str) -> Optional[Dict]:
94
+ """Get work metadata by DOI"""
95
+ doi = doi.replace("https://doi.org/", "").replace("http://doi.org/", "")
96
+ url = self._build_endpoint_url(f"works/{doi}")
97
+
98
+ try:
99
+ assert return_as in [
100
+ "dict",
101
+ "json",
102
+ ], "return_as must be either 'dict' or 'json'"
103
+
104
+ response = self.session.get(url, timeout=10)
105
+ if response.status_code == 404:
106
+ return self._create_minimal_metadata(doi=doi, return_as=return_as)
107
+ response.raise_for_status()
108
+ data = response.json()
109
+
110
+ return self._extract_metadata_from_work(data, return_as)
111
+
112
+ except Exception as e:
113
+ if "Connection refused" in str(e) or "Max retries exceeded" in str(e):
114
+ logger.warning(
115
+ f"OpenAlex Local server not available at {self.api_url} (connection refused)"
116
+ )
117
+ else:
118
+ logger.warning(f"OpenAlex Local DOI search error: {e}")
119
+ return self._create_minimal_metadata(doi=doi, return_as=return_as)
120
+
121
+ def _search_by_metadata(
122
+ self,
123
+ title: Optional[str],
124
+ year: Optional[Union[int, str]],
125
+ authors: Optional[List[str]],
126
+ max_results: int,
127
+ return_as: str,
128
+ ) -> Optional[Dict]:
129
+ """Search by metadata (title, year, authors)"""
130
+ if not title:
131
+ return self._create_minimal_metadata(
132
+ title=title,
133
+ year=year,
134
+ authors=authors,
135
+ return_as=return_as,
136
+ )
137
+
138
+ # Build search query
139
+ query = title
140
+ if year:
141
+ query = f"{query} {year}"
142
+ if authors and isinstance(authors, list) and authors:
143
+ query = f"{query} {authors[0]}"
144
+
145
+ url = self._build_endpoint_url("works")
146
+ params = {"q": query, "limit": max(5, max_results)}
147
+
148
+ try:
149
+ assert return_as in [
150
+ "dict",
151
+ "json",
152
+ ], "return_as must be either 'dict' or 'json'"
153
+
154
+ response = self.session.get(url, params=params, timeout=10)
155
+ response.raise_for_status()
156
+ data = response.json()
157
+
158
+ results = data.get("results", [])
159
+ if not results:
160
+ return self._create_minimal_metadata(
161
+ title=title,
162
+ year=year,
163
+ authors=authors,
164
+ return_as=return_as,
165
+ )
166
+
167
+ # Find best matching result
168
+ for work in results:
169
+ work_title = work.get("title", "")
170
+ if work_title and work_title.endswith("."):
171
+ work_title = work_title[:-1]
172
+ if work_title and self._is_title_match(title, work_title):
173
+ return self._extract_metadata_from_work(work, return_as)
174
+
175
+ # Return first result if no exact match
176
+ return self._extract_metadata_from_work(results[0], return_as)
177
+
178
+ except Exception as e:
179
+ if "Connection refused" in str(e) or "Max retries exceeded" in str(e):
180
+ logger.warning(
181
+ f"OpenAlex Local server not available at {self.api_url} (connection refused)"
182
+ )
183
+ else:
184
+ logger.warning(f"OpenAlex Local search error: {e}")
185
+ return self._create_minimal_metadata(
186
+ title=title,
187
+ year=year,
188
+ authors=authors,
189
+ return_as=return_as,
190
+ )
191
+
192
+ def _extract_metadata_from_work(self, data: dict, return_as: str) -> Optional[Dict]:
193
+ """Extract metadata from OpenAlex work data"""
194
+ if not data:
195
+ return self._create_minimal_metadata(return_as=return_as)
196
+
197
+ # Extract title
198
+ title = data.get("title")
199
+ if title and title.endswith("."):
200
+ title = title[:-1]
201
+
202
+ # Extract DOI
203
+ doi = data.get("doi")
204
+ if doi:
205
+ doi = doi.replace("https://doi.org/", "").replace("http://doi.org/", "")
206
+
207
+ # Extract authors
208
+ authors = data.get("authors", [])
209
+ if not authors:
210
+ authors = []
211
+
212
+ # Extract publication info
213
+ year = data.get("year")
214
+ journal = data.get("source")
215
+ issn = data.get("issn")
216
+ volume = data.get("volume")
217
+ issue = data.get("issue")
218
+ pages = data.get("pages")
219
+ publisher = None # Not directly available in response
220
+
221
+ # Extract citation count
222
+ cited_by_count = data.get("cited_by_count")
223
+
224
+ # Extract concepts/keywords
225
+ concepts = data.get("concepts", [])
226
+ keywords = [c.get("name") for c in concepts if c.get("name")]
227
+
228
+ # Extract OA info
229
+ is_oa = data.get("is_oa", False)
230
+ oa_url = data.get("oa_url")
231
+
232
+ # Extract OpenAlex ID
233
+ openalex_id = data.get("openalex_id")
234
+
235
+ metadata = {
236
+ "id": {
237
+ "doi": doi if doi else None,
238
+ "doi_engines": [self.name] if doi else None,
239
+ "openalex_id": openalex_id if openalex_id else None,
240
+ "openalex_id_engines": [self.name] if openalex_id else None,
241
+ },
242
+ "basic": {
243
+ "title": title if title else None,
244
+ "title_engines": [self.name] if title else None,
245
+ "year": year if year else None,
246
+ "year_engines": [self.name] if year else None,
247
+ "authors": authors if authors else None,
248
+ "authors_engines": [self.name] if authors else None,
249
+ "keywords": keywords if keywords else None,
250
+ "keywords_engines": [self.name] if keywords else None,
251
+ },
252
+ "publication": {
253
+ "journal": journal if journal else None,
254
+ "journal_engines": [self.name] if journal else None,
255
+ "issn": issn if issn else None,
256
+ "issn_engines": [self.name] if issn else None,
257
+ "volume": volume if volume else None,
258
+ "volume_engines": [self.name] if volume else None,
259
+ "issue": issue if issue else None,
260
+ "issue_engines": [self.name] if issue else None,
261
+ "pages": pages if pages else None,
262
+ "pages_engines": [self.name] if pages else None,
263
+ },
264
+ "citation_count": {
265
+ "total": cited_by_count if cited_by_count else None,
266
+ "total_engines": [self.name] if cited_by_count else None,
267
+ },
268
+ "url": {
269
+ "doi": f"https://doi.org/{doi}" if doi else None,
270
+ "doi_engines": [self.name] if doi else None,
271
+ "pdf": oa_url if oa_url else None,
272
+ "pdf_engines": [self.name] if oa_url else None,
273
+ },
274
+ "open_access": {
275
+ "is_oa": is_oa,
276
+ "is_oa_engines": [self.name] if is_oa is not None else None,
277
+ "oa_url": oa_url if oa_url else None,
278
+ "oa_url_engines": [self.name] if oa_url else None,
279
+ },
280
+ "system": {
281
+ f"searched_by_{self.name}": True,
282
+ },
283
+ }
284
+
285
+ metadata = standardize_metadata(metadata)
286
+
287
+ if return_as == "dict":
288
+ return metadata
289
+ if return_as == "json":
290
+ return json.dumps(metadata, indent=2)
291
+
292
+
293
+ if __name__ == "__main__":
294
+
295
+ from scitex.scholar.metadata_engines.individual import OpenAlexLocalEngine
296
+
297
+ TITLE = "deep learning"
298
+ DOI = "10.1038/nature12373"
299
+
300
+ # Example 1: Internal API (Docker network or localhost)
301
+ print("\n" + "=" * 60)
302
+ print("INTERNAL API EXAMPLE")
303
+ print("=" * 60)
304
+ engine_internal = OpenAlexLocalEngine(
305
+ "test@example.com", api_url="http://openalex:31292"
306
+ )
307
+ print(f"API URL: {engine_internal.api_url}")
308
+ print(f"Is External: {engine_internal._is_external_api}")
309
+ print(f"Works endpoint: {engine_internal._build_endpoint_url('works')}")
310
+
311
+ # Example 2: External API (public internet)
312
+ print("\n" + "=" * 60)
313
+ print("EXTERNAL API EXAMPLE")
314
+ print("=" * 60)
315
+ engine_external = OpenAlexLocalEngine(
316
+ "test@example.com", api_url="https://scitex.ai/scholar/api/openalex"
317
+ )
318
+ print(f"API URL: {engine_external.api_url}")
319
+ print(f"Is External: {engine_external._is_external_api}")
320
+ print(f"Works endpoint: {engine_external._build_endpoint_url('works')}")
321
+
322
+ # Test search (use internal for demo)
323
+ print("\n" + "=" * 60)
324
+ print("SEARCH TEST")
325
+ print("=" * 60)
326
+ engine = OpenAlexLocalEngine("test@example.com")
327
+ result = engine.search(doi=DOI)
328
+ if result:
329
+ print(f"Title: {result.get('basic', {}).get('title')}")
330
+ print(f"DOI: {result.get('id', {}).get('doi')}")
331
+ print(f"Year: {result.get('basic', {}).get('year')}")
332
+ else:
333
+ print("No results found")
334
+
335
+
336
+ # Usage examples:
337
+ #
338
+ # Internal API (from NAS Docker):
339
+ # export SCITEX_SCHOLAR_OPENALEX_API_URL=http://openalex:31292
340
+ # python -m scitex.scholar.metadata_engines.individual.OpenAlexLocalEngine
341
+ #
342
+ # External API (from anywhere):
343
+ # export SCITEX_SCHOLAR_OPENALEX_API_URL=https://scitex.ai/scholar/api/openalex
344
+ # python -m scitex.scholar.metadata_engines.individual.OpenAlexLocalEngine
345
+
346
+ # EOF
@@ -2,6 +2,7 @@ from .ArXivEngine import ArXivEngine
2
2
  from .CrossRefEngine import CrossRefEngine
3
3
  from .CrossRefLocalEngine import CrossRefLocalEngine
4
4
  from .OpenAlexEngine import OpenAlexEngine
5
+ from .OpenAlexLocalEngine import OpenAlexLocalEngine
5
6
  from .PubMedEngine import PubMedEngine
6
7
  from .SemanticScholarEngine import SemanticScholarEngine
7
8
  from .URLDOIEngine import URLDOIEngine
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scitex
3
- Version: 2.17.3
3
+ Version: 2.17.4
4
4
  Summary: A comprehensive Python library for scientific computing and data analysis
5
5
  Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-python
6
6
  Project-URL: Documentation, https://scitex.readthedocs.io
@@ -12,14 +12,15 @@ scitex/_dev/__init__.py,sha256=ab6VDylil7CRDP9eHiD_nPeaMW5Ih5O-NpcN4-nd29M,2679
12
12
  scitex/_dev/_config.py,sha256=_UdF7gaJo1Ifkm5kRrD1EZcHel21F0zo5xTqEJeihIs,10574
13
13
  scitex/_dev/_ecosystem.py,sha256=b2J5XJBsGl4yiOeNSYM_Sue51CliHs_eyIfPZ9KL5OM,3394
14
14
  scitex/_dev/_github.py,sha256=O3Pe754MPt9uoKCs4ppjvYC3Uxy3ydkUpMLYxlPsJxM,9412
15
- scitex/_dev/_ssh.py,sha256=yzFMoaQUi13FY1iHFPpASEbVLvBuJuDSfa2pfr5cRhA,8287
15
+ scitex/_dev/_rtd.py,sha256=TWD1pFoIGgsiOgir2WjCNT88TbpwJ_0aescSENpFEYI,3280
16
+ scitex/_dev/_ssh.py,sha256=z0n6-ozIFtpSga9RJN-yDkFoyVKWiv8ZfFdQYLGSbRQ,9327
16
17
  scitex/_dev/_versions.py,sha256=JoBiRkx2Z9QB7UOQDKp-gd5iwiBkq0sdAWGRq01WUSc,7405
17
18
  scitex/_dev/_dashboard/__init__.py,sha256=eApG1qoE7aWE1YZMkcMuzl585TbC5Di11DEC15twOVM,239
18
19
  scitex/_dev/_dashboard/_app.py,sha256=Vcu9RQDrDWFA9_hdGt4TuoyevgAZm7k7SBvlkyOTci0,2014
19
- scitex/_dev/_dashboard/_routes.py,sha256=I18DZ-ug257xuv14uPjDuBQ3uunE0c7gHc6Wyr7aKWI,5034
20
- scitex/_dev/_dashboard/_scripts.py,sha256=CPohJCo_1hl7xxy8qmqWCYUpF6xr_I_DZrS2UtTCmqE,10806
21
- scitex/_dev/_dashboard/_styles.py,sha256=TlOeEIjIoMzEm9Qufp2uZY-4pieFdQ6HSFgDNRGI62I,6105
22
- scitex/_dev/_dashboard/_templates.py,sha256=28927WKqJRAh-YLSeaFT19hyDU1UQWbnsR5pQIzeeA8,3546
20
+ scitex/_dev/_dashboard/_routes.py,sha256=VLKwAoyNyf6D3pM55ZJTNeJeLNJx2ZlYxBoiUNlMX_E,5498
21
+ scitex/_dev/_dashboard/_scripts.py,sha256=mIi-NFRbiMD9bYZ9DDHcjMigY6NwTPlvXOxkG8NjwX8,16271
22
+ scitex/_dev/_dashboard/_styles.py,sha256=kxMykqAB0hMiC5J4Ro9ykIuXcW4nKrJXCetizPHW9PA,8139
23
+ scitex/_dev/_dashboard/_templates.py,sha256=u7Ubx4NH5BpoqIX_0WqzOFKZ14vzECBoYZQvaxdpT7Y,4140
23
24
  scitex/_dev/_dashboard/static/version-dashboard-favicon.svg,sha256=CLYEFmmEQEkfx8ffoTmMQrRWjjRMGeeccYkvcSlyw9U,7578
24
25
  scitex/_dev/_mcp/__init__.py,sha256=FdLB2ReZEHlIfVWFb1v41sm8L_ohZQSykXoC_Y6Uxeo,268
25
26
  scitex/_dev/_mcp/handlers.py,sha256=07MQ6uOqUXfX4ykcwEXxYqe38nFblVTZMp2pXpL2RMs,4649
@@ -596,6 +597,11 @@ scitex/dev/plt/plot_stx_scatter.py,sha256=yJnZE0aL5Z0armnKyxCgdSIfmwSx0MO_BoDbzT
596
597
  scitex/dev/plt/plot_stx_shaded_line.py,sha256=Ss4RD0qxO_uH1h_NL_meSH1-_ZXfOKnV1MAT48tegnI,718
597
598
  scitex/dev/plt/plot_stx_violin.py,sha256=oEAWE4RwG7SQ3JlVuzfSbTFDF02VRb_vE4qBLU3tMu4,680
598
599
  scitex/dev/plt/plot_stx_violinplot.py,sha256=wafuzIKs9WJRfXcH4bxxuigqCh75nxcZDfFq-9P1zxA,687
600
+ scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml,sha256=1E1RfxT1QtA3M5hrqn0zynwMrhIEIpaZSAHItRBIHdI,2843
601
+ scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml,sha256=ambH7kkBUivqVvo7thcMfs-ZvXAdaXtEEYuPTAvSOls,28660
602
+ scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml,sha256=xzytlIhc9V3Aartc-HzzlDVvcOd7QGuzIkIe9X75sdk,181125
603
+ scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml,sha256=kvV9iS2L3x3Et7LWK9Dyo_pQBnK2eTu13EXNS619ePM,27684
604
+ scitex/dev/plt/data/mpl/dir_ax.txt,sha256=HuMRJLF5pw58SaNrKkX8eeAj19k219bV7EVGzSPOCUU,5686
599
605
  scitex/dev/plt/demo_plotters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
600
606
  scitex/dev/plt/demo_plotters/plot_mpl_axhline.py,sha256=ECGTgIGgpU82llOHVqur0gzSl1NUHjvyaB85cZewKW8,707
601
607
  scitex/dev/plt/demo_plotters/plot_mpl_axhspan.py,sha256=WetEGSzRbppTvn5VprGNglKuzLMoM8tFXg_N0jMFgFM,704
@@ -1305,12 +1311,12 @@ scitex/scholar/__main__.py,sha256=U7QKol30Vsvw_Xg4tVS5F1iFU4UluKnm1Z0Bs18zgCs,97
1305
1311
  scitex/scholar/mcp_server.py,sha256=z_b4pD2z1H2bG1B6ATt3B6e8uNBMl-MLz6a3KLnaCiw,14934
1306
1312
  scitex/scholar/_mcp/__init__.py,sha256=FJRAr90vUCg4PJ8Sv-WzsKuM7aY93m6UR87fhk843MU,73
1307
1313
  scitex/scholar/_mcp/all_handlers.py,sha256=yALfZdQhDXWPlqUB1rcncENXyVVFNDnpGqhz5iCc-5Q,1856
1308
- scitex/scholar/_mcp/crossref_handlers.py,sha256=fBN9pVzQLiGT4FWoLGAOdsm-_-gwhMo1EEl0S9MlA0c,7770
1314
+ scitex/scholar/_mcp/crossref_handlers.py,sha256=PxfuLacjKPTNk-rCQYZarT1nsDDWhYAfz9zFeYMuFJI,9228
1309
1315
  scitex/scholar/_mcp/crossref_tool_schemas.py,sha256=v1VI3I2r_LWqt4IuEJo_JvXxtdY04eZ3zk6Kvqumou4,4748
1310
1316
  scitex/scholar/_mcp/handlers.py,sha256=gMFBHPdqfWGRUDSu3wlllVBnJSzrkGm9ZUnUBhZXCY0,51088
1311
1317
  scitex/scholar/_mcp/job_handlers.py,sha256=8ZkFRG1TOq20168DIpic3VMAMzTzieg1jnaE7eXQLlU,4970
1312
1318
  scitex/scholar/_mcp/job_tool_schemas.py,sha256=xDTysuf3aLNxLO1O57sal5XcMeEstk0SB77wK9q6yVs,5777
1313
- scitex/scholar/_mcp/openalex_handlers.py,sha256=r9X1mwMqqwovrbx4pcgHQeISCbGqqW87neP6EW09Pnw,6503
1319
+ scitex/scholar/_mcp/openalex_handlers.py,sha256=mffzi-D_MiM6bKFxwKKTcZmqutbZzWdeV0IcFcu9utc,7961
1314
1320
  scitex/scholar/_mcp/openalex_tool_schemas.py,sha256=zu7--BZ7_aEnaJuEg-Sb1FiKNoeRthat70S9TZ70uL4,3194
1315
1321
  scitex/scholar/_mcp/tool_schemas.py,sha256=ng_lGqhwa_2BxByASZriDgnZSHTewvqpF6jOzqRxEZ0,19818
1316
1322
  scitex/scholar/_utils/__init__.py,sha256=leFMQOthrMMcnaoNvoP6oSYy0HSs0CXsg_Lr6yE2HnE,576
@@ -1383,7 +1389,7 @@ scitex/scholar/config/PublisherRules.py,sha256=wumxQXIaiFqG5gdSzd1_7bPytXZu2-WBp
1383
1389
  scitex/scholar/config/README.md,sha256=318vSWix8XiZCNSjahq6Cswww7ZmHPKB3eYi54XyZfM,880
1384
1390
  scitex/scholar/config/ScholarConfig.py,sha256=SgwR4r6mg8mE6OJ5nAnfeyV4_MVDT9HiIq_29XfBB2c,5178
1385
1391
  scitex/scholar/config/__init__.py,sha256=YMIxrj09DczUL4b_nhV4cJl32ueitove8EcOEfinVeU,500
1386
- scitex/scholar/config/default.yaml,sha256=vWWW1TdoXHe32vLhbaFwJ5nA5McSVPguKbQY6GmXdO4,18694
1392
+ scitex/scholar/config/default.yaml,sha256=2zMtDpbgd5Gd0fOoooMgHes4sknLcSDMe6PmbJdMoRE,18791
1387
1393
  scitex/scholar/config/_categories/README.md,sha256=swb9Y-fSDK5IBst3bF96xH_syrRWpv7N8jz7gYQCyeQ,4806
1388
1394
  scitex/scholar/config/_categories/api_keys.yaml,sha256=wo2fAxXqQYU6JLkAf4VxvcIiJPIc1qOjx2LMp2hK-k8,739
1389
1395
  scitex/scholar/config/_categories/auth_gateway.yaml,sha256=resIZWaEyCRg0HIk0yJV194I4_Ur_OIQ2hLDswC-PqM,3448
@@ -1418,6 +1424,32 @@ scitex/scholar/core/_mixins/_savers.py,sha256=DonIcpCaobrRTs_LAuwurYEhsUTQE9otzX
1418
1424
  scitex/scholar/core/_mixins/_search.py,sha256=8SyCtYtyyzTtMP85kFPrOZLK8PvL9dCCoOyI95N-SfI,3721
1419
1425
  scitex/scholar/core/_mixins/_services.py,sha256=rnNtDTBES6RwKJzC0Wpi0G9Xiju2pudrdrSfrftB9dM,3228
1420
1426
  scitex/scholar/core/_mixins/_url_finding.py,sha256=PawfItu2ienUW6Hj155fPT2KsKqm_sc7uukEYAXr-Rk,3241
1427
+ scitex/scholar/data/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1428
+ scitex/scholar/data/README.md,sha256=x38oaKofFr-9MdmYSX6etjt7c_37BtJ1HI2bVvGWxdc,1343
1429
+ scitex/scholar/data/impact_factor.db,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1430
+ scitex/scholar/data/bib_files/bibliography.bib,sha256=6cBOh0rNI9OpN4kOIOZMpE6jZuoEbfDJkFNgmcMDeVo,265769
1431
+ scitex/scholar/data/bib_files/neurovista.bib,sha256=NV7yU5UjkntfEJuLHSGdAzYR1GgddEQpngjQJWd5Pkc,12935
1432
+ scitex/scholar/data/bib_files/neurovista_enriched.bib,sha256=Bw7CiHo71OYVPRBO5l8bujzmy5xbExqO8Z7XYihqP98,62246
1433
+ scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib,sha256=Bw7CiHo71OYVPRBO5l8bujzmy5xbExqO8Z7XYihqP98,62246
1434
+ scitex/scholar/data/bib_files/neurovista_processed.bib,sha256=CNL3LmRpLhp-qahyMEgfKRlQHuGYnDjUjitxVSiU3As,51469
1435
+ scitex/scholar/data/bib_files/openaccess.bib,sha256=73BIBSj5m0HbxeE-SrmI5hmDGCSbPhvbQioDXqb54Fc,3524
1436
+ scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib,sha256=z5Rx7N_8wjQqYwPjwUbybeAp4fb1XyjbQ3X1LpuaqqU,272200
1437
+ scitex/scholar/data/bib_files/pac.bib,sha256=jxxGxT5CruEvKZfMcMQqt-48ZPcKSCuw-L4gJBUkvsc,27557
1438
+ scitex/scholar/data/bib_files/pac_enriched.bib,sha256=qYWT4aOp1694eEhdYUZZJ1e9uT5ZqjuSphZrmF1PwhU,142261
1439
+ scitex/scholar/data/bib_files/pac_processed.bib,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1440
+ scitex/scholar/data/bib_files/pac_titles.txt,sha256=KZI7uRGxSWCWitkI3E7dXxl3H46eeyBMJdJEavGb8Z4,7276
1441
+ scitex/scholar/data/bib_files/paywalled.bib,sha256=HeuYd4TxWBNFyn8BboC_SMrUe1PYhtVVZtdHM-A5UPI,3797
1442
+ scitex/scholar/data/bib_files/related-papers-by-coauthors.bib,sha256=sSXMtAA3zBYS2wG2yrDJSeF6li37tzO40nEXjZwgyRw,2917
1443
+ scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib,sha256=2ueaWK_0vl7seBYll5_t0BP-MjENYHDIedwod7jyZHI,12117
1444
+ scitex/scholar/data/bib_files/seizure_prediction.bib,sha256=SUbkEW6j10dRHNqPAtIUIKJUZIMuY6Q7eft-TJ0T0ec,27450
1445
+ scitex/scholar/data/bib_files/seizure_prediction_processed.bib,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1446
+ scitex/scholar/data/bib_files/test_complete_enriched.bib,sha256=Pmc3B9FkOXaFGdQZn3_G6kHDLGbTh5W-MLj6Rj-ejAo,60424
1447
+ scitex/scholar/data/bib_files/test_final_enriched.bib,sha256=Pmc3B9FkOXaFGdQZn3_G6kHDLGbTh5W-MLj6Rj-ejAo,60424
1448
+ scitex/scholar/data/bib_files/test_seizure.bib,sha256=vZcnnTVaDCPR1fpEBuYSv2RsrwmIbDx4ogIeObzJdis,1249
1449
+ scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx,sha256=NJoAKC7RL3W_oBvv72j9mU5bZydEEAPDO8sza-R6JKE,929300
1450
+ scitex/scholar/data/impact_factor/JCR_IF_2024.db,sha256=hnpVDE8EY0OTXWtBy1NYietsglMxDcQTZs-IRsxHCjQ,2957312
1451
+ scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx,sha256=2POoCl1Nf7WCG242KUjvU06J43RIoCpT4BEucCxIQBw,1756410
1452
+ scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db,sha256=G5YuIOF0PJw0AeCxugL_cQvtFquH-MHoq1rXBrbnmSg,2875392
1421
1453
  scitex/scholar/docs/00_SUMMARY.md,sha256=quFBhRq5WJ06u5Po5oSzR28A-WihrApquXZYeyqwoS8,4011
1422
1454
  scitex/scholar/docs/01_STORAGE_ARCHITECTURE.md,sha256=sKQDAS3ejZVJ8W51GADV_BqfWnj8oI4dOpQ1XCiF4gc,3746
1423
1455
  scitex/scholar/docs/02_PIPELINE_ORGANIZATION.md,sha256=8BS_j6S89TiLqDRiODACZsbEMs6EyOiLDj8CgILz4WU,8288
@@ -1500,11 +1532,13 @@ scitex/scholar/jobs/_JobManager.py,sha256=F06vxOZoYouqgeNVmlwKpDPkWWh-PU2aLp3pqu
1500
1532
  scitex/scholar/jobs/__init__.py,sha256=dXdPmFUWf-Ypl41_Z6qsduYCofygfgq2UjiIZcYiGjQ,1779
1501
1533
  scitex/scholar/jobs/_errors.py,sha256=V7Xv4q0CDBJIQ6NSg-lRb_skFcqT-jIZ_aI5gavjDds,10211
1502
1534
  scitex/scholar/jobs/_executors.py,sha256=kWU9uuN_8cx6oPyGakjcypsiZoUwicrHL29_aF_iZUU,11807
1503
- scitex/scholar/local_dbs/__init__.py,sha256=sxCiEcOy5pC6VBpEExHgkAlu1st7EUcfw6PRFo67buQ,857
1535
+ scitex/scholar/local_dbs/__init__.py,sha256=TlwFdJybybeQ81GjJMM6QeZiwweA9KB2aGjLU8TuL2w,962
1504
1536
  scitex/scholar/local_dbs/crossref_scitex.py,sha256=Ib2JluhqyYjDPh0hZqENHNP7_eg21AQnkyWjl5pfXRs,748
1537
+ scitex/scholar/local_dbs/export.py,sha256=q2yEPK5inRAIgEwMC6gSsAGZxMZHEOmTp7WIVrU065o,2394
1505
1538
  scitex/scholar/local_dbs/openalex_scitex.py,sha256=mnHHMnk2aJcSfXYWJh2wsbs818oU1fW63i_3VZG7wpI,748
1539
+ scitex/scholar/local_dbs/unified.py,sha256=AbFY4xFcUA5TpDQGM42F8ql_2voY-YDGpj2o52hbw6Q,15373
1506
1540
  scitex/scholar/metadata_engines/README.md,sha256=wz1fTeru9sTgkGO5T8VdDBsd4FBaZu2t6-I8MTNGifw,919
1507
- scitex/scholar/metadata_engines/ScholarEngine.py,sha256=WGOEvCiBiMm0aZNtN1AlBDCcN6XQUl76R6zedUhR7gs,20604
1541
+ scitex/scholar/metadata_engines/ScholarEngine.py,sha256=y0j50zY4W6FApW1SqWH2lU6fBs94DoYAC-S7vP3ZqD0,21178
1508
1542
  scitex/scholar/metadata_engines/__init__.py,sha256=qjndZBrK2tXOMCRHFeEu2BJ9Ir8nbr7cHsV4xvXUwv4,749
1509
1543
  scitex/scholar/metadata_engines/.combined-SemanticScholarSource/_SemanticScholarSource.py,sha256=RrjgRQ0C5DE_8_5SIxV3wsoiaOCuawwVJc8YGFUHxeI,10146
1510
1544
  scitex/scholar/metadata_engines/.combined-SemanticScholarSource/_SemanticScholarSourceEnhanced.py,sha256=CLLXlSVgaujFvTsnDrWmAqTaUmJBtr9msFY-uYaxMZk,7604
@@ -1512,11 +1546,12 @@ scitex/scholar/metadata_engines/individual/ArXivEngine.py,sha256=YeB9sfZQGz0P_eF
1512
1546
  scitex/scholar/metadata_engines/individual/CrossRefEngine.py,sha256=dAR2OVNl1i-p1I0UTsyEN4KV0L7vTqFtATe3KtVrntE,9974
1513
1547
  scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py,sha256=thHe3k41EI9Td1vqeh3ebUfg9fjrq94QYnDtpwxlgNg,11147
1514
1548
  scitex/scholar/metadata_engines/individual/OpenAlexEngine.py,sha256=fAXehDNdRMPBMcMcemw5cXUrBtyWSgZPpVBJfBAZXqQ,12149
1549
+ scitex/scholar/metadata_engines/individual/OpenAlexLocalEngine.py,sha256=K5VQVfCHCEqFT3Jg_3ZttRXMFZl87PGYiYuAqIjDBBo,12056
1515
1550
  scitex/scholar/metadata_engines/individual/PubMedEngine.py,sha256=0FD9h_UCMZ9YrclW228YoFqlMClx-3r1SQC-TpcOS8Q,9923
1516
1551
  scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py,sha256=Ve6aADnN3CgPAftkRMbllMyUwy0YKEUq76BZU8C2y1k,15338
1517
1552
  scitex/scholar/metadata_engines/individual/URLDOIEngine.py,sha256=HnUTo_BjFnKNKPz1vmaIX4EedlyKXWSgrzyTGppSnjc,14461
1518
1553
  scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py,sha256=tIu_a-O9Y_iJ_RnSI0oKHBzU0h4frm9B4p7TXvfsIyI,16427
1519
- scitex/scholar/metadata_engines/individual/__init__.py,sha256=bViD8Y8f16Ru76k4s9SAzNETP8iQcEH80fZinYmLSjM,311
1554
+ scitex/scholar/metadata_engines/individual/__init__.py,sha256=TM4zdBk9c_NG2TTf3j-BKBU_Ar3agYEh1HZTRWbKMEs,364
1520
1555
  scitex/scholar/metadata_engines/utils/_PubMedConverter.py,sha256=OaWsznE66619Gelqdh3daMnl2yJ3O4fvxMfRvuxhnN8,14407
1521
1556
  scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py,sha256=fwQ0W8E7wSXd-33Ps3e_sIDqCKQdtGwDhpg9xwdtvBg,9175
1522
1557
  scitex/scholar/metadata_engines/utils/__init__.py,sha256=7JNLEqNflajR16Vrm27mR0RnZnhwwya7ajOrsfV7rus,865
@@ -1572,12 +1607,6 @@ scitex/scholar/storage/_mixins/_symlink_handlers.py,sha256=m63ATAfDmAUDk4shsVf0a
1572
1607
  scitex/scholar/url_finder/README.md,sha256=CGQpOktqpQF_5z_u-pIKMYBAeQZXT9Eh24XaPtfV6HM,2016
1573
1608
  scitex/scholar/url_finder/ScholarURLFinder.py,sha256=C9lpYefs-9YoGcYYYBDB8GrGQyp27LmLTIv_WelDJgI,11840
1574
1609
  scitex/scholar/url_finder/__init__.py,sha256=FV9ocQPE6520WUVVMV2u7hci_-2ha1KLJHzRUUlWGBw,93
1575
- scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py,sha256=n37aHjOq6YrtgR0DGN0iznKy8EWCjzgBODVm7pINc-w,12926
1576
- scitex/scholar/url_finder/.tmp/open_url/README.md,sha256=4CyiK7Zbdd23WjsYUU7J7FLPmhxwxA1PWc7enL9dGug,6836
1577
- scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py,sha256=C0cURB6BO78udjjsucqwM_rTxDy5XTaqyuxLBCNbyeU,23632
1578
- scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py,sha256=yigbSuUZ2m6XmDFjhrIdn8Bva5ic7Y-DdwcMCUFlisA,43504
1579
- scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py,sha256=s-2HZzAwBp7DxFtpqzEivLbvJ20J1pcBHSDXYmjmJ9A,11869
1580
- scitex/scholar/url_finder/.tmp/open_url/__init__.py,sha256=d1umAnLQNFGYX7oui5Jl8JrjoDpwHkTmHwIiUbPbvBk,571
1581
1610
  scitex/scholar/url_finder/docs/CORE_URL_TYPES.md,sha256=bRd2AfoypJiO4xgJBqpbC0GR6BhO4dEBo8D4fg7oDo0,6651
1582
1611
  scitex/scholar/url_finder/docs/URL_SCHEMA.md,sha256=MDSUpqJzVwll9Mpspp2RhvYIv6bq_VCTktmTxk_DKk4,7696
1583
1612
  scitex/scholar/url_finder/strategies/__init__.py,sha256=UIfUjfZbFhDZzfEHl3uCuIBUgMEdUMYaC9NbMEDG2Hs,1439
@@ -2592,8 +2621,8 @@ scitex/web/_summarize_url.py,sha256=PpWBk727pjC_yivI_RVNU_RMxjV_jrqlMNaD6kXQAPk,
2592
2621
  scitex/web/download_images.py,sha256=g4sxWzg0ip5Wig7ElPo6fDz5DdXKyJnAsBFwIYoQI6g,9473
2593
2622
  scitex/writer/README.md,sha256=RqUMOJD7wUiQjWoiLSf_hl_Y0IAE3_xPxhlp941zYe4,1299
2594
2623
  scitex/writer/__init__.py,sha256=jQqdIyvQhknySoUAMKreBhAa1KwZ0ieW8SYCppBukts,3301
2595
- scitex-2.17.3.dist-info/METADATA,sha256=V141UevIbgoSHeFufBOfIdzESmjnc_D5V-tkhDTHCaY,26557
2596
- scitex-2.17.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
2597
- scitex-2.17.3.dist-info/entry_points.txt,sha256=ZtDrHnPNMnsSmAnQoCHNmk0xKotNyR2X_YFDDteupW8,497
2598
- scitex-2.17.3.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
2599
- scitex-2.17.3.dist-info/RECORD,,
2624
+ scitex-2.17.4.dist-info/METADATA,sha256=eUYxZ5DFUiuuKXHwgRTipSiwu_Ajk44CdHVIoSimdqg,26557
2625
+ scitex-2.17.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
2626
+ scitex-2.17.4.dist-info/entry_points.txt,sha256=ZtDrHnPNMnsSmAnQoCHNmk0xKotNyR2X_YFDDteupW8,497
2627
+ scitex-2.17.4.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
2628
+ scitex-2.17.4.dist-info/RECORD,,