#!/usr/bin/env python2 # -*- coding: utf-8 -*- # __coconut_hash__ = 0xf86eeffc # Compiled with Coconut version 2.1.1 [The Spanish Inquisition] """ XML helpers and macros """ # Coconut Header: ------------------------------------------------------------- from __future__ import print_function, absolute_import, unicode_literals, division import sys as _coconut_sys, os as _coconut_os _coconut_file_dir = _coconut_os.path.dirname(_coconut_os.path.abspath(__file__)) _coconut_cached_module = _coconut_sys.modules.get(b"__coconut__") if _coconut_cached_module is not None and _coconut_os.path.dirname(_coconut_cached_module.__file__) != _coconut_file_dir: # type: ignore del _coconut_sys.modules[b"__coconut__"] _coconut_sys.path.insert(0, _coconut_file_dir) _coconut_module_name = _coconut_os.path.splitext(_coconut_os.path.basename(_coconut_file_dir))[0] if _coconut_module_name and _coconut_module_name[0].isalpha() and all(c.isalpha() or c.isdigit() for c in _coconut_module_name) and "__init__.py" in _coconut_os.listdir(_coconut_file_dir): _coconut_full_module_name = str(_coconut_module_name + ".__coconut__") import __coconut__ as _coconut__coconut__ _coconut__coconut__.__name__ = _coconut_full_module_name for _coconut_v in vars(_coconut__coconut__).values(): if getattr(_coconut_v, "__module__", None) == b"__coconut__": try: _coconut_v.__module__ = _coconut_full_module_name except AttributeError: _coconut_v_type = type(_coconut_v) if getattr(_coconut_v_type, "__module__", None) == b"__coconut__": _coconut_v_type.__module__ = _coconut_full_module_name _coconut_sys.modules[_coconut_full_module_name] = _coconut__coconut__ from __coconut__ import * from __coconut__ import _coconut_tail_call, _coconut_tco, _coconut_call_set_names, _coconut_handle_cls_kwargs, _coconut_handle_cls_stargs, _namedtuple_of, _coconut, _coconut_super, _coconut_MatchError, _coconut_iter_getitem, _coconut_base_compose, _coconut_forward_compose, _coconut_back_compose, _coconut_forward_star_compose, _coconut_back_star_compose, _coconut_forward_dubstar_compose, _coconut_back_dubstar_compose, _coconut_pipe, _coconut_star_pipe, _coconut_dubstar_pipe, _coconut_back_pipe, _coconut_back_star_pipe, _coconut_back_dubstar_pipe, _coconut_none_pipe, _coconut_none_star_pipe, _coconut_none_dubstar_pipe, _coconut_bool_and, _coconut_bool_or, _coconut_none_coalesce, _coconut_minus, _coconut_map, _coconut_partial, _coconut_get_function_match_error, _coconut_base_pattern_func, _coconut_addpattern, _coconut_sentinel, _coconut_assert, _coconut_raise, _coconut_mark_as_match, _coconut_reiterable, _coconut_self_match_types, _coconut_dict_merge, _coconut_exec, _coconut_comma_op, _coconut_multi_dim_arr, _coconut_mk_anon_namedtuple, _coconut_matmul _coconut_sys.path.pop(0) # Compiled Coconut: ----------------------------------------------------------- # -*- coding: utf-8 -*- # # Copyright 2019-2020 Fabien Bourgeois # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from os import path import xml.etree.ElementTree as ET from xml.dom import minidom from collections import namedtuple from functools import partial XMLDictElement = namedtuple('XMLDictElement', ['tag', 'attrs', 'children']) def xmlroot(tree): """ Special process for root XML Node """ rootel = ET.Element(tree['tag'], tree['attrs']) if 'children' in tree: xmlchild(rootel, tree['children']) return rootel def xmlchild(parent, children): """ Handling of children (ie non root) XML Nodes with/o text and subchildren (recursive) """ if isinstance(children, str): parent.text = children elif isinstance(children, XMLDictElement): attrs = dict(((str(k)), (str(v))) for [k, v] in children.attrs.items()) new_parent = ET.SubElement(parent, children.tag, attrs) subchildren = children.children if subchildren: xmlchild(new_parent, subchildren) elif isinstance(children, list): list(map(partial(xmlchild, parent), children)) else: raise TypeError('Invalid arguments for xmlchild') @_coconut_tco def xmln(tag='', attrs={}, children=[]): """ XMLDictElement building from dict object, with defaults """ if isinstance(attrs, list): children = attrs attrs = {} xmldictel = partial(XMLDictElement, tag, attrs) if isinstance(children, str): return _coconut_tail_call(xmldictel, [children,]) if isinstance(children, list): return _coconut_tail_call(xmldictel, children) raise TypeError('Invalid arguments for xmln') def xml_write(filepath, tree, pretty=True, suffix='_views'): """ Write XML file according to filename and given tree """ if filepath.endswith('.py'): # if .pyc, no need to generate XML output_xml = ET.tostring(tree) if pretty: output_xml = minidom.parseString(output_xml).toprettyxml(indent=' ') output_path = path.abspath(filepath).split('/') output_path[-1] = output_path[-1].replace('.py', '%s.xml' % suffix) output_path = '/'.join(output_path) with open(output_path, 'w') as output_file: output_file.write(output_xml)