scitex 2.1.2__py3-none-any.whl → 2.3.0__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 (1325) hide show
  1. scitex/__init__.py +90 -10
  2. scitex/__main__.py +0 -110
  3. scitex/__version__.py +1 -1
  4. scitex/_optional_deps.py +0 -0
  5. scitex/ai/_gen_ai/_BaseGenAI.py +1 -1
  6. scitex/ai/classification/examples/timeseries_cv_demo.py +0 -0
  7. scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
  8. scitex/ai/classification/reporters/__init__.py +0 -0
  9. scitex/ai/classification/reporters/reporter_utils/__init__.py +0 -0
  10. scitex/ai/classification/reporters/reporter_utils/aggregation.py +0 -0
  11. scitex/ai/classification/reporters/reporter_utils/data_models.py +0 -0
  12. scitex/ai/classification/reporters/reporter_utils/reporting.py +0 -0
  13. scitex/ai/classification/reporters/reporter_utils/validation.py +0 -0
  14. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
  15. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
  16. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +6 -6
  17. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +6 -6
  18. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
  19. scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
  20. scitex/ai/feature_extraction/vit.py +1 -1
  21. scitex/ai/feature_selection/__init__.py +0 -0
  22. scitex/ai/feature_selection/feature_selection.py +0 -0
  23. scitex/ai/loss/multi_task_loss.py +1 -1
  24. scitex/ai/metrics/_calc_bacc.py +0 -0
  25. scitex/ai/metrics/_calc_bacc_from_conf_mat.py +0 -0
  26. scitex/ai/metrics/_calc_clf_report.py +0 -0
  27. scitex/ai/metrics/_calc_conf_mat.py +0 -0
  28. scitex/ai/metrics/_calc_feature_importance.py +0 -0
  29. scitex/ai/metrics/_calc_mcc.py +0 -0
  30. scitex/ai/metrics/_calc_pre_rec_auc.py +0 -0
  31. scitex/ai/metrics/_calc_roc_auc.py +0 -0
  32. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
  33. scitex/ai/metrics/_normalize_labels.py +0 -0
  34. scitex/ai/plt/_plot_conf_mat.py +1 -1
  35. scitex/ai/plt/_plot_feature_importance.py +1 -1
  36. scitex/ai/plt/_plot_learning_curve.py +1 -1
  37. scitex/ai/plt/_plot_optuna_study.py +1 -1
  38. scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
  39. scitex/ai/plt/_plot_roc_curve.py +1 -1
  40. scitex/ai/sampling/undersample.py +1 -1
  41. scitex/ai/training/_LearningCurveLogger.py +1 -1
  42. scitex/benchmark/__init__.py +3 -3
  43. scitex/benchmark/benchmark.py +0 -0
  44. scitex/benchmark/monitor.py +0 -0
  45. scitex/benchmark/profiler.py +0 -0
  46. scitex/browser/__init__.py +0 -0
  47. scitex/browser/automation/CookieHandler.py +1 -1
  48. scitex/browser/automation/__init__.py +0 -0
  49. scitex/browser/collaboration/__init__.py +0 -0
  50. scitex/browser/collaboration/auth_helpers.py +0 -0
  51. scitex/browser/collaboration/collaborative_agent.py +0 -0
  52. scitex/browser/collaboration/credential_manager.py +0 -0
  53. scitex/browser/collaboration/interactive_panel.py +0 -0
  54. scitex/browser/collaboration/persistent_browser.py +0 -0
  55. scitex/browser/collaboration/shared_session.py +0 -0
  56. scitex/browser/collaboration/standard_interactions.py +0 -0
  57. scitex/browser/collaboration/visual_feedback.py +0 -0
  58. scitex/browser/core/BrowserMixin.py +1 -1
  59. scitex/browser/core/ChromeProfileManager.py +1 -1
  60. scitex/browser/core/__init__.py +0 -0
  61. scitex/browser/debugging/_browser_logger.py +1 -1
  62. scitex/browser/debugging/_highlight_element.py +1 -1
  63. scitex/browser/debugging/_show_grid.py +1 -1
  64. scitex/browser/interaction/click_center.py +1 -1
  65. scitex/browser/interaction/click_with_fallbacks.py +1 -1
  66. scitex/browser/interaction/close_popups.py +1 -1
  67. scitex/browser/interaction/fill_with_fallbacks.py +1 -1
  68. scitex/browser/pdf/__init__.py +0 -0
  69. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
  70. scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
  71. scitex/browser/remote/CaptchaHandler.py +0 -0
  72. scitex/browser/remote/ZenRowsAPIClient.py +0 -0
  73. scitex/browser/remote/__init__.py +0 -0
  74. scitex/browser/stealth/HumanBehavior.py +1 -1
  75. scitex/browser/stealth/StealthManager.py +1 -1
  76. scitex/browser/stealth/__init__.py +0 -0
  77. scitex/cli/__init__.py +0 -0
  78. scitex/cli/cloud.py +200 -9
  79. scitex/cli/main.py +139 -10
  80. scitex/cli/scholar.py +0 -0
  81. scitex/cli/security.py +109 -0
  82. scitex/cli/web.py +409 -0
  83. scitex/cli/writer.py +270 -0
  84. scitex/cloud/__init__.py +131 -0
  85. scitex/cloud/_matplotlib_hook.py +146 -0
  86. scitex/db/_delete_duplicates.py +1 -1
  87. scitex/db/_inspect_optimized.py +0 -0
  88. scitex/db/_postgresql/_PostgreSQL.py +1 -1
  89. scitex/db/_sqlite3/_SQLite3.py +1 -1
  90. scitex/decorators/__init__.py +9 -0
  91. scitex/dict/_DotDict.py +65 -138
  92. scitex/dict/__init__.py +1 -0
  93. scitex/dict/_flatten.py +2 -10
  94. scitex/dict/_listed_dict.py +2 -3
  95. scitex/dict/_pop_keys.py +2 -3
  96. scitex/dict/_replace.py +1 -3
  97. scitex/dict/_safe_merge.py +6 -16
  98. scitex/dict/_to_str.py +6 -3
  99. scitex/dsp/_demo_sig.py +1 -1
  100. scitex/dsp/_detect_ripples.py +1 -1
  101. scitex/dsp/_ensure_3d.py +1 -1
  102. scitex/dsp/_hilbert.py +2 -2
  103. scitex/dsp/_misc.py +1 -1
  104. scitex/dsp/_modulation_index.py +2 -2
  105. scitex/dsp/_pac.py +3 -3
  106. scitex/dsp/_psd.py +2 -2
  107. scitex/dsp/_resample.py +1 -1
  108. scitex/dsp/_transform.py +1 -1
  109. scitex/dsp/_wavelet.py +2 -2
  110. scitex/dsp/add_noise.py +1 -1
  111. scitex/dsp/filt.py +6 -6
  112. scitex/dsp/norm.py +1 -1
  113. scitex/dsp/reference.py +1 -1
  114. scitex/dsp/utils/_differential_bandpass_filters.py +3 -3
  115. scitex/dsp/utils/_ensure_3d.py +1 -1
  116. scitex/dsp/utils/_zero_pad.py +1 -1
  117. scitex/dsp/utils/filter.py +2 -2
  118. scitex/dt/_normalize_timestamp.py +1 -1
  119. scitex/gen/_check_host.py +1 -1
  120. scitex/gen/_deprecated_close.py +3 -3
  121. scitex/gen/_deprecated_start.py +1 -1
  122. scitex/gen/_norm.py +2 -2
  123. scitex/gen/_norm_cache.py +1 -1
  124. scitex/gen/_symlink.py +1 -1
  125. scitex/gen/_to_rank.py +1 -1
  126. scitex/gen/_transpose.py +1 -1
  127. scitex/git/__init__.py +0 -0
  128. scitex/git/_branch.py +5 -3
  129. scitex/git/_clone.py +35 -6
  130. scitex/git/_commit.py +3 -2
  131. scitex/git/_constants.py +0 -0
  132. scitex/git/_init.py +0 -0
  133. scitex/git/_remote.py +1 -1
  134. scitex/git/_result.py +0 -0
  135. scitex/git/_retry.py +0 -0
  136. scitex/git/_session.py +1 -1
  137. scitex/git/_types.py +0 -0
  138. scitex/git/_utils.py +0 -0
  139. scitex/git/_validation.py +0 -0
  140. scitex/git/_workflow.py +1 -1
  141. scitex/io/README.md +65 -1
  142. scitex/io/__init__.py +12 -0
  143. scitex/io/_glob.py +1 -1
  144. scitex/io/_load.py +59 -9
  145. scitex/io/_load_cache.py +0 -0
  146. scitex/io/_load_configs.py +9 -4
  147. scitex/io/_load_modules/_image.py +48 -4
  148. scitex/io/_load_modules/_pdf.py +95 -32
  149. scitex/io/_load_modules/_sqlite3.py +1 -1
  150. scitex/io/_metadata.py +298 -0
  151. scitex/io/_path.py +2 -2
  152. scitex/io/_qr_utils.py +75 -0
  153. scitex/io/_save.py +211 -23
  154. scitex/io/_save_modules/_image.py +68 -16
  155. scitex/io/_save_modules/_tex.py +1 -1
  156. scitex/io/memo.md +2827 -0
  157. scitex/io/utils/h5_to_zarr.py +1 -1
  158. scitex/linalg/_distance.py +2 -2
  159. scitex/linalg/_geometric_median.py +1 -1
  160. scitex/logging/README.md +1 -1
  161. scitex/logging/_Tee.py +2 -2
  162. scitex/logging/_context.py +0 -0
  163. scitex/logging/_formatters.py +9 -2
  164. scitex/logging/_handlers.py +0 -0
  165. scitex/logging/_levels.py +0 -0
  166. scitex/logging/_logger.py +59 -20
  167. scitex/logging/_print_capture.py +0 -0
  168. scitex/ml/__init__.py +1 -1
  169. scitex/nn/_Filters.py +6 -6
  170. scitex/nn/_Spectrogram.py +1 -1
  171. scitex/nn/_Wavelet.py +2 -2
  172. scitex/pd/_force_df.py +1 -1
  173. scitex/plt/README.md +26 -1
  174. scitex/plt/__init__.py +103 -5
  175. scitex/plt/_subplots/_AxesWrapper.py +2 -1
  176. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +93 -4
  177. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +13 -3
  178. scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +2 -2
  179. scitex/plt/_subplots/_FigWrapper.py +104 -10
  180. scitex/plt/_subplots/_SubplotsWrapper.py +462 -2
  181. scitex/plt/_subplots/_export_as_csv.py +71 -4
  182. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +1 -0
  183. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +0 -0
  184. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +40 -0
  185. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +0 -0
  186. scitex/plt/ax/__init__.py +9 -1
  187. scitex/plt/ax/_plot/__init__.py +2 -0
  188. scitex/plt/ax/_plot/_add_fitted_line.py +97 -0
  189. scitex/plt/ax/_plot/_plot_conf_mat.py +2 -2
  190. scitex/plt/ax/_plot/_plot_ecdf.py +1 -1
  191. scitex/plt/ax/_plot/_plot_heatmap.py +14 -3
  192. scitex/plt/ax/_plot/_plot_shaded_line.py +1 -1
  193. scitex/plt/ax/_style/__init__.py +1 -0
  194. scitex/plt/ax/_style/_auto_scale_axis.py +195 -0
  195. scitex/plt/ax/_style/_format_units.py +103 -0
  196. scitex/plt/ax/_style/_set_ticks.py +2 -2
  197. scitex/plt/ax/_style/_style_barplot.py +58 -0
  198. scitex/plt/ax/_style/_style_boxplot.py +98 -0
  199. scitex/plt/ax/_style/_style_errorbar.py +68 -0
  200. scitex/plt/ax/_style/_style_scatter.py +68 -0
  201. scitex/plt/ax/_style/_style_suptitles.py +76 -0
  202. scitex/plt/color/_PARAMS.py +2 -2
  203. scitex/plt/color/_colors.py +1 -1
  204. scitex/plt/presets.py +224 -0
  205. scitex/plt/utils/__init__.py +21 -0
  206. scitex/plt/utils/_calc_bacc_from_conf_mat.py +1 -1
  207. scitex/plt/utils/_collect_figure_metadata.py +478 -0
  208. scitex/plt/utils/_configure_mpl.py +98 -28
  209. scitex/plt/utils/_crop.py +232 -0
  210. scitex/plt/utils/_dimension_viewer.py +437 -0
  211. scitex/plt/utils/_figure_from_axes_mm.py +353 -0
  212. scitex/plt/utils/_figure_mm.py +342 -0
  213. scitex/plt/utils/_get_actual_font.py +56 -0
  214. scitex/plt/utils/_units.py +123 -0
  215. scitex/{rng/README.md → repro/README_RandomStateManager.md} +2 -2
  216. scitex/{rng → repro}/_RandomStateManager.py +99 -10
  217. scitex/repro/__init__.py +32 -50
  218. scitex/repro/_gen_ID.py +84 -0
  219. scitex/repro/_gen_timestamp.py +78 -0
  220. scitex/repro/_hash_array.py +143 -0
  221. scitex/reproduce/__init__.py +2 -2
  222. scitex/resource/_get_specs.py +1 -1
  223. scitex/resource/_log_processor_usages.py +4 -4
  224. scitex/rng/__init__.py +20 -27
  225. scitex/scholar/auth/core/__init__.py +0 -0
  226. scitex/scholar/auth/gateway/__init__.py +0 -0
  227. scitex/scholar/auth/providers/OpenAthensAuthenticator.py +3 -3
  228. scitex/scholar/auth/providers/__init__.py +0 -0
  229. scitex/scholar/auth/session/__init__.py +0 -0
  230. scitex/scholar/auth/sso/BaseSSOAutomator.py +1 -1
  231. scitex/scholar/auth/sso/__init__.py +0 -0
  232. scitex/scholar/browser/utils/__init__.py +0 -0
  233. scitex/scholar/cli/_CentralArgumentParser.py +0 -0
  234. scitex/scholar/cli/_argument_groups.py +0 -0
  235. scitex/scholar/cli/_doi_operations.py +0 -0
  236. scitex/scholar/cli/_url_utils.py +0 -0
  237. scitex/scholar/cli/handlers/__init__.py +0 -0
  238. scitex/scholar/cli/handlers/bibtex_handler.py +0 -0
  239. scitex/scholar/cli/handlers/doi_handler.py +0 -0
  240. scitex/scholar/cli/handlers/project_handler.py +0 -0
  241. scitex/scholar/cli/open_browser.py +0 -0
  242. scitex/scholar/cli/open_browser_auto.py +0 -0
  243. scitex/scholar/cli/open_browser_monitored.py +0 -0
  244. scitex/scholar/config/PublisherRules.py +0 -0
  245. scitex/scholar/config/core/_PathManager.py +42 -0
  246. scitex/scholar/core/__init__.py +0 -0
  247. scitex/scholar/docs/template.py +1 -1
  248. scitex/scholar/docs/to_claude/guidelines/python/env.md +1 -1
  249. scitex/scholar/docs/to_claude/guidelines/python/general.md +1 -1
  250. scitex/scholar/examples/07_storage_integration.py +1 -1
  251. scitex/scholar/examples/zotero_integration.py +0 -0
  252. scitex/scholar/impact_factor/estimation/ImpactFactorEstimationEngine.py +0 -0
  253. scitex/scholar/impact_factor/estimation/__init__.py +0 -0
  254. scitex/scholar/impact_factor/estimation/build_database.py +0 -0
  255. scitex/scholar/impact_factor/estimation/core/__init__.py +0 -0
  256. scitex/scholar/impact_factor/estimation/core/cache_manager.py +0 -0
  257. scitex/scholar/impact_factor/estimation/core/calculator.py +0 -0
  258. scitex/scholar/impact_factor/estimation/core/journal_matcher.py +0 -0
  259. scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
  260. scitex/scholar/impact_factor/jcr/build_database.py +1 -1
  261. scitex/scholar/integration/__init__.py +0 -0
  262. scitex/scholar/integration/base.py +0 -0
  263. scitex/scholar/integration/mendeley/__init__.py +0 -0
  264. scitex/scholar/integration/mendeley/exporter.py +0 -0
  265. scitex/scholar/integration/mendeley/importer.py +0 -0
  266. scitex/scholar/integration/mendeley/linker.py +0 -0
  267. scitex/scholar/integration/mendeley/mapper.py +0 -0
  268. scitex/scholar/integration/zotero/__init__.py +0 -0
  269. scitex/scholar/integration/zotero/__main__.py +0 -0
  270. scitex/scholar/integration/zotero/exporter.py +0 -0
  271. scitex/scholar/integration/zotero/importer.py +0 -0
  272. scitex/scholar/integration/zotero/linker.py +0 -0
  273. scitex/scholar/integration/zotero/mapper.py +0 -0
  274. scitex/scholar/metadata_engines/individual/ArXivEngine.py +4 -1
  275. scitex/scholar/metadata_engines/individual/CrossRefEngine.py +20 -3
  276. scitex/scholar/metadata_engines/individual/__init__.py +0 -0
  277. scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +19 -1
  278. scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
  279. scitex/scholar/pdf_download/__init__.py +0 -0
  280. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
  281. scitex/scholar/pipelines/ScholarPipelineMetadataParallel.py +0 -0
  282. scitex/scholar/pipelines/ScholarPipelineMetadataSingle.py +102 -7
  283. scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
  284. scitex/scholar/pipelines/ScholarPipelineSearchParallel.py +0 -0
  285. scitex/scholar/pipelines/ScholarPipelineSearchSingle.py +0 -0
  286. scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
  287. scitex/scholar/pipelines/SearchQueryParser.py +0 -0
  288. scitex/scholar/pipelines/__init__.py +0 -0
  289. scitex/scholar/search_engines/ScholarSearchEngine.py +0 -0
  290. scitex/scholar/search_engines/_BaseSearchEngine.py +0 -0
  291. scitex/scholar/search_engines/__init__.py +0 -0
  292. scitex/scholar/search_engines/individual/ArXivSearchEngine.py +0 -0
  293. scitex/scholar/search_engines/individual/CrossRefSearchEngine.py +0 -0
  294. scitex/scholar/search_engines/individual/OpenAlexSearchEngine.py +0 -0
  295. scitex/scholar/search_engines/individual/PubMedSearchEngine.py +0 -0
  296. scitex/scholar/search_engines/individual/SemanticScholarSearchEngine.py +0 -0
  297. scitex/scholar/search_engines/individual/__init__.py +0 -0
  298. scitex/scholar/storage/BibTeXHandler.py +35 -5
  299. scitex/scholar/storage/PaperIO.py +1 -1
  300. scitex/scholar/storage/_DeduplicationManager.py +0 -0
  301. scitex/scholar/storage/_LibraryManager.py +0 -0
  302. scitex/scholar/storage/__init__.py +0 -0
  303. scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +0 -0
  304. scitex/scholar/url_finder/strategies/find_pdf_urls_by_dropdown.py +0 -0
  305. scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +0 -0
  306. scitex/scholar/url_finder/translators/__init__.py +0 -0
  307. scitex/scholar/url_finder/translators/core/__init__.py +0 -0
  308. scitex/scholar/url_finder/translators/core/base.py +0 -0
  309. scitex/scholar/url_finder/translators/core/patterns.py +0 -0
  310. scitex/scholar/url_finder/translators/individual/BOFiP_Impots.py +0 -0
  311. scitex/scholar/url_finder/translators/individual/Baidu_Scholar.py +0 -0
  312. scitex/scholar/url_finder/translators/individual/Bangkok_Post.py +0 -0
  313. scitex/scholar/url_finder/translators/individual/Baruch_Foundation.py +0 -0
  314. scitex/scholar/url_finder/translators/individual/Beobachter.py +0 -0
  315. scitex/scholar/url_finder/translators/individual/Bezneng_Gajit.py +0 -0
  316. scitex/scholar/url_finder/translators/individual/BibLaTeX.py +0 -0
  317. scitex/scholar/url_finder/translators/individual/BibTeX.py +0 -0
  318. scitex/scholar/url_finder/translators/individual/Biblio_com.py +0 -0
  319. scitex/scholar/url_finder/translators/individual/Bibliontology_RDF.py +0 -0
  320. scitex/scholar/url_finder/translators/individual/CLASE.py +0 -0
  321. scitex/scholar/url_finder/translators/individual/COBISS.py +0 -0
  322. scitex/scholar/url_finder/translators/individual/COinS.py +0 -0
  323. scitex/scholar/url_finder/translators/individual/CQ_Press.py +0 -0
  324. scitex/scholar/url_finder/translators/individual/CROSBI.py +0 -0
  325. scitex/scholar/url_finder/translators/individual/CSL_JSON.py +0 -0
  326. scitex/scholar/url_finder/translators/individual/CSV.py +0 -0
  327. scitex/scholar/url_finder/translators/individual/CalMatters.py +0 -0
  328. scitex/scholar/url_finder/translators/individual/Calisphere.py +0 -0
  329. scitex/scholar/url_finder/translators/individual/Camara_Brasileira_do_Livro_ISBN.py +0 -0
  330. scitex/scholar/url_finder/translators/individual/CanLII.py +0 -0
  331. scitex/scholar/url_finder/translators/individual/Canada_com.py +0 -0
  332. scitex/scholar/url_finder/translators/individual/Canadian_Letters_and_Images.py +0 -0
  333. scitex/scholar/url_finder/translators/individual/Canadiana_ca.py +0 -0
  334. scitex/scholar/url_finder/translators/individual/Cascadilla_Proceedings_Project.py +0 -0
  335. scitex/scholar/url_finder/translators/individual/Central_and_Eastern_European_Online_Library_Journals.py +0 -0
  336. scitex/scholar/url_finder/translators/individual/Champlain_Society_Collection.py +0 -0
  337. scitex/scholar/url_finder/translators/individual/Chicago_Journal_of_Theoretical_Computer_Science.py +0 -0
  338. scitex/scholar/url_finder/translators/individual/Christian_Science_Monitor.py +0 -0
  339. scitex/scholar/url_finder/translators/individual/Columbia_University_Press.py +0 -0
  340. scitex/scholar/url_finder/translators/individual/Common_Place.py +0 -0
  341. scitex/scholar/url_finder/translators/individual/Cornell_LII.py +0 -0
  342. scitex/scholar/url_finder/translators/individual/Cornell_University_Press.py +0 -0
  343. scitex/scholar/url_finder/translators/individual/CourtListener.py +0 -0
  344. scitex/scholar/url_finder/translators/individual/DAI_Zenon.py +0 -0
  345. scitex/scholar/url_finder/translators/individual/__init__.py +0 -0
  346. scitex/scholar/url_finder/translators/individual/abc_news_australia.py +0 -0
  347. scitex/scholar/url_finder/translators/individual/access_engineering.py +0 -0
  348. scitex/scholar/url_finder/translators/individual/access_medicine.py +0 -0
  349. scitex/scholar/url_finder/translators/individual/access_science.py +0 -0
  350. scitex/scholar/url_finder/translators/individual/acls_humanities_ebook.py +0 -0
  351. scitex/scholar/url_finder/translators/individual/aclweb.py +0 -0
  352. scitex/scholar/url_finder/translators/individual/acm.py +0 -0
  353. scitex/scholar/url_finder/translators/individual/acm_digital_library.py +0 -0
  354. scitex/scholar/url_finder/translators/individual/acs.py +0 -0
  355. scitex/scholar/url_finder/translators/individual/acs_publications.py +0 -0
  356. scitex/scholar/url_finder/translators/individual/adam_matthew_digital.py +0 -0
  357. scitex/scholar/url_finder/translators/individual/ads_bibcode.py +0 -0
  358. scitex/scholar/url_finder/translators/individual/aea_web.py +0 -0
  359. scitex/scholar/url_finder/translators/individual/agencia_del_isbn.py +0 -0
  360. scitex/scholar/url_finder/translators/individual/agris.py +0 -0
  361. scitex/scholar/url_finder/translators/individual/ahval_news.py +0 -0
  362. scitex/scholar/url_finder/translators/individual/aip.py +0 -0
  363. scitex/scholar/url_finder/translators/individual/air_university_journals.py +0 -0
  364. scitex/scholar/url_finder/translators/individual/airiti.py +0 -0
  365. scitex/scholar/url_finder/translators/individual/alexander_street_press.py +0 -0
  366. scitex/scholar/url_finder/translators/individual/all_africa.py +0 -0
  367. scitex/scholar/url_finder/translators/individual/allafrica.py +0 -0
  368. scitex/scholar/url_finder/translators/individual/alsharekh.py +0 -0
  369. scitex/scholar/url_finder/translators/individual/alternet.py +0 -0
  370. scitex/scholar/url_finder/translators/individual/aluka.py +0 -0
  371. scitex/scholar/url_finder/translators/individual/amazon.py +0 -0
  372. scitex/scholar/url_finder/translators/individual/american_archive_public_broadcasting.py +0 -0
  373. scitex/scholar/url_finder/translators/individual/american_institute_aeronautics_astronautics.py +0 -0
  374. scitex/scholar/url_finder/translators/individual/american_prospect.py +0 -0
  375. scitex/scholar/url_finder/translators/individual/ams_journals.py +0 -0
  376. scitex/scholar/url_finder/translators/individual/ams_mathscinet.py +0 -0
  377. scitex/scholar/url_finder/translators/individual/ams_mathscinet_legacy.py +0 -0
  378. scitex/scholar/url_finder/translators/individual/ancestry_com_us_federal_census.py +0 -0
  379. scitex/scholar/url_finder/translators/individual/ancestry_us_federal_census.py +0 -0
  380. scitex/scholar/url_finder/translators/individual/annual_reviews.py +0 -0
  381. scitex/scholar/url_finder/translators/individual/antikvarium_hu.py +0 -0
  382. scitex/scholar/url_finder/translators/individual/aosic.py +0 -0
  383. scitex/scholar/url_finder/translators/individual/apa_psycnet.py +0 -0
  384. scitex/scholar/url_finder/translators/individual/apn_ru.py +0 -0
  385. scitex/scholar/url_finder/translators/individual/aps.py +0 -0
  386. scitex/scholar/url_finder/translators/individual/aps_physics.py +0 -0
  387. scitex/scholar/url_finder/translators/individual/aquadocs.py +0 -0
  388. scitex/scholar/url_finder/translators/individual/archeion.py +0 -0
  389. scitex/scholar/url_finder/translators/individual/archiv_fuer_sozialgeschichte.py +0 -0
  390. scitex/scholar/url_finder/translators/individual/ariana_news.py +0 -0
  391. scitex/scholar/url_finder/translators/individual/art_institute_of_chicago.py +0 -0
  392. scitex/scholar/url_finder/translators/individual/artefacts_canada.py +0 -0
  393. scitex/scholar/url_finder/translators/individual/artfl_encyclopedie.py +0 -0
  394. scitex/scholar/url_finder/translators/individual/artforum.py +0 -0
  395. scitex/scholar/url_finder/translators/individual/artnet.py +0 -0
  396. scitex/scholar/url_finder/translators/individual/artnews.py +0 -0
  397. scitex/scholar/url_finder/translators/individual/artstor.py +0 -0
  398. scitex/scholar/url_finder/translators/individual/arxiv.py +0 -0
  399. scitex/scholar/url_finder/translators/individual/asce.py +0 -0
  400. scitex/scholar/url_finder/translators/individual/asco_meeting_library.py +0 -0
  401. scitex/scholar/url_finder/translators/individual/astis.py +0 -0
  402. scitex/scholar/url_finder/translators/individual/atlanta_journal_constitution.py +0 -0
  403. scitex/scholar/url_finder/translators/individual/ats_international_journal.py +0 -0
  404. scitex/scholar/url_finder/translators/individual/atypon.py +0 -0
  405. scitex/scholar/url_finder/translators/individual/atypon_journals.py +0 -0
  406. scitex/scholar/url_finder/translators/individual/austlii_and_nzlii.py +0 -0
  407. scitex/scholar/url_finder/translators/individual/australian_dictionary_of_biography.py +0 -0
  408. scitex/scholar/url_finder/translators/individual/bailii.py +0 -0
  409. scitex/scholar/url_finder/translators/individual/bbc.py +0 -0
  410. scitex/scholar/url_finder/translators/individual/bbc_genome.py +0 -0
  411. scitex/scholar/url_finder/translators/individual/beck_online.py +0 -0
  412. scitex/scholar/url_finder/translators/individual/biblioteca_nacional_de_maestros.py +0 -0
  413. scitex/scholar/url_finder/translators/individual/bibliotheque_archives_nationale_quebec_pistard.py +0 -0
  414. scitex/scholar/url_finder/translators/individual/bibliotheque_archives_nationales_quebec.py +0 -0
  415. scitex/scholar/url_finder/translators/individual/bibliotheque_et_archives_nationale_du_quebec__pistard_.py +0 -0
  416. scitex/scholar/url_finder/translators/individual/bibliotheque_et_archives_nationales_du_quebec.py +0 -0
  417. scitex/scholar/url_finder/translators/individual/bibliotheque_nationale_de_france.py +0 -0
  418. scitex/scholar/url_finder/translators/individual/bibliotheque_nationale_france.py +0 -0
  419. scitex/scholar/url_finder/translators/individual/bibsys.py +0 -0
  420. scitex/scholar/url_finder/translators/individual/bioconductor.py +0 -0
  421. scitex/scholar/url_finder/translators/individual/biomed_central.py +0 -0
  422. scitex/scholar/url_finder/translators/individual/bioone.py +0 -0
  423. scitex/scholar/url_finder/translators/individual/biorxiv.py +0 -0
  424. scitex/scholar/url_finder/translators/individual/blaetter.py +0 -0
  425. scitex/scholar/url_finder/translators/individual/blogger.py +0 -0
  426. scitex/scholar/url_finder/translators/individual/bloomberg.py +0 -0
  427. scitex/scholar/url_finder/translators/individual/bloomsbury_food_library.py +0 -0
  428. scitex/scholar/url_finder/translators/individual/bluesky.py +0 -0
  429. scitex/scholar/url_finder/translators/individual/bnf_isbn.py +0 -0
  430. scitex/scholar/url_finder/translators/individual/bocc.py +0 -0
  431. scitex/scholar/url_finder/translators/individual/boe.py +0 -0
  432. scitex/scholar/url_finder/translators/individual/bookmarks.py +0 -0
  433. scitex/scholar/url_finder/translators/individual/bookshop_org.py +0 -0
  434. scitex/scholar/url_finder/translators/individual/boston_review.py +0 -0
  435. scitex/scholar/url_finder/translators/individual/bosworth_toller_anglo_saxon_dictionary.py +0 -0
  436. scitex/scholar/url_finder/translators/individual/bosworth_toller_s_anglo_saxon_dictionary_online.py +0 -0
  437. scitex/scholar/url_finder/translators/individual/bracero_history_archive.py +0 -0
  438. scitex/scholar/url_finder/translators/individual/brill.py +0 -0
  439. scitex/scholar/url_finder/translators/individual/brukerhandboken.py +0 -0
  440. scitex/scholar/url_finder/translators/individual/bryn_mawr_classical_review.py +0 -0
  441. scitex/scholar/url_finder/translators/individual/bundesgesetzblatt.py +0 -0
  442. scitex/scholar/url_finder/translators/individual/business_standard.py +0 -0
  443. scitex/scholar/url_finder/translators/individual/cabi___cab_abstracts.py +0 -0
  444. scitex/scholar/url_finder/translators/individual/cabi_cab_abstracts.py +0 -0
  445. scitex/scholar/url_finder/translators/individual/cairn.py +0 -0
  446. scitex/scholar/url_finder/translators/individual/cairn_info.py +0 -0
  447. scitex/scholar/url_finder/translators/individual/cambridge.py +0 -0
  448. scitex/scholar/url_finder/translators/individual/cambridge_core.py +0 -0
  449. scitex/scholar/url_finder/translators/individual/cambridge_engage_preprints.py +0 -0
  450. scitex/scholar/url_finder/translators/individual/caod.py +0 -0
  451. scitex/scholar/url_finder/translators/individual/cbc.py +0 -0
  452. scitex/scholar/url_finder/translators/individual/ccfr__bnf_.py +0 -0
  453. scitex/scholar/url_finder/translators/individual/ccfr_bnf.py +0 -0
  454. scitex/scholar/url_finder/translators/individual/cell_press.py +0 -0
  455. scitex/scholar/url_finder/translators/individual/cern_document_server.py +0 -0
  456. scitex/scholar/url_finder/translators/individual/ceur_workshop_proceedings.py +0 -0
  457. scitex/scholar/url_finder/translators/individual/cff.py +0 -0
  458. scitex/scholar/url_finder/translators/individual/cff_references.py +0 -0
  459. scitex/scholar/url_finder/translators/individual/champlain_society___collection.py +0 -0
  460. scitex/scholar/url_finder/translators/individual/chronicling_america.py +0 -0
  461. scitex/scholar/url_finder/translators/individual/cia_world_factbook.py +0 -0
  462. scitex/scholar/url_finder/translators/individual/cinii_research.py +0 -0
  463. scitex/scholar/url_finder/translators/individual/citavi_5_xml.py +0 -0
  464. scitex/scholar/url_finder/translators/individual/citeseer.py +0 -0
  465. scitex/scholar/url_finder/translators/individual/citizen_lab.py +0 -0
  466. scitex/scholar/url_finder/translators/individual/civilization_ca.py +0 -0
  467. scitex/scholar/url_finder/translators/individual/clacso.py +0 -0
  468. scitex/scholar/url_finder/translators/individual/climate_change_and_human_health_literature_portal.py +0 -0
  469. scitex/scholar/url_finder/translators/individual/climate_change_human_health.py +0 -0
  470. scitex/scholar/url_finder/translators/individual/clinical_key.py +0 -0
  471. scitex/scholar/url_finder/translators/individual/clinicaltrials_gov.py +0 -0
  472. scitex/scholar/url_finder/translators/individual/cnki.py +0 -0
  473. scitex/scholar/url_finder/translators/individual/code4lib_journal.py +0 -0
  474. scitex/scholar/url_finder/translators/individual/colorado_state_legislature.py +0 -0
  475. scitex/scholar/url_finder/translators/individual/computer_history_museum_archive.py +0 -0
  476. scitex/scholar/url_finder/translators/individual/copernicus.py +0 -0
  477. scitex/scholar/url_finder/translators/individual/crossref_rest.py +0 -0
  478. scitex/scholar/url_finder/translators/individual/crossref_unixref_xml.py +0 -0
  479. scitex/scholar/url_finder/translators/individual/csiro_publishing.py +0 -0
  480. scitex/scholar/url_finder/translators/individual/csiro_publishing_dup.py +0 -0
  481. scitex/scholar/url_finder/translators/individual/current_affairs.py +0 -0
  482. scitex/scholar/url_finder/translators/individual/dabi.py +0 -0
  483. scitex/scholar/url_finder/translators/individual/dagens_nyheter.py +0 -0
  484. scitex/scholar/url_finder/translators/individual/dagstuhl.py +0 -0
  485. scitex/scholar/url_finder/translators/individual/dagstuhl_research_online_publication_server.py +0 -0
  486. scitex/scholar/url_finder/translators/individual/dar_almandumah.py +0 -0
  487. scitex/scholar/url_finder/translators/individual/dart_europe.py +0 -0
  488. scitex/scholar/url_finder/translators/individual/data_gov.py +0 -0
  489. scitex/scholar/url_finder/translators/individual/databrary.py +0 -0
  490. scitex/scholar/url_finder/translators/individual/datacite_json.py +0 -0
  491. scitex/scholar/url_finder/translators/individual/dataverse.py +0 -0
  492. scitex/scholar/url_finder/translators/individual/daum_news.py +0 -0
  493. scitex/scholar/url_finder/translators/individual/dblp.py +0 -0
  494. scitex/scholar/url_finder/translators/individual/dblp_computer_science_bibliography.py +0 -0
  495. scitex/scholar/url_finder/translators/individual/dbpia.py +0 -0
  496. scitex/scholar/url_finder/translators/individual/de_gruyter_brill.py +0 -0
  497. scitex/scholar/url_finder/translators/individual/defense_technical_information_center.py +0 -0
  498. scitex/scholar/url_finder/translators/individual/dejure_org.py +0 -0
  499. scitex/scholar/url_finder/translators/individual/delpher.py +0 -0
  500. scitex/scholar/url_finder/translators/individual/demographic_research.py +0 -0
  501. scitex/scholar/url_finder/translators/individual/denik_cz.py +0 -0
  502. scitex/scholar/url_finder/translators/individual/depatisnet.py +0 -0
  503. scitex/scholar/url_finder/translators/individual/der_freitag.py +0 -0
  504. scitex/scholar/url_finder/translators/individual/der_spiegel.py +0 -0
  505. scitex/scholar/url_finder/translators/individual/desiring_god.py +0 -0
  506. scitex/scholar/url_finder/translators/individual/deutsche_fotothek.py +0 -0
  507. scitex/scholar/url_finder/translators/individual/deutsche_nationalbibliothek.py +0 -0
  508. scitex/scholar/url_finder/translators/individual/dhistory.py +0 -0
  509. scitex/scholar/url_finder/translators/individual/dialnet.py +0 -0
  510. scitex/scholar/url_finder/translators/individual/die_zeit.py +0 -0
  511. scitex/scholar/url_finder/translators/individual/digibib_net.py +0 -0
  512. scitex/scholar/url_finder/translators/individual/digital_humanities_quarterly.py +0 -0
  513. scitex/scholar/url_finder/translators/individual/digital_spy.py +0 -0
  514. scitex/scholar/url_finder/translators/individual/digizeitschriften.py +0 -0
  515. scitex/scholar/url_finder/translators/individual/dimensions.py +0 -0
  516. scitex/scholar/url_finder/translators/individual/dlibra.py +0 -0
  517. scitex/scholar/url_finder/translators/individual/doaj.py +0 -0
  518. scitex/scholar/url_finder/translators/individual/doi.py +0 -0
  519. scitex/scholar/url_finder/translators/individual/doi_content_negotiation.py +0 -0
  520. scitex/scholar/url_finder/translators/individual/douban.py +0 -0
  521. scitex/scholar/url_finder/translators/individual/dpla.py +0 -0
  522. scitex/scholar/url_finder/translators/individual/dreier_neuerscheinungsdienst.py +0 -0
  523. scitex/scholar/url_finder/translators/individual/drugbank_ca.py +0 -0
  524. scitex/scholar/url_finder/translators/individual/dryad.py +0 -0
  525. scitex/scholar/url_finder/translators/individual/dryad_digital_repository.py +0 -0
  526. scitex/scholar/url_finder/translators/individual/dspace.py +0 -0
  527. scitex/scholar/url_finder/translators/individual/dspace_intermediate_metadata.py +0 -0
  528. scitex/scholar/url_finder/translators/individual/duke_university_press_books.py +0 -0
  529. scitex/scholar/url_finder/translators/individual/e_periodica_switzerland.py +0 -0
  530. scitex/scholar/url_finder/translators/individual/eastview.py +0 -0
  531. scitex/scholar/url_finder/translators/individual/ebrary.py +0 -0
  532. scitex/scholar/url_finder/translators/individual/ebsco_discovery_layer.py +0 -0
  533. scitex/scholar/url_finder/translators/individual/ebscohost.py +0 -0
  534. scitex/scholar/url_finder/translators/individual/edinburgh_university_press_journals.py +0 -0
  535. scitex/scholar/url_finder/translators/individual/education_week.py +0 -0
  536. scitex/scholar/url_finder/translators/individual/eidr.py +0 -0
  537. scitex/scholar/url_finder/translators/individual/el_comercio__peru_.py +0 -0
  538. scitex/scholar/url_finder/translators/individual/el_pais.py +0 -0
  539. scitex/scholar/url_finder/translators/individual/electronic_colloquium_on_computational_complexity.py +0 -0
  540. scitex/scholar/url_finder/translators/individual/elibrary_ru.py +0 -0
  541. scitex/scholar/url_finder/translators/individual/elicit.py +0 -0
  542. scitex/scholar/url_finder/translators/individual/elife.py +0 -0
  543. scitex/scholar/url_finder/translators/individual/elsevier_health.py +0 -0
  544. scitex/scholar/url_finder/translators/individual/elsevier_health_journals.py +0 -0
  545. scitex/scholar/url_finder/translators/individual/elsevier_pure.py +0 -0
  546. scitex/scholar/url_finder/translators/individual/embedded_metadata.py +0 -0
  547. scitex/scholar/url_finder/translators/individual/emedicine.py +0 -0
  548. scitex/scholar/url_finder/translators/individual/emerald.py +0 -0
  549. scitex/scholar/url_finder/translators/individual/emerald_insight.py +0 -0
  550. scitex/scholar/url_finder/translators/individual/emja.py +0 -0
  551. scitex/scholar/url_finder/translators/individual/encyclopedia_of_chicago.py +0 -0
  552. scitex/scholar/url_finder/translators/individual/encyclopedia_of_korean_culture.py +0 -0
  553. scitex/scholar/url_finder/translators/individual/endnote_xml.py +0 -0
  554. scitex/scholar/url_finder/translators/individual/engineering_village.py +0 -0
  555. scitex/scholar/url_finder/translators/individual/envidat.py +0 -0
  556. scitex/scholar/url_finder/translators/individual/epa_national_library_catalog.py +0 -0
  557. scitex/scholar/url_finder/translators/individual/epicurious.py +0 -0
  558. scitex/scholar/url_finder/translators/individual/eprint_iacr.py +0 -0
  559. scitex/scholar/url_finder/translators/individual/eric.py +0 -0
  560. scitex/scholar/url_finder/translators/individual/erudit.py +0 -0
  561. scitex/scholar/url_finder/translators/individual/espacenet.py +0 -0
  562. scitex/scholar/url_finder/translators/individual/etatar_ru.py +0 -0
  563. scitex/scholar/url_finder/translators/individual/euclid.py +0 -0
  564. scitex/scholar/url_finder/translators/individual/eur_lex.py +0 -0
  565. scitex/scholar/url_finder/translators/individual/eurasianet.py +0 -0
  566. scitex/scholar/url_finder/translators/individual/eurogamerusgamer.py +0 -0
  567. scitex/scholar/url_finder/translators/individual/europe_pmc.py +0 -0
  568. scitex/scholar/url_finder/translators/individual/evernote.py +0 -0
  569. scitex/scholar/url_finder/translators/individual/f1000_research.py +0 -0
  570. scitex/scholar/url_finder/translators/individual/fachportal_padagogik.py +0 -0
  571. scitex/scholar/url_finder/translators/individual/factiva.py +0 -0
  572. scitex/scholar/url_finder/translators/individual/failed_architecture.py +0 -0
  573. scitex/scholar/url_finder/translators/individual/fairfax_australia.py +0 -0
  574. scitex/scholar/url_finder/translators/individual/fao_publications.py +0 -0
  575. scitex/scholar/url_finder/translators/individual/fatcat.py +0 -0
  576. scitex/scholar/url_finder/translators/individual/faz_net.py +0 -0
  577. scitex/scholar/url_finder/translators/individual/feb_web_ru.py +0 -0
  578. scitex/scholar/url_finder/translators/individual/figshare.py +0 -0
  579. scitex/scholar/url_finder/translators/individual/financial_times.py +0 -0
  580. scitex/scholar/url_finder/translators/individual/finna.py +0 -0
  581. scitex/scholar/url_finder/translators/individual/fishpond_co_nz.py +0 -0
  582. scitex/scholar/url_finder/translators/individual/flickr.py +0 -0
  583. scitex/scholar/url_finder/translators/individual/foreign_affairs.py +0 -0
  584. scitex/scholar/url_finder/translators/individual/foreign_policy.py +0 -0
  585. scitex/scholar/url_finder/translators/individual/fr_online_de.py +0 -0
  586. scitex/scholar/url_finder/translators/individual/freecite.py +0 -0
  587. scitex/scholar/url_finder/translators/individual/freepatentsonline.py +0 -0
  588. scitex/scholar/url_finder/translators/individual/frieze.py +0 -0
  589. scitex/scholar/url_finder/translators/individual/frontiers.py +0 -0
  590. scitex/scholar/url_finder/translators/individual/gale_databases.py +0 -0
  591. scitex/scholar/url_finder/translators/individual/galegdc.py +0 -0
  592. scitex/scholar/url_finder/translators/individual/galegroup.py +0 -0
  593. scitex/scholar/url_finder/translators/individual/gallica.py +0 -0
  594. scitex/scholar/url_finder/translators/individual/game_studies.py +0 -0
  595. scitex/scholar/url_finder/translators/individual/gamespot.py +0 -0
  596. scitex/scholar/url_finder/translators/individual/gamestar_gamepro.py +0 -0
  597. scitex/scholar/url_finder/translators/individual/gasyrlar_awazy.py +0 -0
  598. scitex/scholar/url_finder/translators/individual/gemeinsamer_bibliotheksverbund_isbn.py +0 -0
  599. scitex/scholar/url_finder/translators/individual/gene_ontology.py +0 -0
  600. scitex/scholar/url_finder/translators/individual/github.py +0 -0
  601. scitex/scholar/url_finder/translators/individual/globes.py +0 -0
  602. scitex/scholar/url_finder/translators/individual/gmail.py +0 -0
  603. scitex/scholar/url_finder/translators/individual/gms_german_medical_science.py +0 -0
  604. scitex/scholar/url_finder/translators/individual/goodreads.py +0 -0
  605. scitex/scholar/url_finder/translators/individual/google_books.py +0 -0
  606. scitex/scholar/url_finder/translators/individual/google_patents.py +0 -0
  607. scitex/scholar/url_finder/translators/individual/google_play.py +0 -0
  608. scitex/scholar/url_finder/translators/individual/google_presentation.py +0 -0
  609. scitex/scholar/url_finder/translators/individual/google_research.py +0 -0
  610. scitex/scholar/url_finder/translators/individual/google_scholar.py +0 -0
  611. scitex/scholar/url_finder/translators/individual/govinfo.py +0 -0
  612. scitex/scholar/url_finder/translators/individual/gpo_access_e_cfr.py +0 -0
  613. scitex/scholar/url_finder/translators/individual/gulag_many_days__many_lives.py +0 -0
  614. scitex/scholar/url_finder/translators/individual/haaretz.py +0 -0
  615. scitex/scholar/url_finder/translators/individual/habr.py +0 -0
  616. scitex/scholar/url_finder/translators/individual/hal.py +0 -0
  617. scitex/scholar/url_finder/translators/individual/hal_archives_ouvertes.py +0 -0
  618. scitex/scholar/url_finder/translators/individual/handelszeitung.py +0 -0
  619. scitex/scholar/url_finder/translators/individual/hanrei_watch.py +0 -0
  620. scitex/scholar/url_finder/translators/individual/harper_s_magazine.py +0 -0
  621. scitex/scholar/url_finder/translators/individual/harvard_business_review.py +0 -0
  622. scitex/scholar/url_finder/translators/individual/harvard_caselaw_access_project.py +0 -0
  623. scitex/scholar/url_finder/translators/individual/harvard_university_press_books.py +0 -0
  624. scitex/scholar/url_finder/translators/individual/hathitrust.py +0 -0
  625. scitex/scholar/url_finder/translators/individual/hcsp.py +0 -0
  626. scitex/scholar/url_finder/translators/individual/heinonline.py +0 -0
  627. scitex/scholar/url_finder/translators/individual/heise.py +0 -0
  628. scitex/scholar/url_finder/translators/individual/herder.py +0 -0
  629. scitex/scholar/url_finder/translators/individual/highbeam.py +0 -0
  630. scitex/scholar/url_finder/translators/individual/highwire.py +0 -0
  631. scitex/scholar/url_finder/translators/individual/highwire2.py +0 -0
  632. scitex/scholar/url_finder/translators/individual/highwire_2_0.py +0 -0
  633. scitex/scholar/url_finder/translators/individual/hindawi.py +0 -0
  634. scitex/scholar/url_finder/translators/individual/hindawi_publishers.py +0 -0
  635. scitex/scholar/url_finder/translators/individual/hispanic_american_periodical_index.py +0 -0
  636. scitex/scholar/url_finder/translators/individual/homeland_security_digital_library.py +0 -0
  637. scitex/scholar/url_finder/translators/individual/hudoc.py +0 -0
  638. scitex/scholar/url_finder/translators/individual/huff_post.py +0 -0
  639. scitex/scholar/url_finder/translators/individual/human_rights_watch.py +0 -0
  640. scitex/scholar/url_finder/translators/individual/ibisworld.py +0 -0
  641. scitex/scholar/url_finder/translators/individual/idea_alm.py +0 -0
  642. scitex/scholar/url_finder/translators/individual/idref.py +0 -0
  643. scitex/scholar/url_finder/translators/individual/ieee_computer_society.py +0 -0
  644. scitex/scholar/url_finder/translators/individual/ieee_xplore.py +0 -0
  645. scitex/scholar/url_finder/translators/individual/ietf.py +0 -0
  646. scitex/scholar/url_finder/translators/individual/ign.py +0 -0
  647. scitex/scholar/url_finder/translators/individual/imdb.py +0 -0
  648. scitex/scholar/url_finder/translators/individual/imf.py +0 -0
  649. scitex/scholar/url_finder/translators/individual/in_these_times.py +0 -0
  650. scitex/scholar/url_finder/translators/individual/informationssystem_medienpaedagogik.py +0 -0
  651. scitex/scholar/url_finder/translators/individual/informit_database.py +0 -0
  652. scitex/scholar/url_finder/translators/individual/infotrac.py +0 -0
  653. scitex/scholar/url_finder/translators/individual/ingenta_connect.py +0 -0
  654. scitex/scholar/url_finder/translators/individual/ingentaconnect.py +0 -0
  655. scitex/scholar/url_finder/translators/individual/inside_higher_ed.py +0 -0
  656. scitex/scholar/url_finder/translators/individual/insignia_opac.py +0 -0
  657. scitex/scholar/url_finder/translators/individual/inspire.py +0 -0
  658. scitex/scholar/url_finder/translators/individual/institute_of_contemporary_art.py +0 -0
  659. scitex/scholar/url_finder/translators/individual/institute_of_physics.py +0 -0
  660. scitex/scholar/url_finder/translators/individual/integrum.py +0 -0
  661. scitex/scholar/url_finder/translators/individual/intellixir.py +0 -0
  662. scitex/scholar/url_finder/translators/individual/inter_research_science_center.py +0 -0
  663. scitex/scholar/url_finder/translators/individual/international_nuclear_information_system.py +0 -0
  664. scitex/scholar/url_finder/translators/individual/internet_archive.py +0 -0
  665. scitex/scholar/url_finder/translators/individual/internet_archive_scholar.py +0 -0
  666. scitex/scholar/url_finder/translators/individual/internet_archive_wayback.py +0 -0
  667. scitex/scholar/url_finder/translators/individual/internet_archive_wayback_machine.py +0 -0
  668. scitex/scholar/url_finder/translators/individual/invenio_rdm.py +0 -0
  669. scitex/scholar/url_finder/translators/individual/inveniordm.py +0 -0
  670. scitex/scholar/url_finder/translators/individual/io_port.py +0 -0
  671. scitex/scholar/url_finder/translators/individual/iop.py +0 -0
  672. scitex/scholar/url_finder/translators/individual/ipcc.py +0 -0
  673. scitex/scholar/url_finder/translators/individual/isidore.py +0 -0
  674. scitex/scholar/url_finder/translators/individual/istc.py +0 -0
  675. scitex/scholar/url_finder/translators/individual/j_stage.py +0 -0
  676. scitex/scholar/url_finder/translators/individual/jahrbuch.py +0 -0
  677. scitex/scholar/url_finder/translators/individual/japan_times_online.py +0 -0
  678. scitex/scholar/url_finder/translators/individual/jets.py +0 -0
  679. scitex/scholar/url_finder/translators/individual/jisc_historical_texts.py +0 -0
  680. scitex/scholar/url_finder/translators/individual/journal_of_electronic_publishing.py +0 -0
  681. scitex/scholar/url_finder/translators/individual/journal_of_extension.py +0 -0
  682. scitex/scholar/url_finder/translators/individual/journal_of_machine_learning_research.py +0 -0
  683. scitex/scholar/url_finder/translators/individual/journal_of_religion_and_society.py +0 -0
  684. scitex/scholar/url_finder/translators/individual/jrc_publications_repository.py +0 -0
  685. scitex/scholar/url_finder/translators/individual/jstage.py +0 -0
  686. scitex/scholar/url_finder/translators/individual/juricaf.py +0 -0
  687. scitex/scholar/url_finder/translators/individual/jurion.py +0 -0
  688. scitex/scholar/url_finder/translators/individual/juris.py +0 -0
  689. scitex/scholar/url_finder/translators/individual/jurpc.py +0 -0
  690. scitex/scholar/url_finder/translators/individual/k10plus_isbn.py +0 -0
  691. scitex/scholar/url_finder/translators/individual/kanopy.py +0 -0
  692. scitex/scholar/url_finder/translators/individual/karger.py +0 -0
  693. scitex/scholar/url_finder/translators/individual/khaama_press.py +0 -0
  694. scitex/scholar/url_finder/translators/individual/kitapyurdu_com.py +0 -0
  695. scitex/scholar/url_finder/translators/individual/kommersant.py +0 -0
  696. scitex/scholar/url_finder/translators/individual/korean_national_library.py +0 -0
  697. scitex/scholar/url_finder/translators/individual/kstudy.py +0 -0
  698. scitex/scholar/url_finder/translators/individual/l_annee_philologique.py +0 -0
  699. scitex/scholar/url_finder/translators/individual/la_croix.py +0 -0
  700. scitex/scholar/url_finder/translators/individual/la_nacion__argentina_.py +0 -0
  701. scitex/scholar/url_finder/translators/individual/la_presse.py +0 -0
  702. scitex/scholar/url_finder/translators/individual/la_republica__peru_.py +0 -0
  703. scitex/scholar/url_finder/translators/individual/la_times.py +0 -0
  704. scitex/scholar/url_finder/translators/individual/lagen_nu.py +0 -0
  705. scitex/scholar/url_finder/translators/individual/landesbibliographie_baden_wurttemberg.py +0 -0
  706. scitex/scholar/url_finder/translators/individual/lapham_s_quarterly.py +0 -0
  707. scitex/scholar/url_finder/translators/individual/le_devoir.py +0 -0
  708. scitex/scholar/url_finder/translators/individual/le_figaro.py +0 -0
  709. scitex/scholar/url_finder/translators/individual/le_maitron.py +0 -0
  710. scitex/scholar/url_finder/translators/individual/le_monde.py +0 -0
  711. scitex/scholar/url_finder/translators/individual/le_monde_diplomatique.py +0 -0
  712. scitex/scholar/url_finder/translators/individual/legifrance.py +0 -0
  713. scitex/scholar/url_finder/translators/individual/legislative_insight.py +0 -0
  714. scitex/scholar/url_finder/translators/individual/lexis_.py +0 -0
  715. scitex/scholar/url_finder/translators/individual/lexisnexis.py +0 -0
  716. scitex/scholar/url_finder/translators/individual/libraries_tasmania.py +0 -0
  717. scitex/scholar/url_finder/translators/individual/library_catalog__aleph_.py +0 -0
  718. scitex/scholar/url_finder/translators/individual/library_catalog__amicus_.py +0 -0
  719. scitex/scholar/url_finder/translators/individual/library_catalog__aquabrowser_.py +0 -0
  720. scitex/scholar/url_finder/translators/individual/library_catalog__bibliocommons_.py +0 -0
  721. scitex/scholar/url_finder/translators/individual/library_catalog__blacklight_.py +0 -0
  722. scitex/scholar/url_finder/translators/individual/library_catalog__capita_prism_.py +0 -0
  723. scitex/scholar/url_finder/translators/individual/library_catalog__dra_.py +0 -0
  724. scitex/scholar/url_finder/translators/individual/library_catalog__dynix_.py +0 -0
  725. scitex/scholar/url_finder/translators/individual/library_catalog__encore_.py +0 -0
  726. scitex/scholar/url_finder/translators/individual/library_catalog__innopac_.py +0 -0
  727. scitex/scholar/url_finder/translators/individual/library_catalog__koha_.py +0 -0
  728. scitex/scholar/url_finder/translators/individual/library_catalog__mango_.py +0 -0
  729. scitex/scholar/url_finder/translators/individual/library_catalog__opals_.py +0 -0
  730. scitex/scholar/url_finder/translators/individual/library_catalog__pica2_.py +0 -0
  731. scitex/scholar/url_finder/translators/individual/library_catalog__pica_.py +0 -0
  732. scitex/scholar/url_finder/translators/individual/library_catalog__pika_.py +0 -0
  733. scitex/scholar/url_finder/translators/individual/library_catalog__polaris_.py +0 -0
  734. scitex/scholar/url_finder/translators/individual/library_catalog__quolto_.py +0 -0
  735. scitex/scholar/url_finder/translators/individual/library_catalog__rero_ils_.py +0 -0
  736. scitex/scholar/url_finder/translators/individual/library_catalog__sirsi_.py +0 -0
  737. scitex/scholar/url_finder/translators/individual/library_catalog__sirsi_elibrary_.py +0 -0
  738. scitex/scholar/url_finder/translators/individual/library_catalog__slims_.py +0 -0
  739. scitex/scholar/url_finder/translators/individual/library_catalog__tind_ils_.py +0 -0
  740. scitex/scholar/url_finder/translators/individual/library_catalog__tinread_.py +0 -0
  741. scitex/scholar/url_finder/translators/individual/library_catalog__tlcyouseemore_.py +0 -0
  742. scitex/scholar/url_finder/translators/individual/library_catalog__visual_library_2021_.py +0 -0
  743. scitex/scholar/url_finder/translators/individual/library_catalog__voyager_.py +0 -0
  744. scitex/scholar/url_finder/translators/individual/library_catalog__voyager_7_.py +0 -0
  745. scitex/scholar/url_finder/translators/individual/library_catalog__vtls_.py +0 -0
  746. scitex/scholar/url_finder/translators/individual/library_genesis.py +0 -0
  747. scitex/scholar/url_finder/translators/individual/library_hub_discover.py +0 -0
  748. scitex/scholar/url_finder/translators/individual/library_of_congress_digital_collections.py +0 -0
  749. scitex/scholar/url_finder/translators/individual/library_of_congress_isbn.py +0 -0
  750. scitex/scholar/url_finder/translators/individual/libris_isbn.py +0 -0
  751. scitex/scholar/url_finder/translators/individual/lingbuzz.py +0 -0
  752. scitex/scholar/url_finder/translators/individual/lippincott_williams_and_wilkins.py +0 -0
  753. scitex/scholar/url_finder/translators/individual/literary_hub.py +0 -0
  754. scitex/scholar/url_finder/translators/individual/litres.py +0 -0
  755. scitex/scholar/url_finder/translators/individual/livejournal.py +0 -0
  756. scitex/scholar/url_finder/translators/individual/livivo.py +0 -0
  757. scitex/scholar/url_finder/translators/individual/london_review_of_books.py +0 -0
  758. scitex/scholar/url_finder/translators/individual/lookus.py +0 -0
  759. scitex/scholar/url_finder/translators/individual/lulu.py +0 -0
  760. scitex/scholar/url_finder/translators/individual/lwn_net.py +0 -0
  761. scitex/scholar/url_finder/translators/individual/lww.py +0 -0
  762. scitex/scholar/url_finder/translators/individual/mab2.py +0 -0
  763. scitex/scholar/url_finder/translators/individual/magazines_russ_ru.py +0 -0
  764. scitex/scholar/url_finder/translators/individual/mailman.py +0 -0
  765. scitex/scholar/url_finder/translators/individual/mainichi_daily_news.py +0 -0
  766. scitex/scholar/url_finder/translators/individual/marc.py +0 -0
  767. scitex/scholar/url_finder/translators/individual/marcxml.py +0 -0
  768. scitex/scholar/url_finder/translators/individual/mastodon.py +0 -0
  769. scitex/scholar/url_finder/translators/individual/matbugat_ru.py +0 -0
  770. scitex/scholar/url_finder/translators/individual/max_planck_institute_for_the_history_of_science_virtual_laboratory_library.py +0 -0
  771. scitex/scholar/url_finder/translators/individual/mcv.py +0 -0
  772. scitex/scholar/url_finder/translators/individual/mdpi.py +0 -0
  773. scitex/scholar/url_finder/translators/individual/mdpi_journals.py +0 -0
  774. scitex/scholar/url_finder/translators/individual/medes.py +0 -0
  775. scitex/scholar/url_finder/translators/individual/medium.py +0 -0
  776. scitex/scholar/url_finder/translators/individual/medline_nbib.py +0 -0
  777. scitex/scholar/url_finder/translators/individual/medlinenbib.py +0 -0
  778. scitex/scholar/url_finder/translators/individual/medra.py +0 -0
  779. scitex/scholar/url_finder/translators/individual/metalib.py +0 -0
  780. scitex/scholar/url_finder/translators/individual/mets.py +0 -0
  781. scitex/scholar/url_finder/translators/individual/microbiology_society_journals.py +0 -0
  782. scitex/scholar/url_finder/translators/individual/microsoft_academic.py +0 -0
  783. scitex/scholar/url_finder/translators/individual/midas_journals.py +0 -0
  784. scitex/scholar/url_finder/translators/individual/mikromarc.py +0 -0
  785. scitex/scholar/url_finder/translators/individual/milli_kutuphane.py +0 -0
  786. scitex/scholar/url_finder/translators/individual/mit_press_books.py +0 -0
  787. scitex/scholar/url_finder/translators/individual/mods.py +0 -0
  788. scitex/scholar/url_finder/translators/individual/mpg_pure.py +0 -0
  789. scitex/scholar/url_finder/translators/individual/musee_du_louvre.py +0 -0
  790. scitex/scholar/url_finder/translators/individual/nagoya_university_opac.py +0 -0
  791. scitex/scholar/url_finder/translators/individual/nasa_ads.py +0 -0
  792. scitex/scholar/url_finder/translators/individual/nasa_ntrs.py +0 -0
  793. scitex/scholar/url_finder/translators/individual/national_academies_press.py +0 -0
  794. scitex/scholar/url_finder/translators/individual/national_agriculture_library.py +0 -0
  795. scitex/scholar/url_finder/translators/individual/national_archives_of_australia.py +0 -0
  796. scitex/scholar/url_finder/translators/individual/national_archives_of_south_africa.py +0 -0
  797. scitex/scholar/url_finder/translators/individual/national_bureau_of_economic_research.py +0 -0
  798. scitex/scholar/url_finder/translators/individual/national_diet_library_catalogue.py +0 -0
  799. scitex/scholar/url_finder/translators/individual/national_gallery_of_art___usa.py +0 -0
  800. scitex/scholar/url_finder/translators/individual/national_gallery_of_australia.py +0 -0
  801. scitex/scholar/url_finder/translators/individual/national_library_of_australia__new_catalog_.py +0 -0
  802. scitex/scholar/url_finder/translators/individual/national_library_of_belarus.py +0 -0
  803. scitex/scholar/url_finder/translators/individual/national_library_of_norway.py +0 -0
  804. scitex/scholar/url_finder/translators/individual/national_library_of_poland_isbn.py +0 -0
  805. scitex/scholar/url_finder/translators/individual/national_post.py +0 -0
  806. scitex/scholar/url_finder/translators/individual/national_technical_reports_library.py +0 -0
  807. scitex/scholar/url_finder/translators/individual/national_transportation_library_rosa_p.py +0 -0
  808. scitex/scholar/url_finder/translators/individual/nature.py +0 -0
  809. scitex/scholar/url_finder/translators/individual/nber.py +0 -0
  810. scitex/scholar/url_finder/translators/individual/ncbi_nucleotide.py +0 -0
  811. scitex/scholar/url_finder/translators/individual/neural_information_processing_systems.py +0 -0
  812. scitex/scholar/url_finder/translators/individual/new_left_review.py +0 -0
  813. scitex/scholar/url_finder/translators/individual/new_zealand_herald.py +0 -0
  814. scitex/scholar/url_finder/translators/individual/newlines_magazine.py +0 -0
  815. scitex/scholar/url_finder/translators/individual/news_corp_australia.py +0 -0
  816. scitex/scholar/url_finder/translators/individual/newsbank.py +0 -0
  817. scitex/scholar/url_finder/translators/individual/newshub_co_nz.py +0 -0
  818. scitex/scholar/url_finder/translators/individual/newsnettamedia.py +0 -0
  819. scitex/scholar/url_finder/translators/individual/newspapers_com.py +0 -0
  820. scitex/scholar/url_finder/translators/individual/noor_digital_library.py +0 -0
  821. scitex/scholar/url_finder/translators/individual/note_html.py +0 -0
  822. scitex/scholar/url_finder/translators/individual/note_markdown.py +0 -0
  823. scitex/scholar/url_finder/translators/individual/notre_dame_philosophical_reviews.py +0 -0
  824. scitex/scholar/url_finder/translators/individual/npr.py +0 -0
  825. scitex/scholar/url_finder/translators/individual/nrc_nl.py +0 -0
  826. scitex/scholar/url_finder/translators/individual/nrc_research_press.py +0 -0
  827. scitex/scholar/url_finder/translators/individual/ntsb_accident_reports.py +0 -0
  828. scitex/scholar/url_finder/translators/individual/nypl_menus.py +0 -0
  829. scitex/scholar/url_finder/translators/individual/nypl_research_catalog.py +0 -0
  830. scitex/scholar/url_finder/translators/individual/nytimes_com.py +0 -0
  831. scitex/scholar/url_finder/translators/individual/nzz_ch.py +0 -0
  832. scitex/scholar/url_finder/translators/individual/oapen.py +0 -0
  833. scitex/scholar/url_finder/translators/individual/oclc_worldcat_firstsearch.py +0 -0
  834. scitex/scholar/url_finder/translators/individual/oecd.py +0 -0
  835. scitex/scholar/url_finder/translators/individual/oecd_ilibrary.py +0 -0
  836. scitex/scholar/url_finder/translators/individual/ohiolink.py +0 -0
  837. scitex/scholar/url_finder/translators/individual/open_conf.py +0 -0
  838. scitex/scholar/url_finder/translators/individual/open_knowledge_repository.py +0 -0
  839. scitex/scholar/url_finder/translators/individual/open_worldcat.py +0 -0
  840. scitex/scholar/url_finder/translators/individual/openalex.py +0 -0
  841. scitex/scholar/url_finder/translators/individual/openalex_json.py +0 -0
  842. scitex/scholar/url_finder/translators/individual/openedition_books.py +0 -0
  843. scitex/scholar/url_finder/translators/individual/openedition_journals.py +0 -0
  844. scitex/scholar/url_finder/translators/individual/openjur.py +0 -0
  845. scitex/scholar/url_finder/translators/individual/optical_society_of_america.py +0 -0
  846. scitex/scholar/url_finder/translators/individual/optimization_online.py +0 -0
  847. scitex/scholar/url_finder/translators/individual/orcid.py +0 -0
  848. scitex/scholar/url_finder/translators/individual/osa.py +0 -0
  849. scitex/scholar/url_finder/translators/individual/osf_preprints.py +0 -0
  850. scitex/scholar/url_finder/translators/individual/osti_energy_citations.py +0 -0
  851. scitex/scholar/url_finder/translators/individual/ovid.py +0 -0
  852. scitex/scholar/url_finder/translators/individual/ovid_tagged.py +0 -0
  853. scitex/scholar/url_finder/translators/individual/oxford.py +0 -0
  854. scitex/scholar/url_finder/translators/individual/oxford_dictionaries_premium.py +0 -0
  855. scitex/scholar/url_finder/translators/individual/oxford_english_dictionary.py +0 -0
  856. scitex/scholar/url_finder/translators/individual/oxford_music_and_art_online.py +0 -0
  857. scitex/scholar/url_finder/translators/individual/oxford_reference.py +0 -0
  858. scitex/scholar/url_finder/translators/individual/oxford_university_press.py +0 -0
  859. scitex/scholar/url_finder/translators/individual/ozon_ru.py +0 -0
  860. scitex/scholar/url_finder/translators/individual/pajhwok_afghan_news.py +0 -0
  861. scitex/scholar/url_finder/translators/individual/papers_past.py +0 -0
  862. scitex/scholar/url_finder/translators/individual/paris_review.py +0 -0
  863. scitex/scholar/url_finder/translators/individual/pastebin.py +0 -0
  864. scitex/scholar/url_finder/translators/individual/patents___uspto.py +0 -0
  865. scitex/scholar/url_finder/translators/individual/pc_gamer.py +0 -0
  866. scitex/scholar/url_finder/translators/individual/pc_games.py +0 -0
  867. scitex/scholar/url_finder/translators/individual/peeters.py +0 -0
  868. scitex/scholar/url_finder/translators/individual/pei_archival_information_network.py +0 -0
  869. scitex/scholar/url_finder/translators/individual/pep_web.py +0 -0
  870. scitex/scholar/url_finder/translators/individual/perceiving_systems.py +0 -0
  871. scitex/scholar/url_finder/translators/individual/perlego.py +0 -0
  872. scitex/scholar/url_finder/translators/individual/philosopher_s_imprint.py +0 -0
  873. scitex/scholar/url_finder/translators/individual/philpapers.py +0 -0
  874. scitex/scholar/url_finder/translators/individual/pkp_catalog_systems.py +0 -0
  875. scitex/scholar/url_finder/translators/individual/pleade.py +0 -0
  876. scitex/scholar/url_finder/translators/individual/plos.py +0 -0
  877. scitex/scholar/url_finder/translators/individual/plos_journals.py +0 -0
  878. scitex/scholar/url_finder/translators/individual/pnas.py +0 -0
  879. scitex/scholar/url_finder/translators/individual/polygon.py +0 -0
  880. scitex/scholar/url_finder/translators/individual/potsdamer_neueste_nachrichten.py +0 -0
  881. scitex/scholar/url_finder/translators/individual/prc_history_review.py +0 -0
  882. scitex/scholar/url_finder/translators/individual/preprints_org.py +0 -0
  883. scitex/scholar/url_finder/translators/individual/primo.py +0 -0
  884. scitex/scholar/url_finder/translators/individual/primo_2018.py +0 -0
  885. scitex/scholar/url_finder/translators/individual/primo_normalized_xml.py +0 -0
  886. scitex/scholar/url_finder/translators/individual/probing_the_past.py +0 -0
  887. scitex/scholar/url_finder/translators/individual/project_gutenberg.py +0 -0
  888. scitex/scholar/url_finder/translators/individual/project_muse.py +0 -0
  889. scitex/scholar/url_finder/translators/individual/promed.py +0 -0
  890. scitex/scholar/url_finder/translators/individual/proquest.py +0 -0
  891. scitex/scholar/url_finder/translators/individual/proquest_ebook_central.py +0 -0
  892. scitex/scholar/url_finder/translators/individual/proquest_policyfile.py +0 -0
  893. scitex/scholar/url_finder/translators/individual/protein_data_bank.py +0 -0
  894. scitex/scholar/url_finder/translators/individual/pubfactory_journals.py +0 -0
  895. scitex/scholar/url_finder/translators/individual/public_record_office_victoria.py +0 -0
  896. scitex/scholar/url_finder/translators/individual/publications_du_quebec.py +0 -0
  897. scitex/scholar/url_finder/translators/individual/publications_office_of_the_european_union.py +0 -0
  898. scitex/scholar/url_finder/translators/individual/pubmed.py +0 -0
  899. scitex/scholar/url_finder/translators/individual/pubmed_central.py +0 -0
  900. scitex/scholar/url_finder/translators/individual/pubmed_xml.py +0 -0
  901. scitex/scholar/url_finder/translators/individual/pubpub.py +0 -0
  902. scitex/scholar/url_finder/translators/individual/pypi.py +0 -0
  903. scitex/scholar/url_finder/translators/individual/qatar_digital_library.py +0 -0
  904. scitex/scholar/url_finder/translators/individual/queensland_state_archives.py +0 -0
  905. scitex/scholar/url_finder/translators/individual/r_packages.py +0 -0
  906. scitex/scholar/url_finder/translators/individual/radio_free_europe__radio_liberty.py +0 -0
  907. scitex/scholar/url_finder/translators/individual/rand.py +0 -0
  908. scitex/scholar/url_finder/translators/individual/rdf.py +0 -0
  909. scitex/scholar/url_finder/translators/individual/rechtspraak_nl.py +0 -0
  910. scitex/scholar/url_finder/translators/individual/redalyc.py +0 -0
  911. scitex/scholar/url_finder/translators/individual/reddit.py +0 -0
  912. scitex/scholar/url_finder/translators/individual/referbibix.py +0 -0
  913. scitex/scholar/url_finder/translators/individual/refworks_tagged.py +0 -0
  914. scitex/scholar/url_finder/translators/individual/regeringskansliet.py +0 -0
  915. scitex/scholar/url_finder/translators/individual/repec___econpapers.py +0 -0
  916. scitex/scholar/url_finder/translators/individual/repec___ideas.py +0 -0
  917. scitex/scholar/url_finder/translators/individual/repec_ideas.py +0 -0
  918. scitex/scholar/url_finder/translators/individual/research_square.py +0 -0
  919. scitex/scholar/url_finder/translators/individual/researchgate.py +0 -0
  920. scitex/scholar/url_finder/translators/individual/retsinformation.py +0 -0
  921. scitex/scholar/url_finder/translators/individual/reuters.py +0 -0
  922. scitex/scholar/url_finder/translators/individual/ris.py +0 -0
  923. scitex/scholar/url_finder/translators/individual/rock__paper__shotgun.py +0 -0
  924. scitex/scholar/url_finder/translators/individual/roll_call.py +0 -0
  925. scitex/scholar/url_finder/translators/individual/rsc.py +0 -0
  926. scitex/scholar/url_finder/translators/individual/rsc_publishing.py +0 -0
  927. scitex/scholar/url_finder/translators/individual/russian_state_library.py +0 -0
  928. scitex/scholar/url_finder/translators/individual/sacramento_bee.py +0 -0
  929. scitex/scholar/url_finder/translators/individual/sae_papers.py +0 -0
  930. scitex/scholar/url_finder/translators/individual/safari_books_online.py +0 -0
  931. scitex/scholar/url_finder/translators/individual/sage.py +0 -0
  932. scitex/scholar/url_finder/translators/individual/sage_journals.py +0 -0
  933. scitex/scholar/url_finder/translators/individual/sage_knowledge.py +0 -0
  934. scitex/scholar/url_finder/translators/individual/saildart.py +0 -0
  935. scitex/scholar/url_finder/translators/individual/salt_research_archives.py +0 -0
  936. scitex/scholar/url_finder/translators/individual/sbn_it.py +0 -0
  937. scitex/scholar/url_finder/translators/individual/scholars_portal_journals.py +0 -0
  938. scitex/scholar/url_finder/translators/individual/scholia.py +0 -0
  939. scitex/scholar/url_finder/translators/individual/schweizer_radio_und_fernsehen_srf.py +0 -0
  940. scitex/scholar/url_finder/translators/individual/scielo.py +0 -0
  941. scitex/scholar/url_finder/translators/individual/sciencedirect.py +0 -0
  942. scitex/scholar/url_finder/translators/individual/scinapse.py +0 -0
  943. scitex/scholar/url_finder/translators/individual/scopus.py +0 -0
  944. scitex/scholar/url_finder/translators/individual/semantic_scholar.py +0 -0
  945. scitex/scholar/url_finder/translators/individual/semantics_visual_library.py +0 -0
  946. scitex/scholar/url_finder/translators/individual/sfu_ipinch.py +0 -0
  947. scitex/scholar/url_finder/translators/individual/silverchair.py +0 -0
  948. scitex/scholar/url_finder/translators/individual/sipri.py +0 -0
  949. scitex/scholar/url_finder/translators/individual/sirs_knowledge_source.py +0 -0
  950. scitex/scholar/url_finder/translators/individual/slate.py +0 -0
  951. scitex/scholar/url_finder/translators/individual/slideshare.py +0 -0
  952. scitex/scholar/url_finder/translators/individual/slub_dresden.py +0 -0
  953. scitex/scholar/url_finder/translators/individual/sora.py +0 -0
  954. scitex/scholar/url_finder/translators/individual/springer.py +0 -0
  955. scitex/scholar/url_finder/translators/individual/springer_link.py +0 -0
  956. scitex/scholar/url_finder/translators/individual/ssoar.py +0 -0
  957. scitex/scholar/url_finder/translators/individual/stack_exchange.py +0 -0
  958. scitex/scholar/url_finder/translators/individual/standard_ebooks.py +0 -0
  959. scitex/scholar/url_finder/translators/individual/stanford_encyclopedia_of_philosophy.py +0 -0
  960. scitex/scholar/url_finder/translators/individual/stanford_university_press.py +0 -0
  961. scitex/scholar/url_finder/translators/individual/state_records_office_of_western_australia.py +0 -0
  962. scitex/scholar/url_finder/translators/individual/state_records_office_wa.py +0 -0
  963. scitex/scholar/url_finder/translators/individual/stitcher.py +0 -0
  964. scitex/scholar/url_finder/translators/individual/store_norske_leksikon.py +0 -0
  965. scitex/scholar/url_finder/translators/individual/stuff_co_nz.py +0 -0
  966. scitex/scholar/url_finder/translators/individual/substack.py +0 -0
  967. scitex/scholar/url_finder/translators/individual/sud_ouest.py +0 -0
  968. scitex/scholar/url_finder/translators/individual/sueddeutsche_de.py +0 -0
  969. scitex/scholar/url_finder/translators/individual/summon_2.py +0 -0
  970. scitex/scholar/url_finder/translators/individual/superlib.py +0 -0
  971. scitex/scholar/url_finder/translators/individual/svenska_dagbladet.py +0 -0
  972. scitex/scholar/url_finder/translators/individual/sveriges_radio.py +0 -0
  973. scitex/scholar/url_finder/translators/individual/svt_nyheter.py +0 -0
  974. scitex/scholar/url_finder/translators/individual/tagesspiegel.py +0 -0
  975. scitex/scholar/url_finder/translators/individual/talis_aspire.py +0 -0
  976. scitex/scholar/url_finder/translators/individual/talisprism.py +0 -0
  977. scitex/scholar/url_finder/translators/individual/tatknigafund.py +0 -0
  978. scitex/scholar/url_finder/translators/individual/tatpressa_ru.py +0 -0
  979. scitex/scholar/url_finder/translators/individual/taylor___francis_ebooks.py +0 -0
  980. scitex/scholar/url_finder/translators/individual/taylor_and_francis_nejm.py +0 -0
  981. scitex/scholar/url_finder/translators/individual/taylor_francis.py +0 -0
  982. scitex/scholar/url_finder/translators/individual/taylor_francis_nejm.py +0 -0
  983. scitex/scholar/url_finder/translators/individual/taz_de.py +0 -0
  984. scitex/scholar/url_finder/translators/individual/tei.py +0 -0
  985. scitex/scholar/url_finder/translators/individual/tesis_doctorals_en_xarxa.py +0 -0
  986. scitex/scholar/url_finder/translators/individual/the_art_newspaper.py +0 -0
  987. scitex/scholar/url_finder/translators/individual/the_atlantic.py +0 -0
  988. scitex/scholar/url_finder/translators/individual/the_boston_globe.py +0 -0
  989. scitex/scholar/url_finder/translators/individual/the_chronicle_of_higher_education.py +0 -0
  990. scitex/scholar/url_finder/translators/individual/the_daily_beast.py +0 -0
  991. scitex/scholar/url_finder/translators/individual/the_economic_times___the_times_of_india.py +0 -0
  992. scitex/scholar/url_finder/translators/individual/the_economist.py +0 -0
  993. scitex/scholar/url_finder/translators/individual/the_free_dictionary.py +0 -0
  994. scitex/scholar/url_finder/translators/individual/the_globe_and_mail.py +0 -0
  995. scitex/scholar/url_finder/translators/individual/the_guardian.py +0 -0
  996. scitex/scholar/url_finder/translators/individual/the_hamilton_spectator.py +0 -0
  997. scitex/scholar/url_finder/translators/individual/the_hindu.py +0 -0
  998. scitex/scholar/url_finder/translators/individual/the_independent.py +0 -0
  999. scitex/scholar/url_finder/translators/individual/the_intercept.py +0 -0
  1000. scitex/scholar/url_finder/translators/individual/the_met.py +0 -0
  1001. scitex/scholar/url_finder/translators/individual/the_microfinance_gateway.py +0 -0
  1002. scitex/scholar/url_finder/translators/individual/the_nation.py +0 -0
  1003. scitex/scholar/url_finder/translators/individual/the_national_archives__uk_.py +0 -0
  1004. scitex/scholar/url_finder/translators/individual/the_new_republic.py +0 -0
  1005. scitex/scholar/url_finder/translators/individual/the_new_york_review_of_books.py +0 -0
  1006. scitex/scholar/url_finder/translators/individual/the_new_yorker.py +0 -0
  1007. scitex/scholar/url_finder/translators/individual/the_open_library.py +0 -0
  1008. scitex/scholar/url_finder/translators/individual/the_straits_times.py +0 -0
  1009. scitex/scholar/url_finder/translators/individual/the_telegraph.py +0 -0
  1010. scitex/scholar/url_finder/translators/individual/the_times_and_sunday_times.py +0 -0
  1011. scitex/scholar/url_finder/translators/individual/the_times_of_israel.py +0 -0
  1012. scitex/scholar/url_finder/translators/individual/themarker.py +0 -0
  1013. scitex/scholar/url_finder/translators/individual/theory_of_computing.py +0 -0
  1014. scitex/scholar/url_finder/translators/individual/thesesfr.py +0 -0
  1015. scitex/scholar/url_finder/translators/individual/thieme.py +0 -0
  1016. scitex/scholar/url_finder/translators/individual/time_com.py +0 -0
  1017. scitex/scholar/url_finder/translators/individual/timesmachine.py +0 -0
  1018. scitex/scholar/url_finder/translators/individual/tony_blair_institute.py +0 -0
  1019. scitex/scholar/url_finder/translators/individual/tony_blair_institute_for_global_change.py +0 -0
  1020. scitex/scholar/url_finder/translators/individual/toronto_star.py +0 -0
  1021. scitex/scholar/url_finder/translators/individual/transportation_research_board.py +0 -0
  1022. scitex/scholar/url_finder/translators/individual/treesearch.py +0 -0
  1023. scitex/scholar/url_finder/translators/individual/trove.py +0 -0
  1024. scitex/scholar/url_finder/translators/individual/tumblr.py +0 -0
  1025. scitex/scholar/url_finder/translators/individual/tv_by_the_numbers.py +0 -0
  1026. scitex/scholar/url_finder/translators/individual/tvnz.py +0 -0
  1027. scitex/scholar/url_finder/translators/individual/twitter.py +0 -0
  1028. scitex/scholar/url_finder/translators/individual/ubiquity_journals.py +0 -0
  1029. scitex/scholar/url_finder/translators/individual/uchicago_vufind.py +0 -0
  1030. scitex/scholar/url_finder/translators/individual/unapi.py +0 -0
  1031. scitex/scholar/url_finder/translators/individual/unesco.py +0 -0
  1032. scitex/scholar/url_finder/translators/individual/university_of_california_press_books.py +0 -0
  1033. scitex/scholar/url_finder/translators/individual/university_of_chicago_press_books.py +0 -0
  1034. scitex/scholar/url_finder/translators/individual/university_of_wisconsin_madison_libraries_catalog.py +0 -0
  1035. scitex/scholar/url_finder/translators/individual/university_press_scholarship.py +0 -0
  1036. scitex/scholar/url_finder/translators/individual/unqualified_dublin_core_rdf.py +0 -0
  1037. scitex/scholar/url_finder/translators/individual/unz_print_archive.py +0 -0
  1038. scitex/scholar/url_finder/translators/individual/upcommons.py +0 -0
  1039. scitex/scholar/url_finder/translators/individual/uptodate_references.py +0 -0
  1040. scitex/scholar/url_finder/translators/individual/us_national_archives_research_catalog.py +0 -0
  1041. scitex/scholar/url_finder/translators/individual/usenix.py +0 -0
  1042. scitex/scholar/url_finder/translators/individual/vanity_fair.py +0 -0
  1043. scitex/scholar/url_finder/translators/individual/verniana.py +0 -0
  1044. scitex/scholar/url_finder/translators/individual/verniana_jules_verne_studies.py +0 -0
  1045. scitex/scholar/url_finder/translators/individual/verso_books.py +0 -0
  1046. scitex/scholar/url_finder/translators/individual/vice.py +0 -0
  1047. scitex/scholar/url_finder/translators/individual/victoria___albert_museum.py +0 -0
  1048. scitex/scholar/url_finder/translators/individual/vimeo.py +0 -0
  1049. scitex/scholar/url_finder/translators/individual/vlex.py +0 -0
  1050. scitex/scholar/url_finder/translators/individual/voxeu.py +0 -0
  1051. scitex/scholar/url_finder/translators/individual/wall_street_journal.py +0 -0
  1052. scitex/scholar/url_finder/translators/individual/wanfang_data.py +0 -0
  1053. scitex/scholar/url_finder/translators/individual/washington_monthly.py +0 -0
  1054. scitex/scholar/url_finder/translators/individual/washington_post.py +0 -0
  1055. scitex/scholar/url_finder/translators/individual/web_of_science.py +0 -0
  1056. scitex/scholar/url_finder/translators/individual/web_of_science_nextgen.py +0 -0
  1057. scitex/scholar/url_finder/translators/individual/web_of_science_tagged.py +0 -0
  1058. scitex/scholar/url_finder/translators/individual/welt_online.py +0 -0
  1059. scitex/scholar/url_finder/translators/individual/westlaw_uk.py +0 -0
  1060. scitex/scholar/url_finder/translators/individual/who.py +0 -0
  1061. scitex/scholar/url_finder/translators/individual/wikidata.py +0 -0
  1062. scitex/scholar/url_finder/translators/individual/wikidata_quickstatements.py +0 -0
  1063. scitex/scholar/url_finder/translators/individual/wikileaks_plusd.py +0 -0
  1064. scitex/scholar/url_finder/translators/individual/wikimedia_commons.py +0 -0
  1065. scitex/scholar/url_finder/translators/individual/wikipedia.py +0 -0
  1066. scitex/scholar/url_finder/translators/individual/wikipedia_citation_templates.py +0 -0
  1067. scitex/scholar/url_finder/translators/individual/wikisource.py +0 -0
  1068. scitex/scholar/url_finder/translators/individual/wikiwand.py +0 -0
  1069. scitex/scholar/url_finder/translators/individual/wiktionary.py +0 -0
  1070. scitex/scholar/url_finder/translators/individual/wildlife_biology_in_practice.py +0 -0
  1071. scitex/scholar/url_finder/translators/individual/wiley.py +0 -0
  1072. scitex/scholar/url_finder/translators/individual/wiley_online_library.py +0 -0
  1073. scitex/scholar/url_finder/translators/individual/wilson_center_digital_archive.py +0 -0
  1074. scitex/scholar/url_finder/translators/individual/winnipeg_free_press.py +0 -0
  1075. scitex/scholar/url_finder/translators/individual/wipo.py +0 -0
  1076. scitex/scholar/url_finder/translators/individual/wired.py +0 -0
  1077. scitex/scholar/url_finder/translators/individual/wiso.py +0 -0
  1078. scitex/scholar/url_finder/translators/individual/womennews.py +0 -0
  1079. scitex/scholar/url_finder/translators/individual/world_bank.py +0 -0
  1080. scitex/scholar/url_finder/translators/individual/world_digital_library.py +0 -0
  1081. scitex/scholar/url_finder/translators/individual/world_history_connected.py +0 -0
  1082. scitex/scholar/url_finder/translators/individual/world_shakespeare_bibliography_online.py +0 -0
  1083. scitex/scholar/url_finder/translators/individual/worldcat_discovery_service.py +0 -0
  1084. scitex/scholar/url_finder/translators/individual/xml_contextobject.py +0 -0
  1085. scitex/scholar/url_finder/translators/individual/yandex_books.py +0 -0
  1086. scitex/scholar/url_finder/translators/individual/ynet.py +0 -0
  1087. scitex/scholar/url_finder/translators/individual/youtube.py +0 -0
  1088. scitex/scholar/url_finder/translators/individual/ypfs.py +0 -0
  1089. scitex/scholar/url_finder/translators/individual/ypsf.py +0 -0
  1090. scitex/scholar/url_finder/translators/individual/zbmath.py +0 -0
  1091. scitex/scholar/url_finder/translators/individual/zenodo.py +0 -0
  1092. scitex/scholar/url_finder/translators/individual/ziponline.py +0 -0
  1093. scitex/scholar/url_finder/translators/individual/zobodat.py +0 -0
  1094. scitex/scholar/url_finder/translators/individual/zotero_org.py +0 -0
  1095. scitex/scholar/url_finder/translators/individual/zotero_rdf.py +0 -0
  1096. scitex/scholar/url_finder/translators/individual/zoterobib.py +0 -0
  1097. scitex/scholar/utils/__init__.py +3 -0
  1098. scitex/scholar/utils/bibtex/__init__.py +0 -0
  1099. scitex/scholar/utils/cleanup/__init__.py +0 -0
  1100. scitex/scholar/utils/text/_TextNormalizer.py +0 -0
  1101. scitex/scholar/utils/text/__init__.py +0 -0
  1102. scitex/scholar/utils/validation/DOIValidator.py +289 -0
  1103. scitex/scholar/utils/validation/README.md +169 -0
  1104. scitex/scholar/utils/validation/__init__.py +13 -0
  1105. scitex/scholar/utils/validation/validate_library_dois.py +221 -0
  1106. scitex/scholar/zotero/__init__.py +0 -0
  1107. scitex/security/README.md +255 -0
  1108. scitex/security/__init__.py +35 -0
  1109. scitex/security/cli.py +140 -0
  1110. scitex/security/github.py +358 -0
  1111. scitex/session/README.md +95 -30
  1112. scitex/session/__init__.py +8 -3
  1113. scitex/session/_decorator.py +610 -0
  1114. scitex/session/_lifecycle.py +155 -62
  1115. scitex/session/_manager.py +0 -0
  1116. scitex/session/template.py +16 -110
  1117. scitex/sh/README.md +1 -1
  1118. scitex/sh/__init__.py +0 -0
  1119. scitex/stats/__init__.py +5 -3
  1120. scitex/stats/correct/_correct_bonferroni.py +3 -3
  1121. scitex/stats/correct/_correct_fdr.py +62 -62
  1122. scitex/stats/correct/_correct_fdr_.py +634 -0
  1123. scitex/stats/correct/_correct_holm.py +2 -2
  1124. scitex/stats/correct/_correct_sidak.py +2 -2
  1125. scitex/stats/descriptive/_circular.py +2 -2
  1126. scitex/stats/descriptive/_describe.py +2 -2
  1127. scitex/stats/descriptive/_nan.py +2 -2
  1128. scitex/stats/descriptive/_real.py +2 -2
  1129. scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
  1130. scitex/stats/effect_sizes/_cohens_d.py +1 -1
  1131. scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
  1132. scitex/stats/effect_sizes/_eta_squared.py +1 -1
  1133. scitex/stats/effect_sizes/_prob_superiority.py +1 -1
  1134. scitex/stats/posthoc/_dunnett.py +3 -3
  1135. scitex/stats/posthoc/_games_howell.py +3 -3
  1136. scitex/stats/posthoc/_tukey_hsd.py +3 -3
  1137. scitex/stats/power/_power.py +1 -1
  1138. scitex/stats/utils/_effect_size.py +1 -1
  1139. scitex/stats/utils/_formatters.py +1 -1
  1140. scitex/stats/utils/_normalizers.py +8 -5
  1141. scitex/stats/utils/_power.py +1 -1
  1142. scitex/str/_parse.py +1 -1
  1143. scitex/str/_replace.py +1 -1
  1144. scitex/template/_clone_project.py +58 -41
  1145. scitex/template/_copy.py +22 -15
  1146. scitex/template/_customize.py +9 -4
  1147. scitex/template/_git_strategy.py +32 -32
  1148. scitex/template/_logging_helpers.py +122 -0
  1149. scitex/template/clone_pip_project.py +24 -17
  1150. scitex/template/clone_research.py +26 -21
  1151. scitex/template/clone_singularity.py +25 -22
  1152. scitex/template/clone_writer_directory.py +24 -17
  1153. scitex/tex/_preview.py +2 -2
  1154. scitex/tex/_to_vec.py +1 -1
  1155. scitex/utils/_email.py +1 -1
  1156. scitex/utils/_verify_scitex_format.py +2 -2
  1157. scitex/utils/template.py +1 -1
  1158. scitex/vis/DJANGO_INTEGRATION.md +677 -0
  1159. scitex/vis/README.md +755 -0
  1160. scitex/vis/__init__.py +111 -0
  1161. scitex/vis/backend/__init__.py +56 -0
  1162. scitex/vis/backend/export.py +166 -0
  1163. scitex/vis/backend/parser.py +190 -0
  1164. scitex/vis/backend/render.py +385 -0
  1165. scitex/vis/io/__init__.py +36 -0
  1166. scitex/vis/io/load.py +168 -0
  1167. scitex/vis/io/save.py +131 -0
  1168. scitex/vis/model/__init__.py +118 -0
  1169. scitex/vis/model/annotations.py +118 -0
  1170. scitex/vis/model/axes.py +153 -0
  1171. scitex/vis/model/figure.py +139 -0
  1172. scitex/vis/model/guides.py +105 -0
  1173. scitex/vis/model/plot.py +126 -0
  1174. scitex/vis/model/plot_types.py +682 -0
  1175. scitex/vis/model/styles.py +246 -0
  1176. scitex/vis/tmp.txt +239 -0
  1177. scitex/vis/utils/__init__.py +75 -0
  1178. scitex/vis/utils/defaults.py +335 -0
  1179. scitex/vis/utils/validate.py +204 -0
  1180. scitex/web/__init__.py +4 -0
  1181. scitex/web/_scraping.py +373 -0
  1182. scitex/writer/README.md +11 -2
  1183. scitex/writer/Writer.py +75 -15
  1184. scitex/writer/_clone_writer_project.py +41 -28
  1185. scitex/writer/_compile/__init__.py +9 -67
  1186. scitex/writer/_compile/_parser.py +0 -0
  1187. scitex/writer/_compile/_runner.py +249 -28
  1188. scitex/writer/_compile/_validator.py +0 -0
  1189. scitex/writer/_compile/manuscript.py +109 -0
  1190. scitex/writer/_compile/revision.py +81 -0
  1191. scitex/writer/_compile/supplementary.py +99 -0
  1192. scitex/writer/_project/__init__.py +0 -0
  1193. scitex/writer/_project/_create.py +10 -12
  1194. scitex/writer/_project/_trees.py +0 -0
  1195. scitex/writer/_project/_validate.py +1 -1
  1196. scitex/writer/_validate_tree_structures.py +4 -4
  1197. scitex/writer/dataclasses/__init__.py +0 -0
  1198. scitex/writer/dataclasses/config/_WriterConfig.py +3 -3
  1199. scitex/writer/dataclasses/config/__init__.py +0 -0
  1200. scitex/writer/dataclasses/contents/_ManuscriptContents.py +4 -3
  1201. scitex/writer/dataclasses/contents/_RevisionContents.py +9 -5
  1202. scitex/writer/dataclasses/contents/_SupplementaryContents.py +7 -4
  1203. scitex/writer/dataclasses/contents/__init__.py +0 -0
  1204. scitex/writer/dataclasses/core/_Document.py +1 -1
  1205. scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
  1206. scitex/writer/dataclasses/core/__init__.py +0 -0
  1207. scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
  1208. scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
  1209. scitex/writer/dataclasses/results/_SaveSectionsResponse.py +107 -0
  1210. scitex/writer/dataclasses/results/_SectionReadResponse.py +117 -0
  1211. scitex/writer/dataclasses/results/__init__.py +4 -0
  1212. scitex/writer/dataclasses/tree/_ConfigTree.py +3 -2
  1213. scitex/writer/dataclasses/tree/_ManuscriptTree.py +5 -3
  1214. scitex/writer/dataclasses/tree/_RevisionTree.py +7 -4
  1215. scitex/writer/dataclasses/tree/_ScriptsTree.py +5 -3
  1216. scitex/writer/dataclasses/tree/_SharedTree.py +5 -4
  1217. scitex/writer/dataclasses/tree/_SupplementaryTree.py +7 -4
  1218. scitex/writer/dataclasses/tree/__init__.py +0 -0
  1219. scitex/writer/tests/__init__.py +0 -0
  1220. scitex/writer/utils/.legacy_git_retry.py +1 -1
  1221. scitex/writer/utils/__init__.py +0 -0
  1222. scitex/writer/utils/_parse_latex_logs.py +1 -1
  1223. scitex/writer/utils/_parse_script_args.py +0 -0
  1224. scitex/writer/utils/_watch.py +0 -0
  1225. {scitex-2.1.2.dist-info → scitex-2.3.0.dist-info}/METADATA +372 -363
  1226. {scitex-2.1.2.dist-info → scitex-2.3.0.dist-info}/RECORD +299 -329
  1227. scitex-2.3.0.dist-info/licenses/LICENSE +661 -0
  1228. scitex/.claude/mcp-config.json +0 -42
  1229. scitex/_sh.py +0 -18
  1230. scitex/ai/training/legacy/early_stopping.py +0 -150
  1231. scitex/ai/training/legacy/learning_curve_logger.py +0 -557
  1232. scitex/ai/viewed-ai.md +0 -4984
  1233. scitex/browser/ARCHITECTURE_PROPOSAL.md +0 -795
  1234. scitex/browser/INTERACTIVE_COLLABORATION.md +0 -782
  1235. scitex/browser/SAFE_IMPLEMENTATION_PLAN.md +0 -363
  1236. scitex/browser/SHARED_BROWSER_SESSION.md +0 -652
  1237. scitex/browser/TODO.md +0 -11
  1238. scitex/browser/collaboration/CLIENTSERVER_ARCHITECTURE.md +0 -165
  1239. scitex/browser/collaboration/INTERACTION_STRATEGY.md +0 -547
  1240. scitex/browser/collaboration/NON_INTERFERING_LOGIC.md +0 -730
  1241. scitex/browser/template.py +0 -122
  1242. scitex/db/legacy/_inspect_v02.py +0 -171
  1243. scitex/db/legacy/_inspect_v03-not-optimized.py +0 -179
  1244. scitex/db/legacy/_inspect_v04-working-but-printing-both-scheme-and-first-row.py +0 -337
  1245. scitex/db/legacy/_inspect_v05-working-but-no-clear-separation-between-dtype-and-actual-values.py +0 -358
  1246. scitex/dict/_DotDict_v01-not-handling-recursive-instantiations.py +0 -442
  1247. scitex/dict/_DotDict_v02-not-serializing-Path-object.py +0 -446
  1248. scitex/plt/KNOWN_ISSUES.md +0 -68
  1249. scitex/plt/TODO.md +0 -7
  1250. scitex/project/DESIGN.md +0 -423
  1251. scitex/project/DJANGO_INTEGRATION.md +0 -546
  1252. scitex/project/NAMING.md +0 -251
  1253. scitex/project/README.md +0 -441
  1254. scitex/project/__init__.py +0 -80
  1255. scitex/project/core.py +0 -466
  1256. scitex/project/metadata.py +0 -345
  1257. scitex/project/storage.py +0 -321
  1258. scitex/project/validators.py +0 -296
  1259. scitex/reproduce/_hash_array.py +0 -22
  1260. scitex/rng/_RandomStateManager_v01-no-verbose-options.py +0 -414
  1261. scitex/scholar/.claude/agents/ArchitectAgent.md +0 -50
  1262. scitex/scholar/.claude/agents/BulletinBoardOrganizerAgent.md +0 -24
  1263. scitex/scholar/.claude/agents/DebuggerAgent.md +0 -38
  1264. scitex/scholar/.claude/agents/ExamplesDeveloperAgent.md +0 -49
  1265. scitex/scholar/.claude/agents/ExperimentationAgent.md +0 -13
  1266. scitex/scholar/.claude/agents/GitHandlerAgent.md +0 -38
  1267. scitex/scholar/.claude/agents/ResearcherAgent.md +0 -35
  1268. scitex/scholar/.claude/agents/ReviewerAgent.md +0 -70
  1269. scitex/scholar/.claude/agents/SciTeXTranslatorAgent.md +0 -55
  1270. scitex/scholar/.claude/agents/SourceDeveloperAgent.md +0 -48
  1271. scitex/scholar/.claude/agents/TestDeveloperAgent.md +0 -48
  1272. scitex/scholar/.claude/agents/TestResultsReportAgent.md +0 -52
  1273. scitex/scholar/.claude/agents/TestRunnerAgent.md +0 -48
  1274. scitex/scholar/.claude/mcp-config.json +0 -42
  1275. scitex/scholar/.legacy/metadata/doi/utils/legacy/_ConfigurationResolver.py +0 -387
  1276. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_MultiInstitutionalResolver.py +0 -397
  1277. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_OpenURLResolverWithZenRows.py +0 -718
  1278. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_ResumableOpenURLResolver.py +0 -298
  1279. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_UnimelbLibraryGoButtonSelector.py +0 -466
  1280. scitex/scholar/.legacy/metadata/urls/.tmp/open_url/legacy/_ZenRowsOpenURLResolver.py +0 -372
  1281. scitex/scholar/docs/to_claude/guidelines/.claude/mcp-config.json +0 -0
  1282. scitex/scholar/docs/to_claude/guidelines/.claude/settings.json +0 -231
  1283. scitex/scholar/url_finder/.tmp/open_url/legacy/_MultiInstitutionalResolver.py +0 -397
  1284. scitex/scholar/url_finder/.tmp/open_url/legacy/_OpenURLResolverWithZenRows.py +0 -718
  1285. scitex/scholar/url_finder/.tmp/open_url/legacy/_ResumableOpenURLResolver.py +0 -298
  1286. scitex/scholar/url_finder/.tmp/open_url/legacy/_UnimelbLibraryGoButtonSelector.py +0 -466
  1287. scitex/scholar/url_finder/.tmp/open_url/legacy/_ZenRowsOpenURLResolver.py +0 -372
  1288. scitex/stats/QUICKSTART.md +0 -260
  1289. scitex/stats/TODO.md +0 -19
  1290. scitex/stats/docs/API.md +0 -165
  1291. scitex/stats/docs/ARCHITECTURE.md +0 -732
  1292. scitex/stats/docs/MIGRATION_GUIDE.md +0 -253
  1293. scitex/stats/docs/PROGRESS.md +0 -635
  1294. scitex/stats/docs/SUMMARY.md +0 -241
  1295. scitex/stats/docs/TODO.md +0 -181
  1296. scitex/stats/docs/ax_parameter_migration.md +0 -125
  1297. scitex/stats/template.py +0 -119
  1298. scitex/stats/tests/categorical/__init__.py +0 -20
  1299. scitex/stats/tests/categorical/_test_chi2.py +0 -708
  1300. scitex/stats/tests/categorical/_test_cochran_q.py +0 -609
  1301. scitex/stats/tests/categorical/_test_fisher.py +0 -585
  1302. scitex/stats/tests/categorical/_test_mcnemar.py +0 -567
  1303. scitex/stats/tests/correlation/__init__.py +0 -32
  1304. scitex/stats/tests/correlation/_test_kendall.py +0 -508
  1305. scitex/stats/tests/correlation/_test_pearson.py +0 -588
  1306. scitex/stats/tests/correlation/_test_spearman.py +0 -485
  1307. scitex/stats/tests/correlation/_test_theilsen.py +0 -193
  1308. scitex/stats/tests/nonparametric/__init__.py +0 -23
  1309. scitex/stats/tests/nonparametric/_test_brunner_munzel.py +0 -559
  1310. scitex/stats/tests/nonparametric/_test_friedman.py +0 -595
  1311. scitex/stats/tests/nonparametric/_test_kruskal.py +0 -557
  1312. scitex/stats/tests/nonparametric/_test_mannwhitneyu.py +0 -518
  1313. scitex/stats/tests/nonparametric/_test_wilcoxon.py +0 -505
  1314. scitex/stats/tests/normality/__init__.py +0 -17
  1315. scitex/stats/tests/normality/_test_ks.py +0 -702
  1316. scitex/stats/tests/normality/_test_shapiro.py +0 -498
  1317. scitex/stats/tests/parametric/__init__.py +0 -27
  1318. scitex/stats/tests/parametric/_test_anova.py +0 -625
  1319. scitex/stats/tests/parametric/_test_anova_2way.py +0 -665
  1320. scitex/stats/tests/parametric/_test_anova_rm.py +0 -717
  1321. scitex/stats/tests/parametric/_test_ttest.py +0 -835
  1322. scitex/template/ANALYSIS.md +0 -202
  1323. scitex-2.1.2.dist-info/licenses/LICENSE +0 -21
  1324. {scitex-2.1.2.dist-info → scitex-2.3.0.dist-info}/WHEEL +0 -0
  1325. {scitex-2.1.2.dist-info → scitex-2.3.0.dist-info}/entry_points.txt +0 -0
