Change Log

eGenix mx Base Distribution Change Log

The change log includes a detailed description of all changes to this package in the recent releases.
Version: 3.2.9

Note that this change log usually only lists changes to the distribution, not all the changes of the included subpackages. Please refer to the sub-package documentation for more detailed information.

Changes from 3.2.8 to 3.2.9

Fixes for all Python Builds

  • Fixed the DateTime value range to only cover dates which can be represented as broken down values. On 32-bit systems, the valid range now is from -5879608-01-01 to 5879609-12-31, on 64-bit systems from -25252734927766552-01-01 to 25252734927766553-12-31.Should be enough for most needs :-)
  • Fixed the DateTimeDelta value range to only cover deltas which can be represented as broken down values. On 32-bit systems, the valid range now is from -2147483647:00:00:00.00 to 2147483647:00:00:00.00, on 64-bit systems from -104249991374:07:36:32.00 to 104249991374:07:36:32.00.
  • Fixed a segfault on Windows when using .strftime() on a DateTime object with leap seconds. mxDateTime will now raise a ValueError instead, since the Windows C runtime strftime() doesn't handle leap seconds and segfaults.
  • Fixed a segfault on Windows when using .strftime() with an unsupported formatting code (e.g. %f). mxDateTime will now raise a ValueError instead, since the Windows C runtime strftime() doesn't like unsupported formatting codes or lone % at the end of the format string and causes a segfault. Thanks to Barry B for reporting this.

Fixes for Python Debug Builds

  • In this patch level release, we have significantly improved the compatibility of eGenix mx Base with Python debug builds, which we previously did not support. Regular Python builds are usually not affected.
  • Fixed crashes of several mx Base packages when using Python debug builds, which were due to the use of free lists. Free lists are disabled for Python debug builds now.
  • Several mx Base packages crashed during interpreter shutdown when using Python debug builds.
  • mxBeeBase: Fixed a memory allocation error when using Python debug builds.
  • mxDateTime crashed when using Python debug builds due to the use of free lists and a non-standard way of dealing with errors inside object constructors, bypassing the logic used by debug builds to trace object allocation. Thanks to Edson Tadeu M. Manoel for bringing this to our attention.
  • mxTools: Fix a segfault in napply() when using Python debug builds.

Installation Enhancements and Fixes (via included mxSetup)

Most of these enhancements and fixes are part of the Python web installer support we added to mxSetup a while ago. If you want to learn more about this web installer technology, please see this talk on the topic.
  • Fixed traceback when building pure Python packages with mxSetup's bdist_prebuilt.
  • mxSetup's web installer now searches for "purepython" and "anyos" tags as fallback when looking for OS dependent packages. It also adds the "anyos" tag to all pure Python packages.
  • Refactored the web installer in mxSetup into a class for easier customization.
  • Added --unicode-aware parameter support to bdist_egg when used with setuptools.
  • mxSetup now always produces PEP 440 compatible version numbers (using mx_version()).
  • Prebuilt archives created on Linux2 will now load fine on Linux3 machines. Same for FreeBSD and other systems which retain backwards compatibility.
  • Prebuilt archives will now also be usable on compatible platforms, e.g. ones compiled on linux2 with linux3 systems and ones for freebsd8 with freebsd9 or freebsd10.
  • Fixed a bug in mxSetup which caused .pyc/.pyo not to get removed when using 'pip uninstall'.
  • Resolved an intermittent error related to hash seeds which sometimes caused prebuilt archives to not install correctly. Thanks to Albert-Jan Roskam for reporting this.
  • Added Raspberry Pi Ver. 2 support to mxSetup.
  • Added support for bdist_wheels to allow building wheels from source or from prebuilt packages using mxSetup.
  • Removed a spurious AttributeError warning showing up when installing egenix-mx-base prebuilt packages on Windows systems without C compiler. 

Changes from 3.2.7 to 3.2.8

Installation Enhancements:

  • Added web installer support to mxSetup, the distutils extension module which drives all our product installations.
  • Uploaded web installer package to PyPI which simplifies installation.

    In addition to the usual ways of installing eGenix mx Base, we have uploaded a web installer to PyPI, so that it is now also possible to use one of these installation methods on all supported platforms (Windows, Linux, FreeBSD, Mac OS X):
    • easy_install egenix-mx-base via PyPI
    • pip install egenix-mx-base via PyPI
    • egenix-mx-base egg reference in zc.buildout via PyPI
    • running "python install" in the unzipped web installer archive directory

    The web installer will automatically detect the platform and choose the right binary download package for you. All downloads are verified before installation.


  • mxDateTime: Protected delta.strftime() against segfaults on Windows, which only allows day values <= 31 and segfaults for higher values. Thanks to Frank Boje for reporting this problem.
  • mxTextTools: Fixed a double decref in the tagging engine that surfaced when using custom tag objects and appending the results to them. Thanks to Richard Moseley for the report.

