def test_is_fraction(self): self.failUnless(is_fraction(Fraction())) self.failUnless(is_fraction(Fraction(3, 5))) self.failUnless(is_fraction(Fraction(Fraction(4, 5)))) self.failUnless(is_fraction(Fraction('3/2'))) self.failUnless(is_fraction(Fraction('-4/5'))) self.failIf(is_fraction(3 / 5)) self.failIf(is_fraction('3/5')) self.failIf(is_fraction('2.7')) self.failIf(is_fraction(2.7)) self.failIf(is_fraction('notafraction')) self.failIf(is_fraction(None))
def test_is_fraction(self): if Fraction is not None: self.failUnless(is_fraction(Fraction())) self.failUnless(is_fraction(Fraction(3, 5))) self.failUnless(is_fraction(Fraction(Fraction(4, 5)))) self.failUnless(is_fraction(Fraction('3/2'))) self.failUnless(is_fraction(Fraction('-4/5'))) self.failUnless(is_fraction(Rational(3, 5))) self.failUnless(is_fraction(Rational(-4, 5))) self.failUnless(is_fraction(Rational.from_string("3/5"))) self.failUnless(is_fraction(Rational.from_string("-4/5"))) self.failIf(is_fraction(3 / 5)) self.failIf(is_fraction('3/5')) self.failIf(is_fraction('2.7')) self.failIf(is_fraction(2.7)) self.failIf(is_fraction('notafraction')) self.failIf(is_fraction(None))
def _convert_to_string(self, value, type_): """Convert a value to its corresponding string representation. Args: value -- the value to be converted type_ -- the simple type of the value Return: the value converted to its corresponding string representation Raise XmpValueError: if the conversion fails """ if type_ == 'Boolean': if isinstance(value, bool): return str(value) else: raise XmpValueError(value, type_) elif type_ == 'Date': if isinstance(value, (datetime.date, datetime.datetime)): return DateTimeFormatter.xmp(value) else: raise XmpValueError(value, type_) elif type_ == 'GPSCoordinate': if isinstance(value, GPSCoordinate): return str(value) else: raise XmpValueError(value, type_) elif type_ == 'Integer': if isinstance(value, int): return str(value) else: raise XmpValueError(value, type_) elif type_ == 'MIMEType': if isinstance(value, tuple) and len(value) == 2: return '/'.join(value) else: raise XmpValueError(value, type_) elif type_ in ('AgentName', 'ProperName', 'Text', 'URI', 'URL'): if isinstance(value, str): try: return value.encode('utf-8') except UnicodeEncodeError: raise XmpValueError(value, type_) elif isinstance(value, bytes): return value raise XmpValueError(value, type_) elif type_ == 'Rational': if is_fraction(value): return str(value) else: raise XmpValueError(value, type_) elif type_ == '': # Undefined type if isinstance(value, str): try: return value.encode('utf-8') except UnicodeEncodeError: raise XmpValueError(value, type_) elif isinstance(value, (datetime.date, datetime.datetime)): return DateTimeFormatter.xmp(value) raise NotImplementedError('XMP conversion for type [%s]' % type_)
def _convert_to_string(self, value): """ Convert one value to its corresponding string representation, suitable to pass to libexiv2. :param value: the value to be converted :return: the value converted to its corresponding string representation :rtype: string :raise ExifValueError: if the conversion fails """ if self.type == 'Ascii': if isinstance(value, datetime.datetime): return value.strftime(self._datetime_formats[0]) elif isinstance(value, datetime.date): if self.key == 'Exif.GPSInfo.GPSDateStamp': # Special case return value.strftime(self._date_formats[0]) else: return value.strftime('%s 00:00:00' % self._date_formats[0]) elif isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, str): return value else: raise ExifValueError(value, self.type) elif self.type in ('Byte', 'SByte'): if isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, str): return value else: raise ExifValueError(value, self.type) elif self.type == 'Comment': if value is not None and self.raw_value is not None and \ self.raw_value.startswith('charset='): charset, val = self.raw_value.split(' ', 1) charset = charset.split('=')[1].strip('"') encoding = self._match_encoding(charset) try: val = value.encode(encoding) except UnicodeError: # Best effort, do not fail just because the original # encoding of the tag cannot encode the new value. pass else: return 'charset="%s" %s' % (charset, val) if isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, str): return value else: raise ExifValueError(value, self.type) elif self.type == 'Short': if isinstance(value, int) and value >= 0: return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'SShort': if isinstance(value, int): return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'Long': if isinstance(value, (int, long)) and value >= 0: return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'SLong': if isinstance(value, (int, long)): return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'Rational': if is_fraction(value) and value.numerator >= 0: return fraction_to_string(value) else: raise ExifValueError(value, self.type) elif self.type == 'SRational': if is_fraction(value): return fraction_to_string(value) else: raise ExifValueError(value, self.type) elif self.type == 'Undefined': if isinstance(value, unicode): try: return string_to_undefined(value.encode('utf-8')) except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, str): return string_to_undefined(value) else: raise ExifValueError(value, self.type) raise ExifValueError(value, self.type)
def check_type_and_value(self, tag, etype, evalue): if etype == FRACTION: self.assert_(is_fraction(tag.value)) else: self.assert_(isinstance(tag.value, etype)) self.assertEqual(tag.value, evalue)
def _convert_to_string(self, value, type): """ Convert a value to its corresponding string representation, suitable to pass to libexiv2. :param value: the value to be converted :param type: the simple type of the value :type type: string :return: the value converted to its corresponding string representation :rtype: string :raise XmpValueError: if the conversion fails """ if type == 'Boolean': if isinstance(value, bool): return str(value) else: raise XmpValueError(value, type) elif type == 'Date': if isinstance(value, (datetime.date, datetime.datetime)): return DateTimeFormatter.xmp(value) else: raise XmpValueError(value, type) elif type == 'GPSCoordinate': if isinstance(value, GPSCoordinate): return str(value) else: raise XmpValueError(value, type) elif type == 'Integer': if isinstance(value, (int, long)): return str(value) else: raise XmpValueError(value, type) elif type == 'MIMEType': if isinstance(value, tuple) and len(value) == 2: return '/'.join(value) else: raise XmpValueError(value, type) elif type in ('AgentName', 'ProperName', 'Text', 'URI', 'URL'): if isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise XmpValueError(value, type) elif isinstance(value, str): return value else: raise XmpValueError(value, type) elif type == 'Rational': if is_fraction(value): return str(value) else: raise XmpValueError(value, type) elif type == '': # Unknown type, assume string if isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise XmpValueError(value, type) elif isinstance(value, str): return value else: raise XmpValueError(value, type) raise NotImplementedError('XMP conversion for type [%s]' % type)
def _convert_to_string(self, value): """ Convert one value to its corresponding string representation, suitable to pass to libexiv2. :param value: the value to be converted :return: the value converted to its corresponding string representation :rtype: string :raise ExifValueError: if the conversion fails """ if self.type == 'Ascii': if isinstance(value, datetime.datetime): return DateTimeFormatter.exif(value) elif isinstance(value, datetime.date): if self.key == 'Exif.GPSInfo.GPSDateStamp': # Special case return DateTimeFormatter.exif(value) else: return '%s 00:00:00' % DateTimeFormatter.exif(value) else: return value elif self.type in ('Byte', 'SByte'): if isinstance(value, str): try: return value.encode('utf-8') except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, bytes): return value else: raise ExifValueError(value, self.type) elif self.type == 'Comment': return self._convert_to_bytes(value) elif self.type == 'Short': if isinstance(value, int) and value >= 0: return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'SShort': if isinstance(value, int): return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'Long': if isinstance(value, int) and value >= 0: return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'SLong': if isinstance(value, int): return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'Rational': if is_fraction(value) and value.numerator >= 0: return fraction_to_string(value) else: raise ExifValueError(value, self.type) elif self.type == 'SRational': if is_fraction(value): return fraction_to_string(value) else: raise ExifValueError(value, self.type) elif self.type == 'Undefined': if isinstance(value, str): try: return string_to_undefined(value) except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, bytes): return string_to_undefined(value) else: raise ExifValueError(value, self.type) raise ExifValueError(value, self.type)
def _convert_to_string(self, value, type): """ Convert a value to its corresponding string representation, suitable to pass to libexiv2. :param value: the value to be converted :param type: the simple type of the value :type type: string :return: the value converted to its corresponding string representation :rtype: string :raise XmpValueError: if the conversion fails """ if type == 'Boolean': if isinstance(value, bool): return str(value) else: raise XmpValueError(value, type) elif type == 'Date': if isinstance(value, datetime.datetime): if value.hour == 0 and value.minute == 0 and \ value.second == 0 and value.microsecond == 0 and \ (value.tzinfo is None or value.tzinfo == FixedOffset()): return value.strftime('%Y-%m-%d') elif value.second == 0 and value.microsecond == 0: return value.strftime('%Y-%m-%dT%H:%M%Z') elif value.microsecond == 0: return value.strftime('%Y-%m-%dT%H:%M:%S%Z') else: r = value.strftime('%Y-%m-%dT%H:%M:%S.') r += str(int(value.microsecond) / 1E6)[2:] r += value.strftime('%Z') return r elif isinstance(value, datetime.date): return value.isoformat() else: raise XmpValueError(value, type) elif type == 'GPSCoordinate': if isinstance(value, GPSCoordinate): return str(value) else: raise XmpValueError(value, type) elif type == 'Integer': if isinstance(value, (int, long)): return str(value) else: raise XmpValueError(value, type) elif type == 'MIMEType': if isinstance(value, tuple) and len(value) == 2: return '/'.join(value) else: raise XmpValueError(value, type) elif type in ('AgentName', 'ProperName', 'Text', 'URI', 'URL'): if isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise XmpValueError(value, type) elif isinstance(value, str): return value else: raise XmpValueError(value, type) elif type == 'Rational': if is_fraction(value): return str(value) else: raise XmpValueError(value, type) elif type == '': # Unknown type, assume string if isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise XmpValueError(value, type) elif isinstance(value, str): return value else: raise XmpValueError(value, type) raise NotImplementedError('XMP conversion for type [%s]' % type)
def test_is_fraction(is_f, obj): assert is_fraction(obj) == is_f
def _convert_to_string(self, value): """ Convert one value to its corresponding string representation, suitable to pass to libexiv2. :param value: the value to be converted :return: the value converted to its corresponding string representation :rtype: string :raise ExifValueError: if the conversion fails """ if self.type == 'Ascii': if isinstance(value, datetime.datetime): return DateTimeFormatter.exif(value) elif isinstance(value, datetime.date): if self.key == 'Exif.GPSInfo.GPSDateStamp': # Special case return DateTimeFormatter.exif(value) else: return '%s 00:00:00' % DateTimeFormatter.exif(value) elif isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, str): return value else: raise ExifValueError(value, self.type) elif self.type in ('Byte', 'SByte'): if isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, str): return value else: raise ExifValueError(value, self.type) elif self.type == 'Comment': if value is not None and self.raw_value is not None and \ self.raw_value.startswith('charset='): charset, val = self.raw_value.split(' ', 1) charset = charset.split('=')[1].strip('"') encoding = self._match_encoding(charset) try: val = value.encode(encoding) except UnicodeError: # Best effort, do not fail just because the original # encoding of the tag cannot encode the new value. pass else: return 'charset="%s" %s' % (charset, val) if isinstance(value, unicode): try: return value.encode('utf-8') except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, str): return value else: raise ExifValueError(value, self.type) elif self.type == 'Short': if isinstance(value, int) and value >= 0: return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'SShort': if isinstance(value, int): return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'Long': if isinstance(value, (int, long)) and value >= 0: return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'SLong': if isinstance(value, (int, long)): return str(value) else: raise ExifValueError(value, self.type) elif self.type == 'Rational': if is_fraction(value) and value.numerator >= 0: return fraction_to_string(value) else: raise ExifValueError(value, self.type) elif self.type == 'SRational': if is_fraction(value): return fraction_to_string(value) else: raise ExifValueError(value, self.type) elif self.type == 'Undefined': if isinstance(value, unicode): try: return string_to_undefined(value.encode('utf-8')) except UnicodeEncodeError: raise ExifValueError(value, self.type) elif isinstance(value, str): return string_to_undefined(value) else: raise ExifValueError(value, self.type) raise ExifValueError(value, self.type)