py2docfx 0.1.15.dev2025501__py3-none-any.whl → 0.1.15.dev2038808__py3-none-any.whl

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 (597) hide show
  1. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_core_metadata.py +21 -5
  2. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +2 -0
  3. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/ccompiler.py +5 -2
  4. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/__init__.py +27 -8
  5. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build.py +1 -6
  6. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +1 -9
  7. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +1 -8
  8. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/check.py +1 -1
  9. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
  10. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/install.py +8 -17
  11. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
  12. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +8 -5
  13. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +1 -1
  14. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +15 -1
  15. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/dist.py +2 -1
  16. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/sysconfig.py +0 -10
  17. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +60 -5
  18. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +6 -0
  19. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/util.py +7 -6
  20. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_normalization.py +29 -0
  21. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +1 -1
  22. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
  23. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +2 -2
  24. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +25 -594
  25. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +6 -6
  26. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +282 -223
  27. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +22 -9
  28. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +16 -13
  29. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/util.py +0 -9
  30. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +40 -9
  31. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_wheel.py +6 -2
  32. py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +48 -11
  33. py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +31 -1
  34. py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +222 -129
  35. py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +30 -3
  36. py2docfx/venv/basevenv/Lib/site-packages/setuptools/dist.py +115 -9
  37. py2docfx/venv/basevenv/Lib/site-packages/setuptools/msvc.py +12 -3
  38. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +246 -13
  39. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +93 -8
  40. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_build_meta.py +17 -4
  41. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_core_metadata.py +45 -0
  42. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_egg_info.py +24 -4
  43. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_sdist.py +13 -1
  44. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/__init__.py +1 -1
  45. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/any_pb2.py +4 -4
  46. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/api_pb2.py +4 -4
  47. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/compiler/plugin_pb2.py +4 -4
  48. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_database.py +22 -4
  49. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_pb2.py +82 -35
  50. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/duration_pb2.py +4 -4
  51. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/empty_pb2.py +4 -4
  52. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/field_mask_pb2.py +4 -4
  53. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/builder.py +4 -3
  54. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/containers.py +13 -0
  55. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/decoder.py +62 -115
  56. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_edition_defaults.py +1 -1
  57. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_message.py +15 -18
  58. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/testing_refleaks.py +4 -1
  59. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/type_checkers.py +5 -0
  60. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/well_known_types.py +3 -3
  61. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/json_format.py +25 -9
  62. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/message.py +26 -0
  63. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/message_factory.py +0 -63
  64. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/proto.py +38 -1
  65. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/proto_text.py +129 -0
  66. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/reflection.py +0 -49
  67. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/runtime_version.py +3 -3
  68. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/source_context_pb2.py +4 -4
  69. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/struct_pb2.py +4 -4
  70. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/symbol_database.py +0 -18
  71. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/text_format.py +8 -3
  72. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/timestamp_pb2.py +4 -4
  73. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/type_pb2.py +4 -4
  74. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/unknown_fields.py +3 -4
  75. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/wrappers_pb2.py +4 -4
  76. py2docfx/venv/venv1/Lib/site-packages/msal/__init__.py +1 -1
  77. py2docfx/venv/venv1/Lib/site-packages/msal/application.py +51 -17
  78. py2docfx/venv/venv1/Lib/site-packages/msal/broker.py +18 -4
  79. py2docfx/venv/venv1/Lib/site-packages/msal/cloudshell.py +5 -1
  80. py2docfx/venv/venv1/Lib/site-packages/msal/managed_identity.py +5 -4
  81. py2docfx/venv/venv1/Lib/site-packages/msal/sku.py +6 -0
  82. py2docfx/venv/venv1/Lib/site-packages/msal/token_cache.py +31 -10
  83. py2docfx/venv/venv1/Lib/site-packages/msal_extensions/__init__.py +2 -3
  84. py2docfx/venv/venv1/Lib/site-packages/msal_extensions/cache_lock.py +4 -1
  85. py2docfx/venv/venv1/Lib/site-packages/msal_extensions/filelock.py +62 -0
  86. py2docfx/venv/venv1/Lib/site-packages/msal_extensions/libsecret.py +1 -1
  87. py2docfx/venv/venv1/Lib/site-packages/msal_extensions/token_cache.py +7 -1
  88. py2docfx/venv/venv1/Lib/site-packages/setuptools/_core_metadata.py +21 -5
  89. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +2 -0
  90. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/ccompiler.py +5 -2
  91. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/__init__.py +27 -8
  92. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build.py +1 -6
  93. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build_clib.py +1 -9
  94. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build_ext.py +1 -8
  95. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/check.py +1 -1
  96. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
  97. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/install.py +8 -17
  98. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
  99. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +8 -5
  100. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +1 -1
  101. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +15 -1
  102. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/dist.py +2 -1
  103. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/sysconfig.py +0 -10
  104. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +60 -5
  105. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/unixccompiler.py +6 -0
  106. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/util.py +7 -6
  107. py2docfx/venv/venv1/Lib/site-packages/setuptools/_normalization.py +29 -0
  108. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +1 -1
  109. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
  110. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +2 -2
  111. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +25 -594
  112. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +6 -6
  113. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +282 -223
  114. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +22 -9
  115. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +16 -13
  116. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/util.py +0 -9
  117. py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +40 -9
  118. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_wheel.py +6 -2
  119. py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +48 -11
  120. py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +31 -1
  121. py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +222 -129
  122. py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +30 -3
  123. py2docfx/venv/venv1/Lib/site-packages/setuptools/dist.py +115 -9
  124. py2docfx/venv/venv1/Lib/site-packages/setuptools/msvc.py +12 -3
  125. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +246 -13
  126. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +93 -8
  127. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_build_meta.py +17 -4
  128. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_core_metadata.py +45 -0
  129. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_egg_info.py +24 -4
  130. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_sdist.py +13 -1
  131. {py2docfx-0.1.15.dev2025501.dist-info → py2docfx-0.1.15.dev2038808.dist-info}/METADATA +1 -1
  132. {py2docfx-0.1.15.dev2025501.dist-info → py2docfx-0.1.15.dev2038808.dist-info}/RECORD +134 -590
  133. py2docfx/venv/venv1/Lib/site-packages/adodbapi/__init__.py +0 -82
  134. py2docfx/venv/venv1/Lib/site-packages/adodbapi/ado_consts.py +0 -283
  135. py2docfx/venv/venv1/Lib/site-packages/adodbapi/adodbapi.py +0 -1153
  136. py2docfx/venv/venv1/Lib/site-packages/adodbapi/apibase.py +0 -723
  137. py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/db_print.py +0 -72
  138. py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/db_table_names.py +0 -21
  139. py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/xls_read.py +0 -41
  140. py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/xls_write.py +0 -41
  141. py2docfx/venv/venv1/Lib/site-packages/adodbapi/is64bit.py +0 -34
  142. py2docfx/venv/venv1/Lib/site-packages/adodbapi/process_connect_string.py +0 -137
  143. py2docfx/venv/venv1/Lib/site-packages/adodbapi/schema_table.py +0 -16
  144. py2docfx/venv/venv1/Lib/site-packages/adodbapi/setup.py +0 -68
  145. py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/adodbapitest.py +0 -1547
  146. py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/adodbapitestconfig.py +0 -184
  147. py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/dbapi20.py +0 -879
  148. py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/is64bit.py +0 -34
  149. py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/setuptestframework.py +0 -98
  150. py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/test_adodbapi_dbapi20.py +0 -195
  151. py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/tryconnection.py +0 -30
  152. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/_parameterized.py +0 -420
  153. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/service.py +0 -213
  154. py2docfx/venv/venv1/Lib/site-packages/isapi/__init__.py +0 -39
  155. py2docfx/venv/venv1/Lib/site-packages/isapi/install.py +0 -809
  156. py2docfx/venv/venv1/Lib/site-packages/isapi/isapicon.py +0 -121
  157. py2docfx/venv/venv1/Lib/site-packages/isapi/samples/advanced.py +0 -218
  158. py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector.py +0 -116
  159. py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector_asynch.py +0 -85
  160. py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector_with_filter.py +0 -162
  161. py2docfx/venv/venv1/Lib/site-packages/isapi/samples/test.py +0 -195
  162. py2docfx/venv/venv1/Lib/site-packages/isapi/simple.py +0 -73
  163. py2docfx/venv/venv1/Lib/site-packages/isapi/test/extension_simple.py +0 -114
  164. py2docfx/venv/venv1/Lib/site-packages/isapi/threaded_extension.py +0 -191
  165. py2docfx/venv/venv1/Lib/site-packages/portalocker/__about__.py +0 -6
  166. py2docfx/venv/venv1/Lib/site-packages/portalocker/__init__.py +0 -79
  167. py2docfx/venv/venv1/Lib/site-packages/portalocker/__main__.py +0 -122
  168. py2docfx/venv/venv1/Lib/site-packages/portalocker/constants.py +0 -59
  169. py2docfx/venv/venv1/Lib/site-packages/portalocker/exceptions.py +0 -27
  170. py2docfx/venv/venv1/Lib/site-packages/portalocker/portalocker.py +0 -154
  171. py2docfx/venv/venv1/Lib/site-packages/portalocker/redis.py +0 -236
  172. py2docfx/venv/venv1/Lib/site-packages/portalocker/utils.py +0 -569
  173. py2docfx/venv/venv1/Lib/site-packages/pythoncom.py +0 -4
  174. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/basictimerapp.py +0 -258
  175. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/customprint.py +0 -183
  176. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/demoutils.py +0 -63
  177. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/dlgappdemo.py +0 -51
  178. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/dojobapp.py +0 -71
  179. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/helloapp.py +0 -53
  180. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/cmdserver.py +0 -113
  181. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/createwin.py +0 -114
  182. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/demoutils.py +0 -65
  183. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dibdemo.py +0 -73
  184. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dlgtest.py +0 -145
  185. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dyndlg.py +0 -104
  186. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/fontdemo.py +0 -85
  187. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/guidemo.py +0 -53
  188. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/hiertest.py +0 -138
  189. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/menutest.py +0 -13
  190. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/objdoc.py +0 -57
  191. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/demoutils.py +0 -63
  192. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/flash.py +0 -95
  193. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/msoffice.py +0 -159
  194. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/ocxserialtest.py +0 -132
  195. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/ocxtest.py +0 -243
  196. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/webbrowser.py +0 -72
  197. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/openGLDemo.py +0 -415
  198. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/progressbar.py +0 -105
  199. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/sliderdemo.py +0 -76
  200. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/splittst.py +0 -79
  201. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/threadedgui.py +0 -189
  202. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/toolbar.py +0 -105
  203. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/__init__.py +0 -3
  204. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/__init__.py +0 -133
  205. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/configui.py +0 -34
  206. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/dbgcon.py +0 -31
  207. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/dbgpyapp.py +0 -48
  208. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/debugger.py +0 -1097
  209. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/fail.py +0 -54
  210. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/__init__.py +0 -0
  211. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/ideoptions.py +0 -136
  212. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/list.py +0 -146
  213. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/login.py +0 -155
  214. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/status.py +0 -242
  215. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/docking/DockingBar.py +0 -676
  216. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/docking/__init__.py +0 -0
  217. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/__init__.py +0 -0
  218. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/app.py +0 -411
  219. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/bitmap.py +0 -168
  220. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/cmdline.py +0 -54
  221. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/dbgcommands.py +0 -188
  222. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/dlgappcore.py +0 -76
  223. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/ModuleBrowser.py +0 -235
  224. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/__init__.py +0 -105
  225. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/color/__init__.py +0 -0
  226. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/color/coloreditor.py +0 -646
  227. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/configui.py +0 -299
  228. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/document.py +0 -379
  229. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/editor.py +0 -511
  230. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/frame.py +0 -74
  231. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/template.py +0 -59
  232. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/vss.py +0 -104
  233. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/help.py +0 -173
  234. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/interact.py +0 -995
  235. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/intpyapp.py +0 -552
  236. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/intpydde.py +0 -65
  237. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/scriptutils.py +0 -684
  238. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/sgrepmdi.py +0 -749
  239. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/startup.py +0 -70
  240. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/stdin.py +0 -172
  241. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/toolmenu.py +0 -279
  242. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/window.py +0 -14
  243. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/winout.py +0 -589
  244. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/AutoExpand.py +0 -95
  245. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/AutoIndent.py +0 -536
  246. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/CallTips.py +0 -216
  247. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/FormatParagraph.py +0 -166
  248. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/IdleHistory.py +0 -87
  249. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/PyParse.py +0 -585
  250. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/__init__.py +0 -1
  251. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/__init__.py +0 -0
  252. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/activex.py +0 -79
  253. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/afxres.py +0 -501
  254. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/dialog.py +0 -277
  255. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/docview.py +0 -151
  256. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/object.py +0 -66
  257. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/thread.py +0 -25
  258. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/window.py +0 -50
  259. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/IDLEenvironment.py +0 -593
  260. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/__init__.py +0 -1
  261. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/bindings.py +0 -180
  262. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/config.py +0 -363
  263. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/configui.py +0 -291
  264. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/control.py +0 -565
  265. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/document.py +0 -312
  266. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/find.py +0 -511
  267. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/formatter.py +0 -704
  268. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/keycodes.py +0 -190
  269. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/scintillacon.py +0 -3083
  270. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/view.py +0 -841
  271. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/TraceCollector.py +0 -79
  272. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/__init__.py +0 -0
  273. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/browseProjects.py +0 -323
  274. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/browser.py +0 -494
  275. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/hierlist.py +0 -353
  276. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/regedit.py +0 -382
  277. py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/regpy.py +0 -80
  278. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/BackupRead_BackupWrite.py +0 -119
  279. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/BackupSeek_streamheaders.py +0 -137
  280. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/CopyFileEx.py +0 -57
  281. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/CreateFileTransacted_MiniVersion.py +0 -122
  282. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtFormatMessage.py +0 -83
  283. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtSubscribe_pull.py +0 -28
  284. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtSubscribe_push.py +0 -32
  285. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/FileSecurityTest.py +0 -137
  286. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/GetSaveFileName.py +0 -43
  287. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/NetValidatePasswordPolicy.py +0 -127
  288. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/OpenEncryptedFileRaw.py +0 -66
  289. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/RegCreateKeyTransacted.py +0 -60
  290. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/RegRestoreKey.py +0 -71
  291. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/SystemParametersInfo.py +0 -210
  292. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/c_extension/setup.py +0 -26
  293. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/dde/ddeclient.py +0 -18
  294. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/dde/ddeserver.py +0 -42
  295. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/desktopmanager.py +0 -246
  296. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/eventLogDemo.py +0 -143
  297. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/getfilever.py +0 -33
  298. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/mmapfile_demo.py +0 -101
  299. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/pipes/cat.py +0 -17
  300. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/pipes/runproc.py +0 -114
  301. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/print_desktop.py +0 -113
  302. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/rastest.py +0 -166
  303. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/GetTokenInformation.py +0 -110
  304. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/account_rights.py +0 -49
  305. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/explicit_entries.py +0 -170
  306. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/get_policy_info.py +0 -39
  307. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/list_rights.py +0 -35
  308. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/localized_names.py +0 -70
  309. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/lsaregevent.py +0 -14
  310. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/lsastore.py +0 -12
  311. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/query_information.py +0 -25
  312. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/regsave_sa.py +0 -61
  313. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/regsecurity.py +0 -36
  314. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sa_inherit.py +0 -8
  315. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/security_enums.py +0 -336
  316. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_file_audit.py +0 -106
  317. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_file_owner.py +0 -73
  318. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_policy_info.py +0 -25
  319. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setkernelobjectsecurity.py +0 -134
  320. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setnamedsecurityinfo.py +0 -131
  321. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setsecurityinfo.py +0 -131
  322. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setuserobjectsecurity.py +0 -102
  323. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/fetch_url.py +0 -158
  324. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/simple_auth.py +0 -72
  325. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/socket_server.py +0 -199
  326. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/validate_password.py +0 -41
  327. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/nativePipeTestService.py +0 -63
  328. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/pipeTestService.py +0 -185
  329. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/pipeTestServiceClient.py +0 -158
  330. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/serviceEvents.py +0 -98
  331. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/timer_demo.py +0 -72
  332. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32clipboardDemo.py +0 -155
  333. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32clipboard_bitmapdemo.py +0 -117
  334. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32comport_demo.py +0 -174
  335. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32console_demo.py +0 -132
  336. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32cred_demo.py +0 -82
  337. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32fileDemo.py +0 -41
  338. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_demo.py +0 -177
  339. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_devicenotify.py +0 -106
  340. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_dialog.py +0 -445
  341. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_menu.py +0 -464
  342. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_taskbar.py +0 -136
  343. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32netdemo.py +0 -272
  344. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32rcparser_demo.py +0 -86
  345. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32servicedemo.py +0 -23
  346. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32ts_logoff_disconnected.py +0 -25
  347. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32wnet/testwnet.py +0 -123
  348. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32wnet/winnetwk.py +0 -100
  349. py2docfx/venv/venv1/Lib/site-packages/win32/Demos/winprocess.py +0 -230
  350. py2docfx/venv/venv1/Lib/site-packages/win32/lib/_win32verstamp_pywin32ctypes.py +0 -164
  351. py2docfx/venv/venv1/Lib/site-packages/win32/lib/afxres.py +0 -8
  352. py2docfx/venv/venv1/Lib/site-packages/win32/lib/commctrl.py +0 -1551
  353. py2docfx/venv/venv1/Lib/site-packages/win32/lib/mmsystem.py +0 -956
  354. py2docfx/venv/venv1/Lib/site-packages/win32/lib/netbios.py +0 -293
  355. py2docfx/venv/venv1/Lib/site-packages/win32/lib/ntsecuritycon.py +0 -731
  356. py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywin32_bootstrap.py +0 -21
  357. py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywin32_testutil.py +0 -291
  358. py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywintypes.py +0 -124
  359. py2docfx/venv/venv1/Lib/site-packages/win32/lib/rasutil.py +0 -40
  360. py2docfx/venv/venv1/Lib/site-packages/win32/lib/regcheck.py +0 -161
  361. py2docfx/venv/venv1/Lib/site-packages/win32/lib/regutil.py +0 -395
  362. py2docfx/venv/venv1/Lib/site-packages/win32/lib/sspi.py +0 -413
  363. py2docfx/venv/venv1/Lib/site-packages/win32/lib/sspicon.py +0 -477
  364. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win2kras.py +0 -14
  365. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32con.py +0 -5064
  366. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32cryptcon.py +0 -1922
  367. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32evtlogutil.py +0 -225
  368. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32gui_struct.py +0 -957
  369. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32inetcon.py +0 -1086
  370. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32netcon.py +0 -627
  371. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32pdhquery.py +0 -570
  372. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32pdhutil.py +0 -212
  373. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32rcparser.py +0 -674
  374. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32serviceutil.py +0 -1073
  375. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32timezone.py +0 -1201
  376. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32traceutil.py +0 -59
  377. py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32verstamp.py +0 -235
  378. py2docfx/venv/venv1/Lib/site-packages/win32/lib/winerror.py +0 -7362
  379. py2docfx/venv/venv1/Lib/site-packages/win32/lib/winioctlcon.py +0 -1079
  380. py2docfx/venv/venv1/Lib/site-packages/win32/lib/winnt.py +0 -1347
  381. py2docfx/venv/venv1/Lib/site-packages/win32/lib/winperf.py +0 -236
  382. py2docfx/venv/venv1/Lib/site-packages/win32/lib/winxptheme.py +0 -8
  383. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/ControlService.py +0 -594
  384. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/BrandProject.py +0 -97
  385. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/bulkstamp.py +0 -156
  386. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/vssutil.py +0 -201
  387. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/backupEventLog.py +0 -46
  388. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/h2py.py +0 -194
  389. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/killProcName.py +0 -62
  390. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/pywin32_postinstall.py +0 -733
  391. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/pywin32_testall.py +0 -120
  392. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/rasutil.py +0 -98
  393. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/regsetup.py +0 -607
  394. py2docfx/venv/venv1/Lib/site-packages/win32/scripts/setup_d.py +0 -111
  395. py2docfx/venv/venv1/Lib/site-packages/win32/test/handles.py +0 -175
  396. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_clipboard.py +0 -137
  397. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_exceptions.py +0 -213
  398. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_odbc.py +0 -264
  399. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_pywintypes.py +0 -111
  400. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_security.py +0 -166
  401. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_sspi.py +0 -229
  402. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32api.py +0 -273
  403. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32clipboard.py +0 -59
  404. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32cred.py +0 -91
  405. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32crypt.py +0 -144
  406. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32event.py +0 -119
  407. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32file.py +0 -1096
  408. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32gui.py +0 -227
  409. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32guistruct.py +0 -333
  410. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32inet.py +0 -108
  411. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32net.py +0 -23
  412. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32pipe.py +0 -148
  413. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32print.py +0 -24
  414. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32profile.py +0 -19
  415. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32rcparser.py +0 -70
  416. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32timezone.py +0 -16
  417. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32trace.py +0 -366
  418. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32ts.py +0 -19
  419. py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32wnet.py +0 -174
  420. py2docfx/venv/venv1/Lib/site-packages/win32/test/testall.py +0 -223
  421. py2docfx/venv/venv1/Lib/site-packages/win32/winxpgui.py +0 -13
  422. py2docfx/venv/venv1/Lib/site-packages/win32com/__init__.py +0 -134
  423. py2docfx/venv/venv1/Lib/site-packages/win32com/client/CLSIDToClass.py +0 -60
  424. py2docfx/venv/venv1/Lib/site-packages/win32com/client/__init__.py +0 -717
  425. py2docfx/venv/venv1/Lib/site-packages/win32com/client/build.py +0 -771
  426. py2docfx/venv/venv1/Lib/site-packages/win32com/client/combrowse.py +0 -604
  427. py2docfx/venv/venv1/Lib/site-packages/win32com/client/connect.py +0 -48
  428. py2docfx/venv/venv1/Lib/site-packages/win32com/client/dynamic.py +0 -699
  429. py2docfx/venv/venv1/Lib/site-packages/win32com/client/gencache.py +0 -825
  430. py2docfx/venv/venv1/Lib/site-packages/win32com/client/genpy.py +0 -1350
  431. py2docfx/venv/venv1/Lib/site-packages/win32com/client/makepy.py +0 -453
  432. py2docfx/venv/venv1/Lib/site-packages/win32com/client/selecttlb.py +0 -182
  433. py2docfx/venv/venv1/Lib/site-packages/win32com/client/tlbrowse.py +0 -277
  434. py2docfx/venv/venv1/Lib/site-packages/win32com/client/util.py +0 -103
  435. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/__init__.py +0 -0
  436. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/connect.py +0 -96
  437. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/dump_clipboard.py +0 -74
  438. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/eventsApartmentThreaded.py +0 -98
  439. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/eventsFreeThreaded.py +0 -92
  440. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/excelAddin.py +0 -169
  441. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/excelRTDServer.py +0 -434
  442. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/iebutton.py +0 -214
  443. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/ietoolbar.py +0 -368
  444. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/outlookAddin.py +0 -135
  445. py2docfx/venv/venv1/Lib/site-packages/win32com/demos/trybag.py +0 -78
  446. py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/__init__.py +0 -1
  447. py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegw.py +0 -618
  448. py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegwenum.py +0 -331
  449. py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegwparse.py +0 -1017
  450. py2docfx/venv/venv1/Lib/site-packages/win32com/olectl.py +0 -70
  451. py2docfx/venv/venv1/Lib/site-packages/win32com/server/__init__.py +0 -1
  452. py2docfx/venv/venv1/Lib/site-packages/win32com/server/connect.py +0 -85
  453. py2docfx/venv/venv1/Lib/site-packages/win32com/server/dispatcher.py +0 -239
  454. py2docfx/venv/venv1/Lib/site-packages/win32com/server/exception.py +0 -99
  455. py2docfx/venv/venv1/Lib/site-packages/win32com/server/factory.py +0 -26
  456. py2docfx/venv/venv1/Lib/site-packages/win32com/server/localserver.py +0 -53
  457. py2docfx/venv/venv1/Lib/site-packages/win32com/server/policy.py +0 -803
  458. py2docfx/venv/venv1/Lib/site-packages/win32com/server/register.py +0 -677
  459. py2docfx/venv/venv1/Lib/site-packages/win32com/server/util.py +0 -229
  460. py2docfx/venv/venv1/Lib/site-packages/win32com/servers/PythonTools.py +0 -47
  461. py2docfx/venv/venv1/Lib/site-packages/win32com/servers/__init__.py +0 -0
  462. py2docfx/venv/venv1/Lib/site-packages/win32com/servers/dictionary.py +0 -133
  463. py2docfx/venv/venv1/Lib/site-packages/win32com/servers/interp.py +0 -59
  464. py2docfx/venv/venv1/Lib/site-packages/win32com/servers/perfmon.py +0 -36
  465. py2docfx/venv/venv1/Lib/site-packages/win32com/servers/test_pycomtest.py +0 -181
  466. py2docfx/venv/venv1/Lib/site-packages/win32com/storagecon.py +0 -142
  467. py2docfx/venv/venv1/Lib/site-packages/win32com/test/GenTestScripts.py +0 -95
  468. py2docfx/venv/venv1/Lib/site-packages/win32com/test/__init__.py +0 -1
  469. py2docfx/venv/venv1/Lib/site-packages/win32com/test/daodump.py +0 -88
  470. py2docfx/venv/venv1/Lib/site-packages/win32com/test/errorSemantics.py +0 -243
  471. py2docfx/venv/venv1/Lib/site-packages/win32com/test/pippo_server.py +0 -96
  472. py2docfx/venv/venv1/Lib/site-packages/win32com/test/policySemantics.py +0 -115
  473. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testADOEvents.py +0 -100
  474. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testAXScript.py +0 -44
  475. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testAccess.py +0 -185
  476. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testArrays.py +0 -99
  477. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testClipboard.py +0 -169
  478. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testCollections.py +0 -159
  479. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testConversionErrors.py +0 -35
  480. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDCOM.py +0 -50
  481. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDates.py +0 -74
  482. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDictionary.py +0 -101
  483. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDynamic.py +0 -83
  484. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testExchange.py +0 -121
  485. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testExplorer.py +0 -139
  486. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testGIT.py +0 -142
  487. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testGatewayAddresses.py +0 -149
  488. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testIterators.py +0 -140
  489. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMSOffice.py +0 -184
  490. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMSOfficeEvents.py +0 -138
  491. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMarshal.py +0 -160
  492. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPersist.py +0 -227
  493. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPippo.py +0 -80
  494. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPyComTest.py +0 -918
  495. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testROT.py +0 -29
  496. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testServers.py +0 -51
  497. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testShell.py +0 -272
  498. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testStorage.py +0 -88
  499. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testStreams.py +0 -147
  500. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testWMI.py +0 -18
  501. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testall.py +0 -320
  502. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testmakepy.py +0 -54
  503. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testvb.py +0 -583
  504. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testvbscript_regexp.py +0 -40
  505. py2docfx/venv/venv1/Lib/site-packages/win32com/test/testxslt.py +0 -34
  506. py2docfx/venv/venv1/Lib/site-packages/win32com/test/util.py +0 -262
  507. py2docfx/venv/venv1/Lib/site-packages/win32com/universal.py +0 -224
  508. py2docfx/venv/venv1/Lib/site-packages/win32com/util.py +0 -35
  509. py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/__init__.py +0 -113
  510. py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/adsicon.py +0 -340
  511. py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/objectPicker.py +0 -68
  512. py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/scp.py +0 -565
  513. py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/search.py +0 -151
  514. py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/test.py +0 -274
  515. py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/__init__.py +0 -6
  516. py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/demos/EditSecurity.py +0 -229
  517. py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/demos/EditServiceSecurity.py +0 -219
  518. py2docfx/venv/venv1/Lib/site-packages/win32comext/axcontrol/__init__.py +0 -4
  519. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/__init__.py +0 -4
  520. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/adb.py +0 -467
  521. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/codecontainer.py +0 -279
  522. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/contexts.py +0 -58
  523. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/debugger.py +0 -238
  524. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/documents.py +0 -135
  525. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/dump.py +0 -57
  526. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/expressions.py +0 -212
  527. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/gateways.py +0 -583
  528. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/stackframe.py +0 -178
  529. py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/util.py +0 -98
  530. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/__init__.py +0 -4
  531. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/asputil.py +0 -13
  532. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/__init__.py +0 -1
  533. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/debug.py +0 -223
  534. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/error.py +0 -262
  535. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/framework.py +0 -1291
  536. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pydumper.py +0 -78
  537. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pyscript.py +0 -438
  538. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pyscript_rexec.py +0 -54
  539. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/scriptdispatch.py +0 -103
  540. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/server/__init__.py +0 -0
  541. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/server/axsite.py +0 -145
  542. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/leakTest.py +0 -185
  543. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/testHost.py +0 -240
  544. py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/testHost4Dbg.py +0 -83
  545. py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/__init__.py +0 -6
  546. py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/test/show_all_jobs.py +0 -48
  547. py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/test/test_bits.py +0 -119
  548. py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/__init__.py +0 -4
  549. py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/__init__.py +0 -1
  550. py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/ds_record.py +0 -60
  551. py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/ds_test.py +0 -402
  552. py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/__init__.py +0 -1
  553. py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/demo/filterDemo.py +0 -300
  554. py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/ifiltercon.py +0 -110
  555. py2docfx/venv/venv1/Lib/site-packages/win32comext/internet/__init__.py +0 -4
  556. py2docfx/venv/venv1/Lib/site-packages/win32comext/internet/inetcon.py +0 -261
  557. py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/__init__.py +0 -21
  558. py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/demos/mapisend.py +0 -98
  559. py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/emsabtags.py +0 -875
  560. py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/mapitags.py +0 -1023
  561. py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/mapiutil.py +0 -211
  562. py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/__init__.py +0 -1
  563. py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/pscon.py +0 -838
  564. py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/test/testpropsys.py +0 -5
  565. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/__init__.py +0 -4
  566. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IActiveDesktop.py +0 -83
  567. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IFileOperationProgressSink.py +0 -179
  568. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IShellLinkDataList.py +0 -67
  569. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/ITransferAdviseSink.py +0 -93
  570. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IUniformResourceLocator.py +0 -56
  571. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/browse_for_folder.py +0 -45
  572. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/create_link.py +0 -73
  573. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/dump_link.py +0 -58
  574. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/explorer_browser.py +0 -143
  575. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/column_provider.py +0 -125
  576. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/context_menu.py +0 -122
  577. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/copy_hook.py +0 -84
  578. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/empty_volume_cache.py +0 -188
  579. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/folder_view.py +0 -866
  580. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/icon_handler.py +0 -81
  581. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/shell_view.py +0 -971
  582. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/shellexecuteex.py +0 -19
  583. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/viewstate.py +0 -68
  584. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/walk_shell_folders.py +0 -24
  585. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/shellcon.py +0 -1615
  586. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testSHFileOperation.py +0 -75
  587. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testShellFolder.py +0 -21
  588. py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testShellItem.py +0 -69
  589. py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/__init__.py +0 -6
  590. py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask.py +0 -66
  591. py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask_1.py +0 -68
  592. py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask_2.py +0 -49
  593. py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_localsystem.py +0 -3
  594. py2docfx/venv/venv1/Scripts/pywin32_postinstall.py +0 -733
  595. py2docfx/venv/venv1/Scripts/pywin32_testall.py +0 -120
  596. {py2docfx-0.1.15.dev2025501.dist-info → py2docfx-0.1.15.dev2038808.dist-info}/WHEEL +0 -0
  597. {py2docfx-0.1.15.dev2025501.dist-info → py2docfx-0.1.15.dev2038808.dist-info}/top_level.txt +0 -0
