# Copyright 2018 The Cirq Developers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import io
import os
from setuptools import find_packages, setup

# This reads the __version__ variable from cirq/_version.py
__version__ = ''
exec(open('cirq/_version.py').read())

name = 'cirq'

description = ('A framework for creating, editing, and invoking '
               'Noisy Intermediate Scale Quantum (NISQ) circuits.')

# README file as long_description.
long_description = io.open('README.rst', encoding='utf-8').read()

# If CIRQ_DEV_VERSION is set then we use cirq-dev as the name of the package
# and update the version to this value.
if 'CIRQ_DEV_VERSION' in os.environ:
    name = 'cirq-dev'
    __version__ = os.environ['CIRQ_DEV_VERSION']
    long_description = (
        "**This is a development version of Cirq and may be "
        "unstable.**\n\n**For the latest stable release of Cirq "
        "see**\n`here <https://pypi.org/project/cirq>`__.\n\n" +
        long_description)

# Read in requirements
requirements = open('requirements.txt').readlines()
requirements = [r.strip() for r in requirements]
contrib_requirements = open('cirq/contrib/contrib-requirements.txt').readlines()
contrib_requirements = [r.strip() for r in contrib_requirements]
dev_requirements = open('dev_tools/conf/pip-list-dev-tools.txt').readlines()
dev_requirements = [r.strip() for r in dev_requirements]

cirq_packages = ['cirq'] + [
    'cirq.' + package for package in find_packages(where='cirq')
]

# Sanity check
assert __version__, 'Version string cannot be empty'

setup(name=name,
      version=__version__,
      url='http://github.com/quantumlib/cirq',
      author='The Cirq Developers',
      author_email='cirq@googlegroups.com',
      python_requires=('>=3.6.0'),
      install_requires=requirements,
      extras_require={
          'contrib': contrib_requirements,
          'dev_env': dev_requirements + contrib_requirements,
      },
      license='Apache 2',
      description=description,
      long_description=long_description,
      packages=cirq_packages,
      package_data={
          'cirq.api.google.v1': ['*.proto'],
          'cirq.api.google.v2': ['*.proto'],
          'cirq.google.api.v1': ['*.proto'],
          'cirq.google.api.v2': ['*.proto'],
      })

setup.py
# Copyright 2018 The Cirq Developers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import io
import os
from setuptools import find_packages, setup

# This reads the __version__ variable from cirq/_version.py
__version__ = ''
exec(open('cirq/_version.py').read())

name = 'cirq'

description = ('A framework for creating, editing, and invoking '
               'Noisy Intermediate Scale Quantum (NISQ) circuits.')

# README file as long_description.
long_description = io.open('README.rst', encoding='utf-8').read()

# If CIRQ_DEV_VERSION is set then we use cirq-dev as the name of the package
# and update the version to this value.
if 'CIRQ_DEV_VERSION' in os.environ:
    name = 'cirq-dev'
    __version__ = os.environ['CIRQ_DEV_VERSION']
    long_description = (
        "**This is a development version of Cirq and may be "
        "unstable.**\n\n**For the latest stable release of Cirq "
        "see**\n`here <https://pypi.org/project/cirq>`__.\n\n" +
        long_description)

# Read in requirements
requirements = open('requirements.txt').readlines()
requirements = [r.strip() for r in requirements]
contrib_requirements = open('cirq/contrib/contrib-requirements.txt').readlines()
contrib_requirements = [r.strip() for r in contrib_requirements]
dev_requirements = open('dev_tools/conf/pip-list-dev-tools.txt').readlines()
dev_requirements = [r.strip() for r in dev_requirements]

cirq_packages = ['cirq'] + [
    'cirq.' + package for package in find_packages(where='cirq')
]

# Sanity check
assert __version__, 'Version string cannot be empty'

setup(name=name,
      version=__version__,
      url='http://github.com/quantumlib/cirq',
      author='The Cirq Developers',
      author_email='cirq@googlegroups.com',
      python_requires=('>=3.6.0'),
      install_requires=requirements,
      extras_require={
          'contrib': contrib_requirements,
          'dev_env': dev_requirements + contrib_requirements,
      },
      license='Apache 2',
      description=description,
      long_description=long_description,
      packages=cirq_packages,
      package_data={
          'cirq': ['py.typed'],
          'cirq.api.google.v1': ['*.proto'],
          'cirq.api.google.v2': ['*.proto'],
          'cirq.google.api.v1': ['*.proto'],
          'cirq.google.api.v2': ['*.proto'],
      })

setup.py
diff --git a/cirq/py.typed b/cirq/py.typed
new file mode 100644
index 00000000000..8451532fd9c
--- /dev/null
+++ b/cirq/py.typed
@@ -0,0 +1 @@
+# Marker file for PEP 561. The cirq package uses inline types.
diff --git a/setup.py b/setup.py
index e05b420a794..3e275b37aae 100644
--- a/setup.py
+++ b/setup.py
@@ -70,6 +70,7 @@
       long_description=long_description,
       packages=cirq_packages,
       package_data={
+          'cirq': ['py.typed'],
           'cirq.api.google.v1': ['*.proto'],
           'cirq.api.google.v2': ['*.proto'],
           'cirq.google.api.v1': ['*.proto'],

Cirq should ship a py.typed file
[PEP 561](https://www.python.org/dev/peps/pep-0561/) says that any packages that ship with type information should have a py.typed file in their package. Otherwise, type checkers like mypy can't find Cirq. (FWIW I just did `touch ~/.virtualenvs/.../cirq/py.typed`, and then mypy type-checks the file correctly.)

Other than that, Cirq seems pretty awesome so far :ok_hand:.
Cirq should ship a py.typed file
[PEP 561](https://www.python.org/dev/peps/pep-0561/) says that any packages that ship with type information should have a py.typed file in their package. Otherwise, type checkers like mypy can't find Cirq. (FWIW I just did `touch ~/.virtualenvs/.../cirq/py.typed`, and then mypy type-checks the file correctly.)

Other than that, Cirq seems pretty awesome so far :ok_hand:.
