Skip to content

Commit

Permalink
Merge e39a45b into 3463ba8
Browse files Browse the repository at this point in the history
  • Loading branch information
tddough98 committed Oct 26, 2021
2 parents 3463ba8 + e39a45b commit dbe7262
Show file tree
Hide file tree
Showing 21 changed files with 784 additions and 85 deletions.
24 changes: 18 additions & 6 deletions deepcell_label/blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from deepcell_label.label import TrackEdit, ZStackEdit
from deepcell_label.models import Project
# from deepcell_label import loaders
from deepcell_label import url_loaders
from deepcell_label import loaders
from deepcell_label import exporters
from deepcell_label.config import S3_INPUT_BUCKET, S3_OUTPUT_BUCKET

Expand All @@ -38,7 +38,7 @@ def health():
return jsonify({'message': 'success'}), 200


@bp.errorhandler(url_loaders.InvalidExtension)
@bp.errorhandler(loaders.InvalidExtension)
def handle_invalid_extension(error):
response = jsonify(error.to_dict())
response.status_code = error.status_code
Expand Down Expand Up @@ -212,6 +212,18 @@ def get_project(token):
# loader.path, timeit.default_timer() - start)
# return jsonify({'projectId': project.token})

@bp.route('/api/project/dropped', methods=['POST'])
def create_project_from_dropped_file():
"""
Create a new Project from drag & dropped file.
"""
start = timeit.default_timer()
loader = loaders.FileLoader(request)
project = Project.create(loader)
current_app.logger.info('Created project from %s in %s s.',
loader.path, timeit.default_timer() - start)
return jsonify({'projectId': project.token})


