Skip to content

Commit

Permalink
Merge branch 'main' into debug_mac_dist
Browse files Browse the repository at this point in the history
  • Loading branch information
rly committed Sep 12, 2023
2 parents 92e1f46 + 665de6d commit 31ac2dc
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 34 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/psf/black
rev: 23.7.0
rev: 23.9.1
hooks:
- id: black
exclude: ^docs/
Expand Down
7 changes: 7 additions & 0 deletions docs/format_support.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Ecosystem Format Support
=======================================
The following is a live record of all the supported formats in the NWB GUIDE and underlying ecosystem.

.. raw:: html

<iframe style="width: 100%; height: 50vh; border: none;" src="https://catalystneuro.github.io/format-support-table/"></iframe>
1 change: 1 addition & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ The resulting files are fully compliant with the best practices expected of the
:maxdepth: 2

developer_guide
format_support
25 changes: 0 additions & 25 deletions environments/environment-Windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,3 @@ dependencies:
- pytest == 7.2.2
- pytest-cov == 4.1.0
- email-validator == 2.0.0

# name: nwb-guide
# channels:
# - conda-forge
# - defaults
# dependencies:
# - python = 3.9.18
# - PyInstaller = 5.13.0
# - nodejs = 18.16.1
# - numcodecs = 0.11.0 # not sure if this is needed
# - pywin32 = 303 # not sure if this is needed
# # install these from conda-forge so that dependent packages get included in the distributable
# - jsonschema = 4.18.0 # installs jsonschema-specifications
# - pydantic[email] = 2.0.2 # installs email-validator
# - pip
# - pip:
# - chardet == 5.1.0
# - configparser == 6.0.0
# - flask == 2.3.2
# - flask-cors == 4.0.0
# - flask_restx == 1.1.0
# - neuroconv @ git+https://github.com/catalystneuro/neuroconv.git@main#neuroconv[full]
# - hdmf >= 3.7.0
# - pytest == 7.4.0
# - pytest-cov == 4.1.0
24 changes: 24 additions & 0 deletions pyflask/apis/startup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"""API endpoint definitions for startup operations."""
from flask_restx import Namespace, Resource

from errorHandlers import notBadRequestException

startup_api = Namespace("startup", description="API for startup commands related to the NWB GUIDE.")

parser = startup_api.parser()
Expand All @@ -19,3 +21,25 @@ class Echo(Resource):
def get(self):
args = parser.parse_args()
return args["arg"]


@startup_api.route("/preload-imports")
class PreloadImports(Resource):
"""
Preload various imports on startup instead of waiting for them later on.
Python caches all modules that have been imported at least once in the same kernel,
even if their namespace is not always exposed to a given scope. This means that later imports
simply expose the cached namespaces to their scope instead of retriggering the entire import.
"""

@startup_api.doc(responses={200: "Success", 400: "Bad Request", 500: "Internal server error"})
def get(self):
try:
import neuroconv

return True
except Exception as exception:
if notBadRequestException(exception=exception):
startup_api.abort(500, str(exception))
raise exception
7 changes: 3 additions & 4 deletions pyflask/tests/test_neuroconv.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
from utils import get, post, get_converter_output_schema


# --------------------- Tests ---------------------
# Accesses the dictionary of all interfaces and their metadata
def test_get_all_interfaces(client):
"""Accesses the dictionary of all interfaces and their metadata."""
validate(
get("neuroconv", client),
schema={
Expand All @@ -23,14 +22,14 @@ def test_get_all_interfaces(client):
)


# Test single interface schema request
def test_single_schema_request(client):
"""Test single interface schema request."""
interfaces = {"myname": "SpikeGLXRecordingInterface"}
validate(post("neuroconv/schema", interfaces, client), schema=get_converter_output_schema(interfaces))


# Uses the NWBConverter Class to combine multiple interfaces
def test_multiple_schema_request(client):
"""Uses the NWBConverter Class to combine multiple interfaces."""
interfaces = {"myname": "SpikeGLXRecordingInterface", "myphyinterface": "PhySortingInterface"}
data = post("/neuroconv/schema", interfaces, client)
validate(data, schema=get_converter_output_schema(interfaces))
7 changes: 7 additions & 0 deletions pyflask/tests/test_startup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from utils import get, post, get_converter_output_schema


def test_preload_imports(client):
"""Verify that the preload import endpoint returned good status."""
result = get("startup/preload-imports", client)
assert result == True
6 changes: 5 additions & 1 deletion src/renderer/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,18 +94,22 @@ async function checkInternetConnection() {
return hasInternet
};

// Check if the Pysoda server is live
// Check if the Flask server is live
const serverIsLiveStartup = async () => {
const echoResponse = await fetch(`${baseUrl}/startup/echo?arg=server ready`).then(res => res.json()).catch(e => e)
return echoResponse === "server ready" ? true : false;
};

// Preload Flask imports for faster on-demand operations
const preloadFlaskImports = async () => await fetch(`${baseUrl}/startup/preload-imports`).then(res => res.json()).catch(e => e)

let openPythonStatusNotyf: undefined | any;

async function pythonServerOpened() {

// Confirm requests are actually received by the server
const isLive = await serverIsLiveStartup()
if (isLive) await preloadFlaskImports() // initiate preload of Flask imports
if (!isLive) return pythonServerClosed()

// Update server status and throw a notification
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ export class GuidedStructurePage extends Page {
};

async updated() {
const selected = this.info.globalState.interfaces;
const { interfaces = {} } = this.info.globalState;

if (Object.keys(selected).length > 0) this.list.emptyMessage = "Loading valid interfaces...";
if (Object.keys(interfaces).length > 0) this.list.emptyMessage = "Loading valid interfaces...";

this.search.options = await fetch(`${baseUrl}/neuroconv`)
.then((res) => res.json())
Expand All @@ -93,7 +93,7 @@ export class GuidedStructurePage extends Page {
)
.catch((e) => console.error(e));

for (const [key, name] of Object.entries(selected || {})) {
for (const [key, name] of Object.entries(interfaces)) {
let found = this.search.options?.find((o) => o.value === name);

// If not found, spoof based on the key and names provided previously
Expand Down

0 comments on commit 31ac2dc

Please sign in to comment.