Compatibility Enhancements

  • Prepared eGenix mx Base for two digit Python patch level numbers such as Python 2.7.10

Changes from 3.2.6 to 3.2.7


  • mxBeeBase: Fixed a problem with using larger BeeDict keysizes on 64-bit platforms. These now work for keysizes between 25 and 659 characters as well. Also extended the possible keysizes for 32-bit platform to 670 characters. Thanks to Andrey Rzhetsky for pointing us to the problem.
  • mx.Misc.FileLock: Fixed a typo in a FileLock class name.

Changes from 3.2.5 to 3.2.6


  • mxURL: Added a work-around to resolve a segfault when exiting the Python 2.7.4 interpreter. This is a Python bug which was introduced in Python 2.7.4 and will get fixed again in Python 2.7.5 - see

Documentation Enhancements

  • mxURL: Added sections on URL join operations and interaction with strings to mxURL documentation.
  • mxDateTime: Added notice to documentation that .gmtoffset() can give wrong results during DST switching time. 

Compatibility Enhancements

  • Filled the tp_methods slot of all extension types to improve Python 2.7 compatibility.

Distribution Enhancements

  • Added download URL registered with PyPI is now a static page and includes an MD5 hash tag to allow verification of the page.
  • All distribution files are GPG signed with our release key. We also provide MD5 and SHA1 hash values for all files to easily verify the downloads.

Changes from 3.2.4 to 3.2.5

  • Fixed a compatibility problem with Python 2.7.3 on Mac OS X 10.6 and later: Removed mx_customize_compiler() in favor of the standard distutils customize_compiler(). It now installs fine again with pip on more recent Mac OS X versions. Thanks to Leonardo Santagada for bringing this problem to our attention.
  • mxDateTime: Fixed a possible segfault in mxDateTime that was caused by the lazy datetime module import mechanism not catching all cases where the C API was used in mxDateTime. Thanks to Joel Rosdahl for bringing this to our attention.
  • Fixed a bug in the mx.Misc.CSV.Reader.objects() method, which triggered a TypeError.

Changes from 3.2.3 to 3.2.4

  • Fixed a compatibility problem with Python 2.7's distutils that was introduced in Python 2.7.3
  • mxDateTime: Fixed a possible double deallocation in the mxDateTime C API import helper. Thanks to Daniele Varrazzo for reporting this.

Changes from 3.2.2 to 3.2.3

  • mxDateTime: Fixed a possible segfault when using the .pydate(), .pydatetime() and .pytime() methods. Thanks to Daniel Szoska for reporting this.

Changes from 3.2.1 to 3.2.2

  • mxDateTime seconds rounding is now more careful to not show 60.00 or 61.00 as second value.
  • mxDateTime will now correctly work with numeric arrays (numpy) again. Thanks to Christian Marquardt for reporting the problem.
  • mxDateTime's DateTimeFromAbsDateTime() now accepts leap second values (86400.0 - <86401.0) as well. Thanks to Christian Marquardt for reporting the problem.
  • mxDateTime range errors did not always format the wrong value.
  • Made mxDateTime compile again on Python 2.1 and 2.2.
  • Added parameter to allow None values on most mx.Misc.ConfigFile Entry() fields.
  • mx.Misc.ConfigFile provides a new method .read_defaults() to set all values to defaults.
  • Fixed mx.Misc.ConfigFile.SafeEvalEntry() to actually work.

Changes from 3.2.0 to 3.2.1

  • Fixed a segfault in mxDateTime.
  • Fixed a possible buffer overflow in the mxDebugPrintf() function of all mx Base extensions.
  • Fixed a problem in mxSetup mx_autoconf: Python.h was not found by some tests

