Hello community,

here is the log from the commit of package python-bitarray for openSUSE:Factory 
checked in at 2020-07-08 19:12:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-bitarray (Old)
 and      /work/SRC/openSUSE:Factory/.python-bitarray.new.3060 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-bitarray"

Wed Jul  8 19:12:54 2020 rev:2 rq:819132 version:1.3.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-bitarray/python-bitarray.changes  
2020-03-25 23:46:56.312065083 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-bitarray.new.3060/python-bitarray.changes    
    2020-07-08 19:13:14.523160390 +0200
@@ -1,0 +2,20 @@
+Mon Jul  6 18:40:25 UTC 2020 - Martin Hauke <[email protected]>
+
+- Update to version 1.3.0
+  * add `bitarray.util.make_endian()`
+  * `util.ba2hex()` and `util.hex2ba()` now also support
+    little-endian
+  * add `bitarray.get_default_endian()`
+  * made first argument of initializer a positional-only parameter
+  * remove `.fromstring()` and `.tostring()` methods, these have
+    been deprecated 8 years ago, since version 0.4.0
+  * add `__all__` in `bitarray/__init__.py`
+  * drop Python 3.3 and 3.4 support
+- Update to version 1.2.2
+  * `util.ba2hex` now always return a string object (instead of
+    bytes object for Python 3), see issue #94
+  * `util.hex2ba` allows a unicode object as input on Python 2
+  * Determine 64-bitness of interpreter in a cross-platform
+    fashion #91, in order to better support PyPy
+
+-------------------------------------------------------------------

Old:
----
  bitarray-1.2.1.tar.gz

New:
----
  bitarray-1.3.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-bitarray.spec ++++++
--- /var/tmp/diff_new_pack.9hroe8/_old  2020-07-08 19:13:16.951168767 +0200
+++ /var/tmp/diff_new_pack.9hroe8/_new  2020-07-08 19:13:16.955168781 +0200
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-bitarray
-Version:        1.2.1
+Version:        1.3.0
 Release:        0
 Summary:        Efficient Arrays of Booleans
 License:        Python-2.0

++++++ bitarray-1.2.1.tar.gz -> bitarray-1.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/CHANGE_LOG 
new/bitarray-1.3.0/CHANGE_LOG
--- old/bitarray-1.2.1/CHANGE_LOG       2020-01-06 21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/CHANGE_LOG       2020-07-06 05:39:41.000000000 +0200
@@ -1,3 +1,24 @@
+2020-07-06   1.3.0:
+-------------------
+  * add `bitarray.util.make_endian()`
+  * `util.ba2hex()` and `util.hex2ba()` now also support little-endian
+  * add `bitarray.get_default_endian()`
+  * made first argument of initializer a positional-only parameter
+  * remove `.fromstring()` and `.tostring()` methods, these have been
+    deprecated 8 years ago, since version 0.4.0
+  * add `__all__` in `bitarray/__init__.py`
+  * drop Python 3.3 and 3.4 support
+
+
+2020-05-18   1.2.2:
+-------------------
+  * `util.ba2hex` now always return a string object (instead of bytes object
+    for Python 3), see issue #94
+  * `util.hex2ba` allows a unicode object as input on Python 2
+  * Determine 64-bitness of interpreter in a cross-platform fashion #91,
+    in order to better support PyPy
+
+
 2020-01-06   1.2.1:
 -------------------
   * simplify markdown of readme so PyPI renders better
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/Makefile new/bitarray-1.3.0/Makefile
--- old/bitarray-1.2.1/Makefile 2020-01-06 21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/Makefile 2020-07-06 05:39:41.000000000 +0200
@@ -1,3 +1,5 @@
+PYTHON=python
+
 bitarray/_bitarray.so: bitarray/_bitarray.c
        $(PYTHON) setup.py build_ext --inplace
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/README.md new/bitarray-1.3.0/README.md
--- old/bitarray-1.2.1/README.md        2020-01-06 21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/README.md        2020-07-06 05:39:41.000000000 +0200
@@ -36,8 +36,8 @@
 
 Bitarray can be installed from source:
 
-    $ tar xzf bitarray-1.2.1.tar.gz
-    $ cd bitarray-1.2.1
+    $ tar xzf bitarray-1.3.0.tar.gz
+    $ cd bitarray-1.3.0
     $ python setup.py install
 
 On Unix systems, the latter command may have to be executed with root
@@ -46,7 +46,7 @@
 
     $ python -c 'import bitarray; bitarray.test()'
     bitarray is installed in: /usr/local/lib/python2.7/site-packages/bitarray
-    bitarray version: 1.2.1
+    bitarray version: 1.3.0
     3.7.4 (r271:86832, Dec 29 2018) [GCC 4.2.1 (SUSE Linux)]
     .........................................................................
     .........................................................................
@@ -286,12 +286,11 @@
 The bitarray object:
 --------------------
 
-`bitarray(initial=0, /, endian='big')`
+`bitarray(initializer=0, /, endian='big')` -> bitarray
 
 Return a new bitarray object whose items are bits initialized from
 the optional initial object, and endianness.
-If no initial object is provided, an empty bitarray (length zero) is created.
-The initial object may be of the following types:
+The initializer may be of the following types:
 
 `int`: Create a bitarray of given integer length.  The initial values are
 arbitrary.  If you want all values to be set, use the .setall() method.
@@ -399,12 +398,6 @@
 read until EOF is reached.
 
 
-`fromstring(str)`
-
-Append from a string, interpreting the string as machine values.
-Deprecated since version 0.4.0, use `.frombytes()` instead.
-
-
 `index(value, start=0, stop=<end of array>, /)` -> int
 
 Return index of the first occurrence of `bool(value)` in the bitarray.
@@ -521,14 +514,6 @@
 use the extend method.
 
 
-`tostring()` -> str
-
-Return the string representing (machine values) of the bitarray.
-When the length of the bitarray is not a multiple of 8, the few remaining
-bits (1..7) are set to 0.
-Deprecated since version 0.4.0, use `.tobytes()` instead.
-
-
 `unpack(zero=b'\x00', one=b'\xff')` -> bytes
 
 Return bytes containing one character for each bit in the bitarray,
@@ -538,7 +523,7 @@
 The frozenbitarray object:
 --------------------------
 
-`frozenbitarray(initial=0, /, endian='big')`
+`frozenbitarray(initializer=0, /, endian='big')` -> frozenbitarray
 
 Return a frozenbitarray object, which is initialized the same way a bitarray
 object is initialized.  A frozenbitarray is immutable and hashable.
@@ -554,25 +539,35 @@
 Run self-test, and return unittest.runner.TextTestResult object.
 
 
-`bitdiff(a, b, /)` -> int
+`bits2bytes(n, /)` -> int
 
-Return the difference between two bitarrays a and b.
-This is function does the same as (a ^ b).count(), but is more memory
-efficient, as no intermediate bitarray object gets created.
-Deprecated since version 1.2.0, use `bitarray.util.count_xor()` instead.
+Return the number of bytes necessary to store n bits.
 
 
-`bits2bytes(n, /)` -> int
+`get_default_endian()` -> string
 
-Return the number of bytes necessary to store n bits.
+Return the default endianness for new bitarray objects being created.
+Under normal circumstances, the return value is `big`.
 
 
 Functions defined in bitarray.util:
 -----------------------------------
 
-`zeros(length, /, endian='big')` -> bitarray
+`zeros(length, /, endian=None)` -> bitarray
+
+Create a bitarray of length, with all values 0, and optional
+endianness, which may be 'big', 'lillte'.
+
 
-Create a bitarray of length, with all values 0.
+`make_endian(bitarray, endian, /)` -> bitarray
+
+When the endianness of the given bitarray is different from `endian`,
+return a new bitarray, with endianness `endian` and the same elements
+as the original bitarray, i.e. even though the binary representation of the
+new bitarray will be different, the returned bitarray will equal the original
+one.
+Otherwise (endianness is already `endian`) the original bitarray is returned
+unchanged.
 
 
 `rindex(bitarray, value=True, /)` -> int
