def test_should_find_inconsistent_derived_image_metadatas(self): for i in range(1, 15): original_image_metadata = domain.OriginalImageMetadata( 'MYID%s' % i, domain.STATUS_INCONSISTENT, (800, 600), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(original_image_metadata) item = domain.DerivedImageMetadata(domain.STATUS_INCONSISTENT, (100, 100), domain.IMAGE_FORMAT_JPEG, original_image_metadata) self._itemRepository.add(item) for i in range(16, 20): original_image_metadata = domain.OriginalImageMetadata( 'MYID%s' % i, domain.STATUS_OK, (900, 400), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(original_image_metadata) item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100), domain.IMAGE_FORMAT_JPEG, original_image_metadata) self._itemRepository.add(item) items = self._itemRepository.find_inconsistent_derived_image_metadatas( 10) assert len(items) == 10 for i in items: assert i.id in ['MYID%s-100x100-JPEG' % n for n in range(1, 15)] assert i.status == domain.STATUS_INCONSISTENT assert i.width == 100 assert i.height == 100 assert i.format == domain.IMAGE_FORMAT_JPEG
def test_should_not_save_two_original_image_metadatas_with_same_id(self): item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) item2 = domain.OriginalImageMetadata('MYID12435', domain.STATUS_INCONSISTENT, (700, 100), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(item) try: self._itemRepository.add(item2) except domain.DuplicateEntryException, ex: assert 'MYID12435' == ex.duplicate_id
def test_should_find_derived_image_metadata_by_original_image_metadata_id_size_and_format( self): original_image_metadata = domain.OriginalImageMetadata( 'MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(original_image_metadata) item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100), domain.IMAGE_FORMAT_JPEG, original_image_metadata) self._itemRepository.add(item) found_item = self._itemRepository.find_derived_image_metadata_by_original_image_metadata_id_size_and_format( 'MYID12435', (100, 100), domain.IMAGE_FORMAT_JPEG) assert found_item is not None assert found_item.status == domain.STATUS_OK assert found_item.width == 100 assert found_item.height == 100 assert found_item.format == domain.IMAGE_FORMAT_JPEG assert found_item.original_image_metadata.id == 'MYID12435' assert found_item.original_image_metadata.status == domain.STATUS_OK assert found_item.original_image_metadata.width == 800 assert found_item.original_image_metadata.height == 600 assert found_item.original_image_metadata.format == domain.IMAGE_FORMAT_JPEG _datetimes_should_be_equal(item.last_status_change_date, found_item.last_status_change_date)
def test_format_should_be_mandatory_at_creation_time(self): try: domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK, (800, 600), None) except Exception: pass else: self.fail()
def test_heiht_should_be_mandatory_at_creation_time(self): try: domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK, (800, None), domain.IMAGE_FORMAT_JPEG) except Exception: pass else: self.fail()
def test_id_should_be_mandatory_at_creation_time(self): try: domain.OriginalImageMetadata(None, domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) except Exception: pass else: self.fail()
def test_setting_status_should_update_status_change_date(self): item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_INCONSISTENT, (800, 600), domain.IMAGE_FORMAT_JPEG) # f**k date by breaking encapsulation item._last_status_change_date = datetime.utcnow() - timedelta(1) item.status = domain.STATUS_OK assertionutils.last_status_date_should_be_now(item)
def test_should_delete_original_image_metadata(self): item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(item) self._itemRepository.delete( self._itemRepository.find_original_image_metadata_by_id( 'MYID12435')) found_item = self._itemRepository.find_original_image_metadata_by_id( 'MYID12435') assert found_item is None
def test_should_not_find_derived_image_metadata_because_of_format(self): original_image_metadata = domain.OriginalImageMetadata( 'MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(original_image_metadata) item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100), domain.IMAGE_FORMAT_JPEG, original_image_metadata) self._itemRepository.add(item) found_item = self._itemRepository.find_derived_image_metadata_by_original_image_metadata_id_size_and_format( 'MYID12435', (100, 100), 'JPEG2') assert found_item is None
def test_should_find_original_image_metadata_by_id(self): item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(item) found_item = self._itemRepository.find_original_image_metadata_by_id( 'MYID12435') assert found_item is not None assert found_item.id == 'MYID12435' assert found_item.status == domain.STATUS_OK assert found_item.width == 800 assert found_item.height == 600 assert found_item.format == domain.IMAGE_FORMAT_JPEG _datetimes_should_be_equal(item.last_status_change_date, found_item.last_status_change_date)
def test_should_navigate_to_derived_image_metadatas_from_original_image_metadata( self): original_image_metadata = domain.OriginalImageMetadata( 'MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(original_image_metadata) item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100), domain.IMAGE_FORMAT_JPEG, original_image_metadata) self._itemRepository.add(item) found_item = self._itemRepository.find_original_image_metadata_by_id( 'MYID12435') assert found_item is not None assert found_item.derived_image_metadatas is not None assert len(found_item.derived_image_metadatas) == 1 assert found_item.derived_image_metadatas[0].id == item.id
def test_should_not_save_two_derived_image_metadatas_with_same_id(self): original_image_metadata = domain.OriginalImageMetadata( 'MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(original_image_metadata) item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100), domain.IMAGE_FORMAT_JPEG, original_image_metadata) self._itemRepository.add(item) try: item2 = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100), domain.IMAGE_FORMAT_JPEG, original_image_metadata) self._itemRepository.add(item2) except domain.DuplicateEntryException as ex: assert 'MYID12435-100x100-JPEG' == ex.duplicate_id except Exception as e: print e else: self.fail()
def test_deletion_of_original_image_metadata_should_delete_associated_derived_image_metadatas( self): original_image_metadata = domain.OriginalImageMetadata( 'MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) self._itemRepository.add(original_image_metadata) item = domain.DerivedImageMetadata(domain.STATUS_OK, (100, 100), domain.IMAGE_FORMAT_JPEG, original_image_metadata) self._itemRepository.add(item) self._session.delete( self._itemRepository.find_original_image_metadata_by_id( 'MYID12435')) found_derived_image_metadata = self._itemRepository.find_derived_image_metadata_by_original_image_metadata_id_size_and_format( 'MYID12435', (100, 100), domain.IMAGE_FORMAT_JPEG) assert found_derived_image_metadata is None found_original_image_metadata = self._itemRepository.find_original_image_metadata_by_id( 'MYID12435') assert found_original_image_metadata is None
def test_should_create_item_using_width_and_height_expressed_as_int(self): item = domain.OriginalImageMetadata('MYID12435', domain.STATUS_OK, (800, 600), domain.IMAGE_FORMAT_JPEG) _item_should_match(item)
def setUp(self): unittest.TestCase.setUp(self) self.original_image_metadata = domain.OriginalImageMetadata( 'MYID12435', domain.STATUS_OK, ('800', '600'), domain.IMAGE_FORMAT_JPEG)
def original_yemmagouraya_metadata(): return domain.OriginalImageMetadata('yemmaGouraya', domain.STATUS_OK, ('800', '600'), domain.IMAGE_FORMAT_JPEG)
class DefaultImageRequestProcessor(object): implements(ImageRequestProcessor) def __init__(self, image_metadata_repository, path_generator, image_format_mapper, schema_migrator, data_directory, session_template, dev_mode=False): """ @param data_directory: the directory that this ImageRequestProcessor will use for its work files """ self._data_directory = data_directory self._image_metadata_repository = domain.ImageMetadataRepository( image_metadata_repository) self._image_format_mapper = resources.ImageFormatMapper( image_format_mapper) self._schema_migrator = persistence.SchemaMigrator(schema_migrator) self._path_generator = resources.PathGenerator(path_generator) self._session_template = session_template self._dev_mode = dev_mode if self._dev_mode: self._drop_data() self._init_data() self.cleanup_inconsistent_items() @tx.transactional def _wait_for_item_status_ok(self, pollingCallback): """ Wait for the status property of the object returned by pollingCallback() to be STATUS_OK It honors LOCK_MAX_RETRIES and LOCK_WAIT_SECONDS """ item = pollingCallback() i = 0 while i < LOCK_MAX_RETRIES and item is not None and item.status != domain.STATUS_OK: time.sleep(LOCK_WAIT_SECONDS) item = pollingCallback() i = i + 1 if i == LOCK_MAX_RETRIES: raise imgengine.ImageProcessingException( 'Item seems to be locked forever') def _wait_for_original_image_metadata(self, image_id): """ Wait for the given original item to have a status of STATUS_OK """ self._wait_for_item_status_ok( lambda: self._image_metadata_repository. find_original_image_metadata_by_id(image_id)) def _required_original_image_metadata(self, image_id, original_image_metadata): if original_image_metadata is None: raise imgengine.ImageMetadataNotFoundException(image_id) @tx.transactional def get_original_image_path(self, image_id): logger.debug("get_original_image_path") original_image_metadata = self._image_metadata_repository.find_original_image_metadata_by_id( image_id) self._required_original_image_metadata(image_id, original_image_metadata) self._wait_for_original_image_metadata(image_id) return self._path_generator.original_path( original_image_metadata).relative() @tx.transactional def save_file_to_repository(self, file, image_id): def filename_save_strategy(file, item): shutil.copyfile( file, self._path_generator.original_path(item).absolute()) def file_like_save_strategy(file, item): file.seek(0) with open( self._path_generator.original_path(item).absolute(), "w+b") as out: shutil.copyfileobj(file, out) out.flush() if type(file) == str: save = filename_save_strategy else: save = file_like_save_strategy # Check that the image is not broken try: img = Image.open(file) img.verify() except IOError, ex: raise imgengine.ImageStreamNotRecognizedException(ex) item = domain.OriginalImageMetadata(image_id, domain.STATUS_INCONSISTENT, img.size, img.format) try: # atomic creation self._image_metadata_repository.add(item) except domain.DuplicateEntryException, ex: raise imgengine.ImageIDAlreadyExistsException(item.id)