3 """Software Carpentry Windows Installer
5 Helps mimic a *nix environment on Windows with as little work as possible.
8 * Provides standard ipython operation for msysgit
9 * Provides standard nosetests behavior for msysgit
10 * Installs nano and makes it accessible from msysgit
14 1. Install 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
23 from io import BytesIO as _BytesIO
24 except ImportError: # Python 2
25 from StringIO import StringIO as _BytesIO
28 from urllib.request import urlopen as _urlopen
29 except ImportError: # Python 2
30 from urllib2 import urlopen as _urlopen
34 def install_nano(install_directory):
35 """Download and install the nano text editor"""
36 url = "http://www.nano-editor.org/dist/v2.2/NT/nano-2.2.6.zip"
38 nano_zip_content = _BytesIO(r.read())
39 nano_zip = zipfile.ZipFile(nano_zip_content)
40 nano_files = ['nano.exe', 'cygwin1.dll', 'cygintl-8.dll',
41 'cygiconv-2.dll', 'cyggcc_s-1.dll']
42 for file_name in nano_files:
43 nano_zip.extract(file_name, install_directory)
45 def create_ipython_entry_point(python_scripts_directory):
46 """Creates a terminal-based IPython entry point for msysgit"""
47 contents = '\n'.join([
48 '#!/usr/bin/env python',
49 'from IPython.frontend.terminal.ipapp import launch_new_instance',
50 'launch_new_instance()',
53 with open(os.path.join(python_scripts_directory, 'ipython'), 'w') as f:
56 def create_nosetests_entry_point(python_scripts_directory):
57 """Creates a terminal-based nosetests entry point for msysgit"""
58 contents = '\n'.join([
59 '#!/usr/bin/env/ python',
62 "if __name__ == '__main__':",
63 ' sys.exit(nose.core.main())',
66 with open(os.path.join(python_scripts_directory, 'nosetests'), 'w') as f:
70 def update_bash_profile(extra_paths=()):
71 """Create or append to a .bash_profile for Software Carpentry
73 Adds nano to the path, sets the default editor to nano, and adds
74 additional paths for other executables.
78 '# Add paths for Software-Carpentry-installed scripts and executables',
79 'export PATH=$PATH:{}'.format(':'.join(
80 make_posix_path(path) for path in extra_paths),),
82 '# Make nano the default editor',
86 config_path = os.path.join(os.path.expanduser('~'), '.bash_profile')
87 with open(config_path, 'a') as f:
88 f.write('\n'.join(lines))
90 def make_posix_path(windows_path):
91 """Convert a Windows path to a posix path"""
92 return windows_path.replace('\\', '/').replace('C:', '/c')
96 home_dir = os.path.expanduser('~')
97 nano_dir = os.path.join(home_dir, '.nano')
98 bin_dir = os.path.join(home_dir, '.swc-bin')
99 create_ipython_entry_point(python_scripts_directory=bin_dir)
100 create_nosetests_entry_point(python_scripts_directory=bin_dir)
101 install_nano(installation_directory=nano_dir)
102 update_bash_profile(extra_paths=(bin_dir, nano_dir))
105 if __name__ == '__main__':