@@ -621,11 +616,11 @@
 
 `ba2hex(bitarray, /)` -> hexstr
 
-Return a bytes object containing with hexadecimal representation of
+Return a string containing with hexadecimal representation of
 the bitarray (which has to be multiple of 4 in length).
 
 
-`hex2ba(hexstr, /)` -> bitarray
+`hex2ba(hexstr, /, endian=None)` -> bitarray
 
 Bitarray of hexadecimal representation.
 hexstr may contain any number of hex digits (upper or lower case).
@@ -637,7 +632,7 @@
 The bit-endianness of the bitarray is respected.
 
 
-`int2ba(int, /, length=None, endian='big')` -> bitarray
+`int2ba(int, /, length=None, endian=None)` -> bitarray
 
 Convert the given integer into a bitarray (with given endianness,
 and no leading (big-endian) / trailing (little-endian) zeros).
@@ -646,7 +641,7 @@
 within length bits.
 
 
-`huffman_code(dict, /, endian='big')` -> dict
+`huffman_code(dict, /, endian=None)` -> dict
 
 Given a frequency map, a dictionary mapping symbols to thier frequency,
 calculate the Huffman code, i.e. a dict mapping those symbols to
@@ -657,6 +652,27 @@
 Change log
 ----------
 
+*1.3.0* (2020-07-06):
+
+  * add `bitarray.util.make_endian()`
+  * `util.ba2hex()` and `util.hex2ba()` now also support little-endian
+  * add `bitarray.get_default_endian()`
+  * made first argument of initializer a positional-only parameter
+  * remove `.fromstring()` and `.tostring()` methods, these have been
+    deprecated 8 years ago, since version 0.4.0
+  * add `__all__` in `bitarray/__init__.py`
+  * drop Python 3.3 and 3.4 support
+
+
+*1.2.2* (2020-05-18):
+
+  * `util.ba2hex` now always return a string object (instead of bytes object
+    for Python 3), see issue #94
+  * `util.hex2ba` allows a unicode object as input on Python 2
+  * Determine 64-bitness of interpreter in a cross-platform fashion #91,
+    in order to better support PyPy
+
+
 *1.2.1* (2020-01-06):
 
   * simplify markdown of readme so PyPI renders better
@@ -664,32 +680,5 @@
     they cannot be imported)
 
 
-*1.2.0* (2019-12-06):
-
-  * add bitarray.util module which provides useful utility functions
-  * deprecate `bitarray.bitdiff` in favor of `bitarray.util.count_xor`
-  * use markdown for documentation
-  * fix bug in .count() on 32bit systems in special cases when array size
-    is 2^29 bits or larger
-  * simplified tests by using bytes syntax
-  * update smallints and sieve example to use new utility module
-  * simplified mandel example to use numba
-  * use file context managers in tests
-
-
-*1.1.0* (2019-11-07):
-
-  * add frozenbitarray object
-  * add optional start and stop parameters to .count() method
-  * add official Python 3.8 support
-  * optimize setrange() C-function by using memset
-  * fix issue #74, bitarray is hashable on Python 2
-  * fix issue #68, `unittest.TestCase.assert_` deprecated
-  * improved test suite - tests should run in about 1 second
-  * update documentation to use positional-only syntax in docstrings
-  * update readme to pass Python 3 doctest
-  * add utils module to examples
-
-
 Please find the complete change log
 <a 
href="https://github.com/ilanschnell/bitarray/blob/master/CHANGE_LOG";>here</a>.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/bitarray/__init__.py 
new/bitarray-1.3.0/bitarray/__init__.py
--- old/bitarray-1.2.1/bitarray/__init__.py     2020-01-06 21:09:39.000000000 
+0100
+++ new/bitarray-1.3.0/bitarray/__init__.py     2020-07-06 05:39:41.000000000 
+0200
@@ -4,22 +4,25 @@
 
 Please find a description of this package at:
 
-    http://pypi.python.org/pypi/bitarray/
+    https://github.com/ilanschnell/bitarray
 
 Author: Ilan Schnell
 """
-from bitarray._bitarray import _bitarray, bitdiff, bits2bytes, _sysinfo
+from bitarray._bitarray import (_bitarray, bitdiff, bits2bytes, _sysinfo,
+                                get_default_endian, _set_default_endian)
 
-__version__ = '1.2.1'
+
+__version__ = '1.3.0'
+
+__all__ = ['bitarray', 'frozenbitarray']
 
 
 class bitarray(_bitarray):
-    """bitarray(initial=0, /, endian='big')
+    """bitarray(initializer=0, /, endian='big') -> bitarray
 
 Return a new bitarray object whose items are bits initialized from
 the optional initial object, and endianness.
-If no initial object is provided, an empty bitarray (length zero) is created.
-The initial object may be of the following types:
+The initializer may be of the following types:
 
 `int`: Create a bitarray of given integer length.  The initial values are
 arbitrary.  If you want all values to be set, use the .setall() method.
@@ -40,25 +43,9 @@
 machine representation of the bitarray, i.e. when using the methods: tofile,
 fromfile, tobytes, frombytes."""
 
-    def fromstring(self, string):
-        """fromstring(str)
-
-Append from a string, interpreting the string as machine values.
-Deprecated since version 0.4.0, use `.frombytes()` instead."""
-        return self.frombytes(string.encode())
-
-    def tostring(self):
-        """tostring() -> str
-
-Return the string representing (machine values) of the bitarray.
-When the length of the bitarray is not a multiple of 8, the few remaining
-bits (1..7) are set to 0.
-Deprecated since version 0.4.0, use `.tobytes()` instead."""
-        return self.tobytes().decode()
-
 
 class frozenbitarray(_bitarray):
-    """frozenbitarray(initial=0, /, endian='big')
+    """frozenbitarray(initializer=0, /, endian='big') -> frozenbitarray
 
 Return a frozenbitarray object, which is initialized the same way a bitarray
 object is initialized.  A frozenbitarray is immutable and hashable.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/bitarray/_bitarray.c 
new/bitarray-1.3.0/bitarray/_bitarray.c
--- old/bitarray-1.2.1/bitarray/_bitarray.c     2020-01-06 21:09:39.000000000 
+0100
+++ new/bitarray-1.3.0/bitarray/_bitarray.c     2020-07-06 05:39:41.000000000 
+0200
@@ -1,5 +1,5 @@
 /*
-   Copyright (c) 2008 - 2019, Ilan Schnell
+   Copyright (c) 2008 - 2020, Ilan Schnell
    bitarray is published under the PSF license.
 
    This file is the C part of the bitarray package.
@@ -36,7 +36,7 @@
 typedef long long int idx_t;
 
 /* throughout:  0 = little endian   1 = big endian */
-#define DEFAULT_ENDIAN  1
+static int default_endian = 1;
 
 /* Unlike the normal convention, ob_size is the byte count, not the number
    of elements.  The reason for doing this is that we can use our own
@@ -54,7 +54,9 @@
 
 static PyTypeObject Bitarraytype;
 
-#define bitarray_Check(obj)  PyObject_TypeCheck(obj, &Bitarraytype)
+#define ENDIAN_STR(ba)  (((ba)->endian) ? "big" : "little")
+
+#define bitarray_Check(obj)  PyObject_TypeCheck((obj), &Bitarraytype)
 
 #define BITS(bytes)  ((idx_t) (bytes) << 3)
 
@@ -290,6 +292,7 @@
         res++;
     }
     assert(res < 8);
+    assert(n == self->nbits + res);
     return res;
 }
 
@@ -425,8 +428,7 @@
     }
 }
 
-
-static int bitcount_lookup[256] = {
+static unsigned char bitcount_lookup[256] = {
     0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
@@ -587,21 +589,20 @@
 static int
 extend_bitarray(bitarrayobject *self, bitarrayobject *other)
 {
-    idx_t n_sum;
-    idx_t n_other_bits;
+    idx_t self_bits, other_bits;
 
     if (other->nbits == 0)
         return 0;
 
-    /* Note that other may be self.  Thus we take the size before we resize,
-       ensuring we only copy the right parts of the array. */
-    n_other_bits = other->nbits;
-    n_sum = self->nbits + other->nbits;
+    /* We have to store the sizes before we resize.
+       Since other may be self, we also need to store other->nbits. */
+    self_bits = self->nbits;
+    other_bits = other->nbits;
 
