Metadata-Version: 2.1
Name: graphene_file_upload
Version: 1.3.0
Summary: Lib for adding file upload functionality to GraphQL mutations in Graphene Django and Flask-Graphql
Home-page: https://github.com/lmcgartland/graphene-file-upload
Author: Lucas McGartland
Author-email: lucasmcgartland@gmail.com
License: UNKNOWN
Description: .. image:: https://travis-ci.com/lmcgartland/graphene-file-upload.svg?branch=master
            :target: https://travis-ci.com/lmcgartland/graphene-file-upload
        
        .. image:: https://badge.fury.io/py/graphene-file-upload.svg
            :target: https://badge.fury.io/py/graphene-file-upload
        
        
        graphene-file-upload
        ====================
        
        ``graphene-file-upload`` is a drop in replacement for the the GraphQL
        view in Graphene for Django, and for Flask-Graphql. 
        
        It supports multi-part file uploads that adhere to the `Multipart Request Spec <https://github.com/jaydenseric/graphql-multipart-request-spec>`_.
        
        It currently supports Python 2.7 and 3.4+.
        
        Installation:
        -------------
        
        .. code:: bash
        
            $ pip install graphene-file-upload
        
        Usage
        -----
        
        To add an upload type to your mutation, import and use ``Upload``.
        Upload is a scalar type.
        
        .. code:: python
        
           from graphene_file_upload.scalars import Upload
        
           class UploadMutation(graphene.Mutation):
               class Arguments:
                   file = Upload(required=True)
        
               success = graphene.Boolean()
        
               def mutate(self, info, file, **kwargs):
                   # do something with your file
        
                   return UploadMutation(success=True)
        
        Django Integration:
        ~~~~~~~~~~~~~~~~~~~
        
        To use, import the view, then add to your list of urls (replace previous
        GraphQL view).
        
        .. code:: python
        
           from graphene_file_upload.django import FileUploadGraphQLView
        
           urlpatterns = [
             url(r'^graphql', FileUploadGraphQLView.as_view(graphiql=True)),
           ]
        
        Flask Integration:
        ~~~~~~~~~~~~~~~~~~
        
        Note that ``flask-graphql`` version ``<2.0`` is not supported. At the
        time of writing this README, you must install ``flask-graphql`` with
        ``pip install --pre flask-graphql``
        
        Simply import the modified view and create a new url rule on your app:
        
        .. code:: python
        
           from graphene_file_upload.flask import FileUploadGraphQLView
        
           app.add_url_rule(
               '/graphql',
               view_func=FileUploadGraphQLView.as_view(
                 ...
               )
           )
        
        Testing
        -------
        
        Flask
        ~~~~~
        
        `<https://flask.palletsprojects.com/en/1.1.x/testing/#the-testing-skeleton/>`_
        
        .. code:: python
        
            # Create a fixture using the file_graphql_query helper and `client` fixture.
            import os
            import json
            import tempfile
        
            from flaskr import flaskr
            import pytest
            from graphene_file_upload.django.testing import file_graphql_query
        
        
            @pytest.fixture
            def client():
                db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()
                flaskr.app.config['TESTING'] = True
        
                with flaskr.app.test_client() as client:
                    with flaskr.app.app_context():
                        flaskr.init_db()
                    yield client
        
                os.close(db_fd)
                os.unlink(flaskr.app.config['DATABASE'])
        
            @pytest.fixture
            def client_query(client):
                def func(*args, **kwargs):
                    return file_graphql_query(*args, **kwargs, client=client)
        
                return func
        
            # Test your query using the client_query fixture
            def test_some_query(client_query):
                test_file = SimpleUploadedFile(name='test.txt', content=file_text.encode('utf-8'))
        
                response = client_query(
                    '''
                    mutation testMutation($file: Upload!) {
                        myUpload(fileIn: $file) {
                            ok
                        }
                    }
                    ''',
                    op_name='testMutation'
                    files={'file': test_file},
                )
        
                content = json.loads(response.content)
                assert 'errors' not in content
        
        
        Django
        ~~~~~~
        
        Writing test using `django's test client <https://docs.djangoproject.com/en/3.1/topics/testing/tools/#default-test-client />`_
        
        Using pytest
        ############
        
        To use pytest define a simple fixture using the query helper below
        
        .. code:: python
        
            # Create a fixture using the file_graphql_query helper and ``client` fixture from ``pytest-django``.
        
            import json
            import pytest
            from graphene_file_upload.django.testing import file_graphql_query
        
            @pytest.fixture
            def client_query(client):
                def func(*args, **kwargs):
                    return file_graphql_query(*args, **kwargs, client=client)
        
                return func
        
            # Test your query using the client_query fixture
            def test_some_query(client_query):
                test_file = SimpleUploadedFile(name='test.txt', content=file_text.encode('utf-8'))
        
                response = client_query(
                    '''
                    mutation testMutation($file: Upload!) {
                        myUpload(fileIn: $file) {
                            ok
                        }
                    }
                    ''',
                    op_name='testMutation'
                    files={'file': test_file},
                )
        
                content = json.loads(response.content)
                assert 'errors' not in content
        
        
        Using unittest
        ##############
        
        Your endpoint is set through the ``GRAPHQL_URL`` attribute on ``GraphQLFileUploadTestCase``. 
        
        The default endpoint is ``GRAPHQL_URL = “/graphql/”``.
        
        .. code:: python
            
            import json
        
            from graphene_file_upload.django.testing import GraphQLFileUploadTestCase
        
            class MutationTestCase(GraphQLFileUploadTestCase):
               def test_some_mutation(self):
                    test_file = SimpleUploadedFile(name='test.txt', content=file_text.encode('utf-8'))
        
                    response = self.file_query(
                        '''
                        mutation testMutation($file: Upload!) {
                            myUpload(fileIn: $file) {
                                ok
                            }
                        }
                        ''',
                        op_name='testMutation',
                        files={'file': test_file},
                    )
        
                    # This validates the status code and if you get errors
                    self.assertResponseNoErrors(response)
        
        
        Contributing:
        -------------
        
        If you'd like to contribute, please run the test suite prior to sending a PR.
        
        In order to run the testing environment, create a virtual environment, install
        tox, and run the tox commands:
        
        .. code:: bash
        
            $ python3 -m venv venv
            $ source venv/bin/activate
            $ make install
            # You may have to deactivate and reactivate to have access to the tox command,
            # depending on your system.
        
            # Run the test suite with the versions of python you have installed
            $ tox
            # Alternatively, if you're using something like pyenv and can easily install
            # Multiple versions of python, then try running the following command
            $ tox
        
            # If for some reason you need to recreate the tox environment (e.g. a new
            # dependency has been added since you last ran it, add the -r flag to the
            # tox command)
            $ tox -r {...additional flags...}
        
        Check out `pyenv
        <https://github.com/pyenv/pyenv>`_ if you'd like a simple way of
        installing multiple python versions to test out.
        
        Packaging for PyPi:
        -------------------
        
        Run
        
        .. code:: bash
        
            $ make deploy
        
Keywords: graphql,graphene,apollo,upload
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Framework :: Django :: 1.11
Classifier: Framework :: Django :: 2.0
Classifier: Framework :: Django :: 2.1
Classifier: Framework :: Django :: 2.2
Classifier: Framework :: Django :: 3.0
Classifier: Framework :: Django :: 3.1
Classifier: Framework :: Flask
Description-Content-Type: text/x-rst
Provides-Extra: flask
Provides-Extra: django
Provides-Extra: all
Provides-Extra: tests