@@ -1,1547 +0,0 @@
1
- """Unit tests version 2.6.1.0 for adodbapi"""
2
-
3
- """
4
- adodbapi - A python DB API 2.0 interface to Microsoft ADO
5
-
6
- Copyright (C) 2002 Henrik Ekelund
7
-
8
- This library is free software; you can redistribute it and/or
9
- modify it under the terms of the GNU Lesser General Public
10
- License as published by the Free Software Foundation; either
11
- version 2.1 of the License, or (at your option) any later version.
12
-
13
- This library is distributed in the hope that it will be useful,
14
- but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
- Lesser General Public License for more details.
17
-
18
- You should have received a copy of the GNU Lesser General Public
19
- License along with this library; if not, write to the Free Software
20
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
-
22
- Updates by Vernon Cole
23
- """
24
-
25
- import copy
26
- import datetime
27
- import decimal
28
- import random
29
- import string
30
- import time
31
- import unittest
32
-
33
- import adodbapitestconfig as config # run the configuration module. # will set sys.path to find correct version of adodbapi
34
- import tryconnection # in our code below, all our switches are from config.whatever
35
-
36
- import adodbapi
37
- import adodbapi.apibase as api
38
-
39
-
40
- def randomstring(length):
41
- return "".join([random.choice(string.ascii_letters) for n in range(32)])
42
-
43
-
44
- class CommonDBTests(unittest.TestCase):
45
- "Self contained super-simple tests in easy syntax, should work on everything between mySQL and Oracle"
46
-
47
- def setUp(self):
48
- self.engine = "unknown"
49
-
50
- def getEngine(self):
51
- return self.engine
52
-
53
- def getConnection(self):
54
- raise NotImplementedError # "This method must be overriden by a subclass"
55
-
56
- def getCursor(self):
57
- return self.getConnection().cursor()
58
-
59
- def testConnection(self):
60
- crsr = self.getCursor()
61
- assert crsr.__class__.__name__ == "Cursor"
62
-
63
- def testErrorHandlerInherits(self):
64
- conn = self.getConnection()
65
- mycallable = lambda connection, cursor, errorclass, errorvalue: 1
66
- conn.errorhandler = mycallable
67
- crsr = conn.cursor()
68
- assert (
69
- crsr.errorhandler == mycallable
70
- ), "Error handler on crsr should be same as on connection"
71
-
72
- def testDefaultErrorHandlerConnection(self):
73
- conn = self.getConnection()
74
- del conn.messages[:]
75
- try:
76
- conn.close()
77
- conn.commit() # Should not be able to use connection after it is closed
78
- except:
79
- assert len(conn.messages) == 1
80
- assert len(conn.messages[0]) == 2
81
- assert conn.messages[0][0] == api.ProgrammingError
82
-
83
- def testOwnErrorHandlerConnection(self):
84
- mycallable = (
85
- lambda connection, cursor, errorclass, errorvalue: 1
86
- ) # does not raise anything
87
- conn = self.getConnection()
88
- conn.errorhandler = mycallable
89
- conn.close()
90
- conn.commit() # Should not be able to use connection after it is closed
91
- assert len(conn.messages) == 0
92
-
93
- conn.errorhandler = None # This should bring back the standard error handler
94
- try:
95
- conn.close()
96
- conn.commit() # Should not be able to use connection after it is closed
97
- except:
98
- pass
99
- # The Standard errorhandler appends error to messages attribute
100
- assert (
101
- len(conn.messages) > 0
102
- ), "Setting errorhandler to none should bring back the standard error handler"
103
-
104
- def testDefaultErrorHandlerCursor(self):
105
- crsr = self.getConnection().cursor()
106
- del crsr.messages[:]
107
- try:
108
- crsr.execute("SELECT abbtytddrf FROM dasdasd")
109
- except:
110
- assert len(crsr.messages) == 1
111
- assert len(crsr.messages[0]) == 2
112
- assert crsr.messages[0][0] == api.DatabaseError
113
-
114
- def testOwnErrorHandlerCursor(self):
115
- mycallable = (
116
- lambda connection, cursor, errorclass, errorvalue: 1
117
- ) # does not raise anything
118
- crsr = self.getConnection().cursor()
119
- crsr.errorhandler = mycallable
120
- crsr.execute("SELECT abbtytddrf FROM dasdasd")
121
- assert len(crsr.messages) == 0
122
-
123
- crsr.errorhandler = None # This should bring back the standard error handler
124
- try:
125
- crsr.execute("SELECT abbtytddrf FROM dasdasd")
126
- except:
127
- pass
128
- # The Standard errorhandler appends error to messages attribute
129
- assert (
130
- len(crsr.messages) > 0
131
- ), "Setting errorhandler to none should bring back the standard error handler"
132
-
133
- def testUserDefinedConversions(self):
134
- try:
135
- duplicatingConverter = lambda aStringField: aStringField * 2
136
- assert duplicatingConverter("gabba") == "gabbagabba"
137
-
138
- self.helpForceDropOnTblTemp()
139
- conn = self.getConnection()
140
- # the variantConversions attribute should not exist on a normal connection object
141
- self.assertRaises(AttributeError, lambda x: conn.variantConversions[x], [2])
142
- # create a variantConversions attribute on the connection
143
- conn.variantConversions = copy.copy(api.variantConversions)
144
- crsr = conn.cursor()
145
- tabdef = (
146
- "CREATE TABLE xx_%s (fldData VARCHAR(100) NOT NULL, fld2 VARCHAR(20))"
147
- % config.tmp
148
- )
149
- crsr.execute(tabdef)
150
- crsr.execute(
151
- "INSERT INTO xx_%s(fldData,fld2) VALUES('gabba','booga')" % config.tmp
152
- )
153
- crsr.execute(
154
- "INSERT INTO xx_%s(fldData,fld2) VALUES('hey','yo')" % config.tmp
155
- )
156
- # change converter for ALL adoStringTypes columns
157
- conn.variantConversions[api.adoStringTypes] = duplicatingConverter
158
- crsr.execute("SELECT fldData,fld2 FROM xx_%s ORDER BY fldData" % config.tmp)
159
-
160
- rows = crsr.fetchall()
161
- row = rows[0]
162
- self.assertEqual(row[0], "gabbagabba")
163
- row = rows[1]
164
- self.assertEqual(row[0], "heyhey")
165
- self.assertEqual(row[1], "yoyo")
166
-
167
- upcaseConverter = lambda aStringField: aStringField.upper()
168
- assert upcaseConverter("upThis") == "UPTHIS"
169
-
170
- # now use a single column converter
171
- rows.converters[1] = upcaseConverter # convert second column
172
- self.assertEqual(row[0], "heyhey") # first will be unchanged
173
- self.assertEqual(row[1], "YO") # second will convert to upper case
174
-
175
- finally:
176
- try:
177
- del conn.variantConversions # Restore the default
178
- except:
179
- pass
180
- self.helpRollbackTblTemp()
181
-
182
- def helpTestDataType(
183
- self,
184
- sqlDataTypeString,
185
- DBAPIDataTypeString,
186
- pyData,
187
- pyDataInputAlternatives=None,
188
- compareAlmostEqual=None,
189
- allowedReturnValues=None,
190
- ):
191
- self.helpForceDropOnTblTemp()
192
- conn = self.getConnection()
193
- crsr = conn.cursor()
194
- tabdef = (
195
- """
196
- CREATE TABLE xx_%s (
197
- fldId integer NOT NULL,
198
- fldData """
199
- % config.tmp
200
- + sqlDataTypeString
201
- + ")\n"
202
- )
203
-
204
- crsr.execute(tabdef)
205
-
206
- # Test Null values mapped to None
207
- crsr.execute("INSERT INTO xx_%s (fldId) VALUES (1)" % config.tmp)
208
-
209
- crsr.execute("SELECT fldId,fldData FROM xx_%s" % config.tmp)
210
- rs = crsr.fetchone()
211
- self.assertEqual(rs[1], None) # Null should be mapped to None
212
- assert rs[0] == 1
213
-
214
- # Test description related
215
- descTuple = crsr.description[1]
216
- assert descTuple[0] in ["fldData", "flddata"], 'was "%s" expected "%s"' % (
217
- descTuple[0],
218
- "fldData",
219
- )
220
-
221
- if DBAPIDataTypeString == "STRING":
222
- assert descTuple[1] == api.STRING, 'was "%s" expected "%s"' % (
223
- descTuple[1],
224
- api.STRING.values,
225
- )
226
- elif DBAPIDataTypeString == "NUMBER":
227
- assert descTuple[1] == api.NUMBER, 'was "%s" expected "%s"' % (
228
- descTuple[1],
229
- api.NUMBER.values,
230
- )
231
- elif DBAPIDataTypeString == "BINARY":
232
- assert descTuple[1] == api.BINARY, 'was "%s" expected "%s"' % (
233
- descTuple[1],
234
- api.BINARY.values,
235
- )
236
- elif DBAPIDataTypeString == "DATETIME":
237
- assert descTuple[1] == api.DATETIME, 'was "%s" expected "%s"' % (
238
- descTuple[1],
239
- api.DATETIME.values,
240
- )
241
- elif DBAPIDataTypeString == "ROWID":
242
- assert descTuple[1] == api.ROWID, 'was "%s" expected "%s"' % (
243
- descTuple[1],
244
- api.ROWID.values,
245
- )
246
- elif DBAPIDataTypeString == "UUID":
247
- assert descTuple[1] == api.OTHER, 'was "%s" expected "%s"' % (
248
- descTuple[1],
249
- api.OTHER.values,
250
- )
251
- else:
252
- raise NotImplementedError # "DBAPIDataTypeString not provided"
253
-
254
- # Test data binding
255
- inputs = [pyData]
256
- if pyDataInputAlternatives:
257
- inputs.extend(pyDataInputAlternatives)
258
- inputs = set(inputs) # removes redundant string==unicode tests
259
- fldId = 1
260
- for inParam in inputs:
261
- fldId += 1
262
- try:
263
- crsr.execute(
264
- "INSERT INTO xx_%s (fldId,fldData) VALUES (?,?)" % config.tmp,
265
- (fldId, inParam),
266
- )
267
- except:
268
- conn.printADOerrors()
269
- raise
270
- crsr.execute(
271
- "SELECT fldData FROM xx_%s WHERE ?=fldID" % config.tmp, [fldId]
272
- )
273
- rs = crsr.fetchone()
274
- if allowedReturnValues:
275
- allowedTypes = tuple([type(aRV) for aRV in allowedReturnValues])
276
- assert isinstance(rs[0], allowedTypes), (
277
- 'result type "%s" must be one of %s' % (type(rs[0]), allowedTypes)
278
- )
279
- else:
280
- assert isinstance(rs[0], type(pyData)), (
281
- 'result type "%s" must be instance of %s'
282
- % (
283
- type(rs[0]),
284
- type(pyData),
285
- )
286
- )
287
-
288
- if compareAlmostEqual and DBAPIDataTypeString == "DATETIME":
289
- iso1 = adodbapi.dateconverter.DateObjectToIsoFormatString(rs[0])
290
- iso2 = adodbapi.dateconverter.DateObjectToIsoFormatString(pyData)
291
- self.assertEqual(iso1, iso2)
292
- elif compareAlmostEqual:
293
- s = float(pyData)
294
- v = float(rs[0])
295
- assert abs(v - s) / s < 0.00001, (
296
- "Values not almost equal recvd=%s, expected=%f" % (rs[0], s)
297
- )
298
- else:
299
- if allowedReturnValues:
300
- ok = False
301
- self.assertTrue(
302
- rs[0] in allowedReturnValues,
303
- f'Value "{rs[0]!r}" not in {allowedReturnValues}',
304
- )
305
- else:
306
- self.assertEqual(
307
- rs[0],
308
- pyData,
309
- 'Values are not equal recvd="%s", expected="%s"'
310
- % (rs[0], pyData),
311
- )
312
-
313
- def testDataTypeFloat(self):
314
- self.helpTestDataType("real", "NUMBER", 3.45, compareAlmostEqual=True)
315
- self.helpTestDataType("float", "NUMBER", 1.79e37, compareAlmostEqual=True)
316
-
317
- def testDataTypeDecmal(self):
318
- self.helpTestDataType(
319
- "decimal(18,2)",
320
- "NUMBER",
321
- 3.45,
322
- allowedReturnValues=["3.45", "3,45", decimal.Decimal("3.45")],
323
- )
324
- self.helpTestDataType(
325
- "numeric(18,2)",
326
- "NUMBER",
327
- 3.45,
328
- allowedReturnValues=["3.45", "3,45", decimal.Decimal("3.45")],
329
- )
330
- self.helpTestDataType(
331
- "decimal(20,2)",
332
- "NUMBER",
333
- 444444444444444444,
334
- allowedReturnValues=[
335
- "444444444444444444.00",
336
- "444444444444444444,00",
337
- decimal.Decimal("444444444444444444"),
338
- ],
339
- )
340
- if self.getEngine() == "MSSQL":
341
- self.helpTestDataType(
342
- "uniqueidentifier",
343
- "UUID",
344
- "{71A4F49E-39F3-42B1-A41E-48FF154996E6}",
345
- allowedReturnValues=["{71A4F49E-39F3-42B1-A41E-48FF154996E6}"],
346
- )
347
-
348
- def testDataTypeMoney(self): # v2.1 Cole -- use decimal for money
349
- if self.getEngine() == "MySQL":
350
- self.helpTestDataType(
351
- "DECIMAL(20,4)", "NUMBER", decimal.Decimal("-922337203685477.5808")
352
- )
353
- elif self.getEngine() == "PostgreSQL":
354
- self.helpTestDataType(
355
- "money",
356
- "NUMBER",
357
- decimal.Decimal("-922337203685477.5808"),
358
- compareAlmostEqual=True,
359
- allowedReturnValues=[
360
- -922337203685477.5808,
361
- decimal.Decimal("-922337203685477.5808"),
362
- ],
363
- )
364
- else:
365
- self.helpTestDataType("smallmoney", "NUMBER", decimal.Decimal("214748.02"))
366
- self.helpTestDataType(
367
- "money", "NUMBER", decimal.Decimal("-922337203685477.5808")
368
- )
369
-
370
- def testDataTypeInt(self):
371
- if self.getEngine() != "PostgreSQL":
372
- self.helpTestDataType("tinyint", "NUMBER", 115)
373
- self.helpTestDataType("smallint", "NUMBER", -32768)
374
- if self.getEngine() not in ["ACCESS", "PostgreSQL"]:
375
- self.helpTestDataType(
376
- "bit", "NUMBER", 1
377
- ) # Does not work correctly with access
378
- if self.getEngine() in ["MSSQL", "PostgreSQL"]:
379
- self.helpTestDataType(
380
- "bigint",
381
- "NUMBER",
382
- 3000000000,
383
- allowedReturnValues=[3000000000, 3000000000],
384
- )
385
- self.helpTestDataType("int", "NUMBER", 2147483647)
386
-
387
- def testDataTypeChar(self):
388
- for sqlDataType in ("char(6)", "nchar(6)"):
389
- self.helpTestDataType(
390
- sqlDataType,
391
- "STRING",
392
- "spam ",
393
- allowedReturnValues=["spam", "spam", "spam ", "spam "],
394
- )
395
-
396
- def testDataTypeVarChar(self):
397
- if self.getEngine() == "MySQL":
398
- stringKinds = ["varchar(10)", "text"]
399
- elif self.getEngine() == "PostgreSQL":
400
- stringKinds = ["varchar(10)", "text", "character varying"]
401
- else:
402
- stringKinds = [
403
- "varchar(10)",
404
- "nvarchar(10)",
405
- "text",
406
- "ntext",
407
- ] # ,"varchar(max)"]
408
-
409
- for sqlDataType in stringKinds:
410
- self.helpTestDataType(sqlDataType, "STRING", "spam", ["spam"])
411
-
412
- def testDataTypeDate(self):
413
- if self.getEngine() == "PostgreSQL":
414
- dt = "timestamp"
415
- else:
416
- dt = "datetime"
417
- self.helpTestDataType(
418
- dt, "DATETIME", adodbapi.Date(2002, 10, 28), compareAlmostEqual=True
419
- )
420
- if self.getEngine() not in ["MySQL", "PostgreSQL"]:
421
- self.helpTestDataType(
422
- "smalldatetime",
423
- "DATETIME",
424
- adodbapi.Date(2002, 10, 28),
425
- compareAlmostEqual=True,
426
- )
427
- if tag != "pythontime" and self.getEngine() not in [
428
- "MySQL",
429
- "PostgreSQL",
430
- ]: # fails when using pythonTime
431
- self.helpTestDataType(
432
- dt,
433
- "DATETIME",
434
- adodbapi.Timestamp(2002, 10, 28, 12, 15, 1),
435
- compareAlmostEqual=True,
436
- )
437
-
438
- def testDataTypeBinary(self):
439
- binfld = b"\x07\x00\xe2\x40*"
440
- arv = [binfld, adodbapi.Binary(binfld), bytes(binfld)]
441
- if self.getEngine() == "PostgreSQL":
442
- self.helpTestDataType(
443
- "bytea", "BINARY", adodbapi.Binary(binfld), allowedReturnValues=arv
444
- )
445
- else:
446
- self.helpTestDataType(
447
- "binary(5)", "BINARY", adodbapi.Binary(binfld), allowedReturnValues=arv
448
- )
449
- self.helpTestDataType(
450
- "varbinary(100)",
451
- "BINARY",
452
- adodbapi.Binary(binfld),
453
- allowedReturnValues=arv,
454
- )
455
- if self.getEngine() != "MySQL":
456
- self.helpTestDataType(
457
- "image", "BINARY", adodbapi.Binary(binfld), allowedReturnValues=arv
458
- )
459
-
460
- def helpRollbackTblTemp(self):
461
- self.helpForceDropOnTblTemp()
462
-
463
- def helpForceDropOnTblTemp(self):
464
- conn = self.getConnection()
465
- with conn.cursor() as crsr:
466
- try:
467
- crsr.execute("DROP TABLE xx_%s" % config.tmp)
468
- if not conn.autocommit:
469
- conn.commit()
470
- except:
471
- pass
472
-
473
- def helpCreateAndPopulateTableTemp(self, crsr):
474
- tabdef = (
475
- """
476
- CREATE TABLE xx_%s (
477
- fldData INTEGER
478
- )
479
- """
480
- % config.tmp
481
- )
482
- try: # EAFP
483
- crsr.execute(tabdef)
484
- except api.DatabaseError: # was not dropped before
485
- self.helpForceDropOnTblTemp() # so drop it now
486
- crsr.execute(tabdef)
487
- for i in range(9): # note: this poor SQL code, but a valid test
488
- crsr.execute("INSERT INTO xx_%s (fldData) VALUES (%i)" % (config.tmp, i))
489
- # NOTE: building the test table without using parameter substitution
490
-
491
- def testFetchAll(self):
492
- crsr = self.getCursor()
493
- self.helpCreateAndPopulateTableTemp(crsr)
494
- crsr.execute("SELECT fldData FROM xx_%s" % config.tmp)
495
- rs = crsr.fetchall()
496
- assert len(rs) == 9
497
- # test slice of rows
498
- i = 3
499
- for row in rs[3:-2]: # should have rowid 3..6
500
- assert row[0] == i
501
- i += 1
502
- self.helpRollbackTblTemp()
503
-
504
- def testPreparedStatement(self):
505
- crsr = self.getCursor()
506
- self.helpCreateAndPopulateTableTemp(crsr)
507
- crsr.prepare("SELECT fldData FROM xx_%s" % config.tmp)
508
- crsr.execute(crsr.command) # remember the one that was prepared
509
- rs = crsr.fetchall()
510
- assert len(rs) == 9
511
- assert rs[2][0] == 2
512
- self.helpRollbackTblTemp()
513
-
514
- def testWrongPreparedStatement(self):
515
- crsr = self.getCursor()
516
- self.helpCreateAndPopulateTableTemp(crsr)
517
- crsr.prepare("SELECT * FROM nowhere")
518
- crsr.execute(
519
- "SELECT fldData FROM xx_%s" % config.tmp
520
- ) # should execute this one, not the prepared one
521
- rs = crsr.fetchall()
522
- assert len(rs) == 9
523
- assert rs[2][0] == 2
524
- self.helpRollbackTblTemp()
525
-
526
- def testIterator(self):
527
- crsr = self.getCursor()
528
- self.helpCreateAndPopulateTableTemp(crsr)
529
- crsr.execute("SELECT fldData FROM xx_%s" % config.tmp)
530
- for i, row in enumerate(
531
- crsr
532
- ): # using cursor as an iterator, rather than fetchxxx
533
- assert row[0] == i
534
- self.helpRollbackTblTemp()
535
-
536
- def testExecuteMany(self):
537
- crsr = self.getCursor()
538
- self.helpCreateAndPopulateTableTemp(crsr)
539
- seq_of_values = [(111,), (222,)]
540
- crsr.executemany(
541
- "INSERT INTO xx_%s (fldData) VALUES (?)" % config.tmp, seq_of_values
542
- )
543
- if crsr.rowcount == -1:
544
- print(
545
- self.getEngine()
546
- + " Provider does not support rowcount (on .executemany())"
547
- )
548
- else:
549
- self.assertEqual(crsr.rowcount, 2)
550
- crsr.execute("SELECT fldData FROM xx_%s" % config.tmp)
551
- rs = crsr.fetchall()
552
- assert len(rs) == 11
553
- self.helpRollbackTblTemp()
554
-
555
- def testRowCount(self):
556
- crsr = self.getCursor()
557
- self.helpCreateAndPopulateTableTemp(crsr)
558
- crsr.execute("SELECT fldData FROM xx_%s" % config.tmp)
559
- if crsr.rowcount == -1:
560
- # print("provider does not support rowcount on select")
561
- pass
562
- else:
563
- self.assertEqual(crsr.rowcount, 9)
564
- self.helpRollbackTblTemp()
565
-
566
- def testRowCountNoRecordset(self):
567
- crsr = self.getCursor()
568
- self.helpCreateAndPopulateTableTemp(crsr)
569
- crsr.execute("DELETE FROM xx_%s WHERE fldData >= 5" % config.tmp)
570
- if crsr.rowcount == -1:
571
- print(self.getEngine() + " Provider does not support rowcount (on DELETE)")
572
- else:
573
- self.assertEqual(crsr.rowcount, 4)
574
- self.helpRollbackTblTemp()
575
-
576
- def testFetchMany(self):
577
- crsr = self.getCursor()
578
- self.helpCreateAndPopulateTableTemp(crsr)
579
- crsr.execute("SELECT fldData FROM xx_%s" % config.tmp)
580
- rs = crsr.fetchmany(3)
581
- assert len(rs) == 3
582
- rs = crsr.fetchmany(5)
583
- assert len(rs) == 5
584
- rs = crsr.fetchmany(5)
585
- assert len(rs) == 1 # Asked for five, but there is only one left
586
- self.helpRollbackTblTemp()
587
-
588
- def testFetchManyWithArraySize(self):
589
- crsr = self.getCursor()
590
- self.helpCreateAndPopulateTableTemp(crsr)
591
- crsr.execute("SELECT fldData FROM xx_%s" % config.tmp)
592
- rs = crsr.fetchmany()
593
- assert len(rs) == 1 # arraysize Defaults to one
594
- crsr.arraysize = 4
595
- rs = crsr.fetchmany()
596
- assert len(rs) == 4
597
- rs = crsr.fetchmany()
598
- assert len(rs) == 4
599
- rs = crsr.fetchmany()
600
- assert len(rs) == 0
601
- self.helpRollbackTblTemp()
602
-
603
- def testErrorConnect(self):
604
- conn = self.getConnection()
605
- conn.close()
606
- self.assertRaises(api.DatabaseError, self.db, "not a valid connect string", {})
607
-
608
- def testRowIterator(self):
609
- self.helpForceDropOnTblTemp()
610
- conn = self.getConnection()
611
- crsr = conn.cursor()
612
- tabdef = (
613
- """
614
- CREATE TABLE xx_%s (
615
- fldId integer NOT NULL,
616
- fldTwo integer,
617
- fldThree integer,
618
- fldFour integer)
619
- """
620
- % config.tmp
621
- )
622
- crsr.execute(tabdef)
623
-
624
- inputs = [(2, 3, 4), (102, 103, 104)]
625
- fldId = 1
626
- for inParam in inputs:
627
- fldId += 1
628
- try:
629
- crsr.execute(
630
- "INSERT INTO xx_%s (fldId,fldTwo,fldThree,fldFour) VALUES (?,?,?,?)"
631
- % config.tmp,
632
- (fldId, inParam[0], inParam[1], inParam[2]),
633
- )
634
- except:
635
- conn.printADOerrors()
636
- raise
637
- crsr.execute(
638
- "SELECT fldTwo,fldThree,fldFour FROM xx_%s WHERE ?=fldID" % config.tmp,
639
- [fldId],
640
- )
641
- rec = crsr.fetchone()
642
- # check that stepping through an emulated row works
643
- for j in range(len(inParam)):
644
- assert rec[j] == inParam[j], (
645
- 'returned value:"%s" != test value:"%s"' % (rec[j], inParam[j])
646
- )
647
- # check that we can get a complete tuple from a row
648
- assert (
649
- tuple(rec) == inParam
650
- ), f'returned value:"{rec!r}" != test value:"{inParam!r}"'
651
- # test that slices of rows work
652
- slice1 = tuple(rec[:-1])
653
- slice2 = tuple(inParam[0:2])
654
- assert (
655
- slice1 == slice2
656
- ), f'returned value:"{slice1!r}" != test value:"{slice2!r}"'
657
- # now test named column retrieval
658
- assert rec["fldTwo"] == inParam[0]
659
- assert rec.fldThree == inParam[1]
660
- assert rec.fldFour == inParam[2]
661
- # test array operation
662
- # note that the fields vv vv vv are out of order
663
- crsr.execute("select fldThree,fldFour,fldTwo from xx_%s" % config.tmp)
664
- recs = crsr.fetchall()
665
- assert recs[1][0] == 103
666
- assert recs[0][1] == 4
667
- assert recs[1]["fldFour"] == 104
668
- assert recs[0, 0] == 3
669
- assert recs[0, "fldTwo"] == 2
670
- assert recs[1, 2] == 102
671
- for i in range(1):
672
- for j in range(2):
673
- assert recs[i][j] == recs[i, j]
674
-
675
- def testFormatParamstyle(self):
676
- self.helpForceDropOnTblTemp()
677
- conn = self.getConnection()
678
- conn.paramstyle = "format" # test nonstandard use of paramstyle
679
- crsr = conn.cursor()
680
- tabdef = (
681
- """
682
- CREATE TABLE xx_%s (
683
- fldId integer NOT NULL,
684
- fldData varchar(10),
685
- fldConst varchar(30))
686
- """
687
- % config.tmp
688
- )
689
- crsr.execute(tabdef)
690
-
691
- inputs = ["one", "two", "three"]
692
- fldId = 2
693
- for inParam in inputs:
694
- fldId += 1
695
- sql = (
696
- "INSERT INTO xx_"
697
- + config.tmp
698
- + " (fldId,fldConst,fldData) VALUES (%s,'thi%s :may cause? trouble', %s)"
699
- )
700
- try:
701
- crsr.execute(sql, (fldId, inParam))
702
- except:
703
- conn.printADOerrors()
704
- raise
705
- crsr.execute(
706
- "SELECT fldData, fldConst FROM xx_" + config.tmp + " WHERE %s=fldID",
707
- [fldId],
708
- )
709
- rec = crsr.fetchone()
710
- self.assertEqual(
711
- rec[0],
712
- inParam,
713
- 'returned value:"%s" != test value:"%s"' % (rec[0], inParam),
714
- )
715
- self.assertEqual(rec[1], "thi%s :may cause? trouble")
716
-
717
- # now try an operation with a "%s" as part of a literal
718
- sel = (
719
- "insert into xx_" + config.tmp + " (fldId,fldData) VALUES (%s,'four%sfive')"
720
- )
721
- params = (20,)
722
- crsr.execute(sel, params)
723
-
724
- # test the .query implementation
725
- assert "(?," in crsr.query, 'expected:"%s" in "%s"' % ("(?,", crsr.query)
726
- # test the .command attribute
727
- assert crsr.command == sel, 'expected:"%s" but found "%s"' % (sel, crsr.command)
728
-
729
- # test the .parameters attribute
730
- self.assertEqual(crsr.parameters, params)
731
- # now make sure the data made it
732
- crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=20" % config.tmp)
733
- rec = crsr.fetchone()
734
- self.assertEqual(rec[0], "four%sfive")
735
-
736
- def testNamedParamstyle(self):
737
- self.helpForceDropOnTblTemp()
738
- conn = self.getConnection()
739
- crsr = conn.cursor()
740
- crsr.paramstyle = "named" # test nonstandard use of paramstyle
741
- tabdef = (
742
- """
743
- CREATE TABLE xx_%s (
744
- fldId integer NOT NULL,
745
- fldData varchar(10))
746
- """
747
- % config.tmp
748
- )
749
- crsr.execute(tabdef)
750
-
751
- inputs = ["four", "five", "six"]
752
- fldId = 10
753
- for inParam in inputs:
754
- fldId += 1
755
- try:
756
- crsr.execute(
757
- "INSERT INTO xx_%s (fldId,fldData) VALUES (:Id,:f_Val)"
758
- % config.tmp,
759
- {"f_Val": inParam, "Id": fldId},
760
- )
761
- except:
762
- conn.printADOerrors()
763
- raise
764
- crsr.execute(
765
- "SELECT fldData FROM xx_%s WHERE fldID=:Id" % config.tmp, {"Id": fldId}
766
- )
767
- rec = crsr.fetchone()
768
- self.assertEqual(
769
- rec[0],
770
- inParam,
771
- 'returned value:"%s" != test value:"%s"' % (rec[0], inParam),
772
- )
773
- # now a test with a ":" as part of a literal
774
- crsr.execute(
775
- "insert into xx_%s (fldId,fldData) VALUES (:xyz,'six:five')" % config.tmp,
776
- {"xyz": 30},
777
- )
778
- crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=30" % config.tmp)
779
- rec = crsr.fetchone()
780
- self.assertEqual(rec[0], "six:five")
781
-
782
- def testPyformatParamstyle(self):
783
- self.helpForceDropOnTblTemp()
784
- conn = self.getConnection()
785
- crsr = conn.cursor()
786
- crsr.paramstyle = "pyformat" # test nonstandard use of paramstyle
787
- tabdef = (
788
- """
789
- CREATE TABLE xx_%s (
790
- fldId integer NOT NULL,
791
- fldData varchar(10))
792
- """
793
- % config.tmp
794
- )
795
- crsr.execute(tabdef)
796
-
797
- inputs = ["four", "five", "six"]
798
- fldId = 10
799
- for inParam in inputs:
800
- fldId += 1
801
- try:
802
- crsr.execute(
803
- "INSERT INTO xx_%s (fldId,fldData) VALUES (%%(Id)s,%%(f_Val)s)"
804
- % config.tmp,
805
- {"f_Val": inParam, "Id": fldId},
806
- )
807
- except:
808
- conn.printADOerrors()
809
- raise
810
- crsr.execute(
811
- "SELECT fldData FROM xx_%s WHERE fldID=%%(Id)s" % config.tmp,
812
- {"Id": fldId},
813
- )
814
- rec = crsr.fetchone()
815
- self.assertEqual(
816
- rec[0],
817
- inParam,
818
- 'returned value:"%s" != test value:"%s"' % (rec[0], inParam),
819
- )
820
- # now a test with a "%" as part of a literal
821
- crsr.execute(
822
- "insert into xx_%s (fldId,fldData) VALUES (%%(xyz)s,'six%%five')"
823
- % config.tmp,
824
- {"xyz": 30},
825
- )
826
- crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=30" % config.tmp)
827
- rec = crsr.fetchone()
828
- self.assertEqual(rec[0], "six%five")
829
-
830
- def testAutomaticParamstyle(self):
831
- self.helpForceDropOnTblTemp()
832
- conn = self.getConnection()
833
- conn.paramstyle = "dynamic" # test nonstandard use of paramstyle
834
- crsr = conn.cursor()
835
- tabdef = (
836
- """
837
- CREATE TABLE xx_%s (
838
- fldId integer NOT NULL,
839
- fldData varchar(10),
840
- fldConst varchar(30))
841
- """
842
- % config.tmp
843
- )
844
- crsr.execute(tabdef)
845
- inputs = ["one", "two", "three"]
846
- fldId = 2
847
- for inParam in inputs:
848
- fldId += 1
849
- try:
850
- crsr.execute(
851
- "INSERT INTO xx_"
852
- + config.tmp
853
- + " (fldId,fldConst,fldData) VALUES (?,'thi%s :may cause? troub:1e', ?)",
854
- (fldId, inParam),
855
- )
856
- except:
857
- conn.printADOerrors()
858
- raise
859
- trouble = "thi%s :may cause? troub:1e"
860
- crsr.execute(
861
- "SELECT fldData, fldConst FROM xx_" + config.tmp + " WHERE ?=fldID",
862
- [fldId],
863
- )
864
- rec = crsr.fetchone()
865
- self.assertEqual(
866
- rec[0],
867
- inParam,
868
- 'returned value:"%s" != test value:"%s"' % (rec[0], inParam),
869
- )
870
- self.assertEqual(rec[1], trouble)
871
- # inputs = [u'four',u'five',u'six']
872
- fldId = 10
873
- for inParam in inputs:
874
- fldId += 1
875
- try:
876
- crsr.execute(
877
- "INSERT INTO xx_%s (fldId,fldData) VALUES (:Id,:f_Val)"
878
- % config.tmp,
879
- {"f_Val": inParam, "Id": fldId},
880
- )
881
- except:
882
- conn.printADOerrors()
883
- raise
884
- crsr.execute(
885
- "SELECT fldData FROM xx_%s WHERE :Id=fldID" % config.tmp, {"Id": fldId}
886
- )
887
- rec = crsr.fetchone()
888
- self.assertEqual(
889
- rec[0],
890
- inParam,
891
- 'returned value:"%s" != test value:"%s"' % (rec[0], inParam),
892
- )
893
- # now a test with a ":" as part of a literal -- and use a prepared query
894
- ppdcmd = (
895
- "insert into xx_%s (fldId,fldData) VALUES (:xyz,'six:five')" % config.tmp
896
- )
897
- crsr.prepare(ppdcmd)
898
- crsr.execute(ppdcmd, {"xyz": 30})
899
- crsr.execute("SELECT fldData FROM xx_%s WHERE fldID=30" % config.tmp)
900
- rec = crsr.fetchone()
901
- self.assertEqual(rec[0], "six:five")
902
-
903
- def testRollBack(self):
904
- conn = self.getConnection()
905
- crsr = conn.cursor()
906
- assert not crsr.connection.autocommit, "Unexpected beginning condition"
907
- self.helpCreateAndPopulateTableTemp(crsr)
908
- crsr.connection.commit() # commit the first bunch
909
-
910
- crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp)
911
-
912
- selectSql = "SELECT fldData FROM xx_%s WHERE fldData=100" % config.tmp
913
- crsr.execute(selectSql)
914
- rs = crsr.fetchall()
915
- assert len(rs) == 1
916
- self.conn.rollback()
917
- crsr.execute(selectSql)
918
- assert (
919
- crsr.fetchone() is None
920
- ), "cursor.fetchone should return None if a query retrieves no rows"
921
- crsr.execute("SELECT fldData from xx_%s" % config.tmp)
922
- rs = crsr.fetchall()
923
- assert len(rs) == 9, "the original records should still be present"
924
- self.helpRollbackTblTemp()
925
-
926
- def testCommit(self):
927
- try:
928
- con2 = self.getAnotherConnection()
929
- except NotImplementedError:
930
- return # should be "SKIP" for ACCESS
931
- assert not con2.autocommit, "default should be manual commit"
932
- crsr = con2.cursor()
933
- self.helpCreateAndPopulateTableTemp(crsr)
934
-
935
- crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp)
936
- con2.commit()
937
-
938
- selectSql = "SELECT fldData FROM xx_%s WHERE fldData=100" % config.tmp
939
- crsr.execute(selectSql)
940
- rs = crsr.fetchall()
941
- assert len(rs) == 1
942
- crsr.close()
943
- con2.close()
944
- conn = self.getConnection()
945
- crsr = self.getCursor()
946
- with conn.cursor() as crsr:
947
- crsr.execute(selectSql)
948
- rs = crsr.fetchall()
949
- assert len(rs) == 1
950
- assert rs[0][0] == 100
951
- self.helpRollbackTblTemp()
952
-
953
- def testAutoRollback(self):
954
- try:
955
- con2 = self.getAnotherConnection()
956
- except NotImplementedError:
957
- return # should be "SKIP" for ACCESS
958
- assert not con2.autocommit, "unexpected beginning condition"
959
- crsr = con2.cursor()
960
- self.helpCreateAndPopulateTableTemp(crsr)
961
- crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp)
962
- selectSql = "SELECT fldData FROM xx_%s WHERE fldData=100" % config.tmp
963
- crsr.execute(selectSql)
964
- rs = crsr.fetchall()
965
- assert len(rs) == 1
966
- crsr.close()
967
- con2.close()
968
- crsr = self.getCursor()
969
- try:
970
- crsr.execute(
971
- selectSql
972
- ) # closing the connection should have forced rollback
973
- row = crsr.fetchone()
974
- except api.DatabaseError:
975
- row = None # if the entire table disappeared the rollback was perfect and the test passed
976
- assert (
977
- row is None
978
- ), f"cursor.fetchone should return None if a query retrieves no rows. Got {row!r}"
979
- self.helpRollbackTblTemp()
980
-
981
- def testAutoCommit(self):
982
- try:
983
- ac_conn = self.getAnotherConnection({"autocommit": True})
984
- except NotImplementedError:
985
- return # should be "SKIP" for ACCESS
986
- crsr = ac_conn.cursor()
987
- self.helpCreateAndPopulateTableTemp(crsr)
988
- crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp)
989
- crsr.close()
990
- with self.getCursor() as crsr:
991
- selectSql = "SELECT fldData from xx_%s" % config.tmp
992
- crsr.execute(
993
- selectSql
994
- ) # closing the connection should _not_ have forced rollback
995
- rs = crsr.fetchall()
996
- assert len(rs) == 10, "all records should still be present"
997
- ac_conn.close()
998
- self.helpRollbackTblTemp()
999
-
1000
- def testSwitchedAutoCommit(self):
1001
- try:
1002
- ac_conn = self.getAnotherConnection()
1003
- except NotImplementedError:
1004
- return # should be "SKIP" for ACCESS
1005
- ac_conn.autocommit = True
1006
- crsr = ac_conn.cursor()
1007
- self.helpCreateAndPopulateTableTemp(crsr)
1008
- crsr.execute("INSERT INTO xx_%s (fldData) VALUES(100)" % config.tmp)
1009
- crsr.close()
1010
- conn = self.getConnection()
1011
- ac_conn.close()
1012
- with self.getCursor() as crsr:
1013
- selectSql = "SELECT fldData from xx_%s" % config.tmp
1014
- crsr.execute(
1015
- selectSql
1016
- ) # closing the connection should _not_ have forced rollback
1017
- rs = crsr.fetchall()
1018
- assert len(rs) == 10, "all records should still be present"
1019
- self.helpRollbackTblTemp()
1020
-
1021
- def testExtendedTypeHandling(self):
1022
- class XtendString(str):
1023
- pass
1024
-
1025
- class XtendInt(int):
1026
- pass
1027
-
1028
- class XtendFloat(float):
1029
- pass
1030
-
1031
- xs = XtendString(randomstring(30))
1032
- xi = XtendInt(random.randint(-100, 500))
1033
- xf = XtendFloat(random.random())
1034
- self.helpForceDropOnTblTemp()
1035
- conn = self.getConnection()
1036
- crsr = conn.cursor()
1037
- tabdef = (
1038
- """
1039
- CREATE TABLE xx_%s (
1040
- s VARCHAR(40) NOT NULL,
1041
- i INTEGER NOT NULL,
1042
- f REAL NOT NULL)"""
1043
- % config.tmp
1044
- )
1045
- crsr.execute(tabdef)
1046
- crsr.execute(
1047
- "INSERT INTO xx_%s (s, i, f) VALUES (?, ?, ?)" % config.tmp, (xs, xi, xf)
1048
- )
1049
- crsr.close()
1050
- conn = self.getConnection()
1051
- with self.getCursor() as crsr:
1052
- selectSql = "SELECT s, i, f from xx_%s" % config.tmp
1053
- crsr.execute(
1054
- selectSql
1055
- ) # closing the connection should _not_ have forced rollback
1056
- row = crsr.fetchone()
1057
- self.assertEqual(row.s, xs)
1058
- self.assertEqual(row.i, xi)
1059
- self.assertAlmostEqual(row.f, xf)
1060
- self.helpRollbackTblTemp()
1061
-
1062
-
1063
- class TestADOwithSQLServer(CommonDBTests):
1064
- def setUp(self):
1065
- self.conn = config.dbSqlServerconnect(
1066
- *config.connStrSQLServer[0], **config.connStrSQLServer[1]
1067
- )
1068
- self.conn.timeout = 30 # turn timeout back up
1069
- self.engine = "MSSQL"
1070
- self.db = config.dbSqlServerconnect
1071
-
1072
- def tearDown(self):
1073
- try:
1074
- self.conn.rollback()
1075
- except:
1076
- pass
1077
- try:
1078
- self.conn.close()
1079
- except:
1080
- pass
1081
- self.conn = None
1082
-
1083
- def getConnection(self):
1084
- return self.conn
1085
-
1086
- def getAnotherConnection(self, addkeys=None):
1087
- keys = config.connStrSQLServer[1].copy()
1088
- if addkeys:
1089
- keys.update(addkeys)
1090
- return config.dbSqlServerconnect(*config.connStrSQLServer[0], **keys)
1091
-
1092
- def testVariableReturningStoredProcedure(self):
1093
- crsr = self.conn.cursor()
1094
- spdef = """
1095
- CREATE PROCEDURE sp_DeleteMeOnlyForTesting
1096
- @theInput varchar(50),
1097
- @theOtherInput varchar(50),
1098
- @theOutput varchar(100) OUTPUT
1099
- AS
1100
- SET @theOutput=@theInput+@theOtherInput
1101
- """
1102
- try:
1103
- crsr.execute("DROP PROCEDURE sp_DeleteMeOnlyForTesting")
1104
- self.conn.commit()
1105
- except: # Make sure it is empty
1106
- pass
1107
- crsr.execute(spdef)
1108
-
1109
- retvalues = crsr.callproc(
1110
- "sp_DeleteMeOnlyForTesting", ("Dodsworth", "Anne", " ")
1111
- )
1112
- assert retvalues[0] == "Dodsworth", f'{retvalues[0]!r} is not "Dodsworth"'
1113
- assert retvalues[1] == "Anne", f'{retvalues[1]!r} is not "Anne"'
1114
- assert (
1115
- retvalues[2] == "DodsworthAnne"
1116
- ), f'{retvalues[2]!r} is not "DodsworthAnne"'
1117
- self.conn.rollback()
1118
-
1119
- def testMultipleSetReturn(self):
1120
- crsr = self.getCursor()
1121
- self.helpCreateAndPopulateTableTemp(crsr)
1122
-
1123
- spdef = """
1124
- CREATE PROCEDURE sp_DeleteMe_OnlyForTesting
1125
- AS
1126
- SELECT fldData FROM xx_%s ORDER BY fldData ASC
1127
- SELECT fldData From xx_%s where fldData = -9999
1128
- SELECT fldData FROM xx_%s ORDER BY fldData DESC
1129
- """ % (
1130
- config.tmp,
1131
- config.tmp,
1132
- config.tmp,
1133
- )
1134
- try:
1135
- crsr.execute("DROP PROCEDURE sp_DeleteMe_OnlyForTesting")
1136
- self.conn.commit()
1137
- except: # Make sure it is empty
1138
- pass
1139
- crsr.execute(spdef)
1140
-
1141
- retvalues = crsr.callproc("sp_DeleteMe_OnlyForTesting")
1142
- row = crsr.fetchone()
1143
- self.assertEqual(row[0], 0)
1144
- assert crsr.nextset() == True, "Operation should succeed"
1145
- assert not crsr.fetchall(), "Should be an empty second set"
1146
- assert crsr.nextset() == True, "third set should be present"
1147
- rowdesc = crsr.fetchall()
1148
- self.assertEqual(rowdesc[0][0], 8)
1149
- assert crsr.nextset() is None, "No more return sets, should return None"
1150
-
1151
- self.helpRollbackTblTemp()
1152
-
1153
- def testDatetimeProcedureParameter(self):
1154
- crsr = self.conn.cursor()
1155
- spdef = """
1156
- CREATE PROCEDURE sp_DeleteMeOnlyForTesting
1157
- @theInput DATETIME,
1158
- @theOtherInput varchar(50),
1159
- @theOutput varchar(100) OUTPUT
1160
- AS
1161
- SET @theOutput = CONVERT(CHARACTER(20), @theInput, 0) + @theOtherInput
1162
- """
1163
- try:
1164
- crsr.execute("DROP PROCEDURE sp_DeleteMeOnlyForTesting")
1165
- self.conn.commit()
1166
- except: # Make sure it is empty
1167
- pass
1168
- crsr.execute(spdef)
1169
-
1170
- result = crsr.callproc(
1171
- "sp_DeleteMeOnlyForTesting",
1172
- [adodbapi.Timestamp(2014, 12, 25, 0, 1, 0), "Beep", " " * 30],
1173
- )
1174
-
1175
- assert result[2] == "Dec 25 2014 12:01AM Beep", 'value was="%s"' % result[2]
1176
- self.conn.rollback()
1177
-
1178
- def testIncorrectStoredProcedureParameter(self):
1179
- crsr = self.conn.cursor()
1180
- spdef = """
1181
- CREATE PROCEDURE sp_DeleteMeOnlyForTesting
1182
- @theInput DATETIME,
1183
- @theOtherInput varchar(50),
1184
- @theOutput varchar(100) OUTPUT
1185
- AS
1186
- SET @theOutput = CONVERT(CHARACTER(20), @theInput) + @theOtherInput
1187
- """
1188
- try:
1189
- crsr.execute("DROP PROCEDURE sp_DeleteMeOnlyForTesting")
1190
- self.conn.commit()
1191
- except: # Make sure it is empty
1192
- pass
1193
- crsr.execute(spdef)
1194
-
1195
- # calling the sproc with a string for the first parameter where a DateTime is expected
1196
- result = tryconnection.try_operation_with_expected_exception(
1197
- (api.DataError, api.DatabaseError),
1198
- crsr.callproc,
1199
- ["sp_DeleteMeOnlyForTesting"],
1200
- {"parameters": ["this is wrong", "Anne", "not Alice"]},
1201
- )
1202
- if result[0]: # the expected exception was raised
1203
- assert "@theInput" in str(result[1]) or "DatabaseError" in str(
1204
- result
1205
- ), "Identifies the wrong erroneous parameter"
1206
- else:
1207
- assert result[0], result[1] # incorrect or no exception
1208
- self.conn.rollback()
1209
-
1210
-
1211
- class TestADOwithAccessDB(CommonDBTests):
1212
- def setUp(self):
1213
- self.conn = config.dbAccessconnect(
1214
- *config.connStrAccess[0], **config.connStrAccess[1]
1215
- )
1216
- self.conn.timeout = 30 # turn timeout back up
1217
- self.engine = "ACCESS"
1218
- self.db = config.dbAccessconnect
1219
-
1220
- def tearDown(self):
1221
- try:
1222
- self.conn.rollback()
1223
- except:
1224
- pass
1225
- try:
1226
- self.conn.close()
1227
- except:
1228
- pass
1229
- self.conn = None
1230
-
1231
- def getConnection(self):
1232
- return self.conn
1233
-
1234
- def getAnotherConnection(self, addkeys=None):
1235
- raise NotImplementedError("Jet cannot use a second connection to the database")
1236
-
1237
- def testOkConnect(self):
1238
- c = self.db(*config.connStrAccess[0], **config.connStrAccess[1])
1239
- assert c is not None
1240
- c.close()
1241
-
1242
-
1243
- class TestADOwithMySql(CommonDBTests):
1244
- def setUp(self):
1245
- self.conn = config.dbMySqlconnect(
1246
- *config.connStrMySql[0], **config.connStrMySql[1]
1247
- )
1248
- self.conn.timeout = 30 # turn timeout back up
1249
- self.engine = "MySQL"
1250
- self.db = config.dbMySqlconnect
1251
-
1252
- def tearDown(self):
1253
- try:
1254
- self.conn.rollback()
1255
- except:
1256
- pass
1257
- try:
1258
- self.conn.close()
1259
- except:
1260
- pass
1261
- self.conn = None
1262
-
1263
- def getConnection(self):
1264
- return self.conn
1265
-
1266
- def getAnotherConnection(self, addkeys=None):
1267
- keys = config.connStrMySql[1].copy()
1268
- if addkeys:
1269
- keys.update(addkeys)
1270
- return config.dbMySqlconnect(*config.connStrMySql[0], **keys)
1271
-
1272
- def testOkConnect(self):
1273
- c = self.db(*config.connStrMySql[0], **config.connStrMySql[1])
1274
- assert c is not None
1275
-
1276
- # def testStoredProcedure(self):
1277
- # crsr = self.conn.cursor()
1278
- # try:
1279
- # crsr.execute("DROP PROCEDURE DeleteMeOnlyForTesting")
1280
- # self.conn.commit()
1281
- # except: # Make sure it is empty
1282
- # pass
1283
- # spdef = """
1284
- # DELIMITER $$
1285
- # CREATE PROCEDURE DeleteMeOnlyForTesting (onein CHAR(10), twoin CHAR(10), OUT theout CHAR(20))
1286
- # DETERMINISTIC
1287
- # BEGIN
1288
- # SET theout = onein //|| twoin;
1289
- # /* (SELECT 'a small string' as result; */
1290
- # END $$
1291
- # """
1292
- # crsr.execute(spdef)
1293
- # retvalues = crsr.callproc(
1294
- # "DeleteMeOnlyForTesting", ("Dodsworth", "Anne", " ")
1295
- # )
1296
- # # print(f"return value (mysql)={crsr.returnValue!r}")
1297
- # assert retvalues[0] == "Dodsworth", f'{retvalues[0]!r} is not "Dodsworth"'
1298
- # assert retvalues[1] == "Anne", f'{retvalues[1]!r} is not "Anne"'
1299
- # assert (
1300
- # retvalues[2] == "DodsworthAnne"
1301
- # ), f'{retvalues[2]!r} is not "DodsworthAnne"'
1302
- # try:
1303
- # crsr.execute("DROP PROCEDURE, DeleteMeOnlyForTesting")
1304
- # self.conn.commit()
1305
- # except: # Make sure it is empty
1306
- # pass
1307
-
1308
-
1309
- class TestADOwithPostgres(CommonDBTests):
1310
- def setUp(self):
1311
- self.conn = config.dbPostgresConnect(
1312
- *config.connStrPostgres[0], **config.connStrPostgres[1]
1313
- )
1314
- self.conn.timeout = 30 # turn timeout back up
1315
- self.engine = "PostgreSQL"
1316
- self.db = config.dbPostgresConnect
1317
-
1318
- def tearDown(self):
1319
- try:
1320
- self.conn.rollback()
1321
- except:
1322
- pass
1323
- try:
1324
- self.conn.close()
1325
- except:
1326
- pass
1327
- self.conn = None
1328
-
1329
- def getConnection(self):
1330
- return self.conn
1331
-
1332
- def getAnotherConnection(self, addkeys=None):
1333
- keys = config.connStrPostgres[1].copy()
1334
- if addkeys:
1335
- keys.update(addkeys)
1336
- return config.dbPostgresConnect(*config.connStrPostgres[0], **keys)
1337
-
1338
- def testOkConnect(self):
1339
- c = self.db(*config.connStrPostgres[0], **config.connStrPostgres[1])
1340
- assert c is not None
1341
-
1342
- # def testStoredProcedure(self):
1343
- # crsr = self.conn.cursor()
1344
- # spdef = """
1345
- # CREATE OR REPLACE FUNCTION DeleteMeOnlyForTesting (text, text)
1346
- # RETURNS text AS $funk$
1347
- # BEGIN
1348
- # RETURN $1 || $2;
1349
- # END;
1350
- # $funk$
1351
- # LANGUAGE SQL;
1352
- # """
1353
-
1354
- # crsr.execute(spdef)
1355
- # retvalues = crsr.callproc(
1356
- # "DeleteMeOnlyForTesting", ("Dodsworth", "Anne", " ")
1357
- # )
1358
- # # print(f"return value (pg)={crsr.returnValue!r}")
1359
- # assert retvalues[0] == "Dodsworth", f'{retvalues[0]!r} is not "Dodsworth"'
1360
- # assert retvalues[1] == "Anne", f'{retvalues[1]!r} is not "Anne"'
1361
- # assert (
1362
- # retvalues[2] == "DodsworthAnne"
1363
- # ), f'{retvalues[2]!r} is not "DodsworthAnne"'
1364
- # self.conn.rollback()
1365
- # try:
1366
- # crsr.execute("DROP PROCEDURE, DeleteMeOnlyForTesting")
1367
- # self.conn.commit()
1368
- # except: # Make sure it is empty
1369
- # pass
1370
-
1371
-
1372
- class TimeConverterInterfaceTest(unittest.TestCase):
1373
- def testIDate(self):
1374
- assert self.tc.Date(1990, 2, 2)
1375
-
1376
- def testITime(self):
1377
- assert self.tc.Time(13, 2, 2)
1378
-
1379
- def testITimestamp(self):
1380
- assert self.tc.Timestamp(1990, 2, 2, 13, 2, 1)
1381
-
1382
- def testIDateObjectFromCOMDate(self):
1383
- assert self.tc.DateObjectFromCOMDate(37435.7604282)
1384
-
1385
- def testICOMDate(self):
1386
- assert hasattr(self.tc, "COMDate")
1387
-
1388
- def testExactDate(self):
1389
- d = self.tc.Date(1994, 11, 15)
1390
- comDate = self.tc.COMDate(d)
1391
- correct = 34653.0
1392
- assert comDate == correct, comDate
1393
-
1394
- def testExactTimestamp(self):
1395
- d = self.tc.Timestamp(1994, 11, 15, 12, 0, 0)
1396
- comDate = self.tc.COMDate(d)
1397
- correct = 34653.5
1398
- self.assertEqual(comDate, correct)
1399
-
1400
- d = self.tc.Timestamp(2003, 5, 6, 14, 15, 17)
1401
- comDate = self.tc.COMDate(d)
1402
- correct = 37747.593946759262
1403
- self.assertEqual(comDate, correct)
1404
-
1405
- def testIsoFormat(self):
1406
- d = self.tc.Timestamp(1994, 11, 15, 12, 3, 10)
1407
- iso = self.tc.DateObjectToIsoFormatString(d)
1408
- self.assertEqual(str(iso[:19]), "1994-11-15 12:03:10")
1409
-
1410
- dt = self.tc.Date(2003, 5, 2)
1411
- iso = self.tc.DateObjectToIsoFormatString(dt)
1412
- self.assertEqual(str(iso[:10]), "2003-05-02")
1413
-
1414
-
1415
- class TestPythonTimeConverter(TimeConverterInterfaceTest):
1416
- def setUp(self):
1417
- self.tc = api.pythonTimeConverter()
1418
-
1419
- def testCOMDate(self):
1420
- mk = time.mktime((2002, 6, 28, 18, 15, 1, 4, 31 + 28 + 31 + 30 + 31 + 28, -1))
1421
- t = time.localtime(mk)
1422
- # Fri, 28 Jun 2002 18:15:01 +0000
1423
- cmd = self.tc.COMDate(t)
1424
- assert abs(cmd - 37435.7604282) < 1.0 / 24, "%f more than an hour wrong" % cmd
1425
-
1426
- def testDateObjectFromCOMDate(self):
1427
- cmd = self.tc.DateObjectFromCOMDate(37435.7604282)
1428
- t1 = time.gmtime(
1429
- time.mktime((2002, 6, 28, 0, 14, 1, 4, 31 + 28 + 31 + 30 + 31 + 28, -1))
1430
- )
1431
- # there are errors in the implementation of gmtime which we ignore
1432
- t2 = time.gmtime(
1433
- time.mktime((2002, 6, 29, 12, 14, 2, 4, 31 + 28 + 31 + 30 + 31 + 28, -1))
1434
- )
1435
- assert t1 < cmd < t2, f'"{cmd}" should be about 2002-6-28 12:15:01'
1436
-
1437
- def testDate(self):
1438
- t1 = time.mktime((2002, 6, 28, 18, 15, 1, 4, 31 + 28 + 31 + 30 + 31 + 30, 0))
1439
- t2 = time.mktime((2002, 6, 30, 18, 15, 1, 4, 31 + 28 + 31 + 30 + 31 + 28, 0))
1440
- obj = self.tc.Date(2002, 6, 29)
1441
- assert t1 < time.mktime(obj) < t2, obj
1442
-
1443
- def testTime(self):
1444
- self.assertEqual(
1445
- self.tc.Time(18, 15, 2), time.gmtime(18 * 60 * 60 + 15 * 60 + 2)
1446
- )
1447
-
1448
- def testTimestamp(self):
1449
- t1 = time.localtime(
1450
- time.mktime((2002, 6, 28, 18, 14, 1, 4, 31 + 28 + 31 + 30 + 31 + 28, -1))
1451
- )
1452
- t2 = time.localtime(
1453
- time.mktime((2002, 6, 28, 18, 16, 1, 4, 31 + 28 + 31 + 30 + 31 + 28, -1))
1454
- )
1455
- obj = self.tc.Timestamp(2002, 6, 28, 18, 15, 2)
1456
- assert t1 < obj < t2, obj
1457
-
1458
-
1459
- class TestPythonDateTimeConverter(TimeConverterInterfaceTest):
1460
- def setUp(self):
1461
- self.tc = api.pythonDateTimeConverter()
1462
-
1463
- def testCOMDate(self):
1464
- t = datetime.datetime(2002, 6, 28, 18, 15, 1)
1465
- # Fri, 28 Jun 2002 18:15:01 +0000
1466
- cmd = self.tc.COMDate(t)
1467
- assert abs(cmd - 37435.7604282) < 1.0 / 24, "more than an hour wrong"
1468
-
1469
- def testDateObjectFromCOMDate(self):
1470
- cmd = self.tc.DateObjectFromCOMDate(37435.7604282)
1471
- t1 = datetime.datetime(2002, 6, 28, 18, 14, 1)
1472
- t2 = datetime.datetime(2002, 6, 28, 18, 16, 1)
1473
- assert t1 < cmd < t2, cmd
1474
-
1475
- tx = datetime.datetime(
1476
- 2002, 6, 28, 18, 14, 1, 900000
1477
- ) # testing that microseconds don't become milliseconds
1478
- c1 = self.tc.DateObjectFromCOMDate(self.tc.COMDate(tx))
1479
- assert t1 < c1 < t2, c1
1480
-
1481
- def testDate(self):
1482
- t1 = datetime.date(2002, 6, 28)
1483
- t2 = datetime.date(2002, 6, 30)
1484
- obj = self.tc.Date(2002, 6, 29)
1485
- assert t1 < obj < t2, obj
1486
-
1487
- def testTime(self):
1488
- self.assertEqual(self.tc.Time(18, 15, 2).isoformat()[:8], "18:15:02")
1489
-
1490
- def testTimestamp(self):
1491
- t1 = datetime.datetime(2002, 6, 28, 18, 14, 1)
1492
- t2 = datetime.datetime(2002, 6, 28, 18, 16, 1)
1493
- obj = self.tc.Timestamp(2002, 6, 28, 18, 15, 2)
1494
- assert t1 < obj < t2, obj
1495
-
1496
-
1497
- suites = [
1498
- unittest.defaultTestLoader.loadTestsFromModule(TestPythonDateTimeConverter, "test")
1499
- ]
1500
- if config.doTimeTest:
1501
- suites.append(
1502
- unittest.defaultTestLoader.loadTestsFromModule(TestPythonTimeConverter, "test")
1503
- )
1504
- if config.doAccessTest:
1505
- suites.append(
1506
- unittest.defaultTestLoader.loadTestsFromModule(TestADOwithAccessDB, "test")
1507
- )
1508
- if config.doSqlServerTest:
1509
- suites.append(
1510
- unittest.defaultTestLoader.loadTestsFromModule(TestADOwithSQLServer, "test")
1511
- )
1512
- if config.doMySqlTest:
1513
- suites.append(
1514
- unittest.defaultTestLoader.loadTestsFromModule(TestADOwithMySql, "test")
1515
- )
1516
- if config.doPostgresTest:
1517
- suites.append(
1518
- unittest.defaultTestLoader.loadTestsFromModule(TestADOwithPostgres, "test")
1519
- )
1520
-
1521
-
1522
- class cleanup_manager:
1523
- def __enter__(self):
1524
- pass
1525
-
1526
- def __exit__(self, exc_type, exc_val, exc_tb):
1527
- config.cleanup(config.testfolder, config.mdb_name)
1528
-
1529
-
1530
- suite = unittest.TestSuite(suites)
1531
- if __name__ == "__main__":
1532
- mysuite = copy.deepcopy(suite)
1533
- with cleanup_manager():
1534
- defaultDateConverter = adodbapi.dateconverter
1535
- print(__doc__)
1536
- print("Default Date Converter is %s" % (defaultDateConverter,))
1537
- dateconverter = defaultDateConverter
1538
- unittest.TextTestRunner().run(mysuite)
1539
-
1540
- if config.doTimeTest:
1541
- mysuite = copy.deepcopy(
1542
- suite
1543
- ) # work around a side effect of unittest.TextTestRunner
1544
- adodbapi.adodbapi.dateconverter = api.pythonTimeConverter()
1545
- print("Changed dateconverter to ")
1546
- print(adodbapi.adodbapi.dateconverter)
1547
- unittest.TextTestRunner().run(mysuite)