omnata-plugin-devkit 0.13.8a200__tar.gz → 0.13.8a203__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.8a200 → omnata_plugin_devkit-0.13.8a203}/PKG-INFO +3 -3
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/pyproject.toml +6 -3
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/API_LIMITS.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CONFIGURATION_FORM.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CONNECTION_FORM.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CONNECTION_TEST.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CONSTRUCT_FORM_OPTION.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CREATE_BILLING_EVENTS.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CREATE_GENERIC_SECRET_OBJECT.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/GET_MISSING_APP_PRIVILEGES.sql.jinja +1 -1
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/INBOUND_LIST_STREAMS.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/LIST_STAGES.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/NETWORK_ADDRESSES.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/NGROK_POST_TUNNEL_FIELDS.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/OUTBOUND_RECORD_VALIDATOR.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_SECRETS.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_SECRETS_UDF.sql.jinja +1 -1
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/SET_CONNECTION_OBJECTS.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/SYNC.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/TUNNEL_TEST.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/UPDATE_GENERIC_SECRET_OBJECT.sql.jinja +1 -2
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/plugin_uploader.py +89 -42
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/LICENSE +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/README.md +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/airbyte_wrapper.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/cli/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/development.ipynb +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/development_session.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/initialiser.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/ASSIGN_OUTBOUND_TARGET_TYPE.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CHECK_CONNECTION_PROGRESS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CONFIGURE_APIS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CREATE_GENERIC_SECRET_OBJECT_FROM_EXISTING.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CREATE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CREATE_NETWORK_RULE_OBJECT_FROM_EXISTING.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/CREATE_OAUTH_SECRET_OBJECT.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/DROP_CONFIGURATION_DEFINITION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/DROP_INTEGRATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/DROP_NETWORK_RULES.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/DROP_SECRETS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/DROP_SPECIFICATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/FETCH_CONNECTIONS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/FETCH_SYNCS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/FETCH_SYNC_BRANCHES.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/LIST_APP_SPECIFICATIONS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/PENDING_API_CONFIGURATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/POST_INSTALL_ACTIONS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/RENAME_CONNECTION_METHODS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/RETRIEVE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/SET_EAI_ACTIVE.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/SET_EAI_SPECIFICATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/SET_SI_SPECIFICATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/TEST_CALLBACK.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/TEST_OAUTH_TOKEN_EXISTS.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/UPDATE_API_CONFIGURATION.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/UPDATE_GENERIC_SECRET_OBJECT_OLD.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/UPDATE_NETWORK_RULE_OBJECT.sql.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/jinja_templates/manifest.yml.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/native_app_packaging.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/plugin_registration.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/plugin_template/icon.svg +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/plugin_template/plugin.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/plugin_template/plugin_development.ipynb +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/plugin_template/requirements.txt +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/api/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/api/config.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/api/constants.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/api/exceptions.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/api/secure_path.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/api/secure_utils.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/api/utils/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/api/utils/types.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/app/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/app/snow_connector.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/plugins/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/models.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/package/__init__.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/package_utils.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/snowpark_shared.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/venv.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/plugins/snowpark/zipper.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/snowcli/cli/templates/environment.yml.jinja +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/streamlit/plugin_configuration.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/src/omnata_plugin_devkit/test_step_definitions.py +0 -0
- {omnata_plugin_devkit-0.13.8a200 → omnata_plugin_devkit-0.13.8a203}/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.8a203
|
|
4
4
|
Summary:
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Author: James Weakley
|
|
@@ -13,14 +13,14 @@ 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.5)
|
|
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)
|
|
20
20
|
Requires-Dist: requirements-parser (==0.13.0)
|
|
21
21
|
Requires-Dist: snowflake-connector-python[pandas] (<=4.3.0)
|
|
22
22
|
Requires-Dist: tabulate (>=0.9,<0.10)
|
|
23
|
-
Requires-Dist: vcrpy (>=
|
|
23
|
+
Requires-Dist: vcrpy (>=7,<8)
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
25
|
|
|
26
26
|
# omnata-plugin-devkit
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "omnata-plugin-devkit"
|
|
3
|
-
version = "0.13.
|
|
3
|
+
version = "0.13.8a203"
|
|
4
4
|
description = ""
|
|
5
5
|
authors = ["James Weakley <james.weakley@omnata.com>"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -10,9 +10,12 @@ 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 = "
|
|
13
|
+
omnata-plugin-runtime = ">=0.12.5"
|
|
14
|
+
#pandas = "^2,<=2.3.3"
|
|
15
|
+
#numpy = "<=2.3.5"
|
|
16
|
+
#jinja2 = "^3,<=3.1.6"
|
|
14
17
|
python-slugify = "^8"
|
|
15
|
-
vcrpy = "^
|
|
18
|
+
vcrpy = "^7"
|
|
16
19
|
tabulate = "^0.9"
|
|
17
20
|
behave = "^1.2"
|
|
18
21
|
behave_pandas = "^0.5.0"
|
|
@@ -6,8 +6,7 @@ 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.
|
|
10
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
9
|
+
RUNTIME_VERSION = '3.10'
|
|
11
10
|
PACKAGES = ({{packages}})
|
|
12
11
|
IMPORTS = ('/app.zip')
|
|
13
12
|
HANDLER = 'run'
|
|
@@ -2,8 +2,7 @@ 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.
|
|
6
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
|
+
RUNTIME_VERSION = '3.10'
|
|
7
6
|
PACKAGES = ({{packages}})
|
|
8
7
|
IMPORTS = ('/app.zip')
|
|
9
8
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.CONNECTION_FORM(CONNECTIVITY_OPTION VARCHAR)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
HANDLER = 'run'
|
|
@@ -7,8 +7,7 @@ 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.
|
|
11
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
10
|
+
RUNTIME_VERSION = '3.10'
|
|
12
11
|
PACKAGES = ({{packages}})
|
|
13
12
|
IMPORTS = ('/app.zip')
|
|
14
13
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
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.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
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.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
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.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
HANDLER = 'run'
|
|
8
7
|
COMMENT = $$
|
|
@@ -8,8 +8,7 @@ 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.
|
|
12
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
11
|
+
RUNTIME_VERSION = '3.10'
|
|
13
12
|
PACKAGES = ({{packages}})
|
|
14
13
|
IMPORTS = ('/app.zip')
|
|
15
14
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.LIST_STAGES()
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
HANDLER = 'run'
|
|
@@ -5,8 +5,7 @@ create or replace procedure PLUGIN.NETWORK_ADDRESSES(
|
|
|
5
5
|
)
|
|
6
6
|
returns object
|
|
7
7
|
language python
|
|
8
|
-
RUNTIME_VERSION = '3.
|
|
9
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
8
|
+
RUNTIME_VERSION = '3.10'
|
|
10
9
|
PACKAGES = ({{packages}})
|
|
11
10
|
IMPORTS = ('/app.zip')
|
|
12
11
|
HANDLER = 'run'
|
|
@@ -6,8 +6,7 @@ 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.
|
|
10
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
9
|
+
RUNTIME_VERSION = '3.10'
|
|
11
10
|
PACKAGES = ({{packages}})
|
|
12
11
|
IMPORTS = ('/app.zip')
|
|
13
12
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
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.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
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.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
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.10'
|
|
5
5
|
HANDLER = 'run'
|
|
6
6
|
COMMENT = $$
|
|
7
7
|
Allows this plugin to retrieve its own secrets during CONFIGURE_API calls.
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.SET_CONNECTION_OBJECTS(PARAMETERS OBJECT)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
create or replace procedure PLUGIN.SYNC(SYNC_REQUEST OBJECT)
|
|
2
2
|
returns object
|
|
3
3
|
language python
|
|
4
|
-
RUNTIME_VERSION = '3.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
HANDLER = 'run'
|
|
@@ -2,8 +2,7 @@ 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.
|
|
6
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
5
|
+
RUNTIME_VERSION = '3.10'
|
|
7
6
|
PACKAGES = ({{packages}})
|
|
8
7
|
IMPORTS = ('/app.zip')
|
|
9
8
|
HANDLER = 'run'
|
|
@@ -1,8 +1,7 @@
|
|
|
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.
|
|
5
|
-
ARTIFACT_REPOSITORY = snowflake.snowpark.pypi_shared_repository
|
|
4
|
+
RUNTIME_VERSION = '3.10'
|
|
6
5
|
PACKAGES = ({{packages}})
|
|
7
6
|
IMPORTS = ('/app.zip')
|
|
8
7
|
HANDLER = 'run'
|
|
@@ -14,6 +14,7 @@ import distutils.core
|
|
|
14
14
|
import inspect
|
|
15
15
|
import json
|
|
16
16
|
import os
|
|
17
|
+
import re
|
|
17
18
|
import shutil
|
|
18
19
|
import sys
|
|
19
20
|
import typing
|
|
@@ -21,7 +22,7 @@ import zipfile
|
|
|
21
22
|
import copy
|
|
22
23
|
import uuid
|
|
23
24
|
from pathlib import Path
|
|
24
|
-
from typing import Any, Dict, List, Literal, Optional
|
|
25
|
+
from typing import Any, Dict, List, Literal, Optional
|
|
25
26
|
|
|
26
27
|
from pathlib import Path
|
|
27
28
|
|
|
@@ -33,6 +34,8 @@ from omnata_plugin_runtime.omnata_plugin import (
|
|
|
33
34
|
UDFDefinition, UDTFDefinition
|
|
34
35
|
)
|
|
35
36
|
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
|
|
36
39
|
from snowflake.snowpark import Session
|
|
37
40
|
import importlib.metadata
|
|
38
41
|
|
|
@@ -64,7 +67,7 @@ class PluginUploader:
|
|
|
64
67
|
manifest: PluginManifest,
|
|
65
68
|
anaconda_packages: List[str],
|
|
66
69
|
bundled_packages: List[str],
|
|
67
|
-
icon_source:
|
|
70
|
+
icon_source: str,
|
|
68
71
|
plugin_class_name: str,
|
|
69
72
|
has_custom_validator: bool,
|
|
70
73
|
plugin_runtime_version: str,
|
|
@@ -121,7 +124,7 @@ class PluginUploader:
|
|
|
121
124
|
version_comment: str = "",
|
|
122
125
|
log_level: str = "INFO",
|
|
123
126
|
udf_directory_override: Optional[str] = None,
|
|
124
|
-
) ->
|
|
127
|
+
) -> str:
|
|
125
128
|
"""
|
|
126
129
|
Creates a stage and uploads the latest plugin artifacts, Omnata runtime etc.
|
|
127
130
|
If the schema name is not provided, the plugin_id from the manifest will be used.
|
|
@@ -177,10 +180,9 @@ class PluginUploader:
|
|
|
177
180
|
else:
|
|
178
181
|
tier_file = Path(os.path.join(plugin_directory, "tier.txt"))
|
|
179
182
|
if tier_file.exists():
|
|
180
|
-
|
|
181
|
-
if
|
|
182
|
-
raise ValueError(f"Invalid tier {
|
|
183
|
-
plugin_tier = cast(Literal["byo","free","standard","premium"], plugin_tier_raw)
|
|
183
|
+
plugin_tier = tier_file.read_text(encoding="utf-8").strip()
|
|
184
|
+
if plugin_tier not in ["standard","premium","byo","free"]:
|
|
185
|
+
raise ValueError(f"Invalid tier {plugin_tier} in {tier_file}")
|
|
184
186
|
print(f"Using plugin tier: {plugin_tier}")
|
|
185
187
|
license_url_file = Path(os.path.join(plugin_directory, "license_url.txt"))
|
|
186
188
|
license_url: Optional[str] = (
|
|
@@ -212,7 +214,7 @@ class PluginUploader:
|
|
|
212
214
|
# do checks first
|
|
213
215
|
|
|
214
216
|
icon_file_name = "icon.svg"
|
|
215
|
-
icon_source
|
|
217
|
+
icon_source = None
|
|
216
218
|
if os.path.exists(os.path.join(plugin_directory, icon_file_name)):
|
|
217
219
|
print("Using icon from icon.svg")
|
|
218
220
|
with open(
|
|
@@ -244,34 +246,60 @@ class PluginUploader:
|
|
|
244
246
|
if os.path.exists("build.zip"):
|
|
245
247
|
os.remove("build.zip")
|
|
246
248
|
|
|
247
|
-
print("
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
249
|
+
print("Creating Snowpark package for Snowflake")
|
|
250
|
+
# we allow native libraries to be included in the package, but then check ourselves
|
|
251
|
+
snowpark_shared.snowpark_package(
|
|
252
|
+
source=Path('.'),
|
|
253
|
+
artifact_file=Path('build.zip'),
|
|
254
|
+
pypi_download=PypiOption.YES,
|
|
255
|
+
check_anaconda_for_pypi_deps=True,
|
|
256
|
+
package_native_libraries=PypiOption.YES,
|
|
257
|
+
)
|
|
258
|
+
with zipfile.ZipFile('build.zip', 'r') as zip_read:
|
|
259
|
+
with zipfile.ZipFile('app.zip', 'w') as zip_write:
|
|
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)
|
|
258
270
|
self.session.sql(
|
|
259
271
|
f"put file://app.zip @{database_name}.{schema_name}.{stage_name} AUTO_COMPRESS=FALSE OVERWRITE=TRUE"
|
|
260
272
|
).collect()
|
|
261
273
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
274
|
+
if not os.path.exists(".packages"):
|
|
275
|
+
raise ValueError(".packages directory not found after packaging")
|
|
276
|
+
subfolders = [
|
|
277
|
+
f.path
|
|
278
|
+
for f in os.scandir(".packages")
|
|
279
|
+
if f.is_dir() and os.path.join(".packages","omnata_plugin_runtime-") in f.path
|
|
280
|
+
]
|
|
281
|
+
if len(subfolders) != 1:
|
|
267
282
|
raise ValueError(
|
|
268
|
-
"
|
|
283
|
+
"Failed to find omnata-plugin-runtime in downloaded package metadata"
|
|
269
284
|
)
|
|
270
|
-
|
|
271
|
-
|
|
285
|
+
subfolder = subfolders[0]
|
|
286
|
+
regex_matches = re.search(
|
|
287
|
+
r"^\.packages.omnata_plugin_runtime-(.*)\.dist-info$", subfolder
|
|
288
|
+
)
|
|
289
|
+
if regex_matches is None:
|
|
272
290
|
raise ValueError(
|
|
273
|
-
|
|
291
|
+
"Failed to parse version of omnata-plugin-runtime package from metadata"
|
|
274
292
|
)
|
|
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
|
+
]
|
|
275
303
|
os.chdir(original_wd)
|
|
276
304
|
# icon_file_name_full = os.path.abspath(os.path.join(plugin_directory,icon_file_name))
|
|
277
305
|
# print(f'Loading icon file {icon_file_name_full} into stage')
|
|
@@ -282,10 +310,37 @@ class PluginUploader:
|
|
|
282
310
|
plugin_fqn: str = f"{manifest.developer_id}__{manifest.plugin_id}".upper()
|
|
283
311
|
|
|
284
312
|
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
|
+
]
|
|
285
339
|
has_custom_validator = (
|
|
286
340
|
plugin_class_instance.outbound_record_validator.__module__ != 'omnata_plugin_runtime.omnata_plugin'
|
|
287
341
|
)
|
|
288
342
|
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))
|
|
289
344
|
packages_to_include = [
|
|
290
345
|
f"'{p}'" for p in all_packages
|
|
291
346
|
]
|
|
@@ -489,7 +544,7 @@ $${}$$;
|
|
|
489
544
|
print(f"Found {udf.language} UDF: {udf.name}, consumer facing: {udf.expose_to_consumer}")
|
|
490
545
|
if udf.language == "python":
|
|
491
546
|
udf.packages = all_packages
|
|
492
|
-
setup_script.write(
|
|
547
|
+
setup_script.write(str(udf))
|
|
493
548
|
if udf.expose_to_consumer is True:
|
|
494
549
|
setup_script.write(
|
|
495
550
|
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"
|
|
@@ -515,7 +570,7 @@ $${}$$;
|
|
|
515
570
|
print(f"Found {udtf.language} UDTF: {udtf.name}, consumer facing: {udtf.expose_to_consumer}")
|
|
516
571
|
if udtf.language == "python":
|
|
517
572
|
udtf.packages = all_packages
|
|
518
|
-
setup_script.write(
|
|
573
|
+
setup_script.write(str(udtf))
|
|
519
574
|
if udtf.expose_to_consumer is True:
|
|
520
575
|
setup_script.write(
|
|
521
576
|
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"
|
|
@@ -549,8 +604,8 @@ $${}$$;
|
|
|
549
604
|
setup_script.write(
|
|
550
605
|
self.plugin_info_udf_definition(
|
|
551
606
|
manifest=manifest,
|
|
552
|
-
anaconda_packages=
|
|
553
|
-
bundled_packages=
|
|
607
|
+
anaconda_packages=anaconda_package_names,
|
|
608
|
+
bundled_packages=other_package_names,
|
|
554
609
|
icon_source=icon_source,
|
|
555
610
|
plugin_class_name=plugin_class_name,
|
|
556
611
|
has_custom_validator=has_custom_validator,
|
|
@@ -683,8 +738,8 @@ GRANT USAGE ON FUNCTION PLUGIN.TOKEN() TO application role OMNATA_MANAGEMENT;
|
|
|
683
738
|
self.session.sql(
|
|
684
739
|
self.plugin_info_udf_definition(
|
|
685
740
|
manifest=manifest,
|
|
686
|
-
anaconda_packages=
|
|
687
|
-
bundled_packages=
|
|
741
|
+
anaconda_packages=anaconda_package_names,
|
|
742
|
+
bundled_packages=other_package_names,
|
|
688
743
|
icon_source=icon_source,
|
|
689
744
|
plugin_class_name=plugin_class_name,
|
|
690
745
|
has_custom_validator=has_custom_validator,
|
|
@@ -700,14 +755,6 @@ GRANT USAGE ON FUNCTION PLUGIN.TOKEN() TO application role OMNATA_MANAGEMENT;
|
|
|
700
755
|
return schema_name
|
|
701
756
|
|
|
702
757
|
|
|
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
|
-
|
|
711
758
|
def prepare_version_comment(version_comment:str):
|
|
712
759
|
"""
|
|
713
760
|
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
|