mirror of
https://github.com/Novartis/cellxgene-gateway.git
synced 2026-09-16 21:37:56 +08:00
Compare commits
12 Commits
81_gene_se
...
v0.3.11
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d10932b06 | ||
|
|
c7c156b4cf | ||
|
|
624d1f8567 | ||
|
|
79c3f588b6 | ||
|
|
d8fd07572c | ||
|
|
f296efcc55 | ||
|
|
facfb27d5c | ||
|
|
6607b15085 | ||
|
|
0e92b73347 | ||
|
|
88b9b815c0 | ||
|
|
6ef82b36f1 | ||
|
|
fdd6cca297 |
@@ -1,6 +1,8 @@
|
||||
# 0.3.11
|
||||
|
||||
* #81 added support for gene sets
|
||||
* #79 added example for cellxgene-gateway customized docker image
|
||||
* #78 prune directories that do not contain h5ad files
|
||||
|
||||
# 0.3.10
|
||||
|
||||
|
||||
@@ -7,4 +7,4 @@
|
||||
# OR CONDITIONS OF ANY KIND, either express or implied. See the License for
|
||||
# the specific language governing permissions and limitations under the License.
|
||||
|
||||
__version__ = "0.3.10"
|
||||
__version__ = "0.3.11"
|
||||
|
||||
@@ -68,7 +68,7 @@ class FileItemSource(ItemSource):
|
||||
|
||||
return item_tree
|
||||
|
||||
def scan_directory(self, subpath="") -> dict:
|
||||
def scan_directory(self, subpath: str = "") -> ItemTree:
|
||||
base_path = os.path.join(self.base_path, subpath)
|
||||
|
||||
if not os.path.exists(base_path):
|
||||
@@ -105,6 +105,11 @@ class FileItemSource(ItemSource):
|
||||
branches = [
|
||||
self.scan_directory(os.path.join(subpath, subdir)) for subdir in subdirs
|
||||
]
|
||||
# Exclude branches without files as leaves. Since traversal is applied pre-order,
|
||||
# branch.branches has already been processed and we don't need to check deeper nesting.
|
||||
branches = [
|
||||
branch for branch in branches if branch.items or branch.branches
|
||||
]
|
||||
|
||||
return ItemTree(subpath, items, branches)
|
||||
|
||||
|
||||
@@ -116,6 +116,9 @@ class S3ItemSource(ItemSource):
|
||||
branches = None
|
||||
if len(subdir_keys) > 0:
|
||||
branches = [self.scan_directory(key) for key in subdir_keys]
|
||||
branches = [
|
||||
branch for branch in branches if branch.items or branch.branches
|
||||
]
|
||||
|
||||
return ItemTree(directory_key, items, branches)
|
||||
|
||||
|
||||
14
examples/customized_docker_image/Dockerfile
Normal file
14
examples/customized_docker_image/Dockerfile
Normal file
@@ -0,0 +1,14 @@
|
||||
FROM python:3.9
|
||||
|
||||
RUN pip install cellxgene-gateway 'MarkupSafe<2.1'
|
||||
|
||||
COPY customize_ui.sh customize_ui.sh
|
||||
RUN CELLXGENE_GATEWAY_DIR=/usr/local/lib/python3.9/site-packages/cellxgene_gateway . ./customize_ui.sh
|
||||
|
||||
ENV CELLXGENE_DATA=/cellxgene-data
|
||||
ENV CELLXGENE_LOCATION=/usr/local/bin/cellxgene
|
||||
EXPOSE 5005
|
||||
|
||||
RUN mkdir /cellxgene-data
|
||||
|
||||
CMD ["cellxgene-gateway"]
|
||||
14
examples/customized_docker_image/README.md
Normal file
14
examples/customized_docker_image/README.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# Purpose
|
||||
|
||||
This is a simple example of how to make a small script to customize the UI of cellxgene-gateway. The script that does the customization is `customize_ui.sh`, it simply makes the main header green using CSS but you could do anything you want there (including adding more script tags, etc).
|
||||
|
||||
# Usage
|
||||
|
||||
```
|
||||
docker build -t cellxgene_custom .
|
||||
CELLXGENE_DATA=`pwd`/../../../cellxgene_data
|
||||
docker run -p 5005:5005 --mount src=$CELLXGENE_DATA,target=/cellxgene-data,type=bind cellxgene_custom
|
||||
```
|
||||
|
||||
If you now open http://localhost:5005 you should see a green cellxgene gateway header.
|
||||
|
||||
3
examples/customized_docker_image/customize_ui.sh
Normal file
3
examples/customized_docker_image/customize_ui.sh
Normal file
@@ -0,0 +1,3 @@
|
||||
# make the header bright green
|
||||
find "${CELLXGENE_GATEWAY_DIR}/templates" -name index.html -exec sed -i -e 's/<head>/<head>\
|
||||
> <style> header h3 {color: #0F0;} <\/style>/g' {} \;
|
||||
@@ -1,4 +1,5 @@
|
||||
import unittest
|
||||
from collections import defaultdict
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from cellxgene_gateway.filecrawl import (
|
||||
@@ -48,12 +49,48 @@ class TestRenderItemSource(unittest.TestCase):
|
||||
|
||||
|
||||
class TestRenderItemTree(unittest.TestCase):
|
||||
def setUp(self):
|
||||
from cellxgene_gateway.gateway import app
|
||||
|
||||
self.app = app
|
||||
self.app_context = self.app.test_request_context()
|
||||
self.app_context.push()
|
||||
|
||||
@patch("cellxgene_gateway.items.file.fileitem_source.FileItemSource")
|
||||
def test_GIVEN_deep_nested_dirs_THEN_includes_dirs_in_output(self, item_source):
|
||||
item_source.name = "FakeSource"
|
||||
item_tree = ItemTree("foo/bar/baz", [], [])
|
||||
item_source.get_annotations_subpath = lambda _: "FakeAnnotations"
|
||||
file_item = FileItem(
|
||||
subpath="foo/bar/baz", name="file.h5ad", type=ItemType.h5ad
|
||||
)
|
||||
item_tree = ItemTree("foo/bar/baz", [file_item], [])
|
||||
rendered = render_item_tree(item_tree, item_source)
|
||||
self.assertEqual(
|
||||
rendered,
|
||||
"<li><a href='/filecrawl/foo/bar/baz?source=FakeSource'>baz</a><ul></ul></li>",
|
||||
"<li><a href='/filecrawl/foo/bar/baz?source=FakeSource'>baz</a><ul>"
|
||||
"<li> <a href='/source/FakeSource/view/foo/bar/baz/file.h5ad/'>file.h5ad</a>"
|
||||
" | annotations: <a class='new' href='/source/FakeSource/view/FakeAnnotations'>new</a>"
|
||||
"</li></ul></li>",
|
||||
)
|
||||
|
||||
@patch(
|
||||
"os.listdir",
|
||||
side_effect=lambda parent: defaultdict(
|
||||
list, {"tmp": ["foo"], "tmp/foo": ["bar"]}
|
||||
)[parent],
|
||||
)
|
||||
@patch("os.path.exists", return_value=True)
|
||||
def test_GIVEN_dirs_without_h5ad_THEN_excludes_dirs_in_output(
|
||||
self, listdir, exists
|
||||
):
|
||||
# Directories:
|
||||
# - tmp
|
||||
# - foo
|
||||
# - bar (no h5ad files)
|
||||
item_source = FileItemSource("tmp", name="local")
|
||||
item_tree = item_source.list_items("foo")
|
||||
rendered = render_item_tree(item_tree, item_source)
|
||||
self.assertEqual(
|
||||
rendered,
|
||||
"<li><a href='/filecrawl/foo?source=local'>foo</a><ul></ul></li>",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user