cardinal-pythonlib 2.1.2__tar.gz → 2.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/PKG-INFO +1 -1
  2. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/extract_text.py +8 -7
  3. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/extract_text_tests.py +49 -0
  4. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/version_string.py +1 -1
  5. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib.egg-info/PKG-INFO +1 -1
  6. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/LICENSE +0 -0
  7. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/README.rst +0 -0
  8. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/__init__.py +0 -0
  9. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/argparse_func.py +0 -0
  10. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/athena_ohdsi.py +0 -0
  11. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/betweendict.py +0 -0
  12. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/buildfunc.py +0 -0
  13. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/bulk_email/__init__.py +0 -0
  14. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/bulk_email/constants.py +0 -0
  15. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/bulk_email/main.py +0 -0
  16. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/bulk_email/models.py +0 -0
  17. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/chebi.py +0 -0
  18. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/classes.py +0 -0
  19. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/cmdline.py +0 -0
  20. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/colander_utils.py +0 -0
  21. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/compression.py +0 -0
  22. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/configfiles.py +0 -0
  23. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/contexts.py +0 -0
  24. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/convert.py +0 -0
  25. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/crypto.py +0 -0
  26. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/datamapping.py +0 -0
  27. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/datetimefunc.py +0 -0
  28. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/dbfunc.py +0 -0
  29. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/debugging.py +0 -0
  30. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/deform_utils.py +0 -0
  31. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/dicts.py +0 -0
  32. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/__init__.py +0 -0
  33. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/admin.py +0 -0
  34. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/django_constants.py +0 -0
  35. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/fields/__init__.py +0 -0
  36. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/fields/helpers.py +0 -0
  37. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/fields/isodatetimetz.py +0 -0
  38. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/fields/jsonclassfield.py +0 -0
  39. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/fields/restrictedcontentfile.py +0 -0
  40. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/files.py +0 -0
  41. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/forms.py +0 -0
  42. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/function_cache.py +0 -0
  43. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/mail.py +0 -0
  44. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/middleware.py +0 -0
  45. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/reprfunc.py +0 -0
  46. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/request_cache.py +0 -0
  47. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/serve.py +0 -0
  48. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/tools/__init__.py +0 -0
  49. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/django/tools/generate_new_django_secret_key.py +0 -0
  50. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/docker.py +0 -0
  51. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/dogpile_cache.py +0 -0
  52. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/dsp.py +0 -0
  53. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/email_utils/__init__.py +0 -0
  54. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/email_utils/mailboxpurge.py +0 -0
  55. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/email_utils/sendmail.py +0 -0
  56. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/enumlike.py +0 -0
  57. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/excel.py +0 -0
  58. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/exceptions.py +0 -0
  59. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/file_io.py +0 -0
  60. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/fileops.py +0 -0
  61. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/formatting.py +0 -0
  62. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/getch.py +0 -0
  63. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/hash.py +0 -0
  64. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/httpconst.py +0 -0
  65. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/interval.py +0 -0
  66. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/iterhelp.py +0 -0
  67. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/json_utils/__init__.py +0 -0
  68. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/json_utils/serialize.py +0 -0
  69. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/json_utils/typing_helpers.py +0 -0
  70. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/lang.py +0 -0
  71. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/lists.py +0 -0
  72. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/logs.py +0 -0
  73. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/maths_numpy.py +0 -0
  74. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/maths_py.py +0 -0
  75. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/metaclasses.py +0 -0
  76. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/module_version.py +0 -0
  77. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/modules.py +0 -0
  78. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/network.py +0 -0
  79. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/nhs.py +0 -0
  80. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/openxml/__init__.py +0 -0
  81. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/openxml/find_bad_openxml.py +0 -0
  82. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/openxml/find_recovered_openxml.py +0 -0
  83. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/openxml/grep_in_openxml.py +0 -0
  84. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/openxml/pause_process_by_disk_space.py +0 -0
  85. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/parallel.py +0 -0
  86. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/pdf.py +0 -0
  87. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/platformfunc.py +0 -0
  88. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/plot.py +0 -0
  89. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/probability.py +0 -0
  90. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/process.py +0 -0
  91. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/profiling.py +0 -0
  92. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/progress.py +0 -0
  93. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/psychiatry/__init__.py +0 -0
  94. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/psychiatry/drugs.py +0 -0
  95. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/psychiatry/mk_r_druglists.py +0 -0
  96. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/psychiatry/rfunc.py +0 -0
  97. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/psychiatry/simhelpers.py +0 -0
  98. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/psychiatry/timeline.py +0 -0
  99. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/psychiatry/treatment_resistant_depression.py +0 -0
  100. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/pyramid/__init__.py +0 -0
  101. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/pyramid/compression.py +0 -0
  102. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/pyramid/constants.py +0 -0
  103. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/pyramid/requests.py +0 -0
  104. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/pyramid/responses.py +0 -0
  105. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/randomness.py +0 -0
  106. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/rate_limiting.py +0 -0
  107. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/regexfunc.py +0 -0
  108. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/register_db_with_odbc.py +0 -0
  109. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/reprfunc.py +0 -0
  110. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/rnc_text.py +0 -0
  111. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/rnc_web.py +0 -0
  112. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/rounding.py +0 -0
  113. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/rpm.py +0 -0
  114. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/run_all_tests.py +0 -0
  115. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/signalfunc.py +0 -0
  116. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sizeformatter.py +0 -0
  117. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/slurm.py +0 -0
  118. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/snomed.py +0 -0
  119. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sort.py +0 -0
  120. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/source_reformatting.py +0 -0
  121. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sphinxtools.py +0 -0
  122. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/spreadsheets.py +0 -0
  123. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sql/__init__.py +0 -0
  124. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sql/literals.py +0 -0
  125. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sql/sql_grammar.py +0 -0
  126. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sql/sql_grammar_factory.py +0 -0
  127. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sql/sql_grammar_mssql.py +0 -0
  128. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sql/sql_grammar_mysql.py +0 -0
  129. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sql/validation.py +0 -0
  130. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/__init__.py +0 -0
  131. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/alembic_func.py +0 -0
  132. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/alembic_ops.py +0 -0
  133. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/arrow_types.py +0 -0
  134. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/core_query.py +0 -0
  135. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/dialect.py +0 -0
  136. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/dump.py +0 -0
  137. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/engine_func.py +0 -0
  138. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/insert_on_duplicate.py +0 -0
  139. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/list_types.py +0 -0
  140. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/logs.py +0 -0
  141. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/merge_db.py +0 -0
  142. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/orm_inspect.py +0 -0
  143. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/orm_query.py +0 -0
  144. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/orm_schema.py +0 -0
  145. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/schema.py +0 -0
  146. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/semantic_version_coltype.py +0 -0
  147. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/session.py +0 -0
  148. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/sqla_version.py +0 -0
  149. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/sqlfunc.py +0 -0
  150. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/sqlserver.py +0 -0
  151. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sqlalchemy/table_identity.py +0 -0
  152. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/stringfunc.py +0 -0
  153. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/subproc.py +0 -0
  154. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/sysops.py +0 -0
  155. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tcpipconst.py +0 -0
  156. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tee.py +0 -0
  157. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/__init__.py +0 -0
  158. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/datetimefunc_tests.py +0 -0
  159. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/dogpile_cache_tests.py +0 -0
  160. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/interval_tests.py +0 -0
  161. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/lists_tests.py +0 -0
  162. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/pdf_tests.py +0 -0
  163. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/rate_limiting_tests.py +0 -0
  164. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/rounding_tests.py +0 -0
  165. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/rpm_tests.py +0 -0
  166. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/sphinxtools_tests.py +0 -0
  167. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/spreadsheets_tests.py +0 -0
  168. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tests/subprocess_tests.py +0 -0
  169. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/text.py +0 -0
  170. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/timing.py +0 -0
  171. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/__init__.py +0 -0
  172. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/backup_mysql_database.py +0 -0
  173. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/convert_athena_ohdsi_codes.py +0 -0
  174. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/convert_mdb_to_mysql.py +0 -0
  175. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/estimate_mysql_memory_usage.py +0 -0
  176. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/explore_clang_format_config.py +0 -0
  177. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/list_all_file_extensions.py +0 -0
  178. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/merge_csv.py +0 -0
  179. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/pdf_to_booklet.py +0 -0
  180. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tools/remove_duplicate_files.py +0 -0
  181. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/tsv.py +0 -0
  182. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/typetests.py +0 -0
  183. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/typing_helpers.py +0 -0
  184. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/ui.py +0 -0
  185. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/ui_commandline.py +0 -0
  186. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/uriconst.py +0 -0
  187. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/version.py +0 -0
  188. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/winservice.py +0 -0
  189. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/wsgi/__init__.py +0 -0
  190. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/wsgi/cache_mw.py +0 -0
  191. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/wsgi/constants.py +0 -0
  192. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/wsgi/errorreporter_mw.py +0 -0
  193. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/wsgi/headers_mw.py +0 -0
  194. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/wsgi/request_logging_mw.py +0 -0
  195. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib/wsgi/reverse_proxied_mw.py +0 -0
  196. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib.egg-info/SOURCES.txt +0 -0
  197. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib.egg-info/dependency_links.txt +0 -0
  198. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib.egg-info/entry_points.txt +0 -0
  199. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib.egg-info/requires.txt +0 -0
  200. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/cardinal_pythonlib.egg-info/top_level.txt +0 -0
  201. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/setup.cfg +0 -0
  202. {cardinal_pythonlib-2.1.2 → cardinal_pythonlib-2.1.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cardinal_pythonlib
3
- Version: 2.1.2
3
+ Version: 2.1.3
4
4
  Summary: Miscellaneous Python libraries
5
5
  Home-page: https://github.com/RudolfCardinal/pythonlib
6
6
  Author: Rudolf Cardinal
@@ -1369,13 +1369,14 @@ def _gen_msg_content(
1369
1369
  )
1370
1370
 
1371
1371
  for attachment in message.attachments:
1372
- # null termination seen in the real world
1373
- # https://github.com/TeamMsgExtractor/msg-extractor/issues/464
1374
- ext = attachment.extension.replace("\x00", "")
1375
- if ext is not None and ext in ext_map:
1376
- yield document_to_text(
1377
- blob=attachment.data, extension=ext, config=config
1378
- )
1372
+ if (extension := getattr(attachment, "extension", None)) is not None:
1373
+ # null termination seen in the real world
1374
+ # https://github.com/TeamMsgExtractor/msg-extractor/issues/464
1375
+ extension = extension.replace("\x00", "")
1376
+ if extension in ext_map:
1377
+ yield document_to_text(
1378
+ blob=attachment.data, extension=extension, config=config
1379
+ )
1379
1380
 
1380
1381
 
1381
1382
  # =============================================================================
@@ -33,6 +33,7 @@ import subprocess
33
33
  from tempfile import mkdtemp, NamedTemporaryFile
34
34
  from unittest import mock, TestCase
35
35
 
36
+ from extract_msg import SignedAttachment
36
37
  from faker import Faker
37
38
  from faker_file.providers.docx_file import DocxFileProvider
38
39
  from faker_file.providers.eml_file import EmlFileProvider
@@ -735,3 +736,51 @@ class ConvertMsgToTextTests(ExtractTextTestCase):
735
736
  converted = convert_msg_to_text(dummy_filename, config=self.config)
736
737
 
737
738
  self.assertEqual(converted.strip(), content)
739
+
740
+ def test_attachment_with_null_extension_skipped(self) -> None:
741
+ self.fake.add_provider(DocxFileProvider)
742
+
743
+ dummy_filename = "dummy_filename.msg"
744
+
745
+ content = self.fake.paragraph(nb_sentences=10)
746
+ docx = self.fake.docx_file(content=content, raw=True)
747
+ mock_attachment = mock.Mock(
748
+ extension=None,
749
+ data=BytesIO(docx).read(),
750
+ )
751
+ mock_msgfile = mock.Mock(
752
+ body=None, htmlBody=None, attachments=[mock_attachment]
753
+ )
754
+ mock_openmsg = mock.Mock(return_value=mock_msgfile)
755
+ with mock.patch.multiple(
756
+ "cardinal_pythonlib.extract_text",
757
+ openMsg=mock_openmsg,
758
+ ):
759
+ self.config.width = 0
760
+ converted = convert_msg_to_text(dummy_filename, config=self.config)
761
+
762
+ self.assertEqual(converted.strip(), "")
763
+
764
+ def test_signed_attachment_with_no_extension_skipped(self) -> None:
765
+ self.fake.add_provider(DocxFileProvider)
766
+
767
+ dummy_filename = "dummy_filename.msg"
768
+
769
+ content = self.fake.paragraph(nb_sentences=10)
770
+ docx = self.fake.docx_file(content=content, raw=True)
771
+ mock_attachment = mock.Mock(
772
+ spec=SignedAttachment,
773
+ data=BytesIO(docx).read(),
774
+ )
775
+ mock_msgfile = mock.Mock(
776
+ body=None, htmlBody=None, attachments=[mock_attachment]
777
+ )
778
+ mock_openmsg = mock.Mock(return_value=mock_msgfile)
779
+ with mock.patch.multiple(
780
+ "cardinal_pythonlib.extract_text",
781
+ openMsg=mock_openmsg,
782
+ ):
783
+ self.config.width = 0
784
+ converted = convert_msg_to_text(dummy_filename, config=self.config)
785
+
786
+ self.assertEqual(converted.strip(), "")
@@ -31,5 +31,5 @@ For changelog, see changelog.rst
31
31
 
32
32
  """
33
33
 
34
- VERSION_STRING = "2.1.2"
34
+ VERSION_STRING = "2.1.3"
35
35
  # Use semantic versioning: https://semver.org/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cardinal-pythonlib
3
- Version: 2.1.2
3
+ Version: 2.1.3
4
4
  Summary: Miscellaneous Python libraries
5
5
  Home-page: https://github.com/RudolfCardinal/pythonlib
6
6
  Author: Rudolf Cardinal