scitex 2.4.2__py3-none-any.whl → 2.4.3__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.
- scitex/__version__.py +1 -1
- scitex/browser/__init__.py +53 -0
- scitex/browser/debugging/__init__.py +56 -0
- scitex/browser/debugging/_failure_capture.py +372 -0
- scitex/browser/debugging/_sync_session.py +259 -0
- scitex/browser/debugging/_test_monitor.py +284 -0
- scitex/browser/debugging/_visual_cursor.py +432 -0
- scitex/scholar/citation_graph/database.py +9 -2
- scitex/scholar/config/ScholarConfig.py +23 -3
- scitex/scholar/config/default.yaml +55 -0
- scitex/scholar/core/Paper.py +102 -0
- scitex/scholar/core/__init__.py +44 -0
- scitex/scholar/core/journal_normalizer.py +524 -0
- scitex/scholar/core/oa_cache.py +285 -0
- scitex/scholar/core/open_access.py +457 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +137 -0
- scitex/scholar/pdf_download/strategies/__init__.py +6 -0
- scitex/scholar/pdf_download/strategies/open_access_download.py +186 -0
- scitex/scholar/pipelines/ScholarPipelineSearchParallel.py +18 -3
- scitex/scholar/pipelines/ScholarPipelineSearchSingle.py +15 -2
- {scitex-2.4.2.dist-info → scitex-2.4.3.dist-info}/METADATA +1 -1
- {scitex-2.4.2.dist-info → scitex-2.4.3.dist-info}/RECORD +25 -17
- {scitex-2.4.2.dist-info → scitex-2.4.3.dist-info}/WHEEL +0 -0
- {scitex-2.4.2.dist-info → scitex-2.4.3.dist-info}/entry_points.txt +0 -0
- {scitex-2.4.2.dist-info → scitex-2.4.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# File: ./src/scitex/scholar/pdf_download/strategies/open_access_download.py
|
|
4
|
+
"""
|
|
5
|
+
Open Access PDF Download Strategy.
|
|
6
|
+
|
|
7
|
+
Downloads PDFs from known Open Access sources with appropriate handling
|
|
8
|
+
for each source type (arXiv, PubMed Central, OpenAlex OA URLs, etc.).
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Optional, Dict, Any
|
|
13
|
+
import aiohttp
|
|
14
|
+
|
|
15
|
+
from scitex import logging
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Known OA source patterns and their handlers
|
|
21
|
+
OA_SOURCE_PATTERNS = {
|
|
22
|
+
'arxiv': {
|
|
23
|
+
'patterns': ['arxiv.org'],
|
|
24
|
+
'pdf_transform': lambda url: url.replace('/abs/', '/pdf/') + '.pdf' if '/abs/' in url else url,
|
|
25
|
+
},
|
|
26
|
+
'pmc': {
|
|
27
|
+
'patterns': ['ncbi.nlm.nih.gov/pmc', 'europepmc.org'],
|
|
28
|
+
'pdf_transform': lambda url: url, # PMC links are usually direct
|
|
29
|
+
},
|
|
30
|
+
'biorxiv': {
|
|
31
|
+
'patterns': ['biorxiv.org', 'medrxiv.org'],
|
|
32
|
+
'pdf_transform': lambda url: url + '.full.pdf' if not url.endswith('.pdf') else url,
|
|
33
|
+
},
|
|
34
|
+
'doaj': {
|
|
35
|
+
'patterns': ['doaj.org'],
|
|
36
|
+
'pdf_transform': lambda url: url,
|
|
37
|
+
},
|
|
38
|
+
'zenodo': {
|
|
39
|
+
'patterns': ['zenodo.org'],
|
|
40
|
+
'pdf_transform': lambda url: url,
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _identify_oa_source(url: str) -> Optional[str]:
|
|
46
|
+
"""Identify which OA source a URL belongs to."""
|
|
47
|
+
url_lower = url.lower()
|
|
48
|
+
for source_name, config in OA_SOURCE_PATTERNS.items():
|
|
49
|
+
for pattern in config['patterns']:
|
|
50
|
+
if pattern in url_lower:
|
|
51
|
+
return source_name
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _transform_to_pdf_url(url: str, source: str) -> str:
|
|
56
|
+
"""Transform URL to direct PDF URL based on source."""
|
|
57
|
+
if source in OA_SOURCE_PATTERNS:
|
|
58
|
+
transform_func = OA_SOURCE_PATTERNS[source]['pdf_transform']
|
|
59
|
+
return transform_func(url)
|
|
60
|
+
return url
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def try_download_open_access_async(
|
|
64
|
+
oa_url: str,
|
|
65
|
+
output_path: Path,
|
|
66
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
67
|
+
func_name: str = "try_download_open_access_async",
|
|
68
|
+
timeout: int = 60,
|
|
69
|
+
) -> Optional[Path]:
|
|
70
|
+
"""
|
|
71
|
+
Download PDF from an Open Access URL.
|
|
72
|
+
|
|
73
|
+
This strategy is simpler than browser-based strategies because OA PDFs
|
|
74
|
+
are typically directly accessible without authentication.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
oa_url: Open Access URL (from OpenAlex oa_url, arXiv, PMC, etc.)
|
|
78
|
+
output_path: Path to save the downloaded PDF
|
|
79
|
+
metadata: Optional paper metadata for logging
|
|
80
|
+
func_name: Function name for logging
|
|
81
|
+
timeout: Download timeout in seconds
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
Path to downloaded PDF if successful, None otherwise
|
|
85
|
+
"""
|
|
86
|
+
if not oa_url:
|
|
87
|
+
logger.debug(f"{func_name}: No OA URL provided")
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
# Identify source and transform URL if needed
|
|
91
|
+
source = _identify_oa_source(oa_url)
|
|
92
|
+
pdf_url = _transform_to_pdf_url(oa_url, source) if source else oa_url
|
|
93
|
+
|
|
94
|
+
logger.info(f"{func_name}: Attempting OA download from {source or 'unknown'}: {pdf_url[:80]}...")
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
# Create output directory if needed
|
|
98
|
+
output_path = Path(output_path)
|
|
99
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
100
|
+
|
|
101
|
+
# Use aiohttp for async download
|
|
102
|
+
async with aiohttp.ClientSession() as session:
|
|
103
|
+
headers = {
|
|
104
|
+
'User-Agent': 'SciTeX/1.0 (Academic Research Tool; mailto:contact@scitex.io)',
|
|
105
|
+
'Accept': 'application/pdf,*/*',
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async with session.get(pdf_url, headers=headers, timeout=aiohttp.ClientTimeout(total=timeout)) as response:
|
|
109
|
+
if response.status != 200:
|
|
110
|
+
logger.warning(f"{func_name}: HTTP {response.status} from {pdf_url}")
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
content_type = response.headers.get('Content-Type', '')
|
|
114
|
+
|
|
115
|
+
# Verify we're getting a PDF
|
|
116
|
+
if 'pdf' not in content_type.lower() and not pdf_url.endswith('.pdf'):
|
|
117
|
+
# Some servers don't set content-type correctly, check magic bytes
|
|
118
|
+
first_bytes = await response.content.read(5)
|
|
119
|
+
if first_bytes != b'%PDF-':
|
|
120
|
+
logger.warning(f"{func_name}: Response is not a PDF (content-type: {content_type})")
|
|
121
|
+
return None
|
|
122
|
+
# Reset for full download
|
|
123
|
+
content = first_bytes + await response.content.read()
|
|
124
|
+
else:
|
|
125
|
+
content = await response.read()
|
|
126
|
+
|
|
127
|
+
# Validate PDF content
|
|
128
|
+
if len(content) < 1000: # PDF should be at least 1KB
|
|
129
|
+
logger.warning(f"{func_name}: Downloaded content too small ({len(content)} bytes)")
|
|
130
|
+
return None
|
|
131
|
+
|
|
132
|
+
if not content.startswith(b'%PDF-'):
|
|
133
|
+
logger.warning(f"{func_name}: Downloaded content is not a valid PDF")
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
# Save to file
|
|
137
|
+
with open(output_path, 'wb') as f:
|
|
138
|
+
f.write(content)
|
|
139
|
+
|
|
140
|
+
size_mb = len(content) / 1024 / 1024
|
|
141
|
+
logger.info(f"{func_name}: Successfully downloaded {size_mb:.2f} MB to {output_path}")
|
|
142
|
+
return output_path
|
|
143
|
+
|
|
144
|
+
except aiohttp.ClientError as e:
|
|
145
|
+
logger.warning(f"{func_name}: HTTP client error: {e}")
|
|
146
|
+
return None
|
|
147
|
+
except TimeoutError:
|
|
148
|
+
logger.warning(f"{func_name}: Download timed out after {timeout}s")
|
|
149
|
+
return None
|
|
150
|
+
except Exception as e:
|
|
151
|
+
logger.error(f"{func_name}: Download failed: {e}")
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def try_download_open_access_sync(
|
|
156
|
+
oa_url: str,
|
|
157
|
+
output_path: Path,
|
|
158
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
159
|
+
timeout: int = 60,
|
|
160
|
+
) -> Optional[Path]:
|
|
161
|
+
"""
|
|
162
|
+
Synchronous wrapper for try_download_open_access_async.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
oa_url: Open Access URL
|
|
166
|
+
output_path: Path to save the downloaded PDF
|
|
167
|
+
metadata: Optional paper metadata
|
|
168
|
+
timeout: Download timeout in seconds
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
Path to downloaded PDF if successful, None otherwise
|
|
172
|
+
"""
|
|
173
|
+
import asyncio
|
|
174
|
+
|
|
175
|
+
try:
|
|
176
|
+
loop = asyncio.get_event_loop()
|
|
177
|
+
except RuntimeError:
|
|
178
|
+
loop = asyncio.new_event_loop()
|
|
179
|
+
asyncio.set_event_loop(loop)
|
|
180
|
+
|
|
181
|
+
return loop.run_until_complete(
|
|
182
|
+
try_download_open_access_async(oa_url, output_path, metadata, timeout=timeout)
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
# EOF
|
|
@@ -32,6 +32,7 @@ from datetime import datetime
|
|
|
32
32
|
|
|
33
33
|
from scitex import logging
|
|
34
34
|
from scitex.scholar.core import Paper
|
|
35
|
+
from scitex.scholar.core import normalize_journal_name
|
|
35
36
|
from scitex.scholar.search_engines.individual.PubMedSearchEngine import PubMedSearchEngine
|
|
36
37
|
from scitex.scholar.search_engines.individual.CrossRefSearchEngine import CrossRefSearchEngine
|
|
37
38
|
from scitex.scholar.search_engines.individual.ArXivSearchEngine import ArXivSearchEngine
|
|
@@ -331,12 +332,18 @@ class ScholarPipelineSearchParallel:
|
|
|
331
332
|
if 'metrics' in result:
|
|
332
333
|
if result['metrics'].get('citation_count'):
|
|
333
334
|
paper.metadata.citation_count.total = result['metrics']['citation_count']
|
|
334
|
-
|
|
335
|
+
if 'is_open_access' in result['metrics']:
|
|
336
|
+
paper.metadata.access.is_open_access = result['metrics']['is_open_access']
|
|
337
|
+
paper.metadata.access.is_open_access_engines = [engine_name]
|
|
335
338
|
|
|
336
339
|
if 'urls' in result:
|
|
337
340
|
if result['urls'].get('pdf'):
|
|
338
341
|
# pdfs is a list of dicts with url/source keys
|
|
339
342
|
paper.metadata.url.pdfs = [{'url': result['urls']['pdf'], 'source': 'search'}]
|
|
343
|
+
# If this is an open access paper, also store the PDF URL as oa_url
|
|
344
|
+
if paper.metadata.access.is_open_access:
|
|
345
|
+
paper.metadata.access.oa_url = result['urls']['pdf']
|
|
346
|
+
paper.metadata.access.oa_url_engines = [engine_name]
|
|
340
347
|
if result['urls'].get('publisher'):
|
|
341
348
|
paper.metadata.url.publisher = result['urls']['publisher']
|
|
342
349
|
if result['urls'].get('doi_url'):
|
|
@@ -733,13 +740,21 @@ class ScholarPipelineSearchParallel:
|
|
|
733
740
|
|
|
734
741
|
# Publication info
|
|
735
742
|
if hasattr(meta, 'publication'):
|
|
736
|
-
|
|
743
|
+
journal_raw = meta.publication.journal or ''
|
|
744
|
+
result['journal'] = normalize_journal_name(journal_raw) if journal_raw else ''
|
|
737
745
|
result['impact_factor'] = meta.publication.impact_factor
|
|
738
746
|
|
|
739
747
|
# Metrics
|
|
740
748
|
if hasattr(meta, 'citation_count'):
|
|
741
749
|
result['citation_count'] = meta.citation_count.total or 0
|
|
742
|
-
|
|
750
|
+
|
|
751
|
+
# Access metadata
|
|
752
|
+
if hasattr(meta, 'access'):
|
|
753
|
+
result['is_open_access'] = meta.access.is_open_access or False
|
|
754
|
+
result['oa_status'] = meta.access.oa_status
|
|
755
|
+
result['oa_url'] = meta.access.oa_url
|
|
756
|
+
else:
|
|
757
|
+
result['is_open_access'] = False
|
|
743
758
|
|
|
744
759
|
# URLs
|
|
745
760
|
if hasattr(meta, 'url'):
|
|
@@ -268,12 +268,18 @@ class ScholarPipelineSearchSingle:
|
|
|
268
268
|
if 'metrics' in result:
|
|
269
269
|
if result['metrics'].get('citation_count'):
|
|
270
270
|
paper.metadata.citation_count.total = result['metrics']['citation_count']
|
|
271
|
-
|
|
271
|
+
if 'is_open_access' in result['metrics']:
|
|
272
|
+
paper.metadata.access.is_open_access = result['metrics']['is_open_access']
|
|
273
|
+
paper.metadata.access.is_open_access_engines = [engine_name]
|
|
272
274
|
|
|
273
275
|
if 'urls' in result:
|
|
274
276
|
if result['urls'].get('pdf'):
|
|
275
277
|
# pdfs is a list of dicts with url/source keys
|
|
276
278
|
paper.metadata.url.pdfs = [{'url': result['urls']['pdf'], 'source': 'search'}]
|
|
279
|
+
# If this is an open access paper, also store the PDF URL as oa_url
|
|
280
|
+
if paper.metadata.access.is_open_access:
|
|
281
|
+
paper.metadata.access.oa_url = result['urls']['pdf']
|
|
282
|
+
paper.metadata.access.oa_url_engines = [engine_name]
|
|
277
283
|
if result['urls'].get('publisher'):
|
|
278
284
|
paper.metadata.url.publisher = result['urls']['publisher']
|
|
279
285
|
if result['urls'].get('doi_url'):
|
|
@@ -461,7 +467,14 @@ class ScholarPipelineSearchSingle:
|
|
|
461
467
|
# Metrics
|
|
462
468
|
if hasattr(meta, 'citation_count'):
|
|
463
469
|
result['citation_count'] = meta.citation_count.total or 0
|
|
464
|
-
|
|
470
|
+
|
|
471
|
+
# Access metadata
|
|
472
|
+
if hasattr(meta, 'access'):
|
|
473
|
+
result['is_open_access'] = meta.access.is_open_access or False
|
|
474
|
+
result['oa_status'] = meta.access.oa_status
|
|
475
|
+
result['oa_url'] = meta.access.oa_url
|
|
476
|
+
else:
|
|
477
|
+
result['is_open_access'] = False
|
|
465
478
|
|
|
466
479
|
# URLs
|
|
467
480
|
if hasattr(meta, 'url'):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scitex
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.3
|
|
4
4
|
Summary: A comprehensive Python library for scientific computing and data analysis
|
|
5
5
|
Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-code
|
|
6
6
|
Project-URL: Documentation, https://scitex.readthedocs.io
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
scitex/.mcp.json,sha256=ge1NDrBZkRIxJgx_tCS9QvcEa_P_ay8AAAafraZVRP4,1259
|
|
2
2
|
scitex/__init__.py,sha256=8MkZBGNQrJj9Iy0qKI5aVUYWXyFW8I2HCIdxG8O9WuY,5778
|
|
3
3
|
scitex/__main__.py,sha256=m0B6tnYHtUnkY7tXQab7qlqfNsLTtHqtWOs1Sg-wnhw,488
|
|
4
|
-
scitex/__version__.py,sha256=
|
|
4
|
+
scitex/__version__.py,sha256=9jMqN4MJ8401QbqhffA5qUyQAvmSxbq3WRWDLytDssY,400
|
|
5
5
|
scitex/_optional_deps.py,sha256=oHwPdE6uJ4MmWNgt7JXojNtbwkUjR4c0mCCNMOK4k-w,3696
|
|
6
6
|
scitex/errors.py,sha256=sgl1csU2sfHCINxO9jwPCdNA6hr-CqaT8tQMiuH93sQ,15247
|
|
7
7
|
scitex/units.py,sha256=2T6VCwcjHBT_zPr_DG3JhUIF7a7TU1pUxMQPDBKZNCw,10373
|
|
@@ -142,7 +142,7 @@ scitex/benchmark/benchmark.py,sha256=5WEubBdW4jqZAqd1AFrlDeKjTg15DvUc7wTjtNgL8Aw
|
|
|
142
142
|
scitex/benchmark/monitor.py,sha256=ge7eLEl3mtLprdtIT4liWqim9cquMekgQY4xyaVlTRI,11609
|
|
143
143
|
scitex/benchmark/profiler.py,sha256=aC8Cb_AZdtTS2T-HWj3srUk-unGpZ_y4hz-6K387jcw,8633
|
|
144
144
|
scitex/browser/README.md,sha256=xpYYwib632qOyLCeAIBNtwE2o8frDiLXTyacw2fAz6k,4436
|
|
145
|
-
scitex/browser/__init__.py,sha256=
|
|
145
|
+
scitex/browser/__init__.py,sha256=piiLZLPHPzeW0QrTPx2aiRS7_6TzDptAomDMn1ffs10,2725
|
|
146
146
|
scitex/browser/auth/__init__.py,sha256=mSHD6yUmDsgADN9U4D2Hm5Pi7y4mWYBCsdRnTcB9BHY,910
|
|
147
147
|
scitex/browser/auth/google.py,sha256=a9TTxAhry6fezLv5JAGKFMgDtuRy5a-1HWpsTSO3Qcw,13054
|
|
148
148
|
scitex/browser/automation/CookieHandler.py,sha256=EAWEOQwdneVHCrN-evtrouYBw7wsT0rG472DpeimBVM,6810
|
|
@@ -159,10 +159,14 @@ scitex/browser/collaboration/visual_feedback.py,sha256=0UOLczpMV408AU4zcToOKK3J0
|
|
|
159
159
|
scitex/browser/core/BrowserMixin.py,sha256=P1CNBj0Rx9op6cONfwZMs575A6J2Bsp1TGaO7Dy51n0,10968
|
|
160
160
|
scitex/browser/core/ChromeProfileManager.py,sha256=vWfGQF05dAmmQBcRVmuUV9axoST7RDIczNDPvQq1KUo,14542
|
|
161
161
|
scitex/browser/core/__init__.py,sha256=bl533RumUuDg4-zrzr5X8BbTn_wIMcc4wkuG5A0QN9U,200
|
|
162
|
-
scitex/browser/debugging/__init__.py,sha256=
|
|
162
|
+
scitex/browser/debugging/__init__.py,sha256=q7e1tYecO3nJflNHfur2JkLXZazJW4AZT-Dxz3vnc8k,1971
|
|
163
163
|
scitex/browser/debugging/_browser_logger.py,sha256=ZhQQ5ohZHpeWZ6fRBFjPV6zLWnKP5ZiCxW1PIIDW0SU,20406
|
|
164
|
+
scitex/browser/debugging/_failure_capture.py,sha256=qc5xIkkjYDVge-74bRh60X9MARVe9GVisbOlnt9pjWQ,11662
|
|
164
165
|
scitex/browser/debugging/_highlight_element.py,sha256=EXYInkCGwbKM2NWxX1_aWWSiQNFTwu03zneNsBF9U_w,3925
|
|
165
166
|
scitex/browser/debugging/_show_grid.py,sha256=dyBvAZFAeD5-EgldlC8mfcPDYA9J28K4hVY4YFdidUI,4042
|
|
167
|
+
scitex/browser/debugging/_sync_session.py,sha256=GXJsr20rEVY71bbQpmlBFx13Bi0S0frridLFQdZUs8s,8044
|
|
168
|
+
scitex/browser/debugging/_test_monitor.py,sha256=_1yiDXcPRP6iEA8304lagXs38N_2yAM65OKzf7ydkUE,8227
|
|
169
|
+
scitex/browser/debugging/_visual_cursor.py,sha256=e-bC5Zf4tW8GPpFc4l4aGxvHKFGIZvfFHUKAj1enBYs,13855
|
|
166
170
|
scitex/browser/docs/ABOUT_PLAYWRIGHT.md,sha256=3ovUznFqms50F1CuRr-3lNC2Xk86TR_ytItNO2mDNAQ,1418
|
|
167
171
|
scitex/browser/interaction/__init__.py,sha256=wT0bf6VlTuuyyazN3SDrKelIaIlUYjpD1aBM3HOcGqY,586
|
|
168
172
|
scitex/browser/interaction/click_center.py,sha256=sXFHnSuSohYlbOyVWzkviKjnBjtqB_JkBU1ut0O8jvo,3514
|
|
@@ -1591,7 +1595,7 @@ scitex/scholar/browser/utils/wait_redirects.py,sha256=5FZgp4qKZuwEA1wyFrvpu8EGNI
|
|
|
1591
1595
|
scitex/scholar/citation_graph/README.md,sha256=CGEU_W15eLfu3iV33cQT3jwSHmagA3UmSYI5vAaDW2A,3316
|
|
1592
1596
|
scitex/scholar/citation_graph/__init__.py,sha256=dmA79jVRsVlghbl2SlXS-i2FS-x1QJknCZZDM6Kidog,831
|
|
1593
1597
|
scitex/scholar/citation_graph/builder.py,sha256=dAXksvgiwyxnEeW9gYuC_vOgjYzVghMQHUR7MN28wkw,6618
|
|
1594
|
-
scitex/scholar/citation_graph/database.py,sha256=
|
|
1598
|
+
scitex/scholar/citation_graph/database.py,sha256=NYoLF7VauK8RiEFt8_0ijp5T9fG-ZMl1Q5Lx6CCC0Z8,7067
|
|
1595
1599
|
scitex/scholar/citation_graph/example.py,sha256=HtvSBnm41cdYycSzwXmRomL7qxxPIOkKQN6A0nvBhKw,2859
|
|
1596
1600
|
scitex/scholar/citation_graph/models.py,sha256=qz2KgTq85-7QqzdjzTnk6Vho7bclQemxC6SMWzHgQww,2158
|
|
1597
1601
|
scitex/scholar/cli/README.md,sha256=Qp9UBx4XHFwIhn61rq4pwXxmVwMNyAPHruSi8DowkiM,10946
|
|
@@ -1610,9 +1614,9 @@ scitex/scholar/cli/handlers/doi_handler.py,sha256=aEBa6imcAq9aeQRymBWlNgSUhfokyv
|
|
|
1610
1614
|
scitex/scholar/cli/handlers/project_handler.py,sha256=lA9IUuHO3C3ZPhHKEkcMTpFgS9UppMCebOwhN5J5FEc,10120
|
|
1611
1615
|
scitex/scholar/config/PublisherRules.py,sha256=wumxQXIaiFqG5gdSzd1_7bPytXZu2-WBpHZas4koHts,4570
|
|
1612
1616
|
scitex/scholar/config/README.md,sha256=318vSWix8XiZCNSjahq6Cswww7ZmHPKB3eYi54XyZfM,880
|
|
1613
|
-
scitex/scholar/config/ScholarConfig.py,sha256=
|
|
1617
|
+
scitex/scholar/config/ScholarConfig.py,sha256=WsmDzLjJhNXYjjMsDs3yIWyco5s4qKHm-4XEz89DL28,5233
|
|
1614
1618
|
scitex/scholar/config/__init__.py,sha256=xSQfplE2KxqFHxtAS44V-sNabAnK9JIxM68_9GFVIqI,499
|
|
1615
|
-
scitex/scholar/config/default.yaml,sha256=
|
|
1619
|
+
scitex/scholar/config/default.yaml,sha256=DLO0pzCn_xFKr08rqOEFndQh_xs-Qkezt9RAENzvi-k,18693
|
|
1616
1620
|
scitex/scholar/config/_categories/README.md,sha256=swb9Y-fSDK5IBst3bF96xH_syrRWpv7N8jz7gYQCyeQ,4806
|
|
1617
1621
|
scitex/scholar/config/_categories/api_keys.yaml,sha256=wo2fAxXqQYU6JLkAf4VxvcIiJPIc1qOjx2LMp2hK-k8,739
|
|
1618
1622
|
scitex/scholar/config/_categories/auth_gateway.yaml,sha256=resIZWaEyCRg0HIk0yJV194I4_Ur_OIQ2hLDswC-PqM,3448
|
|
@@ -1628,11 +1632,14 @@ scitex/scholar/config/_categories/url_finder_openurl.yaml,sha256=qIStUtKD1cII6g1
|
|
|
1628
1632
|
scitex/scholar/config/_categories/url_finder_selectors.yaml,sha256=Hn_Amb1egy-2_9UxOqSd_g85zLwy0J8pIoztFGANsCo,3446
|
|
1629
1633
|
scitex/scholar/config/core/_CascadeConfig.py,sha256=DR28mG-dvb4vTgk2bCTZKdT0oOKX3JSxlcmqmp-zAvQ,4855
|
|
1630
1634
|
scitex/scholar/config/core/_PathManager.py,sha256=ddH2Ik2jeHGA6DKEaDZmrLO3AJz5bUNmhGojjYriISE,20899
|
|
1631
|
-
scitex/scholar/core/Paper.py,sha256=
|
|
1635
|
+
scitex/scholar/core/Paper.py,sha256=qhe_HKN6MI0CnY08uWTHReNhBA-pxcw6KMrvLpCeXbc,26806
|
|
1632
1636
|
scitex/scholar/core/Papers.py,sha256=qrlXQIHuISCSEeKnvaSFQw8VgH6ujP946TH1dcu70mM,25123
|
|
1633
1637
|
scitex/scholar/core/README.md,sha256=lzkBX327j4yo_R2cdAmLczzYqn9-tbewEWB91fUBrmo,3197
|
|
1634
1638
|
scitex/scholar/core/Scholar.py,sha256=TVXJP0lpVCLR1NIB1gCi_R8kqPRf5IzLXJ4WsoYz2_k,73367
|
|
1635
|
-
scitex/scholar/core/__init__.py,sha256=
|
|
1639
|
+
scitex/scholar/core/__init__.py,sha256=ZkI7H7n_VXHc_GW_oduRh8OERStv03iLyoM4hfvc4A8,1139
|
|
1640
|
+
scitex/scholar/core/journal_normalizer.py,sha256=dGkAA1fao-6h5Ofcm7EIudRY8EruRoZv6pQ2Up0Opbc,17497
|
|
1641
|
+
scitex/scholar/core/oa_cache.py,sha256=foPNOgdNkm2olSKDQp7Df_yuTdlJf3PdQdAYFyMrx7g,9826
|
|
1642
|
+
scitex/scholar/core/open_access.py,sha256=rVm_T1dvcYClnZtjUqI2dlTRl4RyFgz_kPnofOubAuw,14263
|
|
1636
1643
|
scitex/scholar/docs/DETAILS_FOR_DEVELOPERS.md,sha256=E-Tv_xjaUlwzC8tGNEgQQCQTYxXhSCkccaCwMigxFAM,12878
|
|
1637
1644
|
scitex/scholar/docs/IMPACT_FACTOR_CITATION_INTEGRATION.md,sha256=g2UPSSOzkt7V_kr3GqhFcrDWfBOFfTGHy22Slycziks,8986
|
|
1638
1645
|
scitex/scholar/docs/PIPELINE_IMPLEMENTATION_COMPLETE.md,sha256=jG9MnwMjIbU8LFXrlaWhbTVeVudDpf7rrykivhMbsb8,9056
|
|
@@ -1875,21 +1882,22 @@ scitex/scholar/metadata_engines/utils/__init__.py,sha256=itAfU-rDnO51wPH1HvjKIwE
|
|
|
1875
1882
|
scitex/scholar/metadata_engines/utils/_metadata2bibtex.py,sha256=3yDA29NYtrsyiDWAc2ARPflvrdHvcSZPE-D_GAPyWi8,3092
|
|
1876
1883
|
scitex/scholar/metadata_engines/utils/_standardize_metadata.py,sha256=32j_GlqkyRXlM9tIXOojlWrvIgmwoDezW78vSDiVXRw,12319
|
|
1877
1884
|
scitex/scholar/pdf_download/README.md,sha256=W-Xz3CcSPnZU9qLnUiA7s3nd-yH8SReG15sBttp7Gt0,1429
|
|
1878
|
-
scitex/scholar/pdf_download/ScholarPDFDownloader.py,sha256=
|
|
1885
|
+
scitex/scholar/pdf_download/ScholarPDFDownloader.py,sha256=Obam1sw8mqXydHmO_l9iAjNb68W-CbverWu8T6vWrrw,24468
|
|
1879
1886
|
scitex/scholar/pdf_download/__init__.py,sha256=i5mmHd1wUKmTYRu3yUKxPrnRpWVW1OGDwAK-7r2Kma4,98
|
|
1880
|
-
scitex/scholar/pdf_download/strategies/__init__.py,sha256=
|
|
1887
|
+
scitex/scholar/pdf_download/strategies/__init__.py,sha256=7Mi9YWDXy5jd0WyDARvCwRHSA7iyd4zxYeRcVttqyC8,1349
|
|
1881
1888
|
scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py,sha256=kq7nuIdrrKvvsPIApQcwVtFm8kyRgHaTYTLasY__a5c,14399
|
|
1882
1889
|
scitex/scholar/pdf_download/strategies/direct_download.py,sha256=48cqMB4g85BKSoBNXTKdpiyv7Gbx3XZOTTRuzVyzruE,4419
|
|
1883
1890
|
scitex/scholar/pdf_download/strategies/manual_download_fallback.py,sha256=ep8FnhRr7neihaSILZ_ux1I_oWaTXX9tMxWwkiXtdmA,5286
|
|
1884
1891
|
scitex/scholar/pdf_download/strategies/manual_download_utils.py,sha256=j5holl_qjIGqN0WTyOVwmyv2sFOZAxcAdTglTDUhnFM,35759
|
|
1892
|
+
scitex/scholar/pdf_download/strategies/open_access_download.py,sha256=ISPPMsER66ChTvbjwLF-48idFAWLvam3Vf1UAxPacs4,6319
|
|
1885
1893
|
scitex/scholar/pdf_download/strategies/response_body.py,sha256=fpk0GGiOLQk2Yll76G5YPE5S0a8hde4NQLk8OIrghck,6928
|
|
1886
1894
|
scitex/scholar/pipelines/README.md,sha256=nvTlfY7qP084iZo93-qXfic8jjmbR4qqUZOtmuH391U,4478
|
|
1887
1895
|
scitex/scholar/pipelines/ScholarPipelineBibTeX.py,sha256=OQ_CDAj9x5ZPK8gHdLUlBe9UvYCJXX7IJnp555X69CU,11017
|
|
1888
1896
|
scitex/scholar/pipelines/ScholarPipelineMetadataParallel.py,sha256=IM97YAXHu05uXh3hsa_TuWwBaf2Trjx-kjsEf1qV5t0,9306
|
|
1889
1897
|
scitex/scholar/pipelines/ScholarPipelineMetadataSingle.py,sha256=Cjo-A1pTEegmYm-EhkvkUDIdiSSCI_ke3BBw1JhSfI0,15550
|
|
1890
1898
|
scitex/scholar/pipelines/ScholarPipelineParallel.py,sha256=qmMIaocwP1QIvckQKiPjvnOKzvbO5TnFFiLly5ncBNk,14854
|
|
1891
|
-
scitex/scholar/pipelines/ScholarPipelineSearchParallel.py,sha256=
|
|
1892
|
-
scitex/scholar/pipelines/ScholarPipelineSearchSingle.py,sha256=
|
|
1899
|
+
scitex/scholar/pipelines/ScholarPipelineSearchParallel.py,sha256=In8x3hgzlwIyegD4LOJD-I9NZ0k7_8aZWJZ99cXDjT4,31271
|
|
1900
|
+
scitex/scholar/pipelines/ScholarPipelineSearchSingle.py,sha256=Qd5SloT5vhXEiOGCPFeBLwzzIjxobrDpQH5C920SoHs,19099
|
|
1893
1901
|
scitex/scholar/pipelines/ScholarPipelineSingle.py,sha256=M0iFVCtgDWV5yzd-vUBedmxIdc1hoB1PbCNjzZUj62Q,27295
|
|
1894
1902
|
scitex/scholar/pipelines/SearchQueryParser.py,sha256=7FGjO4Lj7zp-8o8JJjc8qXudY3-pYIjrQarcYFI_lBQ,10018
|
|
1895
1903
|
scitex/scholar/pipelines/__init__.py,sha256=2739ioL2pNmtGCLmDr0mVd2M5c-N_9z27IfG8xVyKKY,2079
|
|
@@ -2925,8 +2933,8 @@ scitex/writer/utils/__init__.py,sha256=wizvQZbOWHsNnkdDsB8J4-lPInRM3gDdwOCRg1fLI
|
|
|
2925
2933
|
scitex/writer/utils/_parse_latex_logs.py,sha256=_KfTzSw2IYhUzdZBJsZreAvQZk_BJHUBe2qIUNJfd-s,3154
|
|
2926
2934
|
scitex/writer/utils/_parse_script_args.py,sha256=vVMQE-AHCs2Q2uVQDuZVN8N3Eft0sxuPtNmnyPXVgnc,4625
|
|
2927
2935
|
scitex/writer/utils/_watch.py,sha256=qSBbwbeCPmXEWXn-ozCrar43rp664Wo65JzwIMWx7wE,2575
|
|
2928
|
-
scitex-2.4.
|
|
2929
|
-
scitex-2.4.
|
|
2930
|
-
scitex-2.4.
|
|
2931
|
-
scitex-2.4.
|
|
2932
|
-
scitex-2.4.
|
|
2936
|
+
scitex-2.4.3.dist-info/METADATA,sha256=2Cl9m8PVii8rfVZqZceefYFQeYZHW5XTpLiXtmgWA88,29660
|
|
2937
|
+
scitex-2.4.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
2938
|
+
scitex-2.4.3.dist-info/entry_points.txt,sha256=jmgM0XEEIfCoMvwDSUNwRHBHaX_cfcJWQgi-lFc-BNU,48
|
|
2939
|
+
scitex-2.4.3.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
|
|
2940
|
+
scitex-2.4.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|