scitex 2.14.0__py3-none-any.whl → 2.15.1__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 (218) hide show
  1. scitex/__init__.py +47 -0
  2. scitex/_env_loader.py +156 -0
  3. scitex/_mcp_resources/__init__.py +37 -0
  4. scitex/_mcp_resources/_cheatsheet.py +135 -0
  5. scitex/_mcp_resources/_figrecipe.py +138 -0
  6. scitex/_mcp_resources/_formats.py +102 -0
  7. scitex/_mcp_resources/_modules.py +337 -0
  8. scitex/_mcp_resources/_session.py +149 -0
  9. scitex/_mcp_tools/__init__.py +4 -0
  10. scitex/_mcp_tools/audio.py +66 -0
  11. scitex/_mcp_tools/diagram.py +11 -95
  12. scitex/_mcp_tools/introspect.py +191 -0
  13. scitex/_mcp_tools/plt.py +260 -305
  14. scitex/_mcp_tools/scholar.py +74 -0
  15. scitex/_mcp_tools/social.py +244 -0
  16. scitex/_mcp_tools/writer.py +21 -204
  17. scitex/ai/_gen_ai/_PARAMS.py +10 -7
  18. scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
  19. scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
  20. scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
  21. scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
  22. scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
  23. scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
  24. scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
  25. scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
  26. scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
  27. scitex/audio/README.md +40 -36
  28. scitex/audio/__init__.py +127 -59
  29. scitex/audio/_branding.py +185 -0
  30. scitex/audio/_mcp/__init__.py +32 -0
  31. scitex/audio/_mcp/handlers.py +59 -6
  32. scitex/audio/_mcp/speak_handlers.py +238 -0
  33. scitex/audio/_relay.py +225 -0
  34. scitex/audio/engines/elevenlabs_engine.py +6 -1
  35. scitex/audio/mcp_server.py +228 -75
  36. scitex/canvas/README.md +1 -1
  37. scitex/canvas/editor/_dearpygui/__init__.py +25 -0
  38. scitex/canvas/editor/_dearpygui/_editor.py +147 -0
  39. scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
  40. scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
  41. scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
  42. scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
  43. scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
  44. scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
  45. scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
  46. scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
  47. scitex/canvas/editor/_dearpygui/_selection.py +295 -0
  48. scitex/canvas/editor/_dearpygui/_state.py +93 -0
  49. scitex/canvas/editor/_dearpygui/_utils.py +61 -0
  50. scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
  51. scitex/cli/__init__.py +38 -43
  52. scitex/cli/audio.py +76 -27
  53. scitex/cli/capture.py +13 -20
  54. scitex/cli/introspect.py +443 -0
  55. scitex/cli/main.py +198 -109
  56. scitex/cli/mcp.py +60 -34
  57. scitex/cli/scholar/__init__.py +8 -0
  58. scitex/cli/scholar/_crossref_scitex.py +296 -0
  59. scitex/cli/scholar/_fetch.py +25 -3
  60. scitex/cli/social.py +314 -0
  61. scitex/cli/writer.py +117 -0
  62. scitex/config/README.md +1 -1
  63. scitex/config/__init__.py +16 -2
  64. scitex/config/_env_registry.py +191 -0
  65. scitex/diagram/__init__.py +42 -19
  66. scitex/diagram/mcp_server.py +13 -125
  67. scitex/introspect/__init__.py +75 -0
  68. scitex/introspect/_call_graph.py +303 -0
  69. scitex/introspect/_class_hierarchy.py +163 -0
  70. scitex/introspect/_core.py +42 -0
  71. scitex/introspect/_docstring.py +131 -0
  72. scitex/introspect/_examples.py +113 -0
  73. scitex/introspect/_imports.py +271 -0
  74. scitex/introspect/_mcp/__init__.py +37 -0
  75. scitex/introspect/_mcp/handlers.py +208 -0
  76. scitex/introspect/_members.py +151 -0
  77. scitex/introspect/_resolve.py +89 -0
  78. scitex/introspect/_signature.py +131 -0
  79. scitex/introspect/_source.py +80 -0
  80. scitex/introspect/_type_hints.py +172 -0
  81. scitex/io/bundle/README.md +1 -1
  82. scitex/mcp_server.py +98 -5
  83. scitex/plt/__init__.py +248 -550
  84. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
  85. scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  86. scitex/plt/gallery/README.md +1 -1
  87. scitex/plt/utils/_hitmap/__init__.py +82 -0
  88. scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
  89. scitex/plt/utils/_hitmap/_color_application.py +346 -0
  90. scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
  91. scitex/plt/utils/_hitmap/_constants.py +40 -0
  92. scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
  93. scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
  94. scitex/plt/utils/_hitmap/_query.py +113 -0
  95. scitex/plt/utils/_hitmap.py +46 -1616
  96. scitex/plt/utils/_metadata/__init__.py +80 -0
  97. scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
  98. scitex/plt/utils/_metadata/_artists/_base.py +195 -0
  99. scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
  100. scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
  101. scitex/plt/utils/_metadata/_artists/_images.py +80 -0
  102. scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
  103. scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
  104. scitex/plt/utils/_metadata/_artists/_text.py +106 -0
  105. scitex/plt/utils/_metadata/_csv.py +416 -0
  106. scitex/plt/utils/_metadata/_detect.py +225 -0
  107. scitex/plt/utils/_metadata/_legend.py +127 -0
  108. scitex/plt/utils/_metadata/_rounding.py +117 -0
  109. scitex/plt/utils/_metadata/_verification.py +202 -0
  110. scitex/schema/README.md +1 -1
  111. scitex/scholar/__init__.py +8 -0
  112. scitex/scholar/_mcp/crossref_handlers.py +265 -0
  113. scitex/scholar/core/Scholar.py +63 -1700
  114. scitex/scholar/core/_mixins/__init__.py +36 -0
  115. scitex/scholar/core/_mixins/_enrichers.py +270 -0
  116. scitex/scholar/core/_mixins/_library_handlers.py +100 -0
  117. scitex/scholar/core/_mixins/_loaders.py +103 -0
  118. scitex/scholar/core/_mixins/_pdf_download.py +375 -0
  119. scitex/scholar/core/_mixins/_pipeline.py +312 -0
  120. scitex/scholar/core/_mixins/_project_handlers.py +125 -0
  121. scitex/scholar/core/_mixins/_savers.py +69 -0
  122. scitex/scholar/core/_mixins/_search.py +103 -0
  123. scitex/scholar/core/_mixins/_services.py +88 -0
  124. scitex/scholar/core/_mixins/_url_finding.py +105 -0
  125. scitex/scholar/crossref_scitex.py +367 -0
  126. scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  127. scitex/scholar/examples/00_run_all.sh +120 -0
  128. scitex/scholar/jobs/_executors.py +27 -3
  129. scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
  130. scitex/scholar/pdf_download/_cli.py +154 -0
  131. scitex/scholar/pdf_download/strategies/__init__.py +11 -8
  132. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
  133. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
  134. scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
  135. scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
  136. scitex/scholar/pipelines/_single_steps.py +71 -36
  137. scitex/scholar/storage/_LibraryManager.py +97 -1695
  138. scitex/scholar/storage/_mixins/__init__.py +30 -0
  139. scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
  140. scitex/scholar/storage/_mixins/_library_operations.py +218 -0
  141. scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
  142. scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
  143. scitex/scholar/storage/_mixins/_resolution.py +376 -0
  144. scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
  145. scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
  146. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
  147. scitex/scholar/url_finder/.tmp/open_url/README.md +223 -0
  148. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +694 -0
  149. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +1160 -0
  150. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +344 -0
  151. scitex/scholar/url_finder/.tmp/open_url/__init__.py +24 -0
  152. scitex/security/README.md +3 -3
  153. scitex/session/README.md +1 -1
  154. scitex/sh/README.md +1 -1
  155. scitex/social/__init__.py +153 -0
  156. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  157. scitex/template/README.md +1 -1
  158. scitex/template/clone_writer_directory.py +5 -5
  159. scitex/writer/README.md +1 -1
  160. scitex/writer/_mcp/handlers.py +11 -744
  161. scitex/writer/_mcp/tool_schemas.py +5 -335
  162. scitex-2.15.1.dist-info/METADATA +648 -0
  163. {scitex-2.14.0.dist-info → scitex-2.15.1.dist-info}/RECORD +166 -111
  164. scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
  165. scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
  166. scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +0 -90
  167. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +0 -1571
  168. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +0 -6262
  169. scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +0 -1274
  170. scitex/dev/plt/data/mpl/dir_ax.txt +0 -459
  171. scitex/diagram/_compile.py +0 -312
  172. scitex/diagram/_diagram.py +0 -355
  173. scitex/diagram/_mcp/__init__.py +0 -4
  174. scitex/diagram/_mcp/handlers.py +0 -400
  175. scitex/diagram/_mcp/tool_schemas.py +0 -157
  176. scitex/diagram/_presets.py +0 -173
  177. scitex/diagram/_schema.py +0 -182
  178. scitex/diagram/_split.py +0 -278
  179. scitex/plt/_mcp/__init__.py +0 -4
  180. scitex/plt/_mcp/_handlers_annotation.py +0 -102
  181. scitex/plt/_mcp/_handlers_figure.py +0 -195
  182. scitex/plt/_mcp/_handlers_plot.py +0 -252
  183. scitex/plt/_mcp/_handlers_style.py +0 -219
  184. scitex/plt/_mcp/handlers.py +0 -74
  185. scitex/plt/_mcp/tool_schemas.py +0 -497
  186. scitex/plt/mcp_server.py +0 -231
  187. scitex/scholar/data/.gitkeep +0 -0
  188. scitex/scholar/data/README.md +0 -44
  189. scitex/scholar/data/bib_files/bibliography.bib +0 -1952
  190. scitex/scholar/data/bib_files/neurovista.bib +0 -277
  191. scitex/scholar/data/bib_files/neurovista_enriched.bib +0 -441
  192. scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +0 -441
  193. scitex/scholar/data/bib_files/neurovista_processed.bib +0 -338
  194. scitex/scholar/data/bib_files/openaccess.bib +0 -89
  195. scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +0 -2178
  196. scitex/scholar/data/bib_files/pac.bib +0 -698
  197. scitex/scholar/data/bib_files/pac_enriched.bib +0 -1061
  198. scitex/scholar/data/bib_files/pac_processed.bib +0 -0
  199. scitex/scholar/data/bib_files/pac_titles.txt +0 -75
  200. scitex/scholar/data/bib_files/paywalled.bib +0 -98
  201. scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +0 -58
  202. scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +0 -87
  203. scitex/scholar/data/bib_files/seizure_prediction.bib +0 -694
  204. scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
  205. scitex/scholar/data/bib_files/test_complete_enriched.bib +0 -437
  206. scitex/scholar/data/bib_files/test_final_enriched.bib +0 -437
  207. scitex/scholar/data/bib_files/test_seizure.bib +0 -46
  208. scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
  209. scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
  210. scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
  211. scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
  212. scitex/scholar/data/impact_factor.db +0 -0
  213. scitex/scholar/examples/SUGGESTIONS.md +0 -865
  214. scitex/scholar/examples/dev.py +0 -38
  215. scitex-2.14.0.dist-info/METADATA +0 -1238
  216. {scitex-2.14.0.dist-info → scitex-2.15.1.dist-info}/WHEEL +0 -0
  217. {scitex-2.14.0.dist-info → scitex-2.15.1.dist-info}/entry_points.txt +0 -0
  218. {scitex-2.14.0.dist-info → scitex-2.15.1.dist-info}/licenses/LICENSE +0 -0
