def validate(self) -> None: """Validates properties of the MachineTranslation. Raises: ValidationError. One or more attributes of the MachineTranslation are invalid. """ # TODO(#12341): Tidy up this logic once we have a canonical list of # language codes. if not utils.is_supported_audio_language_code( self.source_language_code ) and not utils.is_valid_language_code(self.source_language_code): raise utils.ValidationError('Invalid source language code: %s' % self.source_language_code) # TODO(#12341): Tidy up this logic once we have a canonical list of # language codes. if not utils.is_supported_audio_language_code( self.target_language_code ) and not utils.is_valid_language_code(self.target_language_code): raise utils.ValidationError('Invalid target language code: %s' % self.target_language_code) if self.source_language_code == self.target_language_code: raise utils.ValidationError( ('Expected source_language_code to be different from ' 'target_language_code: "%s" = "%s"') % (self.source_language_code, self.target_language_code))
def translate( self, text: str, source_language_code: str, target_language_code: str ) -> str: """Returns the saved expected response for a given input. If no response exists for the given input, returns a default response. Args: text: str. The text to be translated. source_language_code: str. An allowlisted language code. target_language_code: str. An allowlisted language code. Raises: ValueError. Invalid source language code. ValueError. Invalid target language code. Returns: str. The translated text. """ if not utils.is_valid_language_code(source_language_code): raise ValueError( 'Invalid source language code: %s' % source_language_code) if not utils.is_valid_language_code(target_language_code): raise ValueError( 'Invalid target language code: %s' % target_language_code) key = (source_language_code, target_language_code, text) return self.expected_responses.get(key, self.DEFAULT_RESPONSE)
def is_valid_audio_language_code(obj: str) -> bool: """Checks if the given obj (a string) represents a valid language code. Args: obj: str. The language code to verify. Returns: bool. Whether the given object is a valid audio language code. """ return utils.is_valid_language_code(obj)
def test_is_valid_language_code(self) -> None: self.assertTrue(utils.is_valid_language_code('en')) self.assertFalse(utils.is_valid_language_code('unknown'))
def validate(self, strict=True): """Validates all properties of this collection and its constituents. Raises: ValidationError. One or more attributes of the Collection are not valid. """ # NOTE TO DEVELOPERS: Please ensure that this validation logic is the # same as that in the frontend CollectionValidatorService. if not isinstance(self.title, str): raise utils.ValidationError( 'Expected title to be a string, received %s' % self.title) utils.require_valid_name( self.title, 'the collection title', allow_empty=True) if not isinstance(self.category, str): raise utils.ValidationError( 'Expected category to be a string, received %s' % self.category) utils.require_valid_name( self.category, 'the collection category', allow_empty=True) if not isinstance(self.objective, str): raise utils.ValidationError( 'Expected objective to be a string, received %s' % self.objective) if not isinstance(self.language_code, str): raise utils.ValidationError( 'Expected language code to be a string, received %s' % self.language_code) if not self.language_code: raise utils.ValidationError( 'A language must be specified (in the \'Settings\' tab).') if not utils.is_valid_language_code(self.language_code): raise utils.ValidationError( 'Invalid language code: %s' % self.language_code) if not isinstance(self.tags, list): raise utils.ValidationError( 'Expected tags to be a list, received %s' % self.tags) if len(set(self.tags)) < len(self.tags): raise utils.ValidationError( 'Expected tags to be unique, but found duplicates') for tag in self.tags: if not isinstance(tag, str): raise utils.ValidationError( 'Expected each tag to be a string, received \'%s\'' % tag) if not tag: raise utils.ValidationError('Tags should be non-empty.') if not re.match(constants.TAG_REGEX, tag): raise utils.ValidationError( 'Tags should only contain lowercase letters and spaces, ' 'received \'%s\'' % tag) if (tag[0] not in string.ascii_lowercase or tag[-1] not in string.ascii_lowercase): raise utils.ValidationError( 'Tags should not start or end with whitespace, received ' ' \'%s\'' % tag) if re.search(r'\s\s+', tag): raise utils.ValidationError( 'Adjacent whitespace in tags should be collapsed, ' 'received \'%s\'' % tag) if not isinstance(self.schema_version, int): raise utils.ValidationError( 'Expected schema version to be an integer, received %s' % self.schema_version) if self.schema_version != feconf.CURRENT_COLLECTION_SCHEMA_VERSION: raise utils.ValidationError( 'Expected schema version to be %s, received %s' % ( feconf.CURRENT_COLLECTION_SCHEMA_VERSION, self.schema_version)) if not isinstance(self.nodes, list): raise utils.ValidationError( 'Expected nodes to be a list, received %s' % self.nodes) all_exp_ids = self.exploration_ids if len(set(all_exp_ids)) != len(all_exp_ids): raise utils.ValidationError( 'There are explorations referenced in the collection more ' 'than once.') # Validate all collection nodes. for node in self.nodes: node.validate() if strict: if not self.title: raise utils.ValidationError( 'A title must be specified for the collection.') if not self.objective: raise utils.ValidationError( 'An objective must be specified for the collection.') if not self.category: raise utils.ValidationError( 'A category must be specified for the collection.') if not self.nodes: raise utils.ValidationError( 'Expected to have at least 1 exploration in the ' 'collection.')
def validate(self): """Validates various properties of the CollectionSummary. Raises: ValidationError. One or more attributes of the CollectionSummary are invalid. """ if not isinstance(self.title, str): raise utils.ValidationError( 'Expected title to be a string, received %s' % self.title) utils.require_valid_name( self.title, 'the collection title', allow_empty=True) if not isinstance(self.category, str): raise utils.ValidationError( 'Expected category to be a string, received %s' % self.category) utils.require_valid_name( self.category, 'the collection category', allow_empty=True) if not isinstance(self.objective, str): raise utils.ValidationError( 'Expected objective to be a string, received %s' % self.objective) if not self.language_code: raise utils.ValidationError( 'A language must be specified (in the \'Settings\' tab).') if not isinstance(self.language_code, str): raise utils.ValidationError( 'Expected language code to be a string, received %s' % self.language_code) if not utils.is_valid_language_code(self.language_code): raise utils.ValidationError( 'Invalid language code: %s' % self.language_code) if not isinstance(self.tags, list): raise utils.ValidationError( 'Expected tags to be a list, received %s' % self.tags) for tag in self.tags: if not isinstance(tag, str): raise utils.ValidationError( 'Expected each tag to be a string, received \'%s\'' % tag) if not tag: raise utils.ValidationError('Tags should be non-empty.') if not re.match(constants.TAG_REGEX, tag): raise utils.ValidationError( 'Tags should only contain lowercase letters and spaces, ' 'received \'%s\'' % tag) if (tag[0] not in string.ascii_lowercase or tag[-1] not in string.ascii_lowercase): raise utils.ValidationError( 'Tags should not start or end with whitespace, received ' '\'%s\'' % tag) if re.search(r'\s\s+', tag): raise utils.ValidationError( 'Adjacent whitespace in tags should be collapsed, ' 'received \'%s\'' % tag) if len(set(self.tags)) < len(self.tags): raise utils.ValidationError( 'Expected tags to be unique, but found duplicates') if not isinstance(self.status, str): raise utils.ValidationError( 'Expected status to be string, received %s' % self.status) if not isinstance(self.community_owned, bool): raise utils.ValidationError( 'Expected community_owned to be bool, received %s' % ( self.community_owned)) if not isinstance(self.owner_ids, list): raise utils.ValidationError( 'Expected owner_ids to be list, received %s' % self.owner_ids) for owner_id in self.owner_ids: if not isinstance(owner_id, str): raise utils.ValidationError( 'Expected each id in owner_ids to ' 'be string, received %s' % owner_id) if not isinstance(self.editor_ids, list): raise utils.ValidationError( 'Expected editor_ids to be list, received %s' % self.editor_ids) for editor_id in self.editor_ids: if not isinstance(editor_id, str): raise utils.ValidationError( 'Expected each id in editor_ids to ' 'be string, received %s' % editor_id) if not isinstance(self.viewer_ids, list): raise utils.ValidationError( 'Expected viewer_ids to be list, received %s' % self.viewer_ids) for viewer_id in self.viewer_ids: if not isinstance(viewer_id, str): raise utils.ValidationError( 'Expected each id in viewer_ids to ' 'be string, received %s' % viewer_id) if not isinstance(self.contributor_ids, list): raise utils.ValidationError( 'Expected contributor_ids to be list, received %s' % ( self.contributor_ids)) for contributor_id in self.contributor_ids: if not isinstance(contributor_id, str): raise utils.ValidationError( 'Expected each id in contributor_ids to ' 'be string, received %s' % contributor_id) if not isinstance(self.contributors_summary, dict): raise utils.ValidationError( 'Expected contributors_summary to be dict, received %s' % ( self.contributors_summary))