zhasm
7/4/2013 - 8:59 AM

自动发现和编译coffeeb?文件。自动清除错误编译的文件。 原理:检测所有当前目录下的coffee、coffeeb文件,生成 Makefile,然后运行make。 约定coffeeb是以bare模式编译的coffee文件。 执行:python makecoffee.py

自动发现和编译coffeeb?文件。自动清除错误编译的文件。 原理:检测所有当前目录下的coffee、coffeeb文件,生成 Makefile,然后运行make。 约定coffeeb是以bare模式编译的coffee文件。 执行:python makecoffee.py

#!/usr/bin/env   python
# -*- encoding:  utf-8 -*-
#
#       Author:  Rex Zhang
#  Create Time:  2013-07-04 16:14
#    File name:  makecoffee.py

import os
import re
import logging
import sys


def getFiles(pattern, location='.', ignore=None):
    if ignore:
        cmd = 'find %s -name "%s" |grep -iv "%s"' % (location, pattern, ignore)
    else:
        cmd = 'find %s -name "%s"' % (location, pattern)
    return [i.replace('\n', '') for i in os.popen(cmd).readlines() if '.#' not in i]

COMMENT = len(sys.argv) > 1


class Coffee():

    def __init__(self, fn):

        self.fn = fn
        self.bare = 'b' if '.coffeeb' in fn else ''
        self.js = re.sub(r'\.coffeeb?$', '.js', fn)
        self._autoClean()

    def _autoClean(self):
        if not self.bare:
            return
        if not os.path.exists(self.js):
            return
        c = open(self.js).read()
        if re.search(r'(?im)^\(function\(\)\s\{', c) and \
            re.search(r'(?im)\}\)\.call\(this\);$', c):
            try:
                os.remove(self.js)
            except Exception as e:
                print 'delete %s error: %r' % (self.js, e)

    def getJS(self):
        return self.js

    def getCmp(self):
        d = vars(self)

        d.update({
            'min': self.js.replace('.js', '.min.js'),
        })

        cmt = '#' if COMMENT else ''
        d.update({'cmt': cmt})
        return """%(js)s: %(fn)s\n\tcoffee --no-header -c%(bare)s %(fn)s
\t%(cmt)sjava -jar ~/Dropbox/bin/yuicompressor.jar --type js %(js)s --charset utf-8 -o %(min)s
\t%(cmt)smv %(min)s %(js)s
""" % d

    def isPure(self):
        return self.bare == ''


class Less():

    def __init__(self, fn):
        self.fn = fn
        self.css = re.sub(r'(?i)\.less', '.css', fn)
        self.min = self.css.replace('.css', '.min.css')

    def getCss(self):
        return self.css

    def getCmp(self):
        d = vars(self)
        cmt = '#' if COMMENT else ''
        d.update({'cmt': cmt})
        return """%(css)s: %(fn)s
\tlessc %(fn)s %(css)s
\t%(cmt)sjava -jar ~/Dropbox/bin/yuicompressor.jar --type css %(css)s --charset utf-8 -o %(min)s
\t%(cmt)smv %(min)s %(css)s
        """ % d


class MakeLess():
    def __init__(self):
        self.files = [Less(i) for i in getFiles('*.less', ignore='font-awesome')]

    def _clean(self):
        files = [i.getCss() for i in self.files]
        return sorted(files)

    def _getFiles(self, s, name):
        files = sorted([i.getCss() for i in s])
        return "\n%s: %s\n" % (name, " ".join(files))

    def getAll(self):
        return self._getFiles(self.files, 'css')

    def getClean(self):
        return """cleanCss:\n\trm %s\n""" % ' '.join(self._clean())

    def getBody(self):
        cmd = [self.getAll(), self.getClean()]
        for i in self.files:
            cmd.append(i.getCmp())
        return '\n'.join(cmd)

    def run(self):
        cmd = self.getBody()
        f = open('Makefile', 'a')
        f.write(cmd)
        f.close()
        print '\n'.join(os.popen('make').readlines())


class MakeCoffee():

    def __init__(self):

        self.pure = [Coffee(i) for i in getFiles('*.coffee')]
        self.bare = [Coffee(i) for i in getFiles('*.coffeeb')]

    def _clean(self):

        files = [i.getJS() for i in self.pure+self.bare]
        return sorted(files)

    def _getFiles(self, s, name):
        files = sorted([i.getJS() for i in s])
        return "%s: %s\n" % (name, " ".join(files))

    def getBare(self):
        return self._getFiles(self.bare, 'bare')

    def getPure(self):
        return self._getFiles(self.pure, 'pure')

    def getAll(self):
        return self._getFiles(self.pure+self.bare, 'all')

    def getClean(self):

        return """clean:\n\trm %s\n""" % ' '.join(self._clean())

    def getBody(self):

        cmd = [self.getAll(), self.getPure(), self.getBare(), self.getClean()]

        for i in self.pure:
            cmd.append(i.getCmp())

        for i in self.bare:
            cmd.append(i.getCmp())

        return '\n'.join(cmd)

    def run(self):

        cmd = self.getBody()
        f = open('Makefile', 'w')
        f.write(cmd)
        f.close()
#        print '\n'.join(os.popen('make').readlines())

if __name__ == '__main__':

    MakeCoffee().run()
    MakeLess().run()