Mercurial > hg > MakeItSo
comparison makeitso/python.py @ 201:65684aae6bfe
make unittest template smarter
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Wed, 09 Jul 2014 15:48:41 -0700 |
parents | 5a2edca13b36 |
children | a1a615aae3d1 |
comparison
equal
deleted
inserted
replaced
200:5a2edca13b36 | 201:65684aae6bfe |
---|---|
26 from makeitso import ContentTemplate | 26 from makeitso import ContentTemplate |
27 from optparse import OptionParser | 27 from optparse import OptionParser |
28 from template import MakeItSoTemplate | 28 from template import MakeItSoTemplate |
29 from template import Variable | 29 from template import Variable |
30 | 30 |
31 | |
31 class SetupPy(MakeItSoTemplate): | 32 class SetupPy(MakeItSoTemplate): |
32 """template for setup.py""" | 33 """template for setup.py""" |
33 templates = [('python_package', 'setup.py')] | 34 templates = [('python_package', 'setup.py')] |
34 | 35 |
36 | |
35 class Unittest(MakeItSoTemplate): | 37 class Unittest(MakeItSoTemplate): |
36 """template for python unittest""" | 38 """template for python unittest""" |
37 templates = [('python_package', 'tests', 'test_{{package}}.py')] | 39 templates = [('python_package', 'tests', 'test_{{package}}.py')] |
40 def pre(self, variables, output): | |
41 if 'package' not in variables: | |
42 package = os.path.splitext(os.path.basename(output.rstrip(os.path.sep)))[0] | |
43 indicator = 'test_' | |
44 if package.startswith(indicator): | |
45 package = package[len(indicator):] | |
46 variables['package'] = package | |
47 | |
38 | 48 |
39 class PythonTemplate(MakeItSoTemplate): | 49 class PythonTemplate(MakeItSoTemplate): |
40 """abstract base class for python-type templates""" | 50 """abstract base class for python-type templates""" |
41 vars = [Variable('description'), | 51 vars = [Variable('description'), |
42 Variable('author', 'author of the package'), | 52 Variable('author', 'author of the package'), |
43 Variable('email', "author's email"), | 53 Variable('email', "author's email"), |
44 Variable('url', 'project url'), | 54 Variable('url', 'project url'), |
45 Variable('repo', 'project repository'), | 55 Variable('repo', 'project repository'), |
46 ] | 56 ] |
47 | 57 |
48 def output2name(self, path): | 58 def output2name(self, path): |
49 return os.path.splitext(os.path.basename(path.rstrip(os.path.sep)))[0] | 59 return os.path.splitext(os.path.basename(path.rstrip(os.path.sep)))[0] |
50 | 60 |
51 | 61 |
52 class PythonScriptTemplate(PythonTemplate): | 62 class PythonScriptTemplate(PythonTemplate): |
53 """template for a single python script""" | 63 """template for a single python script""" |
54 templates = [('python_package', '{{package}}', '{{main}}.py')] | 64 templates = [('python_package', '{{package}}', '{{main}}.py')] |
55 vars = [Variable('description')] | 65 vars = [Variable('description')] |
56 | 66 |
57 | 67 |
58 class PythonModuleTemplate(PythonTemplate): | 68 class PythonModuleTemplate(PythonTemplate): |
59 """single module python package""" | 69 """single module python package""" |
60 # TODO: this should use the same files as PythonPackageTemplate | |
61 templates = ['python_module', | |
62 ('python_package', '{{package}}', '{{main}}.py')] | |
63 vars = [Variable('description')] | |
64 look = False | |
65 | 70 |
66 def pre(self, variables, output): | 71 templates = ['python_module', |
67 variables['project'] = variables['module'] = variables['main'] = self.output2name(output) | 72 ('python_package', '{{package}}', '{{main}}.py')] |
73 vars = [Variable('description')] | |
74 look = False | |
68 | 75 |
69 def post(self, variables, output): | 76 def pre(self, variables, output): |
70 shutil.move(os.path.join(output, '{{main.py}}'), | 77 variables['project'] = variables['module'] = variables['main'] = self.output2name(output) |
71 os.path.join(output, variables['main'])) | 78 |
79 def post(self, variables, output): | |
80 shutil.move(os.path.join(output, '{{main.py}}'), | |
81 os.path.join(output, variables['main'])) | |
72 | 82 |
73 class PythonPackageTemplate(PythonTemplate): | 83 class PythonPackageTemplate(PythonTemplate): |
74 """ | 84 """ |
75 python package template | 85 python package template |
76 """ | 86 """ |
77 name = 'python-package' | |
78 templates = ['python_package'] | |
79 vars = [Variable('description'), | |
80 Variable('author', 'author of the package'), | |
81 Variable('email', "author's email"), | |
82 Variable('url', 'project url'), | |
83 Variable('repo', 'project repository'), | |
84 ] | |
85 look = False | |
86 | |
87 # things that go in setup.py | |
88 dependencies = {'web.py': ['webob'], | |
89 'template.py': ['MakeItSo']} | |
90 console_scripts = {'main.py': '{{project}} = {{package}}.{{main}}:main', | |
91 'template.py': '{{package}}-template = {{package}}.template:main' | |
92 } | |
93 | |
94 def __init__(self, **kw): | |
95 MakeItSoTemplate.__init__(self, **kw) | |
96 | |
97 # TODO: get the templates you actually care about [maybe from the CLI?] | 87 # TODO: get the templates you actually care about [maybe from the CLI?] |
98 | 88 |
99 def pre(self, variables, output): | 89 name = 'python-package' |
100 """ | 90 templates = ['python_package'] |
101 sanitize some variables | 91 vars = [Variable('description'), |
102 """ | 92 Variable('author', 'author of the package'), |
93 Variable('email', "author's email"), | |
94 Variable('url', 'project url'), | |
95 Variable('repo', 'project repository'), | |
96 ] | |
97 look = False | |
103 | 98 |
104 # get project from output directory | 99 # things that go in setup.py |
105 variables['project'] = self.output2name(output) | 100 dependencies = {'web.py': ['webob'], |
101 'template.py': ['MakeItSo']} | |
102 console_scripts = {'main.py': '{{project}} = {{package}}.{{main}}:main', | |
103 'template.py': '{{package}}-template = {{package}}.template:main' | |
104 } | |
106 | 105 |
107 # get package name from project | 106 def pre(self, variables, output): |
108 allowable = set(string.letters + string.digits + '_') | 107 """ |
109 if not set(variables['project']).issubset(allowable): | 108 sanitize some variables |
110 raise AssertionError("Illegal fields in package name") | 109 """ |
111 variables['package'] = variables['project'].lower() | |
112 | 110 |
113 # name of CLI main file | 111 # get project from output directory |
114 variables['main'] = 'main' | 112 variables['project'] = self.output2name(output) |
115 | 113 |
116 # dependencies | 114 # get package name from project |
117 dependencies = set([]) | 115 allowable = set(string.letters + string.digits + '_') |
118 for template, dependency in self.dependencies.items(): | 116 if not set(variables['project']).issubset(allowable): |
119 dependencies.update(dependency) | 117 raise AssertionError("Illegal fields in package name") |
120 dependencies = list(dependencies) | 118 variables['package'] = variables['project'].lower() |
121 variables['dependencies'] = dependencies | |
122 | 119 |
123 # console_scripts | 120 # name of CLI main file |
124 console_scripts = [] | 121 variables['main'] = 'main' |
125 for template, console_script in self.console_scripts.items(): | 122 |
126 console_scripts.append(console_script) | 123 # package dependencies |
127 if console_scripts: | 124 dependencies = set([]) |
128 s = 'setup(' # placeholder string | 125 for template, dependency in self.dependencies.items(): |
129 script_strings = ['[console_scripts]'] | 126 dependencies.update(dependency) |
130 for console_script in console_scripts: | 127 variables['dependencies'] = list(dependencies) |
131 template = ContentTemplate(console_script) | 128 |
132 output = template.substitute(project=variables['project'], | 129 # console_scripts |
133 package=variables['package'], | 130 console_scripts = [] |
134 main=variables['main']) | 131 for template, console_script in self.console_scripts.items(): |
135 script_strings.append(output) | 132 console_scripts.append(console_script) |
136 variables['console_scripts'] = '\n'.join([' ' * len(s) + i | 133 if console_scripts: |
137 for i in script_strings]) | 134 s = 'setup(' # placeholder string |
138 else: | 135 script_strings = ['[console_scripts]'] |
139 variables['console_scripts'] = '' | 136 for console_script in console_scripts: |
137 template = ContentTemplate(console_script) | |
138 output = template.substitute(project=variables['project'], | |
139 package=variables['package'], | |
140 main=variables['main']) | |
141 script_strings.append(output) | |
142 variables['console_scripts'] = '\n'.join([' ' * len(s) + i | |
143 for i in script_strings]) | |
144 else: | |
145 variables['console_scripts'] = '' | |
140 | 146 |
141 | 147 |
142 class PythonPackageCLI(MakeItSoCLI): | 148 class PythonPackageCLI(MakeItSoCLI): |
143 """ | 149 """ |
144 CLI front end for the python package template | 150 CLI front end for the python package template |
145 """ | 151 """ |
146 usage = '%prog [options] project' | 152 usage = '%prog [options] project' |
153 | |
147 | 154 |
148 def main(args=sys.argv[1:]): | 155 def main(args=sys.argv[1:]): |
149 cli = PythonPackageCLI(PythonPackageTemplate) | 156 """CLI""" |
150 cli(*args) | 157 cli = PythonPackageCLI(PythonPackageTemplate) |
158 cli(*args) | |
151 | 159 |
152 if __name__ == '__main__': | 160 if __name__ == '__main__': |
153 main() | 161 main() |