Create a template loader for SQL templates.

This will automatically find the correct version of a template for the server version, and allows us to remove templates that were previously duplicated for different server versions.

Patch by George & Tira at Pivotal. Review by me and Murtuza from EDB.

Discussion: https://www.postgresql.org/message-id/flat/CAHowoHaU9_pkCt%2B1g8dpY3hsXXZmsJZiJH-3-_Hd%2BC1MxiGhtA%40mail.gmail.com#CAHowoHaU9_pkCt+1g8dpY3hsXXZmsJZiJH-3-_Hd+C1MxiGhtA@mail.gmail.com
This commit is contained in:
George Gelashvili
2017-01-30 11:25:02 +00:00
committed by Dave Page
parent 42d3121369
commit 19be3529f8
275 changed files with 137 additions and 4107 deletions

View File

@@ -88,10 +88,8 @@ class SQLAutoComplete(object):
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(self.sid)
ver = manager.version
# we will set template path for sql scripts
if ver >= 90100:
self.sql_path = 'sqlautocomplete/sql/9.1_plus'
self.sql_path = 'sqlautocomplete/sql/#{0}#'.format(manager.version)
self.search_path = []
# Fetch the search path

View File

View File

@@ -0,0 +1,2 @@
Some SQL
some more stuff on a new line

View File

@@ -0,0 +1 @@
Some 9.2 SQL

View File

@@ -0,0 +1,47 @@
import os
from flask import Flask
from jinja2 import FileSystemLoader
from pgadmin import VersionedTemplateLoader
from pgadmin.utils.route import BaseTestGenerator
class TestVersionedTemplateLoader(BaseTestGenerator):
def setUp(self):
self.loader = VersionedTemplateLoader(FakeApp())
def runTest(self):
self.test_get_source_returns_a_template()
self.test_get_source_when_the_version_is_9_1_returns_9_1_template()
self.test_get_source_when_the_version_is_9_3_and_there_are_templates_for_9_2_and_9_1_returns_9_2_template()
def test_get_source_returns_a_template(self):
expected_content = "Some SQL" \
"\nsome more stuff on a new line\n"
content, filename, up_to_dateness = self.loader.get_source(None, "some_feature/sql/9.1_plus/some_action.sql")
self.assertEqual(expected_content, content)
self.assertIn("some_feature/sql/9.1_plus/some_action.sql", filename)
def test_get_source_when_the_version_is_9_1_returns_9_1_template(self):
expected_content = "Some SQL" \
"\nsome more stuff on a new line\n"
content, filename, up_to_dateness = self.loader.get_source(None, "some_feature/sql/#90100#/some_action.sql")
self.assertEqual(expected_content, content)
self.assertIn("some_feature/sql/9.1_plus/some_action.sql", filename)
def test_get_source_when_the_version_is_9_3_and_there_are_templates_for_9_2_and_9_1_returns_9_2_template(self):
content, filename, up_to_dateness = self.loader.get_source(None, "some_feature/sql/#90300#/some_action.sql")
self.assertEqual("Some 9.2 SQL", content)
self.assertIn("some_feature/sql/9.2_plus/some_action.sql", filename)
class FakeApp(Flask):
def __init__(self):
super(FakeApp, self).__init__("")
self.jinja_loader = FileSystemLoader(os.path.dirname(os.path.realpath(__file__)) + "/templates")

View File

@@ -0,0 +1,31 @@
from flask.templating import DispatchingJinjaLoader
from jinja2 import TemplateNotFound
class VersionedTemplateLoader(DispatchingJinjaLoader):
def get_source(self, environment, template):
template_path_parts = template.split("#", 2)
server_versions = (
{'name': "9.6_plus", 'number': 90600},
{'name': "9.5_plus", 'number': 90500},
{'name': "9.4_plus", 'number': 90400},
{'name': "9.3_plus", 'number': 90300},
{'name': "9.2_plus", 'number': 90200},
{'name': "9.1_plus", 'number': 90100}
)
if len(template_path_parts) == 1:
return super(VersionedTemplateLoader, self).get_source(environment, template)
else:
for server_version in server_versions:
path_start, specified_version_number, file_name = template_path_parts
if server_version['number'] > int(specified_version_number):
continue
template_path = path_start + '/' + server_version['name'] + '/' + file_name
try:
return super(VersionedTemplateLoader, self).get_source(environment, template_path)
except TemplateNotFound:
continue