swc-installation-test-2.py: Add support for package-specific URLs
authorW. Trevor King <wking@tremily.us>
Tue, 26 Feb 2013 02:51:19 +0000 (21:51 -0500)
committerW. Trevor King <wking@tremily.us>
Tue, 26 Feb 2013 02:51:19 +0000 (21:51 -0500)
To give users more targeted advice for fixing their installation
problems, we should link them to somewhere more specific than the root
SWC setup page.  The two knobs in the specific URL are system/OS
(Gentoo, Debian, OS X, MS Windows, ...) and package (the dependency
name: emacs, git, virtual-browser, ...).  We don't have consistent
URLs upstream yet [1], but maybe this commit will help motivate them
;).

[1]: https://github.com/swcarpentry/website/issues/2

setup/swc-installation-test-2.py

index b2a116bbc2c0e99009ea8b15197176206c4d0051..7269b73b5e51299235fa088e83937c69b838c41d 100755 (executable)
@@ -45,6 +45,10 @@ import re as _re
 import shlex as _shlex
 import subprocess as _subprocess
 import sys as _sys
+try:  # Python 3.x
+    import urllib.parse as _urllib_parse
+except ImportError:  # Python 2.x
+    import urllib as _urllib_parse  # for quote()
 
 
 if not hasattr(_shlex, 'quote'):  # Python versions older than 3.3
@@ -107,6 +111,12 @@ class InvalidCheck (KeyError):
 
 
 class DependencyError (Exception):
+    _system_map = {  # map long system names to shorter forms
+        'Gentoo Base System': 'Gentoo',
+        }
+    _supported = [  # (system, package) pairs with specific instructions
+        ]
+
     def _get_message(self):
         return self._message
     def _set_message(self, message):
@@ -121,8 +131,22 @@ class DependencyError (Exception):
             causes = []
         self.causes = causes
 
+    def get_url(self):
+        url = 'http://software-carpentry.org/setup/'
+        system = _platform.system()
+        if system == 'Linux':
+            system = _platform.linux_distribution()[0] or system
+        system = self._system_map.get(system, system)
+        package = self.checker.name
+        if (system, package) in self._supported:
+            url = '{0}{1}.html#{2}'.format(
+                url,
+                _urllib_parse.quote(system.lower()),
+                _urllib_parse.quote(package))
+        return url
+
     def __str__(self):
-        url = 'http://software-carpentry.org/setup/'  # TODO: per-package URL
+        url = self.get_url()
         lines = [
             'check for {0} failed:'.format(self.checker.full_name()),
             '  ' + self.message,