diff --git a/README.md b/README.md index 09b6c82..89ef768 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,22 @@ test-app-builder ## Usage -usage: main.py [-h] [-a APPS] [-m MODELS] target +usage: gen.py [-h] [-a APPS] [-m MODELS] [-f MAX_FIELDS] target -positional arguments: - target target django directory + positional arguments: + target target django directory -optional arguments: - -h, --help show this help message and exit - -a APPS, --apps APPS - -m MODELS, --models MODELS + optional arguments: + -h, --help show this help message and exit + -a APPS, --apps APPS + -m MODELS, --models MODELS + -f MAX_FIELDS, --max-fields MAX_FIELDS ## Example -> $ mkdir mysite -> $ python main.py mysite -a 10 -m 100 + $ mkdir mysite + $ python main.py mysite -a 10 -m 100 ## Run Tests -> $ python -m unittest tests + $ python -m unittest tests diff --git a/main.py b/main.py deleted file mode 100644 index f42fe29..0000000 --- a/main.py +++ /dev/null @@ -1,16 +0,0 @@ -import argparse - -from gen import apps_builder - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('target', help='target django directory') - parser.add_argument('-a', '--apps', default=1, type=int) - parser.add_argument('-m', '--models', default=1, type=int) - - args = parser.parse_args() - - apps = apps_builder(args.target, args.apps, args.models) - - diff --git a/scaffolder/__init__.py b/scaffolder/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gen.py b/scaffolder/gen.py similarity index 68% rename from gen.py rename to scaffolder/gen.py index c3d77a5..cbb035f 100644 --- a/gen.py +++ b/scaffolder/gen.py @@ -1,4 +1,6 @@ +import argparse import os +import random class Field(object): @@ -61,7 +63,7 @@ def as_str(self): return self.TEMPLATE.format(content=content) -def module_builder(num_modules, num_models): +def module_builder(num_modules, num_models, max_fields): modules = [] mf = 'M{}' # model format mc = 0; # model counter @@ -69,25 +71,31 @@ def module_builder(num_modules, num_models): ff = 'f{}' # field format fc = 0 # field counter + fields = ( + ('CharField', [], dict(max_length=200)), + ('TextField', [], {}), + ('IntegerField', [], dict(default=1)), + ) + for i in range(num_modules): models = [] for j in range(num_models//num_modules): - fields = [ - Field(ff.format(fc+1), 'CharField', max_length=200), - Field(ff.format(fc+2), 'IntegerField'), - Field(ff.format(fc+3), 'TextField'), - ] + _max_fields = random.randrange(1, max_fields+1) + _fields = [] + for idx in range(fc, fc+_max_fields): + _type, args, kwargs = random.choice(fields) + _fields.append(Field(ff.format(idx), _type, *args, **kwargs)) - fc += 3 + fc += idx mc += 1 - models.append(Model(mf.format(mc), fields)) + models.append(Model(mf.format(mc), _fields)) modules.append(Module('models.py', models)) return modules -def apps_builder(target, num_apps, num_models): - modules = module_builder(num_apps, num_models) +def apps_builder(target, num_apps, num_models, max_fields): + modules = module_builder(num_apps, num_models, max_fields) pad4 = lambda x: ' {}'.format(x) if not os.path.exists(target): @@ -100,7 +108,7 @@ def apps_builder(target, num_apps, num_models): for module in modules: app_counter += 1 app_name = app_format.format(app_counter) - apps.append(app_name) + apps.append("'{}'".format(app_name)) app_path = os.path.join(target, app_name) init_file = os.path.join(app_path, '__init__.py') @@ -114,6 +122,18 @@ def apps_builder(target, num_apps, num_models): f.write(module.as_str()) with open(os.path.join(target, 'apps_settings.txt'), 'a') as f: - installed_apps = 'INSTALLED_APPS = [\n{}\n]' + installed_apps = 'INSTALLED_APPS += [\n{}\n]' f.write(installed_apps.format(',\n'.join(map(pad4, apps)))) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('target', help='target django directory') + parser.add_argument('-a', '--apps', default=1, type=int) + parser.add_argument('-m', '--models', default=1, type=int) + parser.add_argument('-f', '--max-fields', default=1, type=int) + + args = parser.parse_args() + + apps = apps_builder(args.target, args.apps, args.models, args.max_fields) + diff --git a/tests.py b/tests.py index 63d6dfc..e0625ff 100644 --- a/tests.py +++ b/tests.py @@ -1,6 +1,6 @@ import unittest -from gen import ( +from scaffolder.gen import ( Field, Model, Module, @@ -75,48 +75,21 @@ class Bar(models.Model): self.assertEqual(expected, m1.as_str()) def test_modulebuilderonemoduleonemodel(self): - modules = module_builder(1, 1) - - expected = """from django.db import models - - -class M1(models.Model): - f1 = models.CharField(max_length=200) - f2 = models.IntegerField() - f3 = models.TextField()""" - - self.assertEqual(expected, modules[0].as_str()) + modules = module_builder(1, 1, 3) + self.assertEqual(1, len(modules)) + self.assertEqual(1, len(modules[0].models)) + self.assertLessEqual(len(modules[0].models[0].fields), 3) def test_modulebuildermanymodulesmanymodels(self): - modules = module_builder(2, 4) - - expected_m1 = """from django.db import models - - -class M1(models.Model): - f1 = models.CharField(max_length=200) - f2 = models.IntegerField() - f3 = models.TextField() - - -class M2(models.Model): - f4 = models.CharField(max_length=200) - f5 = models.IntegerField() - f6 = models.TextField()""" - - expected_m2 = """from django.db import models - + modules = module_builder(2, 4, 6) -class M3(models.Model): - f7 = models.CharField(max_length=200) - f8 = models.IntegerField() - f9 = models.TextField() + self.assertEqual(2, len(modules)) + self.assertEqual(2, len(modules[0].models)) + self.assertLessEqual(len(modules[0].models[0].fields), 6) + self.assertLessEqual(len(modules[0].models[1].fields), 6) -class M4(models.Model): - f10 = models.CharField(max_length=200) - f11 = models.IntegerField() - f12 = models.TextField()""" + self.assertEqual(2, len(modules[1].models)) + self.assertLessEqual(len(modules[1].models[0].fields), 6) + self.assertLessEqual(len(modules[1].models[1].fields), 6) - self.assertEqual(expected_m1, modules[0].as_str()) - self.assertEqual(expected_m2, modules[1].as_str())