def cmp_read_xslt_file(self, sc3ml_file, quakeml_file, validate=True): """ Check if the QuakeML file generated with the XSLT file is the same than the one in the data folder. Every available SC3ML versions are tested except those for which the file is not valid. """ for version in SCHEMA_VERSION: read_xslt_filename = os.path.join( self.io_directory, 'seiscomp', 'data', 'sc3ml_%s__quakeml_1.2.xsl' % version, ) transform = etree.XSLT(etree.parse(read_xslt_filename)) filename = os.path.join(self.path, sc3ml_file) sc3ml_doc = self.change_version(filename, version) # Only test valid SC3ML file if not validate_sc3ml(sc3ml_doc): continue quakeml_doc = transform(sc3ml_doc) with NamedTemporaryFile() as tf: tf.write(quakeml_doc) if validate: self.assertTrue(_validate_quakeml(tf.name)) filepath_cmp = os.path.join(self.path, quakeml_file) self.assertTrue(filecmp.cmp(filepath_cmp, tf.name))
def _write_sc3ml(catalog, filename, validate=False, verbose=False, event_removal=False, **kwargs): # @UnusedVariable """ Write a SC3ML 0.10 file. Since a XSLT file is used to write the SC3ML file from a QuakeML file, the catalog is first converted in QuakeML. .. warning:: This function should NOT be called directly, it registers via the the :meth:`~obspy.core.event.catalog.Catalog.write` method of an ObsPy :class:`~obspy.core.event.catalog.Catalog` object, call this instead. :type catalog: :class:`~obspy.core.event.catalog.Catalog` :param catalog: The ObsPy Catalog object to write. :type filename: str or file :param filename: Filename to write or open file-like object. :type validate: bool :param validate: If True, the final SC3ML file will be validated against the SC3ML schema file. Raises an AssertionError if the validation fails. :type verbose: bool :param verbose: Print validation error log if True. :type event_deletion: bool :param event_removal: If True, the event elements will be removed. This can be useful to associate origins with scevent when injecting SC3ML file into seiscomp. """ nsmap_ = getattr(catalog, "nsmap", {}) quakeml_doc = Pickler(nsmap=nsmap_).dumps(catalog) xslt_filename = os.path.join(os.path.dirname(__file__), 'data', 'quakeml_1.2__sc3ml_0.10.xsl') transform = etree.XSLT(etree.parse(xslt_filename)) sc3ml_doc = transform(etree.parse(io.BytesIO(quakeml_doc))) # Remove events if event_removal: for event in sc3ml_doc.xpath("//*[local-name()='event']"): event.getparent().remove(event) if validate and not validate_sc3ml(io.BytesIO(sc3ml_doc), verbose=verbose): raise AssertionError("The final SC3ML file did not pass validation.") # Open filehandler or use an existing file like object try: with open(filename, 'wb') as fh: fh.write(sc3ml_doc) except TypeError: filename.write(sc3ml_doc)
def cmp_write_xslt_file(self, quakeml_file, sc3ml_file, validate=True, path=None): """ Check if the SC3ML file generated with the XSLT file is the same than the one in the data folder. """ if path is None: path = self.path transform = etree.XSLT(etree.parse(self.write_xslt_filename)) filename = os.path.join(path, quakeml_file) sc3ml_doc = transform(etree.parse(filename)) with NamedTemporaryFile() as tf: tf.write(sc3ml_doc) if validate: self.assertTrue(validate_sc3ml(tf.name)) filepath_cmp = os.path.join(self.path, sc3ml_file) self.assertTrue(filecmp.cmp(filepath_cmp, tf.name))
def cmp_write_xslt_file(self, quakeml_file, sc3ml_file, target_version, validate=True, path=None): """ Check if the SCXML file generated with the XSLT file is the same than the one in the data folder. The `target_version` parameter allows to change the version of the generated file to match the version of the reference file. """ if path is None: path = self.path transform = etree.XSLT(etree.parse(self.write_xslt_filename)) filename = os.path.join(path, quakeml_file) quakeml_doc = etree.parse(filename) sc3ml_doc = transform(quakeml_doc) sc3ml_doc_string = self.change_writing_version( bytes(sc3ml_doc).decode(encoding=quakeml_doc.docinfo.encoding), target_version, ) # The NamedTemporaryFile works with bytes not string… sc3ml_doc_bytes = sc3ml_doc_string.encode( encoding=quakeml_doc.docinfo.encoding) with NamedTemporaryFile() as tf: tf.write(sc3ml_doc_bytes) if validate: self.assertTrue(validate_sc3ml(tf.name, target_version)) filepath_cmp = os.path.join(self.path, sc3ml_file) self.assertTrue(filecmp.cmp(filepath_cmp, tf.name))