Last active
December 19, 2015 08:29
-
-
Save zhasm/5926097 to your computer and use it in GitHub Desktop.
自动发现和编译coffeeb?文件。自动清除错误编译的文件。
原理:检测所有当前目录下的coffee、coffeeb文件,生成 Makefile,然后运行make。
约定coffeeb是以bare模式编译的coffee文件。
执行:python makecoffee.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment