Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#174: Add PYTHON3 to the add_missing_builtin option for the LanguageDefinition class #177

Merged
merged 7 commits into from
Mar 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/changes/changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Changes

* [0.16.0](changes_0.15.0.md)
* [0.15.0](changes_0.15.0.md)
* [0.14.0](changes_0.14.0.md)
* [0.13.0](changes_0.13.0.md)
Expand Down
4 changes: 3 additions & 1 deletion doc/changes/changes_0.15.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Besides, there is one more bugfix and a minor improvement in the documentation i
## Features / Enhancements

- #160: Streamed test output to log file
- #175: Update vagrant environment

## Refactorings

Expand All @@ -21,7 +22,8 @@ Besides, there is one more bugfix and a minor improvement in the documentation i

- #163: Fixed upload path if --path-in-bucket not specified
- #164: Fixed default values for click parameters of type multiple=true

- #174: Add missing PYTHON3 to the add_missing_builtin option for the LanguageDefinition class
-
## Documentation

- #152: Added note to exalsct scripts that these files are generated
23 changes: 23 additions & 0 deletions doc/changes/changes_0.16.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Script-Languages-Container-Tool 0.16.0, released 2023-03-17

Code name: Add missing PYTHON3 to the add_missing_builtin option for the LanguageDefinition class

## Summary

This release fix a bug where PYTHON3 was missing when the LanguageDefinition class was called with add_missing_builtin.

## Features / Enhancements

- #175: Update vagrant environment

## Refactorings

N/A

## Bug Fixes

- #174: Add missing PYTHON3 to the add_missing_builtin option for the LanguageDefinition class

## Documentation

N/A
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from pathlib import Path
from typing import Optional

from jinja2 import Template

Expand All @@ -9,7 +10,7 @@ def __init__(self,
flavor_path: str,
bucketfs_name: str,
bucket_name: str,
path_in_bucket: str,
path_in_bucket: Optional[str],
add_missing_builtin: bool = False):
self.path_in_bucket = path_in_bucket
self.bucket_name = bucket_name
Expand All @@ -19,6 +20,12 @@ def __init__(self,
self.add_missing_builtin = add_missing_builtin

def generate_definition(self):
language_definition = self._render_language_definition()
if self.add_missing_builtin:
language_definition = self._add_missing_builtin_language_definitions(language_definition)
return language_definition.strip()

def _render_language_definition(self):
path_in_bucket = self.path_in_bucket if self.path_in_bucket is not None else ""
if path_in_bucket != "" and not path_in_bucket.endswith("/"):
path_in_bucket = path_in_bucket + "/"
Expand All @@ -31,16 +38,18 @@ def generate_definition(self):
bucket_name=self.bucket_name,
path_in_bucket=path_in_bucket,
release_name=self.release_name)
if self.add_missing_builtin:
defined_aliases = [alias.split("=")[0]
for alias in language_definition.split(" ")]
builtin_aliases = ["PYTHON", "JAVA", "R"]
missing_aliases = set(builtin_aliases) - set(defined_aliases)
additional_language_defintions = " ".join(
alias + "=builtin_" + alias.lower() for alias in missing_aliases)
language_definition = " ".join(
[language_definition, additional_language_defintions])
return language_definition.strip()
return language_definition

def _add_missing_builtin_language_definitions(self, language_definition):
builtin_aliases = {"PYTHON", "PYTHON3", "JAVA", "R"}
defined_aliases = {alias.split("=")[0] for alias in language_definition.split(" ")}
missing_aliases = builtin_aliases - defined_aliases
sorted_missing_aliases = sorted(missing_aliases)
additional_language_defintions = " ".join(
f"{alias}=builtin_{alias.lower()}" for alias in sorted_missing_aliases
)
language_definition = f"{language_definition} {additional_language_defintions}"
return language_definition

def generate_alter_session(self):
return f"""ALTER SESSION SET SCRIPT_LANGUAGES='{self.generate_definition()}';"""
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "exasol-script-languages-container-tool"
version = "0.15.0"
version = "0.16.0"
description = "Script Languages Container Tool"

