devtools/pkginfo.py
author Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
Thu, 23 Jul 2009 15:28:41 +0200
changeset 2456 aa25d6b244c8
parent 1977 606923dff11b
permissions -rw-r--r--
new cwuri metadata + a few tests fixes on the way

"""distutils / __pkginfo__ helpers for cubicweb applications

:organization: Logilab
:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
"""

import os
from os.path import isdir, join


def get_distutils_datafiles(cube, i18n=True, recursive=False):
    """
    :param cube: application cube's name
    """
    data_files = []
    data_files += get_basepyfiles(cube)
    data_files += get_webdatafiles(cube)
    if i18n:
        data_files += get_i18nfiles(cube)
    data_files += get_viewsfiles(cube, recursive=recursive)
    data_files += get_migrationfiles(cube)
    data_files += get_schemafiles(cube)
    return data_files



## listdir filter funcs ################################################
def nopyc_and_nodir(fname):
    if isdir(fname) or fname.endswith('.pyc') or fname.endswith('~'):
        return False
    return True

def no_version_control(fname):
    if fname in ('CVS', '.svn', '.hg'):
        return False
    if fname.endswith('~'):
        return False
    return True

def basepy_files(fname):
    if fname.endswith('.py') and fname != 'setup.py':
        return True
    return False

def chain(*filters):
    def newfilter(fname):
        for filterfunc in filters:
            if not filterfunc(fname):
                return False
        return True
    return newfilter

def listdir_with_path(path='.', filterfunc=None):
    if filterfunc:
        return [join(path, fname) for fname in os.listdir(path) if filterfunc(join(path, fname))]
    else:
        return [join(path, fname) for fname in os.listdir(path)]


## data_files helpers ##################################################
CUBES_DIR = join('share', 'cubicweb', 'cubes')

def get_i18nfiles(cube):
    """returns i18n files in a suitable format for distutils's
    data_files parameter
    """
    i18ndir = join(CUBES_DIR, cube, 'i18n')
    potfiles = [(i18ndir, listdir_with_path('i18n', chain(no_version_control, nopyc_and_nodir)))]
    return potfiles


def get_viewsfiles(cube, recursive=False):
    """returns views files in a suitable format for distutils's
    data_files parameter

    :param recursive: include views' subdirs recursively if True
    """
    if recursive:
        datafiles = []
        for dirpath, dirnames, filenames in os.walk('views'):
            filenames = [join(dirpath, fname) for fname in filenames
                         if nopyc_and_nodir(join(dirpath, fname))]
            dirpath = join(CUBES_DIR, cube, dirpath)
            datafiles.append((dirpath, filenames))
        return datafiles
    else:
        viewsdir = join(CUBES_DIR, cube, 'views')
        return [(viewsdir,
                 listdir_with_path('views', filterfunc=nopyc_and_nodir))]


def get_basepyfiles(cube):
    """returns cube's base python scripts (tali18n.py, etc.)
    in a suitable format for distutils's data_files parameter
    """
    return [(join(CUBES_DIR, cube),
             [fname for fname in os.listdir('.')
              if fname.endswith('.py') and fname != 'setup.py'])]


def get_webdatafiles(cube):
    """returns web's data files (css, png, js, etc.) in a suitable
    format for distutils's data_files parameter
    """
    return [(join(CUBES_DIR, cube, 'data'),
             listdir_with_path('data', filterfunc=no_version_control))]


def get_migrationfiles(cube):
    """returns cube's migration scripts
    in a suitable format for distutils's data_files parameter
    """
    return [(join(CUBES_DIR, cube, 'migration'),
             listdir_with_path('migration', no_version_control))]


def get_schemafiles(cube):
    """returns cube's schema files
    in a suitable format for distutils's data_files parameter
    """
    return [(join(CUBES_DIR, cube, 'schema'),
             listdir_with_path('schema', no_version_control))]