Source code for pycropml.code2nbk
""" License, Header
Use pkglts
Generate notebook from code source
"""
from __future__ import print_function
from __future__ import absolute_import
from path import Path
import pycropml.test_generator
import os
import sys
# The package used to generate Notebook
import nbformat as nbf
import six
[docs]
class Model2Nb(object):
""" Generate a Jupyter Notebook from a set of models.
"""
"""Generate a notebook for unit test.
Args:
- code : from the model to code
- dir: the directory where the code is generated.
- name : name of the jupyter notebook
Returns:
- None or status
"""
nb = nbf.v4.new_notebook()
def __init__(self, model, code, name, dir=None):
self.model = model
self.code = code
self.name = name
self.dir = dir
[docs]
def generate_nb(self, language, tg_rep, namep, mc_name=None):
text = u'''\
# Automatic generation of Notebook using PyCropML
This notebook implements a crop model.'''
_cells = self.nb['cells'] = [nbf.v4.new_markdown_cell(text)]
var = ["Auxiliary", "Rate", "State", "Exogenous"]
if language in ("cs", "java"):
for v in var:
fileVar = Path(os.path.join(tg_rep, f"{mc_name}{v}.{language}"))
#fileVar = Path(os.path.join(tg_rep, "%s%s.%s" % (mc_name.capitalize() if language=="java" else mc_name, v, language)))
with open(fileVar, "r") as var_file:
fi = var_file.read()
namev = "%s%s" % (mc_name.capitalize(), v)
text = u"""\
### Domain Class %s""" % namev
_cells.append(nbf.v4.new_markdown_cell(text))
_cells.append(nbf.v4.new_code_cell(fi))
text = u"""\
### Model %s""" % self.name
_cells.append(nbf.v4.new_markdown_cell(text))
code_tests = getattr(pycropml.test_generator, "generate_test_%s" % language)(self.model, self.dir, package=namep)
if language in ("cs", "java"):
_cells.append(nbf.v4.new_code_cell(self.code))
for code in code_tests:
_cells.append(nbf.v4.new_code_cell(code))
elif language in ("cpp", "r", "py"):
for code in code_tests:
_cells.append(nbf.v4.new_code_cell(code))
elif language == "f90" :
list_sub = Path(os.path.join(tg_rep, "list_sub.f90"))
if os.path.isfile(list_sub):
with open(list_sub, "r") as fi:
sub = fi.read()
self.code = sub + self.code
for code in code_tests:
code = self.code + code
_cells.append(nbf.v4.new_code_cell(code))
fname = Path(os.path.join(self.dir, "%s.ipynb" % self.name))
if sys.version_info[0] >= 3:
with open(file=fname, mode="w", encoding='utf-8') as f:
nbf.write(self.nb, f)