recurvedata-lib 0.1.492__tar.gz → 0.1.496__tar.gz
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.
Potentially problematic release.
This version of recurvedata-lib might be problematic. Click here for more details.
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/PKG-INFO +2 -1
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/pyproject.toml +1 -292
- recurvedata_lib-0.1.496/recurvedata/__version__.py +1 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/client/client.py +7 -94
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/config_schema.py +20 -0
- recurvedata_lib-0.1.496/recurvedata/connectors/connectors/wecom.py +66 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/dbapi.py +17 -9
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/airflow_db_process.py +25 -15
- recurvedata_lib-0.1.492/recurvedata/__version__.py +0 -1
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/.gitignore +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/README.md +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/client/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/client/server_client.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/config.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/_register.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/base.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/aliyun_access_key.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/auth.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/azure_blob.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/azure_synapse.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/bigquery.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/clickhouse.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/dingtalk.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/doris.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/es.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/feishu.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/ftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/generic.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/google_cloud_storage.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/google_service_account.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/hive.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/impala.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/jenkins.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/mail.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/microsoft_fabric.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/mongo.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/mssql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/mysql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/n8n.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/oss.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/owncloud.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/phoenix.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/postgres.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/python.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/redshift.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/s3.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/sftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/slack.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/spark.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/starrocks.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/tencent_cos.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/connectors/tidb.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/const.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/datasource.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/fs.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/ftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/object_store.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/pigeon.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/proxy.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/service.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/connectors/utils.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/consts.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/core/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/core/config.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/core/configurable.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/core/consts.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/core/templating.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/core/tracing.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/core/transformer.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/core/translation.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/dbt/client.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/dbt/consts.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/dbt/cosmos_utils.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/dbt/error_codes.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/dbt/schemas.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/dbt/service.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/dbt/utils.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/error_codes.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/exceptions.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/cli/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/cli/connector.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/cli/dbt.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/cli/main.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/cli/parameters.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/client.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/consts.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/debug_executor.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/executor.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/link_executor.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/models.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/schemas.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/service/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/service/connector.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/executors/utils.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/filestorage/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/filestorage/_factory.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/filestorage/backends/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/filestorage/backends/fsspec.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/filestorage/backends/local.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/filestorage/backends/oss.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/filestorage/interface.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/base.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/config.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/context.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/dbt_operator/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/dbt_operator/model_pipeline_link_operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/dbt_operator/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/link_operator/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/link_operator/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/models.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/notify_operator/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/notify_operator/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/python_operator/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/python_operator/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/sensor_operator/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/sensor_operator/airflow_utils.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/sensor_operator/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/spark_operator/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/spark_operator/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/spark_operator/spark_sample.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/sql_operator/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/sql_operator/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/task.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/const.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_aliyun_sls.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_sheet_task_base.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_cass.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_dbapi.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_es.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_feishu_sheet.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_ftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_google_sheet.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_mongodb.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_oss.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_python.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_s3.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/dump_task_sftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_aliyun_oss.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_azure_blob.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_azure_synapse.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_clickhouse.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_doris.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_email.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_es.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_filebrowser.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_ftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_google_bigquery.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_google_cloud_storage.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_google_sheet.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_hive.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_microsoft_fabric.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_mssql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_mysql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_owncloud.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_postgresql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_qcloud_cos.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_recurve_data_prep.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_redshift.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_s3.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_sftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_starrocks.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/load_task_yicrowds.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/mixin.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/operator.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/task.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/transfer_operator/utils.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/ui.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/utils/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/utils/file_factory.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/utils/fs.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/utils/lineage.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/operators/web_init.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/_registry.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/aliyun_oss.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/awss3.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/azure_blob.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/azure_synapse.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/cass.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/clickhouse.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/clickhouse_native.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/dbapi.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/doris.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/es.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/feishu.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/ftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/google_bigquery.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/google_cloud_storage.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/hbase_phoenix.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/hdfs.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/hive_impala.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/microsoft_fabric.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/mongodb.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/mssql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/mysql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/owncloud.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/postgresql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/power_bi.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/qcloud_cos.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/redshift.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/sftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/sqlite.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/starrocks.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/connector/tableau.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/const.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/csv.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/docs/datasources-example.json +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/docs/images/pigeon_design.png +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/docs/lightweight-data-sync-solution.md +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/dumper/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/dumper/aliyun_sls.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/dumper/base.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/dumper/cass.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/dumper/dbapi.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/dumper/es.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/dumper/ftp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/dumper/mongodb.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/handler/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/handler/base.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/handler/csv_handler.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/base.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_azure_synapse.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_clickhouse.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_doris.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_es.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_google_bigquery.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_hive.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_microsoft_fabric.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_mssql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_mysql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_postgresql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_redshift.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/loader/csv_to_starrocks.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/meta.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/row_factory.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/schema/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/schema/types.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/sync.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/transformer.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/bloomfilter.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/date_time.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/escape.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/fs.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/json.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/keyed_tuple.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/mp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/sql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/pigeon/utils/timing.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/provider_manager.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/providers/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/providers/dbapi/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/providers/flywheel/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/providers/mysql/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/airflow.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/airflow_operators.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/airflow_plugin.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/airflow_trigger_dag_patch.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/base.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/cli.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/client.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/consts.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/debug_celery.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/model.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/schemas.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/service.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/system_dags.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/task_status.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/utils.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schema/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schema/field.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schema/schema.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schema/types.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schema.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/app.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/connector/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/connector/api.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/connector/schemas.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/data_service/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/data_service/api.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/data_service/client.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/data_service/consts.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/data_service/schemas.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/data_service/service.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/dbt/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/dbt/api.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/error_code.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/exceptions.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/executor/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/executor/api.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/executor/schemas.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/executor/service.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/main.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/schedulers/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/schedulers/api.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/schedulers/schemas.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/server/schemas.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/__init__.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/_typer.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/attrdict.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/command_helper.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/compat.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/compression.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/crontab.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/crypto_util.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/dataclass.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/date_time.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/dispatch.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/email_util.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/files.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/helpers.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/httputil.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/imports.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/json.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/log.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/log_capture.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/mp.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/normalizer.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/redis_lock.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/registry.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/shell.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/singleton.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/sql.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/timeout.py +0 -0
- {recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/utils/tracing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: recurvedata-lib
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.496
|
|
4
4
|
Summary: Common Library for ReOrc Data Platform
|
|
5
5
|
Author-email: Reorc Team <contact@recurvedata.com>
|
|
6
6
|
Requires-Dist: croniter
|
|
@@ -77,6 +77,7 @@ Requires-Dist: dbt-duckdb==1.8.4; extra == 'dbt'
|
|
|
77
77
|
Requires-Dist: dbt-extractor==0.5.1; extra == 'dbt'
|
|
78
78
|
Requires-Dist: dbt-fabric==1.9.4; extra == 'dbt'
|
|
79
79
|
Requires-Dist: dbt-impala==1.8.0; extra == 'dbt'
|
|
80
|
+
Requires-Dist: dbt-mysql==1.8.0+recurve.1; extra == 'dbt'
|
|
80
81
|
Requires-Dist: dbt-postgres==1.8.2; extra == 'dbt'
|
|
81
82
|
Requires-Dist: dbt-redshift==1.8.1; extra == 'dbt'
|
|
82
83
|
Requires-Dist: dbt-semantic-interfaces==0.5.1; extra == 'dbt'
|
|
@@ -114,298 +114,6 @@ type = "confirm"
|
|
|
114
114
|
name = "show_message"
|
|
115
115
|
message = "Do you want to add body message in commit?"
|
|
116
116
|
|
|
117
|
-
[dependency-groups]
|
|
118
|
-
public = [
|
|
119
|
-
"adlfs==2025.8.0",
|
|
120
|
-
"aenum==3.1.16",
|
|
121
|
-
"agate==1.9.1",
|
|
122
|
-
"aiobotocore==2.24.2",
|
|
123
|
-
"aiohappyeyeballs==2.6.1",
|
|
124
|
-
"aiohttp==3.10.5",
|
|
125
|
-
"aioitertools==0.12.0",
|
|
126
|
-
"aiooss2==0.2.11",
|
|
127
|
-
"aiosignal==1.4.0",
|
|
128
|
-
"aiosmtplib==4.0.2",
|
|
129
|
-
"alembic==1.16.5",
|
|
130
|
-
"aliyun-log-python-sdk==0.9.32",
|
|
131
|
-
"aliyun-python-sdk-core==2.16.0",
|
|
132
|
-
"aliyun-python-sdk-kms==2.16.5",
|
|
133
|
-
"annotated-types==0.7.0",
|
|
134
|
-
"anyio==4.11.0",
|
|
135
|
-
"apache-airflow==2.10.3",
|
|
136
|
-
"apache-airflow-providers-common-compat==1.7.4",
|
|
137
|
-
"apache-airflow-providers-common-io==1.6.3",
|
|
138
|
-
"apache-airflow-providers-common-sql==1.28.1",
|
|
139
|
-
"apache-airflow-providers-fab==1.5.3",
|
|
140
|
-
"apache-airflow-providers-ftp==3.13.2",
|
|
141
|
-
"apache-airflow-providers-http==5.3.2",
|
|
142
|
-
"apache-airflow-providers-imap==3.9.2",
|
|
143
|
-
"apache-airflow-providers-smtp==2.3.1",
|
|
144
|
-
"apache-airflow-providers-sqlite==4.1.2",
|
|
145
|
-
"apispec==6.8.4",
|
|
146
|
-
"argcomplete==3.6.2",
|
|
147
|
-
"asgiref==3.9.2",
|
|
148
|
-
"asn1crypto==1.5.1",
|
|
149
|
-
"astronomer-cosmos==1.6.0",
|
|
150
|
-
"asynch==0.2.4",
|
|
151
|
-
"attrs==25.3.0",
|
|
152
|
-
"azure-core==1.35.1",
|
|
153
|
-
"azure-datalake-store==0.0.53",
|
|
154
|
-
"azure-identity==1.25.0",
|
|
155
|
-
"azure-storage-blob==12.26.0",
|
|
156
|
-
"babel==2.17.0",
|
|
157
|
-
"backoff==2.2.1",
|
|
158
|
-
"bcrypt==5.0.0",
|
|
159
|
-
"beautifulsoup4==4.13.5",
|
|
160
|
-
"bitarray==3.7.1",
|
|
161
|
-
"blinker==1.9.0",
|
|
162
|
-
"boto3==1.40.18",
|
|
163
|
-
"botocore==1.40.18",
|
|
164
|
-
"cachelib==0.13.0",
|
|
165
|
-
"cachetools==5.5.2",
|
|
166
|
-
"certifi==2025.8.3",
|
|
167
|
-
"cffi==2.0.0",
|
|
168
|
-
"chardet==5.2.0",
|
|
169
|
-
"charset-normalizer==3.4.3",
|
|
170
|
-
"ciso8601==2.3.3",
|
|
171
|
-
"click==8.3.0",
|
|
172
|
-
"clickclick==20.10.2",
|
|
173
|
-
"clickhouse-cityhash==1.0.2.4",
|
|
174
|
-
"clickhouse-driver==0.2.9",
|
|
175
|
-
"clickhouse-sqlalchemy==0.2.9",
|
|
176
|
-
"colorama==0.4.6",
|
|
177
|
-
"colorlog==6.9.0",
|
|
178
|
-
"configupdater==3.2",
|
|
179
|
-
"connexion==2.14.2",
|
|
180
|
-
"cos-python-sdk-v5==1.9.38",
|
|
181
|
-
"crcmod==1.7",
|
|
182
|
-
"cron-descriptor==2.0.6",
|
|
183
|
-
"croniter==6.0.0",
|
|
184
|
-
"cryptography==46.0.1",
|
|
185
|
-
"cssselect==1.3.0",
|
|
186
|
-
"cssutils==2.11.1",
|
|
187
|
-
"cython==3.1.4",
|
|
188
|
-
"cytoolz==1.0.1",
|
|
189
|
-
"daff==1.4.2",
|
|
190
|
-
"dateparser==1.2.2",
|
|
191
|
-
"db-dtypes==1.4.3",
|
|
192
|
-
"dbt-adapters==1.9.0",
|
|
193
|
-
"dbt-bigquery==1.8.3",
|
|
194
|
-
"dbt-common==1.12.0",
|
|
195
|
-
"dbt-core==1.8.0",
|
|
196
|
-
"dbt-doris==0.4.0",
|
|
197
|
-
"dbt-duckdb==1.8.4",
|
|
198
|
-
"dbt-extractor==0.6.0",
|
|
199
|
-
"dbt-fabric==1.9.6",
|
|
200
|
-
"dbt-impala==1.8.0",
|
|
201
|
-
"dbt-postgres==1.8.2",
|
|
202
|
-
"dbt-redshift==1.8.1",
|
|
203
|
-
"dbt-semantic-interfaces==0.5.1",
|
|
204
|
-
"dbt-starrocks==1.7.0",
|
|
205
|
-
"deepdiff==7.0.1",
|
|
206
|
-
"deprecated==1.2.18",
|
|
207
|
-
"dill==0.4.0",
|
|
208
|
-
"distlib==0.4.0",
|
|
209
|
-
"dnspython==2.8.0",
|
|
210
|
-
"duckdb==1.4.0",
|
|
211
|
-
"elastic-transport==9.1.0",
|
|
212
|
-
"elasticsearch==9.1.1",
|
|
213
|
-
"email-validator==2.3.0",
|
|
214
|
-
"emails==0.6",
|
|
215
|
-
"et-xmlfile==2.0.0",
|
|
216
|
-
"fastapi==0.117.1",
|
|
217
|
-
"filelock==3.19.1",
|
|
218
|
-
"flask==2.2.5",
|
|
219
|
-
"flask-appbuilder==4.5.3",
|
|
220
|
-
"flask-babel==2.0.0",
|
|
221
|
-
"flask-caching==2.3.1",
|
|
222
|
-
"flask-jwt-extended==4.7.1",
|
|
223
|
-
"flask-limiter==3.13",
|
|
224
|
-
"flask-login==0.6.3",
|
|
225
|
-
"flask-session==0.5.0",
|
|
226
|
-
"flask-sqlalchemy==2.5.1",
|
|
227
|
-
"flask-wtf==1.2.2",
|
|
228
|
-
"frozenlist==1.7.0",
|
|
229
|
-
"fsspec[adl,s3,sftp]==2025.9.0",
|
|
230
|
-
"future==1.0.0",
|
|
231
|
-
"google-api-core==2.24.0",
|
|
232
|
-
"google-auth==2.40.3",
|
|
233
|
-
"google-auth-oauthlib==1.2.2",
|
|
234
|
-
"google-cloud-bigquery-storage==2.33.1",
|
|
235
|
-
"google-cloud-bigquery[bqstorage]==3.38.0",
|
|
236
|
-
"google-cloud-core==2.4.3",
|
|
237
|
-
"google-cloud-dataproc==5.22.0",
|
|
238
|
-
"google-cloud-storage==2.19.0",
|
|
239
|
-
"google-crc32c==1.7.1",
|
|
240
|
-
"google-re2==1.1.20250805",
|
|
241
|
-
"google-resumable-media==2.7.2",
|
|
242
|
-
"googleapis-common-protos==1.70.0",
|
|
243
|
-
"greenlet==3.2.4 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'",
|
|
244
|
-
"grpc-google-iam-v1==0.14.2",
|
|
245
|
-
"grpcio==1.75.0",
|
|
246
|
-
"grpcio-status==1.62.3",
|
|
247
|
-
"gspread==6.2.1",
|
|
248
|
-
"gunicorn==23.0.0",
|
|
249
|
-
"h11==0.16.0",
|
|
250
|
-
"httpcore==1.0.9",
|
|
251
|
-
"httpx==0.28.1",
|
|
252
|
-
"humanize==4.13.0",
|
|
253
|
-
"idna==3.10",
|
|
254
|
-
"importlib-metadata==6.11.0",
|
|
255
|
-
"impyla==0.18.0",
|
|
256
|
-
"inflection==0.5.1",
|
|
257
|
-
"invoke==2.2.0",
|
|
258
|
-
"isodate==0.6.1",
|
|
259
|
-
"itsdangerous==2.2.0",
|
|
260
|
-
"jinja2==3.1.6",
|
|
261
|
-
"jmespath==0.10.0",
|
|
262
|
-
"jsonschema==4.25.1",
|
|
263
|
-
"jsonschema-specifications==2025.9.1",
|
|
264
|
-
"larksuite-oapi==1.0.34",
|
|
265
|
-
"lazy-object-proxy==1.12.0",
|
|
266
|
-
"leather==0.4.0",
|
|
267
|
-
"leb128==1.0.8",
|
|
268
|
-
"limits==5.5.0",
|
|
269
|
-
"linkify-it-py==2.0.3",
|
|
270
|
-
"lockfile==0.12.2",
|
|
271
|
-
"logbook==1.5.3",
|
|
272
|
-
"loguru==0.7.3",
|
|
273
|
-
"lxml==6.0.2",
|
|
274
|
-
"lz4==4.4.4",
|
|
275
|
-
"mako==1.3.10",
|
|
276
|
-
"markdown-it-py==4.0.0",
|
|
277
|
-
"markupsafe==3.0.2",
|
|
278
|
-
"marshmallow==3.26.1",
|
|
279
|
-
"marshmallow-oneofschema==3.2.0",
|
|
280
|
-
"marshmallow-sqlalchemy==0.28.2",
|
|
281
|
-
"mashumaro==3.16",
|
|
282
|
-
"mdit-py-plugins==0.5.0",
|
|
283
|
-
"mdurl==0.1.2",
|
|
284
|
-
"methodtools==0.4.7",
|
|
285
|
-
"minimal-snowplow-tracker==0.0.2",
|
|
286
|
-
"more-itertools==10.8.0",
|
|
287
|
-
"msal==1.34.0",
|
|
288
|
-
"msal-extensions==1.3.1",
|
|
289
|
-
"msgpack==1.1.1",
|
|
290
|
-
"multidict==6.6.4",
|
|
291
|
-
"mysql-connector-python==8.2.0",
|
|
292
|
-
"networkx==3.5",
|
|
293
|
-
"numpy==2.3.3",
|
|
294
|
-
"oauthlib==3.3.1",
|
|
295
|
-
"openpyxl==3.1.5",
|
|
296
|
-
"opentelemetry-api==1.37.0",
|
|
297
|
-
"opentelemetry-exporter-otlp==1.15.0",
|
|
298
|
-
"opentelemetry-exporter-otlp-proto-grpc==1.15.0",
|
|
299
|
-
"opentelemetry-exporter-otlp-proto-http==1.15.0",
|
|
300
|
-
"opentelemetry-proto==1.15.0",
|
|
301
|
-
"opentelemetry-sdk==1.37.0",
|
|
302
|
-
"opentelemetry-semantic-conventions==0.58b0",
|
|
303
|
-
"ordered-set==4.1.0",
|
|
304
|
-
"orjson==3.11.3",
|
|
305
|
-
"oss2==2.18.4",
|
|
306
|
-
"ossfs==2025.5.0",
|
|
307
|
-
"packaging==25.0",
|
|
308
|
-
"pandas==2.3.2",
|
|
309
|
-
"pandas-gbq==0.29.2",
|
|
310
|
-
"paramiko==4.0.0",
|
|
311
|
-
"parsedatetime==2.6",
|
|
312
|
-
"pathspec==0.12.1",
|
|
313
|
-
"pendulum==3.1.0",
|
|
314
|
-
"platformdirs==4.4.0",
|
|
315
|
-
"pluggy==1.6.0",
|
|
316
|
-
"premailer==3.10.0",
|
|
317
|
-
"prison==0.2.1",
|
|
318
|
-
"propcache==0.3.2",
|
|
319
|
-
"proto-plus==1.26.1",
|
|
320
|
-
"protobuf==4.21.12",
|
|
321
|
-
"psutil==7.1.0",
|
|
322
|
-
"psycopg2-binary==2.9.10",
|
|
323
|
-
"pure-sasl==0.6.2",
|
|
324
|
-
"pyarrow==21.0.0",
|
|
325
|
-
"pyasn1==0.6.1",
|
|
326
|
-
"pyasn1-modules==0.4.2",
|
|
327
|
-
"pycparser==2.23 ; implementation_name != 'PyPy'",
|
|
328
|
-
"pycryptodome==3.23.0",
|
|
329
|
-
"pydantic==2.11.9",
|
|
330
|
-
"pydantic-core==2.33.2",
|
|
331
|
-
"pydata-google-auth==1.9.1",
|
|
332
|
-
"pygments==2.19.2",
|
|
333
|
-
"pyhive==0.7.0",
|
|
334
|
-
"pyjwt==2.10.1",
|
|
335
|
-
"pymongo==4.15.1",
|
|
336
|
-
"pymysql==1.1.2",
|
|
337
|
-
"pynacl==1.6.0",
|
|
338
|
-
"pyocclient==0.6",
|
|
339
|
-
"pyodbc==5.2.0",
|
|
340
|
-
"python-daemon==3.1.2",
|
|
341
|
-
"python-dateutil==2.9.0.post0",
|
|
342
|
-
"python-decouple==3.8",
|
|
343
|
-
"python-nvd3==0.16.0",
|
|
344
|
-
"python-slugify==8.0.4",
|
|
345
|
-
"pytimeparse==1.1.8",
|
|
346
|
-
"pytz==2025.2",
|
|
347
|
-
"pywebhdfs==0.4.1",
|
|
348
|
-
"pyyaml==6.0.3",
|
|
349
|
-
"redis==6.4.0",
|
|
350
|
-
"redshift-connector==2.0.917",
|
|
351
|
-
"referencing==0.36.2",
|
|
352
|
-
"regex==2025.9.18",
|
|
353
|
-
"requests==2.32.5",
|
|
354
|
-
"requests-oauthlib==2.0.0",
|
|
355
|
-
"requests-toolbelt==1.0.0",
|
|
356
|
-
"rfc3339-validator==0.1.4",
|
|
357
|
-
"rich==14.1.0",
|
|
358
|
-
"rich-argparse==1.7.1",
|
|
359
|
-
"rpds-py==0.27.1",
|
|
360
|
-
"rsa==4.9.1",
|
|
361
|
-
"s3fs==2025.9.0",
|
|
362
|
-
"s3transfer==0.13.1",
|
|
363
|
-
"scramp==1.4.6",
|
|
364
|
-
"setproctitle==1.3.7",
|
|
365
|
-
"setuptools==80.9.0",
|
|
366
|
-
"shellingham==1.5.4",
|
|
367
|
-
"six==1.17.0",
|
|
368
|
-
"sniffio==1.3.1",
|
|
369
|
-
"soupsieve==2.8",
|
|
370
|
-
"sqlalchemy==1.4.54",
|
|
371
|
-
"sqlalchemy-bigquery==1.15.0",
|
|
372
|
-
"sqlalchemy-doris[pymysql]==0.2.2",
|
|
373
|
-
"sqlalchemy-jsonfield==1.0.2",
|
|
374
|
-
"sqlalchemy-redshift==0.8.14",
|
|
375
|
-
"sqlalchemy-utils==0.42.0",
|
|
376
|
-
"sqlglot==27.18.0",
|
|
377
|
-
"sqlparse==0.5.3",
|
|
378
|
-
"sshtunnel==0.4.0",
|
|
379
|
-
"starlette==0.48.0",
|
|
380
|
-
"tabulate==0.9.0",
|
|
381
|
-
"tenacity==8.5.0",
|
|
382
|
-
"termcolor==3.1.0",
|
|
383
|
-
"text-unidecode==1.3",
|
|
384
|
-
"thrift==0.16.0",
|
|
385
|
-
"thrift-sasl==0.4.3",
|
|
386
|
-
"toolz==1.0.0",
|
|
387
|
-
"typer==0.19.2",
|
|
388
|
-
"typing-extensions==4.15.0",
|
|
389
|
-
"typing-inspection==0.4.1",
|
|
390
|
-
"tzdata==2025.2",
|
|
391
|
-
"tzlocal==5.3.1",
|
|
392
|
-
"uc-micro-py==1.0.3",
|
|
393
|
-
"ujson==5.11.0",
|
|
394
|
-
"universal-pathlib==0.2.6",
|
|
395
|
-
"urllib3==1.26.20",
|
|
396
|
-
"uvicorn==0.37.0",
|
|
397
|
-
"virtualenv==20.34.0",
|
|
398
|
-
"werkzeug==2.2.3",
|
|
399
|
-
"win32-setctime==1.2.0 ; sys_platform == 'win32'",
|
|
400
|
-
"wirerope==1.0.0",
|
|
401
|
-
"wrapt==1.17.3",
|
|
402
|
-
"wtforms==3.2.1",
|
|
403
|
-
"xmltodict==1.0.2",
|
|
404
|
-
"yarl==1.20.1",
|
|
405
|
-
"zipp==3.23.0",
|
|
406
|
-
"zstd==1.5.7.2",
|
|
407
|
-
]
|
|
408
|
-
|
|
409
117
|
[project.optional-dependencies]
|
|
410
118
|
# Dependencies are managed through requirements files and automatically updated
|
|
411
119
|
# See requirements/worker.in and requirements/dbt.in
|
|
@@ -655,6 +363,7 @@ dbt = [
|
|
|
655
363
|
"dbt-redshift==1.8.1",
|
|
656
364
|
"dbt-semantic-interfaces==0.5.1",
|
|
657
365
|
"dbt-starrocks==1.7.0",
|
|
366
|
+
"dbt-mysql==1.8.0+recurve.1",
|
|
658
367
|
"deepdiff==7.0.1",
|
|
659
368
|
"deprecated==1.2.15",
|
|
660
369
|
"distlib==0.3.9",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.496"
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
import os
|
|
4
3
|
import time
|
|
5
|
-
from pathlib import Path
|
|
6
4
|
from typing import Any, TypeVar, overload
|
|
7
5
|
|
|
8
6
|
import httpx
|
|
@@ -26,90 +24,13 @@ class Client:
|
|
|
26
24
|
config = AgentConfig.load()
|
|
27
25
|
self.set_config(config)
|
|
28
26
|
|
|
29
|
-
@property
|
|
30
|
-
def is_offline_mode(self) -> bool:
|
|
31
|
-
"""Check if offline mode is enabled via environment variable"""
|
|
32
|
-
return os.environ.get("RECURVE_OFFLINE_MODE", "").lower() in ("true", "1")
|
|
33
|
-
|
|
34
|
-
@property
|
|
35
|
-
def offline_data_path(self) -> Path:
|
|
36
|
-
"""Get the offline data directory path"""
|
|
37
|
-
offline_path = os.environ.get("RECURVE_OFFLINE_DATA_PATH", "offline_data")
|
|
38
|
-
return Path(offline_path)
|
|
39
|
-
|
|
40
27
|
def set_config(self, config: AgentConfig):
|
|
41
28
|
self._config = config
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
headers={"User-Agent": f"RecurveLib/{__version__}"},
|
|
48
|
-
)
|
|
49
|
-
else:
|
|
50
|
-
self._client = None
|
|
51
|
-
|
|
52
|
-
def _resolve_offline_file_path(self, path: str, **kwargs) -> Path:
|
|
53
|
-
"""Convert API path to local file path with parameterized support"""
|
|
54
|
-
# Remove leading /api/ prefix: /api/executor/connection -> executor/connection
|
|
55
|
-
if path.startswith("/api/"):
|
|
56
|
-
clean_path = path[5:] # Remove "/api/" prefix
|
|
57
|
-
else:
|
|
58
|
-
clean_path = path.lstrip("/")
|
|
59
|
-
|
|
60
|
-
# Extract parameters from kwargs
|
|
61
|
-
params = kwargs.get("params", {})
|
|
62
|
-
|
|
63
|
-
# CORE OPERATOR APIs with parameter-based file structure:
|
|
64
|
-
|
|
65
|
-
# 1. get_connection() API - parameterized by project_id + connection_name
|
|
66
|
-
if clean_path == "executor/connection":
|
|
67
|
-
project_id = params.get("project_id", "0")
|
|
68
|
-
connection_name = params.get("name", "default")
|
|
69
|
-
return self.offline_data_path / "executor/connection" / str(project_id) / f"{connection_name}.json"
|
|
70
|
-
|
|
71
|
-
# 2. get_py_conn_configs() API - parameterized by project_id + project_connection_name
|
|
72
|
-
elif clean_path == "executor/python-conn-configs":
|
|
73
|
-
project_id = params.get("project_id", "0")
|
|
74
|
-
# Python configs use project_connection_name as the key (fallback to other param names for compatibility)
|
|
75
|
-
# Handle empty strings properly - treat them as None/missing
|
|
76
|
-
project_connection_name = (params.get("project_connection_name") or
|
|
77
|
-
params.get("project_conn_name") or
|
|
78
|
-
params.get("pyenv_name") or
|
|
79
|
-
"default")
|
|
80
|
-
return self.offline_data_path / "executor/python-conn-configs" / str(project_id) / f"{project_connection_name}.json"
|
|
81
|
-
|
|
82
|
-
# For any other APIs, raise error do not support offline mode
|
|
83
|
-
raise APIError(f"Offline mode: {path} is not supported")
|
|
84
|
-
|
|
85
|
-
def _read_offline_data(self, method: str, path: str, response_model_class: type[ResponseModelType] | None = None, **kwargs) -> Any:
|
|
86
|
-
"""Read API response from local JSON file"""
|
|
87
|
-
file_path = self._resolve_offline_file_path(path, **kwargs)
|
|
88
|
-
|
|
89
|
-
logger.info(f"🔌 Offline mode: Reading from {file_path}")
|
|
90
|
-
|
|
91
|
-
try:
|
|
92
|
-
if not file_path.exists():
|
|
93
|
-
logger.error(f"Offline data file not found: {file_path}")
|
|
94
|
-
raise APIError(f"Offline mode: Required data file not found: {file_path}")
|
|
95
|
-
|
|
96
|
-
with open(file_path, 'r') as f:
|
|
97
|
-
resp_content = json.load(f)
|
|
98
|
-
|
|
99
|
-
# Handle response model validation (same logic as online mode)
|
|
100
|
-
if response_model_class is not None:
|
|
101
|
-
if "code" in resp_content:
|
|
102
|
-
return response_model_class.model_validate(resp_content["data"])
|
|
103
|
-
return response_model_class.model_validate(resp_content)
|
|
104
|
-
|
|
105
|
-
return resp_content.get("data", resp_content)
|
|
106
|
-
|
|
107
|
-
except APIError:
|
|
108
|
-
raise # Re-raise APIError as-is
|
|
109
|
-
except Exception as e:
|
|
110
|
-
logger.error(f"Error reading offline data from {file_path}: {e}")
|
|
111
|
-
raise APIError(f"Offline mode: Failed to read data file {file_path}: {e}")
|
|
112
|
-
|
|
29
|
+
self._client = httpx.Client(
|
|
30
|
+
base_url=config.server_url,
|
|
31
|
+
timeout=config.request_timeout,
|
|
32
|
+
headers={"User-Agent": f"RecurveLib/{__version__}"},
|
|
33
|
+
)
|
|
113
34
|
|
|
114
35
|
@overload
|
|
115
36
|
def request(self, method: str, path: str, response_model_class: None = None, retries: int = 3, **kwargs) -> Any:
|
|
@@ -135,11 +56,6 @@ class Client:
|
|
|
135
56
|
retries: int = 1,
|
|
136
57
|
**kwargs,
|
|
137
58
|
) -> Any:
|
|
138
|
-
# Route to offline mode if enabled
|
|
139
|
-
if self.is_offline_mode:
|
|
140
|
-
return self._read_offline_data(method, path, response_model_class, **kwargs)
|
|
141
|
-
|
|
142
|
-
# Original online mode logic
|
|
143
59
|
self.prepare_header(kwargs)
|
|
144
60
|
pre_err: httpx.HTTPStatusError | None = None
|
|
145
61
|
for attempt in range(retries):
|
|
@@ -227,11 +143,8 @@ class Client:
|
|
|
227
143
|
)
|
|
228
144
|
|
|
229
145
|
def close(self):
|
|
230
|
-
|
|
231
|
-
self._client.close()
|
|
146
|
+
self._client.close()
|
|
232
147
|
|
|
233
148
|
@property
|
|
234
149
|
def base_url(self) -> str:
|
|
235
|
-
|
|
236
|
-
return "offline://localhost"
|
|
237
|
-
return str(self._client.base_url) if self._client else ""
|
|
150
|
+
return str(self._client.base_url)
|
|
@@ -1570,6 +1570,26 @@ ALL_CONFIG_SCHEMA_DCT = {
|
|
|
1570
1570
|
"group": ["destination"],
|
|
1571
1571
|
"test_required": True,
|
|
1572
1572
|
},
|
|
1573
|
+
"recurvedata.connectors.connectors.wecom": {
|
|
1574
|
+
"type": "wecom",
|
|
1575
|
+
"ui_type": "WeCom",
|
|
1576
|
+
"category": ["others"],
|
|
1577
|
+
"config_schema": {
|
|
1578
|
+
"type": "object",
|
|
1579
|
+
"properties": {
|
|
1580
|
+
"webhook_url": {"type": "string", "title": _l("WeCom Webhook URL")},
|
|
1581
|
+
},
|
|
1582
|
+
"order": [
|
|
1583
|
+
"webhook_url",
|
|
1584
|
+
],
|
|
1585
|
+
"required": [
|
|
1586
|
+
"webhook_url",
|
|
1587
|
+
],
|
|
1588
|
+
},
|
|
1589
|
+
"enabled": True,
|
|
1590
|
+
"group": ["integration"],
|
|
1591
|
+
"test_required": True,
|
|
1592
|
+
},
|
|
1573
1593
|
}
|
|
1574
1594
|
|
|
1575
1595
|
# auto generated finish
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from urllib.parse import urlparse
|
|
2
|
+
|
|
3
|
+
import requests
|
|
4
|
+
|
|
5
|
+
from recurvedata.connectors._register import register_connector_class
|
|
6
|
+
from recurvedata.connectors.base import RecurveConnectorBase
|
|
7
|
+
from recurvedata.consts import ConnectorGroup
|
|
8
|
+
from recurvedata.core.translation import _l
|
|
9
|
+
|
|
10
|
+
CONNECTION_TYPE = "wecom"
|
|
11
|
+
UI_CONNECTION_TYPE = "WeCom"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@register_connector_class([CONNECTION_TYPE, UI_CONNECTION_TYPE])
|
|
15
|
+
class WeCom(RecurveConnectorBase):
|
|
16
|
+
connection_type = CONNECTION_TYPE
|
|
17
|
+
ui_connection_type = UI_CONNECTION_TYPE
|
|
18
|
+
group = [ConnectorGroup.INTEGRATION]
|
|
19
|
+
|
|
20
|
+
config_schema = {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"properties": {
|
|
23
|
+
"webhook_url": {"type": "string", "title": _l("WeCom Webhook URL")},
|
|
24
|
+
},
|
|
25
|
+
"order": [
|
|
26
|
+
"webhook_url",
|
|
27
|
+
],
|
|
28
|
+
"required": [
|
|
29
|
+
"webhook_url",
|
|
30
|
+
],
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def webhook_url(self):
|
|
35
|
+
return self.conf["webhook_url"]
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def wecom_conf(self):
|
|
39
|
+
if hasattr(self, "_wecom_conf"):
|
|
40
|
+
return self._wecom_conf
|
|
41
|
+
self.init_config()
|
|
42
|
+
return self._wecom_conf
|
|
43
|
+
|
|
44
|
+
def test_connection(self):
|
|
45
|
+
"""
|
|
46
|
+
Test WeCom webhook connection.
|
|
47
|
+
Validate URL format and network connectivity without sending actual messages.
|
|
48
|
+
"""
|
|
49
|
+
# Validate URL format
|
|
50
|
+
parsed_url = urlparse(self.webhook_url)
|
|
51
|
+
if not parsed_url.scheme or not parsed_url.netloc:
|
|
52
|
+
raise ValueError("Invalid webhook URL format")
|
|
53
|
+
|
|
54
|
+
if parsed_url.scheme != "https":
|
|
55
|
+
raise ValueError("WeCom webhook URL must use HTTPS")
|
|
56
|
+
|
|
57
|
+
# Verify WeCom domain
|
|
58
|
+
if "qyapi.weixin.qq.com" not in parsed_url.netloc:
|
|
59
|
+
raise ValueError("Invalid WeCom webhook URL domain")
|
|
60
|
+
|
|
61
|
+
# Test network connectivity (use HEAD request without sending message body)
|
|
62
|
+
try:
|
|
63
|
+
requests.head(self.webhook_url, timeout=10, allow_redirects=True)
|
|
64
|
+
# Connection test only, status code not checked (HEAD may return 405)
|
|
65
|
+
except requests.exceptions.RequestException as e:
|
|
66
|
+
raise ValueError(f"Failed to connect to WeCom webhook: {str(e)}")
|
|
@@ -397,19 +397,27 @@ class DBAPIBase(RecurveConnectorBase):
|
|
|
397
397
|
set_env_dbt_password(self.password or "")
|
|
398
398
|
|
|
399
399
|
@classmethod
|
|
400
|
-
def
|
|
401
|
-
"""
|
|
402
|
-
order the sql by the orders
|
|
403
|
-
"""
|
|
400
|
+
def get_dialect(cls):
|
|
404
401
|
# dialect impala -> hive, cuz there is no dialect 'impala' in sqlglot
|
|
405
|
-
|
|
402
|
+
return "hive" if cls.connection_type == "impala" else (cls.connection_type or None)
|
|
403
|
+
|
|
404
|
+
@classmethod
|
|
405
|
+
def clean_sql(cls, sql):
|
|
406
|
+
dialect = cls.get_dialect()
|
|
406
407
|
# Parse the SQL query
|
|
407
408
|
parsed = sqlglot.parse_one(sql, read=dialect)
|
|
408
409
|
# since some sql dialects have special identifier, we need to use the dialect to generate the clean sql
|
|
409
|
-
|
|
410
|
+
return parsed.sql(dialect=dialect, comments=False)
|
|
411
|
+
|
|
412
|
+
@classmethod
|
|
413
|
+
def order_sql(cls, sql: str, orders: list[dict[str, str]] = None, return_sql: bool = True):
|
|
414
|
+
"""
|
|
415
|
+
order the sql by the orders
|
|
416
|
+
"""
|
|
417
|
+
dialect = cls.get_dialect()
|
|
410
418
|
# Wrap the entire query with a subquery
|
|
411
419
|
alias = "_recurve_limit_subquery"
|
|
412
|
-
subquery = exp.Subquery(this=clean_sql, alias=alias)
|
|
420
|
+
subquery = exp.Subquery(this=cls.clean_sql(sql), alias=alias)
|
|
413
421
|
|
|
414
422
|
# Create a new SELECT statement with the subquery and the LIMIT clause
|
|
415
423
|
outer_select = exp.select("*").from_(subquery)
|
|
@@ -436,7 +444,7 @@ class DBAPIBase(RecurveConnectorBase):
|
|
|
436
444
|
no validation on sql.
|
|
437
445
|
If the sql is DML, then execute it will raise an error.
|
|
438
446
|
"""
|
|
439
|
-
dialect =
|
|
447
|
+
dialect = cls.get_dialect()
|
|
440
448
|
|
|
441
449
|
outer_select = cls.order_sql(sql, orders, return_sql=False)
|
|
442
450
|
|
|
@@ -456,7 +464,7 @@ class DBAPIBase(RecurveConnectorBase):
|
|
|
456
464
|
no validation on sql.
|
|
457
465
|
If the sql is DML, then execute it will raise an error.
|
|
458
466
|
"""
|
|
459
|
-
return f"SELECT COUNT(1) FROM ({sql}) AS cnt_subquery"
|
|
467
|
+
return f"SELECT COUNT(1) FROM ({cls.clean_sql(sql)}) AS cnt_subquery"
|
|
460
468
|
|
|
461
469
|
|
|
462
470
|
@dataclass
|
{recurvedata_lib-0.1.492 → recurvedata_lib-0.1.496}/recurvedata/schedulers/airflow_db_process.py
RENAMED
|
@@ -148,12 +148,15 @@ class AirflowDbService:
|
|
|
148
148
|
max_execution_date: datetime.datetime | None,
|
|
149
149
|
failed_only: bool,
|
|
150
150
|
):
|
|
151
|
-
|
|
152
|
-
dag_id
|
|
153
|
-
run_id
|
|
154
|
-
execution_start_date
|
|
155
|
-
execution_end_date
|
|
156
|
-
|
|
151
|
+
kwargs = {
|
|
152
|
+
"dag_id": dag.dag_id,
|
|
153
|
+
"run_id": run_id,
|
|
154
|
+
"execution_start_date": min_execution_date,
|
|
155
|
+
"execution_end_date": max_execution_date,
|
|
156
|
+
}
|
|
157
|
+
if min_execution_date or max_execution_date:
|
|
158
|
+
kwargs.pop("run_id")
|
|
159
|
+
drs: list[DagRun] = DagRun.find(**kwargs)
|
|
157
160
|
if not drs:
|
|
158
161
|
logger.info(f"skip rerun, no dag_run found for {dag.dag_id} at {run_id}")
|
|
159
162
|
return
|
|
@@ -182,14 +185,19 @@ class AirflowDbService:
|
|
|
182
185
|
include_downstream: bool,
|
|
183
186
|
failed_only: bool,
|
|
184
187
|
):
|
|
185
|
-
|
|
186
|
-
dag_id
|
|
187
|
-
run_id
|
|
188
|
-
execution_start_date
|
|
189
|
-
execution_end_date
|
|
190
|
-
|
|
188
|
+
kwargs = {
|
|
189
|
+
"dag_id": dag.dag_id,
|
|
190
|
+
"run_id": run_id,
|
|
191
|
+
"execution_start_date": min_execution_date,
|
|
192
|
+
"execution_end_date": max_execution_date,
|
|
193
|
+
}
|
|
194
|
+
if min_execution_date or max_execution_date:
|
|
195
|
+
kwargs.pop("run_id")
|
|
196
|
+
drs: list[DagRun] = DagRun.find(**kwargs)
|
|
191
197
|
if not drs:
|
|
192
|
-
logger.info(
|
|
198
|
+
logger.info(
|
|
199
|
+
f"skip rerun, no dag_run found for {dag.dag_id} at {run_id}, or between {min_execution_date} and {max_execution_date}"
|
|
200
|
+
)
|
|
193
201
|
return
|
|
194
202
|
clear_start_date = min([dr.execution_date for dr in drs])
|
|
195
203
|
clear_end_date = max([dr.execution_date for dr in drs])
|
|
@@ -205,14 +213,16 @@ class AirflowDbService:
|
|
|
205
213
|
for task_id in clear_task_ids:
|
|
206
214
|
if task_id in dag.task_dict:
|
|
207
215
|
task = dag.task_dict[task_id]
|
|
208
|
-
|
|
216
|
+
# Use Airflow's built-in method to get all upstream tasks
|
|
217
|
+
upstream_task_ids = task.get_flat_relative_ids(upstream=True)
|
|
209
218
|
expanded_task_ids.update(upstream_task_ids)
|
|
210
219
|
|
|
211
220
|
if include_downstream:
|
|
212
221
|
for task_id in clear_task_ids:
|
|
213
222
|
if task_id in dag.task_dict:
|
|
214
223
|
task = dag.task_dict[task_id]
|
|
215
|
-
|
|
224
|
+
# Use Airflow's built-in method to get all downstream tasks
|
|
225
|
+
downstream_task_ids = task.get_flat_relative_ids(upstream=False)
|
|
216
226
|
expanded_task_ids.update(downstream_task_ids)
|
|
217
227
|
|
|
218
228
|
clear_task_ids = list(expanded_task_ids)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.492"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|