Coverage for python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py: 20%
14 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-03-26 02:48 -0700
« prev ^ index » next coverage.py v7.4.4, created at 2024-03-26 02:48 -0700
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__ = ("determine_destination_for_retrieved_artifact",)
32from lsst.resources import ResourcePath, ResourcePathExpression
35def determine_destination_for_retrieved_artifact(
36 destination_directory: ResourcePath, source_path: ResourcePath, preserve_path: bool
37) -> ResourcePath:
38 """Determine destination path for an artifact retrieved from a datastore.
40 Parameters
41 ----------
42 destination_directory : `ResourcePath`
43 Path to the output directory where file will be stored.
44 source_path : `ResourcePath`
45 Path to the source file to be transferred. This may be relative to the
46 datastore root, or an absolute path.
47 preserve_path : `bool`, optional
48 If `True` the full path of the artifact within the datastore
49 is preserved. If `False` the final file component of the path
50 is used.
52 Returns
53 -------
54 destination_uri : `~lsst.resources.ResourcePath`
55 Absolute path to the output destination.
56 """
57 destination_directory = destination_directory.abspath()
59 target_path: ResourcePathExpression
60 if preserve_path:
61 target_path = source_path
62 if target_path.isabs():
63 # This is an absolute path to an external file.
64 # Use the full path.
65 target_path = target_path.relativeToPathRoot
66 else:
67 target_path = source_path.basename()
69 target_uri = destination_directory.join(target_path).abspath()
70 if target_uri.relative_to(destination_directory) is None:
71 raise ValueError(f"File path attempts to escape destination directory: '{source_path}'")
72 return target_uri