@bp.route('/api/project', methods=['POST'])
def create_project_from_url():
Expand All @@ -220,17 +232,17 @@ def create_project_from_url():
"""
start = timeit.default_timer()
url_form = request.form
loader = url_loaders.Loader(url_form)
loader = loaders.URLLoader(url_form)
project = Project.create(loader)
current_app.logger.info('Created project from %s in %s s.',
loader.url, timeit.default_timer() - start)
loader.path, timeit.default_timer() - start)
return jsonify({'projectId': project.token})


@bp.route('/downloadproject/<token>', methods=['GET'])
@bp.route('/api/download/<token>', methods=['GET'])
def download_project(token):
"""
Download a .trk/.npz file from a DeepCell Label project.
Download a DeepCell Label project as a .npz file
"""
project = Project.get(token)
if not project:
Expand Down
34 changes: 32 additions & 2 deletions deepcell_label/blueprints_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@

import pytest
import numpy as np
from skimage.external.tifffile import TiffWriter
from PIL import Image

# from flask_sqlalchemy import SQLAlchemy

from deepcell_label import models
from deepcell_label.conftest import DummyLoader
Expand Down Expand Up @@ -84,11 +85,40 @@ def test_redo(client):


def test_create_project(client, mocker):
mocker.patch('deepcell_label.blueprints.url_loaders.Loader', lambda *args: DummyLoader())
mocker.patch('deepcell_label.blueprints.loaders.URLLoader', lambda *args: DummyLoader())
response = client.post(f'/api/project')
assert response.status_code == 200


def test_create_project_dropped_npz(client):
npz = io.BytesIO()
np.savez(npz, X=np.zeros((1, 1, 1, 1)), y=np.ones((1, 1, 1, 1)))
npz.seek(0)
data = {'file': (npz, 'test.npz')}
response = client.post(f'/api/project/dropped', data=data, content_type='multipart/form-data')
assert response.status_code == 200


def test_create_project_dropped_tiff(client):
tifffile = io.BytesIO()
with TiffWriter(tifffile) as writer:
writer.save(np.zeros((1, 1, 1, 1)))
tifffile.seek(0)
data = {'file': (tifffile, 'test.tiff')}
response = client.post(f'/api/project/dropped', data=data, content_type='multipart/form-data')
assert response.status_code == 200


def test_create_project_dropped_png(client):
png = io.BytesIO()
img = Image.fromarray(np.zeros((1, 1)), mode='L')
img.save(png, format="png")
png.seek(0)
data = {'file': (png, 'test.png')}
response = client.post(f'/api/project/dropped', data=data, content_type='multipart/form-data')
assert response.status_code == 200


def test_get_project(client):
project = models.Project.create(DummyLoader())
response = client.get(f'/api/project/{project.token}')
Expand Down
8 changes: 4 additions & 4 deletions deepcell_label/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from unittest.mock import MagicMock

from deepcell_label import create_app # pylint: disable=C0413
from deepcell_label.url_loaders import Loader
from deepcell_label.loaders import Loader


# flask-sqlalchemy fixtures from http://alexmic.net/flask-sqlalchemy-pytest/
Expand All @@ -21,9 +21,8 @@

# TODO: Could this become a fixture?
class DummyLoader(Loader):
def __init__(self, raw=None, labels=None, cell_info=None, url='test.npz'):
DummyLoader.load = MagicMock() # monkeypatch to avoid network requests
super().__init__(url_form={'url': url})
def __init__(self, raw=None, labels=None, cell_info=None, path='test.npz'):
super().__init__()

if raw is None:
raw = np.zeros((1, 1, 1, 1))
Expand All @@ -33,6 +32,7 @@ def __init__(self, raw=None, labels=None, cell_info=None, url='test.npz'):
elif labels.shape != raw.shape:
raw = np.zeros(labels.shape)

self.path = path
self.raw_array = raw
self.label_array = labels
self.add_semantic_labels() # computes cell_ids
Expand Down
4 changes: 2 additions & 2 deletions deepcell_label/exporters_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
def npz_exporter(app, db_session):
with app.app_context():
db_session.autoflush = False
project = models.Project.create(DummyLoader(url='test.npz'))
project = models.Project.create(DummyLoader(path='test.npz'))
exporter = exporters.Exporter(project)
return exporter

Expand All @@ -21,7 +21,7 @@ def npz_exporter(app, db_session):
def trk_exporter(app, db_session):
with app.app_context():
db_session.autoflush = False
project = models.Project.create(DummyLoader(url='test.trk'))
project = models.Project.create(DummyLoader(path='test.trk'))
exporter = exporters.Exporter(project)
return exporter

Expand Down
8 changes: 4 additions & 4 deletions deepcell_label/label_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,7 @@ class TestTrackEdit():

def test_track_add_cell_info(self):
labels = np.zeros((1, 1, 1, 1))
project = models.Project.create(DummyLoader(labels=labels, url='test.trk'))
project = models.Project.create(DummyLoader(labels=labels, path='test.trk'))
edit = label.TrackEdit(project)
tracks = edit.tracks

Expand All @@ -419,7 +419,7 @@ def test_track_add_cell_info(self):
def test_add_cell_info_multiple_frames(self):
num_frames = 5
labels = np.zeros((num_frames, 1, 1, 1))
project = models.Project.create(DummyLoader(labels=labels, url='test.trk'))
project = models.Project.create(DummyLoader(labels=labels, path='test.trk'))
edit = label.TrackEdit(project)
tracks = edit.tracks

Expand All @@ -443,7 +443,7 @@ def test_action_new_track_first_frame_of_track(self, app):
"""A new track on the first frame a label appears does nothing."""
# two 1x1 frames with one feature; cell starts on second frame
labels = np.reshape([0, 1], (2, 1, 1, 1))
project = models.Project.create(DummyLoader(labels=labels, url='test.trk'))
project = models.Project.create(DummyLoader(labels=labels, path='test.trk'))
cell = 1
frame = 1
feature = 0
Expand All @@ -462,7 +462,7 @@ def test_action_new_track(self, app):
"""Create a new track on the second frame of a label."""
# two 1x1 frames with one feature; cell appears in both frames
labels = np.reshape([1, 1], (2, 1, 1, 1))
project = models.Project.create(DummyLoader(labels=labels, url='test.trk'))
project = models.Project.create(DummyLoader(labels=labels, path='test.trk'))
cell = 1
frame = 1
feature = 0
Expand Down

0 comments on commit dbe7262

Please sign in to comment.