aboutsummaryrefslogblamecommitdiffstats
path: root/setup.py
blob: 8806ee4d48bbc8d7a2d38ff4e88040ecb4269ba2 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

                 
                                                                           
   









                                                                        
 

               

                                        
















                                                                            
                       


































































































                                                                                
 

                                              
 









                                                                          
 

                                   




                           
                                               

                                           
                       
                            






                                                      

 
#!/usr/bin/python
"""
setup.py - Setup package with the help from Python's DistUtils and friends.
"""
from distutils.core import setup, Command
from distutils.command.sdist import sdist as _sdist
from distutils.command.build import build as _build
from distutils.command.install_data import install_data as _install_data
from distutils.command.install_lib import install_lib as _install_lib
from distutils.command.install import install as _install
from unittest import TextTestRunner, TestLoader
from glob import glob
from os.path import splitext, basename, join as pjoin
import os, sys

locale = None
builddir = None

data_files = [ ('/etc', [ 'sos.conf']), 
    ('share/sos/', ['gpgkeys/rhsupport.pub']),
    ('share/man/man1', ['sosreport.1'])]


class refresh_translations(Command):
    user_options = []
    description = "Regenerate POT file and merge with current translations."
    def initialize_options(self):
        pass
    
    def finalize_options(self):
        pass

    def run(self):
        # generate POT file
        files = [ "sos/*.py" ]
        pot_cmd = "xgettext --language=Python -o po/sos.pot"
        for f in files:
            pot_cmd += " %s " % f
        os.system(pot_cmd)

        # merge new template with existing translations
        for po in glob.glob(os.path.pjoin(os.getcwd(), 'po', '*.po')):
            os.system("msgmerge -U po/%s po/sos.pot" %
                      os.path.basename(po))

class sdist(_sdist):
    """ updates man pages """
    def run(self):
        self._update_manpages()
        _sdist.run(self)

    def _update_manpages(self):
        if os.system("make -C man/en"):
            raise RuntimeError("Couldn't generate man pages.")
        
class build(_build):
    """ compile i18n files """
    def run(self):
        global builddir
        if not os.path.exists("build/po"):
            os.makedirs("build/po")

        for filename in glob(pjoin(os.getcwd(), 'po', '*.po')):
            filename = os.path.basename(filename)
            lang = os.path.basename(filename)[0:len(filename)-3]
            if not os.path.exists("build/po/%s" % lang):
                os.makedirs("build/po/%s" % lang)
            newname = "build/po/%s/sos.mo" % lang

            print "Building %s from %s" % (newname, filename)
            os.system("msgfmt po/%s -o %s" % (filename, newname))

        _build.run(self)
        builddir = self.build_lib
        
class install(_install):
    """ extract install base for locale install """
    def finalize_options(self):
        global locale
        _install.finalize_options(self)
        locale = self.install_base + "/share/locale"
        
class install_lib(_install_lib):
    """ custom install_lib command to place locale/docs location into library"""

    def run(self):
        for initfile in [ "sos/__init__.py" ]:
            cmd =  "cat %s | " % initfile
            cmd += """sed -e "s,::LOCALEDIR::,%s," > """ % locale
            cmd += "%s/%s" % (builddir, initfile)
            os.system(cmd)

        _install_lib.run(self)
                                                            
class install_data(_install_data):
    """ custom install_data command to prepare i18n/docs files for install"""
    def run(self):
        dirlist = os.listdir("build/po")
        for lang in dirlist:
            if lang != "." and lang != "..":
                install_path = "share/locale/%s/LC_MESSAGES/" % lang
                src_path = "build/po/%s/sos.mo" % lang
                print "Installing %s to %s" % (src_path, install_path)
                toadd = (install_path, [src_path])
                # Add these to the datafiles list
                datafiles.append(toadd)

class TestBaseCommand(Command):
    user_options = []

    def initialize_options(self):
        self.debug = 0
        self._testfiles = []
        self._dir = os.getcwd()

    def finalize_options(self):
        pass

    def run(self):
        tests = TestLoader().loadTestsFromNames(self._testfiles)
        t = TextTestRunner(verbosity = 1)

        result = t.run(tests)
        if len(result.failures) > 0 or len(result.errors) > 0:
            sys.exit(1)
        else:
            sys.exit(0)

class TestSOS(TestBaseCommand):
    description = "Runs unittest"
    user_options = TestBaseCommand.user_options + \
                   [("testfile=", None, "Specify test to run"),]

    def initialize_options(self):
        TestBaseCommand.initialize_options(self)
        test.testfile = None

    def finalize_options(self):
        TestBaseCommand.finalize_options(self)

    def run(self):
        """ find all tests """
        testfiles = []
        for t in glob(pjoin(self._dir, 'tests', '*.py')):
            if self.testfile:
                base = os.path.basename(t)
                check = os.path.basename(self.testfile)
                if base != check and base != (check + ".py"):
                    continue
            testfiles.append('.'.join(['tests',splitext(basename(t))[0]]))

        self._testfiles = testfiles
        TestBaseCommand.run(self)

setup(
    name = 'sos',
    version = '1.9',
    author = 'Adam Stokes',
    author_email = 'astokes@fedoraproject.org',
    url = 'http://fedorahosted.org/sos',
    description = 'SOS - son of sysreport',
    packages = ['sos'],
    data_files = data_files,
    cmdclass = {
        'test': TestSOS,
        'sdist': sdist, 'build' : build,
        'install_data' : install_data,
        'install_lib' : install_lib,
        'install' : install,
        'refresh_translations' : refresh_translations}
)