| # 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 | 
 | # | 
 | #    http://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 os | 
 | from distutils.command.build import build | 
 |  | 
 | from setuptools import setup, find_packages | 
 |  | 
 |  | 
 | base_dir = os.path.dirname(__file__) | 
 |  | 
 | about = {} | 
 | with open(os.path.join(base_dir, "cryptography", "__about__.py")) as f: | 
 |     exec(f.read(), about) | 
 |  | 
 |  | 
 | CFFI_DEPENDENCY = "cffi>=0.8" | 
 | SIX_DEPENDENCY = "six>=1.4.1" | 
 |  | 
 | requirements = [ | 
 |     CFFI_DEPENDENCY, | 
 |     SIX_DEPENDENCY | 
 | ] | 
 |  | 
 |  | 
 | class cffi_build(build): | 
 |     """ | 
 |     This class exists, instead of just providing ``ext_modules=[...]`` directly | 
 |     in ``setup()`` because importing cryptography requires we have several | 
 |     packages installed first. | 
 |  | 
 |     By doing the imports here we ensure that packages listed in | 
 |     ``setup_requires`` are already installed. | 
 |     """ | 
 |  | 
 |     def finalize_options(self): | 
 |         from cryptography.hazmat.bindings.commoncrypto.binding import ( | 
 |             Binding as CommonCryptoBinding | 
 |         ) | 
 |         from cryptography.hazmat.bindings.openssl.binding import ( | 
 |             Binding as OpenSSLBinding | 
 |         ) | 
 |         from cryptography.hazmat.primitives import constant_time, padding | 
 |  | 
 |         self.distribution.ext_modules = [ | 
 |             OpenSSLBinding().ffi.verifier.get_extension(), | 
 |             constant_time._ffi.verifier.get_extension(), | 
 |             padding._ffi.verifier.get_extension() | 
 |         ] | 
 |         if CommonCryptoBinding.is_available(): | 
 |             self.distribution.ext_modules.append( | 
 |                 CommonCryptoBinding().ffi.verifier.get_extension() | 
 |             ) | 
 |  | 
 |         build.finalize_options(self) | 
 |  | 
 |  | 
 | with open(os.path.join(base_dir, "README.rst")) as f: | 
 |     long_description = f.read() | 
 |  | 
 |  | 
 | setup( | 
 |     name=about["__title__"], | 
 |     version=about["__version__"], | 
 |  | 
 |     description=about["__summary__"], | 
 |     long_description=long_description, | 
 |     license=about["__license__"], | 
 |     url=about["__uri__"], | 
 |  | 
 |     author=about["__author__"], | 
 |     author_email=about["__email__"], | 
 |  | 
 |     classifiers=[ | 
 |         "Intended Audience :: Developers", | 
 |         "License :: OSI Approved :: Apache Software License", | 
 |         "Natural Language :: English", | 
 |         "Operating System :: MacOS :: MacOS X", | 
 |         "Operating System :: POSIX", | 
 |         "Operating System :: POSIX :: BSD", | 
 |         "Operating System :: POSIX :: Linux", | 
 |         "Operating System :: Microsoft :: Windows", | 
 |         "Programming Language :: Python", | 
 |         "Programming Language :: Python :: 2", | 
 |         "Programming Language :: Python :: 2.6", | 
 |         "Programming Language :: Python :: 2.7", | 
 |         "Programming Language :: Python :: 3", | 
 |         "Programming Language :: Python :: 3.2", | 
 |         "Programming Language :: Python :: 3.3", | 
 |         "Programming Language :: Python :: Implementation :: CPython", | 
 |         "Programming Language :: Python :: Implementation :: PyPy", | 
 |         "Topic :: Security :: Cryptography", | 
 |     ], | 
 |  | 
 |     packages=find_packages(exclude=["tests", "tests.*"]), | 
 |  | 
 |     install_requires=requirements, | 
 |     setup_requires=requirements, | 
 |  | 
 |     # for cffi | 
 |     zip_safe=False, | 
 |     ext_package="cryptography", | 
 |     cmdclass={ | 
 |         "build": cffi_build, | 
 |     } | 
 | ) |