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
scitex/str/_parse.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
#
|
|
4
|
-
# File:
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
# Timestamp: "2025-07-16 10:14:44 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/str/_parse.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = __file__
|
|
8
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
9
|
+
# ----------------------------------------
|
|
7
10
|
|
|
8
11
|
import re
|
|
9
12
|
from typing import Dict, Union
|
|
@@ -12,16 +15,16 @@ from ..dict._DotDict import DotDict as _DotDict
|
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
def parse(
|
|
15
|
-
|
|
18
|
+
string_or_fstring: str, fstring_or_string: str
|
|
16
19
|
) -> Union[Dict[str, Union[str, int]], str]:
|
|
17
20
|
"""
|
|
18
21
|
Bidirectional parser that attempts parsing in both directions.
|
|
19
22
|
|
|
20
23
|
Parameters
|
|
21
24
|
----------
|
|
22
|
-
|
|
25
|
+
string_or_fstring : str
|
|
23
26
|
Either the input string to parse or the pattern
|
|
24
|
-
|
|
27
|
+
fstring_or_string : str
|
|
25
28
|
Either the pattern to match against or the input string
|
|
26
29
|
|
|
27
30
|
Returns
|
|
@@ -45,14 +48,14 @@ def parse(
|
|
|
45
48
|
{'id': '23_002'}
|
|
46
49
|
"""
|
|
47
50
|
# try:
|
|
48
|
-
# parsed = _parse(
|
|
51
|
+
# parsed = _parse(string_or_fstring, fstring_or_string)
|
|
49
52
|
# if parsed:
|
|
50
53
|
# return parsed
|
|
51
54
|
# except Exception as e:
|
|
52
55
|
# print(e)
|
|
53
56
|
|
|
54
57
|
# try:
|
|
55
|
-
# parsed = _parse(
|
|
58
|
+
# parsed = _parse(fstring_or_string, string_or_fstring)
|
|
56
59
|
# if parsed:
|
|
57
60
|
# return parsed
|
|
58
61
|
# except Exception as e:
|
|
@@ -61,7 +64,7 @@ def parse(
|
|
|
61
64
|
|
|
62
65
|
# Try first direction
|
|
63
66
|
try:
|
|
64
|
-
result = _parse(
|
|
67
|
+
result = _parse(string_or_fstring, fstring_or_string)
|
|
65
68
|
if result:
|
|
66
69
|
return result
|
|
67
70
|
except ValueError as e:
|
|
@@ -70,14 +73,16 @@ def parse(
|
|
|
70
73
|
|
|
71
74
|
# Try reverse direction
|
|
72
75
|
try:
|
|
73
|
-
result = _parse(
|
|
76
|
+
result = _parse(fstring_or_string, string_or_fstring)
|
|
74
77
|
if result:
|
|
75
78
|
return result
|
|
76
79
|
except ValueError as e:
|
|
77
80
|
errors.append(str(e))
|
|
78
81
|
# logging.warning(f"Second attempt failed: {e}")
|
|
79
82
|
|
|
80
|
-
raise ValueError(
|
|
83
|
+
raise ValueError(
|
|
84
|
+
f"Parsing failed in both directions: {' | '.join(errors)}"
|
|
85
|
+
)
|
|
81
86
|
|
|
82
87
|
|
|
83
88
|
def _parse(string: str, expression: str) -> Dict[str, Union[str, int]]:
|
|
@@ -101,43 +106,47 @@ def _parse(string: str, expression: str) -> Dict[str, Union[str, int]]:
|
|
|
101
106
|
ValueError
|
|
102
107
|
If the string format does not match the given expression
|
|
103
108
|
If duplicate placeholders have inconsistent values
|
|
109
|
+
"""
|
|
110
|
+
# Clean up inputs
|
|
111
|
+
string = string.replace("/./", "/")
|
|
112
|
+
expression = expression.strip()
|
|
113
|
+
if expression.startswith('f"') and expression.endswith('"'):
|
|
114
|
+
expression = expression[2:-1]
|
|
115
|
+
elif expression.startswith('"') and expression.endswith('"'):
|
|
116
|
+
expression = expression[1:-1]
|
|
117
|
+
elif expression.startswith("'") and expression.endswith("'"):
|
|
118
|
+
expression = expression[1:-1]
|
|
104
119
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
>>> string = "./data/mat_tmp/Patient_23_002/Data_2010_07_31/Hour_12/UTC_12_02_00.mat"
|
|
108
|
-
>>> expression = "./data/mat_tmp/Patient_{patient_id}/Data_{YYYY}_{MM}_{DD}/Hour_{HH}/UTC_{HH}_{mm}_00.mat"
|
|
109
|
-
>>> parse_str(string, expression)
|
|
110
|
-
# {'patient_id': '23_002', 'YYYY': 2010, 'MM': 7, 'DD': 31, 'HH': 12, 'mm': 2}
|
|
120
|
+
# Remove format specifiers from placeholders
|
|
121
|
+
expression_clean = re.sub(r"{(\w+):[^}]+}", r"{\1}", expression)
|
|
111
122
|
|
|
112
|
-
#
|
|
113
|
-
|
|
114
|
-
>>> expression = "./data/mat_tmp/Patient_{patient_id}/Data_{YYYY}_{MM}_{DD}/Hour_{HH}/UTC_{HH}_{mm}_00.mat"
|
|
115
|
-
>>> parse_str(string, expression)
|
|
116
|
-
# ValueError: Inconsistent values for placeholder 'HH'
|
|
117
|
-
"""
|
|
123
|
+
# Extract placeholder names
|
|
124
|
+
placeholders = re.findall(r"{(\w+)}", expression_clean)
|
|
118
125
|
|
|
119
|
-
#
|
|
120
|
-
|
|
121
|
-
expression = expression.replace('f"', "").replace('"', "")
|
|
126
|
+
# Create regex pattern
|
|
127
|
+
pattern = re.sub(r"{(\w+)}", r"([^/]+)", expression_clean)
|
|
122
128
|
|
|
123
|
-
placeholders = re.findall(r"{(\w+)}", expression)
|
|
124
|
-
pattern = re.sub(r"{(\w+)}", "([^/]+)", expression)
|
|
125
129
|
match = re.match(pattern, string)
|
|
126
130
|
|
|
127
131
|
if not match:
|
|
128
132
|
raise ValueError(
|
|
129
133
|
f"String format does not match expression: {string} vs {expression}"
|
|
130
134
|
)
|
|
131
|
-
# logging.warning(f"String format does not match the given expression. \nString input: {string}\nExpression: {expression}")
|
|
132
|
-
# return {}
|
|
133
135
|
|
|
134
136
|
groups = match.groups()
|
|
135
137
|
result = {}
|
|
136
138
|
|
|
137
139
|
for placeholder, value in zip(placeholders, groups):
|
|
138
140
|
if placeholder in result and result[placeholder] != value:
|
|
139
|
-
raise ValueError(
|
|
140
|
-
|
|
141
|
+
raise ValueError(
|
|
142
|
+
f"Inconsistent values for placeholder '{placeholder}'"
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# Try to convert to int if it looks like a number
|
|
146
|
+
if value.lstrip("-").isdigit():
|
|
147
|
+
result[placeholder] = int(value)
|
|
148
|
+
else:
|
|
149
|
+
result[placeholder] = value
|
|
141
150
|
|
|
142
151
|
return _DotDict(result)
|
|
143
152
|
|
|
@@ -145,14 +154,13 @@ def _parse(string: str, expression: str) -> Dict[str, Union[str, int]]:
|
|
|
145
154
|
if __name__ == "__main__":
|
|
146
155
|
string = "./data/mat_tmp/Patient_23_002/Data_2010_07_31/Hour_12/UTC_12_02_00.mat"
|
|
147
156
|
expression = "./data/mat_tmp/Patient_{patient_id}/Data_{YYYY}_{MM}_{DD}/Hour_{HH}/UTC_{HH}_{mm}_00.mat"
|
|
148
|
-
results =
|
|
157
|
+
results = parse(string, expression)
|
|
149
158
|
print(results)
|
|
150
159
|
|
|
151
160
|
# Inconsistent version
|
|
152
161
|
string = "./data/mat_tmp/Patient_23_002/Data_2010_07_31/Hour_12/UTC_99_99_00.mat"
|
|
153
162
|
expression = "./data/mat_tmp/Patient_{patient_id}/Data_{YYYY}_{MM}_{DD}/Hour_{HH}/UTC_{HH}_{mm}_00.mat"
|
|
154
|
-
results =
|
|
163
|
+
results = parse(string, expression) # this should raise error
|
|
155
164
|
print(results)
|
|
156
165
|
|
|
157
|
-
|
|
158
166
|
# EOF
|
scitex/str/_printc.py
CHANGED
|
@@ -4,9 +4,7 @@
|
|
|
4
4
|
# File: /ssh:sp:/home/ywatanabe/proj/SciTeX-Code/src/scitex/str/_printc.py
|
|
5
5
|
# ----------------------------------------
|
|
6
6
|
import os
|
|
7
|
-
__FILE__ =
|
|
8
|
-
"./src/scitex/str/_printc.py"
|
|
9
|
-
)
|
|
7
|
+
__FILE__ = __file__
|
|
10
8
|
__DIR__ = os.path.dirname(__FILE__)
|
|
11
9
|
# ----------------------------------------
|
|
12
10
|
# Time-stamp: "2024-11-24 17:01:23 (ywatanabe)"
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/template/__init__.py
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Template management for SciTeX projects.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .create_research import create_research, TEMPLATE_REPO_URL as RESEARCH_URL
|
|
10
|
+
from .create_pip_project import create_pip_project, TEMPLATE_REPO_URL as PIP_PROJECT_URL
|
|
11
|
+
from .create_singularity import create_singularity, TEMPLATE_REPO_URL as SINGULARITY_URL
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_available_templates_info():
|
|
15
|
+
"""
|
|
16
|
+
Get information about all available SciTeX project templates.
|
|
17
|
+
|
|
18
|
+
Returns
|
|
19
|
+
-------
|
|
20
|
+
list[dict]
|
|
21
|
+
List of template information dictionaries, each containing:
|
|
22
|
+
- id: Template identifier (used in code)
|
|
23
|
+
- name: Human-readable template name
|
|
24
|
+
- description: Template description
|
|
25
|
+
- github_url: GitHub repository URL
|
|
26
|
+
- use_case: When to use this template
|
|
27
|
+
|
|
28
|
+
Example
|
|
29
|
+
-------
|
|
30
|
+
>>> from scitex.template import get_available_templates_info
|
|
31
|
+
>>> templates = get_available_templates_info()
|
|
32
|
+
>>> for template in templates:
|
|
33
|
+
... print(f"{template['name']}: {template['description']}")
|
|
34
|
+
"""
|
|
35
|
+
return [
|
|
36
|
+
{
|
|
37
|
+
"id": "research",
|
|
38
|
+
"name": "Research Project",
|
|
39
|
+
"description": "Full scientific workflow structure for research projects",
|
|
40
|
+
"github_url": RESEARCH_URL,
|
|
41
|
+
"use_case": "Scientific research with data analysis, experiments, and paper writing",
|
|
42
|
+
"features": [
|
|
43
|
+
"scripts/ - Analysis and preprocessing scripts",
|
|
44
|
+
"data/ - Raw and processed data management",
|
|
45
|
+
"docs/ - Manuscripts, notes, and references",
|
|
46
|
+
"results/ - Analysis outputs and reports",
|
|
47
|
+
"config/ - Project configuration files",
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "pip_project",
|
|
52
|
+
"name": "Python Package",
|
|
53
|
+
"description": "Pip-installable Python package template",
|
|
54
|
+
"github_url": PIP_PROJECT_URL,
|
|
55
|
+
"use_case": "Creating distributable Python packages for PyPI",
|
|
56
|
+
"features": [
|
|
57
|
+
"src/ - Package source code",
|
|
58
|
+
"tests/ - Unit and integration tests",
|
|
59
|
+
"docs/ - Sphinx documentation",
|
|
60
|
+
"setup.py - Package configuration",
|
|
61
|
+
"CI/CD - GitHub Actions workflows",
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "singularity",
|
|
66
|
+
"name": "Singularity Container",
|
|
67
|
+
"description": "Container-based project with Singularity",
|
|
68
|
+
"github_url": SINGULARITY_URL,
|
|
69
|
+
"use_case": "Reproducible computational environments with containers",
|
|
70
|
+
"features": [
|
|
71
|
+
"Singularity definition files",
|
|
72
|
+
"Container build scripts",
|
|
73
|
+
"Environment specifications",
|
|
74
|
+
"Deployment configuration",
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
__all__ = [
|
|
81
|
+
"create_research",
|
|
82
|
+
"create_pip_project",
|
|
83
|
+
"create_singularity",
|
|
84
|
+
"get_available_templates_info",
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
# EOF
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/template/_create_project.py
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Base functionality for creating projects from template repositories.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
import re
|
|
11
|
+
import shutil
|
|
12
|
+
import subprocess
|
|
13
|
+
import tempfile
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
from scitex.logging import getLogger
|
|
18
|
+
|
|
19
|
+
logger = getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _copy_tree_skip_broken_symlinks(src: Path, dst: Path) -> None:
|
|
23
|
+
"""
|
|
24
|
+
Copy directory tree, skipping broken symlinks.
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
src : Path
|
|
29
|
+
Source directory
|
|
30
|
+
dst : Path
|
|
31
|
+
Destination directory
|
|
32
|
+
"""
|
|
33
|
+
dst.mkdir(parents=True, exist_ok=True)
|
|
34
|
+
|
|
35
|
+
for item in src.iterdir():
|
|
36
|
+
src_item = src / item.name
|
|
37
|
+
dst_item = dst / item.name
|
|
38
|
+
|
|
39
|
+
# Check if it's a symlink and if it's broken
|
|
40
|
+
if src_item.is_symlink():
|
|
41
|
+
try:
|
|
42
|
+
# Try to resolve the symlink
|
|
43
|
+
src_item.resolve(strict=True)
|
|
44
|
+
# If successful, copy it
|
|
45
|
+
if src_item.is_dir():
|
|
46
|
+
_copy_tree_skip_broken_symlinks(src_item, dst_item)
|
|
47
|
+
else:
|
|
48
|
+
shutil.copy2(src_item, dst_item)
|
|
49
|
+
except (OSError, FileNotFoundError):
|
|
50
|
+
# Broken symlink - skip it
|
|
51
|
+
logger.warning(f"Skipping broken symlink: {src_item}")
|
|
52
|
+
continue
|
|
53
|
+
elif src_item.is_dir():
|
|
54
|
+
_copy_tree_skip_broken_symlinks(src_item, dst_item)
|
|
55
|
+
else:
|
|
56
|
+
shutil.copy2(src_item, dst_item)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _rename_template_package(target_path: Path, project_name: str, template_package_name: str = "pip_project_template") -> None:
|
|
60
|
+
"""
|
|
61
|
+
Rename template package directories and update all references.
|
|
62
|
+
|
|
63
|
+
Parameters
|
|
64
|
+
----------
|
|
65
|
+
target_path : Path
|
|
66
|
+
Path to the project directory
|
|
67
|
+
project_name : str
|
|
68
|
+
New name for the project/package
|
|
69
|
+
template_package_name : str
|
|
70
|
+
Original template package name to be replaced
|
|
71
|
+
"""
|
|
72
|
+
# Rename directories
|
|
73
|
+
src_template_dir = target_path / "src" / template_package_name
|
|
74
|
+
tests_template_dir = target_path / "tests" / template_package_name
|
|
75
|
+
|
|
76
|
+
if src_template_dir.exists():
|
|
77
|
+
src_new_dir = target_path / "src" / project_name
|
|
78
|
+
logger.info(f"Renaming {src_template_dir} to {src_new_dir}")
|
|
79
|
+
src_template_dir.rename(src_new_dir)
|
|
80
|
+
|
|
81
|
+
if tests_template_dir.exists():
|
|
82
|
+
tests_new_dir = target_path / "tests" / project_name
|
|
83
|
+
logger.info(f"Renaming {tests_template_dir} to {tests_new_dir}")
|
|
84
|
+
tests_template_dir.rename(tests_new_dir)
|
|
85
|
+
|
|
86
|
+
# Update file contents
|
|
87
|
+
logger.info(f"Updating references from {template_package_name} to {project_name}")
|
|
88
|
+
|
|
89
|
+
# Files that typically contain package name references
|
|
90
|
+
files_to_update = [
|
|
91
|
+
target_path / "pyproject.toml",
|
|
92
|
+
target_path / "README.md",
|
|
93
|
+
target_path / "Makefile",
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
# Also update all Python files
|
|
97
|
+
for py_file in target_path.rglob("*.py"):
|
|
98
|
+
files_to_update.append(py_file)
|
|
99
|
+
|
|
100
|
+
for file_path in files_to_update:
|
|
101
|
+
if not file_path.exists() or file_path.is_dir():
|
|
102
|
+
continue
|
|
103
|
+
|
|
104
|
+
try:
|
|
105
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
106
|
+
content = f.read()
|
|
107
|
+
|
|
108
|
+
# Replace template package name with project name
|
|
109
|
+
updated_content = content.replace(template_package_name, project_name)
|
|
110
|
+
|
|
111
|
+
# Only write if content changed
|
|
112
|
+
if updated_content != content:
|
|
113
|
+
with open(file_path, "w", encoding="utf-8") as f:
|
|
114
|
+
f.write(updated_content)
|
|
115
|
+
logger.info(f"Updated references in {file_path.relative_to(target_path)}")
|
|
116
|
+
|
|
117
|
+
except Exception as e:
|
|
118
|
+
logger.warning(f"Failed to update {file_path}: {str(e)}")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def create_project(
|
|
122
|
+
project_name: str,
|
|
123
|
+
target_dir: Optional[str],
|
|
124
|
+
template_url: str,
|
|
125
|
+
template_name: str,
|
|
126
|
+
) -> bool:
|
|
127
|
+
"""
|
|
128
|
+
Generic function to create a project from a template repository.
|
|
129
|
+
|
|
130
|
+
Parameters
|
|
131
|
+
----------
|
|
132
|
+
project_name : str
|
|
133
|
+
Name of the new project
|
|
134
|
+
target_dir : str, optional
|
|
135
|
+
Directory where the project will be created. If None, uses current directory.
|
|
136
|
+
template_url : str
|
|
137
|
+
Git repository URL of the template
|
|
138
|
+
template_name : str
|
|
139
|
+
Name of the template (for logging purposes)
|
|
140
|
+
|
|
141
|
+
Returns
|
|
142
|
+
-------
|
|
143
|
+
bool
|
|
144
|
+
True if successful, False otherwise
|
|
145
|
+
|
|
146
|
+
Raises
|
|
147
|
+
------
|
|
148
|
+
FileExistsError
|
|
149
|
+
If the target project directory already exists
|
|
150
|
+
"""
|
|
151
|
+
try:
|
|
152
|
+
# Determine target directory
|
|
153
|
+
if target_dir is None:
|
|
154
|
+
target_dir = os.getcwd()
|
|
155
|
+
|
|
156
|
+
target_path = Path(target_dir) / project_name
|
|
157
|
+
|
|
158
|
+
# Check if target directory already exists
|
|
159
|
+
if target_path.exists():
|
|
160
|
+
logger.error(f"Directory already exists: {target_path}")
|
|
161
|
+
logger.error("Please choose a different project name or remove the existing directory")
|
|
162
|
+
return False
|
|
163
|
+
|
|
164
|
+
logger.info(f"Creating new project from {template_name}: {project_name}")
|
|
165
|
+
logger.info(f"Target directory: {target_path}")
|
|
166
|
+
|
|
167
|
+
# Create temporary directory for cloning
|
|
168
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
169
|
+
temp_path = Path(temp_dir) / "template"
|
|
170
|
+
|
|
171
|
+
logger.info(f"Cloning template from {template_url}")
|
|
172
|
+
|
|
173
|
+
# Clone the template repository
|
|
174
|
+
result = subprocess.run(
|
|
175
|
+
["git", "clone", template_url, str(temp_path)],
|
|
176
|
+
capture_output=True,
|
|
177
|
+
text=True,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
if result.returncode != 0:
|
|
181
|
+
logger.error(f"Failed to clone template: {result.stderr}")
|
|
182
|
+
return False
|
|
183
|
+
|
|
184
|
+
logger.info("Template cloned successfully")
|
|
185
|
+
|
|
186
|
+
# Remove .git directory from template to avoid conflicts
|
|
187
|
+
git_dir = temp_path / ".git"
|
|
188
|
+
if git_dir.exists():
|
|
189
|
+
shutil.rmtree(git_dir)
|
|
190
|
+
logger.info("Removed template .git directory")
|
|
191
|
+
|
|
192
|
+
# Copy template to target location
|
|
193
|
+
logger.info(f"Copying template to {target_path}")
|
|
194
|
+
_copy_tree_skip_broken_symlinks(temp_path, target_path)
|
|
195
|
+
|
|
196
|
+
logger.info("Template copied successfully")
|
|
197
|
+
|
|
198
|
+
# Rename template package and update references
|
|
199
|
+
logger.info("Customizing template for project")
|
|
200
|
+
_rename_template_package(target_path, project_name)
|
|
201
|
+
|
|
202
|
+
# Initialize new git repository
|
|
203
|
+
logger.info("Initializing new git repository")
|
|
204
|
+
result = subprocess.run(
|
|
205
|
+
["git", "init"],
|
|
206
|
+
cwd=str(target_path),
|
|
207
|
+
capture_output=True,
|
|
208
|
+
text=True,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
if result.returncode != 0:
|
|
212
|
+
logger.warning(f"Failed to initialize git repository: {result.stderr}")
|
|
213
|
+
else:
|
|
214
|
+
logger.info("Git repository initialized successfully")
|
|
215
|
+
|
|
216
|
+
# Create initial commit
|
|
217
|
+
logger.info("Creating initial commit")
|
|
218
|
+
subprocess.run(
|
|
219
|
+
["git", "add", "."],
|
|
220
|
+
cwd=str(target_path),
|
|
221
|
+
capture_output=True,
|
|
222
|
+
)
|
|
223
|
+
subprocess.run(
|
|
224
|
+
["git", "commit", "-m", f"Initial commit from {template_name}"],
|
|
225
|
+
cwd=str(target_path),
|
|
226
|
+
capture_output=True,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# Rename branch to main
|
|
230
|
+
logger.info("Renaming branch to main")
|
|
231
|
+
result = subprocess.run(
|
|
232
|
+
["git", "branch", "-M", "main"],
|
|
233
|
+
cwd=str(target_path),
|
|
234
|
+
capture_output=True,
|
|
235
|
+
text=True,
|
|
236
|
+
)
|
|
237
|
+
if result.returncode != 0:
|
|
238
|
+
logger.warning(f"Failed to rename branch to main: {result.stderr}")
|
|
239
|
+
else:
|
|
240
|
+
logger.info("Branch renamed to main successfully")
|
|
241
|
+
|
|
242
|
+
# Create and switch to develop branch
|
|
243
|
+
logger.info("Creating develop branch")
|
|
244
|
+
result = subprocess.run(
|
|
245
|
+
["git", "checkout", "-b", "develop"],
|
|
246
|
+
cwd=str(target_path),
|
|
247
|
+
capture_output=True,
|
|
248
|
+
text=True,
|
|
249
|
+
)
|
|
250
|
+
if result.returncode != 0:
|
|
251
|
+
logger.warning(f"Failed to create develop branch: {result.stderr}")
|
|
252
|
+
else:
|
|
253
|
+
logger.info("Switched to develop branch successfully")
|
|
254
|
+
|
|
255
|
+
logger.info(f"Successfully created project: {project_name}")
|
|
256
|
+
logger.info(f"Project location: {target_path}")
|
|
257
|
+
logger.info(f"Current branch: develop")
|
|
258
|
+
logger.info(f"Next steps:")
|
|
259
|
+
logger.info(f" cd {target_path}")
|
|
260
|
+
|
|
261
|
+
return True
|
|
262
|
+
|
|
263
|
+
except Exception as e:
|
|
264
|
+
logger.error(f"Failed to create project: {str(e)}")
|
|
265
|
+
return False
|
|
266
|
+
|
|
267
|
+
# EOF
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/template/create_pip_project.py
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Create a new pip project from the pip-project-template.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sys
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from ._create_project import create_project
|
|
13
|
+
|
|
14
|
+
TEMPLATE_REPO_URL = "https://github.com/ywatanabe1989/pip-project-template.git"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def create_pip_project(project_name: str, target_dir: Optional[str] = None) -> bool:
|
|
18
|
+
"""
|
|
19
|
+
Create a new pip project from the template repository.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
project_name : str
|
|
24
|
+
Name of the new pip project
|
|
25
|
+
target_dir : str, optional
|
|
26
|
+
Directory where the project will be created. If None, uses current directory.
|
|
27
|
+
|
|
28
|
+
Returns
|
|
29
|
+
-------
|
|
30
|
+
bool
|
|
31
|
+
True if successful, False otherwise
|
|
32
|
+
|
|
33
|
+
Example
|
|
34
|
+
-------
|
|
35
|
+
>>> from scitex.template import create_pip_project
|
|
36
|
+
>>> create_pip_project("my_pip_project")
|
|
37
|
+
"""
|
|
38
|
+
return create_project(
|
|
39
|
+
project_name,
|
|
40
|
+
target_dir,
|
|
41
|
+
TEMPLATE_REPO_URL,
|
|
42
|
+
"pip-project-template",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def main(args: list = None) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Command-line interface for create_pip_project.
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
args : list, optional
|
|
53
|
+
Command-line arguments. If None, uses sys.argv[1:]
|
|
54
|
+
"""
|
|
55
|
+
if args is None:
|
|
56
|
+
args = sys.argv[1:]
|
|
57
|
+
|
|
58
|
+
if len(args) < 1:
|
|
59
|
+
print("Usage: python -m scitex create_pip_project <project-name> [target-dir]")
|
|
60
|
+
print("")
|
|
61
|
+
print("Arguments:")
|
|
62
|
+
print(" project-name Name of the new pip project")
|
|
63
|
+
print(" target-dir Optional: Directory where project will be created (default: current directory)")
|
|
64
|
+
print("")
|
|
65
|
+
print("Example:")
|
|
66
|
+
print(" python -m scitex create_pip_project my_pip_project")
|
|
67
|
+
print(" python -m scitex create_pip_project my_project ~/projects")
|
|
68
|
+
sys.exit(1)
|
|
69
|
+
|
|
70
|
+
project_name = args[0]
|
|
71
|
+
target_dir = args[1] if len(args) > 1 else None
|
|
72
|
+
|
|
73
|
+
success = create_pip_project(project_name, target_dir)
|
|
74
|
+
sys.exit(0 if success else 1)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
if __name__ == "__main__":
|
|
78
|
+
main()
|
|
79
|
+
|
|
80
|
+
# EOF
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/template/create_research.py
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Create a new research project from the scitex_template_research template.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sys
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from ._create_project import create_project
|
|
13
|
+
|
|
14
|
+
TEMPLATE_REPO_URL = "https://github.com/ywatanabe1989/scitex_template_research.git"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def create_research(project_name: str, target_dir: Optional[str] = None) -> bool:
|
|
18
|
+
"""
|
|
19
|
+
Create a new research project from the template repository.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
project_name : str
|
|
24
|
+
Name of the new research project
|
|
25
|
+
target_dir : str, optional
|
|
26
|
+
Directory where the project will be created. If None, uses current directory.
|
|
27
|
+
|
|
28
|
+
Returns
|
|
29
|
+
-------
|
|
30
|
+
bool
|
|
31
|
+
True if successful, False otherwise
|
|
32
|
+
|
|
33
|
+
Example
|
|
34
|
+
-------
|
|
35
|
+
>>> from scitex.template import create_research
|
|
36
|
+
>>> create_research("my_research_project")
|
|
37
|
+
"""
|
|
38
|
+
return create_project(
|
|
39
|
+
project_name,
|
|
40
|
+
target_dir,
|
|
41
|
+
TEMPLATE_REPO_URL,
|
|
42
|
+
"scitex_template_research",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def main(args: list = None) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Command-line interface for create_research.
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
args : list, optional
|
|
53
|
+
Command-line arguments. If None, uses sys.argv[1:]
|
|
54
|
+
"""
|
|
55
|
+
if args is None:
|
|
56
|
+
args = sys.argv[1:]
|
|
57
|
+
|
|
58
|
+
if len(args) < 1:
|
|
59
|
+
print("Usage: python -m scitex create_research_project <project-name> [target-dir]")
|
|
60
|
+
print("")
|
|
61
|
+
print("Arguments:")
|
|
62
|
+
print(" project-name Name of the new research project")
|
|
63
|
+
print(" target-dir Optional: Directory where project will be created (default: current directory)")
|
|
64
|
+
print("")
|
|
65
|
+
print("Example:")
|
|
66
|
+
print(" python -m scitex create_research_project my_research_project")
|
|
67
|
+
print(" python -m scitex create_research_project my_project ~/projects")
|
|
68
|
+
sys.exit(1)
|
|
69
|
+
|
|
70
|
+
project_name = args[0]
|
|
71
|
+
target_dir = args[1] if len(args) > 1 else None
|
|
72
|
+
|
|
73
|
+
success = create_research(project_name, target_dir)
|
|
74
|
+
sys.exit(0 if success else 1)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
if __name__ == "__main__":
|
|
78
|
+
main()
|
|
79
|
+
|
|
80
|
+
# EOF
|