def testConfigUniverseGetEntityType(self): context = findings_lib.FileContext('') type_universe = entity_type_lib.EntityTypeUniverse([]) type_universe.AddFinding( findings_lib.IllegalCharacterError('stuff', context)) field_universe = field_lib.FieldUniverse([]) field_universe.AddFinding( findings_lib.InconsistentFileLocationError('', context)) subfield_universe = subfield_lib.SubfieldUniverse([]) subfield_universe.AddFinding( findings_lib.CapitalizationError('Hi', context)) state_universe = state_lib.StateUniverse([]) connection_universe = connection_lib.ConnectionUniverse([]) unit_universe = unit_lib.UnitUniverse([]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=subfield_universe, field_universe=field_universe, entity_type_universe=type_universe, state_universe=state_universe, connection_universe=connection_universe, unit_universe=unit_universe) entity_type = config_universe.GetEntityType('NONEXISTENT', 'NONEXISTENT') self.assertIsNone(entity_type)
def testParseFieldFoldersFromGoodFilesWithSubfieldUniverse(self): subfield_folders = parse.ParseSubfieldFoldersFromFiles( [self.global_subfields_file, self.local_subfields_file]) subfield_universe = subfield_lib.SubfieldUniverse(subfield_folders) field_folders = parse.ParseFieldFoldersFromFiles( [self.global_fields_file, self.local_fields_file], subfield_universe=subfield_universe) # Should have two namespace objects self.assertLen(field_folders, 2) for folder in field_folders: self.assertEmpty(folder.GetFindings()) if folder.parent_namespace is None: # check global namespace # Should have 4 fields in global namespace global_fields = folder.local_namespace.fields self.assertLen(global_fields, 4) self.assertIn(frozenset({'fan', 'run', 'status'}), global_fields) self.assertIn(frozenset({'dryer', 'run', 'status'}), global_fields) self.assertIn(frozenset({'command', 'fan', 'run'}), global_fields) self.assertIn(frozenset({'current', 'sensor'}), global_fields) else: # check local namespace self.assertIn( frozenset({'air', 'sensor', 'temperature', 'zone'}), folder.local_namespace.fields)
def testConfigUniverse(self): context = findings_lib.FileContext('') type_universe = entity_type_lib.EntityTypeUniverse([]) type_universe.AddFinding( findings_lib.IllegalCharacterError('stuff', context)) field_universe = field_lib.FieldUniverse([]) field_universe.AddFinding( findings_lib.InconsistentFileLocationError('', context)) subfield_universe = subfield_lib.SubfieldUniverse([]) subfield_universe.AddFinding( findings_lib.CapitalizationError('Hi', context)) state_universe = state_lib.StateUniverse([]) connection_universe = connection_lib.ConnectionUniverse([]) connection_universe.AddFinding( findings_lib.InvalidConnectionNamespaceError('notglobal', context)) unit_universe = unit_lib.UnitUniverse([]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=subfield_universe, field_universe=field_universe, entity_type_universe=type_universe, state_universe=state_universe, connection_universe=connection_universe, unit_universe=unit_universe) findings = config_universe.GetFindings() self.assertLen(findings, 4) self.assertTrue( config_universe.HasFindingTypes([ findings_lib.InconsistentFileLocationError, findings_lib.IllegalCharacterError, findings_lib.CapitalizationError, findings_lib.InvalidConnectionNamespaceError ])) self.assertFalse(config_universe.IsValid())
def testParseUnitFoldersFromGoodFiles(self): subfield_folders = parse.ParseSubfieldFoldersFromFiles( [self.global_subfields_file, self.local_subfields_file]) subfield_universe = subfield_lib.SubfieldUniverse(subfield_folders) unit_folders = parse.ParseUnitFoldersFromFiles( [self.global_units_file, self.local_units_file], subfield_universe=subfield_universe) self.assertLen(unit_folders, 2) for folder in unit_folders: self.assertEmpty(folder.GetFindings()) units_map = folder.local_namespace.units if not folder.local_namespace.namespace: # global namespace self.assertEqual(units_map['amperes'], unit_lib.Unit('amperes', 'current', True)) self.assertEqual(units_map['milliamperes'], unit_lib.Unit('milliamperes', 'current')) else: # local namespace self.assertEqual(folder.local_namespace.namespace, 'GOOD') self.assertEqual(units_map['kelvins'], unit_lib.Unit('kelvins', 'temperature', True)) self.assertEqual( units_map['degrees_celsius'], unit_lib.Unit('degrees_celsius', 'temperature')) self.assertEqual( units_map['degrees_fahrenheit'], unit_lib.Unit('degrees_fahrenheit', 'temperature'))
def testSubfieldUniverseGetFindings(self): context = findings_lib.FileContext(_GOOD_PATH + '/file.yaml') folder = subfield_lib.SubfieldFolder(_GOOD_PATH) folder.AddFinding( findings_lib.InconsistentFileLocationError('', context)) namespace = folder.local_namespace namespace.AddFinding( findings_lib.DuplicateSubfieldDefinitionError( namespace, subfield_lib.Subfield( 'two', subfield_lib.SubfieldCategory.POINT_TYPE), context)) subfield_one = subfield_lib.Subfield( 'one', subfield_lib.SubfieldCategory.POINT_TYPE, 'thing') subfield_one.AddFinding( findings_lib.MissingSubfieldDescriptionWarning('one', context)) namespace.InsertSubfield(subfield_one) subfields_universe = subfield_lib.SubfieldUniverse([folder]) findings = subfields_universe.GetFindings() self.assertLen(findings, 3) self.assertTrue( subfields_universe.HasFindingTypes([ findings_lib.InconsistentFileLocationError, findings_lib.DuplicateSubfieldDefinitionError, findings_lib.MissingSubfieldDescriptionWarning ])) self.assertFalse(subfields_universe.IsValid())
def testParseUnitFoldersFromGoodFiles(self): subfield_folders = parse.ParseSubfieldFoldersFromFiles( [self.global_subfields_file, self.local_subfields_file]) subfield_universe = subfield_lib.SubfieldUniverse(subfield_folders) unit_folders = parse.ParseUnitFoldersFromFiles( [self.global_units_file], subfield_universe=subfield_universe) self.assertTrue(unit_folders) for folder in unit_folders: self.assertEmpty(folder.GetFindings()) current_units = folder.local_namespace.GetUnitsForMeasurement( 'current') temperature_units = folder.local_namespace.GetUnitsForMeasurement( 'temperature') if not folder.local_namespace.namespace: # global namespace self.assertEqual(current_units['amperes'], unit_lib.Unit('amperes', True)) self.assertEqual(current_units['milliamperes'], unit_lib.Unit('milliamperes')) self.assertEqual(temperature_units['kelvins'], unit_lib.Unit('kelvins', True)) self.assertEqual(temperature_units['degrees_celsius'], unit_lib.Unit('degrees_celsius')) self.assertEqual(temperature_units['degrees_fahrenheit'], unit_lib.Unit('degrees_fahrenheit'))
def BuildUniverse(config): """Verifies that the ontology config is consistent and valid. Args: config: a Config namedtuple containing lists of localpaths to config files. Returns: A ConfigUniverse that is fully populated with all content specified in the config. """ # Parse state files state_universe = None if config.states: state_folders = parse.ParseStateFoldersFromFiles(config.states) state_universe = state_lib.StateUniverse(state_folders) connections_universe = None if config.connections: connection_folders = parse.ParseConnectionFoldersFromFiles( config.connections) connections_universe = connection_lib.ConnectionUniverse( connection_folders) # Parse subfield files subfields_universe = None if config.subfields: subfield_folders = parse.ParseSubfieldFoldersFromFiles( config.subfields) subfields_universe = subfield_lib.SubfieldUniverse(subfield_folders) # Parse unit files unit_universe = None if config.units: unit_folders = parse.ParseUnitFoldersFromFiles(config.units, subfields_universe) unit_universe = unit_lib.UnitUniverse(unit_folders) if subfields_universe: subfields_universe.ValidateUnits(unit_universe) # Parse fields files fields_universe = None if config.fields: field_folders = parse.ParseFieldFoldersFromFiles( config.fields, subfields_universe, state_universe) fields_universe = field_lib.FieldUniverse(field_folders) # Parse typedef files type_folders = parse.ParseTypeFoldersFromFiles(config.type_defs, fields_universe) types_universe = entity_type_lib.EntityTypeUniverse(type_folders) # return findings_list, result_namespaces return ConfigUniverse(types_universe, fields_universe, subfields_universe, state_universe, connections_universe, unit_universe)
def testParseUnitFoldersFromBadFileWithSubfieldUniverse(self): subfield_folders = parse.ParseSubfieldFoldersFromFiles( [self.global_subfields_file, self.local_subfields_file]) subfield_universe = subfield_lib.SubfieldUniverse(subfield_folders) bad_units = base_lib.PathParts( root=self.base_dir, relative_path='BAD/units/bad_units.yaml') unit_folders = parse.ParseUnitFoldersFromFiles( [bad_units], subfield_universe=subfield_universe) local_folder = unit_folders[0] self.assertTrue( local_folder.HasFindingTypes( [findings_lib.UnknownMeasurementTypeError]))
def testSubfieldUniverseGetSubfieldsMap(self): # Create field folders folder = subfield_lib.SubfieldFolder(_GOOD_PATH) namespace = folder.local_namespace namespace.InsertSubfield(subfield_lib.Subfield( 'one', subfield_lib.SubfieldCategory.POINT_TYPE)) namespace.InsertSubfield(subfield_lib.Subfield( 'two', subfield_lib.SubfieldCategory.POINT_TYPE)) subfields_universe = subfield_lib.SubfieldUniverse([folder]) subfields_map = subfields_universe.GetSubfieldsMap('mynamespace') self.assertIn('one', subfields_map) self.assertIn('two', subfields_map)
# https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an AS IS BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations # under # the # License. """Sets up a minimal subfield universe required for testing.""" from yamlformat.validator import subfield_lib SUBFIELD_FOLDER = subfield_lib.SubfieldFolder(folderpath='subfields') SUBFIELD_UNIVERSE = subfield_lib.SubfieldUniverse(folders=[SUBFIELD_FOLDER]) SUBFIELD_FOLDER.AddFromConfig(config_filename='subfields/subfields.yaml', documents=[{ 'aggregation': { 'average': 'foobar', 'max': 'foobar', 'min': 'foobar', 'total': 'foobar', }, 'component': { 'battery': 'foobar', 'cable': 'foobar', 'coil': 'foobar', 'compressor': 'foobar', 'condenser': 'foobar',