From e460070db6ec839143a0e5c97c467cd4d18d8cee Mon Sep 17 00:00:00 2001 From: Iwan Vosloo Date: Tue, 23 Oct 2018 07:09:36 +0200 Subject: [PATCH 1/7] Simple switch to use @session_scoped --- 001-simple-tr/reahl/simple-tr/simple_tr.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/001-simple-tr/reahl/simple-tr/simple_tr.py b/001-simple-tr/reahl/simple-tr/simple_tr.py index 62fc53c..c6d2bf2 100644 --- a/001-simple-tr/reahl/simple-tr/simple_tr.py +++ b/001-simple-tr/reahl/simple-tr/simple_tr.py @@ -10,11 +10,12 @@ from reahl.web.bootstrap.grid import Container from reahl.web.bootstrap.forms import TextInput, Form, FormLayout, Button, ButtonLayout from reahl.component.modelinterface import exposed, Field, EmailField, Action, Event -from reahl.sqlalchemysupport import Session, Base +from reahl.sqlalchemysupport import Session, Base, session_scoped from sqlalchemy import Column, Integer, UnicodeText from sqlalchemy.orm import relationship +@session_scoped class TR(Base): __tablename__ = 'simple_tr_tr' @@ -32,10 +33,8 @@ def fields(self, fields): def save(self): Session.add(self) - @classmethod - def has_session_data(cls): - record = Session.query(__class__).order_by(TR.id.desc()).first() - return record + def has_data(cls): + return self.input_text and self.separator and self.joiner @exposed('save') def events(self, events): @@ -59,13 +58,12 @@ def __init__(self, view): class InputForm(Form): - def __init__(self, view): + def __init__(self, view, tr): super(__class__, self).__init__(view, 'address_form') inputs = self.add_child(FieldSet(view, legend_text='Enter data then click button')) inputs.use_layout(FormLayout()) - tr = TR(separator='\\s+', joiner='-') inputs.layout.add_input(TextInput(self, tr.fields.input_text)) inputs.layout.add_input(TextInput(self, tr.fields.separator)) inputs.layout.add_input(TextInput(self, tr.fields.joiner)) @@ -79,17 +77,17 @@ class MyPanel(Div): def __init__(self, view): super(__class__, self).__init__(view) - my_form = InputForm(view) + tr = TR.for_current_session() + my_form = InputForm(view, tr) self.add_child(my_form) - self.add_child(OutputBox(view, my_form)) + self.add_child(OutputBox(view, tr)) class OutputBox(Widget): - def __init__(self, view, form): + def __init__(self, view, tr): super(__class__, self).__init__(view) - tr = TR.has_session_data() - if tr is not None: + if tr.has_data(): import re new_str = re.sub(tr.separator, tr.joiner, tr.input_text) self.add_child(P(view, text=new_str)) From 8ce86257fe1424b720bf7dc699e8710d03adb113 Mon Sep 17 00:00:00 2001 From: Iwan Vosloo Date: Tue, 23 Oct 2018 07:13:09 +0200 Subject: [PATCH 2/7] Refactoring: extract translation logic to TR --- 001-simple-tr/reahl/simple-tr/simple_tr.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/001-simple-tr/reahl/simple-tr/simple_tr.py b/001-simple-tr/reahl/simple-tr/simple_tr.py index c6d2bf2..7c68e7c 100644 --- a/001-simple-tr/reahl/simple-tr/simple_tr.py +++ b/001-simple-tr/reahl/simple-tr/simple_tr.py @@ -30,22 +30,24 @@ def fields(self, fields): fields.separator = Field(label='Separated by (Regular Expression)', required=True) fields.joiner = Field(label='Join with (Character String)', required=True) - def save(self): - Session.add(self) - - def has_data(cls): +  @property + def has_data(self): return self.input_text and self.separator and self.joiner @exposed('save') def events(self, events): - events.save = Event(label='Perform Tr', action=Action(self.save)) + events.save = Event(label='Perform Tr') + + @property + def translated_string(self): + import re + return re.sub(self.separator, self.joiner, self.input_text) class MyPage(HTML5Page): def __init__(self, view): super(__class__, self).__init__(view) - self.body.use_layout(Container()) layout = ResponsiveLayout('md', colour_theme='dark', bg_scheme='primary') @@ -67,7 +69,6 @@ def __init__(self, view, tr): inputs.layout.add_input(TextInput(self, tr.fields.input_text)) inputs.layout.add_input(TextInput(self, tr.fields.separator)) inputs.layout.add_input(TextInput(self, tr.fields.joiner)) - self.tr = tr button = inputs.add_child(Button(self, tr.events.save)) button.use_layout(ButtonLayout(style='primary')) @@ -87,10 +88,8 @@ def __init__(self, view): class OutputBox(Widget): def __init__(self, view, tr): super(__class__, self).__init__(view) - if tr.has_data(): - import re - new_str = re.sub(tr.separator, tr.joiner, tr.input_text) - self.add_child(P(view, text=new_str)) + if tr.has_data: + self.add_child(P(view, text=tr.translated_string)) class MyUI(UserInterface): def assemble(self): From 52a13362e8090e90c3f8bef20e054483e2eac26f Mon Sep 17 00:00:00 2001 From: Iwan Vosloo Date: Tue, 23 Oct 2018 07:18:47 +0200 Subject: [PATCH 3/7] Added Vagrantfile and related --- .gitignore | 3 +++ Vagrantfile | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 Vagrantfile diff --git a/.gitignore b/.gitignore index 894a44c..aa2cb2a 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,6 @@ venv.bak/ # mypy .mypy_cache/ + +# Vagrant stuff +.vagrant diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..2bfc2ce --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,22 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# To use vagrant on ubuntu: +# apt-get install vagrant vagrant-lxc vagrant-cachier +# cd +# vagrant up +# vagrant ssh + +Vagrant.require_version ">= 1.8.1" + +Vagrant.configure(2) do |config| + config.vm.box = "reahl/bionic64" + + config.vm.network "forwarded_port", guest: 8000, host: 8000, auto_correct: true + config.vm.network "forwarded_port", guest: 8363, host: 8363, auto_correct: true + + config.vm.provision "shell", privileged: false, inline: <<-SHELL + pip install reahl[all] + SHELL +end + From 30c9d08f5c87b5b12bda7158108398092d6cad31 Mon Sep 17 00:00:00 2001 From: Iwan Vosloo Date: Tue, 23 Oct 2018 07:20:56 +0200 Subject: [PATCH 4/7] Refactoring: simplification --- 001-simple-tr/reahl/simple-tr/simple_tr.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/001-simple-tr/reahl/simple-tr/simple_tr.py b/001-simple-tr/reahl/simple-tr/simple_tr.py index 7c68e7c..324eb2e 100644 --- a/001-simple-tr/reahl/simple-tr/simple_tr.py +++ b/001-simple-tr/reahl/simple-tr/simple_tr.py @@ -82,15 +82,10 @@ def __init__(self, view): my_form = InputForm(view, tr) self.add_child(my_form) - self.add_child(OutputBox(view, tr)) - - -class OutputBox(Widget): - def __init__(self, view, tr): - super(__class__, self).__init__(view) if tr.has_data: self.add_child(P(view, text=tr.translated_string)) + class MyUI(UserInterface): def assemble(self): From 192027093c47b3efe734f515c5c93ea207c0c47a Mon Sep 17 00:00:00 2001 From: Craig Sparks Date: Tue, 23 Oct 2018 10:07:41 +0200 Subject: [PATCH 5/7] fixed typo - had a tab character --- 001-simple-tr/reahl/simple-tr/simple_tr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/001-simple-tr/reahl/simple-tr/simple_tr.py b/001-simple-tr/reahl/simple-tr/simple_tr.py index 324eb2e..b8da4f2 100644 --- a/001-simple-tr/reahl/simple-tr/simple_tr.py +++ b/001-simple-tr/reahl/simple-tr/simple_tr.py @@ -30,7 +30,7 @@ def fields(self, fields): fields.separator = Field(label='Separated by (Regular Expression)', required=True) fields.joiner = Field(label='Join with (Character String)', required=True) -  @property + @property def has_data(self): return self.input_text and self.separator and self.joiner From d745df9d6ed8668c818862e4e94c0077113d61c0 Mon Sep 17 00:00:00 2001 From: Craig Sparks Date: Tue, 23 Oct 2018 10:18:00 +0200 Subject: [PATCH 6/7] added ability to clear inputs by visiting /clear URL. renamed TR input form --- 001-simple-tr/reahl/simple-tr/simple_tr.py | 31 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/001-simple-tr/reahl/simple-tr/simple_tr.py b/001-simple-tr/reahl/simple-tr/simple_tr.py index b8da4f2..f30d6d9 100644 --- a/001-simple-tr/reahl/simple-tr/simple_tr.py +++ b/001-simple-tr/reahl/simple-tr/simple_tr.py @@ -34,15 +34,21 @@ def fields(self, fields): def has_data(self): return self.input_text and self.separator and self.joiner - @exposed('save') + @exposed('save', 'clear_inputs') def events(self, events): events.save = Event(label='Perform Tr') + events.clear_inputs = Event(label='Clear Inputs', action=Action(self.clear_inputs)) @property def translated_string(self): import re return re.sub(self.separator, self.joiner, self.input_text) + def clear_inputs(self): + self.input_text = '' + self.separator = '' + self.joiner = '' + class MyPage(HTML5Page): def __init__(self, view): @@ -61,7 +67,7 @@ def __init__(self, view): class InputForm(Form): def __init__(self, view, tr): - super(__class__, self).__init__(view, 'address_form') + super(__class__, self).__init__(view, 'tr_input_form') inputs = self.add_child(FieldSet(view, legend_text='Enter data then click button')) inputs.use_layout(FormLayout()) @@ -86,8 +92,29 @@ def __init__(self, view): self.add_child(P(view, text=tr.translated_string)) +class ClearInputsPage(HTML5Page): + def __init__(self, view): + super(ClearInputsPage, self).__init__(view) + self.body.add_child(ClearInputsForm(view)) + + +class ClearInputsForm(Form): + def __init__(self, view): + super(ClearInputsForm, self).__init__(view, 'clear_inputs_form') + + inputs = self.add_child(FieldSet(view, legend_text='Clear all inputs')) + inputs.use_layout(FormLayout()) + + tr = TR.for_current_session() + button = inputs.add_child(Button(self, tr.events.clear_inputs)) + button.use_layout(ButtonLayout(style='primary')) + + class MyUI(UserInterface): def assemble(self): + clear_inputs_view = self.define_view('/clear', title='Clear Inputs', page=ClearInputsPage.factory()) home = self.define_view('/', title='x marksthe spot', page=MyPage.factory()) self.define_transition(TR.events.save, home, home) + self.define_transition(TR.events.clear_inputs, clear_inputs_view, home) + From be01b1473eb2362fb8b29b2e9f84d084c3762728 Mon Sep 17 00:00:00 2001 From: Iwan Vosloo Date: Wed, 24 Oct 2018 06:39:54 +0200 Subject: [PATCH 7/7] Revert "Add clear inputs" --- 001-simple-tr/reahl/simple-tr/simple_tr.py | 31 ++-------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/001-simple-tr/reahl/simple-tr/simple_tr.py b/001-simple-tr/reahl/simple-tr/simple_tr.py index f30d6d9..b8da4f2 100644 --- a/001-simple-tr/reahl/simple-tr/simple_tr.py +++ b/001-simple-tr/reahl/simple-tr/simple_tr.py @@ -34,21 +34,15 @@ def fields(self, fields): def has_data(self): return self.input_text and self.separator and self.joiner - @exposed('save', 'clear_inputs') + @exposed('save') def events(self, events): events.save = Event(label='Perform Tr') - events.clear_inputs = Event(label='Clear Inputs', action=Action(self.clear_inputs)) @property def translated_string(self): import re return re.sub(self.separator, self.joiner, self.input_text) - def clear_inputs(self): - self.input_text = '' - self.separator = '' - self.joiner = '' - class MyPage(HTML5Page): def __init__(self, view): @@ -67,7 +61,7 @@ def __init__(self, view): class InputForm(Form): def __init__(self, view, tr): - super(__class__, self).__init__(view, 'tr_input_form') + super(__class__, self).__init__(view, 'address_form') inputs = self.add_child(FieldSet(view, legend_text='Enter data then click button')) inputs.use_layout(FormLayout()) @@ -92,29 +86,8 @@ def __init__(self, view): self.add_child(P(view, text=tr.translated_string)) -class ClearInputsPage(HTML5Page): - def __init__(self, view): - super(ClearInputsPage, self).__init__(view) - self.body.add_child(ClearInputsForm(view)) - - -class ClearInputsForm(Form): - def __init__(self, view): - super(ClearInputsForm, self).__init__(view, 'clear_inputs_form') - - inputs = self.add_child(FieldSet(view, legend_text='Clear all inputs')) - inputs.use_layout(FormLayout()) - - tr = TR.for_current_session() - button = inputs.add_child(Button(self, tr.events.clear_inputs)) - button.use_layout(ButtonLayout(style='primary')) - - class MyUI(UserInterface): def assemble(self): - clear_inputs_view = self.define_view('/clear', title='Clear Inputs', page=ClearInputsPage.factory()) home = self.define_view('/', title='x marksthe spot', page=MyPage.factory()) self.define_transition(TR.events.save, home, home) - self.define_transition(TR.events.clear_inputs, clear_inputs_view, home) -