Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v0.3.7 #109

Merged
merged 5 commits into from
Jul 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# Change log

## v0.3.7

### Main changes

- Separate `Dataset.from_dataseries` and `Dataset.from_flexilims` to avoid confusion

### Minor

- `get_children` output is filtered to contain only relevant columns when `children_datatype` is not None

### Bugfixes
## v0.3.6

### Main changes
Expand Down
21 changes: 13 additions & 8 deletions flexiznam/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -968,11 +968,14 @@ def get_children(
if parent_id is None:
assert parent_name is not None, "Must provide either parent_id or parent_name"
parent_id = get_id(parent_name, flexilims_session=flexilims_session)
results = format_results(flexilims_session.get_children(parent_id))
results = format_results(
flexilims_session.get_children(parent_id), return_list=True
)
if not len(results):
return results
return pd.DataFrame(results)
if children_datatype is not None:
results = results.loc[results.type == children_datatype, :]
results = [r for r in results if r["type"] == children_datatype]
results = pd.DataFrame(results)
results.set_index("name", drop=False, inplace=True)
return results

Expand Down Expand Up @@ -1046,8 +1049,8 @@ def get_datasets(
datapath_dict[recording_id] = datapaths
else:
datapath_dict[recording_id] = [
flexiznam.Dataset.from_flexilims(
data_series=ds, flexilims_session=flexilims_session
flexiznam.Dataset.from_dataseries(
dataseries=ds, flexilims_session=flexilims_session
)
for _, ds in datasets.iterrows()
]
Expand Down Expand Up @@ -1085,7 +1088,7 @@ def generate_name(datatype, name, flexilims_session=None, project_id=None):
return name


def format_results(results):
def format_results(results, return_list=False):
"""Make request output a nice DataFrame

This will crash if any attribute is also present in the flexilims reply,
Expand All @@ -1095,6 +1098,7 @@ def format_results(results):

Args:
results (:obj:`list` of :obj:`dict`): Flexilims reply
return_list (bool): if True, return a list of dicts instead of a DataFrame

Returns:
:py:class:`pandas.DataFrame`: Reply formatted as a DataFrame
Expand All @@ -1108,5 +1112,6 @@ def format_results(results):
)
result[attr_name] = attr_value
result.pop("attributes")
df = pd.DataFrame(results)
return df
if return_list:
return results
return pd.DataFrame(results)
67 changes: 40 additions & 27 deletions flexiznam/schema/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,44 +56,57 @@ def from_flexilims(
project=None,
name=None,
id=None,
data_series=None,
flexilims_session=None,
):
"""Loads a dataset from flexilims.
"""Loads a dataset from flexilims

If the dataset_type attribute of the flexilims entry defined in
Dataset.SUBCLASSES,this subclass will be used. Otherwise a generic Dataset is
returned

Args:
project: Name of the project or hexadecimal project_id
name: Unique name of the dataset on flexilims
id: Hexadecimal id of the dataset on flexilims
data_series: default to None. pd.Series as returned by flz.get_entities.
If provided, supersedes project, name and id.
flexilims_session: authentication session to access flexilims
project (str, optional): Name of the project or hexadecimal project_id. If
not provided, can be read from flexilims_session
name (str, optional): Unique name of the dataset on flexilims. Ignored if
`dataseries` is provided
id (str, optional): Hexadecimal id of the dataset on flexilims. Ignored if
`dataseries` is provided
flexilims_session (flexilims.Session, optional): authentication session to
access flexilims.
"""
if data_series is not None:
if (project is not None) or (name is not None):
raise AttributeError("Specify either data_series OR project + name/id")
else:
data_series = flz.get_entity(
project_id=project,
datatype="dataset",
name=name,
id=id,
flexilims_session=flexilims_session,
dataseries = flz.get_entity(
project_id=project,
datatype="dataset",
name=name,
id=id,
flexilims_session=flexilims_session,
)

if dataseries is None:
if project is None:
project = flexilims_session.project_id
raise FlexilimsError(
"No dataset named {} in project {}".format(name, project)
)
ds = Dataset.from_dataseries(dataseries, flexilims_session=flexilims_session)
return ds

if data_series is None:
if project is None:
project = flexilims_session.project_id
raise FlexilimsError(
"No dataset named {} in project {}".format(name, project)
)
dataset_type = data_series.dataset_type
@staticmethod
def from_dataseries(
dataseries,
flexilims_session=None,
):
"""Create dataset from a flexilims dataseries

This function does not call flexilims, but uses the dataseries object directly.
Args:
dataseries (flexilims.DataSeries): flexilims dataseries object
flexilims_session (flexilims.Session, optional): authentication session to
access flexilims. Will be added to dataset object.
"""
dataset_type = dataseries.dataset_type

kwargs = Dataset._format_series_to_kwargs(data_series)
kwargs = Dataset._format_series_to_kwargs(dataseries)
name = kwargs.pop("name")
kwargs["flexilims_session"] = flexilims_session
if dataset_type in Dataset.SUBCLASSES:
Expand Down Expand Up @@ -204,7 +217,7 @@ def from_origin(
)
elif conflicts == "skip" or conflicts == "overwrite":
if len(processed) == 1:
return Dataset.from_flexilims(data_series=processed.iloc[0])
return Dataset.from_dataseries(dataseries=processed.iloc[0])
else:
raise flz.errors.NameNotUniqueError(
"{} {} datasets with name starting by {} exists for {}, "
Expand Down
4 changes: 2 additions & 2 deletions flexiznam/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -465,8 +465,8 @@ def _check_path(output, element, flexilims_session, recursive, error_only):
output.append([element.name, element.type, "Folder found", " ".join(ok), 0])
else:
try:
ds = Dataset.from_flexilims(
flexilims_session=flexilims_session, data_series=element
ds = Dataset.from_dataseries(
flexilims_session=flexilims_session, dataseries=element
)
if not ds.path_full.exists():
output.append(
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name="flexiznam",
version="v0.3.6",
version="v0.3.7",
url="https://github.com/znamlab/flexznam",
license="MIT",
author="Antonin Blot",
Expand Down
2 changes: 1 addition & 1 deletion tests/test-results/pytest_in_tests.xml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<?xml version="1.0" encoding="utf-8"?><testsuites><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="51" time="508.400" timestamp="2023-07-04T17:50:17.000292" hostname="FM70R4W0XG"><testcase classname="tests.test_2p" name="test_create_yaml" time="6.411" /><testcase classname="tests.test_2p" name="test_parse_yaml" time="2.847" /><testcase classname="tests.test_2p" name="test_flm" time="16.873" /><testcase classname="tests.test_barseq" name="test_create_yaml" time="1.543" /><testcase classname="tests.test_barseq" name="test_parse_yaml" time="5.873" /><testcase classname="tests.test_barseq" name="test_flm" time="31.002" /><testcase classname="tests.test_components.test_cli" name="test_config" time="0.212" /><testcase classname="tests.test_components.test_cli" name="test_add_password" time="0.017" /><testcase classname="tests.test_components.test_cli" name="test_create_yaml" time="0.525" /><testcase classname="tests.test_components.test_cli" name="test_make_full_yaml" time="6.748" /><testcase classname="tests.test_components.test_cli" name="test_upload" time="20.516" /><testcase classname="tests.test_components.test_cli" name="test_flm_issues" time="51.080" /><testcase classname="tests.test_components.test_main" name="test_get_flexilims_session" time="0.226" /><testcase classname="tests.test_components.test_main" name="test_format_results" time="0.013" /><testcase classname="tests.test_components.test_main" name="test_get_experimental_sessions" time="0.696" /><testcase classname="tests.test_components.test_main" name="test_get_entities" time="1.038" /><testcase classname="tests.test_components.test_main" name="test_get_entity" time="0.055" /><testcase classname="tests.test_components.test_main" name="test_get_mouse_id" time="0.219" /><testcase classname="tests.test_components.test_main" name="test_get_datasets" time="3.037" /><testcase classname="tests.test_components.test_main" name="test_add_mouse" time="2.969" /><testcase classname="tests.test_components.test_main" name="test_generate_name" time="2.836" /><testcase classname="tests.test_components.test_main" name="test_get_children" time="2.332" /><testcase classname="tests.test_components.test_main" name="test_add_entity" time="1.769" /><testcase classname="tests.test_components.test_main" name="test_update_entity" time="4.204" /><testcase classname="tests.test_components.test_mcms" name="test_get_mouse_df" time="0.508" /><testcase classname="tests.test_components.test_mcms" name="test_get_procedures" time="0.328" /><testcase classname="tests.test_components.test_utils" name="test_create_config" time="0.053" /><testcase classname="tests.test_components.test_utils" name="test_update_config" time="0.227" /><testcase classname="tests.test_components.test_utils" name="test_passwd_creation" time="0.038" /><testcase classname="tests.test_components.test_utils" name="test_check_flexilims_paths" time="59.582" /><testcase classname="tests.test_components.test_utils" name="test_check_flexilims_names" time="58.108" /><testcase classname="tests.test_components.test_utils" name="test_add_genealogy" time="118.553" /><testcase classname="tests.test_components.test_utils" name="test_clean_recursively" time="0.012" /><testcase classname="tests.test_components.test_utils" name="test_add_missing_paths" time="28.553" /><testcase classname="tests.test_components.test_utils" name="test_check_attribute" time="63.925" /><testcase classname="tests.test_components.tests_schema.test_camera_data" name="test_create_directly" time="0.010" /><testcase classname="tests.test_components.tests_schema.test_camera_data" name="test_create_from_folder" time="1.135" /><testcase classname="tests.test_components.tests_schema.test_camera_data" name="test_create_from_flexilims" time="0.898" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_dataset" time="0.011" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_constructor" time="0.008" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_dataset_flexilims_integration" time="0.936" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_from_flexilims" time="0.939" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_from_origin" time="2.929" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_update_flexilims" time="7.092" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_dataset_paths" time="0.217" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_project_project_id" time="0.012" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_dataset_type_enforcer" time="0.010" /><testcase classname="tests.test_components.tests_schema.test_harp" name="test_harp" time="0.304" /><testcase classname="tests.test_components.tests_schema.test_microscopy_data" name="test_from_folder" time="0.093" /><testcase classname="tests.test_components.tests_schema.test_scanimage_data" name="test_scanimage" time="0.298" /><testcase classname="tests.test_components.tests_schema.test_sequencing_data" name="test_from_folder" time="0.244" /></testsuite></testsuites>
<?xml version="1.0" encoding="utf-8"?><testsuites><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="52" time="1217.486" timestamp="2023-07-06T16:21:50.352629" hostname="FM70R4W0XG"><testcase classname="tests.test_2p" name="test_create_yaml" time="5.630" /><testcase classname="tests.test_2p" name="test_parse_yaml" time="4.056" /><testcase classname="tests.test_2p" name="test_flm" time="37.068" /><testcase classname="tests.test_barseq" name="test_create_yaml" time="3.134" /><testcase classname="tests.test_barseq" name="test_parse_yaml" time="9.162" /><testcase classname="tests.test_barseq" name="test_flm" time="57.617" /><testcase classname="tests.test_components.test_cli" name="test_config" time="0.168" /><testcase classname="tests.test_components.test_cli" name="test_add_password" time="0.016" /><testcase classname="tests.test_components.test_cli" name="test_create_yaml" time="0.451" /><testcase classname="tests.test_components.test_cli" name="test_make_full_yaml" time="4.992" /><testcase classname="tests.test_components.test_cli" name="test_upload" time="35.318" /><testcase classname="tests.test_components.test_cli" name="test_flm_issues" time="110.427" /><testcase classname="tests.test_components.test_main" name="test_get_flexilims_session" time="0.210" /><testcase classname="tests.test_components.test_main" name="test_format_results" time="0.016" /><testcase classname="tests.test_components.test_main" name="test_get_experimental_sessions" time="1.185" /><testcase classname="tests.test_components.test_main" name="test_get_entities" time="2.557" /><testcase classname="tests.test_components.test_main" name="test_get_entity" time="0.055" /><testcase classname="tests.test_components.test_main" name="test_get_mouse_id" time="0.655" /><testcase classname="tests.test_components.test_main" name="test_get_datasets" time="6.716" /><testcase classname="tests.test_components.test_main" name="test_add_mouse" time="6.767" /><testcase classname="tests.test_components.test_main" name="test_generate_name" time="6.369" /><testcase classname="tests.test_components.test_main" name="test_get_children" time="10.536" /><testcase classname="tests.test_components.test_main" name="test_add_entity" time="2.100" /><testcase classname="tests.test_components.test_main" name="test_update_entity" time="9.515" /><testcase classname="tests.test_components.test_mcms" name="test_get_mouse_df" time="0.502" /><testcase classname="tests.test_components.test_mcms" name="test_get_procedures" time="0.308" /><testcase classname="tests.test_components.test_utils" name="test_create_config" time="0.034" /><testcase classname="tests.test_components.test_utils" name="test_update_config" time="0.231" /><testcase classname="tests.test_components.test_utils" name="test_passwd_creation" time="0.049" /><testcase classname="tests.test_components.test_utils" name="test_check_flexilims_paths" time="206.289" /><testcase classname="tests.test_components.test_utils" name="test_check_flexilims_names" time="136.485" /><testcase classname="tests.test_components.test_utils" name="test_add_genealogy" time="276.362" /><testcase classname="tests.test_components.test_utils" name="test_clean_recursively" time="0.008" /><testcase classname="tests.test_components.test_utils" name="test_add_missing_paths" time="63.834" /><testcase classname="tests.test_components.test_utils" name="test_check_attribute" time="147.412" /><testcase classname="tests.test_components.tests_schema.test_camera_data" name="test_create_directly" time="0.007" /><testcase classname="tests.test_components.tests_schema.test_camera_data" name="test_create_from_folder" time="1.996" /><testcase classname="tests.test_components.tests_schema.test_camera_data" name="test_create_from_flexilims" time="2.030" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_dataset" time="0.022" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_constructor" time="0.011" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_dataset_flexilims_integration" time="2.067" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_from_flexilims" time="2.082" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_from_dataseries" time="0.014" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_from_origin" time="46.158" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_update_flexilims" time="14.295" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_dataset_paths" time="0.803" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_project_project_id" time="0.011" /><testcase classname="tests.test_components.tests_schema.test_datasets" name="test_dataset_type_enforcer" time="0.013" /><testcase classname="tests.test_components.tests_schema.test_harp" name="test_harp" time="0.571" /><testcase classname="tests.test_components.tests_schema.test_microscopy_data" name="test_from_folder" time="0.064" /><testcase classname="tests.test_components.tests_schema.test_scanimage_data" name="test_scanimage" time="0.477" /><testcase classname="tests.test_components.tests_schema.test_sequencing_data" name="test_from_folder" time="0.385" /></testsuite></testsuites>
11 changes: 9 additions & 2 deletions tests/test_components/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import flexiznam.main as flz
from flexiznam.config import PARAMETERS, get_password
from flexiznam.errors import FlexilimsError, NameNotUniqueError
from tests.tests_resources.data_for_testing import MOUSE_ID
from tests.tests_resources.data_for_testing import MOUSE_ID, SESSION

# Test functions from main.py
from flexiznam.schema import Dataset
Expand Down Expand Up @@ -180,6 +180,13 @@ def test_get_children(flm_sess):
assert isinstance(res, pd.DataFrame)
res = flz.get_children(parent_name="mouse_physio_2p", flexilims_session=flm_sess)
assert len(res) == 1
res_all = flz.get_children(parent_name=SESSION, flexilims_session=flm_sess)
assert (res_all.type != "recording").sum() != 0
res_part = flz.get_children(
parent_name=SESSION, flexilims_session=flm_sess, children_datatype="recording"
)
assert (res_part.type != "recording").sum() == 0
assert res_all.shape[1] > res_part.shape[1]


def test_add_entity(flm_sess):
Expand Down Expand Up @@ -251,7 +258,7 @@ def test_update_entity(flm_sess):
assert dbval["attributes"]["acq_num"] is None

# restore database state
ds = Dataset.from_flexilims(data_series=original_entity, flexilims_session=flm_sess)
ds = Dataset.from_dataseries(dataseries=original_entity, flexilims_session=flm_sess)
ds.update_flexilims(mode="overwrite")
new_entity = flz.get_entity(
datatype="dataset", name=dataset_name, flexilims_session=flm_sess
Expand Down
Loading
Loading