# TDMtermite
_TDMtermite_ is a C++ based library that decodes the proprietary
file format _TDM/TDX_ for measurement data. First introduced by
[National Instruments](https://www.ni.com), the TDM format relies on the
_technical data management_ data model and is employed by
[LabVIEW](https://www.ni.com/de-de/shop/labview.html), LabWindows™/CVI™,
Measurement Studio, SignalExpress, and [DIAdem](https://www.ni.com/de-de/shop/data-acquisition-and-control/application-software-for-data-acquisition-and-control-category/what-is-diadem.html).
The [Record Evolution Platform](https://www.record-evolution.de/en/home-en/) uses TDMtermite to integrate measurement data into ETL processes. The TDMtermite library is available both as a command line tool and as a Python module. The Python module of TDMtermite enables data scientists to conveniently include TDM formats in their existing data pipelines by providing access to both raw data and metadata in terms of native Python objects.
## Overview
* [TDM file format](#Dataformat)
* [Build and Installation](#Installation)
* [Usage and Examples](#Usage)
* [References](#References)
## Dataformat
Datasets encoded in the TDM/TDX format come in pairs comprised of a
.tdm (header) file and a .tdx (data) file. While the .tdm file is a human-readable
file providing meta information about the dataset, the .tdx file is a binary file
containing the actual data. The .tdm based on the _technical data management_
model is an XML file. It describes what data the .tdx file contains and how
to read it. The
[TDM data model](https://www.ni.com/de-de/support/documentation/supplemental/10/ni-tdm-data-model.html)
structures the data hierarchically with respect to _file_, _(channel)_ _groups_ and
_channels_. The file-level XML may contain any number of (channel) groups, each
of which is made up of an arbitrary number of channels. Thus, the XML tree in
the [TDM header file](https://zone.ni.com/reference/de-XX/help/370858P-0113/tdmdatamodel/tdmdatamodel/tdm_headerfile/)
looks like this:
```xml
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<usi:tdm xmlns:usi="http://www.ni.com/Schemas/USI/1_0" version="1.0">
<usi:documentation>
<usi:exporter>National Instruments USI</usi:exporter>
<usi:exporterVersion>1.5</usi:exporterVersion>
</usi:documentation>
<usi:model modelName="National Instruments USI generated meta file" modelVersion="1.0">
<usi:include nsUri="http://www.ni.com/DataModels/USI/TDM/1_0"/>
</usi:model>
<usi:include>
<file byteOrder="littleEndian" url="example.tdx">
...
<block byteOffset="0" id="inc0" length="1000" valueType="eFloat64Usi"/>
...
<block_bm id="inc4" blockOffset="100" blockSize="7" byteOffset="0" length="4" valueType="eInt8Usi"/>
...
</usi:include>
<usi:data>
...
</usi:data>
</usi:tdm>
```
The XML tree is comprised of _four_ main XML elements: `usi:documentation`, `usi:model`,
`usi:include` and `usi:data`. The element `usi:include` references the data file
`example.tdx` and reveals one of _two_ possible orderings of the mass data (.tdx):
1. either _channel-wise_ (`<block>`) - all values of a specific channel follow subsequently
1. or _block-wise_ (`<block_bm>`) - all values of a specific measurement time follow subsequently.
The supported _numerical data types_ are:
| datatype | channel datatype | numeric | value sequence | size | description |
|-------------|------------------|---------|-----------------|-------|-------------------------|
| eInt16Usi | DT_SHORT | 2 | short_sequence | 2byte | signed 16 bit integer |
| eInt32Usi | DT_LONG | 6 | long_sequence | 4byte | signed 32 bit integer |
| eUInt8Usi | DT_BYTE | 5 | byte_sequence | 1byte | unsigned 8 bit integer |
| eUInt16Usi | DT_SHORT | 2 | short_sequence | 2byte | unsigned 16 bit integer |
| eUInt32Usi | DT_LONG | 6 | long_sequence | 4byte | unsigned 32 bit integer |
| eFloat32Usi | DT_FLOAT | 3 | float_sequence | 4byte | 32 bit float |
| eFloat64Usi | DT_DOUBLE | 7 | double_sequence | 8byte | 64 Bit double |
| eStringUsi | DT_STRING | 1 | string_sequence | | text |
The XML element `<usi:data>` is comprised of _five_ different types of
elements that are `<tdm_root>`, `<tdm_channelgroup>`, `<tdm_channel>`, `<localcolumn>`
and `<submatrix>`. The root element `<tdm_root>` describes the general properties
of the dataset and lists the _ids_ of all channel groups that belong to
the dataset. The element `<tdm_channelgroup>` divides the _channels_ into groups
and has a unique _id_ that is referenced by its root element. The `<channels>`
element in `<tdm_channelgroup>` lists the unique ids of all channels that belong
to that group. Finally, the element `<tdm_channel>` describes a single column of
actual data including its datatype. The remaining element types are
`<localcolumn>`
```xml
<localcolumn id="usiXY">
<name>Untitled</name>
<measurement_quantity>#xpointer(id("usiAB"))</measurement_quantity>
<submatrix>#xpointer(id("usiMN"))</submatrix>
<global_flag>15</global_flag>
<independent>0</independent>
<sequence_representation> ... </sequence_representation>
<values>#xpointer(id("usiZ"))</values>
</localcolumn>
```
with a unique id, the `<measurement_quantity>` referring to one specific channel,
the `<submatrix>` and its id respectively, the type of representation in
`<sequence_representation>` - being one of _explicit_, _implicit linear_ or
_rawlinear_ - and the `<values>` element, which refers to one _value sequence_,
and the element `<submatrix>`
```xml
<submatrix id="usiXX">
<name>Untitled</name>
<measurement>#xpointer(id("usiUV"))</measurement>
<number_of_rows>N</number_of_rows>
<local_columns>#xpointer(id("usiMN"))</local_columns>
</submatrix>
```
that references the channel group in `<measurement>` to which it belongs and provides
the _number of rows_ in the channels listed in `<local_columns>`.
## Installation
The library can be used both as a _CLI_-based tool and as a _Python_ module.
### CLI tool
To install the CLI tool _TDMtermite_, do
```Shell
make install
```
which uses `/usr/local/bin` as an installation directory. On _macOSX_, please first
build the binary locally with `make` and install it in your preferred location.
### Python
In order to build a _Python module_ from the _C++_ code base, the
[Cython](https://cython.readthedocs.io/en/latest/index.html) package must be
available. It may be installed via `python3 -m pip install cython` .
The [Numpy](https://numpy.org) package is recommended
to pass arrays of data from the C++ kernel to Python. The _makefile_ provides
the target `make cython-requirements` to install all required Python modules.
Finally, to build the Python extension _tdm_termite_ locally or install
it, the targets `make cython-build` and `make cython-install` are provided.
To install the Python module on the system, simply do
```Shell
make cython-requirements
make cython-install
```
which makes the module available for import by `import tdm_termite` .
#### Installation with pip
The package is also available via the [Python Package Index](https://pypi.org) at
[TDMtermite](https://pypi.org/project/TDMtermite/). To install the latest version simply do
```Shell
python3 -m pip install TDMtermite
```
##### Unix
Note, that _python3_setuptools_ and _gcc version >= 10.2.0_ are required to
successfully install and use it.
## Usage
### CLI tool
The usage of the CLI tool is sufficiently clarified by its help message displayed
by `tdmtermite --help`. To extract the data decoded in the pair of
files `samples/SineData.tdm` and `samples/SineData.tdx` into the directory
`/home/jack/data/`:
```Shell
tdmtermite samples/SineData.tdm samples/SineData.tdx --output /home/jack/data
```
The tool can also be used to list the available objects in the TDM dataset, which
are i.a. _channels_, _channelgroups_ and TDX _blocks_. To list
all channels and channelgroups (without writing any file output):
```Shell
tdmtermite samples/SineData.tdm samples/SineData.tdx --listgroups --listchannels
```
The user may also submit a _filenaming rule_ to control the names of the files the
channel(group)s are written to. To this end, the _magic flags_ `%G` `%g`, `%C`
and `%c` representing the group id, group name, channel index and channel name
are defined. The default filenaming option is:
```Shell
tdmtermite samples/SineData.tdm samples/SineData.tdx --output /home/jack/data --filenames channelgroup_%G.csv
```
This makes the tool write _all channels_ grouped into files according to their
group association, while all channelgroup filenames obey the pattern `channelgroup_%G.csv`,
with `%G` being replaced by the group id. The filenaming rule also enables the user
to extract only a single channel(group) by providing a particular channel(group)
id in the filenaming flag. For example,
```Shell
tdmtermite samples/SineData.tdm samples/SineData.tdx --output /home/jack/data -f channel_usi16_%c.csv --includemeta
```
This will write the single channel with the id `usi16` to the file
`/home/jack/data/channel_usi16_A4.csv`, including its meta-data as a file header.
### Python
To be able to use the Python module _tdm_termite_, it first has to be built locally
or installed on the system. In the Python interpreter, simply do:
```Python
import TDMtermite
```
This will import the module. The TDM files are provided by creating an instance of
the _tdmtermite_ class:
```Python
# create 'tdmtermite' instance object
try :
jack = TDMtermite.tdmtermite(b'samples/SineData.tdm',b'samples/SineData.tdx')
except RuntimeError as e:
print("failed to load/decode TDM files: " + str(e))
```
After initializing the _tdmtermite_ object, it can be used to extract any of the
available data. For instance, to list the included channelgroups and channels:
```Python
# list ids of channelgroups
grpids = jack.get_channelgroup_ids()
# list ids of channels
chnids = jack.get_channel_ids()
```
As a use case, we have a look at listing the ids of all channelgroups and printing
their data to separate files:
```Python
import TDMtermite
import re
# create 'tdmtermite' instance object
try :
jack = TDMtermite.tdmtermite(b'samples/SineData.tdm',b'samples/SineData.tdx')
except RuntimeError as e :
print("failed to load/decode TDM files: " + str(e))
# list ids of channelgroups
grpids = jack.get_channelgroup_ids()
grpids = [x.decode() for x in grpids]
print("list of channelgroups: ",grpids)
for grp in grpids :
# obtain meta data of channelgroups
grpinfo = jack.get_channelgroup_info(grp.encode())
print( json.dumps(grpinfo,sort_keys=False,indent=4) )
# write this channelgroup to file
try :
grpname = re.sub('[^A-Za-z0-9]','',grpinfo['name'])
grpfile = "channelgroup_" + str(grp) + "_" + str(grpname) + ".csv"
jack.print_channelgroup(grp.encode(), # id of group to be printed
grpfile.encode(), # filename
True, # include metadata as fileheader
ord(' ') # delimiter char
)
except RuntimeError as e :
print("failed to print channelgroup: " + str(grp) + " : " + str(e))
```
For details, see this [extensive example](python/usage.py)
and the absolute minimal example [minimal usage](python/minimal.py). In order
to simply extract all data of the TDM datatset and dump it to files in a given
(existing!) directory, do
```Python
import TDMtermite
jack = TDMtermite.tdmtermite(b'samples/SineData.tdm',b'samples/SineData.tdx')
jack.write_all(b"./my_tdm_data_directory/")
```
The interface allows you to construct customized file/column headers from any
meta-data and provide these headers for usage in file output (see this
[example](python/custom.py)).
## References
### TDM
- https://www.ni.com/de-de/support/documentation/supplemental/10/ni-tdm-data-model.html
- https://zone.ni.com/reference/en-XX/help/371361R-01/lvconcepts/fileio_tdms_model/
- https://zone.ni.com/reference/en-XX/help/371361R-01/lvhowto/ni_test_data_exchange/
- https://www.ni.com/de-de/support/documentation/supplemental/06/the-ni-tdms-file-format.html
- https://zone.ni.com/reference/de-XX/help/370858P-0113/tdmdatamodel/tdmdatamodel/tdm_headerfile/
- https://www.ni.com/content/dam/web/product-documentation/c_dll_tdm.zip
### IEEE Standard and datatypes
- https://en.wikipedia.org/wiki/IEEE_754
- https://www.ias.ac.in/public/Volumes/reso/021/01/0011-0030.pdf
- https://en.cppreference.com/w/cpp/language/types
### Implementation
- https://en.cppreference.com/w/
- https://pugixml.org/
- https://github.com/zeux/pugixml
- https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html
### Packaging
#### Documentation
- https://packaging.python.org/tutorials/packaging-projects/
- https://setuptools.readthedocs.io/en/latest/userguide/declarative_config.html
- https://test.pypi.org/account/register/
- https://github.com/pypa/auditwheel
- https://github.com/pypa/python-manylinux-demo
- https://github.com/pypa/manylinux
#### C/C++ Extensions
- https://docs.python.org/3/extending/building.html
#### Articles
- https://martinsosic.com/development/2016/02/08/wrapping-c-library-as-python-module.html
- https://malramsay.com/post/perils-of-packaging/
- https://github.com/neuronsimulator/nrn/issues/329
- https://levelup.gitconnected.com/how-to-deploy-a-cython-package-to-pypi-8217a6581f09
- https://medium.com/swlh/distributing-python-packages-protected-with-cython-40fc29d84caf
Raw data
{
"_id": null,
"home_page": "https://github.com/RecordEvolution/TDMtermite.git",
"name": "TDMtermite",
"maintainer": "Record Evolution GmbH",
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "TDM, TDX, National Instruments, DIAdem, LabVIEW, Measurement Studio, SignalExpress",
"author": "Record Evolution GmbH",
"author_email": "mario.fink@record-evolution.de",
"download_url": "https://files.pythonhosted.org/packages/2f/c2/717d81b4d64e01935d7db20611a5905053b815821ec40dfd0c399c4d373b/TDMtermite-2.0.2.tar.gz",
"platform": null,
"description": "# TDMtermite\n\n_TDMtermite_ is a C++ based library that decodes the proprietary\nfile format _TDM/TDX_ for measurement data. First introduced by\n[National Instruments](https://www.ni.com), the TDM format relies on the\n_technical data management_ data model and is employed by\n[LabVIEW](https://www.ni.com/de-de/shop/labview.html), LabWindows\u2122/CVI\u2122,\nMeasurement Studio, SignalExpress, and [DIAdem](https://www.ni.com/de-de/shop/data-acquisition-and-control/application-software-for-data-acquisition-and-control-category/what-is-diadem.html).\n\nThe [Record Evolution Platform](https://www.record-evolution.de/en/home-en/) uses TDMtermite to integrate measurement data into ETL processes. The TDMtermite library is available both as a command line tool and as a Python module. The Python module of TDMtermite enables data scientists to conveniently include TDM formats in their existing data pipelines by providing access to both raw data and metadata in terms of native Python objects. \n\n## Overview\n\n* [TDM file format](#Dataformat)\n* [Build and Installation](#Installation)\n* [Usage and Examples](#Usage)\n* [References](#References)\n\n## Dataformat\n\nDatasets encoded in the TDM/TDX format come in pairs comprised of a\n.tdm (header) file and a .tdx (data) file. While the .tdm file is a human-readable\nfile providing meta information about the dataset, the .tdx file is a binary file\ncontaining the actual data. The .tdm based on the _technical data management_\nmodel is an XML file. It describes what data the .tdx file contains and how\nto read it. The\n[TDM data model](https://www.ni.com/de-de/support/documentation/supplemental/10/ni-tdm-data-model.html)\nstructures the data hierarchically with respect to _file_, _(channel)_ _groups_ and\n_channels_. The file-level XML may contain any number of (channel) groups, each\nof which is made up of an arbitrary number of channels. Thus, the XML tree in\nthe [TDM header file](https://zone.ni.com/reference/de-XX/help/370858P-0113/tdmdatamodel/tdmdatamodel/tdm_headerfile/)\nlooks like this:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\n<usi:tdm xmlns:usi=\"http://www.ni.com/Schemas/USI/1_0\" version=\"1.0\">\n\n <usi:documentation>\n <usi:exporter>National Instruments USI</usi:exporter>\n <usi:exporterVersion>1.5</usi:exporterVersion>\n </usi:documentation>\n\n <usi:model modelName=\"National Instruments USI generated meta file\" modelVersion=\"1.0\">\n <usi:include nsUri=\"http://www.ni.com/DataModels/USI/TDM/1_0\"/>\n </usi:model>\n\n <usi:include>\n <file byteOrder=\"littleEndian\" url=\"example.tdx\">\n ...\n <block byteOffset=\"0\" id=\"inc0\" length=\"1000\" valueType=\"eFloat64Usi\"/>\n ...\n <block_bm id=\"inc4\" blockOffset=\"100\" blockSize=\"7\" byteOffset=\"0\" length=\"4\" valueType=\"eInt8Usi\"/>\n ...\n </usi:include>\n\n <usi:data>\n ...\n </usi:data>\n\n</usi:tdm>\n```\n\nThe XML tree is comprised of _four_ main XML elements: `usi:documentation`, `usi:model`,\n`usi:include` and `usi:data`. The element `usi:include` references the data file\n`example.tdx` and reveals one of _two_ possible orderings of the mass data (.tdx):\n\n1. either _channel-wise_ (`<block>`) - all values of a specific channel follow subsequently\n1. or _block-wise_ (`<block_bm>`) - all values of a specific measurement time follow subsequently.\n\nThe supported _numerical data types_ are:\n\n| datatype | channel datatype | numeric | value sequence | size | description |\n|-------------|------------------|---------|-----------------|-------|-------------------------|\n| eInt16Usi | DT_SHORT | 2 | short_sequence | 2byte | signed 16 bit integer |\n| eInt32Usi | DT_LONG | 6 | long_sequence | 4byte | signed 32 bit integer |\n| eUInt8Usi | DT_BYTE | 5 | byte_sequence | 1byte | unsigned 8 bit integer |\n| eUInt16Usi | DT_SHORT | 2 | short_sequence | 2byte | unsigned 16 bit integer |\n| eUInt32Usi | DT_LONG | 6 | long_sequence | 4byte | unsigned 32 bit integer |\n| eFloat32Usi | DT_FLOAT | 3 | float_sequence | 4byte | 32 bit float |\n| eFloat64Usi | DT_DOUBLE | 7 | double_sequence | 8byte | 64 Bit double |\n| eStringUsi | DT_STRING | 1 | string_sequence | | text |\n\nThe XML element `<usi:data>` is comprised of _five_ different types of\nelements that are `<tdm_root>`, `<tdm_channelgroup>`, `<tdm_channel>`, `<localcolumn>`\nand `<submatrix>`. The root element `<tdm_root>` describes the general properties\nof the dataset and lists the _ids_ of all channel groups that belong to\nthe dataset. The element `<tdm_channelgroup>` divides the _channels_ into groups\nand has a unique _id_ that is referenced by its root element. The `<channels>`\nelement in `<tdm_channelgroup>` lists the unique ids of all channels that belong\nto that group. Finally, the element `<tdm_channel>` describes a single column of\nactual data including its datatype. The remaining element types are\n`<localcolumn>`\n\n```xml\n<localcolumn id=\"usiXY\">\n <name>Untitled</name>\n <measurement_quantity>#xpointer(id(\"usiAB\"))</measurement_quantity>\n <submatrix>#xpointer(id(\"usiMN\"))</submatrix>\n <global_flag>15</global_flag>\n <independent>0</independent>\n <sequence_representation> ... </sequence_representation>\n <values>#xpointer(id(\"usiZ\"))</values>\n</localcolumn>\n```\n\nwith a unique id, the `<measurement_quantity>` referring to one specific channel,\nthe `<submatrix>` and its id respectively, the type of representation in\n`<sequence_representation>` - being one of _explicit_, _implicit linear_ or\n_rawlinear_ - and the `<values>` element, which refers to one _value sequence_,\nand the element `<submatrix>`\n\n```xml\n<submatrix id=\"usiXX\">\n <name>Untitled</name>\n <measurement>#xpointer(id(\"usiUV\"))</measurement>\n <number_of_rows>N</number_of_rows>\n <local_columns>#xpointer(id(\"usiMN\"))</local_columns>\n</submatrix>\n```\n\nthat references the channel group in `<measurement>` to which it belongs and provides\nthe _number of rows_ in the channels listed in `<local_columns>`.\n\n## Installation\n\nThe library can be used both as a _CLI_-based tool and as a _Python_ module.\n\n### CLI tool\n\nTo install the CLI tool _TDMtermite_, do\n\n```Shell\nmake install\n```\n\nwhich uses `/usr/local/bin` as an installation directory. On _macOSX_, please first\nbuild the binary locally with `make` and install it in your preferred location.\n\n### Python\n\nIn order to build a _Python module_ from the _C++_ code base, the\n[Cython](https://cython.readthedocs.io/en/latest/index.html) package must be\navailable. It may be installed via `python3 -m pip install cython` .\nThe [Numpy](https://numpy.org) package is recommended\nto pass arrays of data from the C++ kernel to Python. The _makefile_ provides\nthe target `make cython-requirements` to install all required Python modules.\nFinally, to build the Python extension _tdm_termite_ locally or install\nit, the targets `make cython-build` and `make cython-install` are provided.\nTo install the Python module on the system, simply do\n\n```Shell\nmake cython-requirements\nmake cython-install\n```\n\nwhich makes the module available for import by `import tdm_termite` .\n\n#### Installation with pip\n\nThe package is also available via the [Python Package Index](https://pypi.org) at\n[TDMtermite](https://pypi.org/project/TDMtermite/). To install the latest version simply do\n\n```Shell\npython3 -m pip install TDMtermite\n```\n\n##### Unix\n\nNote, that _python3_setuptools_ and _gcc version >= 10.2.0_ are required to\nsuccessfully install and use it.\n\n## Usage\n\n### CLI tool\n\nThe usage of the CLI tool is sufficiently clarified by its help message displayed\nby `tdmtermite --help`. To extract the data decoded in the pair of\nfiles `samples/SineData.tdm` and `samples/SineData.tdx` into the directory\n`/home/jack/data/`:\n\n```Shell\ntdmtermite samples/SineData.tdm samples/SineData.tdx --output /home/jack/data\n```\n\nThe tool can also be used to list the available objects in the TDM dataset, which\nare i.a. _channels_, _channelgroups_ and TDX _blocks_. To list\nall channels and channelgroups (without writing any file output):\n\n```Shell\ntdmtermite samples/SineData.tdm samples/SineData.tdx --listgroups --listchannels\n```\n\nThe user may also submit a _filenaming rule_ to control the names of the files the\nchannel(group)s are written to. To this end, the _magic flags_ `%G` `%g`, `%C`\nand `%c` representing the group id, group name, channel index and channel name\nare defined. The default filenaming option is:\n\n```Shell\ntdmtermite samples/SineData.tdm samples/SineData.tdx --output /home/jack/data --filenames channelgroup_%G.csv\n```\n\nThis makes the tool write _all channels_ grouped into files according to their\ngroup association, while all channelgroup filenames obey the pattern `channelgroup_%G.csv`,\nwith `%G` being replaced by the group id. The filenaming rule also enables the user\nto extract only a single channel(group) by providing a particular channel(group)\nid in the filenaming flag. For example,\n\n```Shell\ntdmtermite samples/SineData.tdm samples/SineData.tdx --output /home/jack/data -f channel_usi16_%c.csv --includemeta\n```\n\nThis will write the single channel with the id `usi16` to the file\n`/home/jack/data/channel_usi16_A4.csv`, including its meta-data as a file header.\n\n### Python\n\nTo be able to use the Python module _tdm_termite_, it first has to be built locally\nor installed on the system. In the Python interpreter, simply do:\n\n```Python\nimport TDMtermite\n```\n\nThis will import the module. The TDM files are provided by creating an instance of\nthe _tdmtermite_ class:\n\n```Python\n# create 'tdmtermite' instance object\ntry :\n jack = TDMtermite.tdmtermite(b'samples/SineData.tdm',b'samples/SineData.tdx')\nexcept RuntimeError as e:\n print(\"failed to load/decode TDM files: \" + str(e))\n```\n\nAfter initializing the _tdmtermite_ object, it can be used to extract any of the\navailable data. For instance, to list the included channelgroups and channels:\n\n```Python\n# list ids of channelgroups\ngrpids = jack.get_channelgroup_ids()\n\n\n# list ids of channels\nchnids = jack.get_channel_ids()\n```\n\nAs a use case, we have a look at listing the ids of all channelgroups and printing\ntheir data to separate files:\n\n```Python\nimport TDMtermite\nimport re\n\n# create 'tdmtermite' instance object\ntry :\n jack = TDMtermite.tdmtermite(b'samples/SineData.tdm',b'samples/SineData.tdx')\nexcept RuntimeError as e :\n print(\"failed to load/decode TDM files: \" + str(e))\n\n# list ids of channelgroups\ngrpids = jack.get_channelgroup_ids()\ngrpids = [x.decode() for x in grpids]\nprint(\"list of channelgroups: \",grpids)\n\nfor grp in grpids :\n\n # obtain meta data of channelgroups\n grpinfo = jack.get_channelgroup_info(grp.encode())\n print( json.dumps(grpinfo,sort_keys=False,indent=4) )\n\n # write this channelgroup to file\n try :\n grpname = re.sub('[^A-Za-z0-9]','',grpinfo['name'])\n grpfile = \"channelgroup_\" + str(grp) + \"_\" + str(grpname) + \".csv\"\n jack.print_channelgroup(grp.encode(), # id of group to be printed\n grpfile.encode(), # filename\n True, # include metadata as fileheader\n ord(' ') # delimiter char\n )\n except RuntimeError as e :\n print(\"failed to print channelgroup: \" + str(grp) + \" : \" + str(e))\n```\n\nFor details, see this [extensive example](python/usage.py)\nand the absolute minimal example [minimal usage](python/minimal.py). In order\nto simply extract all data of the TDM datatset and dump it to files in a given\n(existing!) directory, do\n\n```Python\nimport TDMtermite\njack = TDMtermite.tdmtermite(b'samples/SineData.tdm',b'samples/SineData.tdx')\njack.write_all(b\"./my_tdm_data_directory/\")\n```\n\nThe interface allows you to construct customized file/column headers from any\nmeta-data and provide these headers for usage in file output (see this\n[example](python/custom.py)).\n\n## References\n\n### TDM\n\n- https://www.ni.com/de-de/support/documentation/supplemental/10/ni-tdm-data-model.html\n- https://zone.ni.com/reference/en-XX/help/371361R-01/lvconcepts/fileio_tdms_model/\n- https://zone.ni.com/reference/en-XX/help/371361R-01/lvhowto/ni_test_data_exchange/\n- https://www.ni.com/de-de/support/documentation/supplemental/06/the-ni-tdms-file-format.html\n- https://zone.ni.com/reference/de-XX/help/370858P-0113/tdmdatamodel/tdmdatamodel/tdm_headerfile/\n- https://www.ni.com/content/dam/web/product-documentation/c_dll_tdm.zip\n\n### IEEE Standard and datatypes\n\n- https://en.wikipedia.org/wiki/IEEE_754\n- https://www.ias.ac.in/public/Volumes/reso/021/01/0011-0030.pdf\n- https://en.cppreference.com/w/cpp/language/types\n\n### Implementation\n\n- https://en.cppreference.com/w/\n- https://pugixml.org/\n- https://github.com/zeux/pugixml\n- https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html\n\n### Packaging\n\n#### Documentation\n\n- https://packaging.python.org/tutorials/packaging-projects/\n- https://setuptools.readthedocs.io/en/latest/userguide/declarative_config.html\n- https://test.pypi.org/account/register/\n- https://github.com/pypa/auditwheel\n- https://github.com/pypa/python-manylinux-demo\n- https://github.com/pypa/manylinux\n\n#### C/C++ Extensions\n\n- https://docs.python.org/3/extending/building.html\n\n#### Articles\n\n- https://martinsosic.com/development/2016/02/08/wrapping-c-library-as-python-module.html\n- https://malramsay.com/post/perils-of-packaging/\n- https://github.com/neuronsimulator/nrn/issues/329\n- https://levelup.gitconnected.com/how-to-deploy-a-cython-package-to-pypi-8217a6581f09\n- https://medium.com/swlh/distributing-python-packages-protected-with-cython-40fc29d84caf\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "Extract and read data from National Instruments LabVIEW tdx/tdm files and export them as csv files",
"version": "2.0.2",
"project_urls": {
"Homepage": "https://github.com/RecordEvolution/TDMtermite.git"
},
"split_keywords": [
"tdm",
" tdx",
" national instruments",
" diadem",
" labview",
" measurement studio",
" signalexpress"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "3cdb38749e35f29b24d99241b7cbf4ebb974777e2e1ef07bcaba7f46ae148ada",
"md5": "9d75de13ac3539012d3d398011d6bb5b",
"sha256": "eef7ee121726ff4112c29089857a11ae679cf6874f25e06680f991f631bdd681"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "9d75de13ac3539012d3d398011d6bb5b",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 1943599,
"upload_time": "2024-06-12T15:35:25",
"upload_time_iso_8601": "2024-06-12T15:35:25.206251Z",
"url": "https://files.pythonhosted.org/packages/3c/db/38749e35f29b24d99241b7cbf4ebb974777e2e1ef07bcaba7f46ae148ada/TDMtermite-2.0.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7c4207fda64eb182c9760cb6352b073300702c9a50c3764f41313d70c9156e5b",
"md5": "f668e991286179c184b1c6bd14886e65",
"sha256": "b87f4881ec0978d5104256119eeac56a8c3cdb7d2809d05d1a1b6ac90409c4f5"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "f668e991286179c184b1c6bd14886e65",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 2008311,
"upload_time": "2024-06-12T15:35:27",
"upload_time_iso_8601": "2024-06-12T15:35:27.201429Z",
"url": "https://files.pythonhosted.org/packages/7c/42/07fda64eb182c9760cb6352b073300702c9a50c3764f41313d70c9156e5b/TDMtermite-2.0.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2854e4869974add34718a9754c44138556ce836889503640ca5aac2d1c95eeae",
"md5": "7158750571c2b2a60f13eb314bf0e599",
"sha256": "e31df3e67a47cc28e6c0754787244d5e57e6808351cc0e51a0b849840bb7ef91"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp310-cp310-win32.whl",
"has_sig": false,
"md5_digest": "7158750571c2b2a60f13eb314bf0e599",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 120759,
"upload_time": "2024-06-12T15:35:28",
"upload_time_iso_8601": "2024-06-12T15:35:28.800126Z",
"url": "https://files.pythonhosted.org/packages/28/54/e4869974add34718a9754c44138556ce836889503640ca5aac2d1c95eeae/TDMtermite-2.0.2-cp310-cp310-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5b1de612d797228a5b35f5c766e068c4a3cb226854c51ddbce47e934a13c8fdc",
"md5": "7ca58e1e4eaaf2afbfdba9b09f032368",
"sha256": "aa5b06958c85a0517168d02ab940b8f4ff402374f6ec8029e53ca117db6de942"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "7ca58e1e4eaaf2afbfdba9b09f032368",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 129077,
"upload_time": "2024-06-12T15:35:30",
"upload_time_iso_8601": "2024-06-12T15:35:30.071157Z",
"url": "https://files.pythonhosted.org/packages/5b/1d/e612d797228a5b35f5c766e068c4a3cb226854c51ddbce47e934a13c8fdc/TDMtermite-2.0.2-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cfb8a6ac413ea889317a85bd8b83bf860fd311ca3239cf2cc8cfe8a3541fcd6f",
"md5": "7312fbfbb1d15f7941ac7d9853bf784f",
"sha256": "f731905c8f9980d658aabbda6b1f4c1978b91a82f13d47f55d62709e1e8299be"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "7312fbfbb1d15f7941ac7d9853bf784f",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 1934793,
"upload_time": "2024-06-12T15:35:31",
"upload_time_iso_8601": "2024-06-12T15:35:31.604539Z",
"url": "https://files.pythonhosted.org/packages/cf/b8/a6ac413ea889317a85bd8b83bf860fd311ca3239cf2cc8cfe8a3541fcd6f/TDMtermite-2.0.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "30a81fb2571af2827a3142c9178a7345aafcfdb757be0e4e5bcb77fad563fe3e",
"md5": "2bcb9a8ea23e359d05654bccf2b2ab90",
"sha256": "73d58ff1b5b04168f915370e6718bdbdad481a8cad1fc7ae855a3d138dbbdcc9"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "2bcb9a8ea23e359d05654bccf2b2ab90",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 2000461,
"upload_time": "2024-06-12T15:35:33",
"upload_time_iso_8601": "2024-06-12T15:35:33.278216Z",
"url": "https://files.pythonhosted.org/packages/30/a8/1fb2571af2827a3142c9178a7345aafcfdb757be0e4e5bcb77fad563fe3e/TDMtermite-2.0.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e971fdc696f02c7d4618085ec61cf90fd5dde08e9403709a66f7024d8daafa85",
"md5": "146126a1d78cfbd32b303bf961acc84a",
"sha256": "40f9a5034e8a61e5fdd38335646f5488cf91c793547cb933e8ca0599f6463b20"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp36-cp36m-win32.whl",
"has_sig": false,
"md5_digest": "146126a1d78cfbd32b303bf961acc84a",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 124147,
"upload_time": "2024-06-12T15:35:34",
"upload_time_iso_8601": "2024-06-12T15:35:34.904786Z",
"url": "https://files.pythonhosted.org/packages/e9/71/fdc696f02c7d4618085ec61cf90fd5dde08e9403709a66f7024d8daafa85/TDMtermite-2.0.2-cp36-cp36m-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a1459e3f0fd43e4225a38aed36af1cbc8d12fed08b3898c3421ecae02ddd64f4",
"md5": "51a823d087aa2806e7cb6c14eed405d4",
"sha256": "1ca4de4c828da0c6bdd12f98970367cd55768b833e64428566f1d46fc7be771f"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp36-cp36m-win_amd64.whl",
"has_sig": false,
"md5_digest": "51a823d087aa2806e7cb6c14eed405d4",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": null,
"size": 135578,
"upload_time": "2024-06-12T15:35:35",
"upload_time_iso_8601": "2024-06-12T15:35:35.983475Z",
"url": "https://files.pythonhosted.org/packages/a1/45/9e3f0fd43e4225a38aed36af1cbc8d12fed08b3898c3421ecae02ddd64f4/TDMtermite-2.0.2-cp36-cp36m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b23e6bc51a1f4d9a7efcabc01508f894c394432a1601b5357ffc1d2ceeec5003",
"md5": "4cf850a0f22bcd8db42f1d21a24b8794",
"sha256": "19251fa052e4aa8de2fd98dd365cd77a533d8977cc4e1bac833d20b38867f165"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "4cf850a0f22bcd8db42f1d21a24b8794",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 1945836,
"upload_time": "2024-06-12T15:35:37",
"upload_time_iso_8601": "2024-06-12T15:35:37.078207Z",
"url": "https://files.pythonhosted.org/packages/b2/3e/6bc51a1f4d9a7efcabc01508f894c394432a1601b5357ffc1d2ceeec5003/TDMtermite-2.0.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "124b5d7ee51b08263cf2b9bd96793d054600e3b37da00868dcafd4792a5c12dd",
"md5": "5535773a4308785d954e976f3e157e06",
"sha256": "2ee7d0a80c26c3f992d0eb06f2a5787398f00b3b1b42e3968a4467f68124fd49"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "5535773a4308785d954e976f3e157e06",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 2009489,
"upload_time": "2024-06-12T15:35:38",
"upload_time_iso_8601": "2024-06-12T15:35:38.839961Z",
"url": "https://files.pythonhosted.org/packages/12/4b/5d7ee51b08263cf2b9bd96793d054600e3b37da00868dcafd4792a5c12dd/TDMtermite-2.0.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6e40cf429812fd1a3a89a2cd785c992b137e270a709a43d223911d235e45b41d",
"md5": "cde340081f7fc0c3e4f4fca5aba68128",
"sha256": "97441b168408eec6208b2fc3a560774f3490a207bb370231d8072d7ad2d561e3"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp37-cp37m-win32.whl",
"has_sig": false,
"md5_digest": "cde340081f7fc0c3e4f4fca5aba68128",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 121181,
"upload_time": "2024-06-12T15:35:40",
"upload_time_iso_8601": "2024-06-12T15:35:40.681025Z",
"url": "https://files.pythonhosted.org/packages/6e/40/cf429812fd1a3a89a2cd785c992b137e270a709a43d223911d235e45b41d/TDMtermite-2.0.2-cp37-cp37m-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fd04d1fbffa698125ee259ef5e4a9f4705d851c8a11a5262b36656932dce45d9",
"md5": "3c4ccf2e577577ddd2878ce3cba7db11",
"sha256": "fa953b0d837529628f3053fe5cf92678c9f51325ac2f512732fffa395c913f59"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp37-cp37m-win_amd64.whl",
"has_sig": false,
"md5_digest": "3c4ccf2e577577ddd2878ce3cba7db11",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": null,
"size": 130329,
"upload_time": "2024-06-12T15:35:41",
"upload_time_iso_8601": "2024-06-12T15:35:41.687524Z",
"url": "https://files.pythonhosted.org/packages/fd/04/d1fbffa698125ee259ef5e4a9f4705d851c8a11a5262b36656932dce45d9/TDMtermite-2.0.2-cp37-cp37m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f430791d5ff00dc7ef5582fed4054325425ff71c98bb05bb2401e7285f6e82be",
"md5": "92b6bb8c39607cf38ee11ed87e5b3c25",
"sha256": "54f082fceee5e508ec9ce57dbd83e4d18daa3c509b581f39fcb0e796a122fe8b"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "92b6bb8c39607cf38ee11ed87e5b3c25",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 1948361,
"upload_time": "2024-06-12T15:35:42",
"upload_time_iso_8601": "2024-06-12T15:35:42.830544Z",
"url": "https://files.pythonhosted.org/packages/f4/30/791d5ff00dc7ef5582fed4054325425ff71c98bb05bb2401e7285f6e82be/TDMtermite-2.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "75804bf5aa676feb17a1817c418eabf35a5ee8f5eda573a1aa40b6026d179c0f",
"md5": "41a52c5b6055b2da176fbc519fa4ebaa",
"sha256": "b5759865d78bf1a1cd7600cbeef1fada9e7594ffa50f9d72ffd6eba39a0a925b"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "41a52c5b6055b2da176fbc519fa4ebaa",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 2009228,
"upload_time": "2024-06-12T15:35:44",
"upload_time_iso_8601": "2024-06-12T15:35:44.595220Z",
"url": "https://files.pythonhosted.org/packages/75/80/4bf5aa676feb17a1817c418eabf35a5ee8f5eda573a1aa40b6026d179c0f/TDMtermite-2.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c2ee4398161ddbd704e0cee1a60b5257cb67a279559349aee858e995d8ada663",
"md5": "8b6245218a5048c78d8801b23cbc9b64",
"sha256": "c117e5bb6d52ac975187205cb5a565705c38430e59b7e254c78aaece279c3ffa"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp38-cp38-win32.whl",
"has_sig": false,
"md5_digest": "8b6245218a5048c78d8801b23cbc9b64",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 121216,
"upload_time": "2024-06-12T15:35:46",
"upload_time_iso_8601": "2024-06-12T15:35:46.192861Z",
"url": "https://files.pythonhosted.org/packages/c2/ee/4398161ddbd704e0cee1a60b5257cb67a279559349aee858e995d8ada663/TDMtermite-2.0.2-cp38-cp38-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0173357680c9810433b82fddab030cd486ae7aa2273466b5c111709dcb853514",
"md5": "15aae070a685042f07b452267a82b07c",
"sha256": "2dc354229ba21ae83fd0f4accf348e24a52ee6a80facd9c056c8fa2e29a56c24"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "15aae070a685042f07b452267a82b07c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 129880,
"upload_time": "2024-06-12T15:35:47",
"upload_time_iso_8601": "2024-06-12T15:35:47.706733Z",
"url": "https://files.pythonhosted.org/packages/01/73/357680c9810433b82fddab030cd486ae7aa2273466b5c111709dcb853514/TDMtermite-2.0.2-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b1d96792f08d505222e37a20676907f618be122f9801e894ed80618690c55bc6",
"md5": "5253d05502f99db7c8037fc8aa4419ee",
"sha256": "ab9b0e12bb40ac401abbe9caf345db3440127e0e6e6a08ebcad04952e113cc17"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "5253d05502f99db7c8037fc8aa4419ee",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 1946789,
"upload_time": "2024-06-12T15:35:49",
"upload_time_iso_8601": "2024-06-12T15:35:49.069899Z",
"url": "https://files.pythonhosted.org/packages/b1/d9/6792f08d505222e37a20676907f618be122f9801e894ed80618690c55bc6/TDMtermite-2.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0b1b9d5a943472359ef43ab0fbebf70bb545691f2ef9e94c0d09d7396cee00a4",
"md5": "59cf2530d657b4c09d0098bd8367aecc",
"sha256": "1753521ff56a1babe48c477093278ecd864c4d20a040effde331001eeb7a91b4"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "59cf2530d657b4c09d0098bd8367aecc",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 2010577,
"upload_time": "2024-06-12T15:35:50",
"upload_time_iso_8601": "2024-06-12T15:35:50.909212Z",
"url": "https://files.pythonhosted.org/packages/0b/1b/9d5a943472359ef43ab0fbebf70bb545691f2ef9e94c0d09d7396cee00a4/TDMtermite-2.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4cfae99107a4b6657a008ce9598f54527c6f0a68c8eb8d874d52e55dec206de2",
"md5": "964ad0232003027c4c7cdaee8e23a368",
"sha256": "766dca05ff1cbe2bec302046abfcbd45e1c6c75c8ab0122f1d7155a679852659"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp39-cp39-win32.whl",
"has_sig": false,
"md5_digest": "964ad0232003027c4c7cdaee8e23a368",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 121105,
"upload_time": "2024-06-12T15:35:52",
"upload_time_iso_8601": "2024-06-12T15:35:52.495635Z",
"url": "https://files.pythonhosted.org/packages/4c/fa/e99107a4b6657a008ce9598f54527c6f0a68c8eb8d874d52e55dec206de2/TDMtermite-2.0.2-cp39-cp39-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c83b5749472029a0070d71245b73cf86bc573f92ed02c3cea82fe10b954c0c47",
"md5": "d2e6ee39e7c34fd541ff1dc59f5363bc",
"sha256": "039c41aa056a1c9809e2c55c32988314f0d7b268e3ea90ffeb60ec3a2228ae64"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "d2e6ee39e7c34fd541ff1dc59f5363bc",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 129762,
"upload_time": "2024-06-12T15:35:53",
"upload_time_iso_8601": "2024-06-12T15:35:53.700429Z",
"url": "https://files.pythonhosted.org/packages/c8/3b/5749472029a0070d71245b73cf86bc573f92ed02c3cea82fe10b954c0c47/TDMtermite-2.0.2-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c1e43c01e2a33d84dfe2ec7bdb3ebc23bd5f10c2276eb7449d39d0f6b9f2882e",
"md5": "46e8baa14323a4c59dbc792dfe8e4b6e",
"sha256": "11df05acc75156fdf3c2d5e25123c46943c6f26f8b3e73a97f21dff2bc6cc13b"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "46e8baa14323a4c59dbc792dfe8e4b6e",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": null,
"size": 220625,
"upload_time": "2024-06-12T15:35:55",
"upload_time_iso_8601": "2024-06-12T15:35:55.125152Z",
"url": "https://files.pythonhosted.org/packages/c1/e4/3c01e2a33d84dfe2ec7bdb3ebc23bd5f10c2276eb7449d39d0f6b9f2882e/TDMtermite-2.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e248c582c32242583874069b948c9a38dd38c469c75a840edca6c10fffba93b7",
"md5": "f9af17d8503c8d91f76b75455dfd6955",
"sha256": "cce891692eeb80a74d1f07011386179e9d340bdaa69ea98b8a820a8625e03cc4"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "f9af17d8503c8d91f76b75455dfd6955",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": null,
"size": 206183,
"upload_time": "2024-06-12T15:35:56",
"upload_time_iso_8601": "2024-06-12T15:35:56.362384Z",
"url": "https://files.pythonhosted.org/packages/e2/48/c582c32242583874069b948c9a38dd38c469c75a840edca6c10fffba93b7/TDMtermite-2.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "649ecf89871998c261ee54787eb1bc728c1f1fd6e54f4561b4b5c85cbe7d8ee0",
"md5": "eb6d04a5de03cbbf156e909e4185e3dc",
"sha256": "442d59bb2fe1b46db764a9bcd1246a710e550775775068b1f09e2718380b153f"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2-pp37-pypy37_pp73-win_amd64.whl",
"has_sig": false,
"md5_digest": "eb6d04a5de03cbbf156e909e4185e3dc",
"packagetype": "bdist_wheel",
"python_version": "pp37",
"requires_python": null,
"size": 125227,
"upload_time": "2024-06-12T15:35:57",
"upload_time_iso_8601": "2024-06-12T15:35:57.455110Z",
"url": "https://files.pythonhosted.org/packages/64/9e/cf89871998c261ee54787eb1bc728c1f1fd6e54f4561b4b5c85cbe7d8ee0/TDMtermite-2.0.2-pp37-pypy37_pp73-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2fc2717d81b4d64e01935d7db20611a5905053b815821ec40dfd0c399c4d373b",
"md5": "5624ccb264a5f4b4c39404d9cb60456a",
"sha256": "0f3c5242192c0e555bceb1d619d4a8f8c2555edbf5b30831d8a0dc8b7f992a92"
},
"downloads": -1,
"filename": "TDMtermite-2.0.2.tar.gz",
"has_sig": false,
"md5_digest": "5624ccb264a5f4b4c39404d9cb60456a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 54985,
"upload_time": "2024-06-12T15:35:58",
"upload_time_iso_8601": "2024-06-12T15:35:58.442568Z",
"url": "https://files.pythonhosted.org/packages/2f/c2/717d81b4d64e01935d7db20611a5905053b815821ec40dfd0c399c4d373b/TDMtermite-2.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-06-12 15:35:58",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "RecordEvolution",
"github_project": "TDMtermite",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "tdmtermite"
}