#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
"""
Very useful script to ensure you have all the modules you need
CommandLine:
python -m ibeis.tests.assert_modules
python -m ibeis.tests.assert_modules --test-assert_modules --nolibdep
python -m ibeis.tests.assert_modules --test-assert_modules
MacFix:
# Remove the copy of pyrf
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/
sudo rm -rf pyrf-1.0.0.dev1-py2.7.egg/
Updater For Linux:
sudo pip install matplotlib --upgrade
sudo pip install Pillow --upgrade
sudo pip install scipy --upgrade
sudo pip install numpy --upgrade
./super_setup.py --bootstrap --upgrade
"""
from __future__ import absolute_import, division, print_function
import sys
import functools
import utool as ut
from pkg_resources import parse_version
from utool._internal.meta_util_six import get_funcname
ASSERT_FUNCS = []
#LIB_DEP = ut.get_argflag('--nolibdep')
LIB_DEP = not ut.get_argflag('--libdep')
[docs]def get_site_package_directories():
import site
import sys
import six
sitepackages = site.getsitepackages()
if sys.platform.startswith('darwin'):
if six.PY2:
macports_site = '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages'
else:
macports_site = '/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages'
assert six.PY2, 'fix this for python 3'
sitepackages = [macports_site] + sitepackages
return sitepackages
[docs]def check_alternate_installs():
'/Library/Python/2.7/site-packages'
pass
[docs]def version_ge_target(version, target=None):
if target is None:
passed = True
elif version is None:
passed = False
else:
_version = version.replace('.dev1', '')
passed = parse_version(_version) >= parse_version(target)
return passed
[docs]def checkinfo(target=None, pipname=None):
"""
checkinfo functions return info_dict containing __version__
"""
def wrapper1(func):
"""
Returns;
tuple : passed, current_version, target, infodict, statustext, suggested_fix
"""
# Decorator which adds funcs to ASSERT_FUNCS
global ASSERT_FUNCS
@functools.wraps(func)
def checkinfo_wrapper(*args, **kwargs):
suggested_fix = ''
funcname = get_funcname(func)
packagename = funcname.replace('_version', '')
pipname_ = pipname if pipname is not None else packagename
try:
infodict = func(*args, **kwargs)
except ImportError as ex:
infodict = module_stdinfo_dict(None, name=pipname_)
suggested_fix = 'pip install ' + pipname_
if not sys.platform.startswith('win32'):
suggested_fix = 'sudo ' + suggested_fix
return False, 'None', target, infodict, ut.formatex(ex), suggested_fix
except Exception as ex:
infodict = module_stdinfo_dict(None, name=pipname_)
return False, 'None', target, infodict, ut.formatex(ex), 'Some unknown error in ' + packagename
current_version = infodict['__version__']
# Build status text
msg = ut.dict_str(infodict, strvals=True)
msg += '\n' + '%s: %r >= (target=%r)?' % (funcname, current_version, target)
statustext = ut.msgblock(infodict['__name__'], msg)
# Check if passed
passed = version_ge_target(current_version, target)
# Suggest possible fix
if not passed:
suggested_fix = 'pip install ' + infodict['__name__'] + ' --upgrade'
if not sys.platform.startswith('win32'):
suggested_fix = 'sudo ' + suggested_fix
return passed, current_version, target, infodict, statustext, suggested_fix
ASSERT_FUNCS.append(checkinfo_wrapper)
return checkinfo_wrapper
return wrapper1
[docs]def module_stdinfo_dict(module, versionattr='__version__', version=None, libdep=None, name=None, **kwargs):
#if module is None:
# module = object
infodict = {
'__version__': version if module is None or version is not None else getattr(module, versionattr, None),
'__name__': name if module is None else getattr(module, '__name__', name),
'__file__': 'None' if module is None else getattr(module, '__file__', None),
}
if libdep is not None:
infodict['libdep'] = libdep
if not ut.QUIET:
infodict.update(kwargs)
return infodict
[docs]def reg_std_version_check(version, modname):
def checkstdmod_version():
mod = ut.import_modname(modname)
return module_stdinfo_dict(mod)
ut.set_funcname(checkstdmod_version, '%s_version' % (modname,))
func = checkinfo(version)(checkstdmod_version)
return func
reg_std_version_check('1.5.3', 'pynmea2')
reg_std_version_check(None, 'wget')
reg_std_version_check(None, 'pygco')
reg_std_version_check('6.0.8', 'pip')
reg_std_version_check('1.1.1', 'utool')
# @checkinfo('1.1.1')
# def utool_version():
# import utool
# return module_stdinfo_dict(utool)
# @checkinfo('1.5.3')
# def pynmea2_version():
# # for web
# import pynmea2
# return module_stdinfo_dict(pynmea2)
# @checkinfo('6.0.8')
# def pip_version():
# import pip
# return module_stdinfo_dict(pip)
@checkinfo(None)
[docs]def pyflann_version():
import pyflann
if LIB_DEP:
libdep = None
else:
libdep = ut.get_dynlib_dependencies(pyflann.flannlib._name)
return module_stdinfo_dict(pyflann, libdep=libdep)
@checkinfo('1.1.1')
[docs]def pyhesaff_version():
import pyhesaff
if LIB_DEP:
libdep = None
else:
libdep = ut.get_dynlib_dependencies(pyhesaff.__LIB_FPATH__)
return module_stdinfo_dict(pyhesaff, libdep=libdep)
@checkinfo('1.0.0')
[docs]def pyrf_version():
import pyrf
if LIB_DEP:
libdep = None
else:
libdep = ut.get_dynlib_dependencies(pyrf.RF_CLIB._name)
return module_stdinfo_dict(pyrf, libdep=libdep)
@checkinfo('1.0.1')
@checkinfo('3.1.0')
[docs]def pillow_version():
from PIL import Image
import PIL
pil_path = PIL.__path__
if len(PIL.__path__) > 1:
print('WARNING!!! THERE ARE MULTIPLE PILS! %r ' % PIL.__path__)
return module_stdinfo_dict(
Image, versionattr='PILLOW_VERSION', image_version=Image.VERSION, pil_path=pil_path)
#@checkinfo('1.3.1')
@checkinfo('1.5.1')
[docs]def matplotlib_version():
import matplotlib as mpl
return module_stdinfo_dict(mpl)
@checkinfo('2.4.8')
[docs]def opencv_version():
import cv2
#print(cv2.getBuildInformation())
if LIB_DEP:
libdep = None
else:
libdep = ut.get_dynlib_dependencies(cv2.__file__)
return module_stdinfo_dict(cv2, libdep=libdep)
@checkinfo('0.13.2')
[docs]def scipy_version():
import scipy
return module_stdinfo_dict(scipy)
@checkinfo('0.4.9')
[docs]def scipy_linalg_version():
import scipy.linalg
return module_stdinfo_dict(scipy.linalg)
@checkinfo('1.8.0')
[docs]def numpy_version():
import numpy
return module_stdinfo_dict(numpy)
#@checkinfo()
[docs]def theano_version():
import theano
return module_stdinfo_dict(theano)
#@checkinfo()
[docs]def lasagne_version():
import lasagne
return module_stdinfo_dict(lasagne)
@checkinfo('4.9.1') # 4.10.1 on windows
[docs]def PyQt4_version():
from PyQt4 import QtCore
return module_stdinfo_dict(QtCore, 'PYQT_VERSION_STR')
@checkinfo('0.15.1')
[docs]def pandas_version():
import pandas
version = pandas.version.version
return module_stdinfo_dict(pandas, version=version)
@checkinfo('0.6.1')
[docs]def statsmodels_version():
import statsmodels
version = statsmodels.version.version
return module_stdinfo_dict(statsmodels, version=version)
@checkinfo('0.10.1')
[docs]def flask_version():
import flask
return module_stdinfo_dict(flask)
@checkinfo('2.0.1')
[docs]def flask_cors_version():
import flask.ext.cors
return module_stdinfo_dict(flask.ext.cors)
@checkinfo('4.0.2')
[docs]def tornado_version():
import tornado
return module_stdinfo_dict(tornado, 'version')
@checkinfo()
[docs]def pygraphviz_version():
import pygraphviz
return module_stdinfo_dict(pygraphviz)
@checkinfo(None)
[docs]def networkx_version():
# for web
import networkx
return module_stdinfo_dict(networkx)
[docs]def check_modules_exists():
# Modules in this list don't really need to be inspected
# just make sure they are there
modname_list = [
'simplejson',
'flask',
'parse',
'tornado',
'pandas',
'statsmodels',
]
failed_list = []
for modname in modname_list:
try:
globals_ = {}
locals_ = {}
exec('import ' + modname, globals_, locals_)
except ImportError:
failed_list.append(modname)
except Exception as ex:
ut.printex(ex, 'Some othere error happened when importing %r ' % (modname,), iswarning=True)
failed_list.append(modname)
if len(failed_list) > 0:
print('The following modules are not installed')
print('\n'.join(failed_list))
return ''
[docs]def assert_modules():
"""
checkinfo functions return info_dict
checkinfo_func
CommandLine:
python -m ibeis.tests.assert_modules --test-assert_modules
Example:
>>> # DOCTEST_ENABLE
>>> from ibeis.tests.assert_modules import * # NOQA
>>> detailed_msg = assert_modules()
>>> print(detailed_msg)
"""
MACHINE_NAME = ut.get_computer_name()
machine_info_lines = []
machine_info_lines.append('sys.version = %r ' % (sys.version))
machine_info_lines.append('PATH = ' + ut.list_str(ut.get_path_dirs()))
machine_info_lines.append('\n\n\n============================')
machine_info_lines.append('Begining assert modules main')
machine_info_lines.append('* MACHINE_NAME = %r' % MACHINE_NAME)
machine_info_text = '\n'.join(machine_info_lines)
print(machine_info_text)
statustext_list = []
failed_list = []
fix_list = []
SHOW_STATUS = not ut.get_argflag(('--nostatus', '--nostat'))
for checkinfo_wrapper in ASSERT_FUNCS:
passed, current_version, target, infodict, statustext, suggested_fix = checkinfo_wrapper()
funcname = get_funcname(checkinfo_wrapper)
if SHOW_STATUS:
statustext_list.append(statustext)
if passed:
statustext_list.append(funcname + ' ' + str(infodict['__version__']) + ' passed')
#statustext_list.append('')
else:
failed_list.append(funcname + ' FAILED!!!')
fix_list.append(suggested_fix)
statustext_list.append(funcname + ' FAILED!!!')
if SHOW_STATUS:
statustext_list.append('')
output_text = '\n'.join(statustext_list)
failed_text = '\n'.join(failed_list)
print(output_text)
print(failed_text)
check_exist_text = check_modules_exists()
print(check_exist_text)
fix_text = ''
if len(fix_list) > 0:
fix_text += ('suggested fixes:\n')
fix_text += ('\n'.join(fix_list) + '\n')
print(fix_text)
detailed_msg = '\n'.join([
machine_info_text,
output_text,
failed_text,
check_exist_text,
fix_text,
])
return detailed_msg
if __name__ == '__main__':
"""
CommandLine:
python -m ibeis.tests.assert_modules
python -c "import utool, ibeis.tests.assert_modules; utool.doctest_funcs(ibeis.tests.assert_modules, allexamples=True)"
python -m ibeis.tests.assert_modules --allexamples
python ~/code/ibeis/ibeis/tests/assert_modules.py
python -m ibeis.tests.assert_modules
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
print('in assert module main')
#if len(sys.argv) == 1:
if not any(argv.startswith('--test-') or argv.startswith('--exec') for argv in sys.argv):
assert_modules()
else:
ut.doctest_funcs()