omnata-plugin-devkit 0.13.7a199__tar.gz → 0.13.8a200__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.
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/PKG-INFO +2 -2
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/pyproject.toml +2 -5
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/API_LIMITS.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CONFIGURATION_FORM.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CONNECTION_FORM.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CONNECTION_TEST.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CONSTRUCT_FORM_OPTION.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CREATE_BILLING_EVENTS.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CREATE_GENERIC_SECRET_OBJECT.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/GET_MISSING_APP_PRIVILEGES.sql.jinja +1 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/INBOUND_LIST_STREAMS.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/LIST_STAGES.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/NETWORK_ADDRESSES.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/NGROK_POST_TUNNEL_FIELDS.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/OUTBOUND_RECORD_VALIDATOR.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_SECRETS.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_SECRETS_UDF.sql.jinja +1 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/SET_CONNECTION_OBJECTS.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/SYNC.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/TUNNEL_TEST.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/UPDATE_GENERIC_SECRET_OBJECT.sql.jinja +2 -1
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/plugin_uploader.py +42 -89
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/LICENSE +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/README.md +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/airbyte_wrapper.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/cli/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/development.ipynb +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/development_session.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/initialiser.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/ASSIGN_OUTBOUND_TARGET_TYPE.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CHECK_CONNECTION_PROGRESS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CONFIGURE_APIS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CREATE_GENERIC_SECRET_OBJECT_FROM_EXISTING.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CREATE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CREATE_NETWORK_RULE_OBJECT_FROM_EXISTING.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/CREATE_OAUTH_SECRET_OBJECT.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/DROP_CONFIGURATION_DEFINITION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/DROP_INTEGRATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/DROP_NETWORK_RULES.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/DROP_SECRETS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/DROP_SPECIFICATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/FETCH_CONNECTIONS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/FETCH_SYNCS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/FETCH_SYNC_BRANCHES.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/LIST_APP_SPECIFICATIONS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/PENDING_API_CONFIGURATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/POST_INSTALL_ACTIONS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/RENAME_CONNECTION_METHODS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/SET_EAI_ACTIVE.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/SET_EAI_SPECIFICATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/SET_SI_SPECIFICATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/TEST_CALLBACK.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/TEST_OAUTH_TOKEN_EXISTS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/UPDATE_API_CONFIGURATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/UPDATE_GENERIC_SECRET_OBJECT_OLD.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/UPDATE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/jinja_templates/manifest.yml.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/native_app_packaging.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/plugin_registration.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/plugin_template/icon.svg +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/plugin_template/plugin.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/plugin_template/plugin_development.ipynb +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/plugin_template/requirements.txt +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/api/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/api/config.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/api/constants.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/api/exceptions.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/api/secure_path.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/api/secure_utils.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/api/utils/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/api/utils/types.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/app/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/app/snow_connector.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/plugins/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/models.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/package/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/package_utils.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/snowpark_shared.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/venv.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/zipper.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/snowcli/cli/templates/environment.yml.jinja +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/streamlit/plugin_configuration.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/test_step_definitions.py +0 -0
- {omnata_plugin_devkit-0.13.7a199 → omnata_plugin_devkit-0.13.8a200}/src/omnata_plugin_devkit/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: omnata-plugin-devkit
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.8a200
|
|
4
4
|
Summary:
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Author: James Weakley
|
|
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
14
|
Requires-Dist: behave (>=1.2,<2.0)
|
|
15
15
|
Requires-Dist: behave_pandas (>=0.5.0,<0.6.0)
|
|
16
|
-
Requires-Dist: omnata-plugin-runtime (
|
|
16
|
+
Requires-Dist: omnata-plugin-runtime (==0.12.10a374)
|
|
17
17
|
Requires-Dist: omnata_cli (>=0.2.3,<0.3.0)
|
|
18
18
|
Requires-Dist: pyparsing (>=3.0)
|
|
19
19
|
Requires-Dist: python-slugify (>=8,<9)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "omnata-plugin-devkit"
|
|
3
|
-
version = "0.13.
|
|
3
|
+
version = "0.13.8a200"
|
|
4
4
|
description = ""
|
|
5
5
|
authors = ["James Weakley <james.weakley@omnata.com>"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -10,10 +10,7 @@ packages = [{ include = "omnata_plugin_devkit", from = "src" }]
|
|
|
10
10
|
# support 3.10 - 3.13
|
|
11
11
|
python = ">=3.10, <=3.13"
|
|
12
12
|
omnata_cli = "^0.2.3"
|
|
13
|
-
omnata-plugin-runtime = "
|
|
14
|
-
#pandas = "^2,<=2.3.3"
|
|
15
|
-
#numpy = "<=2.3.5"
|
|
16
|
-
#jinja2 = "^3,<=3.1.6"
|
|
13
|
+
omnata-plugin-runtime = "==0.12.10a374"
|
|
17
14
|
python-slugify = "^8"
|
|
18
15
|
vcrpy = "^4"
|
|
19
16
|
tabulate = "^0.9"
|
|
@@ -6,7 +6,8 @@ create or replace procedure PLUGIN.API_LIMITS(
|
|
|
6
6
|
OTHER_SECRETS_NAME VARCHAR)
|
|
7
7
|
returns object
|
|
8
8
|
language python
|
|
9
|
-
RUNTIME_VERSION = '3.
|
|
9
|
+
RUNTIME_VERSION = '3.12'
|
|
10
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
10
11
|
PACKAGES = ({{packages}})
|
|
11
12
|
IMPORTS = ('/app.zip')
|
|
12
13
|
HANDLER = 'run'
|
|
@@ -2,7 +2,8 @@ create or replace procedure PLUGIN.CONFIGURATION_FORM(
|
|
|
2
2
|
CONNECTION_FORM_REQUEST OBJECT)
|
|
3
3
|
returns object
|
|
4
4
|
language python
|
|
5
|
-
RUNTIME_VERSION = '3.
|
|
5
|
+
RUNTIME_VERSION = '3.12'
|
|
6
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
6
7
|
PACKAGES = ({{packages}})
|
|
7
8
|
IMPORTS = ('/app.zip')
|
|
8
9
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.CONNECTION_FORM(CONNECTIVITY_OPTION VARCHAR)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -7,7 +7,8 @@ create or replace procedure PLUGIN.CONNECTION_TEST(
|
|
|
7
7
|
OTHER_SECRETS_NAME VARCHAR)
|
|
8
8
|
returns object
|
|
9
9
|
language python
|
|
10
|
-
RUNTIME_VERSION = '3.
|
|
10
|
+
RUNTIME_VERSION = '3.12'
|
|
11
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
11
12
|
PACKAGES = ({{packages}})
|
|
12
13
|
IMPORTS = ('/app.zip')
|
|
13
14
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.CONSTRUCT_FORM_OPTION(FUNCTION_NAME VARCHAR,STORED_VALUES ARRAY)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.CREATE_BILLING_EVENTS(BILLING_EVENT_REQUEST OBJECT)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.CREATE_GENERIC_SECRET_OBJECT(SECRET_NAME VARCHAR, SECRET_CONTENTS VARCHAR)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
HANDLER = 'run'
|
|
7
8
|
COMMENT = $$
|
|
@@ -8,7 +8,8 @@ create or replace procedure PLUGIN.INBOUND_LIST_STREAMS(
|
|
|
8
8
|
SELECTED_STREAMS ARRAY)
|
|
9
9
|
returns table(RESULT object)
|
|
10
10
|
language python
|
|
11
|
-
RUNTIME_VERSION = '3.
|
|
11
|
+
RUNTIME_VERSION = '3.12'
|
|
12
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
12
13
|
PACKAGES = ({{packages}})
|
|
13
14
|
IMPORTS = ('/app.zip')
|
|
14
15
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.LIST_STAGES()
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -5,7 +5,8 @@ create or replace procedure PLUGIN.NETWORK_ADDRESSES(
|
|
|
5
5
|
)
|
|
6
6
|
returns object
|
|
7
7
|
language python
|
|
8
|
-
RUNTIME_VERSION = '3.
|
|
8
|
+
RUNTIME_VERSION = '3.12'
|
|
9
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
9
10
|
PACKAGES = ({{packages}})
|
|
10
11
|
IMPORTS = ('/app.zip')
|
|
11
12
|
HANDLER = 'run'
|
|
@@ -6,7 +6,8 @@ create or replace procedure PLUGIN.NGROK_POST_TUNNEL_FIELDS(
|
|
|
6
6
|
FUNCTION_NAME VARCHAR)
|
|
7
7
|
returns object
|
|
8
8
|
language python
|
|
9
|
-
RUNTIME_VERSION = '3.
|
|
9
|
+
RUNTIME_VERSION = '3.12'
|
|
10
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
10
11
|
PACKAGES = ({{packages}})
|
|
11
12
|
IMPORTS = ('/app.zip')
|
|
12
13
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace function PLUGIN.OUTBOUND_RECORD_VALIDATOR(SYNC_PARAMETERS OBJECT,FIELD_MAPPINGS OBJECT,TRANSFORM_RECORD OBJECT,SOURCE_TYPES OBJECT)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.RETRIEVE_SECRETS(OAUTH_SECRET_NAME VARCHAR,OTHER_SECRETS_NAME VARCHAR)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
create or replace function PLUGIN.RETRIEVE_SECRETS_UDF(OAUTH_SECRET_NAME VARCHAR,OTHER_SECRETS_NAME VARCHAR)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
5
|
HANDLER = 'run'
|
|
6
6
|
COMMENT = $$
|
|
7
7
|
Allows this plugin to retrieve its own secrets during CONFIGURE_API calls.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.SET_CONNECTION_OBJECTS(PARAMETERS OBJECT)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.SYNC(SYNC_REQUEST OBJECT)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -2,7 +2,8 @@ create or replace procedure PLUGIN.TUNNEL_TEST(TUNNEL_TYPE VARCHAR,
|
|
|
2
2
|
OTHER_SECRETS_NAME VARCHAR)
|
|
3
3
|
returns object
|
|
4
4
|
language python
|
|
5
|
-
RUNTIME_VERSION = '3.
|
|
5
|
+
RUNTIME_VERSION = '3.12'
|
|
6
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
6
7
|
PACKAGES = ({{packages}})
|
|
7
8
|
IMPORTS = ('/app.zip')
|
|
8
9
|
HANDLER = 'run'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.UPDATE_GENERIC_SECRET_OBJECT(SECRET_NAME VARCHAR,SECRET_CONTENTS VARCHAR,MERGE_WITH_OTHER_SECRET VARCHAR)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
4
|
+
RUNTIME_VERSION = '3.12'
|
|
5
|
+
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
6
|
PACKAGES = ({{packages}})
|
|
6
7
|
IMPORTS = ('/app.zip')
|
|
7
8
|
HANDLER = 'run'
|
|
@@ -14,7 +14,6 @@ import distutils.core
|
|
|
14
14
|
import inspect
|
|
15
15
|
import json
|
|
16
16
|
import os
|
|
17
|
-
import re
|
|
18
17
|
import shutil
|
|
19
18
|
import sys
|
|
20
19
|
import typing
|
|
@@ -22,7 +21,7 @@ import zipfile
|
|
|
22
21
|
import copy
|
|
23
22
|
import uuid
|
|
24
23
|
from pathlib import Path
|
|
25
|
-
from typing import Any, Dict, List, Literal, Optional
|
|
24
|
+
from typing import Any, Dict, List, Literal, Optional, cast
|
|
26
25
|
|
|
27
26
|
from pathlib import Path
|
|
28
27
|
|
|
@@ -34,8 +33,6 @@ from omnata_plugin_runtime.omnata_plugin import (
|
|
|
34
33
|
UDFDefinition, UDTFDefinition
|
|
35
34
|
)
|
|
36
35
|
from omnata_plugin_devkit.snowcli.cli.plugins.snowpark import package_utils
|
|
37
|
-
from omnata_plugin_devkit.snowcli.cli.plugins.snowpark import snowpark_shared
|
|
38
|
-
from omnata_plugin_devkit.snowcli.cli.plugins.snowpark.models import PypiOption
|
|
39
36
|
from snowflake.snowpark import Session
|
|
40
37
|
import importlib.metadata
|
|
41
38
|
|
|
@@ -67,7 +64,7 @@ class PluginUploader:
|
|
|
67
64
|
manifest: PluginManifest,
|
|
68
65
|
anaconda_packages: List[str],
|
|
69
66
|
bundled_packages: List[str],
|
|
70
|
-
icon_source: str,
|
|
67
|
+
icon_source: Optional[str],
|
|
71
68
|
plugin_class_name: str,
|
|
72
69
|
has_custom_validator: bool,
|
|
73
70
|
plugin_runtime_version: str,
|
|
@@ -124,7 +121,7 @@ class PluginUploader:
|
|
|
124
121
|
version_comment: str = "",
|
|
125
122
|
log_level: str = "INFO",
|
|
126
123
|
udf_directory_override: Optional[str] = None,
|
|
127
|
-
) -> str:
|
|
124
|
+
) -> Optional[str]:
|
|
128
125
|
"""
|
|
129
126
|
Creates a stage and uploads the latest plugin artifacts, Omnata runtime etc.
|
|
130
127
|
If the schema name is not provided, the plugin_id from the manifest will be used.
|
|
@@ -180,9 +177,10 @@ class PluginUploader:
|
|
|
180
177
|
else:
|
|
181
178
|
tier_file = Path(os.path.join(plugin_directory, "tier.txt"))
|
|
182
179
|
if tier_file.exists():
|
|
183
|
-
|
|
184
|
-
if
|
|
185
|
-
raise ValueError(f"Invalid tier {
|
|
180
|
+
plugin_tier_raw = tier_file.read_text(encoding="utf-8").strip()
|
|
181
|
+
if plugin_tier_raw not in ["standard","premium","byo","free"]:
|
|
182
|
+
raise ValueError(f"Invalid tier {plugin_tier_raw} in {tier_file}")
|
|
183
|
+
plugin_tier = cast(Literal["byo","free","standard","premium"], plugin_tier_raw)
|
|
186
184
|
print(f"Using plugin tier: {plugin_tier}")
|
|
187
185
|
license_url_file = Path(os.path.join(plugin_directory, "license_url.txt"))
|
|
188
186
|
license_url: Optional[str] = (
|
|
@@ -214,7 +212,7 @@ class PluginUploader:
|
|
|
214
212
|
# do checks first
|
|
215
213
|
|
|
216
214
|
icon_file_name = "icon.svg"
|
|
217
|
-
icon_source = None
|
|
215
|
+
icon_source:Optional[str] = None
|
|
218
216
|
if os.path.exists(os.path.join(plugin_directory, icon_file_name)):
|
|
219
217
|
print("Using icon from icon.svg")
|
|
220
218
|
with open(
|
|
@@ -246,60 +244,34 @@ class PluginUploader:
|
|
|
246
244
|
if os.path.exists("build.zip"):
|
|
247
245
|
os.remove("build.zip")
|
|
248
246
|
|
|
249
|
-
print("
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
# Copy each file, skipping those in the specified folder
|
|
261
|
-
# some packages are named inconsistently which makes them hard to remove from the artifact
|
|
262
|
-
for item in zip_read.infolist():
|
|
263
|
-
if not item.filename.startswith('.packages') and \
|
|
264
|
-
not item.filename.startswith('udf_direct_imports') and \
|
|
265
|
-
not item.filename.startswith('pydantic_core'):
|
|
266
|
-
if item.filename.endswith('.so'):
|
|
267
|
-
raise ValueError(f"Native library found in package: {item.filename}")
|
|
268
|
-
data = zip_read.read(item.filename)
|
|
269
|
-
zip_write.writestr(item, data)
|
|
247
|
+
print("Building app.zip from plugin source")
|
|
248
|
+
with zipfile.ZipFile('app.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
|
|
249
|
+
for root, dirs, files in os.walk('.'):
|
|
250
|
+
dirs[:] = [d for d in dirs if not d.startswith('.') and d != '__pycache__' and d != 'udf_direct_imports']
|
|
251
|
+
for fname in files:
|
|
252
|
+
if fname.startswith('.'):
|
|
253
|
+
continue
|
|
254
|
+
if fname.endswith('.so'):
|
|
255
|
+
raise ValueError(f"Native library found in package: {os.path.join(root, fname)}")
|
|
256
|
+
full = os.path.join(root, fname)
|
|
257
|
+
zf.write(full, os.path.relpath(full, '.'))
|
|
270
258
|
self.session.sql(
|
|
271
259
|
f"put file://app.zip @{database_name}.{schema_name}.{stage_name} AUTO_COMPRESS=FALSE OVERWRITE=TRUE"
|
|
272
260
|
).collect()
|
|
273
261
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
if f.is_dir() and os.path.join(".packages","omnata_plugin_runtime-") in f.path
|
|
280
|
-
]
|
|
281
|
-
if len(subfolders) != 1:
|
|
262
|
+
requirements_list = package_utils.parse_requirements("requirements.txt")
|
|
263
|
+
all_packages: List[str] = [r.line for r in requirements_list]
|
|
264
|
+
|
|
265
|
+
runtime_reqs = [r for r in requirements_list if r.name == "omnata-plugin-runtime"]
|
|
266
|
+
if len(runtime_reqs) != 1 or len(runtime_reqs[0].specs) == 0:
|
|
282
267
|
raise ValueError(
|
|
283
|
-
"
|
|
268
|
+
"requirements.txt must contain a pinned omnata-plugin-runtime entry (e.g. omnata-plugin-runtime==X.Y.Z)"
|
|
284
269
|
)
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
r"^\.packages.omnata_plugin_runtime-(.*)\.dist-info$", subfolder
|
|
288
|
-
)
|
|
289
|
-
if regex_matches is None:
|
|
270
|
+
op, omnata_plugin_runtime_version = runtime_reqs[0].specs[0]
|
|
271
|
+
if op != "==":
|
|
290
272
|
raise ValueError(
|
|
291
|
-
"
|
|
273
|
+
f"omnata-plugin-runtime must be pinned with '==' (got '{op}{omnata_plugin_runtime_version}')"
|
|
292
274
|
)
|
|
293
|
-
omnata_plugin_runtime_version = regex_matches.group(1)
|
|
294
|
-
anaconda_packages = package_utils.parse_requirements("requirements.snowflake.txt")
|
|
295
|
-
anaconda_package_names: List[str] = [
|
|
296
|
-
r.name
|
|
297
|
-
for r in anaconda_packages
|
|
298
|
-
]
|
|
299
|
-
other_packages = package_utils.parse_requirements("requirements.other.txt")
|
|
300
|
-
other_package_names: List[str] = [
|
|
301
|
-
r.name for r in other_packages
|
|
302
|
-
]
|
|
303
275
|
os.chdir(original_wd)
|
|
304
276
|
# icon_file_name_full = os.path.abspath(os.path.join(plugin_directory,icon_file_name))
|
|
305
277
|
# print(f'Loading icon file {icon_file_name_full} into stage')
|
|
@@ -310,37 +282,10 @@ class PluginUploader:
|
|
|
310
282
|
plugin_fqn: str = f"{manifest.developer_id}__{manifest.plugin_id}".upper()
|
|
311
283
|
|
|
312
284
|
install_script = "setup_script.sql"
|
|
313
|
-
default_packages = ["dictdiffer", "jinja2", "requests", "pydantic","snowflake-telemetry-python"]
|
|
314
|
-
if len([w for w in anaconda_packages if "snowflake-snowpark-python" in w.name]) == 0:
|
|
315
|
-
# if not present at all, pin it to a specific version
|
|
316
|
-
anaconda_package_names = anaconda_package_names + ["snowflake-snowpark-python==1.22.1"]
|
|
317
|
-
print("snowflake-snowpark-python not present, adding to default packages")
|
|
318
|
-
else:
|
|
319
|
-
snowpark_package = [w for w in anaconda_packages if "snowflake-snowpark-python" in w.name][0]
|
|
320
|
-
if len(snowpark_package.specs) == 0:
|
|
321
|
-
print("snowflake-snowpark-python found unpinned, replacing with pinned version")
|
|
322
|
-
anaconda_package_names = [
|
|
323
|
-
w if w != "snowflake-snowpark-python" else "snowflake-snowpark-python==1.22.1"
|
|
324
|
-
for w in anaconda_package_names
|
|
325
|
-
]
|
|
326
|
-
else:
|
|
327
|
-
print(f"{snowpark_package.name} found already pinned ({snowpark_package.line}), leaving alone")
|
|
328
|
-
anaconda_package_names = [
|
|
329
|
-
w.name if w.name != "snowflake-snowpark-python" else w.line
|
|
330
|
-
for w in anaconda_packages
|
|
331
|
-
]
|
|
332
|
-
# remove snowflake-connector-python if it's found its way into the other packages or the anaconda packages
|
|
333
|
-
other_package_names = [
|
|
334
|
-
w for w in other_package_names if "snowflake-connector-python" not in w
|
|
335
|
-
]
|
|
336
|
-
anaconda_package_names = [
|
|
337
|
-
w for w in anaconda_package_names if "snowflake-connector-python" not in w
|
|
338
|
-
]
|
|
339
285
|
has_custom_validator = (
|
|
340
286
|
plugin_class_instance.outbound_record_validator.__module__ != 'omnata_plugin_runtime.omnata_plugin'
|
|
341
287
|
)
|
|
342
288
|
print(f"Has custom validator: {has_custom_validator} ({plugin_class_instance.outbound_record_validator.__module__})")
|
|
343
|
-
all_packages = list(set(default_packages + anaconda_package_names))
|
|
344
289
|
packages_to_include = [
|
|
345
290
|
f"'{p}'" for p in all_packages
|
|
346
291
|
]
|
|
@@ -544,7 +489,7 @@ $${}$$;
|
|
|
544
489
|
print(f"Found {udf.language} UDF: {udf.name}, consumer facing: {udf.expose_to_consumer}")
|
|
545
490
|
if udf.language == "python":
|
|
546
491
|
udf.packages = all_packages
|
|
547
|
-
setup_script.write(str(udf))
|
|
492
|
+
setup_script.write(_inject_artifact_repository(str(udf)))
|
|
548
493
|
if udf.expose_to_consumer is True:
|
|
549
494
|
setup_script.write(
|
|
550
495
|
f"grant usage on function UDFS.{function_signature(input=udf,include_name=True,include_params='data_types_only',connection_parameter='leave')} to application role CONSUMER_FUNCTION_CALLER;\n"
|
|
@@ -570,7 +515,7 @@ $${}$$;
|
|
|
570
515
|
print(f"Found {udtf.language} UDTF: {udtf.name}, consumer facing: {udtf.expose_to_consumer}")
|
|
571
516
|
if udtf.language == "python":
|
|
572
517
|
udtf.packages = all_packages
|
|
573
|
-
setup_script.write(str(udtf))
|
|
518
|
+
setup_script.write(_inject_artifact_repository(str(udtf)))
|
|
574
519
|
if udtf.expose_to_consumer is True:
|
|
575
520
|
setup_script.write(
|
|
576
521
|
f"grant usage on function UDFS.{function_signature(input=udtf,include_name=True,include_params='data_types_only',connection_parameter='leave')} to application role CONSUMER_FUNCTION_CALLER;\n"
|
|
@@ -604,8 +549,8 @@ $${}$$;
|
|
|
604
549
|
setup_script.write(
|
|
605
550
|
self.plugin_info_udf_definition(
|
|
606
551
|
manifest=manifest,
|
|
607
|
-
anaconda_packages=
|
|
608
|
-
bundled_packages=
|
|
552
|
+
anaconda_packages=all_packages,
|
|
553
|
+
bundled_packages=[],
|
|
609
554
|
icon_source=icon_source,
|
|
610
555
|
plugin_class_name=plugin_class_name,
|
|
611
556
|
has_custom_validator=has_custom_validator,
|
|
@@ -738,8 +683,8 @@ GRANT USAGE ON FUNCTION PLUGIN.TOKEN() TO application role OMNATA_MANAGEMENT;
|
|
|
738
683
|
self.session.sql(
|
|
739
684
|
self.plugin_info_udf_definition(
|
|
740
685
|
manifest=manifest,
|
|
741
|
-
anaconda_packages=
|
|
742
|
-
bundled_packages=
|
|
686
|
+
anaconda_packages=all_packages,
|
|
687
|
+
bundled_packages=[],
|
|
743
688
|
icon_source=icon_source,
|
|
744
689
|
plugin_class_name=plugin_class_name,
|
|
745
690
|
has_custom_validator=has_custom_validator,
|
|
@@ -755,6 +700,14 @@ GRANT USAGE ON FUNCTION PLUGIN.TOKEN() TO application role OMNATA_MANAGEMENT;
|
|
|
755
700
|
return schema_name
|
|
756
701
|
|
|
757
702
|
|
|
703
|
+
def _inject_artifact_repository(udf_sql: str) -> str:
|
|
704
|
+
return udf_sql.replace(
|
|
705
|
+
"PACKAGES = (",
|
|
706
|
+
"ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository\nPACKAGES = (",
|
|
707
|
+
1,
|
|
708
|
+
)
|
|
709
|
+
|
|
710
|
+
|
|
758
711
|
def prepare_version_comment(version_comment:str):
|
|
759
712
|
"""
|
|
760
713
|
The manifest file takes a comment, but since it's in YAML you have to do a bunch of silly work to make it valid and multiline.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|