Best Python code snippet using slash
errors.py
Source:errors.py
...205 # type: (str, ParserErrorCollection) -> None206 """Construct a new ParserContext."""207 self.errors = errors208 self.file_name = file_name209 def _add_error(self, location, error_id, msg):210 # type: (common.SourceLocation, str, str) -> None211 """212 Add an error with a source location information.213 This is usually directly from an idl.syntax or idl.ast class.214 """215 self.errors.add(location, error_id, msg)216 def _add_node_error(self, node, error_id, msg):217 # type: (yaml.nodes.Node, str, str) -> None218 """Add an error with source location information based on a YAML node."""219 self.errors.add(220 common.SourceLocation(self.file_name, node.start_mark.line, node.start_mark.column),221 error_id, msg)222 def add_unknown_root_node_error(self, node):223 # type: (yaml.nodes.Node) -> None224 """Add an error about an unknown YAML root node."""225 self._add_node_error(226 node, ERROR_ID_UNKNOWN_ROOT,227 ("Unrecognized IDL specification root level node '%s', only " +228 " (global, import, types, commands, and structs) are accepted") % (node.value))229 def add_unknown_node_error(self, node, name):230 # type: (yaml.nodes.Node, str) -> None231 """Add an error about an unknown node."""232 self._add_node_error(node, ERROR_ID_UNKNOWN_NODE,233 "Unknown IDL node '%s' for YAML entity '%s'" % (node.value, name))234 def add_duplicate_symbol_error(self, location, name, duplicate_class_name, original_class_name):235 # type: (common.SourceLocation, str, str, str) -> None236 """Add an error about a duplicate symbol."""237 self._add_error(238 location, ERROR_ID_DUPLICATE_SYMBOL, "%s '%s' is a duplicate symbol of an existing %s" %239 (duplicate_class_name, name, original_class_name))240 def add_unknown_type_error(self, location, field_name, type_name):241 # type: (common.SourceLocation, str, str) -> None242 """Add an error about an unknown type."""243 self._add_error(location, ERROR_ID_UNKNOWN_TYPE,244 "'%s' is an unknown type for field '%s'" % (type_name, field_name))245 def _is_node_type(self, node, node_name, expected_node_type):246 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str, str) -> bool247 """Return True if the yaml node type is expected, otherwise returns False and logs an error."""248 if not node.id == expected_node_type:249 self._add_node_error(250 node, ERROR_ID_IS_NODE_TYPE,251 "Illegal YAML node type '%s' for '%s', expected YAML node type '%s'" %252 (node.id, node_name, expected_node_type))253 return False254 return True255 def is_mapping_node(self, node, node_name):256 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str) -> bool257 """Return True if this YAML node is a Map."""258 return self._is_node_type(node, node_name, "mapping")259 def is_scalar_node(self, node, node_name):260 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str) -> bool261 """Return True if this YAML node is a Scalar."""262 return self._is_node_type(node, node_name, "scalar")263 def is_scalar_sequence(self, node, node_name):264 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str) -> bool265 """Return True if this YAML node is a Sequence of Scalars."""266 if self._is_node_type(node, node_name, "sequence"):267 for seq_node in node.value:268 if not self.is_scalar_node(seq_node, node_name):269 return False270 return True271 return False272 def is_sequence_mapping(self, node, node_name):273 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str) -> bool274 """Return True if this YAML node is a Sequence of Mappings."""275 if self._is_node_type(node, node_name, "sequence"):276 for seq_node in node.value:277 if not self.is_mapping_node(seq_node, node_name):278 return False279 return True280 return False281 def is_scalar_sequence_or_scalar_node(self, node, node_name):282 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str) -> bool283 # pylint: disable=invalid-name284 """Return True if the YAML node is a Scalar or Sequence."""285 if not node.id == "scalar" and not node.id == "sequence":286 self._add_node_error(287 node, ERROR_ID_IS_NODE_TYPE_SCALAR_OR_SEQUENCE,288 "Illegal node type '%s' for '%s', expected either node type 'scalar' or 'sequence'"289 % (node.id, node_name))290 return False291 if node.id == "sequence":292 return self.is_scalar_sequence(node, node_name)293 return True294 def is_scalar_or_mapping_node(self, node, node_name):295 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str) -> bool296 # pylint: disable=invalid-name297 """Return True if the YAML node is a Scalar or Mapping."""298 if not node.id == "scalar" and not node.id == "mapping":299 self._add_node_error(300 node, ERROR_ID_IS_NODE_TYPE_SCALAR_OR_MAPPING,301 "Illegal node type '%s' for '%s', expected either node type 'scalar' or 'mapping'" %302 (node.id, node_name))303 return False304 return True305 def is_scalar_bool_node(self, node, node_name):306 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str) -> bool307 """Return True if this YAML node is a Scalar and a valid boolean."""308 if not self._is_node_type(node, node_name, "scalar"):309 return False310 if not (node.value == "true" or node.value == "false"):311 self._add_node_error(312 node, ERROR_ID_IS_NODE_VALID_BOOL,313 "Illegal bool value for '%s', expected either 'true' or 'false'." % node_name)314 return False315 return True316 def get_bool(self, node):317 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode]) -> bool318 """Convert a scalar to a bool."""319 assert self.is_scalar_bool_node(node, "unknown")320 if node.value == "true":321 return True322 return False323 def get_list(self, node):324 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode]) -> List[str]325 """Get a YAML scalar or sequence node as a list of strings."""326 assert self.is_scalar_sequence_or_scalar_node(node, "unknown")327 if node.id == "scalar":328 return [node.value]329 # Unzip the list of ScalarNode330 return [v.value for v in node.value]331 def add_duplicate_error(self, node, node_name):332 # type: (yaml.nodes.Node, str) -> None333 """Add an error about a duplicate node."""334 self._add_node_error(node, ERROR_ID_DUPLICATE_NODE,335 "Duplicate node found for '%s'" % (node_name))336 def add_missing_required_field_error(self, node, node_parent, node_name):337 # type: (yaml.nodes.Node, str, str) -> None338 """Add an error about a YAML node missing a required child."""339 # pylint: disable=invalid-name340 self._add_node_error(341 node, ERROR_ID_MISSING_REQUIRED_FIELD,342 "IDL node '%s' is missing required scalar '%s'" % (node_parent, node_name))343 def add_missing_ast_required_field_error(self, location, ast_type, ast_parent, ast_name):344 # type: (common.SourceLocation, str, str, str) -> None345 """Add an error about a AST node missing a required child."""346 # pylint: disable=invalid-name347 self._add_error(348 location, ERROR_ID_MISSING_AST_REQUIRED_FIELD,349 "%s '%s' is missing required scalar '%s'" % (ast_type, ast_parent, ast_name))350 def add_array_not_valid_error(self, location, ast_type, name):351 # type: (common.SourceLocation, str, str) -> None352 """Add an error about a 'array' not being a valid type name."""353 self._add_error(location, ERROR_ID_ARRAY_NOT_VALID_TYPE,354 "The %s '%s' cannot be named 'array'" % (ast_type, name))355 def add_bad_bson_type_error(self, location, ast_type, ast_parent, bson_type_name):356 # type: (common.SourceLocation, str, str, str) -> None357 """Add an error about a bad bson type."""358 self._add_error(359 location, ERROR_ID_BAD_BSON_TYPE, "BSON Type '%s' is not recognized for %s '%s'." %360 (bson_type_name, ast_type, ast_parent))361 def add_bad_bson_scalar_type_error(self, location, ast_type, ast_parent, bson_type_name):362 # type: (common.SourceLocation, str, str, str) -> None363 """Add an error about a bad list of bson types."""364 self._add_error(location, ERROR_ID_BAD_BSON_TYPE_LIST,365 ("BSON Type '%s' is not a scalar bson type for %s '%s'" +366 " and cannot be used in a list of bson serialization types.") %367 (bson_type_name, ast_type, ast_parent))368 def add_bad_bson_bindata_subtype_error(self, location, ast_type, ast_parent, bson_type_name):369 # type: (common.SourceLocation, str, str, str) -> None370 """Add an error about a bindata_subtype associated with a type that is not bindata."""371 # pylint: disable=invalid-name372 self._add_error(location, ERROR_ID_BAD_BSON_BINDATA_SUBTYPE_TYPE,373 ("The bindata_subtype field for %s '%s' is not valid for bson type '%s'") %374 (ast_type, ast_parent, bson_type_name))375 def add_bad_bson_bindata_subtype_value_error(self, location, ast_type, ast_parent, value):376 # type: (common.SourceLocation, str, str, str) -> None377 """Add an error about a bad value for bindata_subtype."""378 # pylint: disable=invalid-name379 self._add_error(location, ERROR_ID_BAD_BSON_BINDATA_SUBTYPE_VALUE,380 ("The bindata_subtype field's value '%s' for %s '%s' is not valid") %381 (value, ast_type, ast_parent))382 def add_bad_setat_specifier(self, location, specifier):383 # type: (common.SourceLocation, str) -> None384 """Add an error about a bad set_at specifier."""385 # pylint: disable=invalid-name386 self._add_error(387 location, ERROR_ID_BAD_SETAT_SPECIFIER,388 ("Unexpected set_at specifier: '%s', expected 'startup' or 'runtime'") % (specifier))389 def add_no_string_data_error(self, location, ast_type, ast_parent):390 # type: (common.SourceLocation, str, str) -> None391 """Add an error about using StringData for cpp_type."""392 self._add_error(location, ERROR_ID_NO_STRINGDATA,393 ("Do not use mongo::StringData for %s '%s', use std::string instead") %394 (ast_type, ast_parent))395 def add_ignored_field_must_be_empty_error(self, location, name, field_name):396 # type: (common.SourceLocation, str, str) -> None397 """Add an error about field must be empty for ignored fields."""398 # pylint: disable=invalid-name399 self._add_error(400 location, ERROR_ID_FIELD_MUST_BE_EMPTY_FOR_IGNORED,401 ("Field '%s' cannot contain a value for property '%s' when a field is marked as ignored"402 ) % (name, field_name))403 def add_struct_field_must_be_empty_error(self, location, name, field_name):404 # type: (common.SourceLocation, str, str) -> None405 """Add an error about field must be empty for fields of type struct."""406 # pylint: disable=invalid-name407 self._add_error(408 location, ERROR_ID_FIELD_MUST_BE_EMPTY_FOR_STRUCT,409 ("Field '%s' cannot contain a value for property '%s' when a field's type is a struct")410 % (name, field_name))411 def add_not_custom_scalar_serialization_not_supported_error(self, location, ast_type,412 ast_parent, bson_type_name):413 # type: (common.SourceLocation, str, str, str) -> None414 # pylint: disable=invalid-name415 """Add an error about field must be empty for fields of type struct."""416 self._add_error(417 location, ERROR_ID_CUSTOM_SCALAR_SERIALIZATION_NOT_SUPPORTED,418 ("Custom serialization for a scalar is only supported for 'string'. The %s '%s' cannot"419 + " use bson type '%s', use a bson_serialization_type of 'any' instead.") %420 (ast_type, ast_parent, bson_type_name))421 def add_bad_any_type_use_error(self, location, bson_type, ast_type, ast_parent):422 # type: (common.SourceLocation, str, str, str) -> None423 # pylint: disable=invalid-name424 """Add an error about any being used in a list of bson types."""425 self._add_error(426 location, ERROR_ID_BAD_ANY_TYPE_USE,427 ("The BSON Type '%s' is not allowed in a list of bson serialization types for" +428 "%s '%s'. It must be only a single bson type.") % (bson_type, ast_type, ast_parent))429 def add_bad_cpp_numeric_type_use_error(self, location, ast_type, ast_parent, cpp_type):430 # type: (common.SourceLocation, str, str, str) -> None431 # pylint: disable=invalid-name432 """Add an error about any being used in a list of bson types."""433 self._add_error(434 location, ERROR_ID_BAD_NUMERIC_CPP_TYPE,435 ("The C++ numeric type '%s' is not allowed for %s '%s'. Only 'std::int32_t'," +436 " 'std::uint32_t', 'std::uint64_t', and 'std::int64_t' are supported.") %437 (cpp_type, ast_type, ast_parent))438 def add_bad_array_type_name_error(self, location, field_name, type_name):439 # type: (common.SourceLocation, str, str) -> None440 """Add an error about a field type having a malformed type name."""441 self._add_error(location, ERROR_ID_BAD_ARRAY_TYPE_NAME,442 ("'%s' is not a valid array type for field '%s'. A valid array type" +443 " is in the form 'array<type_name>'.") % (type_name, field_name))444 def add_array_no_default_error(self, location, field_name):445 # type: (common.SourceLocation, str) -> None446 """Add an error about an array having a type with a default value."""447 self._add_error(448 location, ERROR_ID_ARRAY_NO_DEFAULT,449 "Field '%s' is not allowed to have both a default value and be an array type" %450 (field_name))451 def add_cannot_find_import(self, location, imported_file_name):452 # type: (common.SourceLocation, str) -> None453 """Add an error about not being able to find an import."""454 self._add_error(location, ERROR_ID_BAD_IMPORT,455 "Could not resolve import '%s', file not found" % (imported_file_name))456 def add_bindata_no_default(self, location, ast_type, ast_parent):457 # type: (common.SourceLocation, str, str) -> None458 # pylint: disable=invalid-name459 """Add an error about a bindata type with a default value."""460 self._add_error(location, ERROR_ID_BAD_BINDATA_DEFAULT,461 ("Default values are not allowed for %s '%s'") % (ast_type, ast_parent))462 def add_chained_type_not_found_error(self, location, type_name):463 # type: (common.SourceLocation, str) -> None464 # pylint: disable=invalid-name465 """Add an error about a chained_type not found."""466 self._add_error(location, ERROR_ID_CHAINED_TYPE_NOT_FOUND,467 ("Type '%s' is not a valid chained type") % (type_name))468 def add_chained_type_wrong_type_error(self, location, type_name, bson_type_name):469 # type: (common.SourceLocation, str, str) -> None470 # pylint: disable=invalid-name471 """Add an error about a chained_type being the wrong type."""472 self._add_error(location, ERROR_ID_CHAINED_TYPE_WRONG_BSON_TYPE,473 ("Chained Type '%s' has the wrong bson serialization type '%s', only" +474 "'chain' is supported for chained types.") % (type_name, bson_type_name))475 def add_duplicate_field_error(self, location, field_container, field_name, duplicate_location):476 # type: (common.SourceLocation, str, str, common.SourceLocation) -> None477 """Add an error about duplicate fields as a result of chained structs/types."""478 self._add_error(479 location, ERROR_ID_CHAINED_DUPLICATE_FIELD,480 ("Chained Struct or Type '%s' duplicates an existing field '%s' at location" + "'%s'.")481 % (field_container, field_name, duplicate_location))482 def add_chained_type_no_strict_error(self, location, struct_name):483 # type: (common.SourceLocation, str) -> None484 # pylint: disable=invalid-name485 """Add an error about strict parser validate and chained types."""486 self._add_error(location, ERROR_ID_CHAINED_NO_TYPE_STRICT,487 ("Strict IDL parser validation is not supported with chained types for " +488 "struct '%s'. Specify 'strict: false' for this struct.") % (struct_name))489 def add_chained_struct_not_found_error(self, location, struct_name):490 # type: (common.SourceLocation, str) -> None491 # pylint: disable=invalid-name492 """Add an error about a chained_struct not found."""493 self._add_error(location, ERROR_ID_CHAINED_STRUCT_NOT_FOUND,494 ("Type '%s' is not a valid chained struct") % (struct_name))495 def add_chained_nested_struct_no_strict_error(self, location, struct_name, nested_struct_name):496 # type: (common.SourceLocation, str, str) -> None497 # pylint: disable=invalid-name498 """Add an error about strict parser validate and chained types."""499 self._add_error(location, ERROR_ID_CHAINED_NO_NESTED_STRUCT_STRICT,500 ("Strict IDL parser validation is not supported for a chained struct '%s'" +501 " contained by struct '%s'. Specify 'strict: false' for this struct.") %502 (nested_struct_name, struct_name))503 def add_chained_nested_struct_no_nested_error(self, location, struct_name, chained_name):504 # type: (common.SourceLocation, str, str) -> None505 # pylint: disable=invalid-name506 """Add an error about struct's chaining being a struct with nested chaining."""507 self._add_error(location, ERROR_ID_CHAINED_NO_NESTED_CHAINED,508 ("Struct '%s' is not allowed to nest struct '%s' since it has chained" +509 " structs and/or types.") % (struct_name, chained_name))510 def add_empty_enum_error(self, node, name):511 # type: (yaml.nodes.Node, str) -> None512 """Add an error about an enum without values."""513 self._add_node_error(514 node, ERROR_ID_BAD_EMPTY_ENUM,515 "Enum '%s' must have values specified but no values were found" % (name))516 def add_array_enum_error(self, location, field_name):517 # type: (common.SourceLocation, str) -> None518 """Add an error for a field being an array of enums."""519 self._add_error(location, ERROR_ID_NO_ARRAY_ENUM,520 "Field '%s' cannot be an array of enums" % (field_name))521 def add_enum_bad_type_error(self, location, enum_name, enum_type):522 # type: (common.SourceLocation, str, str) -> None523 """Add an error for an enum having the wrong type."""524 self._add_error(location, ERROR_ID_ENUM_BAD_TYPE,525 "Enum '%s' type '%s' is not a supported enum type" % (enum_name, enum_type))526 def add_enum_value_not_int_error(self, location, enum_name, enum_value, err_msg):527 # type: (common.SourceLocation, str, str, str) -> None528 """Add an error for an enum value not being an integer."""529 self._add_error(530 location, ERROR_ID_ENUM_BAD_INT_VAUE,531 "Enum '%s' value '%s' is not an integer, exception '%s'" % (enum_name, enum_value,532 err_msg))533 def add_enum_value_not_unique_error(self, location, enum_name):534 # type: (common.SourceLocation, str) -> None535 """Add an error for an enum having duplicate values."""536 self._add_error(location, ERROR_ID_ENUM_NON_UNIQUE_VALUES,537 "Enum '%s' has duplicate values, all values must be unique" % (enum_name))538 def add_enum_non_continuous_range_error(self, location, enum_name):539 # type: (common.SourceLocation, str) -> None540 """Add an error for an enum having duplicate values."""541 # pylint: disable=invalid-name542 self._add_error(location, ERROR_ID_ENUM_NON_CONTINUOUS_RANGE,543 ("Enum '%s' has non-continuous integer variables, enums must have a " +544 "continuous range of integer variables.") % (enum_name))545 def add_bad_command_namespace_error(self, location, command_name, command_namespace,546 valid_commands):547 # type: (common.SourceLocation, str, str, List[str]) -> None548 """Add an error about the namespace value not being a valid choice."""549 self._add_error(550 location, ERROR_ID_BAD_COMMAND_NAMESPACE,551 "Command namespace '%s' for command '%s' is not a valid choice. Valid options are '%s'."552 % (command_namespace, command_name, valid_commands))553 def add_bad_command_as_field_error(self, location, command_name):554 # type: (common.SourceLocation, str) -> None555 """Add an error about using a command for a field."""556 self._add_error(location, ERROR_ID_FIELD_NO_COMMAND,557 ("Command '%s' cannot be used as a field type'. Commands must be top-level"558 + " types due to their serialization rules.") % (command_name))559 def add_bad_array_of_chain(self, location, field_name):560 # type: (common.SourceLocation, str) -> None561 """Add an error about a field being an array of chain_types."""562 self._add_error(location, ERROR_ID_NO_ARRAY_OF_CHAIN,563 "Field '%s' cannot be an array of chained types" % (field_name))564 def add_bad_field_default_and_optional(self, location, field_name):565 # type: (common.SourceLocation, str) -> None566 """Add an error about a field being optional and having a default value."""567 # pylint: disable=invalid-name568 self._add_error(569 location, ERROR_ID_ILLEGAL_FIELD_DEFAULT_AND_OPTIONAL,570 ("Field '%s' can only be marked as optional or have a default value," + " not both.") %571 (field_name))572 def add_bad_struct_field_as_doc_sequence_error(self, location, struct_name, field_name):573 # type: (common.SourceLocation, str, str) -> None574 """Add an error about using a field in a struct being marked with supports_doc_sequence."""575 # pylint: disable=invalid-name576 self._add_error(location, ERROR_ID_STRUCT_NO_DOC_SEQUENCE,577 ("Field '%s' in struct '%s' cannot be used as a Command Document Sequence"578 " type. They are only supported in commands.") % (field_name, struct_name))579 def add_bad_non_array_as_doc_sequence_error(self, location, struct_name, field_name):580 # type: (common.SourceLocation, str, str) -> None581 """Add an error about using a non-array type field being marked with supports_doc_sequence."""582 # pylint: disable=invalid-name583 self._add_error(location, ERROR_ID_NO_DOC_SEQUENCE_FOR_NON_ARRAY,584 ("Field '%s' in command '%s' cannot be used as a Command Document Sequence"585 " type since it is not an array.") % (field_name, struct_name))586 def add_bad_non_object_as_doc_sequence_error(self, location, field_name):587 # type: (common.SourceLocation, str) -> None588 """Add an error about using a non-struct or BSON object for a doc sequence."""589 # pylint: disable=invalid-name590 self._add_error(location, ERROR_ID_NO_DOC_SEQUENCE_FOR_NON_OBJECT,591 ("Field '%s' cannot be used as a Command Document Sequence"592 " type since it is not a BSON object or struct.") % (field_name))593 def add_bad_command_name_duplicates_field(self, location, command_name):594 # type: (common.SourceLocation, str) -> None595 """Add an error about a command and field having the same name."""596 # pylint: disable=invalid-name597 self._add_error(location, ERROR_ID_COMMAND_DUPLICATES_FIELD,598 ("Command '%s' cannot have the same name as a field.") % (command_name))599 def add_bad_field_non_const_getter_in_immutable_struct_error(self, location, struct_name,600 field_name):601 # type: (common.SourceLocation, str, str) -> None602 """Add an error about marking a field with non_const_getter in an immutable struct."""603 # pylint: disable=invalid-name604 self._add_error(605 location, ERROR_ID_NON_CONST_GETTER_IN_IMMUTABLE_STRUCT,606 ("Cannot generate a non-const getter for field '%s' in struct '%s' since"607 " struct '%s' is marked as immutable.") % (field_name, struct_name, struct_name))608 def add_useless_variant_error(self, location):609 # type: (common.SourceLocation) -> None610 """Add an error about a variant with 0 or 1 variant types."""611 self._add_error(location, ERROR_ID_USELESS_VARIANT,612 ("Cannot declare a variant with only 0 or 1 variant types"))613 def add_variant_comparison_error(self, location):614 # type: (common.SourceLocation) -> None615 """Add an error about a struct with generate_comparison_operators and a variant field."""616 self._add_error(location, ERROR_ID_VARIANT_COMPARISON,617 ("generate_comparison_operators is not supported with variant types"))618 def add_variant_no_default_error(self, location, field_name):619 # type: (common.SourceLocation, str) -> None620 """Add an error about a variant having a default value."""621 self._add_error(622 location, ERROR_ID_VARIANT_NO_DEFAULT,623 "Field '%s' is a variant, and default values for variants aren't implemented yet" %624 (field_name))625 def add_variant_duplicate_types_error(self, location, field_name, type_name):626 # type: (common.SourceLocation, str, str) -> None627 """Add an error about a variant having more than one alternative of the same BSON type."""628 self._add_error(629 location, ERROR_ID_VARIANT_DUPLICATE_TYPES,630 ("Variant field '%s' has multiple alternatives with BSON type '%s', this is prohibited"631 " to avoid ambiguity while parsing BSON.") % (field_name, type_name))632 def add_variant_structs_error(self, location, field_name):633 # type: (common.SourceLocation, str) -> None634 """Add an error about a variant having more than one struct alternative."""635 self._add_error(location, ERROR_ID_VARIANT_STRUCTS,636 ("Variant field '%s' has multiple struct alternatives, this is prohibited"637 " to avoid ambiguity while parsing BSON subdocuments.") % (field_name, ))638 def add_variant_enum_error(self, location, field_name, type_name):639 # type: (common.SourceLocation, str, str) -> None640 """Add an error for a variant that can be an enum."""641 self._add_error(642 location, ERROR_ID_NO_VARIANT_ENUM,643 "Field '%s' cannot be a variant with an enum alternative type '%s'" % (field_name,644 type_name))645 def is_scalar_non_negative_int_node(self, node, node_name):646 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode], str) -> bool647 """Return True if this YAML node is a Scalar and a valid non-negative int."""648 if not self._is_node_type(node, node_name, "scalar"):649 return False650 try:651 value = int(node.value)652 if value < 0:653 self._add_node_error(654 node, ERROR_ID_IS_NODE_VALID_NON_NEGATIVE_INT,655 "Illegal negative integer value for '%s', expected 0 or positive integer." %656 (node_name))657 return False658 except ValueError as value_error:659 self._add_node_error(660 node, ERROR_ID_IS_NODE_VALID_INT,661 "Illegal integer value for '%s', message '%s'." % (node_name, value_error))662 return False663 return True664 def get_non_negative_int(self, node):665 # type: (Union[yaml.nodes.MappingNode, yaml.nodes.ScalarNode, yaml.nodes.SequenceNode]) -> int666 """Convert a scalar to an int."""667 assert self.is_scalar_non_negative_int_node(node, "unknown")668 return int(node.value)669 def add_duplicate_comparison_order_field_error(self, location, struct_name, comparison_order):670 # type: (common.SourceLocation, str, int) -> None671 """Add an error about fields having duplicate comparison_orders."""672 # pylint: disable=invalid-name673 self._add_error(674 location, ERROR_ID_IS_DUPLICATE_COMPARISON_ORDER,675 ("Struct '%s' cannot have two fields with the same comparison_order value '%d'.") %676 (struct_name, comparison_order))677 def add_extranous_command_type(self, location, command_name):678 # type: (common.SourceLocation, str) -> None679 """Add an error about commands having type when not needed."""680 # pylint: disable=invalid-name681 self._add_error(682 location, ERROR_ID_IS_COMMAND_TYPE_EXTRANEOUS,683 ("Command '%s' cannot have a 'type' property unless namespace equals 'type'.") %684 (command_name))685 def add_value_not_numeric_error(self, location, attrname, value):686 # type: (common.SourceLocation, str, str) -> None687 """Add an error about non-numeric value where number expected."""688 # pylint: disable=invalid-name689 self._add_error(690 location, ERROR_ID_VALUE_NOT_NUMERIC,691 ("'%s' requires a numeric value, but %s can not be cast") % (attrname, value))692 def add_server_parameter_invalid_attr(self, location, attrname, conflicts):693 # type: (common.SourceLocation, str, str) -> None694 """Add an error about invalid fields in a server parameter definition."""695 # pylint: disable=invalid-name696 self._add_error(697 location, ERROR_ID_SERVER_PARAMETER_INVALID_ATTR,698 ("'%s' attribute not permitted with '%s' server parameter") % (attrname, conflicts))699 def add_server_parameter_required_attr(self, location, attrname, required, dependant=None):700 # type: (common.SourceLocation, str, str, str) -> None701 """Add an error about missing fields in a server parameter definition."""702 # pylint: disable=invalid-name703 qualifier = '' if dependant is None else (" when using '%s' attribute" % (dependant))704 self._add_error(location, ERROR_ID_SERVER_PARAMETER_REQUIRED_ATTR,705 ("'%s' attribute required%s with '%s' server parameter") %706 (attrname, qualifier, required))707 def add_server_parameter_invalid_method_override(self, location, method):708 # type: (common.SourceLocation, str) -> None709 """Add an error about invalid method override in SCP method override."""710 # pylint: disable=invalid-name711 self._add_error(location, ERROR_ID_SERVER_PARAMETER_INVALID_METHOD_OVERRIDE,712 ("No such method to override in server parameter class: '%s'") % (method))713 def add_bad_source_specifier(self, location, value):714 # type: (common.SourceLocation, str) -> None715 """Add an error about invalid source specifier."""716 # pylint: disable=invalid-name717 self._add_error(location, ERROR_ID_BAD_SOURCE_SPECIFIER,718 ("'%s' is not a valid source specifier") % (value))719 def add_bad_duplicate_behavior(self, location, value):720 # type: (common.SourceLocation, str) -> None721 """Add an error about invalid duplicate behavior specifier."""722 # pylint: disable=invalid-name723 self._add_error(location, ERROR_ID_BAD_DUPLICATE_BEHAVIOR_SPECIFIER,724 ("'%s' is not a valid duplicate behavior specifier") % (value))725 def add_bad_numeric_range(self, location, attrname, value):726 # type: (common.SourceLocation, str, str) -> None727 """Add an error about invalid range specifier."""728 # pylint: disable=invalid-name729 self._add_error(location, ERROR_ID_BAD_NUMERIC_RANGE,730 ("'%s' is not a valid numeric range for '%s'") % (value, attrname))731 def add_missing_shortname_for_positional_arg(self, location):732 # type: (common.SourceLocation) -> None733 """Add an error about required short_name for positional args."""734 # pylint: disable=invalid-name735 self._add_error(location, ERROR_ID_MISSING_SHORTNAME_FOR_POSITIONAL,736 "Missing 'short_name' for positional arg")737 def add_invalid_short_name(self, location, name):738 # type: (common.SourceLocation, str) -> None739 """Add an error about invalid short names."""740 # pylint: disable=invalid-name741 self._add_error(location, ERROR_ID_INVALID_SHORT_NAME,742 ("Invalid 'short_name' value '%s'") % (name))743 def add_invalid_single_name(self, location, name):744 # type: (common.SourceLocation, str) -> None745 """Add an error about invalid single names."""746 # pylint: disable=invalid-name747 self._add_error(location, ERROR_ID_INVALID_SINGLE_NAME,748 ("Invalid 'single_name' value '%s'") % (name))749 def add_missing_short_name_with_single_name(self, location, name):750 # type: (common.SourceLocation, str) -> None751 """Add an error about missing required short name when using single name."""752 # pylint: disable=invalid-name753 self._add_error(location, ERROR_ID_MISSING_SHORT_NAME_WITH_SINGLE_NAME,754 ("Missing 'short_name' required with 'single_name' value '%s'") % (name))755 def add_feature_flag_default_true_missing_version(self, location):756 # type: (common.SourceLocation) -> None757 """Add an error about a default flag with a default value of true but no version."""758 # pylint: disable=invalid-name759 self._add_error(location, ERROR_ID_FEATURE_FLAG_DEFAULT_TRUE_MISSING_VERSION,760 ("Missing 'version' required for feature flag that defaults to true"))761 def add_feature_flag_default_false_has_version(self, location):762 # type: (common.SourceLocation) -> None763 """Add an error about a default flag with a default value of false but has a version."""764 # pylint: disable=invalid-name765 self._add_error(766 location, ERROR_ID_FEATURE_FLAG_DEFAULT_FALSE_HAS_VERSION,767 ("The 'version' attribute is not allowed for feature flag that defaults to false"))768 def add_reply_type_invalid_type(self, location, command_name, reply_type_name):769 # type: (common.SourceLocation, str, str) -> None770 """Add an error about a command whose reply_type refers to an unknown type."""771 # pylint: disable=invalid-name772 self._add_error(773 location, ERROR_ID_INVALID_REPLY_TYPE,774 ("Command '%s' has invalid reply_type '%s'" % (command_name, reply_type_name)))775 def add_unstable_no_api_version(self, location, command_name):776 # type: (common.SourceLocation, str) -> None777 """Add an error about a command with 'unstable' but no 'api_version'."""778 # pylint: disable=invalid-name779 self._add_error(780 location, ERROR_ID_UNSTABLE_NO_API_VERSION,781 ("Command '%s' specifies 'unstable' but has no 'api_version'" % (command_name, )))782 def add_missing_reply_type(self, location, command_name):783 # type: (common.SourceLocation, str) -> None784 """Add an error about a command with 'api_version' but no 'reply_type'."""785 # pylint: disable=invalid-name786 self._add_error(787 location, ERROR_ID_MISSING_REPLY_TYPE,788 ("Command '%s' has an 'api_version' but no 'reply_type'" % (command_name, )))789 def add_bad_field_always_serialize_not_optional(self, location, field_name):790 # type: (common.SourceLocation, str) -> None791 """Add an error about a field with 'always_serialize' but 'optional' isn't set to true."""792 # pylint: disable=invalid-name793 self._add_error(794 location, ERROR_ID_ILLEGAL_FIELD_ALWAYS_SERIALIZE_NOT_OPTIONAL,795 ("Field '%s' specifies 'always_serialize' but 'optional' isn't true.") % (field_name))796 def add_duplicate_command_name_and_alias(self, node):797 # type: (yaml.nodes.Node) -> None798 """Add an error about a command name and command alias having the same name."""799 # pylint: disable=invalid-name800 self._add_node_error(node, ERROR_ID_COMMAND_DUPLICATES_NAME_AND_ALIAS,801 "Duplicate command_name and command_alias found.")802 def add_unknown_enum_value(self, location, enum_name, enum_value):803 # type: (common.SourceLocation, str, str) -> None804 """Add an error about an unknown enum value."""805 # pylint: disable=invalid-name806 self._add_error(location, ERROR_ID_UNKOWN_ENUM_VALUE,807 "Cannot find enum value '%s' in enum '%s'." % (enum_value, enum_name))808 def add_either_check_or_privilege(self, location):809 # type: (common.SourceLocation) -> None810 """Add an error about specifing both a check and a privilege or neither."""811 # pylint: disable=invalid-name812 self._add_error(813 location, ERROR_ID_EITHER_CHECK_OR_PRIVILEGE,814 "Must specify either a 'check' and a 'privilege' in an access_check, not both.")815 def add_duplicate_action_types(self, location, name):816 # type: (common.SourceLocation, str) -> None817 """Add an error about specifying an action type twice in the same list."""818 # pylint: disable=invalid-name819 self._add_error(location, ERROR_ID_DUPLICATE_ACTION_TYPE,820 "Cannot specify an action_type '%s' more then once" % (name))821 def add_duplicate_access_check(self, location, name):822 # type: (common.SourceLocation, str) -> None823 """Add an error about specifying an access check twice in the same list."""824 # pylint: disable=invalid-name825 self._add_error(location, ERROR_ID_DUPLICATE_ACCESS_CHECK,826 "Cannot specify an access_check '%s' more then once" % (name))827 def add_duplicate_privilege(self, location, resource_pattern, action_type):828 # type: (common.SourceLocation, str, str) -> None829 """Add an error about specifying a privilege twice in the same list."""830 # pylint: disable=invalid-name831 self._add_error(832 location, ERROR_ID_DUPLICATE_PRIVILEGE,833 "Cannot specify the pair of resource_pattern '%s' and action_type '%s' more then once" %834 (resource_pattern, action_type))835 def add_empty_access_check(self, location):836 # type: (common.SourceLocation) -> None837 """Add an error about specifying one of ignore, none, simple or complex in an access check."""838 # pylint: disable=invalid-name839 self._add_error(840 location, ERROR_ID_EMPTY_ACCESS_CHECK,841 "Must one and only one of either a 'ignore', 'none', 'simple', or 'complex' in an access_check."842 )843 def add_missing_access_check(self, location, name):844 # type: (common.SourceLocation, str) -> None845 """Add an error about a missing access_check when api_version != ""."""846 # pylint: disable=invalid-name847 self._add_error(location, ERROR_ID_MISSING_ACCESS_CHECK,848 'Command "%s" has api_version != "" but is missing access_check.' % (name))849def _assert_unique_error_messages():850 # type: () -> None851 """Assert that error codes are unique."""852 error_ids = []853 for module_member in inspect.getmembers(sys.modules[__name__]):854 if module_member[0].startswith("ERROR_ID"):855 error_ids.append(module_member[1])856 error_ids_set = set(error_ids)857 if len(error_ids) != len(error_ids_set):858 raise IDLError("IDL error codes prefixed with ERROR_ID are not unique.")859# On file import, check the error messages are unique...
forms.py
Source:forms.py
...30 self.section_ids = []31 self.page_ids = []32 self._errors = None33 self.full_clean()34 def _add_error(self, error_type, error):35 if self._errors['result'] is None:36 self._errors['result'] = error_type37 if (self._errors['result'] == 'SCHEMA ERROR' and38 error_type == "FORMAT ERROR"):39 self._errors['errors'] = []40 elif (self._errors['result'] == 'FORMAT ERROR' and41 error_type == "SCHEMA ERROR"):42 return43 if isinstance(error, list):44 self._errors['errors'].extend(error)45 elif isinstance(error, dict):46 self._errors['errors'].append(error)47 def _validate_schema_format(self):48 """49 Checks the outer structure of the schema and makes sure all the50 expected keys are present51 """52 if not isinstance(self.schema, dict):53 raise FormatError(54 "Expected schema to be a dictionary, got '{0}'".format(55 type(self.schema).__name__))56 schema_keys = list(self.MINIMUM_SCHEMA_KEYS)57 errors = []58 for key in self.schema:59 try:60 schema_keys.remove(key)61 except ValueError:62 errors.append(63 "Key '{0}' either doesn't belong in the schema or is "64 "duplicated".format(key))65 for key in schema_keys:66 errors.append(67 "Required key '{0}' is missing from the schema".format(key))68 if 'version' in self.schema:69 try:70 int(self.schema['version'])71 except ValueError:72 errors.append("Invalid version: '{0}' is not a number.".format(73 self.schema['version']))74 if 'fields' in self.schema:75 if not isinstance(self.schema['fields'], list):76 errors.append("'fields' property must be a list.")77 if 'sections' in self.schema:78 if not isinstance(self.schema['sections'], list):79 errors.append("'sections' property must be a list.")80 if 'pages' in self.schema:81 if not isinstance(self.schema['pages'], list):82 errors.append("'pages' property must be a list.")83 if errors:84 raise FormatError(errors)85 def _validate_fields(self):86 """ Checks that the fields are valid in the schema """87 fields = self.schema['fields']88 self.fields = {}89 for field in fields:90 errors = False91 error = {92 'type': 'FIELD',93 'id': '',94 'message': ''95 }96 try:97 error['id'] = field['id']98 except KeyError:99 raise FormatError("A field is missing the 'id' property.")100 if 'type' in field:101 try:102 field_class = FieldFactory.get_class(field['type'])103 except KeyError:104 errors = True105 error['message'] = "Invalid field type: '{0}'".format(106 field['type'])107 self._add_error("SCHEMA ERROR", copy(error))108 continue109 except Exception as e:110 error['message'] = \111 "Invalid field: '{0}'".format(e.__str__())112 self._add_error("SCHEMA ERROR", copy(error))113 continue114 else:115 try:116 Field.validate_schema(field)117 except FieldError as e:118 for field_error in e.error_list:119 error['message'] = repr(field_error)120 self._add_error("SCHEMA ERROR", copy(error))121 continue122 try:123 field_obj = field_class(field)124 except FieldError as e:125 errors = True126 for field_error in e.error_list:127 error['message'] = repr(field_error)128 self._add_error("SCHEMA ERROR", copy(error))129 if not errors:130 if field['id'] not in self.field_ids:131 self.field_ids.append(field['id'])132 self.fields.update({field['id'].__str__(): field_obj})133 else:134 error['message'] = (135 "Field '{0}' is defined more than once.".format(136 field['id']))137 self._add_error("SCHEMA ERROR", copy(error))138 def _validate_sections(self):139 """140 Checks that the sections are valid in the schema.141 Also checks that fields are used in only one section.142 """143 sections = self.schema['sections']144 self.sections = {}145 # Make local copy of the available fields146 field_ids = list(self.field_ids)147 for section in sections:148 field_list = {}149 section_keys = list(self.MINIMUM_SECTION_KEYS)150 optional_section_keys = list(self.OPTIONAL_SECTION_KEYS)151 error = {152 'id': '',153 'type': 'SECTION',154 'message': ''155 }156 try:157 error['id'] = section['id']158 except KeyError:159 raise FormatError("A section is missing the 'id' property.")160 if section['id'] not in self.section_ids:161 self.section_ids.append(section['id'])162 else:163 error['message'] = "Section '{0}' is defined more than once." \164 .format(section['id'])165 self._add_error('SCHEMA ERROR', copy(error))166 for key in section:167 if key in section_keys:168 section_keys.remove(key)169 else:170 try:171 optional_section_keys.remove(key)172 except ValueError:173 error['message'] = "Key '{0}' either doesn't belong" \174 " in the section schema or is duplicated" \175 .format(key)176 self._add_error('SCHEMA ERROR', copy(error))177 for key in section_keys:178 error['message'] = \179 "Required key '{0}' is missing from the section".format(180 key)181 self._add_error('SCHEMA ERROR', copy(error))182 try:183 section_fields = section['fields']184 for field in section_fields:185 try:186 field_ids.remove(field)187 except ValueError:188 error['message'] = \189 ("Field '{0}' either isn't valid or was already "190 "included in a previous section".format(field))191 self._add_error('SCHEMA ERROR', copy(error))192 continue193 field_list.update(194 {field.__str__(): self.fields[field.__str__()]})195 except KeyError: # Only to avoid exception.196 # We continue because it was already checked.197 continue198 new_section = Section(section)199 new_section.fields = field_list200 self.sections.update({section['id'].__str__(): new_section})201 def _validate_pages(self):202 """203 Checks that the pages are valid in the schema.204 Also checks that sections are used in only one page.205 """206 pages = self.schema['pages']207 section_ids = list(self.section_ids)208 for page in pages:209 section_list = {}210 page_keys = list(self.MINIMUM_PAGE_KEYS)211 optional_page_keys = list(self.OPTIONAL_PAGE_KEYS)212 error = {213 'id': '',214 'type': 'PAGE',215 'message': ''216 }217 try:218 error['id'] = page['id']219 except KeyError:220 raise FormatError("A page is missing the 'id' property.")221 if page['id'] not in self.page_ids:222 self.page_ids.append(page['id'])223 else:224 error['message'] = "Page '{0}' is defined more than once." \225 .format(page['id'])226 self._add_error('SCHEMA ERROR', copy(error))227 for key in page:228 if key in page_keys:229 page_keys.remove(key)230 else:231 try:232 optional_page_keys.remove(key)233 except ValueError:234 error['message'] = (235 "Key '{0}' either doesn't belong in the page "236 "schema or is duplicated".format(key))237 self._add_error('SCHEMA ERROR', copy(error))238 for key in page_keys:239 error['message'] = \240 "Required key '{0}' is missing from the page".format(241 key)242 self._add_error('SCHEMA ERROR', copy(error))243 try:244 page_sections = page['sections']245 for section in page_sections:246 try:247 section_ids.remove(section)248 except ValueError:249 error['message'] = (250 "Section '{0}' either isn't valid or was already "251 "included in a previous page".format(section))252 self._add_error('SCHEMA ERROR', copy(error))253 continue254 section_list.update(255 {section.__str__(): self.sections[section.__str__()]})256 except KeyError:257 pass258 new_page = Page(page)259 new_page.sections = section_list260 self.pages.update({page['id'].__str__(): new_page})261 def _check_item_conditionals(self, item_type):262 error_type = {263 'fields': 'FIELD',264 'sections': 'SECTION',265 'pages': 'PAGE'266 }267 for item in self.schema[item_type]:268 if 'conditionals' in item:269 conditionals = item['conditionals']270 for condition in conditionals:271 error = {272 'id': item['id'],273 'type': error_type[item_type],274 'message': ''275 }276 try:277 condition_list, compound = Condition.check_condition(278 condition)279 except ConditionError as e:280 for condition_error in e.error_list:281 error['message'] = repr(condition_error)282 self._add_error("SCHEMA ERROR", copy(error))283 continue284 for individual_condition in condition_list:285 try:286 condition_class = ConditionFactory.get_class(287 individual_condition['type'])288 except KeyError:289 error['message'] = \290 "Invalid condition type: '{0}'".format(291 individual_condition['type'])292 self._add_error("SCHEMA ERROR", copy(error))293 continue294 except Exception as e:295 error['message'] = \296 "Invalid condition: '{0}'".format(e.__str__())297 self._add_error("SCHEMA ERROR", copy(error))298 continue299 try:300 condition_class.validate_schema(301 individual_condition, compound)302 condition_field = self.fields[303 individual_condition['field'].__str__()]304 condition_class.field_allows_condition(305 condition_field)306 except ConditionError as e:307 for condition_error in e.error_list:308 error['message'] = repr(condition_error)309 self._add_error("SCHEMA ERROR", copy(error))310 except KeyError:311 error['message'] = (312 "Condition depends on invalid or undefined "313 "field '{0}'".format(314 individual_condition['field']))315 self._add_error("SCHEMA ERROR", copy(error))316 def _check_item_mappings(self, item_type):317 if item_type == 'fields':318 error_type = 'FIELD'319 ids = 'field_ids'320 maps_to = 'section'321 else:322 error_type = 'SECTION'323 ids = 'section_ids'324 maps_to = 'page'325 error = {326 'id': '',327 'type': error_type,328 'message': ''329 }330 try:331 form_item = getattr(self, maps_to + 's')332 except AttributeError as ex:333 raise Exception('Unexpected property access in Form: {0}'.format(334 ex.__str__()))335 used_ids = set()336 for item in form_item.values():337 used_ids = used_ids.union(set(getattr(item, item_type).keys()))338 all_items = set(map(str, getattr(self, ids)))339 diff = set(all_items).difference(used_ids)340 if diff:341 for d in diff:342 error['id'] = d343 error['message'] = (344 "Item has not been mapped to any {0}".format(maps_to))345 self._add_error("SCHEMA ERROR", copy(error))346 def full_clean(self):347 """348 Performs a full clean of all the Form data and populates self._errors349 and self.cleaned_data350 """351 self._errors = {352 'result': None,353 'errors': []354 }355 try:356 self._validate_schema_format()357 self._validate_fields()358 self._validate_sections()359 self._validate_pages()360 self._check_item_conditionals('fields')361 self._check_item_conditionals('sections')362 self._check_item_conditionals('pages')363 self._check_item_mappings('fields'),364 self._check_item_mappings('sections'),365 except FormatError as e:366 self._add_error('FORMAT ERROR', e.error_list)367 @property368 def errors(self):369 """370 Inspired by Django's error management. If the Form has errors we return371 them.372 """373 return self._errors374 def check_answers(self, answers):375 if not isinstance(answers, dict):376 raise FormatError(377 "Expected answers to be a 'dictionary', got {0} instead"378 .format(type(answers).__name__))379 380 answer_keys = answers.keys()...
dresser.py
Source:dresser.py
...232 # process the line233 f = self.grammar[key]234 f(words)235 else:236 self._add_error(l, 'Unable to parse this line')237238 return True239240 def build_grammar(self):241 self.grammar = {}242 grammar = self.grammar243244 grammar['SMBPath'] = self.smb_path245 grammar['SMBModel'] = self.smb_model246247 grammar['Class'] = self.klass 248 grammar['BranchPattern'] = self.branch_pattern 249 grammar['LeafClass'] = self.leaf_klass 250 grammar['FlowerClass'] = self.flower_klass 251 grammar['FruitClass'] = self.fruit_klass 252253254 grammar['LengthUnit'] = self.length_unit255 grammar['DiameterUnit'] = self.diameter_unit256 grammar['AlphaUnit'] = self.alpha_unit257 grammar['AzimuthUnit'] = self.azimuth_unit258259 grammar['DefaultEdge'] = self.default_edge260261 grammar['DefaultAlpha'] = self.default_alpha262 grammar['DefaultTeta'] = self.default_teta263 grammar['DefaultPhi'] = self.default_phi264 grammar['DefaultPsi'] = self.default_psi 265266 grammar['DefaultTrunkCategory'] =self.default_trunk_category267 grammar['DefaultCategory'] = self.default_category268269 grammar['Alpha'] =self.alpha270 grammar['Phyllotaxy'] = self.phyllotaxy271272 grammar['MinLength'] = self.min_length273 grammar['MinTopDiameter'] = self.min_top_diameter274 grammar['MinBottomDiameter'] = self.min_bottom_diameter275276277 grammar['LeafLength'] = self.leaf_length278 grammar['LeafTopDiameter'] = self.leaf_topdia279 grammar['LeafBottomDiameter'] = self.leaf_botdia280 grammar['LeafAlpha'] = self.leaf_alpha281 grammar['LeafBeta'] = self.leaf_beta282283 grammar['FruitLength'] = self.fruit_length284 grammar['FruitTopDiameter'] = self.fruit_topdia285 grammar['FruitBottomDiameter'] = self.fruit_botdia286 grammar['FruitAlpha'] = self.fruit_alpha287 grammar['FruitBeta'] = self.fruit_beta288289 grammar['FlowerLength'] = self.flower_length290 grammar['FlowerTopDiameter'] = self.flower_topdia291 grammar['FlowerBottomDiameter'] = self.flower_botdia292 grammar['FlowerAlpha'] = self.flower_alpha293 grammar['FlowerBeta'] = self.flower_beta294295 grammar['DefaultTrunkCategory'] = self.def_trunk_cat296 grammar['DefaultDistance'] = self.def_dist297 grammar['NbPlantsPerLine'] = self.nbplants_line298299 grammar['MediumThreshold'] = self.med_thres300 grammar['MinThreshold'] = self.min_thres301 grammar['MaxThreshold'] = self.max_thres302303 def _add_error(self, l, note=''):304 msg = 'ERROR (%d): %s'%(self.line, ' '.join(l))305 if note:306 msg = '\n'.join([msg, ' --> %s'%note])307 self.errors.append(msg)308309 def smb_path(self, l):310 "SMBPath = path"311 p = l[2]312 if os.path.exists(p):313 self.smbpath = p314 else:315 self._add_error(l, 'Invalid path')316317 def smb_model(self, l):318 "SMBModel node = nentn105"319 if not self.smbpath:320 return321 name = l[1]322 file = l[3]+'.smb'323 absfile = os.path.join(self.smbpath, file)324 if os.path.exists(os.path.join(self.smbpath, file)):325 geom = AmapSymbol(absfile)326 if geom.isValid():327 self.dresser.symbols[name] = geom328 else:329 self._add_error(l, 'Impossible to locate symbol file')330331 332 def klass (self, l):333 "Class B = node"334 class_name = l[1]335 smb_name = l[3]336 d = self.dresser337 if smb_name in d.symbols:338 d.classes[class_name] = smb_name339 else:340 self._add_error(l, '%s is not defined'%smb_name)341342 def branch_pattern (self, l):343 "BranchPattern apple_forms = file.crv"344 self._add_error(l, 'BranchPattern is not yet implemented')345346 def leaf_klass (self, l):347 "LeafClass = Z"348 name = l[2]349 d = self.dresser350 if name in d.symbols:351 d.leaf_class = name352 else:353 self._add_error(l, '%s is not defined'%name)354 355 def flower_klass(self, l):356 "FlowerClass = Z"357 name = l[2]358 d = self.dresser359 if name in d.symbols:360 d.flower_class = name361 else:362 self._add_error(l, '%s is not defined'%name)363364 def fruit_klass (self, l):365 "FruitClass = Z"366 name = l[2]367 d = self.dresser368 if name in d.symbols:369 d.fruit_class = name370 else:371 self._add_error(l, '%s is not defined'%name)372373 def length_unit(self, l):374 "LengthUnit = 1"375 unit = l[2]376 try:377 self.dresser.length_unit = float(unit)378 except:379 self._add_error(l, 'Bad unit format')380 381382 def diameter_unit(self, l):383 "DiameterUnit = 1"384 unit = l[2]385 try:386 self.dresser.diameter_unit = float(unit)387 except:388 self._add_error(l, 'Bad unit format')389390 def alpha_unit(self, l):391 "AlphaUnit = 1"392 unit = l[2]393 try:394 self.dresser.alpha_unit = float(unit)395 except:396 self._add_error(l, 'Bad unit format')397398 def azimuth_unit(self, l):399 "AzimuthUnit = 1"400 unit = l[2]401 try:402 self.dresser.azimuth_unit = float(unit)403 except:404 self._add_error(l, 'Bad unit format')405406407 def default_edge(self, l):408 "DefaultEdge = PLUS | LESS"409 edge_type = l[2]410 if edge_type in ['PLUS', 'LESS']:411 self.default_edge = edge_type412 else:413 self._add_error(l, 'Bad edge format')414415 def default_alpha(self, l):416 angle = l[2]417 try:418 self.dresser.default_alpha = float(angle)419 except:420 self._add_error(l, 'Bad angle format')421422 def default_teta(self, l):423 angle = l[2]424 try:425 self.dresser.default_teta= float(angle)426 except:427 self._add_error(l, 'Bad angle format')428429 def default_phi(self, l):430 angle = l[2]431 try:432 self.dresser.default_phi= float(angle)433 except:434 self._add_error(l, 'Bad angle format')435436 def default_psi (self, l):437 angle = l[2]438 try:439 self.dresser.default_psi= float(angle)440 except:441 self._add_error(l, 'Bad angle format')442443444 def default_trunk_category(self, l):445 pass446447 def default_category(self, l):448 pass449450451 def alpha(self, l):452 "Alpha = Absolute | Relative" 453 _alpha = l[2]454 if _alpha in ['Absolute', 'Relative']:455 self.dresser.alpha = _alpha456 else:457 self._add_error(l, 'Should be Absolute or Relative ')458 459460 def phyllotaxy(self, l):461 angle = l[2]462 try:463 self.dresser.phyllotaxy= float(angle)464 except:465 self._add_error(l)466 467468 def min_length(self, l):469 "MinLenght A = 10"470 name = l[1]471 value = l[3]472 self.dresser.min_length[name] = float(value)473474 def min_top_diameter(self, l):475 "MinTopDiameter A = 10"476 name = l[1]477 value = l[3]478 self.dresser.min_topdia[name] = float(value)479480 def min_bottom_diameter(self, l):481 "MinBottomDiameter A = 10"482 name = l[1]483 value = l[3]484 self.dresser.min_botdia[name] = float(value)485486 def leaf_length(self, l):487 "LeafLength = 100"488 value = l[2]489 try:490 self.dresser.leaf_length= float(value)491 except:492 self._add_error(l, 'Bad format')493494 def leaf_topdia(self, l):495 value = l[2]496 try:497 self.dresser.leaf_topdia= float(value)498 except:499 self._add_error(l, 'Bad format')500501 def leaf_botdia(self, l):502 value = l[2]503 try:504 self.dresser.leaf_botdia= float(value)505 except:506 self._add_error(l, 'Bad format')507508 def leaf_alpha(self, l):509 value = l[2]510 try:511 self.dresser.leaf_alpha= float(value)512 except:513 self._add_error(l, 'Bad format')514515 def leaf_beta(self, l):516 value = l[2]517 try:518 self.dresser.leaf_beta= float(value)519 except:520 self._add_error(l, 'Bad format')521522 def fruit_length(self, l):523 "LeafLength = 100"524 value = l[2]525 try:526 self.dresser.fruit_length= float(value)527 except:528 self._add_error(l, 'Bad format')529530 def fruit_topdia(self, l):531 value = l[2]532 try:533 self.dresser.fruit_topdia= float(value)534 except:535 self._add_error(l, 'Bad format')536537 def fruit_botdia(self, l):538 value = l[2]539 try:540 self.dresser.fruit_botdia= float(value)541 except:542 self._add_error(l, 'Bad format')543544 def fruit_alpha(self, l):545 value = l[2]546 try:547 self.dresser.fruit_alpha= float(value)548 except:549 self._add_error(l, 'Bad format')550551 def fruit_beta(self, l):552 value = l[2]553 try:554 self.dresser.fruit_beta= float(value)555 except:556 self._add_error(l, 'Bad format')557558 def flower_length(self, l):559 "LeafLength = 100"560 value = l[2]561 try:562 self.dresser.flower_length= float(value)563 except:564 self._add_error(l, 'Bad format')565566 def flower_topdia(self, l):567 value = l[2]568 try:569 self.dresser.flower_topdia= float(value)570 except:571 self._add_error(l, 'Bad format')572573 def flower_botdia(self, l):574 value = l[2]575 try:576 self.dresser.flower_botdia= float(value)577 except:578 self._add_error(l, 'Bad format')579580 def flower_alpha(self, l):581 value = l[2]582 try:583 self.dresser.flower_alpha= float(value)584 except:585 self._add_error(l, 'Bad format')586587 def flower_beta(self, l):588 value = l[2]589 try:590 self.dresser.flower_beta= float(value)591 except:592 self._add_error(l, 'Bad format')593594 def def_trunk_cat(self, l):595 pass596597 def def_dist(self, l):598 pass599600 def nbplants_line(self, l):601 pass602603604 def med_thres(self, l):605 pass606
...
validators.py
Source:validators.py
...9 self._clear_data()10 self._validate_fields()11 def _validate_fields(self):12 raise NotImplementedError('Has to be implemented')13 def _add_error(self, field_name, error_message):14 self._fields[field_name] = error_message15 @property16 def has_errors(self):17 if self._fields:18 return True19 return False20 @property21 def errors(self):22 return self._fields23 def _clear_data(self):24 for key in self._data:25 self._data[key] = str(self._data[key]).replace(' ', '')26class OrderFormValidator(Validator):27 def _validate_fields(self):28 self._validate_full_name()29 self._validate_phone()30 self._validate_email()31 return None32 def _validate_full_name(self):33 FIELD_NAME = 'full_name'34 name = self._data[FIELD_NAME]35 if not name:36 self._add_error(FIELD_NAME, 'ФÐРне Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')37 def _validate_phone(self):38 FIELD_NAME = 'phone'39 phone = self._data[FIELD_NAME]40 if not phone:41 self._add_error(FIELD_NAME, 'ÐÐ¾Ð¼ÐµÑ ÑелеÑона не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')42 LENGTH = 1143 FIRST_NUMS = (7, 8)44 clear_phone = re.sub('[^\d]', '', phone)45 if len(clear_phone) != LENGTH:46 self._add_error(FIELD_NAME, 'ÐевеÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° номеÑа ÑелеÑона')47 return48 elif int(clear_phone[0]) not in FIRST_NUMS:49 self._add_error(FIELD_NAME, 'ТелеÑон не пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÑоÑÑийÑÐºÐ¾Ð¼Ñ Ð¿ÑовайдеÑÑ')50 return51 return True52 def _validate_email(self):53 FIELD_NAME = 'email'54 email = self._data[FIELD_NAME]55 if not email:56 self._add_error(FIELD_NAME, 'ÐдÑÐµÑ Ñл. поÑÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')57 EMAIL_REGEX = '^(\w|\.|\_|\-)+[@](\w|\_|\-|\.)+[.]\w{2,3}$'58 if not re.search(EMAIL_REGEX, email):59 self._add_error(FIELD_NAME, 'ÐевеÑнÑй адÑÐµÑ Ñл. поÑÑÑ')60class UserRegistrationValidator(Validator):61 62 def _validate_fields(self):63 self._validate_username()64 self._validate_email()65 self._validate_passwords()66 def _validate_username(self):67 FIELD_NAME = 'username'68 username = self._data.get(FIELD_NAME, None)69 if not username:70 self._add_error(FIELD_NAME, 'ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')71 return72 users = User.objects.filter(username=username)73 if users.exists():74 self._add_error(FIELD_NAME, 'ÐолÑзоваÑÐµÐ»Ñ Ñ Ñаким именем Ñже ÑÑÑеÑÑвÑеÑ')75 return76 if len(username) < 4:77 self._add_error(FIELD_NAME, 'ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÐ½ÑÑе 5 Ñимволов')78 79 def _validate_email(self):80 FIELD_NAME = 'email'81 email = self._data[FIELD_NAME]82 if not email:83 self._add_error(FIELD_NAME, 'ÐдÑÐµÑ Ñл. поÑÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')84 EMAIL_REGEX = '^(\w|\.|\_|\-)+[@](\w|\_|\-|\.)+[.]\w{2,3}$'85 if not re.search(EMAIL_REGEX, email):86 self._add_error(FIELD_NAME, 'ÐевеÑнÑй адÑÐµÑ Ñл. поÑÑÑ')87 def _validate_passwords(self):88 FIELD_NAME = 'password'89 FIELD_NAME_REPEAT = 'password_confirmation'90 pswd = self._data.get(FIELD_NAME, None)91 pswd_confirm = self._data.get(FIELD_NAME_REPEAT, None)92 if not pswd:93 self._add_error(FIELD_NAME, 'ÐаÑÐ¾Ð»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')94 return95 if not pswd_confirm:96 self._add_error(FIELD_NAME_REPEAT, 'ÐовÑоÑиÑе паÑолÑ')97 return98 if pswd != pswd_confirm:99 self._add_error(FIELD_NAME, 'ÐаÑоли не ÑовпадаÑÑ')100 self._add_error(FIELD_NAME_REPEAT, 'ÐаÑоли не ÑовпадаÑÑ')101class UserLoginValidator(Validator):102 def _validate_fields(self):103 self._vadlidate_username()104 self._validate_password()105 def _vadlidate_username(self):106 FIELD_NAME = 'username'107 username = self._data.get(FIELD_NAME, None)108 if not username:109 self._add_error(FIELD_NAME, 'ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')110 return111 user_list = User.objects.filter(username=username)112 if not user_list.exists():113 self._add_error(FIELD_NAME, 'ÐолÑзоваÑÐµÐ»Ñ Ñ ÑказаннÑм логином не ÑÑÑеÑÑвÑеÑ')114 if user_list.count() > 1:115 self._add_error(FIELD_NAME, 'ÐеÑколÑко полÑзоваÑелей Ñ ÑказаннÑм логином, ÑвÑжиÑеÑÑ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑией')116 def _validate_password(self):117 FIELD_NAME = 'password'118 pswd = self._data.get(FIELD_NAME, None)119 if not pswd:120 self._add_error(FIELD_NAME, 'ÐаÑÐ¾Ð»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')121 return122 username = self._data.get('username', '')123 user = authenticate(username=username, password=pswd)124 if not user:125 self._add_error(FIELD_NAME, 'ÐÑовеÑÑÑе введеннÑе даннÑе')126class UserChangeDataValidator(Validator):127 128 def __init__(self, post_data, user):129 self._user = user130 super().__init__(post_data)131 def _validate_fields(self):132 self._validate_username()133 self._validate_email()134 def _validate_username(self):135 FIELD_NAME = 'username'136 username = self._data.get(FIELD_NAME, None)137 if not username:138 self._add_error(FIELD_NAME, 'ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')139 return140 user_list = User.objects.filter(username=username).exclude(id=self._user.id)141 if user_list.exists():142 self._add_error(FIELD_NAME, 'ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ñже занÑÑо')143 def _validate_email(self):144 FIELD_NAME = 'email'145 email = self._data.get(FIELD_NAME, None)146 if not email:147 self._add_error(FIELD_NAME, 'Ðл. поÑÑа не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑой')148 return149 user_list = User.objects.filter(email=email).exclude(id=self._user.id)150 if user_list.exists():151 self._add_error(FIELD_NAME, 'ÐдÑÐµÑ Ñл. поÑÑÑ Ñже занÑÑ')152class UserChangePasswordValidator(Validator):153 def __init__(self, post_data, user):154 self._user = user155 super().__init__(post_data)156 def _validate_fields(self):157 self._validate_old_password()158 self._validate_passwords()159 def _validate_old_password(self):160 FIELD_NAME = 'old_password'161 old_pswd = self._data.get(FIELD_NAME, '')162 old_pswd = old_pswd.replace(' ', '')163 if not self._user.check_password(old_pswd):164 self._add_error(FIELD_NAME, 'ÐевеÑнÑй ÑÑаÑÑй паÑолÑ')165 def _validate_passwords(self):166 FIELD_NAME = 'password'167 FIELD_NAME_REPEAT = 'password_confirmation'168 pswd = self._data.get(FIELD_NAME, None)169 pswd_confirm = self._data.get(FIELD_NAME_REPEAT, None)170 if not pswd:171 self._add_error(FIELD_NAME, 'ÐаÑÐ¾Ð»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑÑм')172 return173 if not pswd_confirm:174 self._add_error(FIELD_NAME_REPEAT, 'ÐовÑоÑиÑе паÑолÑ')175 return176 if pswd != pswd_confirm:177 self._add_error(FIELD_NAME, 'ÐаÑоли не ÑовпадаÑÑ')...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!