def _parse_spec(self, path):
     if not os.path.isfile(path):
         raise DataError("Spec file '%s' does not exist." % path)
     with ETSource(path) as source:
         root = ET.parse(source).getroot()
     if root.tag != 'keywordspec':
         raise DataError("Invalid spec file '%s'." % path)
     return root
 def _verify_node(self, node, name, text=None, attrs={}):
     if node is None:
         with ETSource(PATH) as source:
             node = ET.parse(source).getroot()
     assert_equals(node.tag, name)
     if text is not None:
         assert_equals(node.text, text)
     assert_equals(node.attrib, attrs)
Example #3
0
 def build(self, result):
     handler = XmlElementHandler(result)
     # Faster attribute lookup inside for loop
     start, end = handler.start, handler.end
     with self._source as source:
         for event, elem in ET.iterparse(source, events=('start', 'end')):
             start(elem) if event == 'start' else end(elem)
     SuiteTeardownFailureHandler(result.generator).visit_suite(result.suite)
     return result
 def test_rows_are_not_split_if_there_are_headers(self):
     output = self._add_long_step_and_save('html')
     with ETSource('\n'.join(output.splitlines()[1:])) as source:
         tree = ET.parse(source)
     lines = tree.findall('body/table/tr')
     assert_equal(len(lines), 3)
     for l in lines:
         cols = l.findall('td') or l.findall('th')
         assert_equal(len(cols), 9)
 def test_rows_are_not_split_if_there_are_headers(self):
     output = self._add_long_step_and_save("html")
     with ETSource("\n".join(output.splitlines()[1:])) as source:
         tree = ET.parse(source)
     lines = tree.findall("body/table/tr")
     assert_equals(len(lines), 3)
     for l in lines:
         cols = l.findall("td") or l.findall("th")
         assert_equals(len(cols), 9)
Example #6
0
 def _parse(self, source, start, end):
     context = ET.iterparse(source, events=('start', 'end'))
     if not self._include_keywords:
         context = self._omit_keywords(context)
     for event, elem in context:
         if event == 'start':
             start(elem)
         else:
             end(elem)
             elem.clear()
 def test_content_with_unicode(self):
     self.writer.start("root")
     self.writer.element(u"e", u"Circle is 360\u00B0")
     self.writer.element(u"f", u"Hyv\u00E4\u00E4 \u00FC\u00F6t\u00E4")
     self.writer.end("root")
     self.writer.close()
     with ETSource(PATH) as source:
         root = ET.parse(source).getroot()
     self._verify_node(root.find("e"), "e", u"Circle is 360\u00B0")
     self._verify_node(root.find("f"), "f", u"Hyv\u00E4\u00E4 \u00FC\u00F6t\u00E4")
 def _parse(self, source, start, end):
     context = ET.iterparse(source, events=("start", "end"))
     if not self._include_keywords:
         context = self._omit_keywords(context)
     elif self._flattened_keywords:
         context = self._flatten_keywords(context, self._flattened_keywords)
     for event, elem in context:
         if event == "start":
             start(elem)
         else:
             end(elem)
             elem.clear()
Example #9
0
 def _parse(self, source, start, end):
     context = ET.iterparse(source, events=('start', 'end'))
     if not self._include_keywords:
         context = self._omit_keywords(context)
     elif self._flattened_keywords:
         context = self._flatten_keywords(context, self._flattened_keywords)
     for event, elem in context:
         if event == 'start':
             start(elem)
         else:
             end(elem)
             elem.clear()
Example #10
0
 def _parse_spec(self, path):
     if not os.path.isfile(path):
         raise DataError("Spec file '%s' does not exist." % path)
     with ETSource(path) as source:
         root = ET.parse(source).getroot()
     if root.tag != 'keywordspec':
         raise DataError("Invalid spec file '%s'." % path)
     version = root.get('specversion')
     if version not in ('3', '4'):
         raise DataError(f"Invalid spec file version '{version}'. "
                         f"Supported versions are 3 and 4.")
     return root
Example #11
0
 def _flatten_keywords(self, context, flattened):
     # Performance optimized. Do not change without profiling!
     name_match, by_name = self._get_matcher(FlattenByNameMatcher,
                                             flattened)
     type_match, by_type = self._get_matcher(FlattenByTypeMatcher,
                                             flattened)
     tags_match, by_tags = self._get_matcher(FlattenByTagMatcher, flattened)
     started = -1  # if 0 or more, we are flattening
     tags = []
     containers = {'kw', 'for', 'while', 'iter', 'if', 'try'}
     inside_kw = 0  # to make sure we don't read tags from a test
     seen_doc = False
     for event, elem in context:
         tag = elem.tag
         start = event == 'start'
         end = not start
         if start and tag in containers:
             inside_kw += 1
             if started >= 0:
                 started += 1
             elif by_name and name_match(elem.get('name', ''),
                                         elem.get('library')):
                 started = 0
                 seen_doc = False
             elif by_type and type_match(tag):
                 started = 0
                 seen_doc = False
         elif started < 0 and by_tags and inside_kw:
             if end and tag == 'tag':
                 tags.append(elem.text or '')
             elif end and tags:
                 if tags_match(tags):
                     started = 0
                     seen_doc = False
                 tags = []
         if end and tag in containers:
             inside_kw -= 1
             if started == 0 and not seen_doc:
                 doc = ET.Element('doc')
                 doc.text = '_*Keyword content flattened.*_'
                 yield 'start', doc
                 yield 'end', doc
         if started == 0 and end and tag == 'doc':
             seen_doc = True
             elem.text = ('%s\n\n_*Keyword content flattened.*_' %
                          (elem.text or '')).strip()
         if started <= 0 or tag == 'msg':
             yield event, elem
         else:
             elem.clear()
         if started >= 0 and end and tag in containers:
             started -= 1
 def _parse_spec(self, path):
     if not os.path.isfile(path):
         raise DataError("Spec file '%s' does not exist." % path)
     with ETSource(path) as source:
         root = ET.parse(source).getroot()
     if root.tag != 'keywordspec':
         raise DataError("Invalid spec file '%s'." % path)
     version = root.get('specversion')
     if version != '3':
         raise DataError("Invalid spec file version '%s'. "
                         "Robot Framework 4.0 and newer requires spec version 3."
                         % version)
     return root
