py2docfx 0.1.15rc2025477__py3-none-any.whl → 0.1.16.dev2051338__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.
- py2docfx/docfx_yaml/process_doctree.py +21 -34
- py2docfx/docfx_yaml/tests/test_method_arguments.py +1 -7
- py2docfx/docfx_yaml/tests/test_process_doctree.py +120 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_core_metadata.py +21 -5
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +13 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/ccompiler.py +5 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build.py +1 -6
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +1 -9
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +1 -8
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/check.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/install.py +8 -17
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +8 -5
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +15 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/dist.py +2 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/sysconfig.py +0 -10
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +60 -5
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +6 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/util.py +7 -6
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_normalization.py +29 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +2 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +25 -594
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +6 -6
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +282 -223
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +22 -9
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +16 -13
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/util.py +0 -9
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +40 -9
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_wheel.py +6 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +49 -11
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +31 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +222 -129
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +30 -3
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/dist.py +168 -51
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/msvc.py +12 -3
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +246 -13
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +42 -29
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +93 -8
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_build_meta.py +17 -4
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_core_metadata.py +45 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_egg_info.py +24 -4
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_sdist.py +13 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/any_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/api_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/compiler/plugin_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_database.py +22 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_pb2.py +82 -35
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/duration_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/empty_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/field_mask_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/builder.py +4 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/containers.py +13 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/decoder.py +62 -115
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_edition_defaults.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_message.py +15 -18
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/testing_refleaks.py +4 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/type_checkers.py +5 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/well_known_types.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/json_format.py +25 -9
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/message.py +26 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/message_factory.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/proto.py +38 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/proto_text.py +129 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/reflection.py +0 -49
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/runtime_version.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/source_context_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/struct_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/symbol_database.py +0 -18
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/text_format.py +8 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/timestamp_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/type_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/unknown_fields.py +3 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/wrappers_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/msal/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/msal/application.py +51 -17
- py2docfx/venv/venv1/Lib/site-packages/msal/broker.py +18 -4
- py2docfx/venv/venv1/Lib/site-packages/msal/cloudshell.py +5 -1
- py2docfx/venv/venv1/Lib/site-packages/msal/managed_identity.py +5 -4
- py2docfx/venv/venv1/Lib/site-packages/msal/sku.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/msal/token_cache.py +31 -10
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/__init__.py +2 -3
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/cache_lock.py +4 -1
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/filelock.py +62 -0
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/libsecret.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/token_cache.py +7 -1
- py2docfx/venv/venv1/Lib/site-packages/pyasn1_modules/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_core_metadata.py +21 -5
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +13 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/ccompiler.py +5 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build.py +1 -6
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build_clib.py +1 -9
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build_ext.py +1 -8
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/check.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/install.py +8 -17
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +8 -5
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +15 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/dist.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/sysconfig.py +0 -10
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +60 -5
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/unixccompiler.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/util.py +7 -6
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_normalization.py +29 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +25 -594
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +6 -6
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +282 -223
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +22 -9
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +16 -13
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/util.py +0 -9
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +40 -9
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_wheel.py +6 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +49 -11
- py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +31 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +222 -129
- py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +30 -3
- py2docfx/venv/venv1/Lib/site-packages/setuptools/dist.py +168 -51
- py2docfx/venv/venv1/Lib/site-packages/setuptools/msvc.py +12 -3
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +246 -13
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +42 -29
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +93 -8
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_build_meta.py +17 -4
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_core_metadata.py +45 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_egg_info.py +24 -4
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_sdist.py +13 -1
- py2docfx/venv/venv1/Lib/site-packages/typing_extensions.py +999 -74
- {py2docfx-0.1.15rc2025477.dist-info → py2docfx-0.1.16.dev2051338.dist-info}/METADATA +1 -1
- {py2docfx-0.1.15rc2025477.dist-info → py2docfx-0.1.16.dev2051338.dist-info}/RECORD +141 -596
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/__init__.py +0 -82
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/ado_consts.py +0 -283
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/adodbapi.py +0 -1153
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/apibase.py +0 -723
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/db_print.py +0 -72
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/db_table_names.py +0 -21
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/xls_read.py +0 -41
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/xls_write.py +0 -41
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/is64bit.py +0 -34
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/process_connect_string.py +0 -137
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/schema_table.py +0 -16
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/setup.py +0 -68
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/adodbapitest.py +0 -1547
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/adodbapitestconfig.py +0 -184
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/dbapi20.py +0 -879
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/is64bit.py +0 -34
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/setuptestframework.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/test_adodbapi_dbapi20.py +0 -195
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/tryconnection.py +0 -30
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/_parameterized.py +0 -420
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/service.py +0 -213
- py2docfx/venv/venv1/Lib/site-packages/isapi/__init__.py +0 -39
- py2docfx/venv/venv1/Lib/site-packages/isapi/install.py +0 -809
- py2docfx/venv/venv1/Lib/site-packages/isapi/isapicon.py +0 -121
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/advanced.py +0 -218
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector.py +0 -116
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector_asynch.py +0 -85
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector_with_filter.py +0 -162
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/test.py +0 -195
- py2docfx/venv/venv1/Lib/site-packages/isapi/simple.py +0 -73
- py2docfx/venv/venv1/Lib/site-packages/isapi/test/extension_simple.py +0 -114
- py2docfx/venv/venv1/Lib/site-packages/isapi/threaded_extension.py +0 -191
- py2docfx/venv/venv1/Lib/site-packages/portalocker/__about__.py +0 -6
- py2docfx/venv/venv1/Lib/site-packages/portalocker/__init__.py +0 -79
- py2docfx/venv/venv1/Lib/site-packages/portalocker/__main__.py +0 -122
- py2docfx/venv/venv1/Lib/site-packages/portalocker/constants.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/portalocker/exceptions.py +0 -27
- py2docfx/venv/venv1/Lib/site-packages/portalocker/portalocker.py +0 -154
- py2docfx/venv/venv1/Lib/site-packages/portalocker/redis.py +0 -236
- py2docfx/venv/venv1/Lib/site-packages/portalocker/utils.py +0 -569
- py2docfx/venv/venv1/Lib/site-packages/pythoncom.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/basictimerapp.py +0 -258
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/customprint.py +0 -183
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/demoutils.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/dlgappdemo.py +0 -51
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/dojobapp.py +0 -71
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/helloapp.py +0 -53
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/cmdserver.py +0 -113
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/createwin.py +0 -114
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/demoutils.py +0 -65
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dibdemo.py +0 -73
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dlgtest.py +0 -145
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dyndlg.py +0 -104
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/fontdemo.py +0 -85
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/guidemo.py +0 -53
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/hiertest.py +0 -138
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/menutest.py +0 -13
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/objdoc.py +0 -57
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/demoutils.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/flash.py +0 -95
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/msoffice.py +0 -159
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/ocxserialtest.py +0 -132
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/ocxtest.py +0 -243
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/webbrowser.py +0 -72
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/openGLDemo.py +0 -415
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/progressbar.py +0 -105
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/sliderdemo.py +0 -76
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/splittst.py +0 -79
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/threadedgui.py +0 -189
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/toolbar.py +0 -105
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/__init__.py +0 -3
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/__init__.py +0 -133
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/configui.py +0 -34
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/dbgcon.py +0 -31
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/dbgpyapp.py +0 -48
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/debugger.py +0 -1097
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/fail.py +0 -54
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/ideoptions.py +0 -136
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/list.py +0 -146
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/login.py +0 -155
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/status.py +0 -242
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/docking/DockingBar.py +0 -676
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/docking/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/app.py +0 -411
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/bitmap.py +0 -168
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/cmdline.py +0 -54
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/dbgcommands.py +0 -188
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/dlgappcore.py +0 -76
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/ModuleBrowser.py +0 -235
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/__init__.py +0 -105
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/color/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/color/coloreditor.py +0 -646
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/configui.py +0 -299
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/document.py +0 -379
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/editor.py +0 -511
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/frame.py +0 -74
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/template.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/vss.py +0 -104
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/help.py +0 -173
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/interact.py +0 -995
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/intpyapp.py +0 -552
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/intpydde.py +0 -65
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/scriptutils.py +0 -684
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/sgrepmdi.py +0 -749
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/startup.py +0 -70
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/stdin.py +0 -172
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/toolmenu.py +0 -279
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/window.py +0 -14
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/winout.py +0 -589
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/AutoExpand.py +0 -95
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/AutoIndent.py +0 -536
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/CallTips.py +0 -216
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/FormatParagraph.py +0 -166
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/IdleHistory.py +0 -87
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/PyParse.py +0 -585
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/activex.py +0 -79
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/afxres.py +0 -501
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/dialog.py +0 -277
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/docview.py +0 -151
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/object.py +0 -66
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/thread.py +0 -25
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/window.py +0 -50
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/IDLEenvironment.py +0 -593
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/bindings.py +0 -180
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/config.py +0 -363
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/configui.py +0 -291
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/control.py +0 -565
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/document.py +0 -312
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/find.py +0 -511
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/formatter.py +0 -704
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/keycodes.py +0 -190
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/scintillacon.py +0 -3083
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/view.py +0 -841
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/TraceCollector.py +0 -79
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/browseProjects.py +0 -323
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/browser.py +0 -494
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/hierlist.py +0 -353
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/regedit.py +0 -382
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/regpy.py +0 -80
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/BackupRead_BackupWrite.py +0 -119
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/BackupSeek_streamheaders.py +0 -137
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/CopyFileEx.py +0 -57
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/CreateFileTransacted_MiniVersion.py +0 -122
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtFormatMessage.py +0 -83
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtSubscribe_pull.py +0 -28
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtSubscribe_push.py +0 -32
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/FileSecurityTest.py +0 -137
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/GetSaveFileName.py +0 -43
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/NetValidatePasswordPolicy.py +0 -127
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/OpenEncryptedFileRaw.py +0 -66
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/RegCreateKeyTransacted.py +0 -60
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/RegRestoreKey.py +0 -71
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/SystemParametersInfo.py +0 -210
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/c_extension/setup.py +0 -26
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/dde/ddeclient.py +0 -18
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/dde/ddeserver.py +0 -42
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/desktopmanager.py +0 -246
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/eventLogDemo.py +0 -143
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/getfilever.py +0 -33
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/mmapfile_demo.py +0 -101
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/pipes/cat.py +0 -17
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/pipes/runproc.py +0 -114
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/print_desktop.py +0 -113
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/rastest.py +0 -166
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/GetTokenInformation.py +0 -110
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/account_rights.py +0 -49
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/explicit_entries.py +0 -170
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/get_policy_info.py +0 -39
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/list_rights.py +0 -35
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/localized_names.py +0 -70
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/lsaregevent.py +0 -14
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/lsastore.py +0 -12
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/query_information.py +0 -25
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/regsave_sa.py +0 -61
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/regsecurity.py +0 -36
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sa_inherit.py +0 -8
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/security_enums.py +0 -336
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_file_audit.py +0 -106
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_file_owner.py +0 -73
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_policy_info.py +0 -25
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setkernelobjectsecurity.py +0 -134
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setnamedsecurityinfo.py +0 -131
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setsecurityinfo.py +0 -131
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setuserobjectsecurity.py +0 -102
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/fetch_url.py +0 -158
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/simple_auth.py +0 -72
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/socket_server.py +0 -199
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/validate_password.py +0 -41
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/nativePipeTestService.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/pipeTestService.py +0 -185
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/pipeTestServiceClient.py +0 -158
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/serviceEvents.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/timer_demo.py +0 -72
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32clipboardDemo.py +0 -155
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32clipboard_bitmapdemo.py +0 -117
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32comport_demo.py +0 -174
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32console_demo.py +0 -132
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32cred_demo.py +0 -82
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32fileDemo.py +0 -41
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_demo.py +0 -177
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_devicenotify.py +0 -106
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_dialog.py +0 -445
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_menu.py +0 -464
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_taskbar.py +0 -136
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32netdemo.py +0 -272
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32rcparser_demo.py +0 -86
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32servicedemo.py +0 -23
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32ts_logoff_disconnected.py +0 -25
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32wnet/testwnet.py +0 -123
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32wnet/winnetwk.py +0 -100
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/winprocess.py +0 -230
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/_win32verstamp_pywin32ctypes.py +0 -164
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/afxres.py +0 -8
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/commctrl.py +0 -1551
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/mmsystem.py +0 -956
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/netbios.py +0 -293
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/ntsecuritycon.py +0 -731
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywin32_bootstrap.py +0 -21
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywin32_testutil.py +0 -291
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywintypes.py +0 -124
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/rasutil.py +0 -40
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/regcheck.py +0 -161
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/regutil.py +0 -395
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/sspi.py +0 -413
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/sspicon.py +0 -477
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win2kras.py +0 -14
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32con.py +0 -5064
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32cryptcon.py +0 -1922
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32evtlogutil.py +0 -225
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32gui_struct.py +0 -957
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32inetcon.py +0 -1086
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32netcon.py +0 -627
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32pdhquery.py +0 -570
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32pdhutil.py +0 -212
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32rcparser.py +0 -674
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32serviceutil.py +0 -1073
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32timezone.py +0 -1201
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32traceutil.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32verstamp.py +0 -235
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winerror.py +0 -7362
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winioctlcon.py +0 -1079
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winnt.py +0 -1347
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winperf.py +0 -236
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winxptheme.py +0 -8
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/ControlService.py +0 -594
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/BrandProject.py +0 -97
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/bulkstamp.py +0 -156
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/vssutil.py +0 -201
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/backupEventLog.py +0 -46
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/h2py.py +0 -194
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/killProcName.py +0 -62
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/pywin32_postinstall.py +0 -733
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/pywin32_testall.py +0 -120
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/rasutil.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/regsetup.py +0 -607
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/setup_d.py +0 -111
- py2docfx/venv/venv1/Lib/site-packages/win32/test/handles.py +0 -175
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_clipboard.py +0 -137
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_exceptions.py +0 -213
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_odbc.py +0 -264
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_pywintypes.py +0 -111
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_security.py +0 -166
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_sspi.py +0 -229
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32api.py +0 -273
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32clipboard.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32cred.py +0 -91
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32crypt.py +0 -144
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32event.py +0 -119
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32file.py +0 -1096
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32gui.py +0 -227
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32guistruct.py +0 -333
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32inet.py +0 -108
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32net.py +0 -23
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32pipe.py +0 -148
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32print.py +0 -24
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32profile.py +0 -19
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32rcparser.py +0 -70
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32timezone.py +0 -16
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32trace.py +0 -366
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32ts.py +0 -19
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32wnet.py +0 -174
- py2docfx/venv/venv1/Lib/site-packages/win32/test/testall.py +0 -223
- py2docfx/venv/venv1/Lib/site-packages/win32/winxpgui.py +0 -13
- py2docfx/venv/venv1/Lib/site-packages/win32com/__init__.py +0 -134
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/CLSIDToClass.py +0 -60
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/__init__.py +0 -717
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/build.py +0 -771
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/combrowse.py +0 -604
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/connect.py +0 -48
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/dynamic.py +0 -699
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/gencache.py +0 -825
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/genpy.py +0 -1350
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/makepy.py +0 -453
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/selecttlb.py +0 -182
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/tlbrowse.py +0 -277
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/util.py +0 -103
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/connect.py +0 -96
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/dump_clipboard.py +0 -74
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/eventsApartmentThreaded.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/eventsFreeThreaded.py +0 -92
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/excelAddin.py +0 -169
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/excelRTDServer.py +0 -434
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/iebutton.py +0 -214
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/ietoolbar.py +0 -368
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/outlookAddin.py +0 -135
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/trybag.py +0 -78
- py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegw.py +0 -618
- py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegwenum.py +0 -331
- py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegwparse.py +0 -1017
- py2docfx/venv/venv1/Lib/site-packages/win32com/olectl.py +0 -70
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/connect.py +0 -85
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/dispatcher.py +0 -239
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/exception.py +0 -99
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/factory.py +0 -26
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/localserver.py +0 -53
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/policy.py +0 -803
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/register.py +0 -677
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/util.py +0 -229
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/PythonTools.py +0 -47
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/dictionary.py +0 -133
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/interp.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/perfmon.py +0 -36
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/test_pycomtest.py +0 -181
- py2docfx/venv/venv1/Lib/site-packages/win32com/storagecon.py +0 -142
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/GenTestScripts.py +0 -95
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/daodump.py +0 -88
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/errorSemantics.py +0 -243
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/pippo_server.py +0 -96
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/policySemantics.py +0 -115
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testADOEvents.py +0 -100
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testAXScript.py +0 -44
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testAccess.py +0 -185
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testArrays.py +0 -99
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testClipboard.py +0 -169
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testCollections.py +0 -159
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testConversionErrors.py +0 -35
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDCOM.py +0 -50
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDates.py +0 -74
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDictionary.py +0 -101
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDynamic.py +0 -83
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testExchange.py +0 -121
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testExplorer.py +0 -139
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testGIT.py +0 -142
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testGatewayAddresses.py +0 -149
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testIterators.py +0 -140
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMSOffice.py +0 -184
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMSOfficeEvents.py +0 -138
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMarshal.py +0 -160
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPersist.py +0 -227
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPippo.py +0 -80
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPyComTest.py +0 -918
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testROT.py +0 -29
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testServers.py +0 -51
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testShell.py +0 -272
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testStorage.py +0 -88
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testStreams.py +0 -147
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testWMI.py +0 -18
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testall.py +0 -320
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testmakepy.py +0 -54
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testvb.py +0 -583
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testvbscript_regexp.py +0 -40
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testxslt.py +0 -34
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/util.py +0 -262
- py2docfx/venv/venv1/Lib/site-packages/win32com/universal.py +0 -224
- py2docfx/venv/venv1/Lib/site-packages/win32com/util.py +0 -35
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/__init__.py +0 -113
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/adsicon.py +0 -340
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/objectPicker.py +0 -68
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/scp.py +0 -565
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/search.py +0 -151
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/test.py +0 -274
- py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/__init__.py +0 -6
- py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/demos/EditSecurity.py +0 -229
- py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/demos/EditServiceSecurity.py +0 -219
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axcontrol/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/adb.py +0 -467
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/codecontainer.py +0 -279
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/contexts.py +0 -58
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/debugger.py +0 -238
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/documents.py +0 -135
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/dump.py +0 -57
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/expressions.py +0 -212
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/gateways.py +0 -583
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/stackframe.py +0 -178
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/util.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/asputil.py +0 -13
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/debug.py +0 -223
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/error.py +0 -262
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/framework.py +0 -1291
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pydumper.py +0 -78
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pyscript.py +0 -438
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pyscript_rexec.py +0 -54
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/scriptdispatch.py +0 -103
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/server/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/server/axsite.py +0 -145
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/leakTest.py +0 -185
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/testHost.py +0 -240
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/testHost4Dbg.py +0 -83
- py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/__init__.py +0 -6
- py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/test/show_all_jobs.py +0 -48
- py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/test/test_bits.py +0 -119
- py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/ds_record.py +0 -60
- py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/ds_test.py +0 -402
- py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/demo/filterDemo.py +0 -300
- py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/ifiltercon.py +0 -110
- py2docfx/venv/venv1/Lib/site-packages/win32comext/internet/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/internet/inetcon.py +0 -261
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/__init__.py +0 -21
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/demos/mapisend.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/emsabtags.py +0 -875
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/mapitags.py +0 -1023
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/mapiutil.py +0 -211
- py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/pscon.py +0 -838
- py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/test/testpropsys.py +0 -5
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IActiveDesktop.py +0 -83
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IFileOperationProgressSink.py +0 -179
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IShellLinkDataList.py +0 -67
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/ITransferAdviseSink.py +0 -93
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IUniformResourceLocator.py +0 -56
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/browse_for_folder.py +0 -45
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/create_link.py +0 -73
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/dump_link.py +0 -58
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/explorer_browser.py +0 -143
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/column_provider.py +0 -125
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/context_menu.py +0 -122
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/copy_hook.py +0 -84
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/empty_volume_cache.py +0 -188
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/folder_view.py +0 -866
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/icon_handler.py +0 -81
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/shell_view.py +0 -971
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/shellexecuteex.py +0 -19
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/viewstate.py +0 -68
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/walk_shell_folders.py +0 -24
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/shellcon.py +0 -1615
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testSHFileOperation.py +0 -75
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testShellFolder.py +0 -21
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testShellItem.py +0 -69
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/__init__.py +0 -6
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask.py +0 -66
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask_1.py +0 -68
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask_2.py +0 -49
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_localsystem.py +0 -3
- py2docfx/venv/venv1/Scripts/pywin32_postinstall.py +0 -733
- py2docfx/venv/venv1/Scripts/pywin32_testall.py +0 -120
- {py2docfx-0.1.15rc2025477.dist-info → py2docfx-0.1.16.dev2051338.dist-info}/WHEEL +0 -0
- {py2docfx-0.1.15rc2025477.dist-info → py2docfx-0.1.16.dev2051338.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)
|