-    if (resize(self, n_sum) < 0)
+    if (resize(self, self_bits + other_bits) < 0)
         return -1;
 
-    copy_n(self, n_sum - n_other_bits, other, 0, n_other_bits);
+    copy_n(self, self_bits, other, 0, other_bits);
     return 0;
 }
 
@@ -781,17 +782,17 @@
     return ret;
 }
 
-/* --------- helper functions NOT involving bitarrayobjects ------------ */
-
-#define ENDIAN_STR(ba)  (((ba)->endian) ? "big" : "little")
+/* --------- helper functions not involving bitarrayobjects ------------ */
 
 #ifdef IS_PY3K
 #define IS_INDEX(x)  (PyLong_Check(x) || PyIndex_Check(x))
 #define IS_INT_OR_BOOL(x)  (PyBool_Check(x) || PyLong_Check(x))
+#define Py_CSTRING  PyUnicode_FromString
 #else  /* Py 2 */
 #define IS_INDEX(x)  (PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
 #define IS_INT_OR_BOOL(x)  (PyBool_Check(x) || PyInt_Check(x) || \
                                                PyLong_Check(x))
+#define Py_CSTRING  PyString_FromString
 #endif
 
 /* given an PyLong (which must be 0 or 1), or a PyBool, return 0 or 1,
@@ -1163,11 +1164,7 @@
 static PyObject *
 bitarray_endian(bitarrayobject *self)
 {
-#ifdef IS_PY3K
-    return PyUnicode_FromString(ENDIAN_STR(self));
-#else
-    return PyString_FromString(ENDIAN_STR(self));
-#endif
+    return Py_CSTRING(ENDIAN_STR(self));
 }
 
 PyDoc_STRVAR(endian_doc,
@@ -2740,6 +2737,27 @@
 };
 
 
+/* Given a string, return an integer representing the endianness.
+   If the string is invalid, set a Python exception and return -1. */
+static int
+endian_from_string(const char* string)
+{
+    assert(default_endian == 0 || default_endian == 1);
+
+    if (string == NULL)
+        return default_endian;
+
+    if (strcmp(string, "little") == 0)
+        return 0;
+
+    if (strcmp(string, "big") == 0)
+        return 1;
+
+    PyErr_SetString(PyExc_ValueError, "endian must be 'little' or 'big'");
+    return -1;
+}
+
+
 static PyObject *
 bitarray_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
@@ -2747,26 +2765,15 @@
     PyObject *initial = NULL;
     char *endian_str = NULL;
     int endian;
-    static char *kwlist[] = {"initial", "endian", NULL};
+    static char *kwlist[] = {"", "endian", NULL};
 
     if (!PyArg_ParseTupleAndKeywords(args, kwds,
                         "|Os:bitarray", kwlist, &initial, &endian_str))
         return NULL;
 
-    if (endian_str == NULL) {
-        endian = DEFAULT_ENDIAN;  /* use default value */
-    }
-    else if (strcmp(endian_str, "little") == 0) {
-        endian = 0;
-    }
-    else if (strcmp(endian_str, "big") == 0) {
-        endian = 1;
-    }
-    else {
-        PyErr_SetString(PyExc_ValueError,
-                        "endian must be 'little' or 'big'");
+    endian = endian_from_string(endian_str);
+    if (endian < 0)
         return NULL;
-    }
 
     /* no arg or None */
     if (initial == NULL || initial == Py_None)
@@ -3096,6 +3103,12 @@
 
 #endif  /* WITH_BUFFER */
 
