# Copyright 2023 AUI, Inc. Washington DC, USA
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
this module will be included in the api
"""
[docs]def update_all(path=None, logger=None, force=False, verbose=None):
"""
Update the data contants at path to the most recently released versions
of casarundata and measures data.
If path does not exist it will be created (the user must have permission
to create path).
If path does exist and is not empty it must contain a previously
installed version of casarundata. Path must be a directory and it
must be owned by the user.
If path is not provided then config is imported and the measurespath value set
by that process will be used.
If path already contains the most recent versions of casarundata and
measurespath then nothing will change at path.
The force argument is passed to data_update and measures_update
The verbose argument controls the level of information provided when
this function when the data are unchanged for expected reasons. A level
of 0 prints and logs nothing. A value of 1 logs the information and a value
of 2 logs and prints the information.
This uses pull_data, data_update and measures_update. See the
documentation for those functions for additional details (e.g. verbose argument).
Some of the data updated by this function is only read when casatools starts.
Use of update_all after CASA has started should typically be followed by a restart
so that any changes are seen by the tools and tasks that use this data.
Parameters
- path (str=None) - Folder path to place casarundata contents. It must not exist, or be empty, or contain a valid, previously installed version. If it exists, it must be owned by the user. Default None uses the value of measurespath set by importing config.py.
- logger (casatools.logsink=None) - Instance of the casalogger to use for writing messages. Messages are always written to the terminal. Default None does not write any messages to a logger.
- verbose (int) - Level of output, 0 is none, 1 is to logger, 2 is to logger and terminal, defaults to casaconfig_verbose in the config dictionary.
Returns
None
"""
import os
from .print_log_messages import print_log_messages
from .get_data_info import get_data_info
from .pull_data import pull_data
from .data_update import data_update
from .measures_update import measures_update
if path is None:
from casaconfig import config
path = config.measurespath
if path is None:
print_log_messages("config.measurespath is None. Edit your config.py to set measurespath to an appropriate location,", logger, True)
return
if not os.path.exists(path):
# create it, all the way down
try:
os.makedirs(path, exist_ok=True)
except:
print_log_messages("unable to create path, check the permissions of the directory it is being created at, path = %s" % path, logger, True)
return
# path must be a directory and it must be owned by the user
if (not os.path.isdir(path)) or (os.stat(path).st_uid != os.getuid()):
msgs = []
msgs.append("Warning: path must exist as a directory and it must be owned by the user, path = %s" % path)
msgs.append("Warning: no updates are possible on this path by this user.")
# always print and log this although it's only a warning
print_log_messages(msgs, logger, False, 2)
return
# if path is empty, first use pull_data
if len(os.listdir(path))==0:
pull_data(path, logger, verbose=verbose)
# double check that it's not empty
if len(os.listdir(path))==0:
print_log_messages("pull_data failed, see the error messages for more details. update_all can not continue", logger, True)
return
# readme.txt must exist in path at this point, using get_data_info provides more possible feedback
dataInfo = get_data_info(path, logger)
if dataInfo is None:
# this should not happen
print_log_messages('could not find any data information about %s, can not continue with update_all' % path, logger, True)
if dataInfo['casarundata'] is None:
print_log_messages('readme.txt not found at path, update_all can not continue, path = %s' % path, logger, True)
return
if dataInfo['casarundata'] == 'invalid':
print_log_messages('readme.txt is invalid at path, update_all can not continue, path = %s' % path, logger, True)
return
if dataInfo['casarundata'] == 'unknown':
print_log_messages('contents at path appear to be casarundata but no readme.txt was found, casaconfig did not populate this data and update_all can not continue, path = %s', path, logger, True)
return
# the updates should work now
data_update(path, logger, force=force, verbose=verbose)
measures_update(path, logger, force=force, verbose=verbose)
return