license = "MIT"
Expand Down
7 changes: 6 additions & 1 deletion scripts/build/check_release.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import re
from pathlib import Path
from typing import Tuple

from git import Repo
import toml
Expand All @@ -9,9 +10,13 @@ def get_git_version():
repo = Repo()
assert not repo.bare
tag_strings = [t.name for t in repo.tags]
tag_strings.sort(reverse=True)
tag_strings = [t for t in tag_strings if t != "latest"]

def version_string_to_tuple(version: str) -> Tuple[int, ...]:
return tuple(int(i) for i in version.split("."))

tag_strings = sorted(tag_strings, key=version_string_to_tuple, reverse=True)
print(tag_strings)
latest_tag = tag_strings[0].strip()
assert len(latest_tag) > 0
return latest_tag
Expand Down
2 changes: 1 addition & 1 deletion setup.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1 +1 @@
PYTHON3=localzmq+protobuf:///{{ bucketfs_name }}/{{ bucket_name }}/{{ path_in_bucket }}{{ release_name }}?lang=python#buckets/{{ bucketfs_name }}/{{ bucket_name }}/{{ path_in_bucket }}{{ release_name }}/exaudf/exaudfclient_py3
PYTHON3_TEST=localzmq+protobuf:///{{ bucketfs_name }}/{{ bucket_name }}/{{ path_in_bucket }}{{ release_name }}?lang=python#buckets/{{ bucketfs_name }}/{{ bucket_name }}/{{ path_in_bucket }}{{ release_name }}/exaudf/exaudfclient_py3
83 changes: 83 additions & 0 deletions test/test_container/tests/test/test_builtin_languages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#!/usr/bin/env python3

from exasol_python_test_framework import udf
from exasol_python_test_framework import docker_db_environment


class DockerDBEnvironmentTest(udf.TestCase):

def test_python(self):
schema = "DockerDBEnvironmentTest"
try:
self.query(udf.fixindent("DROP SCHEMA %s CASCADE" % schema), ignore_errors=True)
self.query(udf.fixindent("CREATE SCHEMA %s" % schema))
self.query(udf.fixindent("OPEN SCHEMA %s" % schema))
self.query(udf.fixindent('''
CREATE OR REPLACE PYTHON SCALAR SCRIPT test_python(i int) returns int AS

def run(ctx):
return 0
/
'''))
self.query("select test_python(0)")
finally:
self.query(udf.fixindent("DROP SCHEMA %s CASCADE" % schema))

def test_python3(self):
schema = "DockerDBEnvironmentTest"
try:
self.query(udf.fixindent("DROP SCHEMA %s CASCADE" % schema), ignore_errors=True)
self.query(udf.fixindent("CREATE SCHEMA %s" % schema))
self.query(udf.fixindent("OPEN SCHEMA %s" % schema))
self.query(udf.fixindent('''
CREATE OR REPLACE PYTHON3 SCALAR SCRIPT test_python3(i int) returns int AS

def run(ctx):
return 0
/
'''))
self.query("select test_python3(0)")
finally:
self.query(udf.fixindent("DROP SCHEMA %s CASCADE" % schema))

def test_java(self):
schema = "DockerDBEnvironmentTest"
try:
self.query(udf.fixindent("DROP SCHEMA %s CASCADE" % schema), ignore_errors=True)
self.query(udf.fixindent("CREATE SCHEMA %s" % schema))
self.query(udf.fixindent("OPEN SCHEMA %s" % schema))
self.query(udf.fixindent('''
CREATE OR REPLACE JAVA SCALAR SCRIPT test_java(i int) returns int AS

class TEST_JAVA {
static Integer run(ExaMetadata exa, ExaIterator ctx) throws Exception {
return 0;
}
}
/
'''))
self.query("select test_java(0)")
finally:
self.query(udf.fixindent("DROP SCHEMA %s CASCADE" % schema))

