scitex 2.0.0__py2.py3-none-any.whl → 2.1.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scitex/__init__.py +53 -15
- scitex/__main__.py +72 -26
- scitex/__version__.py +1 -1
- scitex/_sh.py +145 -23
- scitex/ai/__init__.py +30 -16
- scitex/ai/_gen_ai/_Anthropic.py +5 -7
- scitex/ai/_gen_ai/_BaseGenAI.py +2 -2
- scitex/ai/_gen_ai/_DeepSeek.py +10 -2
- scitex/ai/_gen_ai/_Google.py +2 -2
- scitex/ai/_gen_ai/_Llama.py +2 -2
- scitex/ai/_gen_ai/_OpenAI.py +2 -2
- scitex/ai/_gen_ai/_PARAMS.py +51 -65
- scitex/ai/_gen_ai/_Perplexity.py +2 -2
- scitex/ai/_gen_ai/__init__.py +25 -14
- scitex/ai/_gen_ai/_format_output_func.py +4 -4
- scitex/ai/classification/{classifier_server.py → Classifier.py} +5 -5
- scitex/ai/classification/CrossValidationExperiment.py +374 -0
- scitex/ai/classification/__init__.py +43 -4
- scitex/ai/classification/reporters/_BaseClassificationReporter.py +281 -0
- scitex/ai/classification/reporters/_ClassificationReporter.py +773 -0
- scitex/ai/classification/reporters/_MultiClassificationReporter.py +406 -0
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +1834 -0
- scitex/ai/classification/reporters/__init__.py +11 -0
- scitex/ai/classification/reporters/reporter_utils/_Plotter.py +1028 -0
- scitex/ai/classification/reporters/reporter_utils/__init__.py +80 -0
- scitex/ai/classification/reporters/reporter_utils/aggregation.py +457 -0
- scitex/ai/classification/reporters/reporter_utils/data_models.py +313 -0
- scitex/ai/classification/reporters/reporter_utils/reporting.py +1056 -0
- scitex/ai/classification/reporters/reporter_utils/storage.py +221 -0
- scitex/ai/classification/reporters/reporter_utils/validation.py +395 -0
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
- scitex/ai/classification/timeseries/_TimeSeriesMetadata.py +139 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
- scitex/ai/classification/timeseries/_TimeSeriesStrategy.py +84 -0
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
- scitex/ai/classification/timeseries/__init__.py +39 -0
- scitex/ai/classification/timeseries/_normalize_timestamp.py +436 -0
- scitex/ai/clustering/_umap.py +2 -2
- scitex/ai/feature_extraction/vit.py +1 -0
- scitex/ai/feature_selection/__init__.py +30 -0
- scitex/ai/feature_selection/feature_selection.py +364 -0
- scitex/ai/loss/multi_task_loss.py +1 -1
- scitex/ai/metrics/__init__.py +51 -4
- scitex/ai/metrics/_calc_bacc.py +61 -0
- scitex/ai/metrics/_calc_bacc_from_conf_mat.py +38 -0
- scitex/ai/metrics/_calc_clf_report.py +78 -0
- scitex/ai/metrics/_calc_conf_mat.py +93 -0
- scitex/ai/metrics/_calc_feature_importance.py +183 -0
- scitex/ai/metrics/_calc_mcc.py +61 -0
- scitex/ai/metrics/_calc_pre_rec_auc.py +116 -0
- scitex/ai/metrics/_calc_roc_auc.py +110 -0
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +490 -0
- scitex/ai/metrics/{silhoute_score_block.py → _calc_silhouette_score.py} +15 -8
- scitex/ai/metrics/_normalize_labels.py +83 -0
- scitex/ai/plt/__init__.py +47 -8
- scitex/ai/plt/{_conf_mat.py → _plot_conf_mat.py} +158 -87
- scitex/ai/plt/_plot_feature_importance.py +323 -0
- scitex/ai/plt/_plot_learning_curve.py +345 -0
- scitex/ai/plt/_plot_optuna_study.py +225 -0
- scitex/ai/plt/_plot_pre_rec_curve.py +290 -0
- scitex/ai/plt/_plot_roc_curve.py +255 -0
- scitex/ai/training/{learning_curve_logger.py → _LearningCurveLogger.py} +197 -213
- scitex/ai/training/__init__.py +2 -2
- scitex/ai/utils/grid_search.py +3 -3
- scitex/benchmark/__init__.py +52 -0
- scitex/benchmark/benchmark.py +400 -0
- scitex/benchmark/monitor.py +370 -0
- scitex/benchmark/profiler.py +297 -0
- scitex/browser/__init__.py +48 -0
- scitex/browser/automation/CookieHandler.py +216 -0
- scitex/browser/automation/__init__.py +7 -0
- scitex/browser/collaboration/__init__.py +55 -0
- scitex/browser/collaboration/auth_helpers.py +94 -0
- scitex/browser/collaboration/collaborative_agent.py +136 -0
- scitex/browser/collaboration/credential_manager.py +188 -0
- scitex/browser/collaboration/interactive_panel.py +400 -0
- scitex/browser/collaboration/persistent_browser.py +170 -0
- scitex/browser/collaboration/shared_session.py +383 -0
- scitex/browser/collaboration/standard_interactions.py +246 -0
- scitex/browser/collaboration/visual_feedback.py +181 -0
- scitex/browser/core/BrowserMixin.py +326 -0
- scitex/browser/core/ChromeProfileManager.py +446 -0
- scitex/browser/core/__init__.py +9 -0
- scitex/browser/debugging/__init__.py +18 -0
- scitex/browser/debugging/_browser_logger.py +657 -0
- scitex/browser/debugging/_highlight_element.py +143 -0
- scitex/browser/debugging/_show_grid.py +154 -0
- scitex/browser/interaction/__init__.py +24 -0
- scitex/browser/interaction/click_center.py +149 -0
- scitex/browser/interaction/click_with_fallbacks.py +206 -0
- scitex/browser/interaction/close_popups.py +498 -0
- scitex/browser/interaction/fill_with_fallbacks.py +209 -0
- scitex/browser/pdf/__init__.py +14 -0
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +200 -0
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +198 -0
- scitex/browser/remote/CaptchaHandler.py +434 -0
- scitex/browser/remote/ZenRowsAPIClient.py +347 -0
- scitex/browser/remote/ZenRowsBrowserManager.py +570 -0
- scitex/browser/remote/__init__.py +11 -0
- scitex/browser/stealth/HumanBehavior.py +344 -0
- scitex/browser/stealth/StealthManager.py +1008 -0
- scitex/browser/stealth/__init__.py +9 -0
- scitex/browser/template.py +122 -0
- scitex/capture/__init__.py +110 -0
- scitex/capture/__main__.py +25 -0
- scitex/capture/capture.py +848 -0
- scitex/capture/cli.py +233 -0
- scitex/capture/gif.py +344 -0
- scitex/capture/mcp_server.py +961 -0
- scitex/capture/session.py +70 -0
- scitex/capture/utils.py +705 -0
- scitex/cli/__init__.py +17 -0
- scitex/cli/cloud.py +447 -0
- scitex/cli/main.py +42 -0
- scitex/cli/scholar.py +280 -0
- scitex/context/_suppress_output.py +5 -3
- scitex/db/__init__.py +30 -3
- scitex/db/__main__.py +75 -0
- scitex/db/_check_health.py +381 -0
- scitex/db/_delete_duplicates.py +25 -386
- scitex/db/_inspect.py +335 -114
- scitex/db/_inspect_optimized.py +301 -0
- scitex/db/{_PostgreSQL.py → _postgresql/_PostgreSQL.py} +3 -3
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BackupMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BatchMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BlobMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ConnectionMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_MaintenanceMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_QueryMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_SchemaMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TransactionMixin.py +1 -1
- scitex/db/_postgresql/__init__.py +6 -0
- scitex/db/_sqlite3/_SQLite3.py +210 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin.py +581 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin_v01-need-_hash-col.py +517 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_BatchMixin.py +1 -1
- scitex/db/_sqlite3/_SQLite3Mixins/_BlobMixin.py +281 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin.py +548 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin_v01-indentation-issues.py +583 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ConnectionMixin.py +29 -13
- scitex/db/_sqlite3/_SQLite3Mixins/_GitMixin.py +583 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ImportExportMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_IndexMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_MaintenanceMixin.py +2 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_QueryMixin.py +37 -10
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_RowMixin.py +46 -6
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TableMixin.py +56 -10
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TransactionMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/__init__.py +14 -2
- scitex/db/_sqlite3/__init__.py +7 -0
- scitex/db/_sqlite3/_delete_duplicates.py +274 -0
- scitex/decorators/__init__.py +2 -0
- scitex/decorators/_cache_disk.py +13 -5
- scitex/decorators/_cache_disk_async.py +49 -0
- scitex/decorators/_deprecated.py +175 -10
- scitex/decorators/_timeout.py +1 -1
- scitex/dev/_analyze_code_flow.py +2 -2
- scitex/dict/_DotDict.py +73 -15
- scitex/dict/_DotDict_v01-not-handling-recursive-instantiations.py +442 -0
- scitex/dict/_DotDict_v02-not-serializing-Path-object.py +446 -0
- scitex/dict/__init__.py +2 -0
- scitex/dict/_flatten.py +27 -0
- scitex/dsp/_crop.py +2 -2
- scitex/dsp/_demo_sig.py +2 -2
- scitex/dsp/_detect_ripples.py +2 -2
- scitex/dsp/_hilbert.py +2 -2
- scitex/dsp/_listen.py +6 -6
- scitex/dsp/_modulation_index.py +2 -2
- scitex/dsp/_pac.py +1 -1
- scitex/dsp/_psd.py +2 -2
- scitex/dsp/_resample.py +2 -1
- scitex/dsp/_time.py +3 -2
- scitex/dsp/_wavelet.py +3 -2
- scitex/dsp/add_noise.py +2 -2
- scitex/dsp/example.py +1 -0
- scitex/dsp/filt.py +10 -9
- scitex/dsp/template.py +3 -2
- scitex/dsp/utils/_differential_bandpass_filters.py +1 -1
- scitex/dsp/utils/pac.py +2 -2
- scitex/dt/_normalize_timestamp.py +432 -0
- scitex/errors.py +572 -0
- scitex/gen/_DimHandler.py +2 -2
- scitex/gen/__init__.py +37 -7
- scitex/gen/_deprecated_close.py +80 -0
- scitex/gen/_deprecated_start.py +26 -0
- scitex/gen/_detect_environment.py +152 -0
- scitex/gen/_detect_notebook_path.py +169 -0
- scitex/gen/_embed.py +6 -2
- scitex/gen/_get_notebook_path.py +257 -0
- scitex/gen/_less.py +1 -1
- scitex/gen/_list_packages.py +2 -2
- scitex/gen/_norm.py +44 -9
- scitex/gen/_norm_cache.py +269 -0
- scitex/gen/_src.py +3 -5
- scitex/gen/_title_case.py +3 -3
- scitex/io/__init__.py +28 -6
- scitex/io/_glob.py +13 -7
- scitex/io/_load.py +108 -21
- scitex/io/_load_cache.py +303 -0
- scitex/io/_load_configs.py +40 -15
- scitex/io/{_H5Explorer.py → _load_modules/_H5Explorer.py} +80 -17
- scitex/io/_load_modules/_ZarrExplorer.py +114 -0
- scitex/io/_load_modules/_bibtex.py +207 -0
- scitex/io/_load_modules/_hdf5.py +53 -178
- scitex/io/_load_modules/_json.py +5 -3
- scitex/io/_load_modules/_pdf.py +871 -16
- scitex/io/_load_modules/_sqlite3.py +15 -0
- scitex/io/_load_modules/_txt.py +41 -12
- scitex/io/_load_modules/_yaml.py +4 -3
- scitex/io/_load_modules/_zarr.py +126 -0
- scitex/io/_save.py +429 -171
- scitex/io/_save_modules/__init__.py +6 -0
- scitex/io/_save_modules/_bibtex.py +194 -0
- scitex/io/_save_modules/_csv.py +8 -4
- scitex/io/_save_modules/_excel.py +174 -15
- scitex/io/_save_modules/_hdf5.py +251 -226
- scitex/io/_save_modules/_image.py +1 -3
- scitex/io/_save_modules/_json.py +49 -4
- scitex/io/_save_modules/_listed_dfs_as_csv.py +1 -3
- scitex/io/_save_modules/_listed_scalars_as_csv.py +1 -3
- scitex/io/_save_modules/_tex.py +277 -0
- scitex/io/_save_modules/_yaml.py +42 -3
- scitex/io/_save_modules/_zarr.py +160 -0
- scitex/io/utils/__init__.py +20 -0
- scitex/io/utils/h5_to_zarr.py +616 -0
- scitex/linalg/_geometric_median.py +6 -2
- scitex/{gen/_tee.py → logging/_Tee.py} +43 -84
- scitex/logging/__init__.py +122 -0
- scitex/logging/_config.py +158 -0
- scitex/logging/_context.py +103 -0
- scitex/logging/_formatters.py +128 -0
- scitex/logging/_handlers.py +64 -0
- scitex/logging/_levels.py +35 -0
- scitex/logging/_logger.py +163 -0
- scitex/logging/_print_capture.py +95 -0
- scitex/ml/__init__.py +69 -0
- scitex/{ai/genai/anthropic.py → ml/_gen_ai/_Anthropic.py} +13 -19
- scitex/{ai/genai/base_genai.py → ml/_gen_ai/_BaseGenAI.py} +5 -5
- scitex/{ai/genai/deepseek.py → ml/_gen_ai/_DeepSeek.py} +11 -16
- scitex/{ai/genai/google.py → ml/_gen_ai/_Google.py} +7 -15
- scitex/{ai/genai/groq.py → ml/_gen_ai/_Groq.py} +1 -8
- scitex/{ai/genai/llama.py → ml/_gen_ai/_Llama.py} +3 -16
- scitex/{ai/genai/openai.py → ml/_gen_ai/_OpenAI.py} +3 -3
- scitex/{ai/genai/params.py → ml/_gen_ai/_PARAMS.py} +51 -65
- scitex/{ai/genai/perplexity.py → ml/_gen_ai/_Perplexity.py} +3 -14
- scitex/ml/_gen_ai/__init__.py +43 -0
- scitex/{ai/genai/calc_cost.py → ml/_gen_ai/_calc_cost.py} +1 -1
- scitex/{ai/genai/format_output_func.py → ml/_gen_ai/_format_output_func.py} +4 -4
- scitex/{ai/genai/genai_factory.py → ml/_gen_ai/_genai_factory.py} +8 -8
- scitex/ml/activation/__init__.py +8 -0
- scitex/ml/activation/_define.py +11 -0
- scitex/{ai/classifier_server.py → ml/classification/Classifier.py} +5 -5
- scitex/ml/classification/CrossValidationExperiment.py +374 -0
- scitex/ml/classification/__init__.py +46 -0
- scitex/ml/classification/reporters/_BaseClassificationReporter.py +281 -0
- scitex/ml/classification/reporters/_ClassificationReporter.py +773 -0
- scitex/ml/classification/reporters/_MultiClassificationReporter.py +406 -0
- scitex/ml/classification/reporters/_SingleClassificationReporter.py +1834 -0
- scitex/ml/classification/reporters/__init__.py +11 -0
- scitex/ml/classification/reporters/reporter_utils/_Plotter.py +1028 -0
- scitex/ml/classification/reporters/reporter_utils/__init__.py +80 -0
- scitex/ml/classification/reporters/reporter_utils/aggregation.py +457 -0
- scitex/ml/classification/reporters/reporter_utils/data_models.py +313 -0
- scitex/ml/classification/reporters/reporter_utils/reporting.py +1056 -0
- scitex/ml/classification/reporters/reporter_utils/storage.py +221 -0
- scitex/ml/classification/reporters/reporter_utils/validation.py +395 -0
- scitex/ml/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
- scitex/ml/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
- scitex/ml/classification/timeseries/_TimeSeriesMetadata.py +139 -0
- scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
- scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
- scitex/ml/classification/timeseries/_TimeSeriesStrategy.py +84 -0
- scitex/ml/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
- scitex/ml/classification/timeseries/__init__.py +39 -0
- scitex/ml/classification/timeseries/_normalize_timestamp.py +436 -0
- scitex/ml/clustering/__init__.py +11 -0
- scitex/ml/clustering/_pca.py +115 -0
- scitex/ml/clustering/_umap.py +376 -0
- scitex/ml/feature_extraction/__init__.py +56 -0
- scitex/ml/feature_extraction/vit.py +149 -0
- scitex/ml/feature_selection/__init__.py +30 -0
- scitex/ml/feature_selection/feature_selection.py +364 -0
- scitex/ml/loss/_L1L2Losses.py +34 -0
- scitex/ml/loss/__init__.py +12 -0
- scitex/ml/loss/multi_task_loss.py +47 -0
- scitex/ml/metrics/__init__.py +56 -0
- scitex/ml/metrics/_calc_bacc.py +61 -0
- scitex/ml/metrics/_calc_bacc_from_conf_mat.py +38 -0
- scitex/ml/metrics/_calc_clf_report.py +78 -0
- scitex/ml/metrics/_calc_conf_mat.py +93 -0
- scitex/ml/metrics/_calc_feature_importance.py +183 -0
- scitex/ml/metrics/_calc_mcc.py +61 -0
- scitex/ml/metrics/_calc_pre_rec_auc.py +116 -0
- scitex/ml/metrics/_calc_roc_auc.py +110 -0
- scitex/ml/metrics/_calc_seizure_prediction_metrics.py +490 -0
- scitex/ml/metrics/_calc_silhouette_score.py +503 -0
- scitex/ml/metrics/_normalize_labels.py +83 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ml/optim/__init__.py +13 -0
- scitex/ml/optim/_get_set.py +31 -0
- scitex/ml/optim/_optimizers.py +71 -0
- scitex/ml/plt/__init__.py +60 -0
- scitex/ml/plt/_plot_conf_mat.py +663 -0
- scitex/ml/plt/_plot_feature_importance.py +323 -0
- scitex/ml/plt/_plot_learning_curve.py +345 -0
- scitex/ml/plt/_plot_optuna_study.py +225 -0
- scitex/ml/plt/_plot_pre_rec_curve.py +290 -0
- scitex/ml/plt/_plot_roc_curve.py +255 -0
- scitex/ml/sk/__init__.py +11 -0
- scitex/ml/sk/_clf.py +58 -0
- scitex/ml/sk/_to_sktime.py +100 -0
- scitex/ml/sklearn/__init__.py +26 -0
- scitex/ml/sklearn/clf.py +58 -0
- scitex/ml/sklearn/to_sktime.py +100 -0
- scitex/{ai/training/early_stopping.py → ml/training/_EarlyStopping.py} +1 -2
- scitex/{ai → ml/training}/_LearningCurveLogger.py +198 -242
- scitex/ml/training/__init__.py +7 -0
- scitex/ml/utils/__init__.py +22 -0
- scitex/ml/utils/_check_params.py +50 -0
- scitex/ml/utils/_default_dataset.py +46 -0
- scitex/ml/utils/_format_samples_for_sktime.py +26 -0
- scitex/ml/utils/_label_encoder.py +134 -0
- scitex/ml/utils/_merge_labels.py +22 -0
- scitex/ml/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ml/utils/_under_sample.py +51 -0
- scitex/ml/utils/_verify_n_gpus.py +16 -0
- scitex/ml/utils/grid_search.py +148 -0
- scitex/nn/_BNet.py +15 -9
- scitex/nn/_Filters.py +2 -2
- scitex/nn/_ModulationIndex.py +2 -2
- scitex/nn/_PAC.py +1 -1
- scitex/nn/_Spectrogram.py +12 -3
- scitex/nn/__init__.py +9 -10
- scitex/path/__init__.py +18 -0
- scitex/path/_clean.py +4 -0
- scitex/path/_find.py +9 -4
- scitex/path/_symlink.py +348 -0
- scitex/path/_version.py +4 -3
- scitex/pd/__init__.py +2 -0
- scitex/pd/_get_unique.py +99 -0
- scitex/plt/__init__.py +114 -5
- scitex/plt/_subplots/_AxesWrapper.py +1 -3
- scitex/plt/_subplots/_AxisWrapper.py +7 -3
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +47 -13
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +160 -2
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +26 -4
- scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +322 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +1 -0
- scitex/plt/_subplots/_FigWrapper.py +62 -6
- scitex/plt/_subplots/_export_as_csv.py +43 -27
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +5 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +81 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +20 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +35 -18
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +15 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +35 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +6 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_text.py +60 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters.py +56 -59
- scitex/plt/ax/_style/_hide_spines.py +1 -3
- scitex/plt/ax/_style/_rotate_labels.py +180 -76
- scitex/plt/ax/_style/_rotate_labels_v01.py +248 -0
- scitex/plt/ax/_style/_set_meta.py +11 -4
- scitex/plt/ax/_style/_set_supxyt.py +3 -3
- scitex/plt/ax/_style/_set_xyt.py +3 -3
- scitex/plt/ax/_style/_share_axes.py +2 -2
- scitex/plt/color/__init__.py +4 -4
- scitex/plt/color/{_get_colors_from_cmap.py → _get_colors_from_conf_matap.py} +7 -7
- scitex/plt/utils/_configure_mpl.py +99 -86
- scitex/plt/utils/_histogram_utils.py +1 -3
- scitex/plt/utils/_is_valid_axis.py +1 -3
- scitex/plt/utils/_scitex_config.py +1 -0
- scitex/repro/__init__.py +75 -0
- scitex/{reproduce → repro}/_gen_ID.py +1 -1
- scitex/{reproduce → repro}/_gen_timestamp.py +1 -1
- scitex/repro_rng/_RandomStateManager.py +590 -0
- scitex/repro_rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
- scitex/repro_rng/__init__.py +39 -0
- scitex/reproduce/__init__.py +25 -13
- scitex/reproduce/_hash_array.py +22 -0
- scitex/resource/_get_processor_usages.py +4 -4
- scitex/resource/_get_specs.py +2 -2
- scitex/resource/_log_processor_usages.py +2 -2
- scitex/rng/_RandomStateManager.py +590 -0
- scitex/rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
- scitex/rng/__init__.py +39 -0
- scitex/scholar/__init__.py +309 -19
- scitex/scholar/__main__.py +319 -0
- scitex/scholar/auth/ScholarAuthManager.py +308 -0
- scitex/scholar/auth/__init__.py +12 -0
- scitex/scholar/auth/core/AuthenticationGateway.py +473 -0
- scitex/scholar/auth/core/BrowserAuthenticator.py +386 -0
- scitex/scholar/auth/core/StrategyResolver.py +309 -0
- scitex/scholar/auth/core/__init__.py +16 -0
- scitex/scholar/auth/gateway/_OpenURLLinkFinder.py +120 -0
- scitex/scholar/auth/gateway/_OpenURLResolver.py +209 -0
- scitex/scholar/auth/gateway/__init__.py +38 -0
- scitex/scholar/auth/gateway/_resolve_functions.py +101 -0
- scitex/scholar/auth/providers/BaseAuthenticator.py +166 -0
- scitex/scholar/auth/providers/EZProxyAuthenticator.py +484 -0
- scitex/scholar/auth/providers/OpenAthensAuthenticator.py +619 -0
- scitex/scholar/auth/providers/ShibbolethAuthenticator.py +686 -0
- scitex/scholar/auth/providers/__init__.py +18 -0
- scitex/scholar/auth/session/AuthCacheManager.py +189 -0
- scitex/scholar/auth/session/SessionManager.py +159 -0
- scitex/scholar/auth/session/__init__.py +11 -0
- scitex/scholar/auth/sso/BaseSSOAutomator.py +373 -0
- scitex/scholar/auth/sso/OpenAthensSSOAutomator.py +378 -0
- scitex/scholar/auth/sso/SSOAutomator.py +180 -0
- scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +380 -0
- scitex/scholar/auth/sso/__init__.py +15 -0
- scitex/scholar/browser/ScholarBrowserManager.py +705 -0
- scitex/scholar/browser/__init__.py +38 -0
- scitex/scholar/browser/utils/__init__.py +13 -0
- scitex/scholar/browser/utils/click_and_wait.py +205 -0
- scitex/scholar/browser/utils/close_unwanted_pages.py +140 -0
- scitex/scholar/browser/utils/wait_redirects.py +732 -0
- scitex/scholar/config/PublisherRules.py +132 -0
- scitex/scholar/config/ScholarConfig.py +126 -0
- scitex/scholar/config/__init__.py +17 -0
- scitex/scholar/core/Paper.py +627 -0
- scitex/scholar/core/Papers.py +722 -0
- scitex/scholar/core/Scholar.py +1975 -0
- scitex/scholar/core/__init__.py +9 -0
- scitex/scholar/impact_factor/ImpactFactorEngine.py +204 -0
- scitex/scholar/impact_factor/__init__.py +20 -0
- scitex/scholar/impact_factor/estimation/ImpactFactorEstimationEngine.py +0 -0
- scitex/scholar/impact_factor/estimation/__init__.py +40 -0
- scitex/scholar/impact_factor/estimation/build_database.py +0 -0
- scitex/scholar/impact_factor/estimation/core/__init__.py +28 -0
- scitex/scholar/impact_factor/estimation/core/cache_manager.py +523 -0
- scitex/scholar/impact_factor/estimation/core/calculator.py +355 -0
- scitex/scholar/impact_factor/estimation/core/journal_matcher.py +428 -0
- scitex/scholar/integration/__init__.py +59 -0
- scitex/scholar/integration/base.py +502 -0
- scitex/scholar/integration/mendeley/__init__.py +22 -0
- scitex/scholar/integration/mendeley/exporter.py +166 -0
- scitex/scholar/integration/mendeley/importer.py +236 -0
- scitex/scholar/integration/mendeley/linker.py +79 -0
- scitex/scholar/integration/mendeley/mapper.py +212 -0
- scitex/scholar/integration/zotero/__init__.py +27 -0
- scitex/scholar/integration/zotero/__main__.py +264 -0
- scitex/scholar/integration/zotero/exporter.py +351 -0
- scitex/scholar/integration/zotero/importer.py +372 -0
- scitex/scholar/integration/zotero/linker.py +415 -0
- scitex/scholar/integration/zotero/mapper.py +286 -0
- scitex/scholar/metadata_engines/ScholarEngine.py +588 -0
- scitex/scholar/metadata_engines/__init__.py +21 -0
- scitex/scholar/metadata_engines/individual/ArXivEngine.py +397 -0
- scitex/scholar/metadata_engines/individual/CrossRefEngine.py +274 -0
- scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py +263 -0
- scitex/scholar/metadata_engines/individual/OpenAlexEngine.py +350 -0
- scitex/scholar/metadata_engines/individual/PubMedEngine.py +329 -0
- scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py +438 -0
- scitex/scholar/metadata_engines/individual/URLDOIEngine.py +410 -0
- scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py +487 -0
- scitex/scholar/metadata_engines/individual/__init__.py +7 -0
- scitex/scholar/metadata_engines/utils/_PubMedConverter.py +469 -0
- scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +283 -0
- scitex/scholar/metadata_engines/utils/__init__.py +30 -0
- scitex/scholar/metadata_engines/utils/_metadata2bibtex.py +103 -0
- scitex/scholar/metadata_engines/utils/_standardize_metadata.py +376 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +579 -0
- scitex/scholar/pdf_download/__init__.py +5 -0
- scitex/scholar/pdf_download/strategies/__init__.py +38 -0
- scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +376 -0
- scitex/scholar/pdf_download/strategies/direct_download.py +131 -0
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +167 -0
- scitex/scholar/pdf_download/strategies/manual_download_utils.py +996 -0
- scitex/scholar/pdf_download/strategies/response_body.py +207 -0
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +364 -0
- scitex/scholar/pipelines/ScholarPipelineParallel.py +478 -0
- scitex/scholar/pipelines/ScholarPipelineSingle.py +767 -0
- scitex/scholar/pipelines/__init__.py +49 -0
- scitex/scholar/storage/BibTeXHandler.py +1018 -0
- scitex/scholar/storage/PaperIO.py +468 -0
- scitex/scholar/storage/ScholarLibrary.py +182 -0
- scitex/scholar/storage/_DeduplicationManager.py +548 -0
- scitex/scholar/storage/_LibraryCacheManager.py +724 -0
- scitex/scholar/storage/_LibraryManager.py +1835 -0
- scitex/scholar/storage/__init__.py +28 -0
- scitex/scholar/url_finder/ScholarURLFinder.py +379 -0
- scitex/scholar/url_finder/__init__.py +7 -0
- scitex/scholar/url_finder/strategies/__init__.py +33 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +261 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_dropdown.py +67 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +204 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_navigation.py +256 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_publisher_patterns.py +165 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +163 -0
- scitex/scholar/url_finder/strategies/find_supplementary_urls_by_href.py +70 -0
- scitex/scholar/utils/__init__.py +22 -0
- scitex/scholar/utils/bibtex/__init__.py +9 -0
- scitex/scholar/utils/bibtex/_parse_bibtex.py +71 -0
- scitex/scholar/utils/cleanup/__init__.py +8 -0
- scitex/scholar/utils/cleanup/_cleanup_scholar_processes.py +96 -0
- scitex/scholar/utils/cleanup/cleanup_old_extractions.py +117 -0
- scitex/scholar/utils/text/_TextNormalizer.py +407 -0
- scitex/scholar/utils/text/__init__.py +9 -0
- scitex/scholar/zotero/__init__.py +38 -0
- scitex/session/__init__.py +51 -0
- scitex/session/_lifecycle.py +736 -0
- scitex/session/_manager.py +102 -0
- scitex/session/template.py +122 -0
- scitex/stats/__init__.py +30 -26
- scitex/stats/correct/__init__.py +21 -0
- scitex/stats/correct/_correct_bonferroni.py +551 -0
- scitex/stats/correct/_correct_fdr.py +634 -0
- scitex/stats/correct/_correct_holm.py +548 -0
- scitex/stats/correct/_correct_sidak.py +499 -0
- scitex/stats/descriptive/__init__.py +85 -0
- scitex/stats/descriptive/_circular.py +540 -0
- scitex/stats/descriptive/_describe.py +219 -0
- scitex/stats/descriptive/_nan.py +518 -0
- scitex/stats/descriptive/_real.py +189 -0
- scitex/stats/effect_sizes/__init__.py +41 -0
- scitex/stats/effect_sizes/_cliffs_delta.py +325 -0
- scitex/stats/effect_sizes/_cohens_d.py +342 -0
- scitex/stats/effect_sizes/_epsilon_squared.py +315 -0
- scitex/stats/effect_sizes/_eta_squared.py +302 -0
- scitex/stats/effect_sizes/_prob_superiority.py +296 -0
- scitex/stats/posthoc/__init__.py +19 -0
- scitex/stats/posthoc/_dunnett.py +463 -0
- scitex/stats/posthoc/_games_howell.py +383 -0
- scitex/stats/posthoc/_tukey_hsd.py +367 -0
- scitex/stats/power/__init__.py +19 -0
- scitex/stats/power/_power.py +433 -0
- scitex/stats/template.py +119 -0
- scitex/stats/utils/__init__.py +62 -0
- scitex/stats/utils/_effect_size.py +985 -0
- scitex/stats/utils/_formatters.py +270 -0
- scitex/stats/utils/_normalizers.py +927 -0
- scitex/stats/utils/_power.py +433 -0
- scitex/stats_v01/_EffectSizeCalculator.py +488 -0
- scitex/stats_v01/_StatisticalValidator.py +411 -0
- scitex/stats_v01/__init__.py +60 -0
- scitex/stats_v01/_additional_tests.py +415 -0
- scitex/{stats → stats_v01}/_p2stars.py +19 -5
- scitex/stats_v01/_two_sample_tests.py +141 -0
- scitex/stats_v01/desc/__init__.py +83 -0
- scitex/stats_v01/desc/_circular.py +540 -0
- scitex/stats_v01/desc/_describe.py +219 -0
- scitex/stats_v01/desc/_nan.py +518 -0
- scitex/{stats/desc/_nan.py → stats_v01/desc/_nan_v01-20250920_145731.py} +23 -12
- scitex/stats_v01/desc/_real.py +189 -0
- scitex/stats_v01/tests/__corr_test_optimized.py +221 -0
- scitex/stats_v01/tests/_corr_test_optimized.py +179 -0
- scitex/str/__init__.py +1 -3
- scitex/str/_clean_path.py +6 -2
- scitex/str/_latex_fallback.py +267 -160
- scitex/str/_parse.py +44 -36
- scitex/str/_printc.py +1 -3
- scitex/template/__init__.py +87 -0
- scitex/template/_create_project.py +267 -0
- scitex/template/create_pip_project.py +80 -0
- scitex/template/create_research.py +80 -0
- scitex/template/create_singularity.py +80 -0
- scitex/units.py +291 -0
- scitex/utils/_compress_hdf5.py +14 -3
- scitex/utils/_email.py +21 -2
- scitex/utils/_grid.py +6 -4
- scitex/utils/_notify.py +13 -10
- scitex/utils/_verify_scitex_format.py +589 -0
- scitex/utils/_verify_scitex_format_v01.py +370 -0
- scitex/utils/template.py +122 -0
- scitex/web/_search_pubmed.py +62 -16
- scitex-2.1.0.dist-info/LICENSE +21 -0
- scitex-2.1.0.dist-info/METADATA +677 -0
- scitex-2.1.0.dist-info/RECORD +919 -0
- {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/WHEEL +1 -1
- scitex-2.1.0.dist-info/entry_points.txt +3 -0
- scitex/ai/__Classifiers.py +0 -101
- scitex/ai/classification/classification_reporter.py +0 -1137
- scitex/ai/classification/classifiers.py +0 -101
- scitex/ai/classification_reporter.py +0 -1161
- scitex/ai/genai/__init__.py +0 -277
- scitex/ai/genai/anthropic_provider.py +0 -320
- scitex/ai/genai/anthropic_refactored.py +0 -109
- scitex/ai/genai/auth_manager.py +0 -200
- scitex/ai/genai/base_provider.py +0 -291
- scitex/ai/genai/chat_history.py +0 -307
- scitex/ai/genai/cost_tracker.py +0 -276
- scitex/ai/genai/deepseek_provider.py +0 -251
- scitex/ai/genai/google_provider.py +0 -228
- scitex/ai/genai/groq_provider.py +0 -248
- scitex/ai/genai/image_processor.py +0 -250
- scitex/ai/genai/llama_provider.py +0 -214
- scitex/ai/genai/mock_provider.py +0 -127
- scitex/ai/genai/model_registry.py +0 -304
- scitex/ai/genai/openai_provider.py +0 -293
- scitex/ai/genai/perplexity_provider.py +0 -205
- scitex/ai/genai/provider_base.py +0 -302
- scitex/ai/genai/provider_factory.py +0 -370
- scitex/ai/genai/response_handler.py +0 -235
- scitex/ai/layer/_Pass.py +0 -21
- scitex/ai/layer/__init__.py +0 -10
- scitex/ai/layer/_switch.py +0 -8
- scitex/ai/metrics/_bACC.py +0 -51
- scitex/ai/plt/_learning_curve.py +0 -194
- scitex/ai/plt/_optuna_study.py +0 -111
- scitex/ai/plt/aucs/__init__.py +0 -2
- scitex/ai/plt/aucs/example.py +0 -60
- scitex/ai/plt/aucs/pre_rec_auc.py +0 -223
- scitex/ai/plt/aucs/roc_auc.py +0 -246
- scitex/ai/sampling/undersample.py +0 -29
- scitex/db/_SQLite3.py +0 -2136
- scitex/db/_SQLite3Mixins/_BlobMixin.py +0 -229
- scitex/gen/_close.py +0 -222
- scitex/gen/_start.py +0 -451
- scitex/general/__init__.py +0 -5
- scitex/io/_load_modules/_db.py +0 -24
- scitex/life/__init__.py +0 -10
- scitex/life/_monitor_rain.py +0 -49
- scitex/reproduce/_fix_seeds.py +0 -45
- scitex/res/__init__.py +0 -5
- scitex/scholar/_local_search.py +0 -454
- scitex/scholar/_paper.py +0 -244
- scitex/scholar/_pdf_downloader.py +0 -325
- scitex/scholar/_search.py +0 -393
- scitex/scholar/_vector_search.py +0 -370
- scitex/scholar/_web_sources.py +0 -457
- scitex/stats/desc/__init__.py +0 -40
- scitex-2.0.0.dist-info/METADATA +0 -307
- scitex-2.0.0.dist-info/RECORD +0 -572
- scitex-2.0.0.dist-info/licenses/LICENSE +0 -7
- /scitex/ai/{act → activation}/__init__.py +0 -0
- /scitex/ai/{act → activation}/_define.py +0 -0
- /scitex/ai/{early_stopping.py → training/_EarlyStopping.py} +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ImportExportMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_IndexMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_RowMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TableMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/__init__.py +0 -0
- /scitex/{stats → stats_v01}/_calc_partial_corr.py +0 -0
- /scitex/{stats → stats_v01}/_corr_test_multi.py +0 -0
- /scitex/{stats → stats_v01}/_corr_test_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_describe_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_multiple_corrections.py +0 -0
- /scitex/{stats → stats_v01}/_nan_stats.py +0 -0
- /scitex/{stats → stats_v01}/_p2stars_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_statistical_tests.py +0 -0
- /scitex/{stats/desc/_describe.py → stats_v01/desc/_describe_v01-20250920_145731.py} +0 -0
- /scitex/{stats/desc/_real.py → stats_v01/desc/_real_v01-20250920_145731.py} +0 -0
- /scitex/{stats → stats_v01}/multiple/__init__.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_bonferroni_correction.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_fdr_correction.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_multicompair.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test_multi.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test_single.py +0 -0
- /scitex/{stats → stats_v01}/tests/__init__.py +0 -0
- /scitex/{stats → stats_v01}/tests/_brunner_munzel_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/_nocorrelation_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/_smirnov_grubbs.py +0 -0
- {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-09-10 13:20:00 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/SciTeX-Code/src/scitex/db/_inspect_optimized.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
import os
|
|
8
|
+
__FILE__ = __file__
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import sqlite3
|
|
13
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
14
|
+
from contextlib import contextmanager
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class OptimizedInspector:
|
|
18
|
+
"""Optimized database inspector with connection reuse and efficient queries."""
|
|
19
|
+
|
|
20
|
+
def __init__(self, db_path: str):
|
|
21
|
+
if not os.path.exists(db_path):
|
|
22
|
+
raise FileNotFoundError(f"Database file not found: {db_path}")
|
|
23
|
+
self.db_path = db_path
|
|
24
|
+
self._conn = None
|
|
25
|
+
self._cursor = None
|
|
26
|
+
|
|
27
|
+
@contextmanager
|
|
28
|
+
def connection(self):
|
|
29
|
+
"""Context manager for database connection reuse."""
|
|
30
|
+
if self._conn is None:
|
|
31
|
+
self._conn = sqlite3.connect(self.db_path)
|
|
32
|
+
self._conn.row_factory = sqlite3.Row # Enable column access by name
|
|
33
|
+
self._cursor = self._conn.cursor()
|
|
34
|
+
try:
|
|
35
|
+
yield self._cursor
|
|
36
|
+
except Exception:
|
|
37
|
+
self._conn.rollback()
|
|
38
|
+
raise
|
|
39
|
+
|
|
40
|
+
def close(self):
|
|
41
|
+
"""Close the database connection."""
|
|
42
|
+
if self._conn:
|
|
43
|
+
self._conn.close()
|
|
44
|
+
self._conn = None
|
|
45
|
+
self._cursor = None
|
|
46
|
+
|
|
47
|
+
def __enter__(self):
|
|
48
|
+
return self
|
|
49
|
+
|
|
50
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
51
|
+
self.close()
|
|
52
|
+
|
|
53
|
+
def get_table_names(self) -> List[str]:
|
|
54
|
+
"""Retrieves all table names from the database."""
|
|
55
|
+
with self.connection() as cursor:
|
|
56
|
+
cursor.execute(
|
|
57
|
+
"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"
|
|
58
|
+
)
|
|
59
|
+
return [row[0] for row in cursor.fetchall()]
|
|
60
|
+
|
|
61
|
+
def get_table_info_batch(self, table_names: List[str]) -> Dict[str, List[Dict]]:
|
|
62
|
+
"""Get table info for multiple tables in one go.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
Dict mapping table_name to list of column info dictionaries
|
|
66
|
+
"""
|
|
67
|
+
table_info = {}
|
|
68
|
+
|
|
69
|
+
with self.connection() as cursor:
|
|
70
|
+
for table_name in table_names:
|
|
71
|
+
# Get column info
|
|
72
|
+
cursor.execute(f"PRAGMA table_info({table_name})")
|
|
73
|
+
columns = cursor.fetchall()
|
|
74
|
+
|
|
75
|
+
# Get primary key info more efficiently
|
|
76
|
+
cursor.execute(f"""
|
|
77
|
+
SELECT name FROM pragma_table_info('{table_name}')
|
|
78
|
+
WHERE pk > 0
|
|
79
|
+
""")
|
|
80
|
+
pk_columns = {row[0] for row in cursor.fetchall()}
|
|
81
|
+
|
|
82
|
+
# Build column info
|
|
83
|
+
col_info = []
|
|
84
|
+
for col in columns:
|
|
85
|
+
col_dict = {
|
|
86
|
+
'cid': col[0],
|
|
87
|
+
'name': col[1],
|
|
88
|
+
'type': col[2],
|
|
89
|
+
'notnull': col[3],
|
|
90
|
+
'default': col[4],
|
|
91
|
+
'pk': col[1] in pk_columns
|
|
92
|
+
}
|
|
93
|
+
col_info.append(col_dict)
|
|
94
|
+
|
|
95
|
+
table_info[table_name] = col_info
|
|
96
|
+
|
|
97
|
+
return table_info
|
|
98
|
+
|
|
99
|
+
def get_table_stats_batch(self, table_names: List[str],
|
|
100
|
+
sample_size: int = 5,
|
|
101
|
+
skip_count: bool = False) -> Dict[str, Dict]:
|
|
102
|
+
"""Get statistics for multiple tables efficiently.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
table_names: List of table names to inspect
|
|
106
|
+
sample_size: Number of sample rows to retrieve
|
|
107
|
+
skip_count: If True, skip the COUNT(*) query for performance
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
Dict mapping table_name to statistics dictionary
|
|
111
|
+
"""
|
|
112
|
+
stats = {}
|
|
113
|
+
|
|
114
|
+
with self.connection() as cursor:
|
|
115
|
+
for table_name in table_names:
|
|
116
|
+
table_stats = {}
|
|
117
|
+
|
|
118
|
+
# Get sample data
|
|
119
|
+
cursor.execute(f"SELECT * FROM {table_name} LIMIT {sample_size}")
|
|
120
|
+
table_stats['columns'] = [desc[0] for desc in cursor.description]
|
|
121
|
+
table_stats['sample_data'] = cursor.fetchall()
|
|
122
|
+
|
|
123
|
+
# Get row count (can be slow for large tables)
|
|
124
|
+
if not skip_count:
|
|
125
|
+
# Use approximate count if available
|
|
126
|
+
cursor.execute(f"""
|
|
127
|
+
SELECT COUNT(*) FROM (
|
|
128
|
+
SELECT 1 FROM {table_name} LIMIT 100000
|
|
129
|
+
)
|
|
130
|
+
""")
|
|
131
|
+
approx_count = cursor.fetchone()[0]
|
|
132
|
+
|
|
133
|
+
if approx_count < 100000:
|
|
134
|
+
# Small table, get exact count
|
|
135
|
+
cursor.execute(f"SELECT COUNT(*) FROM {table_name}")
|
|
136
|
+
table_stats['row_count'] = cursor.fetchone()[0]
|
|
137
|
+
table_stats['is_approximate'] = False
|
|
138
|
+
else:
|
|
139
|
+
# Large table, use approximate count
|
|
140
|
+
table_stats['row_count'] = f">{approx_count:,}"
|
|
141
|
+
table_stats['is_approximate'] = True
|
|
142
|
+
else:
|
|
143
|
+
table_stats['row_count'] = "Not counted"
|
|
144
|
+
table_stats['is_approximate'] = None
|
|
145
|
+
|
|
146
|
+
stats[table_name] = table_stats
|
|
147
|
+
|
|
148
|
+
return stats
|
|
149
|
+
|
|
150
|
+
def inspect_fast(
|
|
151
|
+
self,
|
|
152
|
+
table_names: Optional[List[str]] = None,
|
|
153
|
+
sample_size: int = 5,
|
|
154
|
+
skip_count: bool = False,
|
|
155
|
+
skip_blob_content: bool = True,
|
|
156
|
+
verbose: bool = True,
|
|
157
|
+
) -> List[Dict[str, Any]]:
|
|
158
|
+
"""Fast inspection of database tables.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
table_names: Tables to inspect (None for all)
|
|
162
|
+
sample_size: Number of sample rows
|
|
163
|
+
skip_count: Skip row counting for performance
|
|
164
|
+
skip_blob_content: Don't load BLOB content
|
|
165
|
+
verbose: Print results
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
List of inspection results
|
|
169
|
+
"""
|
|
170
|
+
if table_names is None:
|
|
171
|
+
table_names = self.get_table_names()
|
|
172
|
+
|
|
173
|
+
# Batch operations for efficiency
|
|
174
|
+
table_info = self.get_table_info_batch(table_names)
|
|
175
|
+
table_stats = self.get_table_stats_batch(
|
|
176
|
+
table_names, sample_size, skip_count
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
results = []
|
|
180
|
+
for table_name in table_names:
|
|
181
|
+
result = {
|
|
182
|
+
'table_name': table_name,
|
|
183
|
+
'columns': table_info[table_name],
|
|
184
|
+
'row_count': table_stats[table_name]['row_count'],
|
|
185
|
+
'is_approximate': table_stats[table_name]['is_approximate'],
|
|
186
|
+
'sample_data': []
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Format sample data
|
|
190
|
+
for row in table_stats[table_name]['sample_data']:
|
|
191
|
+
formatted_row = {}
|
|
192
|
+
for i, col_name in enumerate(table_stats[table_name]['columns']):
|
|
193
|
+
value = row[i]
|
|
194
|
+
if isinstance(value, bytes):
|
|
195
|
+
if skip_blob_content:
|
|
196
|
+
formatted_row[col_name] = f"<BLOB {len(value)} bytes>"
|
|
197
|
+
else:
|
|
198
|
+
formatted_row[col_name] = value
|
|
199
|
+
else:
|
|
200
|
+
formatted_row[col_name] = value
|
|
201
|
+
result['sample_data'].append(formatted_row)
|
|
202
|
+
|
|
203
|
+
results.append(result)
|
|
204
|
+
|
|
205
|
+
if verbose:
|
|
206
|
+
self._print_table_info(result)
|
|
207
|
+
|
|
208
|
+
return results
|
|
209
|
+
|
|
210
|
+
def _print_table_info(self, result: Dict):
|
|
211
|
+
"""Pretty print table information."""
|
|
212
|
+
print(f"\n{'='*60}")
|
|
213
|
+
print(f"Table: {result['table_name']}")
|
|
214
|
+
print(f"Rows: {result['row_count']}" +
|
|
215
|
+
(" (approximate)" if result['is_approximate'] else ""))
|
|
216
|
+
print(f"-"*60)
|
|
217
|
+
|
|
218
|
+
# Print column info
|
|
219
|
+
print("Columns:")
|
|
220
|
+
for col in result['columns']:
|
|
221
|
+
pk_marker = " [PK]" if col['pk'] else ""
|
|
222
|
+
nn_marker = " NOT NULL" if col['notnull'] else ""
|
|
223
|
+
print(f" {col['name']}: {col['type']}{pk_marker}{nn_marker}")
|
|
224
|
+
|
|
225
|
+
# Print sample data
|
|
226
|
+
if result['sample_data']:
|
|
227
|
+
print(f"\nSample data ({len(result['sample_data'])} rows):")
|
|
228
|
+
# Get column names that aren't metadata columns
|
|
229
|
+
data_cols = [c for c in result['sample_data'][0].keys()
|
|
230
|
+
if not c.endswith(('_dtype', '_shape', '_compressed'))]
|
|
231
|
+
|
|
232
|
+
# Print header
|
|
233
|
+
header = " | ".join(f"{col[:15]:<15}" for col in data_cols[:5])
|
|
234
|
+
print(f" {header}")
|
|
235
|
+
print(f" {'-'*len(header)}")
|
|
236
|
+
|
|
237
|
+
# Print rows
|
|
238
|
+
for row in result['sample_data'][:3]:
|
|
239
|
+
values = []
|
|
240
|
+
for col in data_cols[:5]:
|
|
241
|
+
val = str(row.get(col, ''))
|
|
242
|
+
if len(val) > 15:
|
|
243
|
+
val = val[:12] + "..."
|
|
244
|
+
values.append(f"{val:<15}")
|
|
245
|
+
print(f" {' | '.join(values)}")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def inspect_optimized(
|
|
249
|
+
lpath_db: str,
|
|
250
|
+
table_names: Optional[List[str]] = None,
|
|
251
|
+
sample_size: int = 5,
|
|
252
|
+
skip_count: bool = False,
|
|
253
|
+
verbose: bool = True,
|
|
254
|
+
) -> List[Dict[str, Any]]:
|
|
255
|
+
"""
|
|
256
|
+
Optimized database inspection.
|
|
257
|
+
|
|
258
|
+
Example:
|
|
259
|
+
>>> inspect_optimized('path/to/database.db')
|
|
260
|
+
>>> inspect_optimized('path/to/database.db', ['table1'], skip_count=True)
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
lpath_db: Path to the SQLite database file
|
|
264
|
+
table_names: List of table names to inspect (None for all)
|
|
265
|
+
sample_size: Number of sample rows to retrieve
|
|
266
|
+
skip_count: Skip row counting for large tables (much faster)
|
|
267
|
+
verbose: Print inspection results
|
|
268
|
+
|
|
269
|
+
Returns:
|
|
270
|
+
List of inspection results
|
|
271
|
+
"""
|
|
272
|
+
with OptimizedInspector(lpath_db) as inspector:
|
|
273
|
+
return inspector.inspect_fast(
|
|
274
|
+
table_names=table_names,
|
|
275
|
+
sample_size=sample_size,
|
|
276
|
+
skip_count=skip_count,
|
|
277
|
+
verbose=verbose
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
# Performance comparison example:
|
|
282
|
+
if __name__ == "__main__":
|
|
283
|
+
import time
|
|
284
|
+
import sys
|
|
285
|
+
|
|
286
|
+
if len(sys.argv) > 1:
|
|
287
|
+
db_path = sys.argv[1]
|
|
288
|
+
|
|
289
|
+
print("Testing optimized version...")
|
|
290
|
+
start = time.time()
|
|
291
|
+
results = inspect_optimized(db_path, skip_count=True, verbose=False)
|
|
292
|
+
print(f"Optimized version took: {time.time() - start:.2f} seconds")
|
|
293
|
+
print(f"Inspected {len(results)} tables")
|
|
294
|
+
|
|
295
|
+
# Show first table info
|
|
296
|
+
if results:
|
|
297
|
+
print(f"\nFirst table: {results[0]['table_name']}")
|
|
298
|
+
print(f"Columns: {len(results[0]['columns'])}")
|
|
299
|
+
print(f"Sample rows: {len(results[0]['sample_data'])}")
|
|
300
|
+
|
|
301
|
+
# EOF
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
# Time-stamp: "2024-11-25 02:00:06 (ywatanabe)"
|
|
4
|
-
# File: ./scitex_repo/src/scitex/db/_PostgreSQL.py
|
|
4
|
+
# File: ./scitex_repo/src/scitex/db/_postgresql/_PostgreSQL.py
|
|
5
5
|
|
|
6
|
-
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/db/_PostgreSQL.py"
|
|
6
|
+
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/db/_postgresql/_PostgreSQL.py"
|
|
7
7
|
|
|
8
8
|
from typing import List, Optional
|
|
9
9
|
|
|
10
|
-
from
|
|
10
|
+
from ...str import printc as _printc
|
|
11
11
|
from typing import Optional
|
|
12
12
|
import psycopg2
|
|
13
13
|
from ._PostgreSQLMixins._BackupMixin import _BackupMixin
|
|
@@ -9,7 +9,7 @@ import psycopg2
|
|
|
9
9
|
import numpy as np
|
|
10
10
|
from typing import Any as _Any
|
|
11
11
|
from typing import Dict, List, Optional, Tuple, Union
|
|
12
|
-
from
|
|
12
|
+
from ..._BaseMixins._BaseBlobMixin import _BaseBlobMixin
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class _BlobMixin(_BaseBlobMixin):
|
|
@@ -10,7 +10,7 @@ THIS_FILE = (
|
|
|
10
10
|
from typing import Any, Tuple
|
|
11
11
|
import psycopg2
|
|
12
12
|
|
|
13
|
-
from
|
|
13
|
+
from ..._BaseMixins._BaseConnectionMixin import _BaseConnectionMixin
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class _ConnectionMixin(_BaseConnectionMixin):
|
|
@@ -13,7 +13,7 @@ from typing import ContextManager, Dict, List, Optional
|
|
|
13
13
|
|
|
14
14
|
import psycopg2
|
|
15
15
|
|
|
16
|
-
from
|
|
16
|
+
from ..._BaseMixins._BaseMaintenanceMixin import _BaseMaintenanceMixin
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class _MaintenanceMixin(_BaseMaintenanceMixin):
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-09-11 07:57:49 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/db/_sqlite3/_SQLite3.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
import os
|
|
8
|
+
__FILE__ = __file__
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import warnings
|
|
13
|
+
from typing import List, Optional
|
|
14
|
+
|
|
15
|
+
from ...str import printc as _printc
|
|
16
|
+
from ._SQLite3Mixins._ArrayMixin import _ArrayMixin
|
|
17
|
+
from ._SQLite3Mixins._BatchMixin import _BatchMixin
|
|
18
|
+
from ._SQLite3Mixins._BlobMixin import _BlobMixin
|
|
19
|
+
from ._SQLite3Mixins._ColumnMixin import _ColumnMixin
|
|
20
|
+
from ._SQLite3Mixins._ConnectionMixin import _ConnectionMixin
|
|
21
|
+
from ._SQLite3Mixins._GitMixin import _GitMixin
|
|
22
|
+
from ._SQLite3Mixins._ImportExportMixin import _ImportExportMixin
|
|
23
|
+
from ._SQLite3Mixins._IndexMixin import _IndexMixin
|
|
24
|
+
from ._SQLite3Mixins._MaintenanceMixin import _MaintenanceMixin
|
|
25
|
+
from ._SQLite3Mixins._QueryMixin import _QueryMixin
|
|
26
|
+
from ._SQLite3Mixins._RowMixin import _RowMixin
|
|
27
|
+
from ._SQLite3Mixins._TableMixin import _TableMixin
|
|
28
|
+
from ._SQLite3Mixins._TransactionMixin import _TransactionMixin
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class SQLite3(
|
|
32
|
+
_ArrayMixin,
|
|
33
|
+
_ConnectionMixin,
|
|
34
|
+
_QueryMixin,
|
|
35
|
+
_TransactionMixin,
|
|
36
|
+
_ColumnMixin,
|
|
37
|
+
_TableMixin,
|
|
38
|
+
_IndexMixin,
|
|
39
|
+
_RowMixin,
|
|
40
|
+
_BatchMixin,
|
|
41
|
+
_BlobMixin,
|
|
42
|
+
_ImportExportMixin,
|
|
43
|
+
_MaintenanceMixin,
|
|
44
|
+
_GitMixin,
|
|
45
|
+
):
|
|
46
|
+
"""SQLite database manager with automatic metadata handling, numpy array storage, and compression.
|
|
47
|
+
|
|
48
|
+
This class provides a comprehensive interface for SQLite database operations with
|
|
49
|
+
automatic compression, thread-safe operations, and specialized numpy array handling.
|
|
50
|
+
|
|
51
|
+
Features:
|
|
52
|
+
- Automatic compression for BLOB data (70-90% reduction)
|
|
53
|
+
- Thread-safe operations with proper connection management
|
|
54
|
+
- Metadata handling for BLOB columns
|
|
55
|
+
- Batch processing support
|
|
56
|
+
- Context manager support for proper resource cleanup
|
|
57
|
+
|
|
58
|
+
Examples:
|
|
59
|
+
Basic usage with context manager (recommended):
|
|
60
|
+
|
|
61
|
+
>>> with SQLite3("data.db", compress_by_default=True) as db:
|
|
62
|
+
... db.create_table("experiments", {"id": "INTEGER PRIMARY KEY", "data": "BLOB"})
|
|
63
|
+
... data = np.random.random((1000, 100))
|
|
64
|
+
... db.save_array("experiments", data, column="data", additional_columns={"id": 1})
|
|
65
|
+
|
|
66
|
+
Array storage and retrieval:
|
|
67
|
+
|
|
68
|
+
>>> with SQLite3("data.db") as db:
|
|
69
|
+
... # Save numpy array
|
|
70
|
+
... db.save_array(
|
|
71
|
+
... table_name="measurements",
|
|
72
|
+
... data=np.random.random((1000, 100)),
|
|
73
|
+
... column="data",
|
|
74
|
+
... additional_columns={"name": "experiment_1", "timestamp": 1234567890}
|
|
75
|
+
... )
|
|
76
|
+
... # Load array
|
|
77
|
+
... loaded = db.load_array("measurements", "data", where="name = 'experiment_1'")
|
|
78
|
+
|
|
79
|
+
Generic object storage:
|
|
80
|
+
|
|
81
|
+
>>> with SQLite3("data.db") as db:
|
|
82
|
+
... db.save_blob(
|
|
83
|
+
... table_name="objects",
|
|
84
|
+
... data={"weights": array, "params": {"lr": 0.001}},
|
|
85
|
+
... key="model_v1"
|
|
86
|
+
... )
|
|
87
|
+
... loaded_obj = db.load_blob("objects", key="model_v1")
|
|
88
|
+
|
|
89
|
+
Notes:
|
|
90
|
+
- Always use context manager (with statement) for proper resource cleanup
|
|
91
|
+
- BLOB columns automatically get metadata columns: {column}_dtype, {column}_shape, {column}_compressed
|
|
92
|
+
- Compression is enabled by default for arrays > 1KB
|
|
93
|
+
- Thread-safe operations are supported
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
def __init__(
|
|
97
|
+
self,
|
|
98
|
+
db_path: str,
|
|
99
|
+
use_temp: bool = False,
|
|
100
|
+
compress_by_default: bool = False,
|
|
101
|
+
autocommit: bool = False,
|
|
102
|
+
):
|
|
103
|
+
"""Initialize SQLite database manager.
|
|
104
|
+
|
|
105
|
+
Parameters
|
|
106
|
+
----------
|
|
107
|
+
db_path : str
|
|
108
|
+
Path to the SQLite database file
|
|
109
|
+
use_temp : bool, optional
|
|
110
|
+
Whether to use a temporary copy of the database, by default False
|
|
111
|
+
compress_by_default : bool, optional
|
|
112
|
+
Whether to compress BLOB data by default when not explicitly specified, by default False
|
|
113
|
+
autocommit : bool, optional
|
|
114
|
+
Whether to automatically commit transactions, by default False
|
|
115
|
+
|
|
116
|
+
Warnings
|
|
117
|
+
--------
|
|
118
|
+
UserWarning
|
|
119
|
+
If not used with context manager, warns about potential resource leaks
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
if not os.path.exists(db_path):
|
|
123
|
+
os.makedirs(os.path.dirname(db_path), exist_ok=True)
|
|
124
|
+
|
|
125
|
+
_ConnectionMixin.__init__(self, db_path, use_temp)
|
|
126
|
+
self.compress_by_default = compress_by_default
|
|
127
|
+
self.autocommit = autocommit
|
|
128
|
+
self._context_manager_used = False
|
|
129
|
+
|
|
130
|
+
def __enter__(self):
|
|
131
|
+
"""Enter context manager."""
|
|
132
|
+
self._context_manager_used = True
|
|
133
|
+
return self
|
|
134
|
+
|
|
135
|
+
def _check_context_manager(self):
|
|
136
|
+
if not self._context_manager_used:
|
|
137
|
+
raise RuntimeError(
|
|
138
|
+
"SQLite3 must be used with context manager: 'with SQLite3(...) as db:'"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
142
|
+
"""Exit context manager and ensure proper cleanup."""
|
|
143
|
+
self.close()
|
|
144
|
+
|
|
145
|
+
def __del__(self):
|
|
146
|
+
"""Destructor with context manager usage warning."""
|
|
147
|
+
if (
|
|
148
|
+
hasattr(self, "_context_manager_used")
|
|
149
|
+
and not self._context_manager_used
|
|
150
|
+
):
|
|
151
|
+
warnings.warn(
|
|
152
|
+
"SQLite3 instance was not used with context manager. "
|
|
153
|
+
"Use 'with SQLite3(...) as db:' to ensure proper resource cleanup.",
|
|
154
|
+
UserWarning,
|
|
155
|
+
stacklevel=2,
|
|
156
|
+
)
|
|
157
|
+
if hasattr(self, "close"):
|
|
158
|
+
self.close()
|
|
159
|
+
|
|
160
|
+
def __call__(
|
|
161
|
+
self,
|
|
162
|
+
return_summary=False,
|
|
163
|
+
print_summary=True,
|
|
164
|
+
table_names: Optional[List[str]] = None,
|
|
165
|
+
verbose: bool = True,
|
|
166
|
+
limit: int = 5,
|
|
167
|
+
):
|
|
168
|
+
"""Display database summary information.
|
|
169
|
+
|
|
170
|
+
Parameters
|
|
171
|
+
----------
|
|
172
|
+
return_summary : bool, optional
|
|
173
|
+
Whether to return summary dict, by default False
|
|
174
|
+
print_summary : bool, optional
|
|
175
|
+
Whether to print summary to console, by default True
|
|
176
|
+
table_names : Optional[List[str]], optional
|
|
177
|
+
Specific table names to summarize, by default None (all tables)
|
|
178
|
+
verbose : bool, optional
|
|
179
|
+
Whether to show detailed information, by default True
|
|
180
|
+
limit : int, optional
|
|
181
|
+
Maximum number of rows to display per table, by default 5
|
|
182
|
+
|
|
183
|
+
Returns
|
|
184
|
+
-------
|
|
185
|
+
dict or None
|
|
186
|
+
Summary dictionary if return_summary=True, else None
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
summary = self.get_summaries(
|
|
190
|
+
table_names=table_names,
|
|
191
|
+
verbose=verbose,
|
|
192
|
+
limit=limit,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
if print_summary:
|
|
196
|
+
for k, v in summary.items():
|
|
197
|
+
_printc(f"{k}\n{v}")
|
|
198
|
+
|
|
199
|
+
if return_summary:
|
|
200
|
+
return summary
|
|
201
|
+
|
|
202
|
+
@property
|
|
203
|
+
def summary(self):
|
|
204
|
+
"""Quick access to database summary."""
|
|
205
|
+
self()
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
BaseSQLiteDB = SQLite3
|
|
209
|
+
|
|
210
|
+
# EOF
|