From 5f4d585248f31c9de516a07f9b6161f6689335eb Mon Sep 17 00:00:00 2001 From: Vit Listik Date: Fri, 19 Oct 2018 23:37:46 +0200 Subject: [PATCH 1/2] added experiment-dir param to flexp-browser --- flexp/browser/browser.py | 85 ++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 25 deletions(-) diff --git a/flexp/browser/browser.py b/flexp/browser/browser.py index 3be1f69..94c007c 100755 --- a/flexp/browser/browser.py +++ b/flexp/browser/browser.py @@ -7,6 +7,7 @@ Options: -h --help Show this screen. """ + from __future__ import absolute_import from __future__ import print_function from __future__ import unicode_literals @@ -22,11 +23,11 @@ import click import tornado.ioloop import tornado.web +from flexp.browser.utils import setup_logging from flexp.browser.html.generic import DescriptionToHtml, FilesToHtml, ImagesToHtml, FlexpInfoToHtml, CsvToHtml, \ TxtToHtml, StringToHtml from flexp.browser.html.to_html import ToHtml -from flexp.browser.utils import setup_logging from flexp.flow import Chain from flexp.utils import get_logger from flexp.utils import import_by_filename, PartialFormatter, exception_safe @@ -70,7 +71,13 @@ def default_get_metrics(file_path): return metrics_list -def run(port=7777, chain=default_html_chain, get_metrics_fcn=default_get_metrics, metrics_file="metrics.csv"): +def run( + port=7777, + chain=default_html_chain, + get_metrics_fcn=default_get_metrics, + metrics_file="metrics.csv", + experiments_dir=os.getcwd() +): """ Run the whole browser with optional own `port` number and `chain` of ToHtml modules. Allows reading main metrics from all experiments and show them in experiment list. @@ -80,6 +87,8 @@ def run(port=7777, chain=default_html_chain, get_metrics_fcn=default_get_metrics metrics and return dict[metric_name, value]. :param str metrics_file: Filename in each experiment dir which contains metrics values. """ + MainHandler.experiments_folder = experiments_dir + AjaxHandler.experiments_folder = experiments_dir # append new modules to the default chain if isinstance(chain, ToHtml): @@ -99,11 +108,18 @@ def run(port=7777, chain=default_html_chain, get_metrics_fcn=default_get_metrics here_path = os.path.dirname(os.path.abspath(__file__)) app = tornado.web.Application([ + # (r"/", MainHandler, main_handler_params), + # (r'/(favicon.ico)', tornado.web.StaticFileHandler, {"path": path.join(here_path, "static/")}), + # (r"/file/(.*)", NoCacheStaticHandler, {'path': os.getcwd()}), + # (r"/static/(.*)", tornado.web.StaticFileHandler, {'path': path.join(here_path, "static")}), + # (r"/ajax", AjaxHandler, {"experiments_folder": os.getcwd()})], + (r"/", MainHandler, main_handler_params), (r'/(favicon.ico)', tornado.web.StaticFileHandler, {"path": path.join(here_path, "static/")}), - (r"/file/(.*)", NoCacheStaticHandler, {'path': os.getcwd()}), + (r"/file/(.*)", NoCacheStaticHandler, {'path': MainHandler.experiments_folder}), (r"/static/(.*)", tornado.web.StaticFileHandler, {'path': path.join(here_path, "static")}), - (r"/ajax", AjaxHandler, {"experiments_folder": os.getcwd()})], + (r"/ajax", AjaxHandler)], + {"debug": True} ) @@ -196,12 +212,14 @@ def initialize(self, get_metrics_fcn, metrics_file, experiments_folder, html_cha def get(self): experiment_folder = self.get_argument("experiment", default="") + log.info("experiment folder {}".format(self.experiments_folder)) experiment_path = path.join(self.experiments_folder, experiment_folder) if not path.isdir(experiment_path): experiment_folder = "" - navigation_html = html_navigation(self.experiments_folder, experiment_folder) + navigation_html = html_navigation(self.experiments_folder, + experiment_folder) header_html = "" scripts_html = "" @@ -215,14 +233,17 @@ def get(self): # Use custom chain, if present if os.path.exists(experiment_path + "/custom_flexp_chain.py"): try: - custom_flexp_chain = import_by_filename('custom_flexp_chain', - experiment_path + "/custom_flexp_chain.py") + custom_flexp_chain = import_by_filename( + 'custom_flexp_chain', + experiment_path + "/custom_flexp_chain.py") html_chain = custom_flexp_chain.get_chain() html_chain = Chain(html_chain) except: - html_chain = Chain([StringToHtml("

Error processing custom chain. {}

" - .format(traceback.format_exc().replace("\n", "
")), - title="Error in custom chain")] + self.html_chain.modules) + html_chain = Chain([StringToHtml( + "

Error processing custom chain. {}

" + .format( + traceback.format_exc().replace("\n", "
")), + title="Error in custom chain")] + self.html_chain.modules) finally: if "custom_flexp_chain" in sys.modules: del sys.modules["custom_flexp_chain"] @@ -235,7 +256,8 @@ def get(self): title_html = "

{}

".format(experiment_folder) content_html = u"\n".join(data['html']) navigation_html = html_anchor_navigation( - experiment_path, experiment_folder, html_chain) + navigation_html + experiment_path, experiment_folder, + html_chain) + navigation_html header_html = u"\n".join(u"\n".join(html_lines) for head_section, html_lines @@ -282,15 +304,18 @@ def post(self): new_name = self.get_argument('new_name') folder = os.path.join(self.experiments_folder, value) new_folder = os.path.join(self.experiments_folder, new_name) - if os.path.exists(folder) and not os.path.exists(new_folder) and "/" not in value and "/" not in new_name: + if os.path.exists(folder) and not os.path.exists( + new_folder) and "/" not in value and "/" not in new_name: os.rename(folder, new_folder) else: - self.send_error(500, reason="Rename folder not successful. Check old and new name.") + self.send_error(500, + reason="Rename folder not successful. Check old and new name.") if action == "change_file_content": new_content = self.get_argument('new_content') file_name = self.get_argument('file_name') - with open(os.path.join(self.experiments_folder, value, file_name), "w") as file: + with open(os.path.join(self.experiments_folder, value, file_name), + "w") as file: file.write(new_content) @@ -311,6 +336,7 @@ def html_table(base_dir, get_metrics_fcn, metrics_file): {metrics_names} +<<<<<<< HEAD {rows} @@ -409,7 +435,8 @@ def html_navigation(base_dir, selected_experiment=None): {exp_dir} """.format( exp_dir=exp_dir, - title=DescriptionToHtml.get_description_html(exp_path, replace_newlines=False), + title=DescriptionToHtml.get_description_html(exp_path, + replace_newlines=False), classes=" ".join(classes))) return header + "\n".join(items) @@ -440,15 +467,19 @@ def html_anchor_navigation(base_dir, experiment_dir, modules): def list_experiments(base_dir): - """Return list of tuples(experiment_directory, experiment_absolute_path). + """Return list of tuples(experiment_directory, experiment_absolute_path, + last modified time) sorted by modification time. :param base_dir: parent folder in which to look for an experiment folders - :return: list[tuple[str, str]] + :return: list[tuple[str, str, int]] """ - return sorted([(exp_dir, path.join(base_dir, exp_dir), os.path.getmtime(exp_dir)) - for exp_dir in os.listdir(base_dir) - if path.isdir(path.join(base_dir, exp_dir))], - key=lambda x: x[2], reverse=True) + return sorted([ + (exp_dir, + path.join(base_dir, exp_dir), + os.path.getmtime(path.join(base_dir, exp_dir))) + for exp_dir in os.listdir(base_dir) + if path.isdir(path.join(base_dir, exp_dir))], + key=lambda x: x[2], reverse=True) def return_type_list_of_dicts(fcn, return_on_fail=None): @@ -474,12 +505,16 @@ def should_return_304(self): return False -@click.command() -@click.option('--port', '-p', default=7777, help='Port where to run flexp browser') -def main(port): +@click.command(context_settings=dict(help_option_names=['-h', '--help'])) +@click.option('--port', '-p', default=7777, + help='Port where to run flexp browser') +@click.option('--experiments_dir', '-d', default=os.getcwd(), + help='path to directory with experiments') +def main(port, experiments_dir): """Console entry point launched by flexp-browser command.""" setup_logging("info") - run(port) + run(port=port, + experiments_dir=experiments_dir) if __name__ == "__main__": From de35404082b9fc8c91f6a4d5bcf13972cd951acb Mon Sep 17 00:00:00 2001 From: Tomas Prinda Date: Tue, 9 Apr 2019 11:28:23 +1200 Subject: [PATCH 2/2] When --experiments_dir was set bugs fixed: show txt file, rename/delete experiment, change content of text file --- flexp/browser/browser.py | 37 ++++++++++++++-------------------- flexp/browser/html/generic.py | 5 +++-- flexp/browser/static/script.js | 3 --- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/flexp/browser/browser.py b/flexp/browser/browser.py index 94c007c..371e876 100755 --- a/flexp/browser/browser.py +++ b/flexp/browser/browser.py @@ -76,7 +76,7 @@ def run( chain=default_html_chain, get_metrics_fcn=default_get_metrics, metrics_file="metrics.csv", - experiments_dir=os.getcwd() + experiments_dir=os.getcwd(), ): """ Run the whole browser with optional own `port` number and `chain` of ToHtml modules. @@ -86,40 +86,34 @@ def run( :param (Callable[str]) -> list[dict[str, Any]] get_metrics_fcn: Function that takes filename of a file with metrics and return dict[metric_name, value]. :param str metrics_file: Filename in each experiment dir which contains metrics values. + :param str experiments_dir: Path to directory with experiments, default= """ - MainHandler.experiments_folder = experiments_dir - AjaxHandler.experiments_folder = experiments_dir # append new modules to the default chain if isinstance(chain, ToHtml): chain = [chain] - # handle wrong return type and expetions in get_metrics_fcn + # handle wrong return type and exceptions in get_metrics_fcn get_metrics_fcn = return_type_list_of_dicts(get_metrics_fcn, return_on_fail=[{}]) get_metrics_fcn = exception_safe(get_metrics_fcn, return_on_exception=[{}]) main_handler_params = { "get_metrics_fcn": get_metrics_fcn, "metrics_file": metrics_file, - "experiments_folder": os.getcwd(), + "experiments_folder": experiments_dir, "html_chain": Chain(chain), } here_path = os.path.dirname(os.path.abspath(__file__)) - app = tornado.web.Application([ - # (r"/", MainHandler, main_handler_params), - # (r'/(favicon.ico)', tornado.web.StaticFileHandler, {"path": path.join(here_path, "static/")}), - # (r"/file/(.*)", NoCacheStaticHandler, {'path': os.getcwd()}), - # (r"/static/(.*)", tornado.web.StaticFileHandler, {'path': path.join(here_path, "static")}), - # (r"/ajax", AjaxHandler, {"experiments_folder": os.getcwd()})], - - (r"/", MainHandler, main_handler_params), - (r'/(favicon.ico)', tornado.web.StaticFileHandler, {"path": path.join(here_path, "static/")}), - (r"/file/(.*)", NoCacheStaticHandler, {'path': MainHandler.experiments_folder}), - (r"/static/(.*)", tornado.web.StaticFileHandler, {'path': path.join(here_path, "static")}), - (r"/ajax", AjaxHandler)], - + app = tornado.web.Application( + [ + (r"/", MainHandler, main_handler_params), + (r'/(favicon.ico)', tornado.web.StaticFileHandler, {"path": path.join(here_path, "static/")}), + (r"/file/(.*)", NoCacheStaticHandler, {'path': experiments_dir}), + (r"/static/(.*)", tornado.web.StaticFileHandler, {'path': path.join(here_path, "static")}), + (r"/ajax", AjaxHandler, {"experiments_folder": experiments_dir}) + ], {"debug": True} ) @@ -336,7 +330,6 @@ def html_table(base_dir, get_metrics_fcn, metrics_file): {metrics_names} -<<<<<<< HEAD {rows} @@ -420,9 +413,9 @@ def html_navigation(base_dir, selected_experiment=None): if exp_dir == selected_experiment: classes.append('w3-green') - if not path.exists(path.join(exp_dir, "flexp_info.txt")): + if not path.exists(path.join(exp_path, "flexp_info.txt")): classes.append("running") - elif path.exists(path.join(exp_dir, ".FAIL")): + elif path.exists(path.join(exp_path, ".FAIL")): classes.append("failed") items.append( u"""
@@ -508,7 +501,7 @@ def should_return_304(self): @click.command(context_settings=dict(help_option_names=['-h', '--help'])) @click.option('--port', '-p', default=7777, help='Port where to run flexp browser') -@click.option('--experiments_dir', '-d', default=os.getcwd(), +@click.option('--experiments_dir', '-d', default=os.getcwd(), type=click.Path(), help='path to directory with experiments') def main(port, experiments_dir): """Console entry point launched by flexp-browser command.""" diff --git a/flexp/browser/html/generic.py b/flexp/browser/html/generic.py index 9bd99f2..07d667f 100644 --- a/flexp/browser/html/generic.py +++ b/flexp/browser/html/generic.py @@ -46,7 +46,7 @@ def get_pattern(self): "{file_link} " \ "
 " \ + "$('#edit-txt').data('folder', '{experiment_folder}').data('file_name', '{filename}').dialog('open')\"> " \ "
" \ "
" \ "

{content}

" \ @@ -54,7 +54,7 @@ def get_pattern(self): "" def to_html(self, file_name): - filepath = join(self.experiment_folder, file_name) + filepath = join(self.experiment_path, file_name) with io.open(filepath, encoding="utf8") as f: lines = list(islice(f, self.max_rows + 1)) trimmed = len(lines) > self.max_rows @@ -83,6 +83,7 @@ def to_html(self, file_name): file_link=link, content_strip=raw_content, experiment_path=self.experiment_path, + experiment_folder=self.experiment_folder, class_editable=class_editable, trim_msg=trim_msg, ) diff --git a/flexp/browser/static/script.js b/flexp/browser/static/script.js index dd2d085..6ba9997 100644 --- a/flexp/browser/static/script.js +++ b/flexp/browser/static/script.js @@ -121,9 +121,6 @@ function edit_txt(){ $.post("/ajax", {action: "change_file_content", value: folder, file_name:file_name, new_content:new_content}) .done(function(){ var url = location.href; - if (url.endsWith(folder)){ - url = url.replace(folder, new_name); - } location.href = url; }) .fail(function(xhr, status, error){