def test_r(self):
schema = "DockerDBEnvironmentTest"
try:
self.query(udf.fixindent("DROP SCHEMA %s CASCADE" % schema), ignore_errors=True)
self.query(udf.fixindent("CREATE SCHEMA %s" % schema))
self.query(udf.fixindent("OPEN SCHEMA %s" % schema))
self.query(udf.fixindent('''
CREATE OR REPLACE R SCALAR SCRIPT test_r(i int) returns int AS

run <- function(ctx) {
return(0);
}
/
'''))
self.query("select test_r(0)")
finally:
self.query(udf.fixindent("DROP SCHEMA %s CASCADE" % schema))


if __name__ == '__main__':
udf.main()
4 changes: 2 additions & 2 deletions test/test_docker_upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def test_docker_upload_with_path_in_bucket(self):
completed_process = self.test_environment.run_command(command, track_task_dependencies=True,
capture_output=True)
self.assertIn(
f"ALTER SESSION SET SCRIPT_LANGUAGES=\'PYTHON3=localzmq+protobuf:///{self.bucketfs_name}/"
f"ALTER SESSION SET SCRIPT_LANGUAGES=\'PYTHON3_TEST=localzmq+protobuf:///{self.bucketfs_name}/"
f"{self.bucket_name}/{self.path_in_bucket}/test-flavor-release-{self.release_name}?lang=python#buckets/"
f"{self.bucketfs_name}/{self.bucket_name}/{self.path_in_bucket}/test-flavor-release-{self.release_name}/"
f"exaudf/exaudfclient_py3",
Expand All @@ -72,7 +72,7 @@ def test_docker_upload_without_path_in_bucket(self):
completed_process = self.test_environment.run_command(command,
track_task_dependencies=True, capture_output=True)
self.assertIn(
f"ALTER SESSION SET SCRIPT_LANGUAGES=\'PYTHON3=localzmq+protobuf:///{self.bucketfs_name}/"
f"ALTER SESSION SET SCRIPT_LANGUAGES=\'PYTHON3_TEST=localzmq+protobuf:///{self.bucketfs_name}/"
f"{self.bucket_name}/test-flavor-release-{self.release_name}?lang=python#buckets/"
f"{self.bucketfs_name}/{self.bucket_name}/test-flavor-release-{self.release_name}/exaudf/exaudfclient_py3",
completed_process.stdout.decode("UTF-8"))
Expand Down
4 changes: 2 additions & 2 deletions test/test_generate_language_activation.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ def test_generate_with_path_in_bucket(self):
completed_process = self.test_environment.run_command(command, use_docker_repository=False,
use_output_directory=False, capture_output=True)
self.assertIn(
"ALTER SESSION SET SCRIPT_LANGUAGES='PYTHON3=localzmq+protobuf:///bfsdefault/default/path/container?lang=python#buckets/bfsdefault/default/path/container/exaudf/exaudfclient_py3';",
"ALTER SESSION SET SCRIPT_LANGUAGES='PYTHON3_TEST=localzmq+protobuf:///bfsdefault/default/path/container?lang=python#buckets/bfsdefault/default/path/container/exaudf/exaudfclient_py3';",
completed_process.stdout.decode("UTF-8"))

def test_generate_without_path_in_bucket(self):
command = f"{self.test_environment.executable} generate-language-activation --bucketfs-name bfsdefault --bucket-name default --container-name container"
completed_process = self.test_environment.run_command(command, use_docker_repository=False,
use_output_directory=False, capture_output=True)
self.assertIn(
"ALTER SESSION SET SCRIPT_LANGUAGES='PYTHON3=localzmq+protobuf:///bfsdefault/default/container?lang=python#buckets/bfsdefault/default/container/exaudf/exaudfclient_py3';",
"ALTER SESSION SET SCRIPT_LANGUAGES='PYTHON3_TEST=localzmq+protobuf:///bfsdefault/default/container?lang=python#buckets/bfsdefault/default/container/exaudf/exaudfclient_py3';",
completed_process.stdout.decode("UTF-8"))


Expand Down
Loading