Source code for fijibin

"""
Latest Life-Line version of fiji for easy inclusion in Python projects.
"""
import sys, os, platform, stat, shutil
from io import BytesIO
from zipfile import ZipFile
from os.path import join, dirname
from . import macro
try:
    from zipfile import BadZipZile
except ImportError:
    from zipfile import BadZipfile
    BadZipFile = BadZipfile

__all__ = ['fetch', 'macro']


##
# CONSTANTS
##

VERSION = open(join(dirname(__file__), 'VERSION')).read().strip()
FIJI_VERSION = '20141125'
BASE_URL = 'http://fiji.sc/downloads/Life-Line/fiji-'
END_URL = '-' + FIJI_VERSION + '.zip'

HOME = os.path.expanduser('~')
BIN_FOLDER = join(HOME, '.bin')
EXTRACT_FOLDER = join(BIN_FOLDER, 'Fiji.app')
FIJI_ROOT = join(BIN_FOLDER, 'Fiji-' + FIJI_VERSION + '.app')
BIN_NAMES = {
    'Darwin64bit': join(FIJI_ROOT, 'Contents/MacOS/ImageJ-macosx'),
    'Linux32bit': join(FIJI_ROOT, 'ImageJ-linux32'),
    'Linux64bit': join(FIJI_ROOT, 'ImageJ-linux64'),
    'Windows32bit': join(FIJI_ROOT, 'ImageJ-win32.exe'),
    'Windows64bit': join(FIJI_ROOT, 'ImageJ-win64.exe')
}

_unix_url = BASE_URL + 'nojre' + END_URL
URLS = {
    'Darwin64bit': _unix_url,
    'Linux32bit': _unix_url,
    'Linux64bit': _unix_url,
    'Windows32bit': BASE_URL + 'win32' + END_URL,
    'Windows64bit': BASE_URL + 'win64'  + END_URL
}

SYSTEM = platform.system() + platform.architecture()[0]
BIN = BIN_NAMES[SYSTEM]
URL = URLS[SYSTEM]


##
# FETCH BINARY
##
[docs]def fetch(force=False): """Fetch and extract latest Life-Line version of Fiji is just ImageJ to *~/.bin*. Parameters ---------- force : bool Force overwrite of existing Fiji in *~/.bin*. """ try: # python 2 from urllib2 import urlopen, HTTPError, URLError except ImportError: # python 3 from urllib.request import urlopen, HTTPError, URLError if os.path.isdir(FIJI_ROOT) and not force: return elif not os.path.isdir(FIJI_ROOT): print('Fiji missing in %s' % FIJI_ROOT) if force: print('Deleting %s' % FIJI_ROOT) shutil.rmtree(FIJI_ROOT, ignore_errors=True) print('Downloading fiji from %s' % URL) try: req = urlopen(URL) try: size = int(req.info()['content-length']) except AttributeError: size = -1 chunk = 512*1024 fp = BytesIO() i = 0 while 1: data = req.read(chunk) if not data: break fp.write(data) if size > 0: percent = fp.tell() // (size/100) msg = 'Downloaded %d percent \r' % percent else: msg = 'Downloaded %d bytes\r' % fp.tell() sys.stdout.write(msg) except (HTTPError, URLError) as e: print('Error getting fiji: {}'.format(e)) sys.exit(1) try: print('\nExtracting zip') z = ZipFile(fp) z.extractall(BIN_FOLDER) # move to Fiji-VERSION.app to easily check if it exists (upon fijibin upgrade) os.rename(EXTRACT_FOLDER, FIJI_ROOT) except (BadZipFile, IOError) as e: print('Error extracting zip: {}'.format(e)) sys.exit(1) for path in BIN_NAMES.values(): st = os.stat(path) os.chmod(path, st.st_mode | stat.S_IEXEC) ## # Download upon import if Fiji is missing ##
fetch()