def __init__(self, cim_file): self.cim_file = cim_file xmlns = RDFXMLReader.xmlns(cim_file) self._package_map = RDFXMLReader.get_cim_ns(xmlns)[1] self._prim_onet = self._get_equipment_cls(Converter._primary_one_t) self._prim_twot = self._get_equipment_cls(Converter._primary_two_t) self._sec_onet = self._get_equipment_cls(Converter._secondary_one_t) self._sec_twot = self._get_equipment_cls(Converter._secondary_two_t)
def testGetNamespaces(self): ns = RDFXMLReader.xmlns(RDFXML_FILE) self.assertEqual(ns, { 'cim': 'http://iec.ch/TC57/2010/CIM-schema-cim15#', 'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', }) self.assertEqual(RDFXMLReader.get_rdf_ns(ns), 'http://www.w3.org/1999/02/22-rdf-syntax-ns#') self.assertEqual(RDFXMLReader.get_cim_ns(ns), (nsURICIM15, packageMapCIM15))
def test_create_branches(converter, results): cim_objects = RDFXMLReader.cimread(converter.cim_file) base_power, tnodes, lines = converter._iterate_prim_eq(cim_objects) buses, gens, pt = converter._create_buses(tnodes) branches = converter._create_branches(lines, pt, base_power, buses) assert branches == results['branch_attr']
def testGetNamespaces(self): ns = RDFXMLReader.xmlns(EQUIP_FILE) self.assertEqual( ns, { 'cim': 'http://iec.ch/TC57/2009/CIM-schema-cim14#', 'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'pti': 'http://www.pti-us.com/PTI_CIM-schema-cim14#' }) self.assertEqual(RDFXMLReader.get_rdf_ns(ns), 'http://www.w3.org/1999/02/22-rdf-syntax-ns#') self.assertEqual(RDFXMLReader.get_pti_ns(ns), 'http://www.pti-us.com/PTI_CIM-schema-cim14#') self.assertEqual(RDFXMLReader.get_cim_ns(ns), (nsURICIM14, packageMapCIM14))
def transform(self): """ Actually parses the CIM file and transforms its contents. A :class:`topology.Case` object is returned. """ cim_objects = RDFXMLReader.cimread(self.cim_file) base_power, tnodes, lines = self._iterate_prim_eq(cim_objects) self._create_bb_topology(base_power, tnodes, lines)
def test_iterate_primary_equipment(converter, results): cim_objects = RDFXMLReader.cimread(converter.cim_file) base_power, tnodes, branches = converter._iterate_prim_eq(cim_objects) assert base_power == results['base_power'] assert len(tnodes) == results['num_tnodes'] for tnode, equip in tnodes.items(): assert tnode.__class__.__name__ == 'TopologicalNode' assert len(equip) >= 1 assert len(branches) == results['num_lines'] for branch in branches: assert branch.__class__.__name__ == 'ACLineSegment'
def test_create_buses(converter, results): cim_objects = RDFXMLReader.cimread(converter.cim_file) base_power, tnodes, lines = converter._iterate_prim_eq(cim_objects) buses, gens, pt = converter._create_buses(tnodes) data = sorted([ (b.name, b.btype, b.pd, b.qd, b.vm, b.va, b.cim_classes, b.pos) for b in buses.values() ]) print (data) print (results['bus_attr']) assert data == results['bus_attr'] assert gens == {} assert len(pt) == results['num_transformers']
def fix_cim_files(cim_files, substitutions, cim_version, subst_id): """ Reads a XML file (containing the CIM model) and substitute strings, as defined by the *substitutions* input parameter. :param cim_files: CIM XML files :type cim_files: list of strings :param substitutions: defines substitutions to be made in the CIM XML file in the following format substitutions[( 'original_string', 'substitution_string' )] = count_of_substitutions :type substitutions: dictionary :param cim_version: the CIM subst_id for which the substitution applies :type cim_version: strings :param subst_id: id of the set of substitutions to be made :type subst_id: string :return: None """ comment_first_line = '<!-- START of message from GARPUR CIM Import tool (%s)\n' % subst_id comment_last_line = 'END of message from GARPUR CIM Import tool (%s)-->' % subst_id for cim_file in cim_files: with open(cim_file, 'r') as FILE: # Move the pointer (similar to a cursor in a text editor) to the end of the file. FILE.seek(0, os.SEEK_END) # This code means the following code skips the very last character in the file - # i.e. in the case the last line is null we delete the last line # and the penultimate one pos = FILE.tell() - 1 # Read each character in the file one at a time from the penultimate # character going backwards, searching for a newline character # If we find a new line, exit the search while pos > 0 and FILE.read(1) != '\n': pos -= 1 FILE.seek(pos, os.SEEK_SET) if pos > 0: FILE.seek( pos + 1, os.SEEK_SET ) # the +1 is to ignore the '\n' from the previous line last_line_in_file = FILE.readline() else: last_line_in_file = '' if last_line_in_file == comment_last_line: FILE.close() logging_message = 'File "%s" has been already previously checked for compliance with the PyCIM library definitions!\n' % cim_file # print(logging_message) logger.info(logging_message) continue FILE.close() xmlns = RDFXMLReader.xmlns(cim_file) if xmlns['cim'] == cim_version: cont_changes = 0 fh_temp, abs_path_temp = mkstemp() with open(abs_path_temp, 'w') as new_file, open(cim_file, 'r') as old_file: for line in old_file: for original, substitution in substitutions: if original in line: line = line.replace(original, substitution) cont_changes += 1 substitutions[(original, substitution)] += 1 new_file.write(line) # Write an XML comment at the end that substitutions were made new_file.write(comment_first_line) new_file.write( 'The following substitions were made in this file in order to comply with the PyCIM library definitions!\n' ) new_file.write('<substitutions>\n') new_file.write('\t<datetime>%s<\datetime>\n' % datetime.now()) for pattern, num_substitution in substitutions.items(): if num_substitution: new_file.write('\t<substitution>\n') new_file.write( '\t\t<originalText>"%s"</originalText>\n' % pattern[0]) new_file.write( '\t\t<substitutionText>"%s"</substitutionText>\n' % pattern[1]) new_file.write( '\t\t<numSubstitutions>%d</numSubstitutions>\n' % num_substitution) new_file.write('\t</substitution>\n') new_file.write('</substitutions>\n') new_file.write(comment_last_line) os.close(fh_temp) if cont_changes > 0: os.remove(cim_file) move(abs_path_temp, cim_file) logging_message = '%d changes were made in %s!' % ( cont_changes, cim_file) logger.warn(logging_message) else: with open(cim_file, 'a') as FILE: FILE.write(comment_first_line) FILE.write( 'This file was checked and is compliant with the PyCIM library definitions!\n' ) FILE.write('<datetime>%s<\datetime>\n' % datetime.now()) FILE.write(comment_last_line) FILE.close() logging_message = 'No changes were made in %s!' % cim_file logger.warn(logging_message) os.remove(abs_path_temp) else: logging_message = 'File "%s" is CIM version %s! \nHowever, the check for compliance with the PyCIM library definitions is for CIM version %s \n' % ( cim_file, xmlns['cim'], cim_version) logger.error(logging_message)
def fix_cim_files(cim_files, substitutions, cim_version, subst_id): """ Reads a XML file (containing the CIM model) and substitute strings, as defined by the *substitutions* input parameter. :param cim_files: CIM XML files :type cim_files: list of strings :param substitutions: defines substitutions to be made in the CIM XML file in the following format substitutions[( 'original_string', 'substitution_string' )] = count_of_substitutions :type substitutions: dictionary :param cim_version: the CIM subst_id for which the substitution applies :type cim_version: strings :param subst_id: id of the set of substitutions to be made :type subst_id: string :return: None """ comment_first_line = '<!-- START of message from GARPUR CIM Import tool (%s)\n' % subst_id comment_last_line = 'END of message from GARPUR CIM Import tool (%s)-->' % subst_id for cim_file in cim_files: with open(cim_file, 'r') as FILE: # Move the pointer (similar to a cursor in a text editor) to the end of the file. FILE.seek(0, os.SEEK_END) # This code means the following code skips the very last character in the file - # i.e. in the case the last line is null we delete the last line # and the penultimate one pos = FILE.tell() - 1 # Read each character in the file one at a time from the penultimate # character going backwards, searching for a newline character # If we find a new line, exit the search while pos > 0 and FILE.read(1) != '\n': pos -= 1 FILE.seek(pos, os.SEEK_SET) if pos > 0: FILE.seek(pos+1, os.SEEK_SET) # the +1 is to ignore the '\n' from the previous line last_line_in_file = FILE.readline() else: last_line_in_file = '' if last_line_in_file == comment_last_line: FILE.close() logging_message = 'File "%s" has been already previously checked for compliance with the PyCIM library definitions!\n' % cim_file # print(logging_message) logger.info(logging_message) continue FILE.close() xmlns = RDFXMLReader.xmlns(cim_file) if xmlns['cim'] == cim_version: cont_changes = 0 fh_temp, abs_path_temp = mkstemp() with open(abs_path_temp, 'w') as new_file, open(cim_file, 'r') as old_file: for line in old_file: for original, substitution in substitutions: if original in line: line = line.replace(original, substitution) cont_changes += 1 substitutions[(original, substitution)] += 1 new_file.write(line) # Write an XML comment at the end that substitutions were made new_file.write(comment_first_line) new_file.write('The following substitions were made in this file in order to comply with the PyCIM library definitions!\n') new_file.write('<substitutions>\n') new_file.write('\t<datetime>%s<\datetime>\n' % datetime.now()) for pattern, num_substitution in substitutions.items(): if num_substitution: new_file.write('\t<substitution>\n') new_file.write('\t\t<originalText>"%s"</originalText>\n' % pattern[0]) new_file.write('\t\t<substitutionText>"%s"</substitutionText>\n' % pattern[1]) new_file.write('\t\t<numSubstitutions>%d</numSubstitutions>\n' % num_substitution) new_file.write('\t</substitution>\n') new_file.write('</substitutions>\n') new_file.write(comment_last_line) os.close(fh_temp) if cont_changes > 0: os.remove(cim_file) move(abs_path_temp, cim_file) logging_message = '%d changes were made in %s!' %(cont_changes, cim_file) logger.warn(logging_message) else: with open(cim_file, 'a') as FILE: FILE.write(comment_first_line) FILE.write('This file was checked and is compliant with the PyCIM library definitions!\n') FILE.write('<datetime>%s<\datetime>\n' % datetime.now()) FILE.write(comment_last_line) FILE.close() logging_message = 'No changes were made in %s!' % cim_file logger.warn(logging_message) os.remove(abs_path_temp) else: logging_message = 'File "%s" is CIM version %s! \nHowever, the check for compliance with the PyCIM library definitions is for CIM version %s \n' %(cim_file, xmlns['cim'], cim_version) logger.error(logging_message)