Merge pull request #1154 from soltanmm/pypi

Enable PyPI package management
diff --git a/src/python/README.md b/src/python/README.md
index c8057be..82bc776 100644
--- a/src/python/README.md
+++ b/src/python/README.md
@@ -42,7 +42,14 @@
 Installing
 -----------------------
 
-- [Install the gRPC core](https://github.com/grpc/grpc/blob/master/INSTALL)
+- Install the gRPC core
+  - [Debian package](https://github.com/grpc/grpc/releases)
+    ```
+    $ wget https://github.com/grpc/grpc/releases/download/release-0_5_0/libgrpc_0.5.0_amd64.deb
+    $ wget https://github.com/grpc/grpc/releases/download/release-0_5_0/libgrpc-dev_0.5.0_amd64.deb
+    $ sudo dpkg -i libgrpc_0.5.0_amd64.deb libgrpc-dev_0.5.0_amd64.deb
+    ```
+  - [From source](https://github.com/grpc/grpc/blob/master/INSTALL)
 
 - Install gRPC Python's dependencies
 ```
@@ -53,3 +60,16 @@
 ```
 $ pip install src/python/src
 ```
+
+Packaging to PyPI
+-----------------------
+
+- Install packaging dependencies
+```
+$ pip install setuptools twine
+```
+
+- Push to PyPI
+```
+$ ../../tools/distrib/python/submit.py
+```
diff --git a/src/python/interop/setup.py b/src/python/interop/setup.py
index 6db5435..7a32992 100644
--- a/src/python/interop/setup.py
+++ b/src/python/interop/setup.py
@@ -29,7 +29,7 @@
 
 """A setup module for the GRPC Python interop testing package."""
 
-from distutils import core as _core
+import setuptools
 
 _PACKAGES = (
     'interop',
@@ -45,9 +45,13 @@
         'credentials/server1.pem',]
 }
 
-_INSTALL_REQUIRES = ['grpc-2015>=0.0.1']
+_INSTALL_REQUIRES = ['grpcio>=0.4.0a4']
 
-_core.setup(
-    name='interop', version='0.0.1', packages=_PACKAGES,
-    package_dir=_PACKAGE_DIRECTORIES, package_data=_PACKAGE_DATA,
-    install_requires=_INSTALL_REQUIRES)
+setuptools.setup(
+    name='interop',
+    version='0.0.1',
+    packages=_PACKAGES,
+    package_dir=_PACKAGE_DIRECTORIES,
+    package_data=_PACKAGE_DATA,
+    install_requires=_INSTALL_REQUIRES
+)
diff --git a/src/python/src/.gitignore b/src/python/src/.gitignore
new file mode 100644
index 0000000..bc15a52
--- /dev/null
+++ b/src/python/src/.gitignore
@@ -0,0 +1,3 @@
+MANIFEST
+grpcio.egg-info/
+dist/
diff --git a/src/python/src/MANIFEST.in b/src/python/src/MANIFEST.in
new file mode 100644
index 0000000..6f32db0
--- /dev/null
+++ b/src/python/src/MANIFEST.in
@@ -0,0 +1 @@
+graft grpc
diff --git a/src/python/src/README.rst b/src/python/src/README.rst
new file mode 100644
index 0000000..bc1815f
--- /dev/null
+++ b/src/python/src/README.rst
@@ -0,0 +1,27 @@
+gRPC Python
+===========
+
+Package for GRPC Python.
+
+Dependencies
+------------
+
+Ensure that you have installed GRPC core.
+
+On debian linux systems, install from our released deb package:
+
+::
+
+  $ wget https://github.com/grpc/grpc/releases/download/release-0_5_0/libgrpc_0.5.0_amd64.deb
+  $ wget https://github.com/grpc/grpc/releases/download/release-0_5_0/libgrpc-dev_0.5.0_amd64.deb
+  $ sudo dpkg -i libgrpc_0.5.0_amd64.deb libgrpc-dev_0.5.0_amd64.deb
+
+Otherwise, install from source:
+
+::
+
+  git clone https://github.com/grpc/grpc.git
+  cd grpc
+  ./configure
+  make && make install
+
diff --git a/src/python/src/setup.py b/src/python/src/setup.py
index bd70634..a6924b2 100644
--- a/src/python/src/setup.py
+++ b/src/python/src/setup.py
@@ -30,6 +30,7 @@
 """A setup module for the GRPC Python package."""
 
 from distutils import core as _core
+import setuptools
 
 _EXTENSION_SOURCES = (
     'grpc/_adapter/_c.c',
@@ -80,7 +81,15 @@
     'grpc.framework': 'grpc/framework',
 }
 
-_core.setup(
-    name='grpc-2015', version='0.4.0',
-    ext_modules=[_EXTENSION_MODULE], packages=list(_PACKAGES),
-    package_dir=_PACKAGE_DIRECTORIES)
+setuptools.setup(
+    name='grpcio',
+    version='0.4.0a8',
+    ext_modules=[_EXTENSION_MODULE],
+    packages=list(_PACKAGES),
+    package_dir=_PACKAGE_DIRECTORIES,
+    install_requires=[
+        'enum34==1.0.4',
+        'futures==2.2.0',
+        'protobuf==3.0.0-alpha-1'
+    ]
+)
diff --git a/tools/distrib/python/submit.py b/tools/distrib/python/submit.py
new file mode 100755
index 0000000..5d8a917
--- /dev/null
+++ b/tools/distrib/python/submit.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+
+import argparse
+import os
+import shutil
+import subprocess
+
+parser = argparse.ArgumentParser(
+    description='Submit the package to a PyPI repository.')
+parser.add_argument(
+    '--repository', '-r', metavar='r', type=str, default='pypi',
+    help='The repository to push the package to. '
+         'Ensure the value appears in your .pypirc file. '
+         'Defaults to "pypi".'
+)
+parser.add_argument(
+    '--identity', '-i', metavar='i', type=str,
+    help='GPG identity to sign the files with.'
+)
+parser.add_argument(
+    '--username', '-u', metavar='u', type=str,
+    help='Username to authenticate with the repository. Not needed if you have '
+         'configured your .pypirc to include your username.'
+)
+parser.add_argument(
+    '--password', '-p', metavar='p', type=str,
+    help='Password to authenticate with the repository. Not needed if you have '
+         'configured your .pypirc to include your password.'
+)
+args = parser.parse_args()
+
+# Move to the root directory of Python GRPC.
+pkgdir = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+                      '../../../src/python/src')
+# Remove previous distributions; they somehow confuse twine.
+try:
+  shutil.rmtree(os.path.join(pkgdir, 'dist/'))
+except:
+  pass
+
+# Make the push.
+cmd = ['python', 'setup.py', 'sdist']
+subprocess.call(cmd)
+
+cmd = ['twine', 'upload', '-r', args.repository]
+if args.identity is not None:
+  cmd.extend(['-i', args.identity])
+if args.username is not None:
+  cmd.extend(['-u', args.username])
+if args.password is not None:
+  cmd.extend(['-p', args.password])
+cmd.append('dist/*')
+
+subprocess.call(cmd, cwd=pkgdir)