mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-10-06 14:38:12 +08:00
move common code into server, update tests and makefile (#2425)
* move common code into server, update tests and makefile remove backend directory, refactor update smoke tests
This commit is contained in:
+1
-1
@@ -20,6 +20,6 @@ replace = version="{new_version}"
|
|||||||
search = "version": "{current_version}"
|
search = "version": "{current_version}"
|
||||||
replace = "version": "{new_version}"
|
replace = "version": "{new_version}"
|
||||||
|
|
||||||
[bumpversion:file:backend/server/__init__.py]
|
[bumpversion:file:server/__init__.py]
|
||||||
search = __version__ = "{current_version}"
|
search = __version__ = "{current_version}"
|
||||||
replace = __version__ = "{new_version}"
|
replace = __version__ = "{new_version}"
|
||||||
|
|||||||
+1
-1
@@ -2,4 +2,4 @@ bin
|
|||||||
client
|
client
|
||||||
dist
|
dist
|
||||||
docs
|
docs
|
||||||
backend
|
server
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
# 1. only install the dev requirements on top of what is in the cellxgene pip package
|
# 1. only install the dev requirements on top of what is in the cellxgene pip package
|
||||||
sudo apt-get update && sudo apt-get install -y libhdf5-serial-dev
|
sudo apt-get update && sudo apt-get install -y libhdf5-serial-dev
|
||||||
sed -i 's/-r requirements.txt//' backend/server/requirements-dev.txt
|
sed -i 's/-r requirements.txt//' server/requirements-dev.txt
|
||||||
pip install -r backend/server/requirements-dev.txt
|
pip install -r server/requirements-dev.txt
|
||||||
# 2. install cellxgene
|
# 2. install cellxgene
|
||||||
make pydist install-dist
|
make pydist install-dist
|
||||||
# 3. install anndata
|
# 3. install anndata
|
||||||
@@ -71,8 +71,8 @@ jobs:
|
|||||||
cd cellxgene
|
cd cellxgene
|
||||||
# 1. only install the dev requirements on top of what is in the cellxgene pip package
|
# 1. only install the dev requirements on top of what is in the cellxgene pip package
|
||||||
make dev-env-client
|
make dev-env-client
|
||||||
sed -i 's/-r requirements.txt//' backend/server/requirements-dev.txt
|
sed -i 's/-r requirements.txt//' server/requirements-dev.txt
|
||||||
pip install -r backend/server/requirements-dev.txt
|
pip install -r server/requirements-dev.txt
|
||||||
# 2. install cellxgene
|
# 2. install cellxgene
|
||||||
pip install --upgrade cellxgene
|
pip install --upgrade cellxgene
|
||||||
# 3. install anndata
|
# 3. install anndata
|
||||||
@@ -99,7 +99,7 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
cd cellxgene
|
cd cellxgene
|
||||||
sed -i -E 's/^anndata[>=]=[0-9]+.[0-9]+.[0-9]+$/anndata/g' backend/server/requirements.txt
|
sed -i -E 's/^anndata[>=]=[0-9]+.[0-9]+.[0-9]+$/anndata/g' server/requirements.txt
|
||||||
make pydist install-dist dev-env
|
make pydist install-dist dev-env
|
||||||
pip install git+https://github.com/theislab/anndata
|
pip install git+https://github.com/theislab/anndata
|
||||||
- name: Tests
|
- name: Tests
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ jobs:
|
|||||||
- name: Unit tests
|
- name: Unit tests
|
||||||
run: |
|
run: |
|
||||||
make unit-test-server unit-test-client
|
make unit-test-server unit-test-client
|
||||||
bash <(curl -s https://codecov.io/bash) -y .codecov.yml -k backend/server -cF backend,python,unitTest
|
bash <(curl -s https://codecov.io/bash) -y .codecov.yml -k server -cF server,python,unitTest
|
||||||
cd client && ./node_modules/codecov/bin/codecov --yml=../.codecov.yml --root=../ --gcov-root=../ -C -F frontend,javascript,unitTest
|
cd client && ./node_modules/codecov/bin/codecov --yml=../.codecov.yml --root=../ --gcov-root=../ -C -F frontend,javascript,unitTest
|
||||||
|
|
||||||
smoke-tests:
|
smoke-tests:
|
||||||
|
|||||||
+3
-3
@@ -19,9 +19,9 @@ venv*/
|
|||||||
cellxgene/
|
cellxgene/
|
||||||
|
|
||||||
# client build
|
# client build
|
||||||
backend/server/common/web/static/*
|
server/common/web/static/*
|
||||||
backend/server/common/web/templates/
|
server/common/web/templates/
|
||||||
backend/server/common/web/csp-hashes.json
|
server/common/web/csp-hashes.json
|
||||||
|
|
||||||
# eb build
|
# eb build
|
||||||
artifact.dir
|
artifact.dir
|
||||||
|
|||||||
+6
-6
@@ -1,7 +1,7 @@
|
|||||||
recursive-include backend/server/common/web/templates *
|
recursive-include server/common/web/templates *
|
||||||
recursive-include backend/server/common/web/static *
|
recursive-include server/common/web/static *
|
||||||
|
|
||||||
include backend/server/requirements.txt
|
include server/requirements.txt
|
||||||
include backend/server/requirements-prepare.txt
|
include server/requirements-prepare.txt
|
||||||
include backend/server/converters/schema/hgnc_complete_set.txt.gz
|
include server/converters/schema/hgnc_complete_set.txt.gz
|
||||||
include backend/server/converters/schema/schema_definitions/*
|
include server/converters/schema/schema_definitions/*
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ include common.mk
|
|||||||
|
|
||||||
BUILDDIR := build
|
BUILDDIR := build
|
||||||
CLIENTBUILD := $(BUILDDIR)/client
|
CLIENTBUILD := $(BUILDDIR)/client
|
||||||
SERVERBUILD := $(BUILDDIR)/backend/server
|
SERVERBUILD := $(BUILDDIR)/server
|
||||||
CLEANFILES := $(BUILDDIR)/ client/build build dist cellxgene.egg-info
|
CLEANFILES := $(BUILDDIR)/ client/build build dist cellxgene.egg-info
|
||||||
|
|
||||||
PART ?= patch
|
PART ?= patch
|
||||||
@@ -22,7 +22,7 @@ clean-client:
|
|||||||
|
|
||||||
.PHONY: clean-server
|
.PHONY: clean-server
|
||||||
clean-server:
|
clean-server:
|
||||||
cd backend/server && $(MAKE) clean
|
cd server && $(MAKE) clean
|
||||||
|
|
||||||
|
|
||||||
# BUILDING PACKAGE
|
# BUILDING PACKAGE
|
||||||
@@ -33,33 +33,26 @@ build-client:
|
|||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build: clean build-client
|
build: clean build-client
|
||||||
git ls-files backend/server/ | grep -v 'backend/server/test/' | cpio -pdm $(BUILDDIR)
|
git ls-files server/ | cpio -pdm $(BUILDDIR)
|
||||||
cp -r client/build/ $(CLIENTBUILD)
|
cp -r client/build/ $(CLIENTBUILD)
|
||||||
$(call copy_client_assets,$(CLIENTBUILD),$(SERVERBUILD))
|
$(call copy_client_assets,$(CLIENTBUILD),$(SERVERBUILD))
|
||||||
cp backend/__init__.py $(BUILDDIR)
|
|
||||||
cp backend/__init__.py $(BUILDDIR)/backend
|
|
||||||
cp -r backend/common $(BUILDDIR)/backend/common
|
|
||||||
cp MANIFEST.in README.md setup.cfg setup.py $(BUILDDIR)
|
cp MANIFEST.in README.md setup.cfg setup.py $(BUILDDIR)
|
||||||
|
|
||||||
# If you are actively developing in the server folder use this, dirties the source tree
|
# If you are actively developing in the server folder use this, dirties the source tree
|
||||||
.PHONY: build-for-server-dev
|
.PHONY: build-for-server-dev
|
||||||
build-for-server-dev: clean-server build-client
|
build-for-server-dev: clean-server build-client copy-client-assets
|
||||||
$(call copy_client_assets,client/build,backend/server)
|
|
||||||
|
|
||||||
.PHONY: copy-client-assets
|
.PHONY: copy-client-assets
|
||||||
copy-client-assets:
|
copy-client-assets:
|
||||||
$(call copy_client_assets,client/build,backend/server)
|
$(call copy_client_assets,client/build,server)
|
||||||
|
|
||||||
.PHONY: copy-client-assets-czi-hosted
|
|
||||||
copy-client-assets-czi-hosted:
|
|
||||||
$(call copy_client_assets,client/build)
|
|
||||||
|
|
||||||
# TESTING
|
# TESTING
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: unit-test smoke-test
|
test: unit-test smoke-test
|
||||||
|
|
||||||
.PHONY: unit-test
|
.PHONY: unit-test
|
||||||
unit-test: unit-test-server unit-test-client unit-test-common
|
unit-test: unit-test-server unit-test-client
|
||||||
|
|
||||||
.PHONY: test-server
|
.PHONY: test-server
|
||||||
test-server: unit-test-server smoke-test
|
test-server: unit-test-server smoke-test
|
||||||
@@ -70,11 +63,13 @@ unit-test-client:
|
|||||||
|
|
||||||
.PHONY: unit-test-server
|
.PHONY: unit-test-server
|
||||||
unit-test-server:
|
unit-test-server:
|
||||||
cd backend/server && $(MAKE) unit-test
|
PYTHONWARNINGS=ignore:ResourceWarning coverage run \
|
||||||
|
--source=server \
|
||||||
.PHONY: unit-test-common
|
--omit=.coverage,venv \
|
||||||
unit-test-common:
|
-m unittest discover \
|
||||||
cd backend/common && $(MAKE) unit-test
|
--start-directory test/unit \
|
||||||
|
--verbose; test_result=$$?; \
|
||||||
|
exit $$test_result \
|
||||||
|
|
||||||
.PHONY: smoke-test
|
.PHONY: smoke-test
|
||||||
smoke-test:
|
smoke-test:
|
||||||
@@ -103,7 +98,7 @@ lint: lint-server lint-client
|
|||||||
|
|
||||||
.PHONY: lint-server
|
.PHONY: lint-server
|
||||||
lint-server: fmt-py
|
lint-server: fmt-py
|
||||||
flake8 backend/server --per-file-ignores='backend/test/fixtures/dataset_config_outline.py:F821 backend/test/fixtures/server_config_outline.py:F821 backend/server/test/performance/scale_test_annotations.py:E501'
|
flake8 server --per-file-ignores='test/fixtures/dataset_config_outline.py:F821 test/fixtures/server_config_outline.py:F821 test/performance/scale_test_annotations.py:E501'
|
||||||
|
|
||||||
.PHONY: lint-client
|
.PHONY: lint-client
|
||||||
lint-client:
|
lint-client:
|
||||||
@@ -163,7 +158,7 @@ dev-env-client:
|
|||||||
|
|
||||||
.PHONY: dev-env-server
|
.PHONY: dev-env-server
|
||||||
dev-env-server:
|
dev-env-server:
|
||||||
pip install -r backend/server/requirements-dev.txt
|
pip install -r server/requirements-dev.txt
|
||||||
|
|
||||||
# Increments the release candidate version (i.e. 0.16.2-rc.1 -> 0.16.2-rc.2)
|
# Increments the release candidate version (i.e. 0.16.2-rc.1 -> 0.16.2-rc.2)
|
||||||
.PHONY: bump-release-candidate
|
.PHONY: bump-release-candidate
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
|
|
||||||
.PHONY: unit-test
|
|
||||||
unit-test:
|
|
||||||
PYTHONWARNINGS=ignore:ResourceWarning coverage run \
|
|
||||||
--source=fbs,utils \
|
|
||||||
--omit=.coverage,data_common/fbs/NetEncoding,venv \
|
|
||||||
-m unittest discover \
|
|
||||||
--start-directory ../test/test_common/unit \
|
|
||||||
--top-level-directory ../../ \
|
|
||||||
--verbose; test_result=$$?; \
|
|
||||||
exit $$test_result \
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
include ../../common.mk
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
rm -f common/web/templates/index.html
|
|
||||||
rm -rf common/web/static
|
|
||||||
rm -f common/web/csp-hashes.json
|
|
||||||
|
|
||||||
.PHONY: unit-test
|
|
||||||
unit-test:
|
|
||||||
PYTHONWARNINGS=ignore:ResourceWarning coverage run \
|
|
||||||
--source=app,cli,common,compute,converters,data_anndata,data_common \
|
|
||||||
--omit=.coverage,venv \
|
|
||||||
-m unittest discover \
|
|
||||||
--start-directory ../test/test_server/unit \
|
|
||||||
--top-level-directory ../../ \
|
|
||||||
--verbose; test_result=$$?; \
|
|
||||||
exit $$test_result \
|
|
||||||
|
|
||||||
.PHONY: test-annotations-performance
|
|
||||||
test-annotations-performance:
|
|
||||||
python ../test/test_server/performance/performance_test_annotations_backend.py
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
include ../common.mk
|
include ../common.mk
|
||||||
|
|
||||||
ANNOTATIONS := $(if $(ANNOTATIONS),$(ANNOTATIONS),../backend/test/fixtures/pbmc3k-annotations.csv)
|
ANNOTATIONS := $(if $(ANNOTATIONS),$(ANNOTATIONS),../test/fixtures/pbmc3k-annotations.csv)
|
||||||
GENE_SETS := $(if $(GENE_SETS),$(GENE_SETS),../backend/test/fixtures/pbmc3k-genesets.csv)
|
GENE_SETS := $(if $(GENE_SETS),$(GENE_SETS),../test/fixtures/pbmc3k-genesets.csv)
|
||||||
ANNOTATIONS_FILENAME := $(shell basename $(ANNOTATIONS))
|
ANNOTATIONS_FILENAME := $(shell basename $(ANNOTATIONS))
|
||||||
GENE_SETS_FILENAME := $(shell basename $(GENE_SETS))
|
GENE_SETS_FILENAME := $(shell basename $(GENE_SETS))
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ exclude = '''
|
|||||||
| buck-out
|
| buck-out
|
||||||
| build
|
| build
|
||||||
| dist
|
| dist
|
||||||
| backend/server/data_common/fbs/NetEncoding
|
| server/common/fbs/NetEncoding
|
||||||
)/
|
)/
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
-r ./backend/server/requirements.txt
|
-r ./server/requirements.txt
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
include ../common.mk
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -f common/web/templates/index.html
|
||||||
|
rm -rf common/web/static
|
||||||
|
rm -f common/web/csp-hashes.json
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: test-annotations-performance
|
||||||
|
test-annotations-performance:
|
||||||
|
python ../test/performance/performance_test_annotations.py
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from backend.common.utils.utils import import_plugins
|
from server.common.utils.utils import import_plugins
|
||||||
|
|
||||||
__version__ = "0.18.0"
|
__version__ = "0.18.0"
|
||||||
display_version = "cellxgene v" + __version__
|
display_version = "cellxgene v" + __version__
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import_plugins("backend.server.plugins")
|
import_plugins("server.plugins")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# Make sure to exit in this case, as the server may not be configured as expected.
|
# Make sure to exit in this case, as the server may not be configured as expected.
|
||||||
logging.critical(f"Error in import_plugins: {str(e)}")
|
logging.critical(f"Error in import_plugins: {str(e)}")
|
||||||
@@ -5,7 +5,8 @@ if __package__ is None:
|
|||||||
|
|
||||||
PKG_PATH = Path(__file__).parent
|
PKG_PATH = Path(__file__).parent
|
||||||
sys.path.insert(0, str(PKG_PATH.parent))
|
sys.path.insert(0, str(PKG_PATH.parent))
|
||||||
import backend.server # noqa F401
|
import server # noqa F401
|
||||||
|
|
||||||
__package__ = PKG_PATH.name
|
__package__ = PKG_PATH.name
|
||||||
|
|
||||||
# Main thing
|
# Main thing
|
||||||
@@ -13,12 +13,12 @@ from flask import (
|
|||||||
)
|
)
|
||||||
from flask_restful import Api, Resource
|
from flask_restful import Api, Resource
|
||||||
|
|
||||||
import backend.server.common.rest as common_rest
|
import server.common.rest as common_rest
|
||||||
from backend.common.errors import DatasetAccessError, RequestException
|
from server.common.errors import DatasetAccessError, RequestException
|
||||||
from backend.server.common.health import health_check
|
from server.common.health import health_check
|
||||||
from backend.common.utils.utils import StrictJSONEncoder
|
from server.common.utils.utils import StrictJSONEncoder
|
||||||
|
|
||||||
webbp = Blueprint("webapp", "backend.server.common.web", template_folder="templates")
|
webbp = Blueprint("webapp", "server.common.web", template_folder="templates")
|
||||||
|
|
||||||
ONE_WEEK = 7 * 24 * 60 * 60
|
ONE_WEEK = 7 * 24 * 60 * 60
|
||||||
|
|
||||||
@@ -20,7 +20,10 @@ from .. import __version__
|
|||||||
help="Show the software version and exit.",
|
help="Show the software version and exit.",
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"--upgrade-check/--no-upgrade-check", default=True, show_default=True, help="Check for release upgrades on start.",
|
"--upgrade-check/--no-upgrade-check",
|
||||||
|
default=True,
|
||||||
|
show_default=True,
|
||||||
|
help="Check for release upgrades on start.",
|
||||||
)
|
)
|
||||||
def cli(upgrade_check):
|
def cli(upgrade_check):
|
||||||
if upgrade_check:
|
if upgrade_check:
|
||||||
@@ -8,11 +8,11 @@ import click
|
|||||||
from flask_compress import Compress
|
from flask_compress import Compress
|
||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
|
|
||||||
from backend.server.default_config import default_config
|
from server.default_config import default_config
|
||||||
from backend.server.app.app import Server
|
from server.app.app import Server
|
||||||
from backend.server.common.config.app_config import AppConfig
|
from server.common.config.app_config import AppConfig
|
||||||
from backend.common.errors import DatasetAccessError, ConfigurationError
|
from server.common.errors import DatasetAccessError, ConfigurationError
|
||||||
from backend.common.utils.utils import sort_options
|
from server.common.utils.utils import sort_options
|
||||||
|
|
||||||
DEFAULT_CONFIG = AppConfig()
|
DEFAULT_CONFIG = AppConfig()
|
||||||
|
|
||||||
@@ -5,7 +5,7 @@ import pandas as pd
|
|||||||
from numpy import ndarray, unique
|
from numpy import ndarray, unique
|
||||||
from scipy.sparse.csc import csc_matrix
|
from scipy.sparse.csc import csc_matrix
|
||||||
|
|
||||||
from backend.common.utils.utils import sort_options
|
from server.common.utils.utils import sort_options
|
||||||
|
|
||||||
|
|
||||||
@sort_options
|
@sort_options
|
||||||
@@ -24,7 +24,11 @@ from backend.common.utils.utils import sort_options
|
|||||||
show_default=True,
|
show_default=True,
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"--recipe", "-r", default="none", type=click.Choice(["none", "seurat", "zheng17"]), show_default=True,
|
"--recipe",
|
||||||
|
"-r",
|
||||||
|
default="none",
|
||||||
|
type=click.Choice(["none", "seurat", "zheng17"]),
|
||||||
|
show_default=True,
|
||||||
)
|
)
|
||||||
@click.option("--output", "-o", default="", help="Save a new file to filename.", metavar="<filename>")
|
@click.option("--output", "-o", default="", help="Save a new file to filename.", metavar="<filename>")
|
||||||
@click.option("--plotting", "-p", default=False, is_flag=True, help="Generate plots.", show_default=True)
|
@click.option("--plotting", "-p", default=False, is_flag=True, help="Generate plots.", show_default=True)
|
||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
from abc import ABCMeta, abstractmethod
|
from abc import ABCMeta, abstractmethod
|
||||||
|
|
||||||
from backend.common.errors import DisabledFeatureError
|
from server.common.errors import DisabledFeatureError
|
||||||
from backend.common.utils.type_conversion_utils import get_schema_type_hint_of_array
|
from server.common.utils.type_conversion_utils import get_schema_type_hint_of_array
|
||||||
from backend.common.genesets import write_gene_sets_tidycsv
|
from server.common.genesets import write_gene_sets_tidycsv
|
||||||
|
|
||||||
|
|
||||||
class Annotations(metaclass=ABCMeta):
|
class Annotations(metaclass=ABCMeta):
|
||||||
+6
-6
@@ -8,12 +8,12 @@ from hashlib import blake2b
|
|||||||
import pandas as pd
|
import pandas as pd
|
||||||
from flask import session
|
from flask import session
|
||||||
|
|
||||||
from backend.server import __version__ as cellxgene_version
|
from server import __version__ as cellxgene_version
|
||||||
from backend.server.app.session import get_user_id
|
from server.app.session import get_user_id
|
||||||
from backend.server.common.annotations.annotations import Annotations
|
from server.common.annotations.annotations import Annotations
|
||||||
from backend.common.genesets import read_gene_sets_tidycsv
|
from server.common.genesets import read_gene_sets_tidycsv
|
||||||
from backend.common.errors import AnnotationsError, ObsoleteRequest
|
from server.common.errors import AnnotationsError, ObsoleteRequest
|
||||||
from backend.common.utils.data_locator import DataLocator
|
from server.common.utils.data_locator import DataLocator
|
||||||
|
|
||||||
|
|
||||||
class AnnotationsLocalFile(Annotations):
|
class AnnotationsLocalFile(Annotations):
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from backend.common.errors import ColorFormatException
|
from server.common.errors import ColorFormatException
|
||||||
|
|
||||||
HEX_COLOR_FORMAT = re.compile("^#[a-fA-F0-9]{6,6}$")
|
HEX_COLOR_FORMAT = re.compile("^#[a-fA-F0-9]{6,6}$")
|
||||||
|
|
||||||
+3
-2
@@ -1,6 +1,6 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from scipy import sparse, stats
|
from scipy import sparse, stats
|
||||||
from backend.common.constants import XApproximateDistribution
|
from server.common.constants import XApproximateDistribution
|
||||||
|
|
||||||
|
|
||||||
def diffexp_ttest(adaptor, maskA, maskB, top_n=8, diffexp_lfc_cutoff=0.01):
|
def diffexp_ttest(adaptor, maskA, maskB, top_n=8, diffexp_lfc_cutoff=0.01):
|
||||||
@@ -27,7 +27,8 @@ def diffexp_ttest(adaptor, maskA, maskB, top_n=8, diffexp_lfc_cutoff=0.01):
|
|||||||
:param top_n: number of variables to return stats for
|
:param top_n: number of variables to return stats for
|
||||||
:param diffexp_lfc_cutoff: minimum
|
:param diffexp_lfc_cutoff: minimum
|
||||||
absolute value returning [ varindex, logfoldchange, pval, pval_adj ] for top N genes
|
absolute value returning [ varindex, logfoldchange, pval, pval_adj ] for top N genes
|
||||||
:return: for top N genes, {"positive": for top N genes, [ varindex, foldchange, pval, pval_adj ], "negative": for top N genes, [ varindex, foldchange, pval, pval_adj ]}
|
:return: for top N genes, {"positive": for top N genes, [ varindex, foldchange, pval, pval_adj ],
|
||||||
|
"negative": for top N genes, [ varindex, foldchange, pval, pval_adj ]}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
X_approximate_distribution = adaptor.get_X_approximate_distribution()
|
X_approximate_distribution = adaptor.get_X_approximate_distribution()
|
||||||
+1
-1
@@ -3,7 +3,7 @@ import numba
|
|||||||
import concurrent.futures
|
import concurrent.futures
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from scipy import sparse
|
from scipy import sparse
|
||||||
from backend.common.constants import XApproximateDistribution
|
from server.common.constants import XApproximateDistribution
|
||||||
|
|
||||||
|
|
||||||
@numba.njit(error_model="numpy", nogil=True)
|
@numba.njit(error_model="numpy", nogil=True)
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
import yaml
|
import yaml
|
||||||
from flatten_dict import unflatten
|
from flatten_dict import unflatten
|
||||||
|
|
||||||
from backend.server.default_config import get_default_config
|
from server.default_config import get_default_config
|
||||||
from backend.server.common.config.dataset_config import DatasetConfig
|
from server.common.config.dataset_config import DatasetConfig
|
||||||
from backend.server.common.config.server_config import ServerConfig
|
from server.common.config.server_config import ServerConfig
|
||||||
from backend.server.common.config.external_config import ExternalConfig
|
from server.common.config.external_config import ExternalConfig
|
||||||
from backend.common.errors import ConfigurationError
|
from server.common.errors import ConfigurationError
|
||||||
|
|
||||||
|
|
||||||
class AppConfig(object):
|
class AppConfig(object):
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import copy
|
import copy
|
||||||
|
|
||||||
from flatten_dict import flatten
|
from flatten_dict import flatten
|
||||||
from backend.common.errors import ConfigurationError
|
from server.common.errors import ConfigurationError
|
||||||
|
|
||||||
|
|
||||||
class BaseConfig(object):
|
class BaseConfig(object):
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
from backend.server import display_version as cellxgene_display_version
|
from server import display_version as cellxgene_display_version
|
||||||
|
|
||||||
|
|
||||||
def get_client_config(app_config, data_adaptor):
|
def get_client_config(app_config, data_adaptor):
|
||||||
+4
-4
@@ -1,10 +1,10 @@
|
|||||||
import os
|
import os
|
||||||
from os.path import splitext, isdir
|
from os.path import splitext, isdir
|
||||||
|
|
||||||
from backend.server.common.annotations.local_file_csv import AnnotationsLocalFile
|
from server.common.annotations.local_file_csv import AnnotationsLocalFile
|
||||||
from backend.server.common.config.base_config import BaseConfig
|
from server.common.config.base_config import BaseConfig
|
||||||
from backend.common.errors import ConfigurationError, AnnotationsError
|
from server.common.errors import ConfigurationError, AnnotationsError
|
||||||
from backend.server.data_common.matrix_loader import MatrixDataLoader
|
from server.data_common.matrix_loader import MatrixDataLoader
|
||||||
|
|
||||||
|
|
||||||
class DatasetConfig(BaseConfig):
|
class DatasetConfig(BaseConfig):
|
||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
from backend.server.common.config.base_config import BaseConfig
|
from server.common.config.base_config import BaseConfig
|
||||||
from backend.common.errors import ConfigurationError
|
from server.common.errors import ConfigurationError
|
||||||
from backend.common.utils.type_conversion_utils import convert_string_to_value
|
from server.common.utils.type_conversion_utils import convert_string_to_value
|
||||||
|
|
||||||
|
|
||||||
class ExternalConfig(BaseConfig):
|
class ExternalConfig(BaseConfig):
|
||||||
+6
-6
@@ -4,12 +4,12 @@ import warnings
|
|||||||
from os.path import basename
|
from os.path import basename
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from backend.server.common.config.base_config import BaseConfig
|
from server.common.config.base_config import BaseConfig
|
||||||
from backend.server.common.config import DEFAULT_SERVER_PORT, BIG_FILE_SIZE_THRESHOLD
|
from server.common.config import DEFAULT_SERVER_PORT, BIG_FILE_SIZE_THRESHOLD
|
||||||
from backend.common.utils.data_locator import discover_s3_region_name
|
from server.common.utils.data_locator import discover_s3_region_name
|
||||||
from backend.common.errors import ConfigurationError, DatasetAccessError
|
from server.common.errors import ConfigurationError, DatasetAccessError
|
||||||
from backend.common.utils.utils import is_port_available, find_available_port, custom_format_warning
|
from server.common.utils.utils import is_port_available, find_available_port, custom_format_warning
|
||||||
from backend.server.data_common.matrix_loader import MatrixDataLoader
|
from server.data_common.matrix_loader import MatrixDataLoader
|
||||||
|
|
||||||
|
|
||||||
class ServerConfig(BaseConfig):
|
class ServerConfig(BaseConfig):
|
||||||
@@ -8,8 +8,8 @@ https://github.com/chanzuckerberg/corpora-data-portal/blob/main/backend/schema/c
|
|||||||
import collections
|
import collections
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from backend.server.cli.upgrade import validate_version_str
|
from server.cli.upgrade import validate_version_str
|
||||||
from backend.server.common.utils.corpora_constants import CorporaConstants
|
from server.common.utils.corpora_constants import CorporaConstants
|
||||||
|
|
||||||
|
|
||||||
def corpora_get_versions_from_anndata(adata):
|
def corpora_get_versions_from_anndata(adata):
|
||||||
@@ -5,16 +5,16 @@ import pandas as pd
|
|||||||
from flatbuffers import Builder
|
from flatbuffers import Builder
|
||||||
from scipy import sparse
|
from scipy import sparse
|
||||||
|
|
||||||
from backend.common.utils.type_conversion_utils import get_encoding_dtype_of_array
|
from server.common.utils.type_conversion_utils import get_encoding_dtype_of_array
|
||||||
|
|
||||||
import backend.common.fbs.NetEncoding.Column as Column
|
import server.common.fbs.NetEncoding.Column as Column
|
||||||
import backend.common.fbs.NetEncoding.Float32Array as Float32Array
|
import server.common.fbs.NetEncoding.Float32Array as Float32Array
|
||||||
import backend.common.fbs.NetEncoding.Float64Array as Float64Array
|
import server.common.fbs.NetEncoding.Float64Array as Float64Array
|
||||||
import backend.common.fbs.NetEncoding.Int32Array as Int32Array
|
import server.common.fbs.NetEncoding.Int32Array as Int32Array
|
||||||
import backend.common.fbs.NetEncoding.JSONEncodedArray as JSONEncodedArray
|
import server.common.fbs.NetEncoding.JSONEncodedArray as JSONEncodedArray
|
||||||
import backend.common.fbs.NetEncoding.Matrix as Matrix
|
import server.common.fbs.NetEncoding.Matrix as Matrix
|
||||||
import backend.common.fbs.NetEncoding.TypedArray as TypedArray
|
import server.common.fbs.NetEncoding.TypedArray as TypedArray
|
||||||
import backend.common.fbs.NetEncoding.Uint32Array as Uint32Array
|
import server.common.fbs.NetEncoding.Uint32Array as Uint32Array
|
||||||
|
|
||||||
|
|
||||||
# Serialization helper
|
# Serialization helper
|
||||||
@@ -75,7 +75,7 @@ def read_gene_sets_tidycsv(gs_locator, context=None):
|
|||||||
# if this is the first non-comment row, assume it is a header and validate
|
# if this is the first non-comment row, assume it is a header and validate
|
||||||
# column names. OK if the user has extra columns after our initial set.
|
# column names. OK if the user has extra columns after our initial set.
|
||||||
if not haveReadHeader:
|
if not haveReadHeader:
|
||||||
if row[0:len(GENESETS_TIDYCSV_HEADER)] != GENESETS_TIDYCSV_HEADER:
|
if row[0 : len(GENESETS_TIDYCSV_HEADER)] != GENESETS_TIDYCSV_HEADER:
|
||||||
raise AnnotationsError("Gene set CSV file missing the required column header.")
|
raise AnnotationsError("Gene set CSV file missing the required column header.")
|
||||||
haveReadHeader = True
|
haveReadHeader = True
|
||||||
continue
|
continue
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
from flask import make_response, jsonify
|
from flask import make_response, jsonify
|
||||||
|
|
||||||
from backend.server import __version__ as cellxgene_version
|
from server import __version__ as cellxgene_version
|
||||||
from backend.common.utils.data_locator import DataLocator
|
from server.common.utils.data_locator import DataLocator
|
||||||
|
|
||||||
|
|
||||||
def _is_accessible(path, config):
|
def _is_accessible(path, config):
|
||||||
@@ -8,9 +8,9 @@ import json
|
|||||||
from flask import make_response, jsonify, current_app, abort
|
from flask import make_response, jsonify, current_app, abort
|
||||||
from werkzeug.urls import url_unquote
|
from werkzeug.urls import url_unquote
|
||||||
|
|
||||||
from backend.server.common.config.client_config import get_client_config
|
from server.common.config.client_config import get_client_config
|
||||||
from backend.common.constants import Axis, DiffExpMode, JSON_NaN_to_num_warning_msg
|
from server.common.constants import Axis, DiffExpMode, JSON_NaN_to_num_warning_msg
|
||||||
from backend.common.errors import (
|
from server.common.errors import (
|
||||||
FilterError,
|
FilterError,
|
||||||
JSONEncodingValueError,
|
JSONEncodingValueError,
|
||||||
PrepareError,
|
PrepareError,
|
||||||
@@ -22,8 +22,8 @@ from backend.common.errors import (
|
|||||||
ObsoleteRequest,
|
ObsoleteRequest,
|
||||||
UnsupportedSummaryMethod,
|
UnsupportedSummaryMethod,
|
||||||
)
|
)
|
||||||
from backend.common.genesets import summarizeQueryHash
|
from server.common.genesets import summarizeQueryHash
|
||||||
from backend.common.fbs.matrix import decode_matrix_fbs
|
from server.common.fbs.matrix import decode_matrix_fbs
|
||||||
|
|
||||||
|
|
||||||
def abort_and_log(code, logmsg, loglevel=logging.DEBUG, include_exc_info=False):
|
def abort_and_log(code, logmsg, loglevel=logging.DEBUG, include_exc_info=False):
|
||||||
@@ -10,7 +10,7 @@ from urllib.parse import urlsplit, urljoin
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from flask import json
|
from flask import json
|
||||||
|
|
||||||
from backend.common.errors import ConfigurationError
|
from server.common.errors import ConfigurationError
|
||||||
|
|
||||||
|
|
||||||
def find_available_port(host, port=5005):
|
def find_available_port(host, port=5005):
|
||||||
+9
-9
@@ -6,15 +6,15 @@ from packaging import version
|
|||||||
from pandas.core.dtypes.dtypes import CategoricalDtype
|
from pandas.core.dtypes.dtypes import CategoricalDtype
|
||||||
from scipy import sparse
|
from scipy import sparse
|
||||||
|
|
||||||
import backend.common.compute.diffexp_generic as diffexp_generic
|
import server.common.compute.diffexp_generic as diffexp_generic
|
||||||
import backend.common.compute.estimate_distribution as estimate_distribution
|
import server.common.compute.estimate_distribution as estimate_distribution
|
||||||
from backend.common.colors import convert_anndata_category_colors_to_cxg_category_colors
|
from server.common.colors import convert_anndata_category_colors_to_cxg_category_colors
|
||||||
from backend.common.constants import Axis, MAX_LAYOUTS, XApproximateDistribution
|
from server.common.constants import Axis, MAX_LAYOUTS, XApproximateDistribution
|
||||||
from backend.server.common.corpora import corpora_get_props_from_anndata
|
from server.common.corpora import corpora_get_props_from_anndata
|
||||||
from backend.common.errors import PrepareError, DatasetAccessError
|
from server.common.errors import PrepareError, DatasetAccessError
|
||||||
from backend.common.utils.type_conversion_utils import get_schema_type_hint_of_array
|
from server.common.utils.type_conversion_utils import get_schema_type_hint_of_array
|
||||||
from backend.server.data_common.data_adaptor import DataAdaptor
|
from server.data_common.data_adaptor import DataAdaptor
|
||||||
from backend.common.fbs.matrix import encode_matrix_fbs
|
from server.common.fbs.matrix import encode_matrix_fbs
|
||||||
|
|
||||||
anndata_version = version.parse(str(anndata.__version__)).release
|
anndata_version = version.parse(str(anndata.__version__)).release
|
||||||
|
|
||||||
@@ -5,12 +5,12 @@ import pandas as pd
|
|||||||
from scipy import sparse
|
from scipy import sparse
|
||||||
from server_timing import Timing as ServerTiming
|
from server_timing import Timing as ServerTiming
|
||||||
|
|
||||||
from backend.server.common.config.app_config import AppConfig
|
from server.common.config.app_config import AppConfig
|
||||||
from backend.common.constants import Axis, XApproximateDistribution
|
from server.common.constants import Axis, XApproximateDistribution
|
||||||
from backend.common.errors import FilterError, JSONEncodingValueError, ExceedsLimitError, UnsupportedSummaryMethod
|
from server.common.errors import FilterError, JSONEncodingValueError, ExceedsLimitError, UnsupportedSummaryMethod
|
||||||
from backend.common.utils.utils import jsonify_strict
|
from server.common.utils.utils import jsonify_strict
|
||||||
from backend.common.fbs.matrix import encode_matrix_fbs
|
from server.common.fbs.matrix import encode_matrix_fbs
|
||||||
from backend.common.genesets import validate_gene_sets
|
from server.common.genesets import validate_gene_sets
|
||||||
|
|
||||||
|
|
||||||
class DataAdaptor(metaclass=ABCMeta):
|
class DataAdaptor(metaclass=ABCMeta):
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
from backend.common.utils.data_locator import DataLocator
|
from server.common.utils.data_locator import DataLocator
|
||||||
from backend.common.errors import DatasetAccessError
|
from server.common.errors import DatasetAccessError
|
||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
|
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ class MatrixDataLoader(object):
|
|||||||
raise DatasetAccessError("Dataset does not have an allowed type.")
|
raise DatasetAccessError("Dataset does not have an allowed type.")
|
||||||
|
|
||||||
if self.matrix_data_type == MatrixDataType.H5AD:
|
if self.matrix_data_type == MatrixDataType.H5AD:
|
||||||
from backend.server.data_anndata.anndata_adaptor import AnndataAdaptor
|
from server.data_anndata.anndata_adaptor import AnndataAdaptor
|
||||||
|
|
||||||
self.matrix_type = AnndataAdaptor
|
self.matrix_type = AnndataAdaptor
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
[flake8]
|
[flake8]
|
||||||
max-line-length = 120
|
max-line-length = 120
|
||||||
ignore = E203, W503
|
ignore = E203, W503
|
||||||
exclude = backend/common/fbs/NetEncoding/,.git,__pycache__,venv,old,build,dist
|
exclude = server/common/fbs/NetEncoding/,.git,__pycache__,venv,old,build,dist
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ from setuptools import setup, find_packages
|
|||||||
with open("README.md", "rb") as fh:
|
with open("README.md", "rb") as fh:
|
||||||
long_description = fh.read().decode()
|
long_description = fh.read().decode()
|
||||||
|
|
||||||
with open("backend/server/requirements.txt") as fh:
|
with open("server/requirements.txt") as fh:
|
||||||
requirements = fh.read().splitlines()
|
requirements = fh.read().splitlines()
|
||||||
|
|
||||||
with open("backend/server/requirements-prepare.txt") as fh:
|
with open("server/requirements-prepare.txt") as fh:
|
||||||
requirements_prepare = fh.read().splitlines()
|
requirements_prepare = fh.read().splitlines()
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
@@ -39,6 +39,6 @@ setup(
|
|||||||
"Programming Language :: Python :: 3 :: Only",
|
"Programming Language :: Python :: 3 :: Only",
|
||||||
"Topic :: Scientific/Engineering :: Bio-Informatics",
|
"Topic :: Scientific/Engineering :: Bio-Informatics",
|
||||||
],
|
],
|
||||||
entry_points={"console_scripts": ["cellxgene = backend.server.cli.cli:cli"]},
|
entry_points={"console_scripts": ["cellxgene = server.cli.cli:cli"]},
|
||||||
extras_require=dict(prepare=requirements_prepare),
|
extras_require=dict(prepare=requirements_prepare),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import string
|
|||||||
from os import popen
|
from os import popen
|
||||||
|
|
||||||
PROJECT_ROOT = popen("git rev-parse --show-toplevel").read().strip()
|
PROJECT_ROOT = popen("git rev-parse --show-toplevel").read().strip()
|
||||||
FIXTURES_ROOT = PROJECT_ROOT + "/backend/test/fixtures"
|
FIXTURES_ROOT = PROJECT_ROOT + "/test/fixtures"
|
||||||
H5AD_FIXTURE = FIXTURES_ROOT + "/pbmc3k-CSC-gz.h5ad"
|
H5AD_FIXTURE = FIXTURES_ROOT + "/pbmc3k-CSC-gz.h5ad"
|
||||||
|
|
||||||
|
|
||||||
@@ -5,8 +5,8 @@ This code will need to be updated if fbs/matrix.fbs changes. For more informatio
|
|||||||
server/data_common/fbs/
|
server/data_common/fbs/
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import backend.common.fbs.NetEncoding.Matrix as Matrix
|
import server.common.fbs.NetEncoding.Matrix as Matrix
|
||||||
from backend.common.fbs.matrix import deserialize_typed_array
|
from server.common.fbs.matrix import deserialize_typed_array
|
||||||
|
|
||||||
|
|
||||||
def decode_matrix_FBS(buf):
|
def decode_matrix_FBS(buf):
|
||||||
Vendored
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user