Mercurial > public > mercurial-scm > hg
diff contrib/python-zstandard/zstandard/__init__.py @ 37495:b1fb341d8a61
zstandard: vendor python-zstandard 0.9.0
This was just released. It features a number of goodies. More info at
https://gregoryszorc.com/blog/2018/04/09/release-of-python-zstandard-0.9/.
The clang-format ignore list was updated to reflect the new source
of files.
The project contains a vendored copy of zstandard 1.3.4. The old
version was 1.1.3. One of the changes between those versions is that
zstandard is now dual licensed BSD + GPLv2 and the patent rights grant
has been removed. Good riddance.
The API should be backwards compatible. So no changes in core
should be needed. However, there were a number of changes in the
library that we'll want to adapt to. Those will be addressed in
subsequent commits.
Differential Revision: https://phab.mercurial-scm.org/D3198
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 09 Apr 2018 10:13:29 -0700 |
parents | |
children | 73fef626dae3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/python-zstandard/zstandard/__init__.py Mon Apr 09 10:13:29 2018 -0700 @@ -0,0 +1,62 @@ +# Copyright (c) 2017-present, Gregory Szorc +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +"""Python interface to the Zstandard (zstd) compression library.""" + +from __future__ import absolute_import, unicode_literals + +# This module serves 2 roles: +# +# 1) Export the C or CFFI "backend" through a central module. +# 2) Implement additional functionality built on top of C or CFFI backend. + +import os +import platform + +# Some Python implementations don't support C extensions. That's why we have +# a CFFI implementation in the first place. The code here import one of our +# "backends" then re-exports the symbols from this module. For convenience, +# we support falling back to the CFFI backend if the C extension can't be +# imported. But for performance reasons, we only do this on unknown Python +# implementation. Notably, for CPython we require the C extension by default. +# Because someone will inevitably want special behavior, the behavior is +# configurable via an environment variable. A potentially better way to handle +# this is to import a special ``__importpolicy__`` module or something +# defining a variable and `setup.py` could write the file with whatever +# policy was specified at build time. Until someone needs it, we go with +# the hacky but simple environment variable approach. +_module_policy = os.environ.get('PYTHON_ZSTANDARD_IMPORT_POLICY', 'default') + +if _module_policy == 'default': + if platform.python_implementation() in ('CPython',): + from zstd import * + backend = 'cext' + elif platform.python_implementation() in ('PyPy',): + from zstd_cffi import * + backend = 'cffi' + else: + try: + from zstd import * + backend = 'cext' + except ImportError: + from zstd_cffi import * + backend = 'cffi' +elif _module_policy == 'cffi_fallback': + try: + from zstd import * + backend = 'cext' + except ImportError: + from zstd_cffi import * + backend = 'cffi' +elif _module_policy == 'cext': + from zstd import * + backend = 'cext' +elif _module_policy == 'cffi': + from zstd_cffi import * + backend = 'cffi' +else: + raise ImportError('unknown module import policy: %s; use default, cffi_fallback, ' + 'cext, or cffi' % _module_policy)