diff --git a/gluon/html.py b/gluon/html.py
index 24e32e31..ba14d7b2 100644
--- a/gluon/html.py
+++ b/gluon/html.py
@@ -2831,10 +2831,24 @@ class MARKMIN(XmlComponent):
def ASSIGNJS(**kargs):
+ """
+ Example:
+ ASSIGNJS(var1='1', var2='2') will return the following javascript variables assignations :
+
+ var var1 = "1";
+ var var2 = "2";
+
+ Args:
+ **kargs: Any keywords arguments and assigned values.
+
+ Returns:
+ Javascript vars assignations for the key/value passed.
+
+ """
from gluon.serializers import json
s = ""
for key, value in kargs.items():
- s+='var %s = %s;\n' % (key, json(value))
+ s += 'var %s = %s;\n' % (key, json(value))
return XML(s)
diff --git a/gluon/tests/test_html.py b/gluon/tests/test_html.py
index b5764c7f..4834c1d1 100644
--- a/gluon/tests/test_html.py
+++ b/gluon/tests/test_html.py
@@ -200,6 +200,12 @@ class TestBareHelpers(unittest.TestCase):
self.assertEqual([el.xml() for el in s.siblings()], ['
b
'])
self.assertEqual(s.sibling().xml(), 'b
')
self.assertEqual(s.siblings('a'), [])
+ # Corner case for raise coverage of one line
+ # I think such assert fail cause of python 2.6
+ # Work under python 2.7
+ # with self.assertRaises(SyntaxError) as cm:
+ # DIV(BR('<>')).xml()
+ # self.assertEqual(cm.exception[0], '
tags cannot have components')
def test_CAT(self):
# Empty CAT()
@@ -223,6 +229,18 @@ class TestBareHelpers(unittest.TestCase):
def test_HTML(self):
self.assertEqual(HTML('<>', _a='1', _b='2').xml(),
'\n<>')
+ self.assertEqual(HTML('<>', _a='1', _b='2', doctype='strict').xml(),
+ '\n<>')
+ self.assertEqual(HTML('<>', _a='1', _b='2', doctype='transitional').xml(),
+ '\n<>')
+ self.assertEqual(HTML('<>', _a='1', _b='2', doctype='frameset').xml(),
+ '\n<>')
+ self.assertEqual(HTML('<>', _a='1', _b='2', doctype='html5').xml(),
+ '\n<>')
+ self.assertEqual(HTML('<>', _a='1', _b='2', doctype='').xml(),
+ '<>')
+ self.assertEqual(HTML('<>', _a='1', _b='2', doctype='CustomDocType').xml(),
+ 'CustomDocType\n<>')
def test_XHTML(self):
# Empty XHTML test
@@ -231,6 +249,16 @@ class TestBareHelpers(unittest.TestCase):
# Not Empty XHTML test
self.assertEqual(XHTML('<>', _a='1', _b='2').xml(),
'\n<>')
+ self.assertEqual(XHTML('<>', _a='1', _b='2', doctype='').xml(),
+ '\n<>')
+ self.assertEqual(XHTML('<>', _a='1', _b='2', doctype='strict').xml(),
+ '\n<>')
+ self.assertEqual(XHTML('<>', _a='1', _b='2', doctype='transitional').xml(),
+ '\n<>')
+ self.assertEqual(XHTML('<>', _a='1', _b='2', doctype='frameset').xml(),
+ '\n<>')
+ self.assertEqual(XHTML('<>', _a='1', _b='2', doctype='xmlns').xml(),
+ 'xmlns\n<>')
def test_HEAD(self):
self.assertEqual(HEAD('<>', _a='1', _b='2').xml(),
@@ -452,6 +480,7 @@ class TestBareHelpers(unittest.TestCase):
self.assertEqual(COL(_span='2').xml(), '')
# Commented for now not so sure how to make it pass properly was passing locally
# I think this test is interesting and add value
+ # This fail relate to python 2.6 limitation I think
# Failing COL test
# with self.assertRaises(SyntaxError) as cm:
# COL('<>').xml()
@@ -488,6 +517,8 @@ class TestBareHelpers(unittest.TestCase):
self.assertEqual(TEXTAREA('<>', _a='1', _b='2', _rows=5, _cols=20).xml(),
'')
+ self.assertEqual(TEXTAREA('<>', value='bla bla bla...', _rows=10, _cols=40).xml(),
+ '')
def test_OPTION(self):
self.assertEqual(OPTION('<>', _a='1', _b='2').xml(),
@@ -505,11 +536,35 @@ class TestBareHelpers(unittest.TestCase):
# Not Empty OPTGROUP test
self.assertEqual(OPTGROUP('<>', _a='1', _b='2').xml(),
'')
+ # With an OPTION
+ self.assertEqual(OPTGROUP(OPTION('Option 1', _value='1'), _label='Group 1').xml(),
+ '')
def test_SELECT(self):
self.assertEqual(SELECT('<>', _a='1', _b='2').xml(),
'')
+ self.assertEqual(SELECT(OPTION('option 1', _value='1'),
+ OPTION('option 2', _value='2')).xml(),
+ '')
+ self.assertEqual(SELECT(OPTION('option 1', _value='1', _selected='selected'),
+ OPTION('option 2', _value='2'),
+ _multiple='multiple').xml(),
+ '')
+ # OPTGROUP
+ self.assertEqual(SELECT(OPTGROUP(OPTION('option 1', _value='1'),
+ OPTION('option 2', _value='2'),
+ _label='Group 1',)).xml(),
+ '')
+ # List
+ self.assertEqual(SELECT([1, 2, 3, 4, 5]).xml(),
+ '')
+ # Tuple
+ self.assertEqual(SELECT((1, 2, 3, 4, 5)).xml(),
+ '')
+ # String value
+ self.assertEqual(SELECT('Option 1', 'Option 2').xml(),
+ '')
def test_FIELDSET(self):
self.assertEqual(FIELDSET('<>', _a='1', _b='2').xml(),
@@ -523,9 +578,13 @@ class TestBareHelpers(unittest.TestCase):
self.assertEqual(FORM('<>', _a='1', _b='2').xml(),
'')
- # TODO: def test_BEAUTIFY(self):
+ def test_BEAUTIFY(self):
+ self.assertEqual(BEAUTIFY(['a', 'b', {'hello': 'world'}]).xml(),
+ '')
- # TODO: def test_MENU(self):
+ def test_MENU(self):
+ self.assertEqual(MENU([('Home', False, '/welcome/default/index', [])]).xml(),
+ '')
# TODO: def test_embed64(self):
@@ -535,9 +594,24 @@ class TestBareHelpers(unittest.TestCase):
# TODO: def test_markmin_serializer(self):
- # TODO: def test_MARKMIN(self):
+ def test_MARKMIN(self):
+ # This test pass with python 2.7 but expected to fail under 2.6
+ # with self.assertRaises(TypeError) as cm:
+ # MARKMIN().xml()
+ # self.assertEqual(cm.exception[0], '__init__() takes at least 2 arguments (1 given)')
+ self.assertEqual(MARKMIN('').xml(), '')
+ self.assertEqual(MARKMIN('<>').xml(),
+ '<>
')
+ self.assertEqual(MARKMIN("``hello_world = 'Hello World!'``:python").xml(),
+ 'hello_world = \'Hello World!\'')
- # TODO: def test_ASSIGNJS(self):
+ def test_ASSIGNJS(self):
+ # empty assignation
+ self.assertEqual(ASSIGNJS().xml(), '')
+ # text assignation
+ self.assertEqual(ASSIGNJS(var1='1', var2='2').xml(), 'var var1 = "1";\nvar var2 = "2";\n')
+ # int assignation
+ self.assertEqual(ASSIGNJS(var1=1, var2=2).xml(), 'var var1 = 1;\nvar var2 = 2;\n')
class TestData(unittest.TestCase):