Skip to content

Commit

Permalink
added base module and random fields
Browse files Browse the repository at this point in the history
  • Loading branch information
omaraboumrad committed Sep 26, 2014
1 parent 318285f commit f2577ad
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 78 deletions.
21 changes: 11 additions & 10 deletions README.md
Expand Up @@ -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
16 changes: 0 additions & 16 deletions main.py

This file was deleted.

Empty file added scaffolder/__init__.py
Empty file.
44 changes: 32 additions & 12 deletions gen.py → scaffolder/gen.py
@@ -1,4 +1,6 @@
import argparse
import os
import random


class Field(object):
Expand Down Expand Up @@ -61,33 +63,39 @@ 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

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):
Expand All @@ -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')
Expand All @@ -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)

53 changes: 13 additions & 40 deletions tests.py
@@ -1,6 +1,6 @@
import unittest

from gen import (
from scaffolder.gen import (
Field,
Model,
Module,
Expand Down Expand Up @@ -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())

0 comments on commit f2577ad

Please sign in to comment.