Example #13
0
    def element_to_string(self, source, xpath="."):
        """Returns the string representation of the specified element.

        The element to convert to a string is specified using `source` and
        `xpath`. They have exactly the same semantics as with `Get Element`
        keyword.

        The returned string is in Unicode format and it does not contain any
        XML declaration.

        See also `Log Element`.
        """
        string = ET.tostring(self.get_element(source, xpath), encoding="UTF-8")
        return self._xml_declaration.sub("", string.decode("UTF-8")).strip()
Example #14
0
    def element_to_string(self, source, xpath='.'):
        """Returns the string representation of the specified element.

        The element to convert to a string is specified using `source` and
        `xpath`. They have exactly the same semantics as with `Get Element`
        keyword.

        The returned string is in Unicode format and it does not contain any
        XML declaration.

        See also `Log Element`.
        """
        string = ET.tostring(self.get_element(source, xpath), encoding='UTF-8')
        return self._xml_declaration.sub('', string.decode('UTF-8')).strip()
 def test_write_many_elements(self):
     self.writer.start("root", {"version": "test"})
     self.writer.start("child1", {"my-attr": "my value"})
     self.writer.element("leaf1.1", "leaf content", {"type": "kw"})
     self.writer.element("leaf1.2")
     self.writer.end("child1")
     self.writer.element("child2", attrs={"class": "foo"})
     self.writer.end("root")
     self.writer.close()
     with ETSource(PATH) as source:
         root = ET.parse(source).getroot()
     self._verify_node(root, "root", attrs={"version": "test"})
     self._verify_node(root.find("child1"), "child1", attrs={"my-attr": "my value"})
     self._verify_node(root.find("child1/leaf1.1"), "leaf1.1", "leaf content", {"type": "kw"})
     self._verify_node(root.find("child1/leaf1.2"), "leaf1.2")
     self._verify_node(root.find("child2"), "child2", attrs={"class": "foo"})
Example #16
0
    def parse_xml(self, source):
        """Parses the given XML file or string into an element structure.

        The `source` can either be a path to an XML file or a string containing
        XML. In both cases the XML is parsed into ElementTree
        [http://docs.python.org/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element|element structure]
        and the root element is returned.

        Examples:
        | ${xml} =  | Parse XML | ${CURDIR}/test.xml    |
        | ${root} = | Parse XML | <root><child/></root> |

        For more details and examples, see `Parsing XML` section in the
        `introduction`.

        See also `Get Element` and `Get Elements`.
        """
        with ETSource(source) as source:
            return ET.parse(source).getroot()
Example #17
0
    def parse_xml(self, source):
        """Parses the given XML file or string into an element structure.

        The `source` can either be a path to an XML file or a string containing
        XML. In both cases the XML is parsed into ElementTree
        [http://docs.python.org/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element|element structure]
        and the root element is returned.

        Examples:
        | ${xml} =  | Parse XML | ${CURDIR}/test.xml    |
        | ${root} = | Parse XML | <root><child/></root> |

        For more details and examples, see `Parsing XML` section in the
        `introduction`.

        See also `Get Element` and `Get Elements`.
        """
        with ETSource(source) as source:
            return ET.parse(source).getroot()
Example #18
0
 def _parse_spec(self, path):
     with ETSource(path) as source:
         return ET.parse(source).getroot()
Example #19
0
 def _parse_spec(self, path):
     with ETSource(path) as source:
         return ET.parse(source).getroot()
Example #20
0
 def parse_xml(self, source):
     with ETSource(source) as source:
         return ET.parse(source).getroot()
Example #21
0
 def _get_root(self):
     self.writer.close()
     with ETSource(PATH) as source:
         return ET.parse(source).getroot()
def get_interpreter(output):
    tree = ET.parse(output)
    root = tree.getroot()
    return Interpreter(*MATCHER.match(root.attrib['generator']).groups())
 def _xml_lines(self, text):
     with ETSource(text) as source:
         tree = ET.parse(source)
     output = StringIO()
     tree.write(output)
     return output.getvalue().splitlines()
Example #24
0
 def _xml_lines(self, text):
     with ETSource(text) as source:
         tree = ET.parse(source)
     output = BytesIO()
     tree.write(output)
     return output.getvalue().splitlines()
Example #25
0
 def _get_root(self):
     self.writer.close()
     with ETSource(PATH) as source:
         return ET.parse(source).getroot()
Example #26
0
def get_interpreter(output):
    tree = ET.parse(output)
    root = tree.getroot()
    return Interpreter(*MATCHER.match(root.attrib['generator']).groups())