+PyDoc_STRVAR(bitarraytype_doc,
+"_bitarray(initializer=0, /, endian='big') -> bitarray\n\
+\n\
+Return a new bitarray object.\n\
+");
+
 /************************** Bitarray Type *******************************/
 
 static PyTypeObject Bitarraytype = {
@@ -3133,7 +3146,7 @@
     | Py_TPFLAGS_HAVE_NEWBUFFER
 #endif
     ,                                         /* tp_flags */
-    0,                                        /* tp_doc */
+    bitarraytype_doc,                         /* tp_doc */
     0,                                        /* tp_traverse */
     0,                                        /* tp_clear */
     richcompare,                              /* tp_richcompare */
@@ -3223,6 +3236,44 @@
 
 
 static PyObject *
+get_default_endian(PyObject *self)
+{
+    return Py_CSTRING(default_endian ? "big" : "little");
+}
+
+PyDoc_STRVAR(get_default_endian_doc,
+"get_default_endian() -> string\n\
+\n\
+Return the default endianness for new bitarray objects being created.\n\
+Under normal circumstances, the return value is `big`.");
+
+
+static PyObject *
+set_default_endian(PyObject *self, PyObject *args)
+{
+    char *endian_str;
+    int tmp;
+
+    if (!PyArg_ParseTuple(args, "s:_set_default_endian", &endian_str))
+        return NULL;
+
+    /* As endian_from_string might return -1, we have to store its value
+       in a temporary variable before setting default_endian. */
+    tmp = endian_from_string(endian_str);
+    if (tmp < 0)
+        return NULL;
+    default_endian = tmp;
+
+    Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(set_default_endian_doc,
+"_set_default_endian(endian, /)\n\
+\n\
+Set the default bit endianness for new bitarray objects being created.");
+
+
+static PyObject *
 sysinfo(void)
 {
     return Py_BuildValue("iiiiL",
@@ -3251,6 +3302,10 @@
 static PyMethodDef module_functions[] = {
     {"bitdiff",    (PyCFunction) bitdiff,    METH_VARARGS, bitdiff_doc   },
     {"bits2bytes", (PyCFunction) bits2bytes, METH_O,       bits2bytes_doc},
+    {"get_default_endian", (PyCFunction) get_default_endian, METH_NOARGS,
+                                                   get_default_endian_doc},
+    {"_set_default_endian", (PyCFunction) set_default_endian, METH_VARARGS,
+                                                   set_default_endian_doc},
     {"_sysinfo",   (PyCFunction) sysinfo,    METH_NOARGS,  sysinfo_doc   },
     {NULL,         NULL}  /* sentinel */
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/bitarray/_util.c 
new/bitarray-1.3.0/bitarray/_util.c
--- old/bitarray-1.2.1/bitarray/_util.c 2020-01-06 21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/bitarray/_util.c 2020-07-06 05:39:41.000000000 +0200
@@ -89,7 +89,7 @@
         setbit(self, i, 0);
 }
 
-static int bitcount_lookup[256] = {
+static unsigned char bitcount_lookup[256] = {
     0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/bitarray/test_bitarray.py 
new/bitarray-1.3.0/bitarray/test_bitarray.py
--- old/bitarray-1.2.1/bitarray/test_bitarray.py        2020-01-06 
21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/bitarray/test_bitarray.py        2020-07-06 
05:39:41.000000000 +0200
@@ -29,9 +29,9 @@
     from cStringIO import StringIO
 
 
-from bitarray import (bitarray, frozenbitarray,
-                      bitdiff, bits2bytes, __version__)
-
+from bitarray import (bitarray, frozenbitarray, bitdiff, bits2bytes,
+                      get_default_endian, _set_default_endian,
+                      _sysinfo, __version__)
 
 tests = []
 
@@ -39,7 +39,7 @@
 class Util(object):
 
     @staticmethod
-    def randombitarrays(start=1):
+    def randombitarrays(start=0):
         for n in list(range(start, 25)) + [randint(1000, 2000)]:
             a = bitarray(endian=['little', 'big'][randint(0, 1)])
             a.frombytes(os.urandom(bits2bytes(n)))
@@ -59,6 +59,12 @@
             return randint(-length-5, length+5)
 
     @staticmethod
+    def other_endian(endian):
+        t = {'little': 'big',
+             'big': 'little'}
+        return t[endian]
+
+    @staticmethod
     def slicelen(s, length):
         assert isinstance(s, slice)
         start, stop, step = s.indices(length)
@@ -92,6 +98,28 @@
 
 class TestsModuleFunctions(unittest.TestCase, Util):
 
+    def test_default_endian(self):
+        self.assertRaises(TypeError, _set_default_endian, 0)
+        self.assertRaises(TypeError, _set_default_endian, 'little', 0)
+        self.assertRaises(ValueError, _set_default_endian, 'foo')
+        for default_endian in 'big', 'little', u'big', u'little':
+            _set_default_endian(default_endian)
+            a = bitarray()
+            self.assertEqual(a.endian(), default_endian)
+            a = bitarray('10111')
+            self.assertEqual(a.endian(), default_endian)
+
+            for endian in 'big', 'little':
+                a = bitarray(endian=endian)
+                self.assertEqual(a.endian(), endian)
+
+            # test get_default_endian()
+            self.assertEqual(get_default_endian(), default_endian)
+            # make sure that calling _set_default_endian wrong does not
+            # change the default endianness
+            self.assertRaises(ValueError, _set_default_endian, 'foobar')
+            self.assertEqual(get_default_endian(), default_endian)
+
     def test_bitdiff(self):
         a = bitarray('0011')
         b = bitarray('0101')
@@ -148,34 +176,23 @@
         self.assertEqual(a.tolist(), [])
         self.check_obj(a)
 
-    def test_endian1(self):
+    def test_endian(self):
         a = bitarray(endian='little')
-        a.fromstring('A')
+        a.frombytes(b'ABC')
         self.assertEqual(a.endian(), 'little')
         self.assertIsInstance(a.endian(), str)
         self.check_obj(a)
 
         b = bitarray(endian='big')
-        b.fromstring('A')
+        b.frombytes(b'ABC')
         self.assertEqual(b.endian(), 'big')
         self.assertIsInstance(a.endian(), str)
         self.check_obj(b)
 
-        self.assertEqual(a.tostring(), b.tostring())
-
-    def test_endian2(self):
-        a = bitarray(endian='little')
-        a.fromstring(' ')
-        self.assertEqual(a.endian(), 'little')
-        self.check_obj(a)
-
-        b = bitarray(endian='big')
-        b.fromstring(' ')
-        self.assertEqual(b.endian(), 'big')
-        self.check_obj(b)
-
-        self.assertEqual(a.tostring(), b.tostring())
+        self.assertNotEqual(a, b)
+        self.assertEqual(a.tobytes(), b.tobytes())
 
+    def test_endian_wrong(self):
         self.assertRaises(TypeError, bitarray.__new__, bitarray, endian=0)
         self.assertRaises(ValueError, bitarray.__new__, bitarray, endian='')
         self.assertRaises(ValueError, bitarray.__new__,
@@ -255,7 +272,7 @@
 
         self.assertRaises(ValueError, bitarray.__new__, bitarray, '01012100')
 
-    def test_rawbytes(self): # this representation is used for pickling
+    def test_rawbytes(self):  # this representation is used for pickling
         for s, r in [(b'\x00', ''), (b'\x07\xff', '1'), (b'\x03\xff', '11111'),
                      (b'\x01\x87\xda', '10000111' '1101101')]:
             self.assertEqual(bitarray(s, endian='big'),
@@ -265,28 +282,56 @@
             self.assertRaises(ValueError, bitarray.__new__,
                               bitarray, bytes(bytearray([i])))
 
-    def test_bitarray(self):
+    def test_bitarray_simple(self):
         for n in range(10):
             a = bitarray(n)
             b = bitarray(a)
             self.assertFalse(a is b)
             self.assertEQUAL(a, b)
 
-        for end in ('little', 'big'):
-            a = bitarray(endian=end)
-            c = bitarray(a)
-            self.assertEqual(c.endian(), end)
-            c = bitarray(a, endian='little')
-            self.assertEqual(c.endian(), 'little')
-            c = bitarray(a, endian='big')
-            self.assertEqual(c.endian(), 'big')
+    def test_bitarray_endian(self):
+        # Test creating a new bitarray with different endianness from an
+        # existing bitarray.
+        for endian in 'little', 'big':
+            a = bitarray(endian=endian)
+            b = bitarray(a)
+            self.assertFalse(a is b)
+            self.assertEQUAL(a, b)
 
+            endian2 = self.other_endian(endian)
+            c = bitarray(a, endian2)
+            self.assertEqual(c.endian(), endian2)
+            self.assertEqual(a, c)  # but only because they are empty
+
+            # Even though the byte representation will be the same,
+            # the bitarrays are not equal.
+            a = bitarray('11001000' '11110000', endian)
+            self.assertEqual(len(a) % 8, 0)
+            c = bitarray(a, endian2)
+            # This is only equal because the size of the bitarray is a
+            # multiple of 8, and unused bits are not set (which changes
+            # the byte representation).
+            self.assertEqual(a.tobytes(), c.tobytes())
+            self.assertNotEqual(a.endian(), c.endian())
+            self.assertNotEqual(a, c)
+
+    def test_bitarray_endianness(self):
+        a = bitarray('11100001', endian='little')
+        b = bitarray(a, endian='big')
+        self.assertNotEqual(a, b)
+        self.assertEqual(a.tobytes(), b.tobytes())
+
+        b.bytereverse()
+        self.assertEqual(a, b)
+        self.assertNotEqual(a.tobytes(), b.tobytes())
+
+        c = bitarray('11100001', endian='big')
+        self.assertEqual(a, c)
 
     def test_None(self):
         self.assertEQUAL(bitarray(), bitarray(0))
         self.assertEQUAL(bitarray(), bitarray(None))
 
-
     def test_WrongArgs(self):
         self.assertRaises(TypeError, bitarray.__new__, bitarray, 'A', 42, 69)
 
@@ -297,6 +342,9 @@
         self.assertRaises(TypeError, bitarray.__new__, bitarray, 4+3j)
 
         self.assertRaises(TypeError, bitarray.__new__, bitarray, '', 0, 42)
+        # test second (endian) argument
+        self.assertRaises(TypeError, bitarray.__new__, bitarray, 0, None)
+        self.assertRaises(TypeError, bitarray.__new__, bitarray, 0, 0)
         self.assertRaises(ValueError, bitarray.__new__, bitarray, 0, 'foo')
 
 
@@ -514,7 +562,7 @@
         a = bitarray('1111')
         a[1:3] = bitarray('0000')
         self.assertEqual(a, bitarray('100001'))
-        a[:] = bitarray('010') # replace all values
+        a[:] = bitarray('010')  # replace all values
         self.assertEqual(a, bitarray('010'))
 
     def test_setslice_to_bool(self):
@@ -547,7 +595,7 @@
         self.assertRaises(ValueError, a.__setitem__, slice(None, None, 2), 3)
         self.assertRaises(ValueError, a.__setitem__, slice(None, 2, None), -1)
 
-    def test_sieve(self): # Sieve of Eratosthenes
+    def test_sieve(self):  # Sieve of Eratosthenes
         a = bitarray(50)
         a.setall(1)
         for i in range(2, 8):
@@ -667,7 +715,7 @@
             def __getitem__(self, i):
                 return bitarray.__getitem__(self, i - self.offset)
 
-        for a in self.randombitarrays(start=1):
+        for a in self.randombitarrays(start=0):
             b = ExaggeratingBitarray(a, 1234)
             for i in range(len(a)):
                 self.assertEqual(a[i], b[i+1234])
@@ -735,7 +783,7 @@
                 self.assertEQUAL(a, b)
 
     def test_overflow(self):
-        if tuple.__itemsize__ == 8:
+        if _sysinfo()[0] == 8:
             return
 
         self.assertRaises(OverflowError, bitarray.__new__,
@@ -986,7 +1034,7 @@
         self.assertEQUAL(a & b, bitarray('10001'))
 
         b = bitarray('1001')
-        self.assertRaises(ValueError, a.__and__, b) # not same length
+        self.assertRaises(ValueError, a.__and__, b)  # not same length
 
         self.assertRaises(TypeError, a.__and__, 42)
 
@@ -1274,9 +1322,9 @@
             b.append(1)
             self.assertTrue(a is b)
             self.check_obj(b)
-            self.assertEQUAL(b, bitarray(aa+[1], endian=a.endian()))
+            self.assertEQUAL(b, bitarray(aa + [1], endian=a.endian()))
             b.append('')
-            self.assertEQUAL(b, bitarray(aa+[1, 0], endian=a.endian()))
+            self.assertEQUAL(b, bitarray(aa + [1, 0], endian=a.endian()))
 
 
     def test_insert(self):
@@ -1384,17 +1432,17 @@
             i = randint(0, 1)
             a.setall(i)
             for unused in range(randint(1, 4)):
-                a[randint(0, n-1)] = 1-i
+                a[randint(0, n - 1)] = 1 - i
             aa = a.tolist()
             for unused in range(100):
-                start = randint(-50, n+50)
-                stop = randint(-50, n+50)
+                start = randint(-50, n + 50)
+                stop = randint(-50, n + 50)
                 try:
-                    res1 = a.index(1-i, start, stop)
+                    res1 = a.index(1 - i, start, stop)
                 except ValueError:
                     res1 = None
                 try:
-                    res2 = aa.index(1-i, start, stop)
+                    res2 = aa.index(1 - i, start, stop)
                 except ValueError:
                     res2 = None
                 self.assertEqual(res1, res2)
@@ -1448,8 +1496,8 @@
     def test_count6(self):
         for a in self.randombitarrays():
             s = a.to01()
-            i = randint(-3, len(a)+1)
-            j = randint(-3, len(a)+1)
+            i = randint(-3, len(a) + 1)
+            j = randint(-3, len(a) + 1)
             self.assertEqual(a.count(1, i, j), s[i:j].count('1'))
             self.assertEqual(a.count(0, i, j), s[i:j].count('0'))
 
@@ -1499,7 +1547,7 @@
     def test_search3(self):
         a = bitarray('10010101110011111001011')
         for s, res in [('011', [6, 11, 20]),
-                       ('111', [7, 12, 13, 14]), # note the overlap
+                       ('111', [7, 12, 13, 14]),  # note the overlap
                        ('1011', [5, 19]),
                        ('100', [0, 9, 16])]:
             b = bitarray(s)
@@ -1665,7 +1713,7 @@
 
         for a in self.randombitarrays():
             self.assertRaises(IndexError, a.pop, len(a))
-            self.assertRaises(IndexError, a.pop, -len(a)-1)
+            self.assertRaises(IndexError, a.pop, -len(a) - 1)
             if len(a) == 0:
                 continue
             aa = a.tolist()
@@ -1725,7 +1773,7 @@
 
 # ---------------------------------------------------------------------------
 
-class StringTests(unittest.TestCase, Util):
+class BytesTests(unittest.TestCase, Util):
 
     def randombytes(self):
         for n in range(1, 20):
@@ -1831,7 +1879,7 @@
         self.assertRaises(TypeError, a.pack, bitarray())
 
 
-tests.append(StringTests)
+tests.append(BytesTests)
 
 # ---------------------------------------------------------------------------
 
@@ -1877,7 +1925,7 @@
     def test_fromfile_wrong_args(self):
         b = bitarray()
         self.assertRaises(TypeError, b.fromfile)
-        self.assertRaises(TypeError, b.fromfile, StringIO()) # file not open
+        self.assertRaises(TypeError, b.fromfile, StringIO())  # file not open
         self.assertRaises(TypeError, b.fromfile, 42)
         self.assertRaises(TypeError, b.fromfile, 'bar')
 
@@ -1932,33 +1980,33 @@
 
     def test_fromfile_n(self):
         a = bitarray()
-        a.fromstring('ABCDEFGHIJ')
+        a.frombytes(b'ABCDEFGHIJ')
         with open(self.tmpfname, 'wb') as fo:
             a.tofile(fo)
 
         b = bitarray()
         with open(self.tmpfname, 'rb') as f:
-            b.fromfile(f, 0);     self.assertEqual(b.tostring(), '')
-            b.fromfile(f, 1);     self.assertEqual(b.tostring(), 'A')
+            b.fromfile(f, 0);     self.assertEqual(b.tobytes(), b'')
+            b.fromfile(f, 1);     self.assertEqual(b.tobytes(), b'A')
             f.read(1)
             b = bitarray()
-            b.fromfile(f, 2);     self.assertEqual(b.tostring(), 'CD')
-            b.fromfile(f, 1);     self.assertEqual(b.tostring(), 'CDE')
-            b.fromfile(f, 0);     self.assertEqual(b.tostring(), 'CDE')
-            b.fromfile(f);        self.assertEqual(b.tostring(), 'CDEFGHIJ')
-            b.fromfile(f);        self.assertEqual(b.tostring(), 'CDEFGHIJ')
+            b.fromfile(f, 2);     self.assertEqual(b.tobytes(), b'CD')
+            b.fromfile(f, 1);     self.assertEqual(b.tobytes(), b'CDE')
+            b.fromfile(f, 0);     self.assertEqual(b.tobytes(), b'CDE')
+            b.fromfile(f);        self.assertEqual(b.tobytes(), b'CDEFGHIJ')
+            b.fromfile(f);        self.assertEqual(b.tobytes(), b'CDEFGHIJ')
 
         b = bitarray()
         with open(self.tmpfname, 'rb') as f:
-            f.read(1);
+            f.read(1)
             self.assertRaises(EOFError, b.fromfile, f, 10)
 
-        self.assertEqual(b.tostring(), 'BCDEFGHIJ')
+        self.assertEqual(b.tobytes(), b'BCDEFGHIJ')
 
         b = bitarray()
         with open(self.tmpfname, 'rb') as f:
-            b.fromfile(f);
-            self.assertEqual(b.tostring(), 'ABCDEFGHIJ')
+            b.fromfile(f)
+            self.assertEqual(b.tobytes(), b'ABCDEFGHIJ')
             self.assertRaises(EOFError, b.fromfile, f, 1)
 
 
@@ -1986,7 +2034,7 @@
             self.assertEqual(len(s), a.buffer_info()[1])
 
         for n in range(3):
-            a.fromstring(n * 'A')
+            a.frombytes(n * b'A')
             self.assertRaises(TypeError, a.tofile)
             self.assertRaises(TypeError, a.tofile, StringIO())
 
@@ -2288,7 +2336,7 @@
         a[4003] = 0
         self.assertEqual(a[3999:4009], bitarray('0111011110'))
         v[301:304] = b'ABC'
-        self.assertEqual(a[300 *8 : 305 * 8].tobytes(), b'\x00ABC\x00')
+        self.assertEqual(a[300 * 8 : 305 * 8].tobytes(), b'\x00ABC\x00')
 
 if sys.version_info[:2] >= (2, 7):
     tests.append(BufferInterfaceTests)
@@ -2353,7 +2401,7 @@
         self.assertEqual(d[frozenbitarray('01')], 123)
         self.assertEqual(d[frozenbitarray(b)], 345)
 
-    def test_dictkey2(self): # taken sllightly modified from issue #74
+    def test_dictkey2(self):  # taken slightly modified from issue #74
         a1 = frozenbitarray([True, False])
         a2 = frozenbitarray([False, False])
         dct = {a1: "one", a2: "two"}
@@ -2378,8 +2426,9 @@
 
     print('bitarray is installed in: %s' % os.path.dirname(__file__))
     print('bitarray version: %s' % __version__)
-    print('Python version: %s' % sys.version)
-
+    print('sys.version: %s' % sys.version)
+    print('sys.prefix: %s' % sys.prefix)
+    print('pointer size: %d bit' % (8 * _sysinfo()[0]))
     suite = unittest.TestSuite()
     for cls in tests:
         for _ in range(repeat):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/bitarray/test_util.py 
new/bitarray-1.3.0/bitarray/test_util.py
--- old/bitarray-1.2.1/bitarray/test_util.py    2020-01-06 21:09:39.000000000 
+0100
+++ new/bitarray-1.3.0/bitarray/test_util.py    2020-07-06 05:39:41.000000000 
+0200
@@ -11,13 +11,15 @@
 except ImportError:
     pass
 
-from bitarray import bitarray, frozenbitarray, bits2bytes
+from bitarray import bitarray, frozenbitarray, bits2bytes, _set_default_endian
 from bitarray.test_bitarray import Util
 
-from bitarray.util import (zeros, rindex, strip, count_n,
+from bitarray.util import (zeros, make_endian, rindex, strip, count_n,
                            count_and, count_or, count_xor, subset,
                            ba2hex, hex2ba, ba2int, int2ba, huffman_code)
 
+if sys.version_info[0] == 3:
+    unicode = str
 
 tests = []
 
@@ -25,38 +27,85 @@
 
 class TestsZeros(unittest.TestCase):
 
-    def test_init(self):
-        a = zeros(0)
-        self.assertEqual(a, bitarray(''))
-        self.assertEqual(a.endian(), 'big')
-        self.assertRaises(TypeError, zeros, 1.0)
-        for n in range(100):
-            a = zeros(n)
-            self.assertEqual(a, bitarray(n * '0'))
-        self.assertRaises(TypeError, zeros) # no argument
+    def test_1(self):
+        for default_endian in 'big', 'little':
+            _set_default_endian(default_endian)
+            a = zeros(0)
+            self.assertEqual(a, bitarray())
+            self.assertEqual(a.endian(), default_endian)
+
+            b  = zeros(0, endian=None)
+            self.assertEqual(b.endian(), default_endian)
+
+            for n in range(100):
+                a = zeros(n)
+                self.assertEqual(a, bitarray(n * '0'))
+
+            for endian in 'big', 'little':
+                a = zeros(3, endian)
+                self.assertEqual(a, bitarray('000'))
+                self.assertEqual(a.endian(), endian)
 
-        # wrong arguments
+    def test_wrong_args(self):
+        self.assertRaises(TypeError, zeros) # no argument
         self.assertRaises(TypeError, zeros, '')
         self.assertRaises(TypeError, zeros, bitarray())
         self.assertRaises(TypeError, zeros, [])
+        self.assertRaises(TypeError, zeros, 1.0)
         self.assertRaises(ValueError, zeros, -1)
 
         self.assertRaises(TypeError, zeros, 0, 1) # endian not string
         self.assertRaises(ValueError, zeros, 0, 'foo') # endian wrong string
 
-    def test_endian(self):
-        for endian in 'big', 'little':
-            a = zeros(1, endian)
-            self.assertEqual(a, bitarray('0'))
-            self.assertEqual(a.endian(), endian)
-            a = zeros(1, endian=endian)
-            self.assertEqual(a, bitarray('0'))
-            self.assertEqual(a.endian(), endian)
-
 tests.append(TestsZeros)
 
 # ---------------------------------------------------------------------------
 
+class TestsMakeEndian(unittest.TestCase, Util):
+
+    def test_simple(self):
+        a = bitarray('1110001', endian='big')
+        b = make_endian(a, 'big')
+        self.assertTrue(b is a)
+        c = make_endian(a, 'little')
+        self.assertTrue(c == a)
+        self.assertEqual(c.endian(), 'little')
+
+        # wrong arguments
+        self.assertRaises(TypeError, make_endian, '', 'big')
+        self.assertRaises(TypeError, make_endian, bitarray(), 1)
+        self.assertRaises(ValueError, make_endian, bitarray(), 'foo')
+
+    def test_empty(self):
+        a = bitarray(endian='little')
+        b = make_endian(a, 'big')
+        self.assertTrue(b == a)
+        self.assertEqual(len(b), 0)
+        self.assertEqual(b.endian(), 'big')
+
+    def test_from_frozen(self):
+        a = frozenbitarray('1101111', 'big')
+        b = make_endian(a, 'big')
+        self.assertTrue(b is a)
+        c = make_endian(a, 'little')
+        self.assertTrue(c == a)
+        self.assertEqual(c.endian(), 'little')
+
+    def test_random(self):
+        for a in self.randombitarrays():
+            aa = a.copy()
+            for endian in 'big', 'little':
+                b = make_endian(a, endian)
+                self.assertEqual(a, b)
+                self.assertEqual(b.endian(), endian)
+                if a.endian() == endian:
+                    self.assertTrue(b is a)
+            self.assertEQUAL(a, aa)
+
+tests.append(TestsMakeEndian)
+
+# ---------------------------------------------------------------------------
+
 class TestsHelpers(unittest.TestCase, Util):
 
     def test_rindex(self):
@@ -122,13 +171,17 @@
             self.assertEqual(rindex(a), a.index(1))
 
     def test_strip1(self):
+        self.assertRaises(TypeError, strip, '0110')
         self.assertRaises(TypeError, strip, bitarray(), 123)
         self.assertRaises(ValueError, strip, bitarray(), 'up')
-        for endian in 'big', 'little':
-            a = bitarray('00010110000', endian)
-            self.assertEQUAL(strip(a), bitarray('0001011', endian))
-            self.assertEQUAL(strip(a, 'left'), bitarray('10110000', endian))
-            self.assertEQUAL(strip(a, 'both'), bitarray('1011', endian))
+        for default_endian in 'big', 'little':
+            _set_default_endian(default_endian)
+            a = bitarray('00010110000')
+            self.assertEQUAL(strip(a), bitarray('0001011'))
+            self.assertEQUAL(strip(a, 'left'), bitarray('10110000'))
+            self.assertEQUAL(strip(a, 'both'), bitarray('1011'))
+            b = frozenbitarray('00010110000')
+            self.assertEqual(strip(b, 'both'), bitarray('1011'))
 
         for mode in 'left', 'right', 'both':
             self.assertEqual(strip(bitarray('000'), mode), bitarray())
@@ -327,59 +380,79 @@
 class TestsHexlify(unittest.TestCase, Util):
 
     def test_ba2hex(self):
-        self.assertEqual(ba2hex(bitarray(0, 'big')), b'')
-        self.assertEqual(ba2hex(bitarray('1110', 'big')), b'e')
-        self.assertEqual(ba2hex(bitarray('00000001', 'big')), b'01')
-        self.assertEqual(ba2hex(bitarray('10000000', 'big')), b'80')
-        self.assertEqual(ba2hex(frozenbitarray('11000111', 'big')), b'c7')
+        self.assertEqual(ba2hex(bitarray(0, 'big')), '')
+        self.assertEqual(ba2hex(bitarray('1110', 'big')), 'e')
+        self.assertEqual(ba2hex(bitarray('1110', 'little')), '7')
+        self.assertEqual(ba2hex(bitarray('00000001', 'big')), '01')
+        self.assertEqual(ba2hex(bitarray('10000000', 'big')), '80')
+        self.assertEqual(ba2hex(bitarray('00000001', 'little')), '08')
+        self.assertEqual(ba2hex(bitarray('10000000', 'little')), '10')
+        self.assertEqual(ba2hex(frozenbitarray('11000111', 'big')), 'c7')
         # length not multiple of 4
         self.assertRaises(ValueError, ba2hex, bitarray('10'))
-        self.assertRaises(ValueError, ba2hex, bitarray(endian='little'))
         self.assertRaises(TypeError, ba2hex, '101')
 
+        c = ba2hex(bitarray('1101', 'big'))
+        self.assertIsInstance(c, str)
+
         for n in range(7):
             a = bitarray(n * '1111', 'big')
             b = a.copy()
-            self.assertEqual(ba2hex(a), n * b'f')
+            self.assertEqual(ba2hex(a), n * 'f')
             # ensure original object wasn't altered
             self.assertEQUAL(a, b)
 
     def test_hex2ba(self):
+        _set_default_endian('big')
         self.assertEqual(hex2ba(''), bitarray())
-        for c in 'e', 'E', b'e', b'E':
+        for c in 'e', 'E', b'e', b'E', unicode('e'), unicode('E'):
             a = hex2ba(c)
             self.assertEqual(a.to01(), '1110')
             self.assertEqual(a.endian(), 'big')
         self.assertEQUAL(hex2ba('01'), bitarray('00000001', 'big'))
+        self.assertEQUAL(hex2ba('08', 'little'),
+                         bitarray('00000001', 'little'))
         self.assertRaises(Exception, hex2ba, '01a7x89')
         self.assertRaises(TypeError, hex2ba, 0)
 
     def test_explicit(self):
-        for h, bs in [(b'',    ''),
-                      (b'0',   '0000'),
-                      (b'a',   '1010'),
-                      (b'f',   '1111'),
-                      (b'1a',  '00011010'),
-                      (b'2b',  '00101011'),
-                      (b'4c1', '010011000001'),
-                      (b'a7d', '101001111101')]:
-            a = bitarray(bs, 'big')
-            self.assertEQUAL(hex2ba(h), a)
-            self.assertEqual(ba2hex(a), h)
+        data = [ #     little  big                  little  big
+            ('',       '',     ''),
+            ('0000',   '0',    '0'),     ('0001',   '8',    '1'),
+            ('1000',   '1',    '8'),     ('1001',   '9',    '9'),
+            ('0100',   '2',    '4'),     ('0101',   'a',    '5'),
+            ('1100',   '3',    'c'),     ('1101',   'b',    'd'),
+            ('0010',   '4',    '2'),     ('0011',   'c',    '3'),
+            ('1010',   '5',    'a'),     ('1011',   'd',    'b'),
+            ('0110',   '6',    '6'),     ('0111',   'e',    '7'),
+            ('1110',   '7',    'e'),     ('1111',   'f',    'f'),
+            ('10001100',         '13',   '8c'),
+            ('100011001110',     '137',  '8ce'),
+            ('1000110011101111', '137f', '8cef'),
+            ('10100111110111001001', '5eb39', 'a7dc9'),
+        ]
+        for bs, hex_le, hex_be in data:
+            a_be = bitarray(bs, 'big')
+            a_le = bitarray(bs, 'little')
+            self.assertEQUAL(hex2ba(hex_be, 'big'), a_be)
+            self.assertEQUAL(hex2ba(hex_le, 'little'), a_le)
+            self.assertEqual(ba2hex(a_be), hex_be)
+            self.assertEqual(ba2hex(a_le), hex_le)
 
     def test_round_trip(self):
         for i in range(100):
             s = ''.join(choice(hexdigits) for _ in range(randint(0, 1000)))
-            t = ba2hex(hex2ba(s))
-            self.assertEqual(t.decode(), s.lower())
-
-    def test_round_trip2(self):
-        for a in self.randombitarrays():
-            if len(a) % 4 or a.endian() != 'big':
-                self.assertRaises(ValueError, ba2hex, a)
-                continue
-            b = hex2ba(ba2hex(a))
-            self.assertEQUAL(b, a)
+            for default_endian in 'big', 'little':
+                _set_default_endian(default_endian)
+                a = hex2ba(s)
+                ida = id(a)
+                self.assertEqual(len(a) % 4, 0)
+                self.assertEqual(a.endian(), default_endian)
+                t = ba2hex(a)
+                self.assertEqual(t, s.lower())
+                b = hex2ba(t, default_endian)
+                self.assertEQUAL(a, b)
+                self.assertEqual(id(a), ida)
 
 tests.append(TestsHexlify)
 
@@ -395,7 +468,7 @@
         self.assertEqual(ba2int(frozenbitarray('11')), 3)
         self.assertRaises(ValueError, ba2int, bitarray())
         self.assertRaises(ValueError, ba2int, frozenbitarray())
-        self.assertRaises(TypeError, ba2hex, '101')
+        self.assertRaises(TypeError, ba2int, '101')
         a = bitarray('111')
         b = a.copy()
         self.assertEqual(ba2int(a), 7)
@@ -406,7 +479,7 @@
         self.assertEqual(int2ba(0), bitarray('0'))
         self.assertEqual(int2ba(1), bitarray('1'))
         self.assertEqual(int2ba(5), bitarray('101'))
-        self.assertEQUAL(int2ba(6), bitarray('110', 'big'))
+        self.assertEQUAL(int2ba(6, endian='big'), bitarray('110', 'big'))
         self.assertEQUAL(int2ba(6, endian='little'),
                          bitarray('011', 'little'))
         self.assertRaises(ValueError, int2ba, -1)
@@ -419,7 +492,8 @@
     def test_int2ba_length(self):
         self.assertRaises(TypeError, int2ba, 0, 1.0)
         self.assertRaises(ValueError, int2ba, 0, 0)
-        self.assertEqual(int2ba(5, length=6), bitarray('000101'))
+        self.assertEqual(int2ba(5, length=6, endian='big'),
+                         bitarray('000101'))
         self.assertRaises(OverflowError, int2ba, 3, 1)
         for n in range(1, 100):
             ab = int2ba(1, n, 'big')
@@ -445,6 +519,7 @@
                              bitarray(n * '1'))
 
     def test_explicit(self):
+        _set_default_endian('big')
         for i, sa in [( 0,     '0'),    (1,         '1'),
                       ( 2,    '10'),    (3,        '11'),
                       (25, '11001'),  (265, '100001001'),
@@ -452,6 +527,7 @@
             ab = bitarray(sa, 'big')
             al = bitarray(sa[::-1], 'little')
             self.assertEQUAL(int2ba(i), ab)
+            self.assertEQUAL(int2ba(i, endian='big'), ab)
             self.assertEQUAL(int2ba(i, endian='little'), al)
             self.assertEqual(ba2int(ab), ba2int(al), i)
             if i == 0 or i >= 512:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/bitarray/util.py 
new/bitarray-1.3.0/bitarray/util.py
--- old/bitarray-1.2.1/bitarray/util.py 2020-01-06 21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/bitarray/util.py 2020-07-06 05:39:41.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (c) 2019, Ilan Schnell
+# Copyright (c) 2019 - 2020, Ilan Schnell
 # bitarray is published under the PSF license.
 #
 # Author: Ilan Schnell
@@ -9,14 +9,14 @@
 import heapq
 import binascii
 
-from bitarray import bitarray, frozenbitarray, bits2bytes, _bitarray
+from bitarray import bitarray, bits2bytes, _bitarray, get_default_endian
 
 from bitarray._util import (count_n, rindex,
                             count_and, count_or, count_xor, subset,
                             _set_babt)
 
 
-__all__ = ['zeros', 'rindex', 'strip', 'count_n',
+__all__ = ['zeros', 'make_endian', 'rindex', 'strip', 'count_n',
            'count_and', 'count_or', 'count_xor', 'subset',
            'ba2hex', 'hex2ba', 'ba2int', 'int2ba', 'huffman_code']
 
@@ -28,26 +28,56 @@
 _is_py2 = bool(sys.version_info[0] == 2)
 
 
-def zeros(length, endian='big'):
-    """zeros(length, /, endian='big') -> bitarray
+def zeros(length, endian=None):
+    """zeros(length, /, endian=None) -> bitarray
 
-Create a bitarray of length, with all values 0.
+Create a bitarray of length, with all values 0, and optional
+endianness, which may be 'big', 'lillte'.
 """
     if not isinstance(length, (int, long) if _is_py2 else int):
         raise TypeError("integer expected")
 
-    a = bitarray(length, endian)
+    a = bitarray(length, endian or get_default_endian())
     a.setall(0)
     return a
 
 
+def make_endian(a, endian):
+    """make_endian(bitarray, endian, /) -> bitarray
+
+When the endianness of the given bitarray is different from `endian`,
+return a new bitarray, with endianness `endian` and the same elements
+as the original bitarray, i.e. even though the binary representation of the
+new bitarray will be different, the returned bitarray will equal the original
+one.
+Otherwise (endianness is already `endian`) the original bitarray is returned
+unchanged.
+"""
+    if not isinstance(a, _bitarray):
+        raise TypeError("bitarray expected")
+
+    if a.endian() == endian:
+        return a
+
+    b = bitarray(a, endian)
+    la = a.length()
+    if la == 0:
+        return b
+
+    b.bytereverse()
+    if la % 8:
+        p = 8 * (bits2bytes(la) - 1)
+        b[p:] = a[p:]
+    return b
+
+
 def strip(a, mode='right'):
     """strip(bitarray, mode='right', /) -> bitarray
 
 Strip zeros from left, right or both ends.
 Allowed values for mode are the strings: `left`, `right`, `both`
 """
-    if not isinstance(a, (bitarray, frozenbitarray)):
+    if not isinstance(a, _bitarray):
         raise TypeError("bitarray expected")
     if not isinstance(mode, str):
         raise TypeError("string expected for mode")
@@ -71,46 +101,59 @@
     return a[first:last + 1]
 
 
+# translate table which swaps the 4 highest with the 4 lowest bits"
+_swap_hilo_list = [16 * (i % 16) + (i // 16) for i in range(256)]
+if _is_py2:
+    _swap_hilo_bytes = b''.join(chr(i) for i in _swap_hilo_list)
+else:
+    _swap_hilo_bytes = bytes(_swap_hilo_list)
+
+
 def ba2hex(a):
     """ba2hex(bitarray, /) -> hexstr
 
-Return a bytes object containing with hexadecimal representation of
+Return a string containing with hexadecimal representation of
 the bitarray (which has to be multiple of 4 in length).
 """
-    if not isinstance(a, (bitarray, frozenbitarray)):
+    if not isinstance(a, _bitarray):
         raise TypeError("bitarray expected")
-    if a.endian() != 'big':
-        raise ValueError("big-endian bitarray expected")
+
     la = a.length()
     if la % 4:
         raise ValueError("bitarray length not multiple of 4")
     if la % 8:
         # make sure we don't mutate the original argument
-        a = a + bitarray(4, 'big')
-    assert a.length() % 8 == 0
+        a = a + bitarray(4, a.endian())
 
-    s = binascii.hexlify(a.tobytes())
+    b = a.tobytes()
+    if a.endian() == 'little':
+        b = b.translate(_swap_hilo_bytes)
+
+    s = binascii.hexlify(b)
     if la % 8:
         s = s[:-1]
-    return s
+    return s if _is_py2 else s.decode()
 
 
-def hex2ba(s):
-    """hex2ba(hexstr, /) -> bitarray
+def hex2ba(s, endian=None):
+    """hex2ba(hexstr, /, endian=None) -> bitarray
 
 Bitarray of hexadecimal representation.
 hexstr may contain any number of hex digits (upper or lower case).
 """
-    if not isinstance(s, (str, bytes)):
-        raise TypeError("string expected")
+    if not isinstance(s, (str, unicode if _is_py2 else bytes)):
+        raise TypeError("string expected, got: %r" % s)
 
     ls = len(s)
     if ls % 2:
         s = s + ('0' if isinstance(s, str) else b'0')
-    assert len(s) % 2 == 0
 
-    a = bitarray(endian='big')
-    a.frombytes(binascii.unhexlify(s))
+    a = bitarray(0, endian or get_default_endian())
+    b = binascii.unhexlify(s)
+    if a.endian() == 'little':
+        b = b.translate(_swap_hilo_bytes)
+    a.frombytes(b)
+
     if ls % 2:
         del a[-4:]
     return a
@@ -122,7 +165,7 @@
 Convert the given bitarray into an integer.
 The bit-endianness of the bitarray is respected.
 """
-    if not isinstance(a, (bitarray, frozenbitarray)):
+    if not isinstance(a, _bitarray):
         raise TypeError("bitarray expected")
     if not a:
         raise ValueError("non-empty bitarray expected")
@@ -150,8 +193,8 @@
         return int.from_bytes(b, byteorder=endian)
 
 
-def int2ba(i, length=None, endian='big'):
-    """int2ba(int, /, length=None, endian='big') -> bitarray
+def int2ba(i, length=None, endian=None):
+    """int2ba(int, /, length=None, endian=None) -> bitarray
 
 Convert the given integer into a bitarray (with given endianness,
 and no leading (big-endian) / trailing (little-endian) zeros).
@@ -168,6 +211,8 @@
             raise TypeError("integer expected for length")
         if length <= 0:
             raise ValueError("integer larger than 0 expected for length")
+    if endian is None:
+        endian = get_default_endian()
     if not isinstance(endian, str):
         raise TypeError("string expected for endian")
     if endian not in ('big', 'little'):
@@ -175,7 +220,7 @@
 
     if i == 0:
         # there a special cases for 0 which we'd rather not deal with below
-        return zeros(length or 1, endian=endian)
+        return zeros(length or 1, endian)
 
     big_endian = bool(endian == 'big')
     if _is_py2:
@@ -189,7 +234,7 @@
     else: # py3
         b = i.to_bytes(bits2bytes(i.bit_length()), byteorder=endian)
 
-    a = bitarray(endian=endian)
+    a = bitarray(0, endian)
     a.frombytes(b)
     la = a.length()
     if la == length:
@@ -215,8 +260,8 @@
     return a
 
 
-def huffman_code(freq_map, endian='big'):
-    """huffman_code(dict, /, endian='big') -> dict
+def huffman_code(freq_map, endian=None):
+    """huffman_code(dict, /, endian=None) -> dict
 
 Given a frequency map, a dictionary mapping symbols to thier frequency,
 calculate the Huffman code, i.e. a dict mapping those symbols to
@@ -263,7 +308,7 @@
 
     result = {}
 
-    def traverse(nd, prefix=bitarray(endian=endian)):
+    def traverse(nd, prefix=bitarray(0, endian or get_default_endian())):
         if hasattr(nd, 'symbol'):  # leaf
             result[nd.symbol] = prefix
         else:  # parent, so traverse each of the children
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/examples/huffman/huffman.py 
new/bitarray-1.3.0/examples/huffman/huffman.py
--- old/bitarray-1.2.1/examples/huffman/huffman.py      2020-01-06 
21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/examples/huffman/huffman.py      2020-07-06 
05:39:41.000000000 +0200
@@ -3,8 +3,8 @@
 and codes.
 
 Note:
-    There is function for directly creating a Huffman code from a frequency
-    map: bitarray.util.huffman_code()
+There is a function for directly creating a Huffman code from a frequency
+map: bitarray.util.huffman_code()
 """
 from __future__ import print_function
 from heapq import heappush, heappop
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/setup.py new/bitarray-1.3.0/setup.py
--- old/bitarray-1.2.1/setup.py 2020-01-06 21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/setup.py 2020-07-06 05:39:41.000000000 +0200
@@ -31,8 +31,6 @@
         "Programming Language :: Python :: 2.6",
         "Programming Language :: Python :: 2.7",
         "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.3",
-        "Programming Language :: Python :: 3.4",
         "Programming Language :: Python :: 3.5",
         "Programming Language :: Python :: 3.6",
         "Programming Language :: Python :: 3.7",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bitarray-1.2.1/update_readme.py 
new/bitarray-1.3.0/update_readme.py
--- old/bitarray-1.2.1/update_readme.py 2020-01-06 21:09:39.000000000 +0100
+++ new/bitarray-1.3.0/update_readme.py 2020-07-06 05:39:41.000000000 +0200
@@ -72,8 +72,8 @@
     fo.write("Functions defined in the module:\n"
              "--------------------------------\n\n")
     write_doc('test')
-    write_doc('bitdiff')
     write_doc('bits2bytes')
+    write_doc('get_default_endian')
 
     fo.write("Functions defined in bitarray.util:\n"
              "-----------------------------------\n\n")


Reply via email to