Source code for xdress.pep8names

"""Plugin for xdress which converts target names to PEP8 compatible versions.

This module is available as an xdress plugin by the name ``xdress.pep8names``.
It should probably come after ``xdress.autoall`` and after ``xdress.autodescribe``.

:author: Anthony Scopatz <scopatz@gmail.com>

PEP-8 Names Plugin API
======================
"""
from __future__ import print_function
import os
import re
import sys

from .utils import RunControl, NotSpecified, apiname, ensure_apiname
from .plugins import Plugin

if sys.version_info[0] >= 3:
    basestring = str

upperfirst = lambda s: s if 0 == len(s) else s[0].upper() + s[1:]

HAS_UPPER_RE = re.compile('([A-Z])')
HAS_UNDERSCORE_RE = re.compile('(_)')
UPPER_DIGIT_RE = re.compile('([A-Z0-9]+)')
WORD_RE = re.compile('(\w+)')
UNDERSCORE_WORD_RE = re.compile('(_\w+)')
UNDERSCORE_DIGIT_RE = re.compile('(_\d+)')

def _upperrepl(m):
    g1low = m.group(1).lower()
    g1start = m.start(1)
    if 0 == g1start:
        return g1low
    else:
        return '_' + g1low

def _underscorerepl(m):
    g1 = m.group(1)
    g1start = m.start(1)
    if 0 == g1start:
        g1s = g1.split('_')
        g1snew = []
        seennonempty = False
        for s in g1s:
            slen = len(s)
            if 0 == slen:
                if seennonempty:
                    continue
                else:
                    s = '_'
            else:
                seennonempty = True
            g1snew.append(s)
        print(g1snew)
        return ''.join(map(upperfirst, g1snew))
    else:
        return upperfirst(g1.replace('_', ''))

def _usdgrepl(m):
    g1 = m.group(1)
    return g1.replace('_', '')

[docs]def pep8func(name): """Converts a name, which may not be PEP-8 compliant for functions, methods, or variables, to a name that is compliant. """ if HAS_UPPER_RE.search(name) is not None: name = UPPER_DIGIT_RE.sub(_upperrepl, name) if UNDERSCORE_DIGIT_RE.search(name[1:]) is not None: name = name[0] + UNDERSCORE_DIGIT_RE.sub(_usdgrepl, name[1:]) return name
pep8var = pep8func
[docs]def pep8class(name): """Converts a name, which may not be PEP-8 compliant for classes to a name that is compliant. """ name = upperfirst(name) if HAS_UNDERSCORE_RE.search(name) is not None: new = UNDERSCORE_WORD_RE.sub(_underscorerepl, name) while new.startswith('_') and not name.startswith('_'): new = new[1:] name = new return name
[docs]def ensure_pep8name(name, kind): """Ensures that an apiname is valid for its kind: 'var', 'func', or 'class'. """ name = ensure_apiname(name) tarname = name.tarname old = tarname if isinstance(tarname, basestring) else tarname[0] if kind == 'class': new = pep8class(old) elif kind == 'func': new = pep8func(old) elif kind == 'var': new = pep8var(old) else: raise ValueError('kind {0!r} not recognized'.format(kind)) if old != new: new = new if isinstance(tarname, basestring) else (new,) + tarname[1:] name = name._replace(tarname=new) return name
[docs]class XDressPlugin(Plugin): """This class provides PEP-8 naming functionality for xdress.""" def setup(self, rc): for i, var in enumerate(rc.variables): rc.variables[i] = ensure_pep8name(var, 'var') for i, fnc in enumerate(rc.functions): rc.functions[i] = ensure_pep8name(fnc, 'func') for i, cls in enumerate(rc.classes): rc.classes[i] = ensure_pep8name(cls, 'class')