Coverage for python / lsst / daf / butler / _rubin / file_datasets.py: 37%
23 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-18 08:43 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-18 08:43 +0000
1# This file is part of daf_butler.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (http://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This software is dual licensed under the GNU General Public License and also
10# under a 3-clause BSD license. Recipients may choose which of these licenses
11# to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
12# respectively. If you choose the GPL option then the following text applies
13# (but note that there is still no warranty even if you opt for BSD instead):
14#
15# This program is free software: you can redistribute it and/or modify
16# it under the terms of the GNU General Public License as published by
17# the Free Software Foundation, either version 3 of the License, or
18# (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program. If not, see <http://www.gnu.org/licenses/>.
28from __future__ import annotations
30__all__ = ("transfer_datasets_to_datastore",)
32from collections.abc import Iterable
34from .._butler import Butler
35from .._butler_config import ButlerConfig
36from .._dataset_ref import DatasetRef
37from .._file_dataset import FileDataset
38from .._standalone_datastore import instantiate_standalone_datastore
39from ..direct_butler import DirectButler
42def transfer_datasets_to_datastore(
43 source_butler: Butler, output_config: ButlerConfig, refs: Iterable[DatasetRef]
44) -> list[FileDataset]:
45 """Copy datasets into a `Datastore` without writing entries into the
46 associated registry database.
48 Parameters
49 ----------
50 source_butler : `Butler`
51 Butler instance from which to copy datasets.
52 output_config : `ButlerConfig`
53 Butler configuration specifying the configuration for the target
54 datastore.
55 refs : `~collections.abc.Iterable` [ `DatasetRef` ]
56 List of datasets to copy into the target datastore.
58 Returns
59 -------
60 file_datasets : `list` [ `FileDataset` ]
61 `FileDataset` instances representing the artifacts copied to
62 the target datastore.
63 """
64 refs = list(refs)
65 if len(refs) == 0:
66 return []
68 if not isinstance(source_butler, DirectButler):
69 raise ValueError("Butler must be an instance of DirectButler")
71 # Refs must contain dimension records to allow for filename template
72 # expansion in the datastore.
73 refs = source_butler._registry.expand_refs(list(refs))
74 # Read out the absolute URLs of the datasets we are about to transfer.
75 datasets = list(source_butler._datastore.export(refs, directory=None, transfer="direct"))
77 # Set up a temporary, initially empty, in-memory DB for the target
78 # Datastore.
79 dimension_universe = datasets[0].refs[0].dimensions.universe
80 datastore, db = instantiate_standalone_datastore(output_config, dimension_universe)
81 try:
82 # Write the files to their destination in the target datastore.
83 datastore.ingest(*datasets, transfer="copy", record_validation_info=False)
84 # Read out the relative URLs of the files, for their location
85 # in the target datastore.
86 return list(datastore.export(refs, directory=None, transfer=None))
87 finally:
88 db.dispose()