Performance Improvements
* The `spotfire.sbdf` module has been rewritten as a native C extension using [Cython](https://cython.org), which allows using the [C Library for TIBCO Spotfire Binary Data Format](https://github.com/TIBCOSoftware/spotfire-sbdf-c) (vendored into the `vendor/sbdf-c` directory) instead of the original pure-Python implementation. This change improves performance and allows the reading and writing of SBDF files that are written using RLE encoding (which was not implemented for the pure-Python implementation). (#36)
* With the introduction of Cython support in `setup.py`, the `spotfire.codesign` module has been rewritten using Cython.
* To work around the deprecation of `msilib` in Python 3.11, the `spotfire.cabfile` module has been rewritten using Cython to directly call the Windows API to create cabinet files. Non-Windows platforms will raise `OSError` exceptions on object creation instead of the current behavior of conditionally defining the class. (29)
As a result of these architectural changes, the version number of this package has been incremented to 2.0.0.
Creating SPK Packages
* [User installed](https://pip.pypa.io/en/latest/user_guide/#user-installs) packages (installed with `pip install --user`) could override the `spotfire` package that is deployed via the Spotfire server, potentially installing an older version that does not contain support for required features. Now, when you build an interpreter SPK package (using `python -m spotfire.spk python ...`), the `spotfire` package is installed into a separate directory, which is then automatically inserted into the Python `sys.path`, before any "site-packages" directory, on interpreter startup. (39)
* When you build a packages SPK package (using the command `python -m spotfire.spk packages ...`), wheels with data directories (such as `xgboost` 1.7.5 on Windows) no longer result in SPK packages missing Python files from the wheel. (40)