@@ -1,718 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Timestamp: "2025-07-31 00:59:38 (ywatanabe)"
4
- # File: /home/ywatanabe/proj/scitex_repo/src/scitex/scholar/open_url/_OpenURLResolverWithZenRows.py
5
- # ----------------------------------------
6
- from __future__ import annotations
7
-
8
- import os
9
-
10
- __FILE__ = (
11
- "./src/scitex/scholar/open_url/_OpenURLResolverWithZenRows.py"
12
- )
13
- __DIR__ = os.path.dirname(__FILE__)
14
- # ----------------------------------------
15
-
16
- """OpenURL resolver with ZenRows integration for bypassing bot detection.
17
-
18
- This implementation uses the correct cookie handling approach based on ZenRows FAQ:
19
- 1. Cookies are returned in Zr-Cookies response header
20
- 2. Use session_id to maintain same IP for 10 minutes
21
- 3. Send cookies as Custom Headers in subsequent requests
22
- """
23
-
24
- import asyncio
25
- import random
26
- import uuid
27
- from typing import Any, Dict, List, Optional, Union
28
- from urllib.parse import urlencode
29
-
30
- import aiohttp
31
-
32
- from scitex import logging
33
-
34
- from ...errors import ScholarError
35
- from ._OpenURLResolver import OpenURLResolver
36
-
37
- logger = logging.getLogger(__name__)
38
-
39
-
40
- class OpenURLResolverWithZenRows(OpenURLResolver):
41
- """OpenURL resolver enhanced with ZenRows anti-bot bypass capabilities.
42
-
43
- This resolver uses ZenRows to bypass anti-bot detection and rate limits.
44
- However, it has limitations with institutional authentication:
45
-
46
- Limitations:
47
- - Cannot fully replicate browser-based authentication flows
48
- - Institutional cookies (e.g., OpenAthens) don't transfer to publisher domains
49
- - Shows "Purchase" options instead of "Download PDF" for paywalled content
50
-
51
- Best used for:
52
- - Open access content detection
53
- - Bypassing anti-bot measures on public content
54
- - High-volume URL resolution
55
-
56
- For authenticate_async access to paywalled content, use the standard OpenURLResolver
57
- which handles the full authentication flow through a real browser.
58
- """
59
-
60
- def __init__(
61
- self,
62
- auth_manager,
63
- resolver_url: str,
64
- zenrows_api_key: Optional[str] = os.getenv(
65
- "SCITEX_SCHOLAR_ZENROWS_API_KEY"
66
- ),
67
- use_browser_cookies: bool = True,
68
- ):
69
- """Initialize resolver with optional ZenRows support.
70
-
71
- Args:
72
- auth_manager: Authentication manager
73
- resolver_url: Base URL of institutional OpenURL resolver
74
- zenrows_api_key: ZenRows API key (uses env var if not provided)
75
- use_browser_cookies: If True, attempts to get publisher cookies via browser first
76
- """
77
- super().__init__(auth_manager, resolver_url)
78
-
79
- self.zenrows_api_key = zenrows_api_key
80
- self.use_browser_cookies = use_browser_cookies
81
-
82
- if self.zenrows_api_key:
83
- logger.info(f"ZenRows API key loaded (length: {len(self.zenrows_api_key)})")
84
- else:
85
- logger.warning("No ZenRows API key provided")
86
-
87
- # Session management for ZenRows
88
- self.zenrows_session_id = None
89
- self.zenrows_cookies: Dict[str, str] = {}
90
- self._last_page_content = None # For debugging
91
-
92
- def _generate_session_id(self) -> str:
93
- """Generate unique session ID for maintaining same IP in ZenRows."""
94
- # ZenRows requires numeric session_id with max value of 10000
95
- import random
96
-
97
- return str(random.randint(1, 10000))
98
-
99
- def _parse_cookie_header(self, cookie_header: str) -> Dict[str, str]:
100
- """Parse cookie header string into dictionary."""
101
- cookies = {}
102
-
103
- for cookie in cookie_header.split(";"):
104
- cookie = cookie.strip()
105
- if "=" in cookie:
106
- name, value = cookie.split("=", 1)
107
- cookies[name.strip()] = value.strip()
108
-
109
- return cookies
110
-
111
- async def _zenrows_request_async(
112
- self, url: str, use_cookies: bool = True, auth_cookies: Optional[Dict[str, str]] = None
113
- ) -> Optional[Dict[str, Any]]:
114
- """Make request through ZenRows API with proper cookie handling.
115
-
116
- Args:
117
- url: Target URL
118
- use_cookies: Whether to include stored cookies
119
- auth_cookies: Optional authentication cookies from auth_manager
120
-
121
- Returns:
122
- Dict with response data or None if failed
123
- """
124
- if not self.zenrows_session_id:
125
- self.zenrows_session_id = self._generate_session_id()
126
- logger.info(f"Created ZenRows session: {self.zenrows_session_id}")
127
-
128
- params = {
129
- "url": url,
130
- "apikey": self.zenrows_api_key,
131
- "js_render": "true",
132
- "premium_proxy": "true",
133
- "session_id": self.zenrows_session_id,
134
- "wait": "5", # Wait for page to load
135
- }
136
-
137
- # Merge auth cookies with session cookies
138
- request_cookies = self.zenrows_cookies.copy()
139
- if auth_cookies:
140
- request_cookies.update(auth_cookies)
141
- logger.info(f"Added {len(auth_cookies)} auth cookies to request")
142
-
143
- headers = {}
144
- if use_cookies and request_cookies:
145
- # Send cookies as HTTP headers with custom_headers=true
146
- cookie_string = "; ".join(
147
- [f"{k}={v}" for k, v in request_cookies.items()]
148
- )
149
- headers["Cookie"] = cookie_string
150
- params["custom_headers"] = "true"
151
- logger.info(f"Sending {len(request_cookies)} total cookies")
152
-
153
- try:
154
- async with aiohttp.ClientSession() as session:
155
- # If we have custom headers, we need to send them separately
156
- request_headers = headers if headers else None
157
-
158
- async with session.get(
159
- "https://api.zenrows.com/v1/",
160
- params=params,
161
- headers=request_headers,
162
- timeout=aiohttp.ClientTimeout(total=60),
163
- ) as response:
164
-
165
- if response.status != 200:
166
- error_text = await response.text()
167
- logger.error(
168
- f"ZenRows request failed: {response.status}\n"
169
- f"Error: {error_text}"
170
- )
171
- return None
172
-
173
- content = await response.text()
174
-
175
- # Store for debugging
176
- self._last_page_content = content
177
-
178
- # Extract cookies from response headers
179
- zr_cookies = response.headers.get("Zr-Cookies", "")
180
- if zr_cookies:
181
- new_cookies = self._parse_cookie_header(zr_cookies)
182
- self.zenrows_cookies.update(new_cookies)
183
- logger.debug(
184
- f"Updated cookies, total: {len(self.zenrows_cookies)}"
185
- )
186
-
187
- # Get final URL
188
- final_url = response.headers.get("Zr-Final-Url", url)
189
-
190
- return {
191
- "content": content,
192
- "final_url": final_url,
193
- "cookies": self.zenrows_cookies,
194
- "status": response.status,
195
- }
196
-
197
- except Exception as e:
198
- logger.error(f"ZenRows request error: {e}")
199
- return None
200
-
201
- async def _get_all_browser_cookies_async(self) -> Dict[str, str]:
202
- """Get all cookies from authenticate_async browser context."""
203
- try:
204
- if not self.auth_manager or not await self.auth_manager.is_authenticate_async():
205
- return {}
206
-
207
- # Get all cookies from the authenticate_async browser context
208
- browser, context = await self.browser.get_authenticated_browser_and_context_async()
209
- cookies = await context.cookies()
210
-
211
- # Convert to simple dict
212
- all_cookies = {}
213
- for cookie in cookies:
214
- all_cookies[cookie['name']] = cookie['value']
215
-
216
- logger.info(f"Retrieved {len(all_cookies)} total cookies from browser context")
217
-
218
- # Log domains for debugging
219
- domains = set(cookie.get('domain', '') for cookie in cookies)
220
- logger.debug(f"Cookie domains: {domains}")
221
-
222
- return all_cookies
223
-
224
- except Exception as e:
225
- logger.error(f"Failed to get browser cookies: {e}")
226
- return {}
227
-
228
- def _extract_domain(self, url: str) -> str:
229
- """Extract domain from URL."""
230
- from urllib.parse import urlparse
231
- parsed = urlparse(url)
232
- domain = parsed.netloc.lower()
233
- # Remove www. prefix
234
- if domain.startswith('www.'):
235
- domain = domain[4:]
236
- return domain
237
-
238
- async def _resolve_single_async_zenrows_async(
239
- self,
240
- title: str = "",
241
- authors: Optional[list] = None,
242
- journal: str = "",
243
- year: Optional[int] = None,
244
- volume: Optional[int] = None,
245
- issue: Optional[int] = None,
246
- pages: str = "",
247
- doi: str = "",
248
- pmid: str = "",
249
- ) -> Optional[Dict[str, Any]]:
250
- """Resolve using ZenRows with authenticate_async cookies through OpenURL."""
251
-
252
- if not self.resolver_url:
253
- logger.warning("No OpenURL resolver URL configured")
254
- return None
255
-
256
- # Build OpenURL
257
- openurl = self.build_openurl(
258
- title, authors, journal, year, volume, issue, pages, doi, pmid
259
- )
260
-
261
- logger.info(f"Resolving via ZenRows: {openurl}")
262
-
263
- # Get ALL cookies from authenticate_async browser context
264
- auth_cookies_dict = {}
265
- if self.use_browser_cookies and self.auth_manager and await self.auth_manager.is_authenticate_async():
266
- logger.info("Getting all cookies from authenticate_async browser context...")
267
- auth_cookies_dict = await self._get_all_browser_cookies_async()
268
- elif self.auth_manager and await self.auth_manager.is_authenticate_async():
269
- logger.info("Getting OpenAthens cookies...")
270
- try:
271
- auth_cookies_list = await self.auth_manager.get_auth_cookies_async()
272
- auth_cookies_dict = {c['name']: c['value'] for c in auth_cookies_list}
273
- logger.info(f"Successfully loaded {len(auth_cookies_dict)} auth cookies.")
274
- except Exception as e:
275
- logger.error(f"Failed to get auth cookies: {e}")
276
-
277
- # CORRECT FLOW: Access OpenURL with authenticate_async cookies via ZenRows
278
- # This handles bot detection while maintaining authentication
279
- result = await self._zenrows_request_async(openurl, use_cookies=True, auth_cookies=auth_cookies_dict)
280
-
281
- if not result:
282
- logger.error("Failed to access OpenURL resolver")
283
- return None
284
-
285
- content = result["content"]
286
- final_url = result["final_url"]
287
-
288
- # Check if we're still at the resolver
289
- if self.resolver_url and self.resolver_url in final_url:
290
- logger.info("Still at institutional resolver, looking for links...")
291
- # Try to find and follow institutional access links
292
- if "full text" in content.lower() or "get it" in content.lower():
293
- logger.info("Found potential access links at resolver")
294
- # In a real implementation, we would parse and follow these links
295
- # For now, we'll note this as a limitation
296
- return {
297
- "final_url": final_url,
298
- "resolver_url": openurl,
299
- "access_type": "resolver_with_links",
300
- "success": False,
301
- "note": "Resolver show_asyncs links but ZenRows cannot follow interactive elements"
302
- }
303
-
304
- # Check if we reached publisher directly
305
- elif self._is_publisher_url(final_url, doi):
306
- logger.info(f"Reached publisher directly: {final_url}")
307
-
308
- # Check for access
309
- access_indicators = [
310
- "full text", "download pdf", "view pdf", "pdf download",
311
- "article pdf", "get pdf", "download article", "read the full",
312
- "access pdf", "open pdf", "full article", "read online",
313
- "download full", "view full text", "read full text"
314
- ]
315
- no_access_indicators = [
316
- "purchase", "subscribe", "get access", "buy now",
317
- "request access", "institutional login", "sign in to access",
318
- "paywall", "subscription required", "access denied",
319
- "please log in", "authentication required", "members only",
320
- "preview of subscription content", "buy or subscribe"
321
- ]
322
-
323
- # Also check for specific publisher patterns
324
- nature_access = "nature.com" in final_url and "full.pdf" in content.lower()
325
- elsevier_access = "sciencedirect.com" in final_url and "pdfft" in content.lower()
326
- wiley_access = "wiley.com" in final_url and "epdf" in content.lower()
327
-
328
- # More nuanced access detection
329
- # If we find strong access indicators, we likely have access even if purchase options exist
330
- strong_access_indicators = [
331
- "download pdf", "view pdf", "pdf download", "get pdf",
332
- "download article", "access pdf", "open pdf"
333
- ]
334
- critical_no_access = [
335
- "preview of subscription content", "access denied",
336
- "authentication required", "please log in"
337
- ]
338
-
339
- has_strong_access = any(phrase in content.lower() for phrase in strong_access_indicators)
340
- has_critical_no_access = any(phrase in content.lower() for phrase in critical_no_access)
341
- has_any_access = any(phrase in content.lower() for phrase in access_indicators)
342
-
343
- # Access is likely if:
344
- # 1. Strong access indicators present AND no critical blockers
345
- # 2. Publisher-specific patterns detected
346
- # 3. We reached publisher URL (implicit access check)
347
- has_access = (
348
- (has_strong_access and not has_critical_no_access) or
349
- nature_access or elsevier_access or wiley_access or
350
- (has_any_access and not has_critical_no_access and self._is_publisher_url(final_url, doi))
351
- )
352
-
353
- return {
354
- "final_url": final_url,
355
- "resolver_url": openurl,
356
- "access_type": "direct_zenrows",
357
- "success": has_access,
358
- "has_cookies": len(self.zenrows_cookies) > 0,
359
- }
360
-
361
- # Step 2: Look for full-text links
362
- # This is simplified - in production would parse HTML properly
363
- if "no full text available" in content.lower():
364
- logger.info("No access available")
365
- return {
366
- "final_url": None,
367
- "resolver_url": openurl,
368
- "access_type": "no_access",
369
- "success": False,
370
- }
371
-
372
- # Step 3: If we have cookies, try accessing publisher with them
373
- if self.zenrows_cookies and doi:
374
- publisher_url = f"https://doi.org/{doi}"
375
- logger.info(
376
- f"Attempting publisher access with cookies: {publisher_url}"
377
- )
378
-
379
- publisher_result = await self._zenrows_request_async(
380
- publisher_url, use_cookies=True, auth_cookies=auth_cookies_dict
381
- )
382
-
383
- if publisher_result:
384
- final_url = publisher_result["final_url"]
385
- content = publisher_result["content"]
386
-
387
- # More comprehensive access detection
388
- access_indicators = [
389
- "full text", "download pdf", "view pdf", "pdf download",
390
- "article pdf", "get pdf", "download article", "read the full",
391
- "access pdf", "open pdf", "full article", "read online",
392
- "download full", "view full text", "read full text"
393
- ]
394
- no_access_indicators = [
395
- "purchase", "subscribe", "get access", "buy now",
396
- "request access", "institutional login", "sign in to access",
397
- "paywall", "subscription required", "access denied",
398
- "please log in", "authentication required", "members only",
399
- "preview of subscription content", "buy or subscribe"
400
- ]
401
-
402
- # Also check for specific publisher patterns
403
- nature_access = "nature.com" in final_url and "full.pdf" in content.lower()
404
- elsevier_access = "sciencedirect.com" in final_url and "pdfft" in content.lower()
405
- wiley_access = "wiley.com" in final_url and "epdf" in content.lower()
406
-
407
- # More nuanced access detection (same logic as above)
408
- strong_access_indicators = [
409
- "download pdf", "view pdf", "pdf download", "get pdf",
410
- "download article", "access pdf", "open pdf"
411
- ]
412
- critical_no_access = [
413
- "preview of subscription content", "access denied",
414
- "authentication required", "please log in"
415
- ]
416
-
417
- has_strong_access = any(phrase in content.lower() for phrase in strong_access_indicators)
418
- has_critical_no_access = any(phrase in content.lower() for phrase in critical_no_access)
419
- has_any_access = any(phrase in content.lower() for phrase in access_indicators)
420
-
421
- has_access = (
422
- (has_strong_access and not has_critical_no_access) or
423
- nature_access or elsevier_access or wiley_access or
424
- (has_any_access and not has_critical_no_access and self._is_publisher_url(final_url, doi))
425
- )
426
-
427
- # Log some debug info
428
- logger.debug(f"Access detection for {final_url}")
429
- logger.debug(f"Found access indicators: {[p for p in access_indicators if p in content.lower()]}")
430
- logger.debug(f"Found no-access indicators: {[p for p in no_access_indicators if p in content.lower()]}")
431
-
432
- # Add authentication suggestion if access is blocked
433
- suggestion = None
434
- found_no_access = [p for p in no_access_indicators if p in content.lower()]
435
- if not has_access and any(
436
- phrase in found_no_access
437
- for phrase in ["institutional login", "subscribe", "purchase"]
438
- ):
439
- suggestion = (
440
- "Content appears to require institutional authentication. "
441
- "Consider using browser-based OpenURLResolver for authenticate_async access."
442
- )
443
-
444
- return {
445
- "final_url": final_url,
446
- "resolver_url": openurl,
447
- "access_type": "zenrows_with_cookies",
448
- "success": has_access,
449
- "cookie_count": len(self.zenrows_cookies),
450
- "suggestion": suggestion
451
- }
452
-
453
- # Default response
454
- return {
455
- "final_url": final_url,
456
- "resolver_url": openurl,
457
- "access_type": "zenrows_attempted",
458
- "success": False,
459
- }
460
-
461
- async def _resolve_single_async(
462
- self,
463
- title: str = "",
464
- authors: Optional[list] = None,
465
- journal: str = "",
466
- year: Optional[int] = None,
467
- volume: Optional[int] = None,
468
- issue: Optional[int] = None,
469
- pages: str = "",
470
- doi: str = "",
471
- pmid: str = "",
472
- ) -> Optional[Dict[str, Any]]:
473
- """Override to use ZenRows when enabled."""
474
-
475
- if self.zenrows_api_key:
476
- logger.info("Using ZenRows for resolution")
477
- return await self._resolve_single_async_zenrows_async(
478
- title, authors, journal, year, volume, issue, pages, doi, pmid
479
- )
480
- else:
481
- # Fall back to regular browser-based resolution
482
- logger.info("Using standard browser resolution")
483
- return await super()._resolve_single_async(
484
- title, authors, journal, year, volume, issue, pages, doi, pmid
485
- )
486
-
487
- def reset_zenrows_session(self):
488
- """Reset ZenRows session (new IP and clear cookies)."""
489
- self.zenrows_session_id = None
490
- self.zenrows_cookies = {}
491
- logger.info("ZenRows session reset")
492
-
493
- def get_access_details(self, content: str, url: str = "", doi: str = "") -> Dict[str, Any]:
494
- """Analyze page content for detailed access information."""
495
- access_indicators = [
496
- "full text", "download pdf", "view pdf", "pdf download",
497
- "article pdf", "get pdf", "download article", "read the full",
498
- "access pdf", "open pdf", "full article", "read online",
499
- "download full", "view full text", "read full text"
500
- ]
501
- strong_access_indicators = [
502
- "download pdf", "view pdf", "pdf download", "get pdf",
503
- "download article", "access pdf", "open pdf"
504
- ]
505
- no_access_indicators = [
506
- "purchase", "subscribe", "get access", "buy now",
507
- "request access", "institutional login", "sign in to access",
508
- "paywall", "subscription required", "access denied",
509
- "please log in", "authentication required", "members only",
510
- "preview of subscription content", "buy or subscribe"
511
- ]
512
- critical_no_access = [
513
- "preview of subscription content", "access denied",
514
- "authentication required", "please log in"
515
- ]
516
-
517
- found_access = [p for p in access_indicators if p in content.lower()]
518
- found_strong_access = [p for p in strong_access_indicators if p in content.lower()]
519
- found_no_access = [p for p in no_access_indicators if p in content.lower()]
520
- found_critical_no_access = [p for p in critical_no_access if p in content.lower()]
521
-
522
- # Apply same nuanced logic
523
- has_access = (
524
- (len(found_strong_access) > 0 and len(found_critical_no_access) == 0) or
525
- (len(found_access) > 0 and len(found_critical_no_access) == 0 and
526
- url and doi and self._is_publisher_url(url, doi))
527
- )
528
-
529
- return {
530
- "has_access": has_access,
531
- "access_indicators_found": found_access,
532
- "strong_access_indicators_found": found_strong_access,
533
- "no_access_indicators_found": found_no_access,
534
- "critical_no_access_found": found_critical_no_access,
535
- "likely_reason": found_critical_no_access[0] if found_critical_no_access else
536
- (found_no_access[0] if found_no_access else "Unknown")
537
- }
538
-
539
- async def resolve_async(
540
- self,
541
- title: str = "",
542
- authors: Optional[list] = None,
543
- journal: str = "",
544
- year: Optional[int] = None,
545
- volume: Optional[int] = None,
546
- issue: Optional[int] = None,
547
- pages: str = "",
548
- doi: str = "",
549
- pmid: str = "",
550
- ) -> Optional[Dict[str, Any]]:
551
- """Public method for resolving - delegates to _resolve_single_async."""
552
- return await self._resolve_single_async(
553
- title, authors, journal, year, volume, issue, pages, doi, pmid
554
- )
555
-
556
- async def _resolve_parallel_async(
557
- self, dois: Union[str, List[str]], concurrency: int = 5
558
- ) -> List[Optional[Dict[str, Any]]]:
559
- """Resolves a list of DOIs in parallel with controlled concurrency.
560
-
561
- Args:
562
- dois: A list of DOI strings to resolve.
563
- concurrency: Maximum number of concurrent tasks (default: 5)
564
-
565
- Returns:
566
- A list of result dictionaries, in the same order as the input DOIs.
567
- """
568
- if not dois:
569
- return []
570
-
571
- is_single = False
572
- if isinstance(dois, str):
573
- dois = [dois]
574
- is_single = True
575
-
576
- logger.info(
577
- f"--- Starting parallel resolution for {len(dois)} DOIs (concurrency: {concurrency}) ---"
578
- )
579
-
580
- # Create semaphore to limit concurrency
581
- semaphore = asyncio.Semaphore(concurrency)
582
-
583
- async def worker_async(doi):
584
- async with semaphore:
585
- # Add random delay between requests to appear more human
586
- await asyncio.sleep(random.uniform(0.5, 2.0))
587
- return await self._resolve_single_async(doi=doi)
588
-
589
- # Create tasks using the worker_async function
590
- tasks = [worker_async(doi) for doi in dois]
591
- results = await asyncio.gather(*tasks)
592
-
593
- logger.info("--- Parallel resolution finished ---")
594
- return results[0] if is_single else results
595
-
596
- def _resolve_single(self, **kwargs) -> Optional[str]:
597
- """Synchronous wrapper for _resolve_single_async."""
598
- try:
599
- loop = asyncio.get_running_loop()
600
- import nest_asyncio
601
-
602
- nest_asyncio.apply()
603
- result = asyncio.run(self._resolve_single_async(**kwargs))
604
- except RuntimeError:
605
- # No running loop, create new one
606
- result = asyncio.run(self._resolve_single_async(**kwargs))
607
-
608
- self._validate_final_url(kwargs.get("doi", ""), result)
609
- return result.get("resolved_url") if result else None
610
-
611
- def resolve(
612
- self, dois: Union[str, List[str]], concurrency: int = 5
613
- ) -> Union[str, List[str]]:
614
- """Synchronous wrapper for _resolve_parallel_async."""
615
- try:
616
- loop = asyncio.get_running_loop()
617
- import nest_asyncio
618
-
619
- nest_asyncio.apply()
620
- results = asyncio.run(
621
- self._resolve_parallel_async(dois, concurrency)
622
- )
623
- except RuntimeError:
624
- results = asyncio.run(
625
- self._resolve_parallel_async(dois, concurrency)
626
- )
627
-
628
- # Validate results
629
- dois_list = [dois] if isinstance(dois, str) else dois
630
- results_list = [results] if not isinstance(results, list) else results
631
- for doi, result in zip(dois_list, results_list):
632
- self._validate_final_url(doi, result)
633
-
634
- return results
635
-
636
- def _validate_final_url(self, doi, result):
637
- """Validate and log the resolution result."""
638
- if (
639
- result
640
- and result.get("success")
641
- and self._is_publisher_url(result["final_url"], doi=doi)
642
- ):
643
- logger.success(f"{doi}: {result['final_url']}")
644
- result["resolved_url"] = result["final_url"]
645
- return True
646
- else:
647
- final_url = result.get("final_url") if result else "N/A"
648
- logger.fail(f"{doi}: Landed at {final_url}")
649
- result["resolved_url"] = None
650
- return False
651
-
652
- async def __aenter__(self):
653
- """Async context manager entry."""
654
- return self
655
-
656
- async def __aexit__(self, exc_type, exc_val, exc_tb):
657
- """Async context manager exit - cleanup if needed."""
658
- # Reset ZenRows session on exit if needed
659
- if self.zenrows_session_id:
660
- self.reset_zenrows_session()
661
-
662
-
663
- # Convenience function for testing
664
- async def test_zenrows_resolver_async():
665
- """Test the ZenRows-enhanced resolver."""
666
- import tempfile
667
- from pathlib import Path
668
-
669
- from scitex.scholar.auth import AuthenticationManager
670
-
671
- # Enable debug logging
672
- logging.getLogger("scitex.scholar").setLevel(logging.DEBUG)
673
-
674
- # Initialize
675
- auth_manager = AuthenticationManager(
676
- email_openathens=os.getenv("SCITEX_SCHOLAR_OPENATHENS_EMAIL")
677
- )
678
- resolver_url = "https://unimelb.hosted.exlibrisgroup.com/sfxlcl41"
679
- zenrows_api_key = os.getenv("SCITEX_SCHOLAR_ZENROWS_API_KEY")
680
-
681
- resolver = OpenURLResolverWithZenRows(
682
- auth_manager,
683
- resolver_url,
684
- zenrows_api_key,
685
- )
686
-
687
- # Test with a DOI
688
- result = await resolver._resolve_single_async(
689
- doi="10.1038/nature12373",
690
- title="A mesoscale connectome of the mouse brain",
691
- journal="Nature",
692
- year=2014,
693
- )
694
-
695
- if result:
696
- print(f"\nResolution Result:")
697
- print(f" Success: {result['success']}")
698
- print(f" Final URL: {result.get('final_url')}")
699
- print(f" Access type: {result.get('access_type')}")
700
- print(f" Cookies collected: {result.get('cookie_count', 0)}")
701
-
702
- # Save debug page if available
703
- if hasattr(resolver, '_last_page_content') and resolver._last_page_content:
704
- debug_file = Path(tempfile.gettempdir()) / "zenrows_debug.html"
705
- debug_file.write_text(resolver._last_page_content)
706
- print(f" Debug page saved to: {debug_file}")
707
- else:
708
- print("Resolution failed")
709
-
710
-
711
- if __name__ == "__main__":
712
- import asyncio
713
-
714
- asyncio.run(test_zenrows_resolver_async())
715
-
716
- # python -m scitex.scholar.open_url._OpenURLResolverWithZenRows
717
-
718
- # EOF