From d5ec6cfecad2588097aedda7d965cfae79dbde53 Mon Sep 17 00:00:00 2001 From: Timur Gilmullin Date: Tue, 16 Feb 2021 13:10:30 +0300 Subject: [PATCH 1/4] bugfix: add google template to distrib --- .travis.yml | 2 +- setup.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ded278c..71b69dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,4 +24,4 @@ deploy: skip_cleanup: true after_script: - - echo "Deploy to PyPI finished." \ No newline at end of file + - echo "All PyPI operations done." \ No newline at end of file diff --git a/setup.py b/setup.py index 64dcd3e..71de99a 100644 --- a/setup.py +++ b/setup.py @@ -92,6 +92,7 @@ package_data={ "": [ "./pricegenerator/*.py", + "./pricegenerator/*.j2", "./media/*", "./tests/*", From 36f6328cd176dbee1af9f1e2ed4c7ae0ba417e0e Mon Sep 17 00:00:00 2001 From: Timur Gilmullin Date: Wed, 17 Feb 2021 00:07:10 +0300 Subject: [PATCH 2/4] bugfix: add google_template.j2 as data_files in setup.py --- setup.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 71de99a..bcefc36 100644 --- a/setup.py +++ b/setup.py @@ -92,15 +92,13 @@ package_data={ "": [ "./pricegenerator/*.py", - "./pricegenerator/*.j2", - "./media/*", - "./tests/*", - - "LICENSE", - "README.md", - "README_RU.md", + "", ], }, + data_files = [ + ("./pricegenerator", ["./pricegenerator/google_template.j2"]), + ], + zip_safe=True, ) From 8f53da0f13014cb64a43e8da5ddca27ca76dc56d Mon Sep 17 00:00:00 2001 From: Timur Gilmullin Date: Sat, 20 Feb 2021 00:56:24 +0300 Subject: [PATCH 3/4] Simple html-template was saved as multi-string variable to avoid troubles with local paths after install. Test was added. Examples were added to readme. --- README.md | 2 +- README_RU.md | 2 +- pricegenerator/PriceGenerator.py | 158 +++++++++++++++++- ...template.j2 => google_template_example.j2} | 0 setup.py | 18 +- tests/test_PriceGenerator.py | 12 +- 6 files changed, 176 insertions(+), 16 deletions(-) rename pricegenerator/{google_template.j2 => google_template_example.j2} (100%) 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) From 5e703ab17a8f0dc9c1eb07bf6cb6547efd7d89a4 Mon Sep 17 00:00:00 2001 From: Timur Gilmullin Date: Sat, 20 Feb 2021 01:07:13 +0300 Subject: [PATCH 4/4] Increment minor version for semver (because functionality in a backwards compatible manner was added) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 669213a..d2437d0 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ from setuptools import setup import os -__version__ = "1.0" +__version__ = "1.1" devStatus = "4 - Beta"