scitex 2.15.3__py3-none-any.whl → 2.15.5__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/_mcp_resources/__init__.py +2 -0
- scitex/_mcp_resources/_scholar.py +148 -0
- scitex/_mcp_tools/canvas.py +49 -15
- scitex/_mcp_tools/scholar.py +50 -99
- scitex/canvas/__init__.py +169 -287
- scitex/canvas/_legacy.py +171 -0
- scitex/canvas/mcp_server.py +16 -3
- scitex/capture/mcp_server.py +16 -2
- scitex/cli/scholar/__init__.py +55 -28
- scitex/cli/scholar/_crossref_scitex.py +25 -266
- scitex/cli/scholar/_openalex_scitex.py +55 -0
- scitex/scholar/__init__.py +14 -9
- scitex/scholar/_mcp/crossref_tool_schemas.py +133 -0
- scitex/scholar/_mcp/openalex_handlers.py +212 -0
- scitex/scholar/_mcp/openalex_tool_schemas.py +96 -0
- scitex/scholar/_mcp/tool_schemas.py +16 -1
- scitex/scholar/local_dbs/__init__.py +31 -0
- scitex/scholar/local_dbs/crossref_scitex.py +30 -0
- scitex/scholar/local_dbs/openalex_scitex.py +30 -0
- scitex/scholar/mcp_server.py +59 -4
- scitex/stats/mcp_server.py +16 -3
- scitex/template/mcp_server.py +16 -3
- scitex/ui/mcp_server.py +16 -3
- {scitex-2.15.3.dist-info → scitex-2.15.5.dist-info}/METADATA +1 -1
- {scitex-2.15.3.dist-info → scitex-2.15.5.dist-info}/RECORD +28 -20
- scitex/scholar/crossref_scitex.py +0 -367
- {scitex-2.15.3.dist-info → scitex-2.15.5.dist-info}/WHEEL +0 -0
- {scitex-2.15.3.dist-info → scitex-2.15.5.dist-info}/entry_points.txt +0 -0
- {scitex-2.15.3.dist-info → scitex-2.15.5.dist-info}/licenses/LICENSE +0 -0
scitex/stats/mcp_server.py
CHANGED
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
# File: src/scitex/stats/mcp_server.py
|
|
4
4
|
# ----------------------------------------
|
|
5
5
|
|
|
6
|
-
"""
|
|
7
|
-
|
|
6
|
+
"""MCP Server for SciTeX Stats - Statistical Testing Framework.
|
|
7
|
+
|
|
8
|
+
.. deprecated::
|
|
9
|
+
This standalone server is deprecated. Use the unified scitex MCP server:
|
|
10
|
+
CLI: scitex serve
|
|
11
|
+
Python: from scitex.mcp_server import run_server
|
|
8
12
|
|
|
9
13
|
Provides tools for:
|
|
10
14
|
- Recommending appropriate statistical tests
|
|
@@ -20,6 +24,15 @@ Provides tools for:
|
|
|
20
24
|
|
|
21
25
|
from __future__ import annotations
|
|
22
26
|
|
|
27
|
+
import warnings
|
|
28
|
+
|
|
29
|
+
warnings.warn(
|
|
30
|
+
"scitex.stats.mcp_server is deprecated. Use 'scitex serve' or "
|
|
31
|
+
"'from scitex.mcp_server import run_server' for the unified MCP server.",
|
|
32
|
+
DeprecationWarning,
|
|
33
|
+
stacklevel=2,
|
|
34
|
+
)
|
|
35
|
+
|
|
23
36
|
import asyncio
|
|
24
37
|
|
|
25
38
|
# Graceful MCP dependency handling
|
|
@@ -380,7 +393,7 @@ async def _run_server():
|
|
|
380
393
|
|
|
381
394
|
|
|
382
395
|
def main():
|
|
383
|
-
"""
|
|
396
|
+
"""Run the MCP server."""
|
|
384
397
|
if not MCP_AVAILABLE:
|
|
385
398
|
import sys
|
|
386
399
|
|
scitex/template/mcp_server.py
CHANGED
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
# File: src/scitex/template/mcp_server.py
|
|
4
4
|
# ----------------------------------------
|
|
5
5
|
|
|
6
|
-
"""
|
|
7
|
-
|
|
6
|
+
"""MCP Server for SciTeX Template - Project Scaffolding Framework.
|
|
7
|
+
|
|
8
|
+
.. deprecated::
|
|
9
|
+
This standalone server is deprecated. Use the unified scitex MCP server:
|
|
10
|
+
CLI: scitex serve
|
|
11
|
+
Python: from scitex.mcp_server import run_server
|
|
8
12
|
|
|
9
13
|
Provides tools for:
|
|
10
14
|
- Listing available project templates
|
|
@@ -15,6 +19,15 @@ Provides tools for:
|
|
|
15
19
|
|
|
16
20
|
from __future__ import annotations
|
|
17
21
|
|
|
22
|
+
import warnings
|
|
23
|
+
|
|
24
|
+
warnings.warn(
|
|
25
|
+
"scitex.template.mcp_server is deprecated. Use 'scitex serve' or "
|
|
26
|
+
"'from scitex.mcp_server import run_server' for the unified MCP server.",
|
|
27
|
+
DeprecationWarning,
|
|
28
|
+
stacklevel=2,
|
|
29
|
+
)
|
|
30
|
+
|
|
18
31
|
import asyncio
|
|
19
32
|
|
|
20
33
|
# Graceful MCP dependency handling
|
|
@@ -161,7 +174,7 @@ async def _run_server():
|
|
|
161
174
|
|
|
162
175
|
|
|
163
176
|
def main():
|
|
164
|
-
"""
|
|
177
|
+
"""Run the MCP server."""
|
|
165
178
|
if not MCP_AVAILABLE:
|
|
166
179
|
import sys
|
|
167
180
|
|
scitex/ui/mcp_server.py
CHANGED
|
@@ -2,14 +2,27 @@
|
|
|
2
2
|
# Timestamp: "2026-01-13 (ywatanabe)"
|
|
3
3
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/ui/mcp_server.py
|
|
4
4
|
|
|
5
|
-
"""
|
|
6
|
-
|
|
5
|
+
"""MCP Server for SciTeX Notifications - Multi-backend alert system.
|
|
6
|
+
|
|
7
|
+
.. deprecated::
|
|
8
|
+
This standalone server is deprecated. Use the unified scitex MCP server:
|
|
9
|
+
CLI: scitex serve
|
|
10
|
+
Python: from scitex.mcp_server import run_server
|
|
7
11
|
|
|
8
12
|
Supports: audio, desktop, email, matplotlib, playwright, webhook backends.
|
|
9
13
|
"""
|
|
10
14
|
|
|
11
15
|
from __future__ import annotations
|
|
12
16
|
|
|
17
|
+
import warnings
|
|
18
|
+
|
|
19
|
+
warnings.warn(
|
|
20
|
+
"scitex.ui.mcp_server is deprecated. Use 'scitex serve' or "
|
|
21
|
+
"'from scitex.mcp_server import run_server' for the unified MCP server.",
|
|
22
|
+
DeprecationWarning,
|
|
23
|
+
stacklevel=2,
|
|
24
|
+
)
|
|
25
|
+
|
|
13
26
|
import asyncio
|
|
14
27
|
from datetime import datetime
|
|
15
28
|
|
|
@@ -126,7 +139,7 @@ async def _run_server():
|
|
|
126
139
|
|
|
127
140
|
|
|
128
141
|
def main():
|
|
129
|
-
"""
|
|
142
|
+
"""Run the MCP server."""
|
|
130
143
|
if not MCP_AVAILABLE:
|
|
131
144
|
import sys
|
|
132
145
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scitex
|
|
3
|
-
Version: 2.15.
|
|
3
|
+
Version: 2.15.5
|
|
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
|
|
@@ -8,20 +8,21 @@ scitex/_optional_deps.py,sha256=ouMy8bw7cxl-AONRNi8xQoxwacR8irKxbcTAI18Hkzw,1014
|
|
|
8
8
|
scitex/errors.py,sha256=Pxk8TKpGRk_QBFVB46H7k1Uxetja0OEdYjJjV_lrxRM,2874
|
|
9
9
|
scitex/mcp_server.py,sha256=VNjs3N21x3_yAzfR8HhuFJJOvYOBHgvJo4tKDQdQsLE,6081
|
|
10
10
|
scitex/units.py,sha256=lm2SH4PGXz-22tjUoBQhvKJDKmPD01ykSFWoCaFC384,10356
|
|
11
|
-
scitex/_mcp_resources/__init__.py,sha256=
|
|
11
|
+
scitex/_mcp_resources/__init__.py,sha256=RomYv2wi1PYC8Z3ymAv46q0HygVErrSlViigLTWEuLY,1368
|
|
12
12
|
scitex/_mcp_resources/_cheatsheet.py,sha256=pdwzAB3IEr7UHkFv0D0-TJGeHF6ENtuq6NHeneLgKo8,3883
|
|
13
13
|
scitex/_mcp_resources/_figrecipe.py,sha256=A8oK3FwDqSNYyYI4jwfNJ2yiH_8XVnfFjoGJtuvdDLU,3581
|
|
14
14
|
scitex/_mcp_resources/_formats.py,sha256=EyNZKtmX6dg6vK1Gk0EmrSSKH5d9yc3RMqZtSP-Op0I,2923
|
|
15
15
|
scitex/_mcp_resources/_modules.py,sha256=17LZpOPSmr9XwgGJg2vRgEK596S5FoSYb320vgm9x-k,8702
|
|
16
|
+
scitex/_mcp_resources/_scholar.py,sha256=RSYt7j6bcbKtR-tOtvCtdE6J3IS8C925_c34t0Z1Es8,4689
|
|
16
17
|
scitex/_mcp_resources/_session.py,sha256=lbe9W3cfPOyoq6bPOeN-jB8MwI4DnRWMpxHmpfn97SM,4590
|
|
17
18
|
scitex/_mcp_tools/__init__.py,sha256=6krJPLr6ReVAkGoZR7vQHQrszr8AGW4dwWsY2EcmPkc,1229
|
|
18
19
|
scitex/_mcp_tools/audio.py,sha256=LBX9YQZkNGAXfoIEFljnHRk39gTyJfdaVPCRrS6F8qE,6245
|
|
19
|
-
scitex/_mcp_tools/canvas.py,sha256=
|
|
20
|
+
scitex/_mcp_tools/canvas.py,sha256=zgu5velDxyTltn87DRN1EuGdJ1UZlcDbiEXGi5rZF7Q,5155
|
|
20
21
|
scitex/_mcp_tools/capture.py,sha256=k7pwuB1vdP-VCYjutajEZEsvVAKY-8_mEYrYGWXgOo8,5658
|
|
21
22
|
scitex/_mcp_tools/diagram.py,sha256=pZNq0UTRlg7piq0YDD40qY5M2mqFYoRdFwmWeRCBieA,585
|
|
22
23
|
scitex/_mcp_tools/introspect.py,sha256=GY9j9EUAs-CKegzfPHubPT3OGpOjcY5Rb09M3OHEIwA,6562
|
|
23
24
|
scitex/_mcp_tools/plt.py,sha256=CuI6uOsyDGrLCWHWwnEKru-KCA532GVzt6rcRlxXHt8,9248
|
|
24
|
-
scitex/_mcp_tools/scholar.py,sha256=
|
|
25
|
+
scitex/_mcp_tools/scholar.py,sha256=Tp8PlcHraLvHMrQWgFgq2jdjAIM4Vsps92mVgZu9NcY,13374
|
|
25
26
|
scitex/_mcp_tools/social.py,sha256=wyyHCybx0tCUfIEGrGYhxj1thlH-dcIeq05TtUP9RFk,816
|
|
26
27
|
scitex/_mcp_tools/stats.py,sha256=U2pGC0NTfzb0stKGafVNdgZhIYovYi6ti1EoG4f4dn4,6139
|
|
27
28
|
scitex/_mcp_tools/template.py,sha256=NhfIaVYo7JvssZk_dUvzosvcc-qjnxFr69dV1DmAlgY,3102
|
|
@@ -240,9 +241,10 @@ scitex/browser/stealth/HumanBehavior.py,sha256=fTocrAO3-8rAgxW1aNZLFgErvHw2MUXao
|
|
|
240
241
|
scitex/browser/stealth/StealthManager.py,sha256=mrtBAo-jo9nM7sSbzKC-s7VEci7SDK6GbidGNqmAPvs,37444
|
|
241
242
|
scitex/browser/stealth/__init__.py,sha256=KVbyLjm8KnM5YwyB84A3pwLdUGkANNgwpA7YL2fyAxo,188
|
|
242
243
|
scitex/canvas/README.md,sha256=jRwasTPNrmQsCyv67ul7qUIgv5xKIab1u2hi8tvlbAg,9142
|
|
243
|
-
scitex/canvas/__init__.py,sha256=
|
|
244
|
+
scitex/canvas/__init__.py,sha256=_K3ocsEwAJMyGRw0ruCD07vjFMjrH1QQNqXujHJbOEw,6295
|
|
245
|
+
scitex/canvas/_legacy.py,sha256=g3pHBTuw9egpjt_CtE8I1YrWnkoauNNHsvDI0zR0xhQ,4060
|
|
244
246
|
scitex/canvas/canvas.py,sha256=1aUjIqCzwKhGXukCQsHc-h-kqLNA9VqzIMazimqm2mA,12968
|
|
245
|
-
scitex/canvas/mcp_server.py,sha256=
|
|
247
|
+
scitex/canvas/mcp_server.py,sha256=fBTmtXOhO60wG-e6j-Y-WE_aWykAMsajWkidZRQ6lcU,4754
|
|
246
248
|
scitex/canvas/_mcp/__init__.py,sha256=FJRAr90vUCg4PJ8Sv-WzsKuM7aY93m6UR87fhk843MU,73
|
|
247
249
|
scitex/canvas/_mcp/handlers.py,sha256=oVZcYfEyDBl6lEKJ7vTWnrueBO-CWOiAbGNrKVFQOww,8528
|
|
248
250
|
scitex/canvas/_mcp/tool_schemas.py,sha256=Tl6CIpuW_J0QppShjZPo0DJ8wiNgLk6oHBoR74ASC7Y,8046
|
|
@@ -364,7 +366,7 @@ scitex/capture/capture.py,sha256=vDVaY2mTNxTsWbg8he78jh0NPhVULLzanREkE9EtQHE,287
|
|
|
364
366
|
scitex/capture/cli.py,sha256=bNal0BXlAM34q9OLv1ydV9lHq95pckY0XaaxsiQTkts,7201
|
|
365
367
|
scitex/capture/gif.py,sha256=Rbx-9u6zGAjImhFWp5yLm3MXCW1oaUq8OusWdPnzJAY,11278
|
|
366
368
|
scitex/capture/grid.py,sha256=LQKNyP5I1UN50rCnxi0tCf7vurLLp3mwRzCoYDa10ZQ,14189
|
|
367
|
-
scitex/capture/mcp_server.py,sha256=
|
|
369
|
+
scitex/capture/mcp_server.py,sha256=jIRAHW48jEvhhk2NYVZifkI42s-XzkGmt7UKwmJ0xDw,38059
|
|
368
370
|
scitex/capture/session.py,sha256=N-8mY6A6QmJHRCJYW4dQhrK7iVmJhYBRDt8vYyeBNYE,1972
|
|
369
371
|
scitex/capture/utils.py,sha256=WyMr8aGmWqOneT4BFTvWNY-PrMPxmKLHtUEgSk59URY,21881
|
|
370
372
|
scitex/capture/_mcp/__init__.py,sha256=MhQoN-oXeeZ-P34rJDluwSi45hf3sC4pVi8MfTW6LBc,286
|
|
@@ -397,11 +399,12 @@ scitex/cli/template.py,sha256=omoT2qzWtyqJYqrIqJ74uyDgoQTL667ONSbwSQU4sb8,12015
|
|
|
397
399
|
scitex/cli/tex.py,sha256=d_Fh9PXObuyjMgQ_Ap60aXwAztJbY3Pd2SvfV92toBg,9222
|
|
398
400
|
scitex/cli/web.py,sha256=_XwnlsOm2MD1eyJVycfsdki4IcDnglXTO5IkZ-eb3xA,13482
|
|
399
401
|
scitex/cli/writer.py,sha256=lApUnUQrclbufEMwD4m4MKMDg3ZkCBe0kTS9WuH4hsM,1953
|
|
400
|
-
scitex/cli/scholar/__init__.py,sha256=
|
|
401
|
-
scitex/cli/scholar/_crossref_scitex.py,sha256
|
|
402
|
+
scitex/cli/scholar/__init__.py,sha256=BQyPjd1jAgcHbjGPZx_amrlGOPM3UaKAdi9JyflQ9k8,8326
|
|
403
|
+
scitex/cli/scholar/_crossref_scitex.py,sha256=-ujYGB-KNtMCMoOBNsOl_qTEp6k6l75JeUqmUwjjG5o,1636
|
|
402
404
|
scitex/cli/scholar/_fetch.py,sha256=tdRXlsTjhfdOddJwWpOZ5scGGXzhesxrXX9Ri9jm7AQ,11226
|
|
403
405
|
scitex/cli/scholar/_jobs.py,sha256=hx1aoxdHaR800XC7acWE4x_pxJ7cYq6re7Zf8MxLr7E,9058
|
|
404
406
|
scitex/cli/scholar/_library.py,sha256=GP3JAtfg3zwGD810BygJLN4B0-m-RqRfyt7_JHtOeT8,4468
|
|
407
|
+
scitex/cli/scholar/_openalex_scitex.py,sha256=-KjFYxnehgJtf4Xz35U_SJqC2zXvvkmdV0ZXThxGpQI,1559
|
|
405
408
|
scitex/cli/scholar/_utils.py,sha256=SC-_wB0UFV89p-4PVdVeREbTOp6oV2ke4QRiiRzShig,770
|
|
406
409
|
scitex/cloud/__init__.py,sha256=xyzKrQGDpoCMNTLNQmCZjvVQxuPlcj306Kjn3psZCNk,5064
|
|
407
410
|
scitex/cloud/_matplotlib_hook.py,sha256=B5IEctAF1Rb7jvkZa5Xl8T1FuBcGiRjFxEtW_mmRz2I,3731
|
|
@@ -1278,17 +1281,19 @@ scitex/schema/_theme.py,sha256=1AWmJy7vim2lmIJlbjv4BCLxKmNeqw0WGEGr2z_U9Kw,10192
|
|
|
1278
1281
|
scitex/schema/_validation.py,sha256=8u4dVVfAhCzdRtcpqFxChumRMyHJQfBQgnyf1TpsQ_s,13747
|
|
1279
1282
|
scitex/scholar/.gitignore,sha256=oYROO1p7Mia9ftRowaRu3BVNm7jdMY9O4Ro1RSgSC80,381
|
|
1280
1283
|
scitex/scholar/README.md,sha256=AbE7t0qIKQY11ZSGkeQXNP_qA088q-2t-oQ3W5bDvxI,3799
|
|
1281
|
-
scitex/scholar/__init__.py,sha256=
|
|
1284
|
+
scitex/scholar/__init__.py,sha256=F7a-OTd8kqZK2vRQVhAGMTqkOGynMc7FRND_SROFTg8,10392
|
|
1282
1285
|
scitex/scholar/__main__.py,sha256=U7QKol30Vsvw_Xg4tVS5F1iFU4UluKnm1Z0Bs18zgCs,9711
|
|
1283
|
-
scitex/scholar/
|
|
1284
|
-
scitex/scholar/mcp_server.py,sha256=m-v1sjU0sJeaL0rHrihQz6alost__Koc7wyEAqP7bIY,12553
|
|
1286
|
+
scitex/scholar/mcp_server.py,sha256=z_b4pD2z1H2bG1B6ATt3B6e8uNBMl-MLz6a3KLnaCiw,14934
|
|
1285
1287
|
scitex/scholar/_mcp/__init__.py,sha256=FJRAr90vUCg4PJ8Sv-WzsKuM7aY93m6UR87fhk843MU,73
|
|
1286
1288
|
scitex/scholar/_mcp/all_handlers.py,sha256=yALfZdQhDXWPlqUB1rcncENXyVVFNDnpGqhz5iCc-5Q,1856
|
|
1287
1289
|
scitex/scholar/_mcp/crossref_handlers.py,sha256=fBN9pVzQLiGT4FWoLGAOdsm-_-gwhMo1EEl0S9MlA0c,7770
|
|
1290
|
+
scitex/scholar/_mcp/crossref_tool_schemas.py,sha256=v1VI3I2r_LWqt4IuEJo_JvXxtdY04eZ3zk6Kvqumou4,4748
|
|
1288
1291
|
scitex/scholar/_mcp/handlers.py,sha256=gMFBHPdqfWGRUDSu3wlllVBnJSzrkGm9ZUnUBhZXCY0,51088
|
|
1289
1292
|
scitex/scholar/_mcp/job_handlers.py,sha256=8ZkFRG1TOq20168DIpic3VMAMzTzieg1jnaE7eXQLlU,4970
|
|
1290
1293
|
scitex/scholar/_mcp/job_tool_schemas.py,sha256=xDTysuf3aLNxLO1O57sal5XcMeEstk0SB77wK9q6yVs,5777
|
|
1291
|
-
scitex/scholar/_mcp/
|
|
1294
|
+
scitex/scholar/_mcp/openalex_handlers.py,sha256=r9X1mwMqqwovrbx4pcgHQeISCbGqqW87neP6EW09Pnw,6503
|
|
1295
|
+
scitex/scholar/_mcp/openalex_tool_schemas.py,sha256=zu7--BZ7_aEnaJuEg-Sb1FiKNoeRthat70S9TZ70uL4,3194
|
|
1296
|
+
scitex/scholar/_mcp/tool_schemas.py,sha256=ng_lGqhwa_2BxByASZriDgnZSHTewvqpF6jOzqRxEZ0,19818
|
|
1292
1297
|
scitex/scholar/auth/README.md,sha256=YYLVVHAgHFjoYXjWJ2SV_3toOJPSnWOs6-EMKbPIu9U,3373
|
|
1293
1298
|
scitex/scholar/auth/ScholarAuthManager.py,sha256=u1t9FrTbBQyGvNmuuMprSpCLLxG0Fap-oCrm0x0iDSE,10570
|
|
1294
1299
|
scitex/scholar/auth/__init__.py,sha256=kM_iLBm00U1sVBr1TuAT7dY46kZqcOCUztMykxBlxhQ,470
|
|
@@ -1490,6 +1495,9 @@ scitex/scholar/jobs/_JobManager.py,sha256=F06vxOZoYouqgeNVmlwKpDPkWWh-PU2aLp3pqu
|
|
|
1490
1495
|
scitex/scholar/jobs/__init__.py,sha256=dXdPmFUWf-Ypl41_Z6qsduYCofygfgq2UjiIZcYiGjQ,1779
|
|
1491
1496
|
scitex/scholar/jobs/_errors.py,sha256=V7Xv4q0CDBJIQ6NSg-lRb_skFcqT-jIZ_aI5gavjDds,10211
|
|
1492
1497
|
scitex/scholar/jobs/_executors.py,sha256=kWU9uuN_8cx6oPyGakjcypsiZoUwicrHL29_aF_iZUU,11807
|
|
1498
|
+
scitex/scholar/local_dbs/__init__.py,sha256=sxCiEcOy5pC6VBpEExHgkAlu1st7EUcfw6PRFo67buQ,857
|
|
1499
|
+
scitex/scholar/local_dbs/crossref_scitex.py,sha256=Ib2JluhqyYjDPh0hZqENHNP7_eg21AQnkyWjl5pfXRs,748
|
|
1500
|
+
scitex/scholar/local_dbs/openalex_scitex.py,sha256=mnHHMnk2aJcSfXYWJh2wsbs818oU1fW63i_3VZG7wpI,748
|
|
1493
1501
|
scitex/scholar/metadata_engines/README.md,sha256=wz1fTeru9sTgkGO5T8VdDBsd4FBaZu2t6-I8MTNGifw,919
|
|
1494
1502
|
scitex/scholar/metadata_engines/ScholarEngine.py,sha256=WGOEvCiBiMm0aZNtN1AlBDCcN6XQUl76R6zedUhR7gs,20604
|
|
1495
1503
|
scitex/scholar/metadata_engines/__init__.py,sha256=qjndZBrK2tXOMCRHFeEu2BJ9Ir8nbr7cHsV4xvXUwv4,749
|
|
@@ -2408,7 +2416,7 @@ scitex/stats/__init__.py,sha256=ZD8j9RTrlwg_JNV3vcTzaovHM0eWKtsfJa5Uno4iWpE,1003
|
|
|
2408
2416
|
scitex/stats/__main__.py,sha256=Jnupr0q90w0ZKbnHSsqXmFWukMGuXzG4bPXInj8Gqmo,7815
|
|
2409
2417
|
scitex/stats/_figrecipe_integration.py,sha256=_nOD1rcITE3HGEc3-5Bu0Q2VRy3Tizil7H35GJyeOng,3076
|
|
2410
2418
|
scitex/stats/_schema.py,sha256=d12piS129kDRnHAD3XJ96d3G8ZLeYm1tK4CAlBfdtbg,1105
|
|
2411
|
-
scitex/stats/mcp_server.py,sha256=
|
|
2419
|
+
scitex/stats/mcp_server.py,sha256=_tjHu7Gubq8519Q_mfKzGGyPUINjoDpAmlszLVlKHZk,15511
|
|
2412
2420
|
scitex/stats/run_all.sh,sha256=Q_fw3q_10mlQAUBRggSNrl0gILFvTFUlFztH2Aicfhs,1381
|
|
2413
2421
|
scitex/stats/_mcp/__init__.py,sha256=FJRAr90vUCg4PJ8Sv-WzsKuM7aY93m6UR87fhk843MU,73
|
|
2414
2422
|
scitex/stats/_mcp/handlers.py,sha256=zvSep5DdTMMRmFFhSDBy-PGeoGhq7e4QAW_7V2v3_dQ,874
|
|
@@ -2500,7 +2508,7 @@ scitex/template/clone_pip_project.py,sha256=cEQkbyD8x-0iVDrL3iCIH2z5e_7mKIXe-uPQ
|
|
|
2500
2508
|
scitex/template/clone_research.py,sha256=cWwW6vQp03u19mDlit-P6yMHF30IW6DQf3xXVdd-D1M,3073
|
|
2501
2509
|
scitex/template/clone_singularity.py,sha256=CYMjaUU1Bf58tKtU5tlTKgjd1EphaZvmMpqmhIyPtyw,3103
|
|
2502
2510
|
scitex/template/clone_writer_directory.py,sha256=ibAlEkMRLTBYmxgg_LFMtFr3uLTMFhTyYyhoDkwv6xE,3058
|
|
2503
|
-
scitex/template/mcp_server.py,sha256=
|
|
2511
|
+
scitex/template/mcp_server.py,sha256=aqCOdzFOeEBjA4RPlXrPXY9O9nix0fOItENQNwdYv5Y,6096
|
|
2504
2512
|
scitex/template/_mcp/__init__.py,sha256=FJRAr90vUCg4PJ8Sv-WzsKuM7aY93m6UR87fhk843MU,73
|
|
2505
2513
|
scitex/template/_mcp/handlers.py,sha256=VqOt8Rjb2d6z0Fhlfui2KgX-coQS-eUZkBZ7z6caOjY,9073
|
|
2506
2514
|
scitex/template/_mcp/tool_schemas.py,sha256=dAuqmTrdOA8DJOtzRvhvvlLNBLLivOJW-UXiTldzt7Y,6580
|
|
@@ -2533,7 +2541,7 @@ scitex/types/__init__.py,sha256=VdI0QzASeZMy_mUCtSfNO8Ngn9PYQ-oGeweo9NfRmrg,301
|
|
|
2533
2541
|
scitex/types/_is_listed_X.py,sha256=4lSFyuqKaZytqDGuyGqUJOqkrFo0Ymql3kfWwIva5L0,1867
|
|
2534
2542
|
scitex/ui/__init__.py,sha256=YTPRgC-eLHgB1Saxml_S5CIRFR0mVTld5f1ZIe8EemI,4882
|
|
2535
2543
|
scitex/ui/_backends.py,sha256=qChJsy_2WUGfXbPd_-CyYf2kOusr4qsEFCT-rduyJ30,741
|
|
2536
|
-
scitex/ui/mcp_server.py,sha256=
|
|
2544
|
+
scitex/ui/mcp_server.py,sha256=HxTJIhsOLGM7ccuH4MvC94ueoZTVdVOv7Jw-HhRiNAs,5166
|
|
2537
2545
|
scitex/ui/_backends/__init__.py,sha256=n3oNFT7NtXrPPORJ0bYk89d-SkZdBH4-1eMR0vZ-buI,1756
|
|
2538
2546
|
scitex/ui/_backends/_audio.py,sha256=3Qq2amkGgmkqqTcEWX82aL3iLrOcY1n8zUYgRH7mzK8,2418
|
|
2539
2547
|
scitex/ui/_backends/_config.py,sha256=Qqzw8U7Ej2kkI4wmVjmixNc7KuIym5klalGiv4TxJUs,8427
|
|
@@ -2612,8 +2620,8 @@ scitex/writer/utils/_parse_latex_logs.py,sha256=K05kCJClG86-RovXG9I5e3wHP0mEGiZl
|
|
|
2612
2620
|
scitex/writer/utils/_parse_script_args.py,sha256=Fkx1ze_jlKYIpviLuT7z0hpqE4cdtXXA_7sK3sKpVs4,4593
|
|
2613
2621
|
scitex/writer/utils/_verify_tree_structure.py,sha256=Uk9NUSleR9aMHpAgUGsPZMk4a75l35EkZhQYKIfolVY,5724
|
|
2614
2622
|
scitex/writer/utils/_watch.py,sha256=nYzPQ-iPAOzbwzAPBtSrrVBLLPMl08e0qxw0mtv0Y8I,2577
|
|
2615
|
-
scitex-2.15.
|
|
2616
|
-
scitex-2.15.
|
|
2617
|
-
scitex-2.15.
|
|
2618
|
-
scitex-2.15.
|
|
2619
|
-
scitex-2.15.
|
|
2623
|
+
scitex-2.15.5.dist-info/METADATA,sha256=wgkawnkDMSabszfw6tnGUOqFOa6kQYZco60gQB3du0w,25007
|
|
2624
|
+
scitex-2.15.5.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
2625
|
+
scitex-2.15.5.dist-info/entry_points.txt,sha256=ZtDrHnPNMnsSmAnQoCHNmk0xKotNyR2X_YFDDteupW8,497
|
|
2626
|
+
scitex-2.15.5.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
|
|
2627
|
+
scitex-2.15.5.dist-info/RECORD,,
|
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# Timestamp: 2026-01-24
|
|
3
|
-
# File: src/scitex/scholar/crossref_scitex.py
|
|
4
|
-
"""CrossRef-SciTeX: Local CrossRef database integration for scitex.scholar.
|
|
5
|
-
|
|
6
|
-
This module provides access to the local CrossRef database (167M+ papers)
|
|
7
|
-
through the crossref-local package. Branded as "crossref-scitex" to distinguish
|
|
8
|
-
from the official CrossRef API. Supports both direct database access and HTTP
|
|
9
|
-
API mode for remote servers.
|
|
10
|
-
|
|
11
|
-
Quick Start
|
|
12
|
-
-----------
|
|
13
|
-
|
|
14
|
-
Search for papers:
|
|
15
|
-
>>> from scitex.scholar import crossref_scitex
|
|
16
|
-
>>> results = crossref_scitex.search("hippocampal sharp wave ripples")
|
|
17
|
-
>>> print(results.total, "papers found")
|
|
18
|
-
|
|
19
|
-
Get paper by DOI:
|
|
20
|
-
>>> work = crossref_scitex.get("10.1126/science.aax0758")
|
|
21
|
-
>>> print(work.title)
|
|
22
|
-
|
|
23
|
-
Configuration
|
|
24
|
-
-------------
|
|
25
|
-
|
|
26
|
-
The mode is automatically detected:
|
|
27
|
-
- If CROSSREF_LOCAL_DB is set, uses direct database access
|
|
28
|
-
- If CROSSREF_LOCAL_API_URL is set, uses HTTP API
|
|
29
|
-
- Default: tries localhost:31291 (SciTeX port scheme)
|
|
30
|
-
|
|
31
|
-
Environment variables (SCITEX_SCHOLAR_CROSSREF_* takes priority):
|
|
32
|
-
SCITEX_SCHOLAR_CROSSREF_DB: Path to local database
|
|
33
|
-
SCITEX_SCHOLAR_CROSSREF_MODE: 'db' or 'http'
|
|
34
|
-
CROSSREF_LOCAL_DB: Path to local database (fallback)
|
|
35
|
-
CROSSREF_LOCAL_API_URL: HTTP API URL (fallback)
|
|
36
|
-
|
|
37
|
-
SSH tunnel for remote database:
|
|
38
|
-
$ ssh -L 31291:127.0.0.1:31291 your-server
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
from __future__ import annotations
|
|
42
|
-
|
|
43
|
-
from typing import TYPE_CHECKING, Any, Optional
|
|
44
|
-
|
|
45
|
-
# Set environment variables for crossref-local configuration
|
|
46
|
-
# SCITEX_SCHOLAR_CROSSREF_* vars take priority in crossref-local's config.py
|
|
47
|
-
|
|
48
|
-
if TYPE_CHECKING:
|
|
49
|
-
from crossref_local import SearchResult, Work
|
|
50
|
-
from crossref_local.citations import CitationNetwork
|
|
51
|
-
|
|
52
|
-
__all__ = [
|
|
53
|
-
# Core search/retrieval
|
|
54
|
-
"search",
|
|
55
|
-
"count",
|
|
56
|
-
"get",
|
|
57
|
-
"get_many",
|
|
58
|
-
"exists",
|
|
59
|
-
# Enrichment
|
|
60
|
-
"enrich",
|
|
61
|
-
"enrich_dois",
|
|
62
|
-
# Configuration
|
|
63
|
-
"configure",
|
|
64
|
-
"configure_http",
|
|
65
|
-
"get_mode",
|
|
66
|
-
"info",
|
|
67
|
-
"is_available",
|
|
68
|
-
# Citation functions
|
|
69
|
-
"get_citing",
|
|
70
|
-
"get_cited",
|
|
71
|
-
"get_citation_count",
|
|
72
|
-
# Classes (re-exported)
|
|
73
|
-
"Work",
|
|
74
|
-
"SearchResult",
|
|
75
|
-
"CitationNetwork",
|
|
76
|
-
# Async API
|
|
77
|
-
"aio",
|
|
78
|
-
# Cache module
|
|
79
|
-
"cache",
|
|
80
|
-
]
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def _ensure_crossref_local():
|
|
84
|
-
"""Ensure crossref-local is available."""
|
|
85
|
-
try:
|
|
86
|
-
import crossref_local
|
|
87
|
-
|
|
88
|
-
return crossref_local
|
|
89
|
-
except ImportError as e:
|
|
90
|
-
raise ImportError(
|
|
91
|
-
"crossref-local not installed. Install with: pip install crossref-local"
|
|
92
|
-
) from e
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def is_available() -> bool:
|
|
96
|
-
"""Check if crossref-local is available and configured.
|
|
97
|
-
|
|
98
|
-
Returns
|
|
99
|
-
-------
|
|
100
|
-
True if crossref-local can be used (either DB or HTTP mode)
|
|
101
|
-
"""
|
|
102
|
-
try:
|
|
103
|
-
crl = _ensure_crossref_local()
|
|
104
|
-
info_result = crl.info()
|
|
105
|
-
return info_result.get("status") == "ok"
|
|
106
|
-
except Exception:
|
|
107
|
-
return False
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
# =============================================================================
|
|
111
|
-
# Core Search/Retrieval Functions (delegated to crossref-local)
|
|
112
|
-
# =============================================================================
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def search(
|
|
116
|
-
query: str,
|
|
117
|
-
limit: int = 20,
|
|
118
|
-
offset: int = 0,
|
|
119
|
-
**kwargs: Any,
|
|
120
|
-
) -> SearchResult:
|
|
121
|
-
"""Search for papers in the CrossRef database.
|
|
122
|
-
|
|
123
|
-
Args:
|
|
124
|
-
query: Search query string (full-text search)
|
|
125
|
-
limit: Maximum number of results (default: 20)
|
|
126
|
-
offset: Number of results to skip for pagination
|
|
127
|
-
**kwargs: Additional arguments passed to crossref-local
|
|
128
|
-
|
|
129
|
-
Returns
|
|
130
|
-
-------
|
|
131
|
-
SearchResult containing matching papers
|
|
132
|
-
|
|
133
|
-
Examples
|
|
134
|
-
--------
|
|
135
|
-
>>> from scitex.scholar import crossref
|
|
136
|
-
>>> results = crossref.search("deep learning")
|
|
137
|
-
>>> for work in results:
|
|
138
|
-
... print(work.title)
|
|
139
|
-
"""
|
|
140
|
-
crl = _ensure_crossref_local()
|
|
141
|
-
return crl.search(query, limit=limit, offset=offset, **kwargs)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def count(query: str) -> int:
|
|
145
|
-
"""Count papers matching a search query.
|
|
146
|
-
|
|
147
|
-
Args:
|
|
148
|
-
query: Search query string
|
|
149
|
-
|
|
150
|
-
Returns
|
|
151
|
-
-------
|
|
152
|
-
Number of matching papers
|
|
153
|
-
"""
|
|
154
|
-
crl = _ensure_crossref_local()
|
|
155
|
-
return crl.count(query)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
def get(doi: str) -> Optional[Work]:
|
|
159
|
-
"""Get a paper by DOI.
|
|
160
|
-
|
|
161
|
-
Args:
|
|
162
|
-
doi: DOI of the paper (e.g., "10.1126/science.aax0758")
|
|
163
|
-
|
|
164
|
-
Returns
|
|
165
|
-
-------
|
|
166
|
-
Work object if found, None otherwise
|
|
167
|
-
|
|
168
|
-
Examples
|
|
169
|
-
--------
|
|
170
|
-
>>> work = crossref.get("10.1038/nature12373")
|
|
171
|
-
>>> if work:
|
|
172
|
-
... print(work.title, work.year)
|
|
173
|
-
"""
|
|
174
|
-
crl = _ensure_crossref_local()
|
|
175
|
-
return crl.get(doi)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
def get_many(dois: list[str]) -> list[Work]:
|
|
179
|
-
"""Get multiple papers by DOI.
|
|
180
|
-
|
|
181
|
-
Args:
|
|
182
|
-
dois: List of DOIs
|
|
183
|
-
|
|
184
|
-
Returns
|
|
185
|
-
-------
|
|
186
|
-
List of Work objects (None for DOIs not found)
|
|
187
|
-
"""
|
|
188
|
-
crl = _ensure_crossref_local()
|
|
189
|
-
return crl.get_many(dois)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
def exists(doi: str) -> bool:
|
|
193
|
-
"""Check if a DOI exists in the database.
|
|
194
|
-
|
|
195
|
-
Args:
|
|
196
|
-
doi: DOI to check
|
|
197
|
-
|
|
198
|
-
Returns
|
|
199
|
-
-------
|
|
200
|
-
True if DOI exists
|
|
201
|
-
"""
|
|
202
|
-
crl = _ensure_crossref_local()
|
|
203
|
-
return crl.exists(doi)
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
# =============================================================================
|
|
207
|
-
# Enrichment Functions
|
|
208
|
-
# =============================================================================
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
def enrich(results: SearchResult) -> SearchResult:
|
|
212
|
-
"""Enrich search results with citation data.
|
|
213
|
-
|
|
214
|
-
Args:
|
|
215
|
-
results: SearchResult to enrich
|
|
216
|
-
|
|
217
|
-
Returns
|
|
218
|
-
-------
|
|
219
|
-
Enriched SearchResult with citation counts and references
|
|
220
|
-
"""
|
|
221
|
-
crl = _ensure_crossref_local()
|
|
222
|
-
return crl.enrich(results)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
def enrich_dois(dois: list[str]) -> list[Work]:
|
|
226
|
-
"""Get and enrich papers by DOI with citation data.
|
|
227
|
-
|
|
228
|
-
Args:
|
|
229
|
-
dois: List of DOIs to enrich
|
|
230
|
-
|
|
231
|
-
Returns
|
|
232
|
-
-------
|
|
233
|
-
List of enriched Work objects
|
|
234
|
-
"""
|
|
235
|
-
crl = _ensure_crossref_local()
|
|
236
|
-
return crl.enrich_dois(dois)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
# =============================================================================
|
|
240
|
-
# Citation Functions
|
|
241
|
-
# =============================================================================
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
def get_citing(doi: str) -> list[str]:
|
|
245
|
-
"""Get DOIs of papers that cite this paper.
|
|
246
|
-
|
|
247
|
-
Args:
|
|
248
|
-
doi: DOI of the paper
|
|
249
|
-
|
|
250
|
-
Returns
|
|
251
|
-
-------
|
|
252
|
-
List of DOIs that cite this paper
|
|
253
|
-
"""
|
|
254
|
-
crl = _ensure_crossref_local()
|
|
255
|
-
return crl.get_citing(doi)
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
def get_cited(doi: str) -> list[str]:
|
|
259
|
-
"""Get DOIs of papers cited by this paper.
|
|
260
|
-
|
|
261
|
-
Args:
|
|
262
|
-
doi: DOI of the paper
|
|
263
|
-
|
|
264
|
-
Returns
|
|
265
|
-
-------
|
|
266
|
-
List of DOIs cited by this paper (references)
|
|
267
|
-
"""
|
|
268
|
-
crl = _ensure_crossref_local()
|
|
269
|
-
return crl.get_cited(doi)
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
def get_citation_count(doi: str) -> int:
|
|
273
|
-
"""Get the citation count for a paper.
|
|
274
|
-
|
|
275
|
-
Args:
|
|
276
|
-
doi: DOI of the paper
|
|
277
|
-
|
|
278
|
-
Returns
|
|
279
|
-
-------
|
|
280
|
-
Number of citations
|
|
281
|
-
"""
|
|
282
|
-
crl = _ensure_crossref_local()
|
|
283
|
-
return crl.get_citation_count(doi)
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
# =============================================================================
|
|
287
|
-
# Configuration Functions
|
|
288
|
-
# =============================================================================
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
def configure(db_path: str) -> None:
|
|
292
|
-
"""Configure direct database access mode.
|
|
293
|
-
|
|
294
|
-
Args:
|
|
295
|
-
db_path: Path to the crossref.db file
|
|
296
|
-
"""
|
|
297
|
-
crl = _ensure_crossref_local()
|
|
298
|
-
crl.configure(db_path)
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
def configure_http(api_url: Optional[str] = None) -> None:
|
|
302
|
-
"""Configure HTTP API mode.
|
|
303
|
-
|
|
304
|
-
Args:
|
|
305
|
-
api_url: API URL (default: http://localhost:31291)
|
|
306
|
-
|
|
307
|
-
Example:
|
|
308
|
-
>>> # After setting up SSH tunnel: ssh -L 31291:127.0.0.1:31291 server
|
|
309
|
-
>>> crossref.configure_http()
|
|
310
|
-
"""
|
|
311
|
-
crl = _ensure_crossref_local()
|
|
312
|
-
crl.configure_http(api_url)
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
def get_mode() -> str:
|
|
316
|
-
"""Get the current operating mode.
|
|
317
|
-
|
|
318
|
-
Returns
|
|
319
|
-
-------
|
|
320
|
-
"db" for direct database access, "http" for API mode
|
|
321
|
-
"""
|
|
322
|
-
crl = _ensure_crossref_local()
|
|
323
|
-
return crl.get_mode()
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
def info() -> dict:
|
|
327
|
-
"""Get information about the crossref-local configuration.
|
|
328
|
-
|
|
329
|
-
Returns
|
|
330
|
-
-------
|
|
331
|
-
Dict with status, mode, version, database stats, etc.
|
|
332
|
-
"""
|
|
333
|
-
crl = _ensure_crossref_local()
|
|
334
|
-
return crl.info()
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
# =============================================================================
|
|
338
|
-
# Re-exported Classes and Modules
|
|
339
|
-
# =============================================================================
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
def __getattr__(name: str):
|
|
343
|
-
"""Lazy import for classes and modules."""
|
|
344
|
-
if name == "Work":
|
|
345
|
-
from crossref_local import Work
|
|
346
|
-
|
|
347
|
-
return Work
|
|
348
|
-
elif name == "SearchResult":
|
|
349
|
-
from crossref_local import SearchResult
|
|
350
|
-
|
|
351
|
-
return SearchResult
|
|
352
|
-
elif name == "CitationNetwork":
|
|
353
|
-
from crossref_local.citations import CitationNetwork
|
|
354
|
-
|
|
355
|
-
return CitationNetwork
|
|
356
|
-
elif name == "aio":
|
|
357
|
-
from crossref_local import aio
|
|
358
|
-
|
|
359
|
-
return aio
|
|
360
|
-
elif name == "cache":
|
|
361
|
-
from crossref_local import cache
|
|
362
|
-
|
|
363
|
-
return cache
|
|
364
|
-
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
# EOF
|
|
File without changes
|
|
File without changes
|
|
File without changes
|