scitex/plt/mcp_server.py DELETED
@@ -1,231 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2026-01-08
3
- # File: src/scitex/plt/mcp_server.py
4
- # ----------------------------------------
5
-
6
- """
7
- MCP Server for SciTeX plt - Publication-quality plotting.
8
-
9
- Provides tools for:
10
- - Style configuration (get/set publication styles)
11
- - Style presets (journal-specific configurations)
12
- - Figure cropping (auto-crop whitespace)
13
- - DPI management
14
- - Color palette access
15
- """
16
-
17
- from __future__ import annotations
18
-
19
- import asyncio
20
-
21
- # Graceful MCP dependency handling
22
- try:
23
- import mcp.types as types
24
- from mcp.server import NotificationOptions, Server
25
- from mcp.server.models import InitializationOptions
26
- from mcp.server.stdio import stdio_server
27
-
28
- MCP_AVAILABLE = True
29
- except ImportError:
30
- MCP_AVAILABLE = False
31
- types = None # type: ignore
32
- Server = None # type: ignore
33
- NotificationOptions = None # type: ignore
34
- InitializationOptions = None # type: ignore
35
- stdio_server = None # type: ignore
36
-
37
- __all__ = ["PltServer", "main", "MCP_AVAILABLE"]
38
-
39
-
40
- class PltServer:
41
- """MCP Server for Publication-quality Plotting."""
42
-
43
- def __init__(self):
44
- self.server = Server("scitex-plt")
45
- self.setup_handlers()
46
-
47
- def setup_handlers(self):
48
- """Set up MCP server handlers."""
49
- from ._mcp.handlers import (
50
- add_panel_label_handler,
51
- add_significance_handler,
52
- close_figure_handler,
53
- create_figure_handler,
54
- crop_figure_handler,
55
- get_color_palette_handler,
56
- get_dpi_settings_handler,
57
- get_style_handler,
58
- list_presets_handler,
59
- plot_bar_handler,
60
- plot_box_handler,
61
- plot_line_handler,
62
- plot_scatter_handler,
63
- plot_violin_handler,
64
- save_figure_handler,
65
- set_style_handler,
66
- )
67
- from ._mcp.tool_schemas import get_tool_schemas
68
-
69
- @self.server.list_tools()
70
- async def handle_list_tools():
71
- return get_tool_schemas()
72
-
73
- @self.server.call_tool()
74
- async def handle_call_tool(name: str, arguments: dict):
75
- # Style tools
76
- if name == "get_style":
77
- return await self._wrap_result(get_style_handler())
78
- elif name == "set_style":
79
- return await self._wrap_result(set_style_handler(**arguments))
80
- elif name == "list_presets":
81
- return await self._wrap_result(list_presets_handler())
82
- elif name == "crop_figure":
83
- return await self._wrap_result(crop_figure_handler(**arguments))
84
- elif name == "get_dpi_settings":
85
- return await self._wrap_result(get_dpi_settings_handler())
86
- elif name == "get_color_palette":
87
- return await self._wrap_result(get_color_palette_handler(**arguments))
88
- # Plotting tools
89
- elif name == "create_figure":
90
- return await self._wrap_result(create_figure_handler(**arguments))
91
- elif name == "plot_bar":
92
- return await self._wrap_result(plot_bar_handler(**arguments))
93
- elif name == "plot_scatter":
94
- return await self._wrap_result(plot_scatter_handler(**arguments))
95
- elif name == "plot_line":
96
- return await self._wrap_result(plot_line_handler(**arguments))
97
- elif name == "plot_box":
98
- return await self._wrap_result(plot_box_handler(**arguments))
99
- elif name == "plot_violin":
100
- return await self._wrap_result(plot_violin_handler(**arguments))
101
- elif name == "add_significance":
102
- return await self._wrap_result(add_significance_handler(**arguments))
103
- elif name == "add_panel_label":
104
- return await self._wrap_result(add_panel_label_handler(**arguments))
105
- elif name == "save_figure":
106
- return await self._wrap_result(save_figure_handler(**arguments))
107
- elif name == "close_figure":
108
- return await self._wrap_result(close_figure_handler(**arguments))
109
- else:
110
- raise ValueError(f"Unknown tool: {name}")
111
-
112
- @self.server.list_resources()
113
- async def handle_list_resources():
114
- """List available plt resources."""
115
- resources = [
116
- types.Resource(
117
- uri="plt://style/current",
118
- name="Current Style",
119
- description="Current publication style configuration",
120
- mimeType="application/json",
121
- ),
122
- types.Resource(
123
- uri="plt://presets",
124
- name="Style Presets",
125
- description="Available journal style presets",
126
- mimeType="application/json",
127
- ),
128
- types.Resource(
129
- uri="plt://colors",
130
- name="Color Palette",
131
- description="SciTeX color palette",
132
- mimeType="application/json",
133
- ),
134
- ]
135
- return resources
136
-
137
- @self.server.read_resource()
138
- async def handle_read_resource(uri: str):
139
- """Read a plt resource."""
140
- import json
141
-
142
- if uri == "plt://style/current":
143
- result = await get_style_handler()
144
- return types.TextResourceContents(
145
- uri=uri,
146
- mimeType="application/json",
147
- text=json.dumps(result, indent=2),
148
- )
149
-
150
- elif uri == "plt://presets":
151
- result = await list_presets_handler()
152
- return types.TextResourceContents(
153
- uri=uri,
154
- mimeType="application/json",
155
- text=json.dumps(result, indent=2),
156
- )
157
-
158
- elif uri == "plt://colors":
159
- result = await get_color_palette_handler()
160
- return types.TextResourceContents(
161
- uri=uri,
162
- mimeType="application/json",
163
- text=json.dumps(result, indent=2),
164
- )
165
-
166
- else:
167
- raise ValueError(f"Unknown resource URI: {uri}")
168
-
169
- async def _wrap_result(self, coro):
170
- """Wrap handler result as MCP TextContent."""
171
- import json
172
-
173
- try:
174
- result = await coro
175
- return [
176
- types.TextContent(
177
- type="text",
178
- text=json.dumps(result, indent=2, default=str),
179
- )
180
- ]
181
- except Exception as e:
182
- return [
183
- types.TextContent(
184
- type="text",
185
- text=json.dumps({"success": False, "error": str(e)}, indent=2),
186
- )
187
- ]
188
-
189
-
190
- async def _run_server():
191
- """Run the MCP server (internal)."""
192
- server = PltServer()
193
- async with stdio_server() as (read_stream, write_stream):
194
- await server.server.run(
195
- read_stream,
196
- write_stream,
197
- InitializationOptions(
198
- server_name="scitex-plt",
199
- server_version="0.1.0",
200
- capabilities=server.server.get_capabilities(
201
- notification_options=NotificationOptions(),
202
- experimental_capabilities={},
203
- ),
204
- ),
205
- )
206
-
207
-
208
- def main():
209
- """Main entry point for the MCP server."""
210
- if not MCP_AVAILABLE:
211
- import sys
212
-
213
- print("=" * 60)
214
- print("MCP Server 'scitex-plt' requires the 'mcp' package.")
215
- print()
216
- print("Install with:")
217
- print(" pip install mcp")
218
- print()
219
- print("Or install scitex with MCP support:")
220
- print(" pip install scitex[mcp]")
221
- print("=" * 60)
222
- sys.exit(1)
223
-
224
- asyncio.run(_run_server())
225
-
226
-
227
- if __name__ == "__main__":
228
- main()
229
-
230
-
231
- # EOF
File without changes
@@ -1,44 +0,0 @@
1
- # Scholar Data Directory
2
-
3
- User-provided data files. This directory is gitignored.
4
-
5
- ## Structure
6
-
7
- ```
8
- data/
9
- └── impact_factor/
10
- ├── JCR_IF_2024.xlsx # JCR Excel file (user-provided)
11
- ├── JCR_IF_2024.db # SQLite database (generated)
12
- └── impact_factor.db -> JCR_IF_2024.db (symlink to active DB)
13
- ```
14
-
15
- ## Important
16
-
17
- - **Data NOT included in git**: This directory is gitignored
18
- - **User responsibility**: Users must provide their own JCR data
19
- - **Licensing**: Users must ensure proper licensing for any data
20
-
21
- ## Adding JCR Data
22
-
23
- 1. Obtain JCR Excel file from Clarivate or authorized source
24
- 2. Place in `src/scitex/scholar/data/impact_factor/JCR_IF_YYYY.xlsx`
25
- 3. Build database (optional - will auto-build if needed):
26
- ```python
27
- from scitex.scholar.impact_factor.jcr import build_database
28
- build_database("JCR_IF_2024.xlsx")
29
- ```
30
-
31
- ## File Naming Convention
32
-
33
- - Excel: `JCR_IF_YYYY.xlsx` (e.g., JCR_IF_2024.xlsx)
34
- - Database: `JCR_IF_YYYY.db` (e.g., JCR_IF_2024.db)
35
- - Symlink: `impact_factor.db` → points to current year DB
36
-
37
- ## Legal Notice
38
-
39
- JCR data is proprietary (Clarivate Analytics). Users are responsible for:
40
- - Obtaining data through authorized channels
41
- - Compliance with licensing terms
42
- - Not distributing data files
43
-
44
- We provide only the code to use the data, not the data itself.