diff --git a/app/views/studies/show.html.erb b/app/views/studies/show.html.erb
index 869a367c7b..13068480c2 100644
--- a/app/views/studies/show.html.erb
+++ b/app/views/studies/show.html.erb
@@ -269,10 +269,10 @@
- <% if @allow_downloads %>
+ <% if !@study.detached %>
<%= render partial: '/layouts/download_link', locals: {study: @study, study_file: file} %>
<% else %>
- <%= button_to 'Currently Unavailable', '#/', class: 'btn btn-danger disabled-download', disabled: true %>
+ <%= button_to 'Workspace unavailable', '#/', class: 'btn btn-danger disabled-download', disabled: true %>
<% end %>
|
diff --git a/bin/remount_portal_source.sh b/bin/remount_portal_source.sh
new file mode 100644
index 0000000000..a06db614db
--- /dev/null
+++ b/bin/remount_portal_source.sh
@@ -0,0 +1,16 @@
+#! /usr/bin/env bash
+
+# script to add to the root crontab to remount attached disk in correct location after scheduled instance restart,
+# which is used for staging and development VMs, but not production
+
+# crontab should be entered as follows
+# @reboot /root/remout_portal_source.sh > /dev/null 2>&1
+
+# More context: https://github.com/broadinstitute/single_cell_portal_core/pull/2216
+MOUNT_DIR=$(ls -l /dev/disk/by-id/google-* | grep google-singlecell-data-disk | awk -F '/' '{ print $NF }')
+if [[ -n "$MOUNT_DIR" ]]; then
+ echo "$(date): remounting google-singlecell-data-disk from /dev/$MOUNT_DIR" >> /home/jenkins/remount_log.txt
+ mount -o discard,defaults /dev/$MOUNT_DIR /home/jenkins/deployments
+else
+ echo -e "$(date): cannot remount google-singlecell-data-disk, available disks:\n$(ls -l /dev/disk/by-id/google-*)" >> /home/jenkins/remount_log.txt
+fi
diff --git a/bin/restart_portal_container.sh b/bin/restart_portal_container.sh
new file mode 100644
index 0000000000..41a55409f2
--- /dev/null
+++ b/bin/restart_portal_container.sh
@@ -0,0 +1,13 @@
+#! /usr/bin/env bash
+
+# script to add to root crontab on a deployed host to check for crashed Docker containers and restart
+# crontab entry should be as follows:
+# */5 * * * * /root/restart_portal_container.sh > /dev/null 2>&1
+
+# More context: https://github.com/broadinstitute/single_cell_portal_core/pull/2216
+docker ps --filter "status=exited" | grep -e 'single_cell' | while read -r line ; do
+ container_id=`echo $line | awk '{print $1}'`
+ container_name=`echo $line | awk '{print $NF}'`
+ echo "Restarting $container_name ($container_id) on $(date)" >> /home/jenkins/deployments/single_cell_portal_core/log/cron_out.log
+ docker restart $container_id
+done
diff --git a/config/routes.rb b/config/routes.rb
index d9f8591940..62a7e62e0d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -87,6 +87,7 @@
get 'studies/:accession', to: 'site#view_study', as: :site_study_view
get 'studies/:accession/download', to: 'site#download_data', as: :site_study_download_data
get 'studies/:accession/stream', to: 'site#stream_data', as: :site_study_stream_data
+ post 'studies/:accession/differential_expression', to: 'site#submit_differential_expression', as: :site_study_submit_differential_expression
get 'studies/:accession/renew_read_only_access_token', to: 'site#renew_read_only_access_token', as: :site_renew_read_only_access_token
get 'renew_user_access_token', to: 'site#renew_user_access_token', as: :site_renew_user_access_token
diff --git a/rails_startup.bash b/rails_startup.bash
index 8822e5b66a..b8886844e5 100755
--- a/rails_startup.bash
+++ b/rails_startup.bash
@@ -127,6 +127,7 @@ fi
echo "*** ADDING DAILY RESET OF USER DOWNLOAD QUOTAS ***"
(crontab -u app -l ; echo "@daily . /home/app/.cron_env ; cd /home/app/webapp/; /home/app/webapp/bin/rails runner -e $PASSENGER_APP_ENV \"DownloadQuotaService.reset_all_quotas\" >> /home/app/webapp/log/cron_out.log 2>&1") | crontab -u app -
+(crontab -u app -l ; echo "@weekly . /home/app/.cron_env ; cd /home/app/webapp/; /home/app/webapp/bin/rails runner -e $PASSENGER_APP_ENV \"DifferentialExpressionService.reset_all_user_quotas\" >> /home/app/webapp/log/cron_out.log 2>&1") | crontab -u app -
echo "*** COMPLETED ***"
echo "*** LOCALIZING USER ASSETS ***"
diff --git a/test/api/api_site_controller_test.rb b/test/api/api_site_controller_test.rb
index 566586bd40..16ef839c5b 100644
--- a/test/api/api_site_controller_test.rb
+++ b/test/api/api_site_controller_test.rb
@@ -38,6 +38,7 @@ class ApiSiteControllerTest < ActionDispatch::IntegrationTest
end
teardown do
+ DifferentialExpressionResult.delete_all
OmniAuth.config.mock_auth[:google_oauth2] = nil
reset_user_tokens
@study.update(public: true)
@@ -156,4 +157,143 @@ class ApiSiteControllerTest < ActionDispatch::IntegrationTest
"Did not return correct download url for external fastq; #{external_entry['download_url']} != #{external_sequence_file.human_fastq_url}"
end
end
+
+ test 'should submit differential expression request' do
+ user = FactoryBot.create(:api_user, test_array: @@users_to_clean)
+ study = FactoryBot.create(:detached_study, name_prefix: 'DiffExp Submit Test', user:, test_array: @@studies_to_clean)
+ cells = %w[A B C D E F G]
+ coordinates = 1.upto(7).to_a
+ species = %w[dog cat dog dog cat cat cat]
+ cell_types = ['B cell', 'T cell', 'B cell', 'T cell', 'T cell', 'B cell', 'B cell']
+ custom_cell_types = ['Custom 1', 'Custom 2', 'Custom 1', 'Custom 2', 'Custom 1', 'Custom 2', 'Custom 2']
+ raw_matrix = FactoryBot.create(
+ :expression_file, name: 'raw.txt', study:, expression_file_info: {
+ is_raw_counts: true, units: 'raw counts', library_preparation_protocol: 'Drop-seq',
+ biosample_input_type: 'Whole cell', modality: 'Proteomic' }
+ )
+ cluster_file = FactoryBot.create(:cluster_file,
+ name: 'umap',
+ study:,
+ cell_input: { x: coordinates, y: coordinates, cells: })
+ cluster_group = ClusterGroup.find_by(study:, study_file: cluster_file)
+
+ FactoryBot.create(
+ :metadata_file, name: 'metadata.txt', study:, cell_input: cells, annotation_input: [
+ { name: 'species', type: 'group', values: species },
+ { name: 'cell_type__ontology_label', type: 'group', values: cell_types },
+ { name: 'cell_type__custom', type: 'group', values: custom_cell_types }]
+ )
+
+ DifferentialExpressionResult.create(
+ study:, cluster_group:, annotation_name: 'species', annotation_scope: 'study', matrix_file_id: raw_matrix.id,
+ pairwise_comparisons: { dog: %w[cat]}
+ )
+ mock_not_detached study, :find_by do
+ sign_in_and_update user
+
+ # stub :raw_matrix_for_cluster_cells to avoid having to create cell arrays manually
+ ClusterVizService.stub :raw_matrix_for_cluster_cells, raw_matrix do
+ valid_params = [
+ {
+ cluster_name: 'umap', annotation_name: 'cell_type__ontology_label',
+ annotation_scope: 'study', de_type: 'rest'
+ },
+ {
+ cluster_name: 'umap', annotation_name: 'cell_type__ontology_label',
+ annotation_scope: 'study', de_type: 'pairwise', group1: 'B cell', group2: 'T cell'
+ }
+ ]
+ # test normal submission
+ valid_params.each do |job_params|
+ job_mock = Minitest::Mock.new
+ job_mock.expect :push_remote_and_launch_ingest, nil
+ delay_mock = Minitest::Mock.new
+ delay_mock.expect :delay, job_mock
+ IngestJob.stub :new, delay_mock do
+ execute_http_request(:post,
+ api_v1_site_study_submit_differential_expression_path(accession: study.accession),
+ request_payload: job_params,
+ user:)
+ assert_response 204
+ delay_mock.verify
+ end
+ end
+ # check for existing results
+ existing_params = {
+ cluster_name: 'umap', annotation_name: 'species',
+ annotation_scope: 'study', de_type: 'pairwise', group1: 'dog', group2: 'cat'
+ }
+ execute_http_request(:post,
+ api_v1_site_study_submit_differential_expression_path(accession: study.accession),
+ request_payload: existing_params,
+ user:)
+ assert_response 409
+ # request parameter validations
+ execute_http_request(:post,
+ api_v1_site_study_submit_differential_expression_path(accession: study.accession),
+ request_payload: { cluster_name: 'foo'},
+ user:)
+ assert_response :not_found
+ execute_http_request(:post,
+ api_v1_site_study_submit_differential_expression_path(accession: study.accession),
+ request_payload: {
+ cluster_name: 'umap', annotation_name: 'foo', annotation_scope: 'study'
+ },
+ user:)
+ assert_response :not_found
+
+ execute_http_request(:post,
+ api_v1_site_study_submit_differential_expression_path(accession: study.accession),
+ request_payload: {
+ cluster_name: 'umap', annotation_name: 'cell_type__ontology_label',
+ annotation_scope: 'study', de_type: 'foo'
+ },
+ user:)
+ assert_response 422
+ execute_http_request(:post,
+ api_v1_site_study_submit_differential_expression_path(accession: study.accession),
+ request_payload: {
+ cluster_name: 'umap', annotation_name: 'cell_type__ontology_label',
+ annotation_scope: 'study', de_type: 'pairwise'
+ },
+ user:)
+ assert_response 422
+ # check rate limit
+ user.update(weekly_de_quota: DifferentialExpressionService::DEFAULT_USER_QUOTA)
+ execute_http_request(:post,
+ api_v1_site_study_submit_differential_expression_path(accession: study.accession),
+ request_payload: {
+ cluster_name: 'umap', annotation_name: 'cell_type__ontology_label',
+ annotation_scope: 'study', de_type: 'pairwise', group1: 'T cell', group2: 'B cell'
+ },
+ user:)
+ assert_response 429
+ # check for author results
+ study.differential_expression_results.delete_all
+ de_file = FactoryBot.create(:differential_expression_file,
+ study:,
+ name: 'user_de.txt',
+ annotation_name: 'cell_type__custom',
+ annotation_scope: 'study',
+ cluster_group:,
+ computational_method: 'custom'
+ )
+ author_result = DifferentialExpressionResult.create(
+ study:, cluster_group:, annotation_name: 'cell_type__custom', annotation_scope: 'study',
+ study_file: de_file, is_author_de: true, one_vs_rest_comparisons: ['Custom 1', 'Custom 2']
+ )
+ assert author_result.persisted?
+ params = {
+ cluster_name: 'umap', annotation_name: 'cell_type__ontology_label',
+ annotation_scope: 'study', de_type: 'rest'
+ }
+ execute_http_request(:post,
+ api_v1_site_study_submit_differential_expression_path(accession: study.accession),
+ request_payload: params,
+ user:)
+ assert_response :forbidden
+ assert json['error'].starts_with? 'User requests are disabled'
+ end
+ end
+ end
end
diff --git a/test/controllers/profiles_controller_test.rb b/test/controllers/profiles_controller_test.rb
index bb0a607734..f101805d33 100644
--- a/test/controllers/profiles_controller_test.rb
+++ b/test/controllers/profiles_controller_test.rb
@@ -41,21 +41,15 @@ class ProfilesControllerTest < ActionDispatch::IntegrationTest
profile_mock = Minitest::Mock.new
profile_error = proc { raise 'user is not registered' }
profile_mock.expect :get_profile, profile_error
- thurloe_mock = Minitest::Mock.new
- thurloe_mock.expect :services_available?, true, [String]
- ApplicationController.stub :firecloud_client, thurloe_mock do
- FireCloudClient.stub :new, profile_mock do
- post update_user_firecloud_profile_path(@user.id, params: {fire_cloud_profile: profile.to_json})
- assert_redirected_to view_profile_path(@user.id)
- follow_redirect!
- thurloe_mock.verify
- profile_mock.verify
-
- # make sure user has not been registered
- @user.reload
- assert_not @user.registered_for_firecloud
- end
-
+ FireCloudClient.stub :new, profile_mock do
+ post update_user_firecloud_profile_path(@user.id, params: {fire_cloud_profile: profile.to_json})
+ assert_redirected_to view_profile_path(@user.id)
+ follow_redirect!
+ profile_mock.verify
+
+ # make sure user has not been registered
+ @user.reload
+ assert_not @user.registered_for_firecloud
end
end
end
diff --git a/test/controllers/site_controller_test.rb b/test/controllers/site_controller_test.rb
index 3b5b9b4ff8..9796672659 100644
--- a/test/controllers/site_controller_test.rb
+++ b/test/controllers/site_controller_test.rb
@@ -160,13 +160,6 @@ def teardown
mock_not_detached @study, :find_by do
file = @study.study_files.sample
mock = Minitest::Mock.new
- mock.expect :services_available?, true, [String]
- systems = [FireCloudClient::SAM_SERVICE, FireCloudClient::RAWLS_SERVICE, FireCloudClient::BUCKETS_SERVICE]
- ok = { ok: true }
- api_status = {
- systems: Hash[systems.zip(Array.new(3) { ok })]
- }.with_indifferent_access
- mock.expect :api_status, api_status
file_mock = Minitest::Mock.new
file_mock.expect :present?, true
file_mock.expect :size, file.upload_file_size
diff --git a/test/detached_helper.rb b/test/detached_helper.rb
index 1cd8a21a04..01c465da09 100644
--- a/test/detached_helper.rb
+++ b/test/detached_helper.rb
@@ -28,7 +28,6 @@ def generate_signed_urls_mock(study_files, parent_study: nil)
def generate_download_file_mock(study_files, parent_study: nil, private: false)
download_file_mock = Minitest::Mock.new
study_files.each do |file|
- assign_services_mock!(download_file_mock, private)
assign_get_file_mock!(download_file_mock)
assign_url_mock!(download_file_mock, file, parent_study:)
end
@@ -54,14 +53,6 @@ def assign_get_file_mock!(mock)
mock.expect :execute_gcloud_method, file_mock, [:get_workspace_file, 0, String, String]
end
-def assign_services_mock!(mock, private)
- if private
- # private file downloads have an extra call to :services_available? for Sam and Rawls in addition to GoogleBuckets
- mock.expect :services_available?, true, [String, String]
- end
- mock.expect :services_available?, true, [String]
-end
-
# helper to mock all calls to Terra orchestration API when saving a new study & creating workspace
# useful for when we don't want the study to be detached, but still want to save to the database
def assign_workspace_mock!(mock, group, study_name)
diff --git a/test/integration/external/import_service_config/nemo_test.rb b/test/integration/external/import_service_config/nemo_test.rb
index 5a6a30fd65..5904298d8f 100644
--- a/test/integration/external/import_service_config/nemo_test.rb
+++ b/test/integration/external/import_service_config/nemo_test.rb
@@ -12,7 +12,7 @@ class NemoTest < ActiveSupport::TestCase
file_id: 'nemo:der-ah1o5qb',
project_id: 'nemo:grn-gyy3k8j',
study_id: 'nemo:col-hwmwd2x',
- obsm_key_names: %w[X_tsne X_umap],
+ obsm_key_names: %w[X_umap],
user_id: @user.id,
branding_group_id: @branding_group.id
}
@@ -49,12 +49,12 @@ class NemoTest < ActiveSupport::TestCase
end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should traverse associations to set ids' do
- # config = ImportServiceConfig::Nemo.new(file_id: @attributes[:file_id])
- # config.traverse_associations!
- # assert_equal @attributes[:study_id], config.study_id
- # assert_equal @attributes[:project_id], config.project_id
- # end
+ test 'should traverse associations to set ids' do
+ config = ImportServiceConfig::Nemo.new(file_id: @attributes[:file_id])
+ config.traverse_associations!
+ assert_equal @attributes[:study_id], config.study_id
+ assert_equal @attributes[:project_id], config.project_id
+ end
test 'should load defaults' do
study_defaults = {
@@ -80,7 +80,7 @@ class NemoTest < ActiveSupport::TestCase
end
assert_equal :file_name, study_file_mappings[:name]
assert_equal :file_name, study_file_mappings[:upload_file_name]
- assert_equal :technique, study_file_mappings.dig(:expression_file_info, :library_preparation_protocol)
+ assert_equal :techniques, study_file_mappings.dig(:expression_file_info, :library_preparation_protocol)
end
test 'should sanitize attribute values' do
@@ -93,91 +93,91 @@ class NemoTest < ActiveSupport::TestCase
assert_equal 'application/octet-stream', @configuration.get_file_content_type('csv')
end
- # test 'should load study analog' do
- # study = @configuration.load_study
- # assert_equal '"Human variation study (10x), GRU"', study['name']
- # assert_equal ["10x chromium 3' v3 sequencing"], study['techniques']
- # assert_equal [{"name"=>"human", "cv_term_id"=>"NCBI:txid9606"}], study['taxa']
- # end
+ test 'should load study analog' do
+ study = @configuration.load_study
+ assert_equal '"Human variation study (10x), GRU"', study['name']
+ assert_equal ["10x chromium 3' v3 sequencing"], study['techniques']
+ assert_equal [{"name"=>"human", "cv_term_id"=>"NCBI:txid9606"}], study['taxa']
+ end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should load file analog' do
- # file = @configuration.load_file
- # assert_equal 'human_var_scVI_VLMC.h5ad.tar', file['file_name']
- # assert_equal 'h5ad', file['file_format']
- # assert_equal 'counts', file['data_type']
- # end
-
- # test 'should load collection analog' do
- # collection = @configuration.load_collection
- # assert_equal 'AIBS Internal', collection['short_name']
- # end
+ test 'should load file analog' do
+ file = @configuration.load_file
+ assert_equal 'human_var_scVI_VLMC.h5ad.tar', file['file_name']
+ assert_equal 'h5ad', file['file_format']
+ assert_equal 'counts', file['data_type']
+ end
+
+ test 'should load collection analog' do
+ collection = @configuration.load_collection
+ assert_equal 'AIBS Internal', collection['short_name']
+ end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should extract association ids' do
- # file = @configuration.load_file
- # study = @configuration.load_study
- # assert_equal @attributes[:study_id], @configuration.id_from(file, :collections)
- # assert_equal @attributes[:project_id], @configuration.id_from(study, :projects)
- # end
-
- # test 'should load taxon common names' do
- # assert_equal %w[human], @configuration.taxon_names
- # end
- #
- # test 'should find library preparation protocol' do
- # assert_equal "10x 3' v3", @configuration.find_library_prep("10x chromium 3' v3 sequencing")
- # assert_equal 'Drop-seq', @configuration.find_library_prep('drop-seq')
- # end
+ test 'should extract association ids' do
+ file = @configuration.load_file
+ study = @configuration.load_study
+ assert_equal @attributes[:study_id], @configuration.id_from(file, :collections)
+ assert_equal @attributes[:project_id], @configuration.id_from(study, :projects)
+ end
+
+ test 'should load taxon common names' do
+ assert_equal %w[human], @configuration.taxon_names
+ end
+
+ test 'should find library preparation protocol' do
+ assert_equal "10x 3' v3", @configuration.find_library_prep("10x chromium 3' v3 sequencing")
+ assert_equal 'Drop-seq', @configuration.find_library_prep('drop-seq')
+ end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should populate study and study_file' do
- # scp_study = @configuration.populate_study
- # assert_equal 'Human variation study (10x), GRU', scp_study.name
- # assert_not scp_study.public
- # assert scp_study.full_description.present?
- # assert_equal @user_id, scp_study.user_id
- # assert_equal @branding_group_id, scp_study.branding_group_ids.first
- # assert_equal @configuration.service_name, scp_study.imported_from
- # # populate StudyFile, using above study
- # scp_study_file = @configuration.populate_study_file(scp_study.id)
- # assert scp_study_file.use_metadata_convention
- # assert_equal 'human_var_scVI_VLMC.h5ad.tar', scp_study_file.upload_file_name
- # assert_equal "10x 3' v3", scp_study_file.expression_file_info.library_preparation_protocol
- # assert_equal @configuration.service_name, scp_study_file.imported_from
- # assert_not scp_study_file.ann_data_file_info.reference_file
- # @configuration.obsm_keys.each do |obsm_key_name|
- # assert scp_study_file.ann_data_file_info.find_fragment(data_type: :cluster, obsm_key_name:).present?
- # end
- # assert scp_study_file.ann_data_file_info.find_fragment(data_type: :expression).present?
- # end
+ test 'should populate study and study_file' do
+ scp_study = @configuration.populate_study
+ assert_equal 'Human variation study (10x), GRU', scp_study.name
+ assert_not scp_study.public
+ assert scp_study.full_description.present?
+ assert_equal @user_id, scp_study.user_id
+ assert_equal @branding_group_id, scp_study.branding_group_ids.first
+ assert_equal @configuration.service_name, scp_study.imported_from
+ # populate StudyFile, using above study
+ scp_study_file = @configuration.populate_study_file(scp_study.id)
+ assert scp_study_file.use_metadata_convention
+ assert_equal 'human_var_scVI_VLMC.h5ad.tar', scp_study_file.upload_file_name
+ assert_equal "10x 3' v3", scp_study_file.expression_file_info.library_preparation_protocol
+ assert_equal @configuration.service_name, scp_study_file.imported_from
+ assert_not scp_study_file.ann_data_file_info.reference_file
+ @configuration.obsm_keys.each do |obsm_key_name|
+ assert scp_study_file.ann_data_file_info.find_fragment(data_type: :cluster, obsm_key_name:).present?
+ end
+ assert scp_study_file.ann_data_file_info.find_fragment(data_type: :expression).present?
+ end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should import from service' do
- # access_url = 'https://data.nemoarchive.org/other/grant/u01_lein/lein/transcriptome/sncell/10x_v3/human/' \
- # 'processed/counts/human_var_scVI_VLMC.h5ad.tar'
- # file_mock = MiniTest::Mock.new
- # file_mock.expect :generation, '123456789'
- # # for study to save, we need to mock all Terra orchestration API calls for creating workspace & setting acls
- # fc_client_mock = Minitest::Mock.new
- # owner_group = { groupEmail: 'sa-owner-group@firecloud.org' }.with_indifferent_access
- # assign_workspace_mock!(fc_client_mock, owner_group, 'human-variation-study-10x-gru')
- # AdminConfiguration.stub :find_or_create_ws_user_group!, owner_group do
- # ImportService.stub :copy_file_to_bucket, file_mock do
- # ApplicationController.stub :firecloud_client, fc_client_mock do
- # @configuration.stub :taxon_from, Taxon.new(common_name: 'human') do
- # study, study_file = @configuration.import_from_service
- # file_mock.verify
- # fc_client_mock.verify
- # assert study.persisted?
- # assert study_file.persisted?
- # assert_equal study.external_identifier, @attributes[:study_id]
- # assert_equal study_file.external_identifier, @attributes[:file_id]
- # assert_equal study_file.external_link_url, access_url
- # end
- # end
- # end
- # end
- # end
+ test 'should import all from service' do
+ access_url = 'https://data.nemoarchive.org/other/grant/u01_lein/lein/transcriptome/sncell/10x_v3/human/' \
+ 'processed/counts/human_var_scVI_VLMC.h5ad.tar'
+ file_mock = MiniTest::Mock.new
+ file_mock.expect :generation, '123456789'
+ # for study to save, we need to mock all Terra orchestration API calls for creating workspace & setting acls
+ fc_client_mock = Minitest::Mock.new
+ owner_group = { groupEmail: 'sa-owner-group@firecloud.org' }.with_indifferent_access
+ assign_workspace_mock!(fc_client_mock, owner_group, 'human-variation-study-10x-gru')
+ AdminConfiguration.stub :find_or_create_ws_user_group!, owner_group do
+ ImportService.stub :copy_file_to_bucket, file_mock do
+ ApplicationController.stub :firecloud_client, fc_client_mock do
+ @configuration.stub :taxon_from, Taxon.new(common_name: 'human') do
+ study, study_file = @configuration.import_from_service
+ file_mock.verify
+ fc_client_mock.verify
+ assert study.persisted?
+ assert study_file.persisted?
+ assert_equal study.external_identifier, @attributes[:study_id]
+ assert_equal study_file.external_identifier, @attributes[:file_id]
+ assert_equal study_file.external_link_url, access_url
+ end
+ end
+ end
+ end
+ end
end
end
diff --git a/test/integration/external/nemo_client_test.rb b/test/integration/external/nemo_client_test.rb
index c604e0f54e..8dd2dae0e9 100644
--- a/test/integration/external/nemo_client_test.rb
+++ b/test/integration/external/nemo_client_test.rb
@@ -56,55 +56,55 @@ def skip_if_api_down
end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should get an entity' do
- # skip_if_api_down
- # entity_type = @identifiers.keys.sample
- # identifier = @identifiers[entity_type]
- # entity = @nemo_client.fetch_entity(entity_type, identifier)
- # assert entity.present?
- # end
+ test 'should get an entity' do
+ skip_if_api_down
+ entity_type = @identifiers.keys.sample
+ identifier = @identifiers[entity_type]
+ entity = @nemo_client.fetch_entity(entity_type, identifier)
+ assert entity.present?
+ end
- # test 'should get collection' do
- # skip_if_api_down
- # identifier = @identifiers[:collection]
- # collection = @nemo_client.collection(identifier)
- # assert collection.present?
- # assert_equal 'adey_sciATAC_human_cortex', collection['short_name']
- # end
+ test 'should get collection' do
+ skip_if_api_down
+ identifier = @identifiers[:collection]
+ collection = @nemo_client.collection(identifier)
+ assert collection.present?
+ assert_equal 'adey_sciATAC_human_cortex', collection['short_name']
+ end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should get file' do
- # skip_if_api_down
- # identifier = @identifiers[:file]
- # file = @nemo_client.file(identifier)
- # assert file.present?
- # filename = 'human_var_scVI_VLMC.h5ad.tar'
- # assert_equal filename, file['file_name']
- # assert_equal 'h5ad', file['file_format']
- # access_url = file['urls'].first['url']
- # assert_equal filename, access_url.split('/').last
- # end
+ test 'should get file' do
+ skip_if_api_down
+ identifier = @identifiers[:file]
+ file = @nemo_client.file(identifier)
+ assert file.present?
+ filename = 'human_var_scVI_VLMC.h5ad.tar'
+ assert_equal filename, file['file_name']
+ assert_equal 'h5ad', file['file_format']
+ access_url = file['manifest_file_urls'].first['url']
+ assert_equal filename, access_url.split('/').last
+ end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should get grant' do
- # skip_if_api_down
- # identifier = @identifiers[:grant]
- # grant = @nemo_client.grant(identifier)
- # assert grant.present?
- # assert_equal '1U01MH114825-01', grant['grant_number']
- # assert_equal 'NIMH', grant['funding_agency']
- # end
+ test 'should get grant' do
+ skip_if_api_down
+ identifier = @identifiers[:grant]
+ grant = @nemo_client.grant(identifier)
+ assert grant.present?
+ assert_equal '1U01MH114825', grant.dig('grant_info','grant_number')
+ assert_equal 'NIMH', grant['funding_agency']
+ end
- # test 'should get project' do
- # skip_if_api_down
- # identifier = @identifiers[:project]
- # project = @nemo_client.project(identifier)
- # assert project.present?
- # assert_equal 'Single-nucleus analysis of preoptic area development from late embryonic to adult stages',
- # project['title']
- # assert_equal 'biccn', project['program']
- # assert_equal 'dulac_poa_dev_sn_10x_proj', project['short_name']
- # end
+ test 'should get project' do
+ skip_if_api_down
+ identifier = @identifiers[:project]
+ project = @nemo_client.project(identifier)
+ assert project.present?
+ assert_equal 'Single-nucleus analysis of preoptic area development from late embryonic to adult stages',
+ project['title']
+ assert_equal 'biccn', project['program']
+ assert_equal 'dulac_poa_dev_sn_10x_proj', project['short_name']
+ end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
# test 'should get publication' do
@@ -118,23 +118,23 @@ def skip_if_api_down
# end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should get sample' do
- # skip_if_api_down
- # identifier = @identifiers[:sample]
- # sample = @nemo_client.sample(identifier)
- # assert sample.present?
- # assert_equal 'marm028_M1', sample['source_sample_id']
- # assert sample['files'].any?
- # end
+ test 'should get sample' do
+ skip_if_api_down
+ identifier = @identifiers[:sample]
+ sample = @nemo_client.sample(identifier)
+ assert sample.present?
+ assert_equal 'marm028_M1', sample['sample_name']
+ assert sample['subjects'].any?
+ end
# TODO: SCP-5565 Check with NeMO re API, update and re-enable this test
- # test 'should get subject' do
- # skip_if_api_down
- # identifier = @identifiers[:subject]
- # subject = @nemo_client.subject(identifier)
- # assert subject.present?
- # assert_equal 'CEMBA180911_4H', subject['source_subject_id']
- # assert_equal 'DNA methylation profiling of genomic DNA in individual mouse brain cell nuclei (RS1.1)',
- # subject['grant_title']
- # end
+ test 'should get subject' do
+ skip_if_api_down
+ identifier = @identifiers[:subject]
+ subject = @nemo_client.subject(identifier)
+ assert subject.present?
+ assert_equal 'nonhuman-1U01MH114819', subject.dig('cohort_info', 'cohort_name')
+ assert_equal 'A Molecular and cellular atlas of the marmoset brain', subject['grant_title']
+ assert subject['samples'].any?
+ end
end
diff --git a/test/integration/external/study_validation_test.rb b/test/integration/external/study_validation_test.rb
index fa10aeddd9..f8f5f6b8e2 100644
--- a/test/integration/external/study_validation_test.rb
+++ b/test/integration/external/study_validation_test.rb
@@ -243,7 +243,6 @@ class StudyValidationTest < ActionDispatch::IntegrationTest
assert initial_bq_row_count > 0, "wrong number of BQ rows found to test deletion capability"
mock = Minitest::Mock.new
- mock.expect :services_available?, true, [String, String]
mock.expect :execute_gcloud_method, true, [:workspace_file_exists?, Integer, String, String]
mock.expect :execute_gcloud_method, true, [:delete_workspace_file, Integer, String, String]
diff --git a/test/models/ingest_job_test.rb b/test/models/ingest_job_test.rb
index a7131a8512..4f66eeb249 100644
--- a/test/models/ingest_job_test.rb
+++ b/test/models/ingest_job_test.rb
@@ -731,13 +731,6 @@ class IngestJobTest < ActiveSupport::TestCase
pipeline_name = SecureRandom.uuid
job = IngestJob.new(pipeline_name:, study:, study_file: cluster_file, user: @user, action: :ingest_subsample)
- metadata = {
- pipeline: {
- actions: [
- { commands: %w[foo bar bing baz] }
- ]
- }
- }.with_indifferent_access
error_log = "parse_logs/#{cluster_file.id}/user_log.txt"
mock = Minitest::Mock.new
@@ -862,7 +855,7 @@ class IngestJobTest < ActiveSupport::TestCase
end
end
- test 'should ensure email delivery on special action failures' do
+ test 'should ensure email delivery and parse_status reset on special action failures' do
study = FactoryBot.create(:detached_study,
name_prefix: 'Special Action Email',
user: @user,
@@ -889,6 +882,7 @@ class IngestJobTest < ActiveSupport::TestCase
annotation_file:, cluster_file:, cluster_name: 'umap', annotation_name: 'disease', annotation_scope: 'study'
)
pipeline_name = SecureRandom.uuid
+ study_file.update(parse_status: 'parsing')
job = IngestJob.new(
pipeline_name:, study:, study_file:, user: @user, action: :differential_expression, params_object:
)
@@ -925,6 +919,9 @@ class IngestJobTest < ActiveSupport::TestCase
ApplicationController.stub :batch_api_client, mock do
SingleCellMailer.stub :notify_admin_parse_fail, email_mock do
job.poll_for_completion
+ # ensure that parse_status flag is reset after failure
+ study_file.reload
+ assert study_file.parsed?
mock.verify
email_mock.verify
end
diff --git a/test/services/differential_expression_service_test.rb b/test/services/differential_expression_service_test.rb
index 6541580737..7a7f7d48ac 100644
--- a/test/services/differential_expression_service_test.rb
+++ b/test/services/differential_expression_service_test.rb
@@ -414,4 +414,35 @@ class DifferentialExpressionServiceTest < ActiveSupport::TestCase
)
end
end
+
+ test 'should get weekly DE quota value' do
+ default_value = DifferentialExpressionService::DEFAULT_USER_QUOTA
+ assert_equal default_value, DifferentialExpressionService.get_weekly_user_quota
+ # test config override
+ config = AdminConfiguration.create!(config_type: 'Weekly User DE Quota', value_type: 'Numeric', value: '10')
+ assert_equal config.value.to_i, DifferentialExpressionService.get_weekly_user_quota
+ config.destroy
+ assert_equal default_value, DifferentialExpressionService.get_weekly_user_quota
+ end
+
+ test 'should check weekly user DE quota' do
+ user = FactoryBot.create(:api_user, test_array: @@users_to_clean)
+ assert_not DifferentialExpressionService.job_exceeds_quota?(user)
+ user.update(weekly_de_quota: DifferentialExpressionService::DEFAULT_USER_QUOTA)
+ assert DifferentialExpressionService.job_exceeds_quota?(user)
+ end
+
+ test 'should increment user DE quota' do
+ user = FactoryBot.create(:api_user, weekly_de_quota: 1, test_array: @@users_to_clean)
+ DifferentialExpressionService.increment_user_quota(user)
+ user.reload
+ assert_equal 2, user.weekly_de_quota
+ end
+
+ test 'should reset user DE quotas' do
+ user = FactoryBot.create(:api_user, weekly_de_quota: 1, test_array: @@users_to_clean)
+ DifferentialExpressionService.reset_all_user_quotas
+ user.reload
+ assert_equal 0, user.weekly_de_quota
+ end
end
diff --git a/test/test_data/alexandria_convention/metadata.v2-0-0.txt b/test/test_data/alexandria_convention/metadata.v2-0-0.txt
index 25849294de..15ce8380b9 100644
--- a/test/test_data/alexandria_convention/metadata.v2-0-0.txt
+++ b/test/test_data/alexandria_convention/metadata.v2-0-0.txt
@@ -1,32 +1,32 @@
NAME cell_type cell_type__ontology_label organism_age disease disease__ontology_label species species__ontology_label geographical_region geographical_region__ontology_label library_preparation_protocol library_preparation_protocol__ontology_label organ organ__ontology_label sex is_living organism_age__unit organism_age__unit_label ethnicity__ontology_label ethnicity race race__ontology_label sample_type donor_id biosample_id biosample_type preservation_method
TYPE group group numeric group group group group group group group group group group group group group group group group group group group group group group group
-CELL_0001 CL_0000066 epithelial cell 1 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0002 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0003 CL_0000066 epithelial cell 12 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0004 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0005 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0006 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0007 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0008 CL_0000066 epithelial cell 61 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0009 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00010 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00011 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00012 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00013 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00014 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00015 CL_0000066 epithelial cell 58 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0001t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0002t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0003t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0004t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0005t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0006t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0007t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0008t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0009t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00010t CL_0000066 epithelial cell 103 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00011t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00012t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00013t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00014t CL_0000066 epithelial cell 99 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00015t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0001 CL_0000066 epithelial cell 1 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0002 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0003 CL_0000066 epithelial cell 12 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0004 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0005 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0006 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0007 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0008 CL_0000066 epithelial cell 61 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0009 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00010 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00011 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00012 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00013 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00014 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00015 CL_0000066 epithelial cell 58 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0001t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0002t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0003t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0004t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0005t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0006t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0007t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0008t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0009t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00010t CL_0000066 epithelial cell 103 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00011t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00012t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00013t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00014t CL_0000066 epithelial cell 99 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00015t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
diff --git a/test/test_data/validation/metadata_good_v2-0-0.txt b/test/test_data/validation/metadata_good_v2-0-0.txt
index 25849294de..15ce8380b9 100644
--- a/test/test_data/validation/metadata_good_v2-0-0.txt
+++ b/test/test_data/validation/metadata_good_v2-0-0.txt
@@ -1,32 +1,32 @@
NAME cell_type cell_type__ontology_label organism_age disease disease__ontology_label species species__ontology_label geographical_region geographical_region__ontology_label library_preparation_protocol library_preparation_protocol__ontology_label organ organ__ontology_label sex is_living organism_age__unit organism_age__unit_label ethnicity__ontology_label ethnicity race race__ontology_label sample_type donor_id biosample_id biosample_type preservation_method
TYPE group group numeric group group group group group group group group group group group group group group group group group group group group group group group
-CELL_0001 CL_0000066 epithelial cell 1 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0002 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0003 CL_0000066 epithelial cell 12 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0004 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0005 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0006 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0007 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0008 CL_0000066 epithelial cell 61 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0009 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00010 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00011 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00012 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00013 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00014 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00015 CL_0000066 epithelial cell 58 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0001t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0002t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0003t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0004t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0005t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0006t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0007t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0008t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_0009t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00010t CL_0000066 epithelial cell 103 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00011t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00012t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00013t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00014t CL_0000066 epithelial cell 99 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
-CELL_00015t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0001 CL_0000066 epithelial cell 1 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0002 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0003 CL_0000066 epithelial cell 12 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0004 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0005 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0006 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0007 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0008 CL_0000066 epithelial cell 61 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0009 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00010 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00011 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00012 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00013 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00014 CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00015 CL_0000066 epithelial cell 58 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0001t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0002t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0003t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0004t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0005t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0006t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0007t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0008t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_0009t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00010t CL_0000066 epithelial cell 103 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00011t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00012t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C43862 Norwegian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00013t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00014t CL_0000066 epithelial cell 99 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
+CELL_00015t CL_0000066 epithelial cell 31 MONDO_0000001 disease or disorder NCBITaxon_9606 Homo sapiens GAZ_00003181 Boston EFO_0008919 Seq-Well UBERON_0001913 milk female yes UO_0000036 year European ancestry HANCESTRO_0005 NCIT_C126538 Scandinavian direct from donor - fresh BM01 BM01_16dpp_r3 PrimaryBioSample_BodyFluid Fresh
diff --git a/yarn.lock b/yarn.lock
index 28ce1cf0af..ac55064a3b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1035,12 +1035,12 @@
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
"@babel/runtime-corejs2@^7.0.0":
- version "7.22.6"
- resolved "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.22.6.tgz"
- integrity sha512-GTJVRjzQIHUBwRzuWxPII87XoWxXzILBJrQh5gqIV6q6m231Y0BBA9NKta5FV5Lbl8z5gS3+m6YSoKJp0KQJ4g==
+ version "7.26.10"
+ resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.26.10.tgz#46c1289c6f181391235fb00af13e6c246cb5c8ae"
+ integrity sha512-JfoPiD7f/vvd/PaOfu5cr9CyzwDMPg4T0nX3MQr6IgTq49DhjvUcmjmjA7j6+xih1Evq+QKZnge1SoIlYozv/Q==
dependencies:
core-js "^2.6.12"
- regenerator-runtime "^0.13.11"
+ regenerator-runtime "^0.14.0"
"@babel/runtime-corejs3@^7.10.2":
version "7.22.6"
@@ -8148,6 +8148,11 @@ regenerator-runtime@^0.13.11:
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz"
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
regenerator-transform@^0.15.1:
version "0.15.1"
resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz"