1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
#!/usr/bin/env python
# coding: utf-8
#
# Project: FabIO tests class utilities
#
# Copyright (C) 2010-2016 European Synchrotron Radiation Facility
# Grenoble, France
#
# Principal authors: Jérôme KIEFFER (jerome.kieffer@esrf.fr)
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
__author__ = "Jérôme Kieffer"
__contact__ = "jerome.kieffer@esrf.eu"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
__date__ = "03/04/2020"
PACKAGE = "fabio"
DATA_KEY = "FABIO_DATA"
import os
import sys
import getpass
import threading
import logging
import tempfile
from ..utils.ExternalResources import ExternalResources
logger = logging.getLogger(__name__)
TEST_HOME = os.path.dirname(os.path.abspath(__file__))
class TestOptions(object):
def __init__(self):
self.options = None
self.timeout = 60 # timeout in seconds for downloading images
# url_base = "http://forge.epn-campus.eu/attachments/download"
self.url_base = "http://www.edna-site.org/pub/fabio/testimages"
self.resources = ExternalResources(PACKAGE,
timeout=self.timeout,
env_key=DATA_KEY,
url_base=self.url_base)
self.sem = threading.Semaphore()
self.recompiled = False
self.reloaded = False
self.name = PACKAGE
self.script_dir = None
self.installed = False
self.download_images = self.resources.download_all
self.getimage = self.resources.get_file_and_repack
self._tempdir = None
def deep_reload(self):
self.fabio = __import__(self.name)
return self.fabio
def forceBuild(self, remove_first=True):
"""
Force the recompilation of FabIO
Nonesense, kept for legacy reasons
"""
return
def script_path(self, script_name, module_name):
"""Returns the script path according to it's location"""
if self.installed:
script = self.get_installed_script_path(script_name)
else:
import importlib
module = importlib.import_module(module_name)
script = module.__file__
return script
def get_installed_script_path(self, script):
"""
Returns the path of the executable and the associated environment
In Windows, it checks availability of script using .py .bat, and .exe
file extensions.
"""
if (sys.platform == "win32"):
available_extensions = [".py", ".bat", ".exe"]
else:
available_extensions = [""]
paths = os.environ.get("PATH", "").split(os.pathsep)
for base in paths:
# clean up extra quotes from paths
if base.startswith('"') and base.endswith('"'):
base = base[1:-1]
for file_extension in available_extensions:
script_path = os.path.join(base, script + file_extension)
print(script_path)
if os.path.exists(script_path):
# script found
return script_path
# script not found
logger.warning("Script '%s' not found in paths: %s", script, ":".join(paths))
script_path = script
return script_path
def _initialize_tmpdir(self):
"""Initialize the temporary directory"""
if not self._tempdir:
with self.sem:
if not self._tempdir:
self._tempdir = tempfile.mkdtemp("_" + getpass.getuser(),
self.name + "_")
@property
def tempdir(self):
if not self._tempdir:
self._initialize_tmpdir()
return self._tempdir
def clean_up(self):
"""Removes the temporary directory (and all its content !)"""
with self.sem:
if not self._tempdir:
return
if not os.path.isdir(self._tempdir):
return
for root, dirs, files in os.walk(self._tempdir, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
os.rmdir(self._tempdir)
self._tempdir = None
test_options = TestOptions()
"""Singleton containing util context of whole the tests"""
UtilsTest = test_options
"""For compatibility"""
|