3 """Software Carpentry Windows Installer
5 Helps mimic a *nix environment on Windows with as little work as possible.
8 * Installs nano and makes it accessible from msysgit
9 * Provides standard nosetests behavior for msysgit
13 1. Install Python, IPython, and Nose. An easy way to do this is with
14 the Anaconda CE Python distribution
15 http://continuum.io/anacondace.html
17 http://code.google.com/p/msysgit/downloads/list?q=full+installer+official+git
18 3. Run swc_windows_installer.py
19 You should be able to simply double click the file in Windows
25 from io import BytesIO as _BytesIO
26 except ImportError: # Python 2
27 from StringIO import StringIO as _BytesIO
30 from urllib.request import urlopen as _urlopen
31 except ImportError: # Python 2
32 from urllib2 import urlopen as _urlopen
36 def zip_install(url, sha1, install_directory):
37 """Download and install a zipped bundle of compiled software"""
40 download_sha1 = hashlib.sha1(zip_bytes).hexdigest()
41 if download_sha1 != sha1:
43 'downloaded {!r} has the wrong SHA1 hash: {} != {}'.format(
44 url, downloaded_sha1, sha1))
45 zip_io = _BytesIO(zip_bytes)
46 zip_file = zipfile.ZipFile(zip_io)
47 if not os.path.isdir(install_directory):
48 os.makedirs(install_directory)
49 zip_file.extractall(install_directory)
52 def install_nano(install_directory):
53 """Download and install the nano text editor"""
55 url='http://www.nano-editor.org/dist/v2.2/NT/nano-2.2.6.zip',
56 sha1='f5348208158157060de0a4df339401f36250fe5b',
57 install_directory=install_directory)
60 def create_nosetests_entry_point(python_scripts_directory):
61 """Creates a terminal-based nosetests entry point for msysgit"""
62 contents = '\n'.join([
63 '#!/usr/bin/env/ python',
66 "if __name__ == '__main__':",
67 ' sys.exit(nose.core.main())',
70 if not os.path.isdir(python_scripts_directory):
71 os.makedirs(python_scripts_directory)
72 with open(os.path.join(python_scripts_directory, 'nosetests'), 'w') as f:
76 def update_bash_profile(extra_paths=()):
77 """Create or append to a .bash_profile for Software Carpentry
79 Adds nano to the path, sets the default editor to nano, and adds
80 additional paths for other executables.
84 '# Add paths for Software-Carpentry-installed scripts and executables',
85 'export PATH=$PATH:{}'.format(':'.join(
86 make_posix_path(path) for path in extra_paths),),
88 '# Make nano the default editor',
92 config_path = os.path.join(os.path.expanduser('~'), '.bash_profile')
93 with open(config_path, 'a') as f:
94 f.write('\n'.join(lines))
96 def make_posix_path(windows_path):
97 """Convert a Windows path to a posix path"""
98 return windows_path.replace('\\', '/').replace('C:', '/c')
102 swc_dir = os.path.join(os.path.expanduser('~'), '.swc')
103 bin_dir = os.path.join(swc_dir, 'bin')
104 create_nosetests_entry_point(python_scripts_directory=bin_dir)
105 nano_dir = os.path.join(swc_dir, 'lib', 'nano')
106 install_nano(install_directory=nano_dir)
107 update_bash_profile(extra_paths=(nano_dir, bin_dir))
110 if __name__ == '__main__':