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:
Madison Dunitz
2021-09-20 18:50:06 -07:00
committed by GitHub
parent 97caa5bcaa
commit 3ebbb0ccbf
217 changed files with 277 additions and 292 deletions
+1 -1
View File
@@ -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
View File
@@ -2,4 +2,4 @@ bin
client client
dist dist
docs docs
backend server
+5 -5
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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/*
+15 -20
View File
@@ -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
-11
View File
@@ -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 \
-22
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -1 +1 @@
-r ./backend/server/requirements.txt -r ./server/requirements.txt
+12
View File
@@ -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)
@@ -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):
@@ -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}$")
@@ -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()
@@ -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,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):
@@ -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):
@@ -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):
@@ -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):
@@ -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 -1
View File
@@ -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 -3
View File
@@ -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):

Some files were not shown because too many files have changed in this diff Show More