diff --git a/yaltik_dsl/__coconut__.py b/yaltik_dsl/__coconut__.py index 4e24dbf..410ec79 100644 --- a/yaltik_dsl/__coconut__.py +++ b/yaltik_dsl/__coconut__.py @@ -628,11 +628,6 @@ def addpattern(base_func, **kwargs): raise _coconut.TypeError("addpattern() got unexpected keyword arguments " + _coconut.repr(kwargs)) return _coconut.functools.partial(_coconut_base_pattern_func, base_func) _coconut_addpattern = addpattern -def prepattern(base_func, **kwargs): - """DEPRECATED: Use addpattern instead.""" - def pattern_prepender(func): - return addpattern(func, **kwargs)(base_func) - return pattern_prepender class _coconut_partial(object): __slots__ = ("func", "_argdict", "_arglen", "_stargs", "keywords") if hasattr(_coconut.functools.partial, "__doc__"): @@ -714,9 +709,6 @@ def makedata(data_type, *args): if _coconut.issubclass(data_type, _coconut.str): return "".join(args) return data_type(args) -def datamaker(data_type): - """DEPRECATED: Use makedata instead.""" - return _coconut.functools.partial(makedata, data_type) def fmap(func, obj): """fmap(func, obj) creates a copy of obj with func applied to its contents. Override by defining obj.__fmap__(func).""" diff --git a/yaltik_dsl/__init__.py b/yaltik_dsl/__init__.py index b577fa5..da79dde 100644 --- a/yaltik_dsl/__init__.py +++ b/yaltik_dsl/__init__.py @@ -1,6 +1,6 @@ #!/usr/bin/env python2 # -*- coding: utf-8 -*- -# __coconut_hash__ = 0xe22b9d74 +# __coconut_hash__ = 0x5812e74d # Compiled with Coconut version 1.4.3 [Ernest Scribbler] diff --git a/yaltik_dsl/test_xml_base.coco b/yaltik_dsl/test_xml_base.coco index 4cd26cd..337d241 100644 --- a/yaltik_dsl/test_xml_base.coco +++ b/yaltik_dsl/test_xml_base.coco @@ -19,7 +19,8 @@ import unittest import xml.etree.ElementTree as ET -from xml_base import xmln, xmlroot, xmlchild +from os import unlink +from xml_base import xmln, xmlroot, xmlchild, xml_write class TestXMLBase(unittest.TestCase): @@ -108,8 +109,24 @@ class TestXMLBase(unittest.TestCase): ('children', err.message) |*> self.assertIn - def test_xml_write(self): pass + def test_xml_write(self): + children = [('child1', {'attr': 'value'}, []) |*> xmln, + ('child2', {}, "Some text") |*> xmln] + tree = xmlroot({'tag': 'root', 'attrs': {}, 'children': children}) + xmlw = xml_write$(?, tree) + ('/badpath' |> xmlw) `self.assertEquals` None + ('/bad.ext' |> xmlw) `self.assertEquals` None + + xmlw(__file__) + filepath = __file__.replace('.py', '_views.xml') + with open(filepath, 'r') as output_file: + output_xml = output_file.read() + '' `self.assertIn` output_xml + '' `self.assertIn` output_xml + 'Some text' `self.assertIn` output_xml + unlink(filepath) if __name__ == '__main__': unittest.main() diff --git a/yaltik_dsl/test_xml_base.py b/yaltik_dsl/test_xml_base.py index 043d85c..67b4020 100644 --- a/yaltik_dsl/test_xml_base.py +++ b/yaltik_dsl/test_xml_base.py @@ -1,6 +1,6 @@ #!/usr/bin/env python2 # -*- coding: utf-8 -*- -# __coconut_hash__ = 0x6e1a1e05 +# __coconut_hash__ = 0x48175ba9 # Compiled with Coconut version 1.4.3 [Ernest Scribbler] @@ -42,9 +42,11 @@ from __coconut__ import _coconut, _coconut_MatchError, _coconut_igetitem, _cocon import unittest import xml.etree.ElementTree as ET +from os import unlink from xml_base import xmln from xml_base import xmlroot from xml_base import xmlchild +from xml_base import xml_write class TestXMLBase(unittest.TestCase): @@ -133,8 +135,22 @@ class TestXMLBase(unittest.TestCase): def test_xml_write(self): - pass + children = [(xmln)(*('child1', {'attr': 'value'}, [])), (xmln)(*('child2', {}, "Some text"))] + tree = xmlroot({'tag': 'root', 'attrs': {}, 'children': children}) + xmlw = _coconut_partial(xml_write, {1: tree}, 2) + (self.assertEquals)(((xmlw)('/badpath')), None) + (self.assertEquals)(((xmlw)('/bad.ext')), None) + + xmlw(__file__) + filepath = __file__.replace('.py', '_views.xml') + with open(filepath, 'r') as output_file: + output_xml = output_file.read() + (self.assertIn)('', output_xml) + (self.assertIn)('', output_xml) + (self.assertIn)('Some text', output_xml) + unlink(filepath) if __name__ == '__main__': unittest.main() diff --git a/yaltik_dsl/xml_base.coco b/yaltik_dsl/xml_base.coco index 89691b6..2516731 100644 --- a/yaltik_dsl/xml_base.coco +++ b/yaltik_dsl/xml_base.coco @@ -20,17 +20,15 @@ from os import path import xml.etree.ElementTree as ET from xml.dom import minidom -from typing import Dict, List, Union, Any +from typing import Dict, List, Union, Text, Any # TODO: fix MyPy / typing -# REF and test xml_write -data XMLDictElement(tag: XMLText, attrs: XMLAttrs, children: List[Any]) +data XMLDictElement(tag: Text, attrs: XMLAttrs, children: List[Any]) -XMLText = Union[str, unicode] -XMLAttrs = Dict[str, str] -XMLChild = Union[XMLDictElement, XMLText, List] +XMLAttrs = Dict[Text, Text] +XMLChild = Union[XMLDictElement, Text, List] def xmlroot(tree: Dict[str, Any]) -> ET.Element: @@ -40,12 +38,11 @@ def xmlroot(tree: Dict[str, Any]) -> ET.Element: (rootel, tree['children']) |*> xmlchild return rootel -# TODO: addpattern here def xmlchild(parent: ET.Element, children: XMLDictElement) -> None: """ Handling of children (ie non root) XML Nodes with/o text and subchildren (recursive) """ case children: - match _ is XMLText: + match _ is Text: parent.text = children match _ is XMLDictElement: attrs = {unicode(k): unicode(v) for [k, v] in children.attrs.items()} @@ -53,30 +50,30 @@ def xmlchild(parent: ET.Element, children: XMLDictElement) -> None: subchildren = children.children if subchildren: (new_parent, subchildren) |*> xmlchild - match _ is list: + match _ is List: ((xmlchild$ <| parent), children) |*> map |> consume else: raise TypeError('Invalid arguments for xmlchild') - -def xmln(tag: XMLText = '', +def xmln(tag: Text = '', attrs: XMLAttrs = {}, - children: Union[str, List] = []) -> XMLDictElement: - """ XMLNode with default children, not attributes """ + children: Union[Text, List] = []) -> XMLDictElement: + """ XMLDictElement building from dict object, with defaults """ xmldictel = XMLDictElement$ <*| (tag, attrs) case children: - match c is str: + match c is Text: return [c] |> xmldictel match c is list: return c |> xmldictel else: raise TypeError('Invalid arguments for xmln') + def xml_write(filepath, tree): """ Write XML file according to filename and given tree """ - if filepath.endswith('.py'): # if .pyc, no need to generate XML - output_xml = minidom.parseString(ET.tostring(tree)).toprettyxml(indent=' ') - output_path = path.dirname(path.abspath(filepath)) - fpath = '%s/%s' % (output_path, path.basename(filepath).replace('.py', '_views.xml')) + if '.py' |> filepath.endswith: # if .pyc, no need to generate XML + output_xml = tree |> ET.tostring |> minidom.parseString |> .toprettyxml(indent=' ') + output_path = filepath |> path.abspath |> path.dirname + fpath = [output_path, filepath |> path.basename] |> '/'.join |> .replace('.py', '_views.xml') with open(fpath, 'w') as output_file: output_file.write(output_xml) diff --git a/yaltik_dsl/xml_base.py b/yaltik_dsl/xml_base.py index 7a87531..46dd746 100644 --- a/yaltik_dsl/xml_base.py +++ b/yaltik_dsl/xml_base.py @@ -1,6 +1,6 @@ #!/usr/bin/env python2 # -*- coding: utf-8 -*- -# __coconut_hash__ = 0xf1882627 +# __coconut_hash__ = 0xeb6b4b07 # Compiled with Coconut version 1.4.3 [Ernest Scribbler] @@ -46,13 +46,13 @@ from xml.dom import minidom from typing import Dict from typing import List from typing import Union +from typing import Text from typing import Any # TODO: fix MyPy / typing -# REF and test xml_write -class XMLDictElement(_coconut.typing.NamedTuple("XMLDictElement", [("tag", 'XMLText'), ("attrs", 'XMLAttrs'), ("children", 'List[Any]')]), _coconut.object): +class XMLDictElement(_coconut.typing.NamedTuple("XMLDictElement", [("tag", 'Text'), ("attrs", 'XMLAttrs'), ("children", 'List[Any]')]), _coconut.object): __slots__ = () __ne__ = _coconut.object.__ne__ def __eq__(self, other): @@ -61,9 +61,8 @@ class XMLDictElement(_coconut.typing.NamedTuple("XMLDictElement", [("tag", 'XMLT return _coconut.tuple.__hash__(self) ^ hash(self.__class__) -XMLText = Union[str, unicode] -XMLAttrs = Dict[str, str] -XMLChild = Union[XMLDictElement, XMLText, List] +XMLAttrs = Dict[Text, Text] +XMLChild = Union[XMLDictElement, Text, List] def xmlroot(tree # type: Dict[str, Any] @@ -75,7 +74,6 @@ def xmlroot(tree # type: Dict[str, Any] (xmlchild)(*(rootel, tree['children'])) return rootel -# TODO: addpattern here def xmlchild(parent, # type: ET.Element children # type: XMLDictElement ): @@ -84,7 +82,7 @@ def xmlchild(parent, # type: ET.Element subchildren (recursive) """ _coconut_match_to = children _coconut_case_check_0 = False - if _coconut.isinstance(_coconut_match_to, XMLText): + if _coconut.isinstance(_coconut_match_to, Text): _coconut_case_check_0 = True if _coconut_case_check_0: parent.text = children @@ -98,24 +96,23 @@ def xmlchild(parent, # type: ET.Element if subchildren: (xmlchild)(*(new_parent, subchildren)) if not _coconut_case_check_0: - if _coconut.isinstance(_coconut_match_to, list): + if _coconut.isinstance(_coconut_match_to, List): _coconut_case_check_0 = True if _coconut_case_check_0: (consume)((map)(*(((_coconut.functools.partial(_coconut.functools.partial, xmlchild))(parent)), children))) if not _coconut_case_check_0: raise TypeError('Invalid arguments for xmlchild') - -def xmln(tag='', # type: XMLText +def xmln(tag='', # type: Text attrs={}, # type: XMLAttrs - children=[] # type: Union[str, List] + children=[] # type: Union[Text, List] ): # type: (...) -> XMLDictElement - """ XMLNode with default children, not attributes """ + """ XMLDictElement building from dict object, with defaults """ xmldictel = (_coconut.functools.partial(_coconut.functools.partial, XMLDictElement))(*(tag, attrs)) _coconut_match_to = children _coconut_case_check_1 = False - if _coconut.isinstance(_coconut_match_to, str): + if _coconut.isinstance(_coconut_match_to, Text): c = _coconut_match_to _coconut_case_check_1 = True if _coconut_case_check_1: @@ -129,11 +126,12 @@ def xmln(tag='', # type: XMLText if not _coconut_case_check_1: raise TypeError('Invalid arguments for xmln') + def xml_write(filepath, tree): """ Write XML file according to filename and given tree """ - if filepath.endswith('.py'): # if .pyc, no need to generate XML - output_xml = minidom.parseString(ET.tostring(tree)).toprettyxml(indent=' ') - output_path = path.dirname(path.abspath(filepath)) - fpath = '%s/%s' % (output_path, path.basename(filepath).replace('.py', '_views.xml')) + if (filepath.endswith)('.py'): # if .pyc, no need to generate XML + output_xml = ((minidom.parseString)((ET.tostring)(tree))).toprettyxml(indent=' ') + output_path = (path.dirname)((path.abspath)(filepath)) + fpath = (('/'.join)([output_path, (path.basename)(filepath)])).replace('.py', '_views.xml') with open(fpath, 'w') as output_file: output_file.write(output_xml)