Changes from 3.1.3 to 3.2.0

  • Added support for Python 2.7.
  • Added native Window x64 support.
  • Included many news features in mxDateTime.
  • Fixed a few typos in the code and made the use of mxTools builtins explicit in the subpackages.
  • Added new mx.Misc.Daemon module which provides abstractions to implement Unix daemon processes.
  • Replaced all uses of string module functions with string methods... this was long overdue and should result in a small speedup across all packages.
  • eGenix mx Base Extensions now use PyObject_MALLOC() for memory allocation which should make memory allocation a little faster in a few places.
  • Documentation files are no longer duplicated in mx/Doc/. They now only appear in the resp. Doc/ subdir of the packages.
  • Prebuilt archives now also work with snapshots that use the date in the version.
  • mxSetup now cooperates with easy_install (again) and disables its own bdist_egg implementation if setuptools is found to be loaded. Thanks to Tim Cook for reporting the problem.
  • Dropped support for Python 2.3.
  • Added pip support to egenix-mx-base.
  • Added support for detecting version and platform mismatches in prebuilt archives.
  • Starting with Python 2.5, we no longer support bdist_rpm in mxSetup.
  • Starting with Python 2.6, we no longer support bdist_wininst in mxSetup.
  • mxLog no longer unfolds Unicode strings when logging stacks or tracebacks.

Changes from 3.1.2 to 3.1.3

  • Fixed a problem with mxBeeBase on BSD-based platforms such as FreeBSD and Mac OS X: file system synchronization problems between read and writes could cause data corruption. Thanks to Ernesto Picardi for bringing this to our attention.
  • Updated mxSetup to our latest version with platform mismatch detection for prebuilt archives.

Changes from 3.1.1 to 3.1.2

  • Changed the way pre-built state is restored during installation to handle situations where the distutils platform string is different between the build platform and the installation platform (e.g. for Mac OS X fat builds).

Changes from 3.1.0 to 3.1.1

  • Fixed a problem with the pre-built packages not installing on Mac OS X and older Linux distributions.
  • Verified and tested all packages with Python 2.6.

Changes from 3.0.0 to 3.1.0

  • mxSetup bdist_wininst will now always include the Python version number if you build pure Python distributions that don't include the Python source
  • mxSetup clean command will now also remove the build pickle used for e.g. bdist_prebuilt.
  • mxSetup bdist_prebuilt will now create platform independent archives for packages that don't include any C extensions.
  • mxSetup prebuilt archives no longer need to use "... build --skip ..." to skip the build process. The build command is now smart enough to detect, check and automatically use a build pickle and the prebuilt format.
  • Added setuptools support, ie. mxSetup can run with an installed setuptools to e.g. create eggs. Running python --use-setuptools bdist_egg will create an .egg file in the dist/ directory. If you want to convert a prebuilt archive to an egg, run the command with bdist_egg --skip-build.
  • Fixed a problem in mxSetup that caused the uninstall command not to work with prebuilt packages. Thanks to Wouter van Atteveldt for pointing out the problem.
  • Added new mx.Misc.CSV module for reading and writing CSV files.

Changes from 2.0.5 to 3.0.0

  • Fixed the distutils setup to now allow defining compiler options on the command line using 'python mx_autoconf -DENABLE_FEATURE install'.
  • Lots of changes in the various sub-packages. See the sub-package documentation for a full list of new features.
  • Added source code encoding markers to those files that need it.
  • Moved mxURL and mxUID from the Experimental Distribution to the Base Distribution.
  • Added better support for Python DEBUG builds. The total reference counting should now also work in case object constructors raise exceptions.
  • Added Python 2.4 and 2.5 support.

Changes from 2.0.4 to 2.0.5

  • Added Python 2.3 support.

Changes from 2.0.3 to 2.0.4

  • RPMs now install to /usr/ instead of /usr/local/. This change was necessary to resynch to the standard Python RPMs.
  • The mx distutils build system was updated to the latest version.

Changes from 2.0.2 to 2.0.3

  • Some cleanup of assignments to __debug__ which cause warnings in Python 2.1.
  • Added some missing header files. These are needed by third party tools in case they rely on the provided C interfaces.
  • Changed the error class object fullnames to properly include the complete package path.
  • Corrected a bug in the free list management of the various types which showed up when using pymalloc.
  • Prepared the tools for Python 2.2.

Changes from 2.0.1 to 2.0.2

  • Added compiler support for Cygwin. Thanks to Mark Hadfield for pointing out the necessary changes.
  • Reworked the RPM packaging for different Python versions: you can now install the RPMs for different Python versions side-by-side.
  • Updated a few packages, e.g. the mxDateTime package.

Changes from 2.0.0 to 2.0.1

  • Added back .h header files to the mx-subdirectories. Third-party software was relying on these files, but the distutils process did not include them per default.
  • New release for Python 2.1.