diff --git a/README.md b/README.md index aad7e49..eafc12d 100644 --- a/README.md +++ b/README.md @@ -373,7 +373,7 @@ priceModel.RenderBokeh(fileName="index.html", viewInBrowser=True) # Instead of the Bokeh library, you can use simple, non-interactive chart, # via the Google Candlestick chart library. Just uncomment the next lines. # Before calling priceModel.RenderGoogle(), you can set your custom template in self.j2template -# priceModel.j2template = "google_template.j2" # template by default +# priceModel.j2template = "google_template_example.j2" # file or multi-string variable with jinja2-template # priceModel.RenderGoogle(fileName="index.html", viewInBrowser=True) ``` diff --git a/README_RU.md b/README_RU.md index 20d30db..e37c5d0 100644 --- a/README_RU.md +++ b/README_RU.md @@ -373,7 +373,7 @@ priceModel.RenderBokeh(fileName="index.html", viewInBrowser=True) # Вместо библиотеки Bokeh вы можете отрисовать цены на простом, не интерактивном графике, # через библиотеку Google Candlestick chart. Просто раскомментируйте строчки ниже. # Перед вызовом priceModel.RenderGoogle(), вы можете задать свой шаблон в переменной self.j2template -# priceModel.j2template = "google_template.j2" # шаблон по умолчанию +# priceModel.j2template = "google_template_example.j2" # полный путь до шаблона или мультистроковая переменная с jinja2-шаблоном # priceModel.RenderGoogle(fileName="index.html", viewInBrowser=True) ``` diff --git a/pricegenerator/PriceGenerator.py b/pricegenerator/PriceGenerator.py index 6e44181..2fa86b3 100644 --- a/pricegenerator/PriceGenerator.py +++ b/pricegenerator/PriceGenerator.py @@ -33,6 +33,154 @@ uLogger.handlers[0].level = 20 # info level by default for STDOUT # uLogger.handlers[1].level = 10 # debug level by default for log.txt +# Simple jinja2 template for rendering static html-page with not interactive Google Candlestick chart: +GOOGLE_TEMPLATE_J2 = """{# This template based on Jinja markup language: http://jinja.pocoo.org/docs/dev/templates/ #} + + + + + {{ title }} + + + + + + + + + + + + + + +
+
Wait...
+
+ + + + + + + + + + + + + +
+ {{ title }} + + Info +
+
+
+ {% for line in info %} +
{{ line }}
+ {% endfor %} +
+ + + + + + + + +
Generated by PriceGenerator
+ + + + + +""" + class PriceGenerator: """ @@ -45,7 +193,7 @@ def __init__(self): self.csvHeaders = ["date", "time", "open", "high", "low", "close", "volume"] # headers if .csv-file used self.dfHeaders = ["datetime", "open", "high", "low", "close", "volume"] # dataframe headers self.sep = "," # Separator in csv-file - self.j2template = "google_template.j2" # path to custom jinja2 html template + self.j2template = GOOGLE_TEMPLATE_J2 # full path to custom jinja2 html template (e.g. "google_template_example.j2") or template as a long multi-string variable self.j2model = None # dictionary of variables for jinja2 template, if None then auto-generating for default google_template.j2 self._precision = 2 # signs after comma @@ -650,8 +798,14 @@ def RenderGoogle(self, fileName="index.html", viewInBrowser=False): uLogger.debug("Using custom chart model") # --- Rendering and saving chart as html-file and markdown-file with statistics: - renderedTemplate = jinja2.Template(open(self.j2template, "r", encoding="UTF-8").read()) + if os.path.exists(self.j2template): + renderedTemplate = jinja2.Template(open(self.j2template, "r", encoding="UTF-8").read()) + + else: + renderedTemplate = jinja2.Template(self.j2template) + htmlMain = renderedTemplate.render(self.j2model) + with open(fileName, "w", encoding="UTF-8") as fH: fH.write(htmlMain) with open("{}.md".format(fileName), "w", encoding="UTF-8") as fH: diff --git a/pricegenerator/google_template.j2 b/pricegenerator/google_template_example.j2 similarity index 100% rename from pricegenerator/google_template.j2 rename to pricegenerator/google_template_example.j2 diff --git a/setup.py b/setup.py index bcefc36..669213a 100644 --- a/setup.py +++ b/setup.py @@ -74,10 +74,6 @@ "testdata", ], - packages=[ - "pricegenerator", - ], - tests_require=[ "pytest>=5.3.5", "pandas>=1.0.1", @@ -89,16 +85,16 @@ "bokeh>=1.4.0", ], + packages=[ + "pricegenerator", + ], + package_data={ - "": [ - "./pricegenerator/*.py", - "", + "pricegenerator": [ + "*.j2", ], }, - data_files = [ - ("./pricegenerator", ["./pricegenerator/google_template.j2"]), - ], - + include_package_data=True, zip_safe=True, ) diff --git a/tests/test_PriceGenerator.py b/tests/test_PriceGenerator.py index 7202f1a..724eefa 100644 --- a/tests/test_PriceGenerator.py +++ b/tests/test_PriceGenerator.py @@ -51,7 +51,17 @@ def test_RenderBokeh(self): assert os.path.exists(name), "Expected .html-file '{}' after saving but it is not exist!".format(name) assert os.path.exists(nameMD), "Expected markdown file '{}' after saving but it is not exist!".format(nameMD) - def test_RenderGoogle(self): + def test_RenderGoogleDefault(self): + self.model.horizon = 5 + self.model.Generate() + suffix = random.uniform(0, 1000000000) + name = "test_render_google{}.html".format(suffix) + nameMD = "{}.md".format(name) + self.model.RenderGoogle(fileName=name, viewInBrowser=False) + assert os.path.exists(name), "Expected .html-file '{}' after saving but it is not exist!".format(name) + assert os.path.exists(nameMD), "Expected markdown file '{}' after saving but it is not exist!".format(nameMD) + + def test_RenderGoogleFromFileTemplate(self): self.model.horizon = 5 self.model.Generate() suffix = random.uniform(0, 1000000000)