drf-generators-0.4.0/0000775000175000017500000000000013442254357014720 5ustar tobintobin00000000000000drf-generators-0.4.0/setup.py0000664000175000017500000000262613442254310016425 0ustar tobintobin00000000000000import os from setuptools import setup, find_packages with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: README = readme.read() os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( name='drf-generators', version='0.4.0', description='Generate DRF Serializers, Views, and urls for your API application.', long_description=README, url='https://github.com/brobin/drf-generators', download_url = 'https://github.com/brobin/drf-generators/archive/0.4.0.zip', author='Tobin Brown', author_email='tobin@brobin.me', license='MIT', packages=['drf_generators', 'drf_generators.templates', 'drf_generators.management', 'drf_generators.management.commands'], include_package_data=True, install_requires=['Django>=1.7'], classifiers=[ 'Environment :: Web Environment', 'Framework :: Django :: 1.9', 'Framework :: Django :: 1.10', 'Framework :: Django :: 2.0', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Natural Language :: English', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Topic :: Internet :: WWW/HTTP', ], keywords='API REST framework generate scaffold', ) drf-generators-0.4.0/README.rst0000664000175000017500000001625413442254310016404 0ustar tobintobin00000000000000============== DRF Generators ============== Writing APIs can be boring and repetitive work. Don't write another CRUDdy view in `Django Rest Framework `_. With DRF Generators, one simple command will generate all of your Views, Serializers, and even Urls for your Django Rest Framework application! For a full step-by-step tutorial, check out my `blog post `_! This is **not** intended to give you a production quality API. It was intended to jumpstart your development and save you from writing the same code over and over for each model. --------------- |python| |pypi| |license| |travis| |django| |drf| --------------- * `Installation`_ * `Usage`_ * `Serializers`_ * `Views`_ * `Urls`_ * `Tests`_ * `License`_ --------------- ============ Installation ============ Install with pip: .. code-block:: bash $ pip install drf-generators or Clone the repo and install manually: .. code-block:: bash $ git clone https://github.com/brobin/drf-generators.git $ cd drf-generators $ python setup.py install To use DRF Generators, add it your INSTALLED_APPS. .. code-block:: python INSTALLED_APPS = ( ... 'rest_framework', 'drf_generators', ... ) *Note*: In order to use the APIView classes, you must have the rest framework DEFAULT_PAGINATION_CLASS and PAGE_SIZE set. .. code-block:: python REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 15 } ----------------- ===== Usage ===== To use the generators, run the following command, where ``app`` is the application to generate an API for. .. code-block:: bash $ python manage.py generate {app} {options} ========================== =================================================== Option Action ========================== =================================================== ``--serializers`` Generate only Serializers for your app. ``--views`` Generate only Views for your app. ``--urls`` Generate only urls for your app. ``--force`` Overwrite existing files without the warning prompt. ``-f``, ``--format`` Format to use when generating views and urls. Valid options: ``viewset``, ``apiview``, ``function``, ``modelviewset``. Default: ``viewset``. ``-d``, ``--depth`` Serialization depth for related models. Default: 0 ========================== =================================================== **Example:** Generate everything for the app ``api`` with function style views, overwriting existing files, with a serialization depth of 2. .. code-block:: bash $ python manage.py generate api --format function --force -- depth=2 ------------------- =========== Serializers =========== Drf Generators will create ``serializers.py`` for your application. It currently uses rest framework's ``ModelSerializer`` for serialization of the models defined in ``models.py``. .. code-block:: python class ModelSerializer(serializers.ModelSerializer): class Meta: model = User ------------------ ===== Views ===== DRF Generators will create ``views.py`` for your application. It can generate ``ViewSet``, ``APIView`` and function based views. Set the ``--format`` option when running the generator to pick the preferred style ------- ViewSet ------- ``python manage.py generate api --format viewset`` .. code-block:: python class ModelViewSet(ViewSet): def list(self, request): ... def create(self, request): ... def retrieve(self, request, pk=None): ... def update(self, request, pk=None): ... def destroy(self, request, pk=None): ... ------- APIView ------- ``python manage.py generate api --format apiview`` .. code-block:: python class ModelAPIView(APIView): def get(self, request, id, format=None): ... def put(self, request, id, format=None): ... def delete(self, request, id, format=None): ... class ModelAPIListView(APIView): def get(self, request, format=None): ... def post(self, request, format=None): ... -------- Function -------- ``python manage.py generate api --format function`` .. code-block:: python @api_view(['GET', 'POST']) def model_list(request): if request.method == 'GET': ... elif request.method == 'POST': ... @api_view(['GET', 'PUT', 'DELETE']) def model_detail(request, pk): if request.method == 'GET': ... elif request.method == 'PUT': ... elif request.method == 'DELETE': ... ------------- ModelViewSet ------------- ``python manage.py generate api --format modelviewset`` .. code-block:: python class MyModelViewSet(ModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ----------------- ==== Urls ==== Finally, DRF Generator will create you a default ``urls.py`` to match the View format you are using. ---------------------------- ViewSet & ModeViewSet Routes ---------------------------- .. code-block:: python router = SimpleRouter() router.register(r'model', views.ModelViewSet, 'Model') urlpatterns = router.urls ------------ APIView urls ------------ .. code-block:: python url(r'^model/([0-9]+)$', views.ModelAPIView.as_view()), url(r'^model', views.ModelAPIListView.as_view()), ------------- Function urls ------------- .. code-block:: python urlpatterns = [ url(r'^model/(?P[0-9]+)$', views.model_detail), url(r'^model/$', views.model_list), ] urlpatterns = format_suffix_patterns(urlpatterns) ===== Tests ===== A full application built with drf-generators can be found in the `tests directory `_. Instructions on running the tests can be found in the test project's README. ======= License ======= MIT License. See `LICENSE `_. .. |python| image:: https://img.shields.io/pypi/v/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: Supported Python versions .. |pypi| image:: https://img.shields.io/pypi/pyversions/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: Latest Version .. |license| image:: https://img.shields.io/pypi/l/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: License .. |travis| image:: https://img.shields.io/travis/Brobin/drf-generators.svg?style=flat-square :target: https://travis-ci.org/Brobin/drf-generators/ :alt: Travis CI .. |django| image:: https://img.shields.io/badge/Django-1.9, 1.10-orange.svg?style=flat-square :target: http://djangoproject.com/ :alt: Django 1.9, 1.10 .. |drf| image:: https://img.shields.io/badge/DRF-3.5-orange.svg?style=flat-square :target: http://www.django-rest-framework.org/ :alt: DRF 3.5 drf-generators-0.4.0/drf_generators/0000775000175000017500000000000013442254357017724 5ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators/generators.py0000664000175000017500000000774713442254310022453 0ustar tobintobin00000000000000from django.template import Template, Context import os.path from drf_generators.templates.serializer import SERIALIZER from drf_generators.templates.apiview import API_URL, API_VIEW from drf_generators.templates.viewset import VIEW_SET_URL, VIEW_SET_VIEW from drf_generators.templates.function import FUNCTION_URL, FUNCTION_VIEW from drf_generators.templates.modelviewset import MODEL_URL, MODEL_VIEW __all__ = ['BaseGenerator', 'APIViewGenerator', 'ViewSetGenerator', 'FunctionViewGenerator', 'ModelViewSetGenerator'] class BaseGenerator(object): def __init__(self, app_config, force): self.app_config = app_config self.force = force self.app = app_config.models_module self.name = app_config.name self.serializer_template = Template(SERIALIZER) self.models = self.get_model_names() self.serializers = self.get_serializer_names() self.view_template = Template(API_VIEW) self.url_template = Template(API_URL) def generate_serializers(self, depth): content = self.serializer_content(depth) filename = 'serializers.py' if self.write_file(content, filename): return ' - writing %s' % filename else: return 'Serializer generation cancelled' def generate_views(self): content = self.view_content() filename = 'views.py' if self.write_file(content, filename): return ' - writing %s' % filename else: return 'View generation cancelled' def generate_urls(self): content = self.url_content() filename = 'urls.py' if self.write_file(content, filename): return ' - writing %s' % filename else: return 'Url generation cancelled' def serializer_content(self, depth): context = Context({'app': self.name, 'models': self.models, 'depth': depth}) return self.serializer_template.render(context) def view_content(self): context = Context({'app': self.name, 'models': self.models, 'serializers': self.serializers}) return self.view_template.render(context) def url_content(self): context = Context({'app': self.name, 'models': self.models}) return self.url_template.render(context) def get_model_names(self): return [m.__name__ for m in self.app_config.get_models()] def get_serializer_names(self): return [m + 'Serializer' for m in self.models] def write_file(self, content, filename): name = os.path.join(os.path.dirname(self.app.__file__), filename) if os.path.exists(name) and not self.force: msg = "Are you sure you want to overwrite %s? (y/n): " % filename prompt = input # python3 response = prompt(msg) if response != "y": return False new_file = open(name, 'w+') new_file.write(content) new_file.close() return True class APIViewGenerator(BaseGenerator): def __init__(self, app_config, force): self.view_template = Template(API_VIEW) self.url_template = Template(API_URL) super(APIViewGenerator, self).__init__(app_config, force) class ViewSetGenerator(BaseGenerator): def __init__(self, app_config, force): self.view_template = Template(VIEW_SET_VIEW) self.url_template = Template(VIEW_SET_URL) super(ViewSetGenerator, self).__init__(app_config, force) class FunctionViewGenerator(BaseGenerator): def __init__(self, app_config, force): self.view_template = Template(FUNCTION_VIEW) self.url_template = Template(FUNCTION_URL) super(FunctionViewGenerator, self).__init__(app_config, force) class ModelViewSetGenerator(BaseGenerator): def __init__(self, app_config, force): self.view_template = Template(MODEL_VIEW) self.url_template = Template(MODEL_URL) super(ModelViewSetGenerator, self).__init__(app_config, force) drf-generators-0.4.0/drf_generators/templates/0000775000175000017500000000000013442254357021722 5ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators/templates/viewset.py0000664000175000017500000000372313442254310023754 0ustar tobintobin00000000000000 __all__ = ['VIEW_SET_URL', 'VIEW_SET_VIEW'] VIEW_SET_URL = """from rest_framework.routers import SimpleRouter from {{ app }} import views router = SimpleRouter() {% for model in models %} router.register(r'{{ model | lower }}', views.{{ model }}ViewSet, '{{model}}'){% endfor %} urlpatterns = router.urls """ VIEW_SET_VIEW = """from django.shortcuts import get_object_or_404 from rest_framework.viewsets import ViewSet from rest_framework.response import Response from {{ app }}.serializers import {{ serializers|join:', ' }} from {{ app }}.models import {{ models|join:', ' }} {% for model in models %} class {{ model }}ViewSet(ViewSet): def list(self, request): queryset = {{ model }}.objects.all() serializer = {{ model }}Serializer(queryset, many=True) return Response(serializer.data) def create(self, request): serializer = {{ model }}Serializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) def retrieve(self, request, pk=None): queryset = {{ model }}.objects.all() item = get_object_or_404(queryset, pk=pk) serializer = {{ model }}Serializer(item) return Response(serializer.data) def update(self, request, pk=None): try: item = {{ model }}.objects.get(pk=pk) except {{ model }}.DoesNotExist: return Response(status=404) serializer = {{ model }}Serializer(item, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=400) def destroy(self, request, pk=None): try: item = {{ model }}.objects.get(pk=pk) except {{ model }}.DoesNotExist: return Response(status=404) item.delete() return Response(status=204) {% endfor %}""" drf-generators-0.4.0/drf_generators/templates/serializer.py0000664000175000017500000000056313442254310024436 0ustar tobintobin00000000000000__all__ = ['SERIALIZER'] SERIALIZER = """from rest_framework.serializers import ModelSerializer from {{ app }}.models import {{ models | join:', ' }} {% for model in models %} class {{ model }}Serializer(ModelSerializer): class Meta: model = {{ model }}{% if depth != 0 %} depth = {{ depth }}{% endif %} fields = '__all__' {% endfor %}""" drf-generators-0.4.0/drf_generators/templates/function.py0000664000175000017500000000362113442254310024110 0ustar tobintobin00000000000000 __all__ = ['FUNCTION_URL', 'FUNCTION_VIEW'] FUNCTION_URL = """from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patterns from {{ app }} import views urlpatterns = [ {% for model in models %} url(r'^{{ model|lower }}/(?P[0-9]+)$', views.{{ model | lower }}_detail), url(r'^{{ model|lower }}/$', views.{{ model | lower }}_list), {% endfor %} ] urlpatterns = format_suffix_patterns(urlpatterns) """ FUNCTION_VIEW = """from rest_framework.decorators import api_view from rest_framework.response import Response from {{ app }}.models import {{ models | join:', ' }} from {{ app }}.serializers import {{ serializers | join:', ' }} {% for model in models %} @api_view(['GET', 'POST']) def {{ model | lower }}_list(request): if request.method == 'GET': items = {{ model }}.objects.all() serializer = {{ model }}Serializer(items, many=True) return Response(serializer.data) elif request.method == 'POST': serializer = {{ model }}Serializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) @api_view(['GET', 'PUT', 'DELETE']) def {{ model | lower }}_detail(request, pk): try: item = {{ model }}.objects.get(pk=pk) except {{ model }}.DoesNotExist: return Response(status=400) if request.method == 'GET': serializer = {{ model }}Serializer(item) return Response(serializer.data) elif request.method == 'PUT': serializer = {{ model }}Serializer(item, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=400) elif request.method == 'DELETE': item.delete() return Response(status=204) {% endfor %}""" drf-generators-0.4.0/drf_generators/templates/apiview.py0000664000175000017500000000520713442254310023731 0ustar tobintobin00000000000000 __all__ = ['API_VIEW', 'API_URL'] API_URL = """from django.conf.urls import include, url try: from django.conf.urls import patterns except ImportError: pass import django from django.contrib import admin from {{ app }} import views if django.VERSION[1] < 10: urlpatterns = patterns('', {% for model in models %} url(r'^{{ model|lower }}/(?P[0-9]+)$', views.{{ model }}APIView.as_view()), url(r'^{{ model|lower }}/$', views.{{ model }}APIListView.as_view()), {% endfor %} ) else: urlpatterns = [ {% for model in models %} url(r'^{{ model|lower }}/(?P[0-9]+)$', views.{{ model }}APIView.as_view()), url(r'^{{ model|lower }}/$', views.{{ model }}APIListView.as_view()), {% endfor %} ] """ API_VIEW = """from rest_framework.pagination import PageNumberPagination from rest_framework.response import Response from rest_framework.views import APIView from {{ app }}.serializers import {{ serializers|join:', ' }} from {{ app }}.models import {{ models|join:', ' }} {% for model in models %} class {{ model }}APIView(APIView): def get(self, request, id, format=None): try: item = {{ model }}.objects.get(pk=id) serializer = {{ model }}Serializer(item) return Response(serializer.data) except {{ model }}.DoesNotExist: return Response(status=404) def put(self, request, id, format=None): try: item = {{ model }}.objects.get(pk=id) except {{ model }}.DoesNotExist: return Response(status=404) serializer = {{ model }}Serializer(item, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=400) def delete(self, request, id, format=None): try: item = {{ model }}.objects.get(pk=id) except {{ model }}.DoesNotExist: return Response(status=404) item.delete() return Response(status=204) class {{ model }}APIListView(APIView): def get(self, request, format=None): items = {{ model }}.objects.all() paginator = PageNumberPagination() result_page = paginator.paginate_queryset(items, request) serializer = {{ model }}Serializer(result_page, many=True) return paginator.get_paginated_response(serializer.data) def post(self, request, format=None): serializer = {{ model }}Serializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) {% endfor %}""" drf-generators-0.4.0/drf_generators/templates/__init__.py0000664000175000017500000000000013442254310024006 0ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators/templates/modelviewset.py0000664000175000017500000000120313442254310024764 0ustar tobintobin00000000000000 __all__ = ['MODEL_URL', 'MODEL_VIEW'] MODEL_URL = """from rest_framework.routers import SimpleRouter from {{ app }} import views router = SimpleRouter() {% for model in models %} router.register(r'{{ model | lower }}', views.{{ model }}ViewSet){% endfor %} urlpatterns = router.urls """ MODEL_VIEW = """from rest_framework.viewsets import ModelViewSet from {{ app }}.serializers import {{ serializers|join:', ' }} from {{ app }}.models import {{ models|join:', ' }} {% for model in models %} class {{ model }}ViewSet(ModelViewSet): queryset = {{ model }}.objects.all() serializer_class = {{ model }}Serializer {% endfor %}""" drf-generators-0.4.0/drf_generators/management/0000775000175000017500000000000013442254357022040 5ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators/management/commands/0000775000175000017500000000000013442254357023641 5ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators/management/commands/__init__.py0000664000175000017500000000000013442254310025725 0ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators/management/commands/generate.py0000664000175000017500000000660613442254310026002 0ustar tobintobin00000000000000import sys from django.core.management.base import AppCommand, CommandError from drf_generators.generators import * import django class Command(AppCommand): help = 'Generates DRF API Views and Serializers for a Django app' args = "[appname ...]" def add_arguments(self, parser): super(Command, self).add_arguments(parser) parser.add_argument('-f', '--format', dest='format', default='viewset', help='view format (default: viewset)'), parser.add_argument('-d', '--depth', dest='depth', default=0, help='serialization depth'), parser.add_argument('--force', dest='force', action='store_true', help='force overwrite files'), parser.add_argument('--serializers', dest='serializers', action='store_true', help='generate serializers only'), parser.add_argument('--views', dest='views', action='store_true', help='generate views only'), parser.add_argument('--urls', dest='urls', action='store_true', help='generate urls only'), def handle_app_config(self, app_config, **options): if app_config.models_module is None: raise CommandError('You must provide an app to generate an API') if sys.version_info[0] != 3 or sys.version_info[1] < 4: raise CommandError('Python 3.4 or newer is required') if django.VERSION[1] == 7: force = options['force'] if 'force' in options else False format = options['format'] if 'format' in options else None depth = options['depth'] if 'depth' in format else 0 if 'serializers' in options: serializers = options['serializers'] else: serializers = False views = options['views'] if 'views' in options else False urls = options['urls'] if 'urls' in options else False elif django.VERSION[1] >= 8 or django.VERSION[0] == 2: force = options['force'] format = options['format'] depth = options['depth'] serializers = options['serializers'] views = options['views'] urls = options['urls'] else: raise CommandError('You must be using Django 1.7, 1.8 or 1.9') if format == 'viewset': generator = ViewSetGenerator(app_config, force) elif format == 'apiview': generator = APIViewGenerator(app_config, force) elif format == 'function': generator = FunctionViewGenerator(app_config, force) elif format == 'modelviewset': generator = ModelViewSetGenerator(app_config, force) else: message = '\'%s\' is not a valid format. ' % options['format'] message += '(viewset, modelviewset, apiview, function)' raise CommandError(message) if serializers: result = generator.generate_serializers(depth) elif views: result = generator.generate_views() elif urls: result = generator.generate_urls() else: result = generator.generate_serializers(depth) + '\n' result += generator.generate_views() + '\n' result += generator.generate_urls() print(result) drf-generators-0.4.0/drf_generators/management/__init__.py0000664000175000017500000000000013442254310024124 0ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators/__init__.py0000664000175000017500000000000013442254310022010 0ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators.egg-info/0000775000175000017500000000000013442254357021416 5ustar tobintobin00000000000000drf-generators-0.4.0/drf_generators.egg-info/SOURCES.txt0000664000175000017500000000117013442254357023301 0ustar tobintobin00000000000000README.rst setup.cfg setup.py drf_generators/__init__.py drf_generators/generators.py drf_generators.egg-info/PKG-INFO drf_generators.egg-info/SOURCES.txt drf_generators.egg-info/dependency_links.txt drf_generators.egg-info/requires.txt drf_generators.egg-info/top_level.txt drf_generators/management/__init__.py drf_generators/management/commands/__init__.py drf_generators/management/commands/generate.py drf_generators/templates/__init__.py drf_generators/templates/apiview.py drf_generators/templates/function.py drf_generators/templates/modelviewset.py drf_generators/templates/serializer.py drf_generators/templates/viewset.pydrf-generators-0.4.0/drf_generators.egg-info/requires.txt0000664000175000017500000000001413442254357024011 0ustar tobintobin00000000000000Django>=1.7 drf-generators-0.4.0/drf_generators.egg-info/top_level.txt0000664000175000017500000000001713442254357024146 0ustar tobintobin00000000000000drf_generators drf-generators-0.4.0/drf_generators.egg-info/PKG-INFO0000664000175000017500000002441513442254357022521 0ustar tobintobin00000000000000Metadata-Version: 1.1 Name: drf-generators Version: 0.4.0 Summary: Generate DRF Serializers, Views, and urls for your API application. Home-page: https://github.com/brobin/drf-generators Author: Tobin Brown Author-email: tobin@brobin.me License: MIT Download-URL: https://github.com/brobin/drf-generators/archive/0.4.0.zip Description: ============== DRF Generators ============== Writing APIs can be boring and repetitive work. Don't write another CRUDdy view in `Django Rest Framework `_. With DRF Generators, one simple command will generate all of your Views, Serializers, and even Urls for your Django Rest Framework application! For a full step-by-step tutorial, check out my `blog post `_! This is **not** intended to give you a production quality API. It was intended to jumpstart your development and save you from writing the same code over and over for each model. --------------- |python| |pypi| |license| |travis| |django| |drf| --------------- * `Installation`_ * `Usage`_ * `Serializers`_ * `Views`_ * `Urls`_ * `Tests`_ * `License`_ --------------- ============ Installation ============ Install with pip: .. code-block:: bash $ pip install drf-generators or Clone the repo and install manually: .. code-block:: bash $ git clone https://github.com/brobin/drf-generators.git $ cd drf-generators $ python setup.py install To use DRF Generators, add it your INSTALLED_APPS. .. code-block:: python INSTALLED_APPS = ( ... 'rest_framework', 'drf_generators', ... ) *Note*: In order to use the APIView classes, you must have the rest framework DEFAULT_PAGINATION_CLASS and PAGE_SIZE set. .. code-block:: python REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 15 } ----------------- ===== Usage ===== To use the generators, run the following command, where ``app`` is the application to generate an API for. .. code-block:: bash $ python manage.py generate {app} {options} ========================== =================================================== Option Action ========================== =================================================== ``--serializers`` Generate only Serializers for your app. ``--views`` Generate only Views for your app. ``--urls`` Generate only urls for your app. ``--force`` Overwrite existing files without the warning prompt. ``-f``, ``--format`` Format to use when generating views and urls. Valid options: ``viewset``, ``apiview``, ``function``, ``modelviewset``. Default: ``viewset``. ``-d``, ``--depth`` Serialization depth for related models. Default: 0 ========================== =================================================== **Example:** Generate everything for the app ``api`` with function style views, overwriting existing files, with a serialization depth of 2. .. code-block:: bash $ python manage.py generate api --format function --force -- depth=2 ------------------- =========== Serializers =========== Drf Generators will create ``serializers.py`` for your application. It currently uses rest framework's ``ModelSerializer`` for serialization of the models defined in ``models.py``. .. code-block:: python class ModelSerializer(serializers.ModelSerializer): class Meta: model = User ------------------ ===== Views ===== DRF Generators will create ``views.py`` for your application. It can generate ``ViewSet``, ``APIView`` and function based views. Set the ``--format`` option when running the generator to pick the preferred style ------- ViewSet ------- ``python manage.py generate api --format viewset`` .. code-block:: python class ModelViewSet(ViewSet): def list(self, request): ... def create(self, request): ... def retrieve(self, request, pk=None): ... def update(self, request, pk=None): ... def destroy(self, request, pk=None): ... ------- APIView ------- ``python manage.py generate api --format apiview`` .. code-block:: python class ModelAPIView(APIView): def get(self, request, id, format=None): ... def put(self, request, id, format=None): ... def delete(self, request, id, format=None): ... class ModelAPIListView(APIView): def get(self, request, format=None): ... def post(self, request, format=None): ... -------- Function -------- ``python manage.py generate api --format function`` .. code-block:: python @api_view(['GET', 'POST']) def model_list(request): if request.method == 'GET': ... elif request.method == 'POST': ... @api_view(['GET', 'PUT', 'DELETE']) def model_detail(request, pk): if request.method == 'GET': ... elif request.method == 'PUT': ... elif request.method == 'DELETE': ... ------------- ModelViewSet ------------- ``python manage.py generate api --format modelviewset`` .. code-block:: python class MyModelViewSet(ModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ----------------- ==== Urls ==== Finally, DRF Generator will create you a default ``urls.py`` to match the View format you are using. ---------------------------- ViewSet & ModeViewSet Routes ---------------------------- .. code-block:: python router = SimpleRouter() router.register(r'model', views.ModelViewSet, 'Model') urlpatterns = router.urls ------------ APIView urls ------------ .. code-block:: python url(r'^model/([0-9]+)$', views.ModelAPIView.as_view()), url(r'^model', views.ModelAPIListView.as_view()), ------------- Function urls ------------- .. code-block:: python urlpatterns = [ url(r'^model/(?P[0-9]+)$', views.model_detail), url(r'^model/$', views.model_list), ] urlpatterns = format_suffix_patterns(urlpatterns) ===== Tests ===== A full application built with drf-generators can be found in the `tests directory `_. Instructions on running the tests can be found in the test project's README. ======= License ======= MIT License. See `LICENSE `_. .. |python| image:: https://img.shields.io/pypi/v/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: Supported Python versions .. |pypi| image:: https://img.shields.io/pypi/pyversions/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: Latest Version .. |license| image:: https://img.shields.io/pypi/l/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: License .. |travis| image:: https://img.shields.io/travis/Brobin/drf-generators.svg?style=flat-square :target: https://travis-ci.org/Brobin/drf-generators/ :alt: Travis CI .. |django| image:: https://img.shields.io/badge/Django-1.9, 1.10-orange.svg?style=flat-square :target: http://djangoproject.com/ :alt: Django 1.9, 1.10 .. |drf| image:: https://img.shields.io/badge/DRF-3.5-orange.svg?style=flat-square :target: http://www.django-rest-framework.org/ :alt: DRF 3.5 Keywords: API REST framework generate scaffold Platform: UNKNOWN Classifier: Environment :: Web Environment Classifier: Framework :: Django :: 1.9 Classifier: Framework :: Django :: 1.10 Classifier: Framework :: Django :: 2.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Natural Language :: English Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Topic :: Internet :: WWW/HTTP drf-generators-0.4.0/drf_generators.egg-info/dependency_links.txt0000664000175000017500000000000113442254357025464 0ustar tobintobin00000000000000 drf-generators-0.4.0/setup.cfg0000664000175000017500000000007513442254357016543 0ustar tobintobin00000000000000[wheel] universal = 1 [egg_info] tag_build = tag_date = 0 drf-generators-0.4.0/PKG-INFO0000664000175000017500000002441513442254357016023 0ustar tobintobin00000000000000Metadata-Version: 1.1 Name: drf-generators Version: 0.4.0 Summary: Generate DRF Serializers, Views, and urls for your API application. Home-page: https://github.com/brobin/drf-generators Author: Tobin Brown Author-email: tobin@brobin.me License: MIT Download-URL: https://github.com/brobin/drf-generators/archive/0.4.0.zip Description: ============== DRF Generators ============== Writing APIs can be boring and repetitive work. Don't write another CRUDdy view in `Django Rest Framework `_. With DRF Generators, one simple command will generate all of your Views, Serializers, and even Urls for your Django Rest Framework application! For a full step-by-step tutorial, check out my `blog post `_! This is **not** intended to give you a production quality API. It was intended to jumpstart your development and save you from writing the same code over and over for each model. --------------- |python| |pypi| |license| |travis| |django| |drf| --------------- * `Installation`_ * `Usage`_ * `Serializers`_ * `Views`_ * `Urls`_ * `Tests`_ * `License`_ --------------- ============ Installation ============ Install with pip: .. code-block:: bash $ pip install drf-generators or Clone the repo and install manually: .. code-block:: bash $ git clone https://github.com/brobin/drf-generators.git $ cd drf-generators $ python setup.py install To use DRF Generators, add it your INSTALLED_APPS. .. code-block:: python INSTALLED_APPS = ( ... 'rest_framework', 'drf_generators', ... ) *Note*: In order to use the APIView classes, you must have the rest framework DEFAULT_PAGINATION_CLASS and PAGE_SIZE set. .. code-block:: python REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 15 } ----------------- ===== Usage ===== To use the generators, run the following command, where ``app`` is the application to generate an API for. .. code-block:: bash $ python manage.py generate {app} {options} ========================== =================================================== Option Action ========================== =================================================== ``--serializers`` Generate only Serializers for your app. ``--views`` Generate only Views for your app. ``--urls`` Generate only urls for your app. ``--force`` Overwrite existing files without the warning prompt. ``-f``, ``--format`` Format to use when generating views and urls. Valid options: ``viewset``, ``apiview``, ``function``, ``modelviewset``. Default: ``viewset``. ``-d``, ``--depth`` Serialization depth for related models. Default: 0 ========================== =================================================== **Example:** Generate everything for the app ``api`` with function style views, overwriting existing files, with a serialization depth of 2. .. code-block:: bash $ python manage.py generate api --format function --force -- depth=2 ------------------- =========== Serializers =========== Drf Generators will create ``serializers.py`` for your application. It currently uses rest framework's ``ModelSerializer`` for serialization of the models defined in ``models.py``. .. code-block:: python class ModelSerializer(serializers.ModelSerializer): class Meta: model = User ------------------ ===== Views ===== DRF Generators will create ``views.py`` for your application. It can generate ``ViewSet``, ``APIView`` and function based views. Set the ``--format`` option when running the generator to pick the preferred style ------- ViewSet ------- ``python manage.py generate api --format viewset`` .. code-block:: python class ModelViewSet(ViewSet): def list(self, request): ... def create(self, request): ... def retrieve(self, request, pk=None): ... def update(self, request, pk=None): ... def destroy(self, request, pk=None): ... ------- APIView ------- ``python manage.py generate api --format apiview`` .. code-block:: python class ModelAPIView(APIView): def get(self, request, id, format=None): ... def put(self, request, id, format=None): ... def delete(self, request, id, format=None): ... class ModelAPIListView(APIView): def get(self, request, format=None): ... def post(self, request, format=None): ... -------- Function -------- ``python manage.py generate api --format function`` .. code-block:: python @api_view(['GET', 'POST']) def model_list(request): if request.method == 'GET': ... elif request.method == 'POST': ... @api_view(['GET', 'PUT', 'DELETE']) def model_detail(request, pk): if request.method == 'GET': ... elif request.method == 'PUT': ... elif request.method == 'DELETE': ... ------------- ModelViewSet ------------- ``python manage.py generate api --format modelviewset`` .. code-block:: python class MyModelViewSet(ModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ----------------- ==== Urls ==== Finally, DRF Generator will create you a default ``urls.py`` to match the View format you are using. ---------------------------- ViewSet & ModeViewSet Routes ---------------------------- .. code-block:: python router = SimpleRouter() router.register(r'model', views.ModelViewSet, 'Model') urlpatterns = router.urls ------------ APIView urls ------------ .. code-block:: python url(r'^model/([0-9]+)$', views.ModelAPIView.as_view()), url(r'^model', views.ModelAPIListView.as_view()), ------------- Function urls ------------- .. code-block:: python urlpatterns = [ url(r'^model/(?P[0-9]+)$', views.model_detail), url(r'^model/$', views.model_list), ] urlpatterns = format_suffix_patterns(urlpatterns) ===== Tests ===== A full application built with drf-generators can be found in the `tests directory `_. Instructions on running the tests can be found in the test project's README. ======= License ======= MIT License. See `LICENSE `_. .. |python| image:: https://img.shields.io/pypi/v/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: Supported Python versions .. |pypi| image:: https://img.shields.io/pypi/pyversions/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: Latest Version .. |license| image:: https://img.shields.io/pypi/l/drf-generators.svg?style=flat-square :target: https://pypi.python.org/pypi/drf-generators/ :alt: License .. |travis| image:: https://img.shields.io/travis/Brobin/drf-generators.svg?style=flat-square :target: https://travis-ci.org/Brobin/drf-generators/ :alt: Travis CI .. |django| image:: https://img.shields.io/badge/Django-1.9, 1.10-orange.svg?style=flat-square :target: http://djangoproject.com/ :alt: Django 1.9, 1.10 .. |drf| image:: https://img.shields.io/badge/DRF-3.5-orange.svg?style=flat-square :target: http://www.django-rest-framework.org/ :alt: DRF 3.5 Keywords: API REST framework generate scaffold Platform: UNKNOWN Classifier: Environment :: Web Environment Classifier: Framework :: Django :: 1.9 Classifier: Framework :: Django :: 1.10 Classifier: Framework :: Django :: 2.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Natural Language :: English Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Topic :: Internet :: WWW/HTTP