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)
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)
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()
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()
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
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
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 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"})
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()
def _parse_spec(self, path): with ETSource(path) as source: return ET.parse(source).getroot()
def parse_xml(self, source): with ETSource(source) as source: return ET.parse(source).getroot()
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()
def _xml_lines(self, text): with ETSource(text) as source: tree = ET.parse(source) output = BytesIO() tree.write(output) return output.getvalue().splitlines()