kurumera 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kurumera-0.1.0/.gitignore +7 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/build-1.6.1.dist-info/licenses/LICENSE +20 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/certifi/tests/__init__.py +0 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/certifi/tests/test_certify.py +18 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/certifi-2026.7.22.dist-info/licenses/LICENSE +20 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/charset_normalizer-3.5.1.dist-info/licenses/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/__init__.py +1 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/ansi_test.py +76 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/ansitowin32_test.py +294 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/initialise_test.py +189 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/isatty_test.py +57 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/utils.py +49 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/winterm_test.py +131 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/id-1.6.1.dist-info/licenses/LICENSE +202 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/jaraco.classes-3.4.0.dist-info/LICENSE +17 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/jaraco_context-6.1.2.dist-info/licenses/LICENSE +18 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/jaraco_functools-4.6.0.dist-info/licenses/LICENSE +18 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/keyring-25.7.0.dist-info/licenses/LICENSE +18 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/markdown_it_py-4.2.0.dist-info/licenses/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/mdurl-0.1.2.dist-info/LICENSE +46 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/more_itertools-11.1.0.dist-info/licenses/LICENSE +19 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/nh3-0.3.7.dist-info/licenses/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/packaging-26.3.dist-info/licenses/LICENSE +3 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/certifi/LICENSE +20 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/distro/LICENSE +202 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/packaging/LICENSE +3 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/pkg_resources/LICENSE +17 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/platformdirs/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/pygments/LICENSE +25 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/pyproject_hooks/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/requests/LICENSE +175 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/resolvelib/LICENSE +13 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/rich/LICENSE +19 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/tomli/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/tomli_w/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/truststore/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/certifi/LICENSE +20 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/distro/LICENSE +202 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/packaging/LICENSE +3 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE +17 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pygments/LICENSE +25 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/requests/LICENSE +175 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE +13 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/rich/LICENSE +19 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/tomli/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/truststore/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pygments-2.21.0.dist-info/licenses/LICENSE +25 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/pyproject_hooks-1.3.3.dist-info/licenses/LICENSE +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/readme_renderer-46.0.dist-info/licenses/LICENSE +174 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/requests-2.34.2.dist-info/licenses/LICENSE +175 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/requests_toolbelt-1.0.0.dist-info/LICENSE +13 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/rfc3986-2.0.0.dist-info/LICENSE +13 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/rich-15.0.0.dist-info/licenses/LICENSE +19 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/twine-7.0.0.dist-info/licenses/LICENSE +174 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/win32ctypes/tests/__init__.py +21 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/win32ctypes/tests/test_backends.py +36 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/win32ctypes/tests/test_win32api.py +304 -0
- kurumera-0.1.0/.release-venv/Lib/site-packages/win32ctypes/tests/test_win32cred.py +230 -0
- kurumera-0.1.0/LICENSE +21 -0
- kurumera-0.1.0/PKG-INFO +205 -0
- kurumera-0.1.0/README.md +183 -0
- kurumera-0.1.0/docs/TOOLS.md +274 -0
- kurumera-0.1.0/pyproject.toml +47 -0
- kurumera-0.1.0/src/kurumera/__init__.py +66 -0
- kurumera-0.1.0/src/kurumera/_generated/__init__.py +122 -0
- kurumera-0.1.0/src/kurumera/_generated/alias_tools.py +65 -0
- kurumera-0.1.0/src/kurumera/_generated/analytics_tools.py +169 -0
- kurumera-0.1.0/src/kurumera/_generated/blog_tools.py +100 -0
- kurumera-0.1.0/src/kurumera/_generated/branch_tools.py +91 -0
- kurumera-0.1.0/src/kurumera/_generated/branding_tools.py +98 -0
- kurumera-0.1.0/src/kurumera/_generated/campaign_tools.py +103 -0
- kurumera-0.1.0/src/kurumera/_generated/cart_tools.py +58 -0
- kurumera-0.1.0/src/kurumera/_generated/collection_tools.py +189 -0
- kurumera-0.1.0/src/kurumera/_generated/commercial_tools.py +161 -0
- kurumera-0.1.0/src/kurumera/_generated/content_access.py +82 -0
- kurumera-0.1.0/src/kurumera/_generated/content_delete.py +49 -0
- kurumera-0.1.0/src/kurumera/_generated/crm_file_tools.py +118 -0
- kurumera-0.1.0/src/kurumera/_generated/crm_tools.py +1118 -0
- kurumera-0.1.0/src/kurumera/_generated/currency_tools.py +72 -0
- kurumera-0.1.0/src/kurumera/_generated/customer_tools.py +71 -0
- kurumera-0.1.0/src/kurumera/_generated/discount_tools.py +45 -0
- kurumera-0.1.0/src/kurumera/_generated/doc_tools.py +102 -0
- kurumera-0.1.0/src/kurumera/_generated/email_tools.py +236 -0
- kurumera-0.1.0/src/kurumera/_generated/faq_tools.py +50 -0
- kurumera-0.1.0/src/kurumera/_generated/finance_tools.py +173 -0
- kurumera-0.1.0/src/kurumera/_generated/forecast_tools.py +211 -0
- kurumera-0.1.0/src/kurumera/_generated/form_tools.py +64 -0
- kurumera-0.1.0/src/kurumera/_generated/gift_card_tools.py +60 -0
- kurumera-0.1.0/src/kurumera/_generated/inbox_tools.py +256 -0
- kurumera-0.1.0/src/kurumera/_generated/inventory_tools.py +156 -0
- kurumera-0.1.0/src/kurumera/_generated/invoice_tools.py +259 -0
- kurumera-0.1.0/src/kurumera/_generated/media_library_tools.py +114 -0
- kurumera-0.1.0/src/kurumera/_generated/media_tools.py +188 -0
- kurumera-0.1.0/src/kurumera/_generated/merge_tools.py +148 -0
- kurumera-0.1.0/src/kurumera/_generated/merged_tools.py +249 -0
- kurumera-0.1.0/src/kurumera/_generated/migration_tools.py +126 -0
- kurumera-0.1.0/src/kurumera/_generated/nav_tools.py +58 -0
- kurumera-0.1.0/src/kurumera/_generated/notification_tools.py +45 -0
- kurumera-0.1.0/src/kurumera/_generated/order_tools.py +245 -0
- kurumera-0.1.0/src/kurumera/_generated/page_locale_tools.py +96 -0
- kurumera-0.1.0/src/kurumera/_generated/page_tools.py +106 -0
- kurumera-0.1.0/src/kurumera/_generated/pagebuilder_authoring_tools.py +178 -0
- kurumera-0.1.0/src/kurumera/_generated/pagebuilder_component_tools.py +75 -0
- kurumera-0.1.0/src/kurumera/_generated/pagebuilder_visual_tools.py +42 -0
- kurumera-0.1.0/src/kurumera/_generated/pos_tools.py +54 -0
- kurumera-0.1.0/src/kurumera/_generated/product_tools.py +248 -0
- kurumera-0.1.0/src/kurumera/_generated/review_tools.py +41 -0
- kurumera-0.1.0/src/kurumera/_generated/site_gen_tools.py +115 -0
- kurumera-0.1.0/src/kurumera/_generated/social_tools.py +165 -0
- kurumera-0.1.0/src/kurumera/_generated/store_tools.py +46 -0
- kurumera-0.1.0/src/kurumera/_generated/translation_tools.py +67 -0
- kurumera-0.1.0/src/kurumera/_generated/webhook_tools.py +58 -0
- kurumera-0.1.0/src/kurumera/_transport.py +227 -0
- kurumera-0.1.0/src/kurumera/_version.py +1 -0
- kurumera-0.1.0/src/kurumera/client.py +266 -0
- kurumera-0.1.0/src/kurumera/credentials.py +146 -0
- kurumera-0.1.0/src/kurumera/errors.py +264 -0
- kurumera-0.1.0/src/kurumera/py.typed +0 -0
- kurumera-0.1.0/src/kurumera/registry.json +12990 -0
- kurumera-0.1.0/src/kurumera/registry.py +89 -0
- kurumera-0.1.0/src/kurumera/types.py +199 -0
- kurumera-0.1.0/tests/test_sdk.py +404 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright © 2019 Filipe Laíns <filipe.lains@gmail.com>
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a
|
|
4
|
+
copy of this software and associated documentation files (the "Software"),
|
|
5
|
+
to deal in the Software without restriction, including without limitation
|
|
6
|
+
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
7
|
+
and/or sell copies of the Software, and to permit persons to whom the
|
|
8
|
+
Software is furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice (including the next
|
|
11
|
+
paragraph) shall be included in all copies or substantial portions of the
|
|
12
|
+
Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
17
|
+
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
19
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
20
|
+
DEALINGS IN THE SOFTWARE.
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import unittest
|
|
3
|
+
|
|
4
|
+
import certifi
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TestCertifi(unittest.TestCase):
|
|
8
|
+
def test_cabundle_exists(self) -> None:
|
|
9
|
+
assert os.path.exists(certifi.where())
|
|
10
|
+
|
|
11
|
+
def test_read_contents(self) -> None:
|
|
12
|
+
content = certifi.contents()
|
|
13
|
+
assert "-----BEGIN CERTIFICATE-----" in content
|
|
14
|
+
|
|
15
|
+
def test_py_typed_exists(self) -> None:
|
|
16
|
+
assert os.path.exists(
|
|
17
|
+
os.path.join(os.path.dirname(certifi.__file__), 'py.typed')
|
|
18
|
+
)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
This package contains a modified version of ca-bundle.crt:
|
|
2
|
+
|
|
3
|
+
ca-bundle.crt -- Bundle of CA Root Certificates
|
|
4
|
+
|
|
5
|
+
This is a bundle of X.509 certificates of public Certificate Authorities
|
|
6
|
+
(CA). These were automatically extracted from Mozilla's root certificates
|
|
7
|
+
file (certdata.txt). This file can be found in the mozilla source tree:
|
|
8
|
+
https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt
|
|
9
|
+
It contains the certificates in PEM format and therefore
|
|
10
|
+
can be directly used with curl / libcurl / php_curl, or with
|
|
11
|
+
an Apache+mod_ssl webserver for SSL client authentication.
|
|
12
|
+
Just configure this file as the SSLCACertificateFile.#
|
|
13
|
+
|
|
14
|
+
***** BEGIN LICENSE BLOCK *****
|
|
15
|
+
This Source Code Form is subject to the terms of the Mozilla Public License,
|
|
16
|
+
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
|
|
17
|
+
one at http://mozilla.org/MPL/2.0/.
|
|
18
|
+
|
|
19
|
+
***** END LICENSE BLOCK *****
|
|
20
|
+
@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
|
kurumera-0.1.0/.release-venv/Lib/site-packages/charset_normalizer-3.5.1.dist-info/licenses/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 TAHRI Ahmed R.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
import sys
|
|
3
|
+
from unittest import TestCase, main
|
|
4
|
+
|
|
5
|
+
from ..ansi import Back, Fore, Style
|
|
6
|
+
from ..ansitowin32 import AnsiToWin32
|
|
7
|
+
|
|
8
|
+
stdout_orig = sys.stdout
|
|
9
|
+
stderr_orig = sys.stderr
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AnsiTest(TestCase):
|
|
13
|
+
|
|
14
|
+
def setUp(self):
|
|
15
|
+
# sanity check: stdout should be a file or StringIO object.
|
|
16
|
+
# It will only be AnsiToWin32 if init() has previously wrapped it
|
|
17
|
+
self.assertNotEqual(type(sys.stdout), AnsiToWin32)
|
|
18
|
+
self.assertNotEqual(type(sys.stderr), AnsiToWin32)
|
|
19
|
+
|
|
20
|
+
def tearDown(self):
|
|
21
|
+
sys.stdout = stdout_orig
|
|
22
|
+
sys.stderr = stderr_orig
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def testForeAttributes(self):
|
|
26
|
+
self.assertEqual(Fore.BLACK, '\033[30m')
|
|
27
|
+
self.assertEqual(Fore.RED, '\033[31m')
|
|
28
|
+
self.assertEqual(Fore.GREEN, '\033[32m')
|
|
29
|
+
self.assertEqual(Fore.YELLOW, '\033[33m')
|
|
30
|
+
self.assertEqual(Fore.BLUE, '\033[34m')
|
|
31
|
+
self.assertEqual(Fore.MAGENTA, '\033[35m')
|
|
32
|
+
self.assertEqual(Fore.CYAN, '\033[36m')
|
|
33
|
+
self.assertEqual(Fore.WHITE, '\033[37m')
|
|
34
|
+
self.assertEqual(Fore.RESET, '\033[39m')
|
|
35
|
+
|
|
36
|
+
# Check the light, extended versions.
|
|
37
|
+
self.assertEqual(Fore.LIGHTBLACK_EX, '\033[90m')
|
|
38
|
+
self.assertEqual(Fore.LIGHTRED_EX, '\033[91m')
|
|
39
|
+
self.assertEqual(Fore.LIGHTGREEN_EX, '\033[92m')
|
|
40
|
+
self.assertEqual(Fore.LIGHTYELLOW_EX, '\033[93m')
|
|
41
|
+
self.assertEqual(Fore.LIGHTBLUE_EX, '\033[94m')
|
|
42
|
+
self.assertEqual(Fore.LIGHTMAGENTA_EX, '\033[95m')
|
|
43
|
+
self.assertEqual(Fore.LIGHTCYAN_EX, '\033[96m')
|
|
44
|
+
self.assertEqual(Fore.LIGHTWHITE_EX, '\033[97m')
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def testBackAttributes(self):
|
|
48
|
+
self.assertEqual(Back.BLACK, '\033[40m')
|
|
49
|
+
self.assertEqual(Back.RED, '\033[41m')
|
|
50
|
+
self.assertEqual(Back.GREEN, '\033[42m')
|
|
51
|
+
self.assertEqual(Back.YELLOW, '\033[43m')
|
|
52
|
+
self.assertEqual(Back.BLUE, '\033[44m')
|
|
53
|
+
self.assertEqual(Back.MAGENTA, '\033[45m')
|
|
54
|
+
self.assertEqual(Back.CYAN, '\033[46m')
|
|
55
|
+
self.assertEqual(Back.WHITE, '\033[47m')
|
|
56
|
+
self.assertEqual(Back.RESET, '\033[49m')
|
|
57
|
+
|
|
58
|
+
# Check the light, extended versions.
|
|
59
|
+
self.assertEqual(Back.LIGHTBLACK_EX, '\033[100m')
|
|
60
|
+
self.assertEqual(Back.LIGHTRED_EX, '\033[101m')
|
|
61
|
+
self.assertEqual(Back.LIGHTGREEN_EX, '\033[102m')
|
|
62
|
+
self.assertEqual(Back.LIGHTYELLOW_EX, '\033[103m')
|
|
63
|
+
self.assertEqual(Back.LIGHTBLUE_EX, '\033[104m')
|
|
64
|
+
self.assertEqual(Back.LIGHTMAGENTA_EX, '\033[105m')
|
|
65
|
+
self.assertEqual(Back.LIGHTCYAN_EX, '\033[106m')
|
|
66
|
+
self.assertEqual(Back.LIGHTWHITE_EX, '\033[107m')
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def testStyleAttributes(self):
|
|
70
|
+
self.assertEqual(Style.DIM, '\033[2m')
|
|
71
|
+
self.assertEqual(Style.NORMAL, '\033[22m')
|
|
72
|
+
self.assertEqual(Style.BRIGHT, '\033[1m')
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
if __name__ == '__main__':
|
|
76
|
+
main()
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
from io import StringIO, TextIOWrapper
|
|
3
|
+
from unittest import TestCase, main
|
|
4
|
+
try:
|
|
5
|
+
from contextlib import ExitStack
|
|
6
|
+
except ImportError:
|
|
7
|
+
# python 2
|
|
8
|
+
from contextlib2 import ExitStack
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
from unittest.mock import MagicMock, Mock, patch
|
|
12
|
+
except ImportError:
|
|
13
|
+
from mock import MagicMock, Mock, patch
|
|
14
|
+
|
|
15
|
+
from ..ansitowin32 import AnsiToWin32, StreamWrapper
|
|
16
|
+
from ..win32 import ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
|
17
|
+
from .utils import osname
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class StreamWrapperTest(TestCase):
|
|
21
|
+
|
|
22
|
+
def testIsAProxy(self):
|
|
23
|
+
mockStream = Mock()
|
|
24
|
+
wrapper = StreamWrapper(mockStream, None)
|
|
25
|
+
self.assertTrue( wrapper.random_attr is mockStream.random_attr )
|
|
26
|
+
|
|
27
|
+
def testDelegatesWrite(self):
|
|
28
|
+
mockStream = Mock()
|
|
29
|
+
mockConverter = Mock()
|
|
30
|
+
wrapper = StreamWrapper(mockStream, mockConverter)
|
|
31
|
+
wrapper.write('hello')
|
|
32
|
+
self.assertTrue(mockConverter.write.call_args, (('hello',), {}))
|
|
33
|
+
|
|
34
|
+
def testDelegatesContext(self):
|
|
35
|
+
mockConverter = Mock()
|
|
36
|
+
s = StringIO()
|
|
37
|
+
with StreamWrapper(s, mockConverter) as fp:
|
|
38
|
+
fp.write(u'hello')
|
|
39
|
+
self.assertTrue(s.closed)
|
|
40
|
+
|
|
41
|
+
def testProxyNoContextManager(self):
|
|
42
|
+
mockStream = MagicMock()
|
|
43
|
+
mockStream.__enter__.side_effect = AttributeError()
|
|
44
|
+
mockConverter = Mock()
|
|
45
|
+
with self.assertRaises(AttributeError) as excinfo:
|
|
46
|
+
with StreamWrapper(mockStream, mockConverter) as wrapper:
|
|
47
|
+
wrapper.write('hello')
|
|
48
|
+
|
|
49
|
+
def test_closed_shouldnt_raise_on_closed_stream(self):
|
|
50
|
+
stream = StringIO()
|
|
51
|
+
stream.close()
|
|
52
|
+
wrapper = StreamWrapper(stream, None)
|
|
53
|
+
self.assertEqual(wrapper.closed, True)
|
|
54
|
+
|
|
55
|
+
def test_closed_shouldnt_raise_on_detached_stream(self):
|
|
56
|
+
stream = TextIOWrapper(StringIO())
|
|
57
|
+
stream.detach()
|
|
58
|
+
wrapper = StreamWrapper(stream, None)
|
|
59
|
+
self.assertEqual(wrapper.closed, True)
|
|
60
|
+
|
|
61
|
+
class AnsiToWin32Test(TestCase):
|
|
62
|
+
|
|
63
|
+
def testInit(self):
|
|
64
|
+
mockStdout = Mock()
|
|
65
|
+
auto = Mock()
|
|
66
|
+
stream = AnsiToWin32(mockStdout, autoreset=auto)
|
|
67
|
+
self.assertEqual(stream.wrapped, mockStdout)
|
|
68
|
+
self.assertEqual(stream.autoreset, auto)
|
|
69
|
+
|
|
70
|
+
@patch('colorama.ansitowin32.winterm', None)
|
|
71
|
+
@patch('colorama.ansitowin32.winapi_test', lambda *_: True)
|
|
72
|
+
def testStripIsTrueOnWindows(self):
|
|
73
|
+
with osname('nt'):
|
|
74
|
+
mockStdout = Mock()
|
|
75
|
+
stream = AnsiToWin32(mockStdout)
|
|
76
|
+
self.assertTrue(stream.strip)
|
|
77
|
+
|
|
78
|
+
def testStripIsFalseOffWindows(self):
|
|
79
|
+
with osname('posix'):
|
|
80
|
+
mockStdout = Mock(closed=False)
|
|
81
|
+
stream = AnsiToWin32(mockStdout)
|
|
82
|
+
self.assertFalse(stream.strip)
|
|
83
|
+
|
|
84
|
+
def testWriteStripsAnsi(self):
|
|
85
|
+
mockStdout = Mock()
|
|
86
|
+
stream = AnsiToWin32(mockStdout)
|
|
87
|
+
stream.wrapped = Mock()
|
|
88
|
+
stream.write_and_convert = Mock()
|
|
89
|
+
stream.strip = True
|
|
90
|
+
|
|
91
|
+
stream.write('abc')
|
|
92
|
+
|
|
93
|
+
self.assertFalse(stream.wrapped.write.called)
|
|
94
|
+
self.assertEqual(stream.write_and_convert.call_args, (('abc',), {}))
|
|
95
|
+
|
|
96
|
+
def testWriteDoesNotStripAnsi(self):
|
|
97
|
+
mockStdout = Mock()
|
|
98
|
+
stream = AnsiToWin32(mockStdout)
|
|
99
|
+
stream.wrapped = Mock()
|
|
100
|
+
stream.write_and_convert = Mock()
|
|
101
|
+
stream.strip = False
|
|
102
|
+
stream.convert = False
|
|
103
|
+
|
|
104
|
+
stream.write('abc')
|
|
105
|
+
|
|
106
|
+
self.assertFalse(stream.write_and_convert.called)
|
|
107
|
+
self.assertEqual(stream.wrapped.write.call_args, (('abc',), {}))
|
|
108
|
+
|
|
109
|
+
def assert_autoresets(self, convert, autoreset=True):
|
|
110
|
+
stream = AnsiToWin32(Mock())
|
|
111
|
+
stream.convert = convert
|
|
112
|
+
stream.reset_all = Mock()
|
|
113
|
+
stream.autoreset = autoreset
|
|
114
|
+
stream.winterm = Mock()
|
|
115
|
+
|
|
116
|
+
stream.write('abc')
|
|
117
|
+
|
|
118
|
+
self.assertEqual(stream.reset_all.called, autoreset)
|
|
119
|
+
|
|
120
|
+
def testWriteAutoresets(self):
|
|
121
|
+
self.assert_autoresets(convert=True)
|
|
122
|
+
self.assert_autoresets(convert=False)
|
|
123
|
+
self.assert_autoresets(convert=True, autoreset=False)
|
|
124
|
+
self.assert_autoresets(convert=False, autoreset=False)
|
|
125
|
+
|
|
126
|
+
def testWriteAndConvertWritesPlainText(self):
|
|
127
|
+
stream = AnsiToWin32(Mock())
|
|
128
|
+
stream.write_and_convert( 'abc' )
|
|
129
|
+
self.assertEqual( stream.wrapped.write.call_args, (('abc',), {}) )
|
|
130
|
+
|
|
131
|
+
def testWriteAndConvertStripsAllValidAnsi(self):
|
|
132
|
+
stream = AnsiToWin32(Mock())
|
|
133
|
+
stream.call_win32 = Mock()
|
|
134
|
+
data = [
|
|
135
|
+
'abc\033[mdef',
|
|
136
|
+
'abc\033[0mdef',
|
|
137
|
+
'abc\033[2mdef',
|
|
138
|
+
'abc\033[02mdef',
|
|
139
|
+
'abc\033[002mdef',
|
|
140
|
+
'abc\033[40mdef',
|
|
141
|
+
'abc\033[040mdef',
|
|
142
|
+
'abc\033[0;1mdef',
|
|
143
|
+
'abc\033[40;50mdef',
|
|
144
|
+
'abc\033[50;30;40mdef',
|
|
145
|
+
'abc\033[Adef',
|
|
146
|
+
'abc\033[0Gdef',
|
|
147
|
+
'abc\033[1;20;128Hdef',
|
|
148
|
+
]
|
|
149
|
+
for datum in data:
|
|
150
|
+
stream.wrapped.write.reset_mock()
|
|
151
|
+
stream.write_and_convert( datum )
|
|
152
|
+
self.assertEqual(
|
|
153
|
+
[args[0] for args in stream.wrapped.write.call_args_list],
|
|
154
|
+
[ ('abc',), ('def',) ]
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def testWriteAndConvertSkipsEmptySnippets(self):
|
|
158
|
+
stream = AnsiToWin32(Mock())
|
|
159
|
+
stream.call_win32 = Mock()
|
|
160
|
+
stream.write_and_convert( '\033[40m\033[41m' )
|
|
161
|
+
self.assertFalse( stream.wrapped.write.called )
|
|
162
|
+
|
|
163
|
+
def testWriteAndConvertCallsWin32WithParamsAndCommand(self):
|
|
164
|
+
stream = AnsiToWin32(Mock())
|
|
165
|
+
stream.convert = True
|
|
166
|
+
stream.call_win32 = Mock()
|
|
167
|
+
stream.extract_params = Mock(return_value='params')
|
|
168
|
+
data = {
|
|
169
|
+
'abc\033[adef': ('a', 'params'),
|
|
170
|
+
'abc\033[;;bdef': ('b', 'params'),
|
|
171
|
+
'abc\033[0cdef': ('c', 'params'),
|
|
172
|
+
'abc\033[;;0;;Gdef': ('G', 'params'),
|
|
173
|
+
'abc\033[1;20;128Hdef': ('H', 'params'),
|
|
174
|
+
}
|
|
175
|
+
for datum, expected in data.items():
|
|
176
|
+
stream.call_win32.reset_mock()
|
|
177
|
+
stream.write_and_convert( datum )
|
|
178
|
+
self.assertEqual( stream.call_win32.call_args[0], expected )
|
|
179
|
+
|
|
180
|
+
def test_reset_all_shouldnt_raise_on_closed_orig_stdout(self):
|
|
181
|
+
stream = StringIO()
|
|
182
|
+
converter = AnsiToWin32(stream)
|
|
183
|
+
stream.close()
|
|
184
|
+
|
|
185
|
+
converter.reset_all()
|
|
186
|
+
|
|
187
|
+
def test_wrap_shouldnt_raise_on_closed_orig_stdout(self):
|
|
188
|
+
stream = StringIO()
|
|
189
|
+
stream.close()
|
|
190
|
+
with \
|
|
191
|
+
patch("colorama.ansitowin32.os.name", "nt"), \
|
|
192
|
+
patch("colorama.ansitowin32.winapi_test", lambda: True):
|
|
193
|
+
converter = AnsiToWin32(stream)
|
|
194
|
+
self.assertTrue(converter.strip)
|
|
195
|
+
self.assertFalse(converter.convert)
|
|
196
|
+
|
|
197
|
+
def test_wrap_shouldnt_raise_on_missing_closed_attr(self):
|
|
198
|
+
with \
|
|
199
|
+
patch("colorama.ansitowin32.os.name", "nt"), \
|
|
200
|
+
patch("colorama.ansitowin32.winapi_test", lambda: True):
|
|
201
|
+
converter = AnsiToWin32(object())
|
|
202
|
+
self.assertTrue(converter.strip)
|
|
203
|
+
self.assertFalse(converter.convert)
|
|
204
|
+
|
|
205
|
+
def testExtractParams(self):
|
|
206
|
+
stream = AnsiToWin32(Mock())
|
|
207
|
+
data = {
|
|
208
|
+
'': (0,),
|
|
209
|
+
';;': (0,),
|
|
210
|
+
'2': (2,),
|
|
211
|
+
';;002;;': (2,),
|
|
212
|
+
'0;1': (0, 1),
|
|
213
|
+
';;003;;456;;': (3, 456),
|
|
214
|
+
'11;22;33;44;55': (11, 22, 33, 44, 55),
|
|
215
|
+
}
|
|
216
|
+
for datum, expected in data.items():
|
|
217
|
+
self.assertEqual(stream.extract_params('m', datum), expected)
|
|
218
|
+
|
|
219
|
+
def testCallWin32UsesLookup(self):
|
|
220
|
+
listener = Mock()
|
|
221
|
+
stream = AnsiToWin32(listener)
|
|
222
|
+
stream.win32_calls = {
|
|
223
|
+
1: (lambda *_, **__: listener(11),),
|
|
224
|
+
2: (lambda *_, **__: listener(22),),
|
|
225
|
+
3: (lambda *_, **__: listener(33),),
|
|
226
|
+
}
|
|
227
|
+
stream.call_win32('m', (3, 1, 99, 2))
|
|
228
|
+
self.assertEqual(
|
|
229
|
+
[a[0][0] for a in listener.call_args_list],
|
|
230
|
+
[33, 11, 22] )
|
|
231
|
+
|
|
232
|
+
def test_osc_codes(self):
|
|
233
|
+
mockStdout = Mock()
|
|
234
|
+
stream = AnsiToWin32(mockStdout, convert=True)
|
|
235
|
+
with patch('colorama.ansitowin32.winterm') as winterm:
|
|
236
|
+
data = [
|
|
237
|
+
'\033]0\x07', # missing arguments
|
|
238
|
+
'\033]0;foo\x08', # wrong OSC command
|
|
239
|
+
'\033]0;colorama_test_title\x07', # should work
|
|
240
|
+
'\033]1;colorama_test_title\x07', # wrong set command
|
|
241
|
+
'\033]2;colorama_test_title\x07', # should work
|
|
242
|
+
'\033]' + ';' * 64 + '\x08', # see issue #247
|
|
243
|
+
]
|
|
244
|
+
for code in data:
|
|
245
|
+
stream.write(code)
|
|
246
|
+
self.assertEqual(winterm.set_title.call_count, 2)
|
|
247
|
+
|
|
248
|
+
def test_native_windows_ansi(self):
|
|
249
|
+
with ExitStack() as stack:
|
|
250
|
+
def p(a, b):
|
|
251
|
+
stack.enter_context(patch(a, b, create=True))
|
|
252
|
+
# Pretend to be on Windows
|
|
253
|
+
p("colorama.ansitowin32.os.name", "nt")
|
|
254
|
+
p("colorama.ansitowin32.winapi_test", lambda: True)
|
|
255
|
+
p("colorama.win32.winapi_test", lambda: True)
|
|
256
|
+
p("colorama.winterm.win32.windll", "non-None")
|
|
257
|
+
p("colorama.winterm.get_osfhandle", lambda _: 1234)
|
|
258
|
+
|
|
259
|
+
# Pretend that our mock stream has native ANSI support
|
|
260
|
+
p(
|
|
261
|
+
"colorama.winterm.win32.GetConsoleMode",
|
|
262
|
+
lambda _: ENABLE_VIRTUAL_TERMINAL_PROCESSING,
|
|
263
|
+
)
|
|
264
|
+
SetConsoleMode = Mock()
|
|
265
|
+
p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode)
|
|
266
|
+
|
|
267
|
+
stdout = Mock()
|
|
268
|
+
stdout.closed = False
|
|
269
|
+
stdout.isatty.return_value = True
|
|
270
|
+
stdout.fileno.return_value = 1
|
|
271
|
+
|
|
272
|
+
# Our fake console says it has native vt support, so AnsiToWin32 should
|
|
273
|
+
# enable that support and do nothing else.
|
|
274
|
+
stream = AnsiToWin32(stdout)
|
|
275
|
+
SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING)
|
|
276
|
+
self.assertFalse(stream.strip)
|
|
277
|
+
self.assertFalse(stream.convert)
|
|
278
|
+
self.assertFalse(stream.should_wrap())
|
|
279
|
+
|
|
280
|
+
# Now let's pretend we're on an old Windows console, that doesn't have
|
|
281
|
+
# native ANSI support.
|
|
282
|
+
p("colorama.winterm.win32.GetConsoleMode", lambda _: 0)
|
|
283
|
+
SetConsoleMode = Mock()
|
|
284
|
+
p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode)
|
|
285
|
+
|
|
286
|
+
stream = AnsiToWin32(stdout)
|
|
287
|
+
SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING)
|
|
288
|
+
self.assertTrue(stream.strip)
|
|
289
|
+
self.assertTrue(stream.convert)
|
|
290
|
+
self.assertTrue(stream.should_wrap())
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
if __name__ == '__main__':
|
|
294
|
+
main()
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
import sys
|
|
3
|
+
from unittest import TestCase, main, skipUnless
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
from unittest.mock import patch, Mock
|
|
7
|
+
except ImportError:
|
|
8
|
+
from mock import patch, Mock
|
|
9
|
+
|
|
10
|
+
from ..ansitowin32 import StreamWrapper
|
|
11
|
+
from ..initialise import init, just_fix_windows_console, _wipe_internal_state_for_tests
|
|
12
|
+
from .utils import osname, replace_by
|
|
13
|
+
|
|
14
|
+
orig_stdout = sys.stdout
|
|
15
|
+
orig_stderr = sys.stderr
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class InitTest(TestCase):
|
|
19
|
+
|
|
20
|
+
@skipUnless(sys.stdout.isatty(), "sys.stdout is not a tty")
|
|
21
|
+
def setUp(self):
|
|
22
|
+
# sanity check
|
|
23
|
+
self.assertNotWrapped()
|
|
24
|
+
|
|
25
|
+
def tearDown(self):
|
|
26
|
+
_wipe_internal_state_for_tests()
|
|
27
|
+
sys.stdout = orig_stdout
|
|
28
|
+
sys.stderr = orig_stderr
|
|
29
|
+
|
|
30
|
+
def assertWrapped(self):
|
|
31
|
+
self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped')
|
|
32
|
+
self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped')
|
|
33
|
+
self.assertTrue(isinstance(sys.stdout, StreamWrapper),
|
|
34
|
+
'bad stdout wrapper')
|
|
35
|
+
self.assertTrue(isinstance(sys.stderr, StreamWrapper),
|
|
36
|
+
'bad stderr wrapper')
|
|
37
|
+
|
|
38
|
+
def assertNotWrapped(self):
|
|
39
|
+
self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped')
|
|
40
|
+
self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped')
|
|
41
|
+
|
|
42
|
+
@patch('colorama.initialise.reset_all')
|
|
43
|
+
@patch('colorama.ansitowin32.winapi_test', lambda *_: True)
|
|
44
|
+
@patch('colorama.ansitowin32.enable_vt_processing', lambda *_: False)
|
|
45
|
+
def testInitWrapsOnWindows(self, _):
|
|
46
|
+
with osname("nt"):
|
|
47
|
+
init()
|
|
48
|
+
self.assertWrapped()
|
|
49
|
+
|
|
50
|
+
@patch('colorama.initialise.reset_all')
|
|
51
|
+
@patch('colorama.ansitowin32.winapi_test', lambda *_: False)
|
|
52
|
+
def testInitDoesntWrapOnEmulatedWindows(self, _):
|
|
53
|
+
with osname("nt"):
|
|
54
|
+
init()
|
|
55
|
+
self.assertNotWrapped()
|
|
56
|
+
|
|
57
|
+
def testInitDoesntWrapOnNonWindows(self):
|
|
58
|
+
with osname("posix"):
|
|
59
|
+
init()
|
|
60
|
+
self.assertNotWrapped()
|
|
61
|
+
|
|
62
|
+
def testInitDoesntWrapIfNone(self):
|
|
63
|
+
with replace_by(None):
|
|
64
|
+
init()
|
|
65
|
+
# We can't use assertNotWrapped here because replace_by(None)
|
|
66
|
+
# changes stdout/stderr already.
|
|
67
|
+
self.assertIsNone(sys.stdout)
|
|
68
|
+
self.assertIsNone(sys.stderr)
|
|
69
|
+
|
|
70
|
+
def testInitAutoresetOnWrapsOnAllPlatforms(self):
|
|
71
|
+
with osname("posix"):
|
|
72
|
+
init(autoreset=True)
|
|
73
|
+
self.assertWrapped()
|
|
74
|
+
|
|
75
|
+
def testInitWrapOffDoesntWrapOnWindows(self):
|
|
76
|
+
with osname("nt"):
|
|
77
|
+
init(wrap=False)
|
|
78
|
+
self.assertNotWrapped()
|
|
79
|
+
|
|
80
|
+
def testInitWrapOffIncompatibleWithAutoresetOn(self):
|
|
81
|
+
self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False))
|
|
82
|
+
|
|
83
|
+
@patch('colorama.win32.SetConsoleTextAttribute')
|
|
84
|
+
@patch('colorama.initialise.AnsiToWin32')
|
|
85
|
+
def testAutoResetPassedOn(self, mockATW32, _):
|
|
86
|
+
with osname("nt"):
|
|
87
|
+
init(autoreset=True)
|
|
88
|
+
self.assertEqual(len(mockATW32.call_args_list), 2)
|
|
89
|
+
self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True)
|
|
90
|
+
self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True)
|
|
91
|
+
|
|
92
|
+
@patch('colorama.initialise.AnsiToWin32')
|
|
93
|
+
def testAutoResetChangeable(self, mockATW32):
|
|
94
|
+
with osname("nt"):
|
|
95
|
+
init()
|
|
96
|
+
|
|
97
|
+
init(autoreset=True)
|
|
98
|
+
self.assertEqual(len(mockATW32.call_args_list), 4)
|
|
99
|
+
self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True)
|
|
100
|
+
self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True)
|
|
101
|
+
|
|
102
|
+
init()
|
|
103
|
+
self.assertEqual(len(mockATW32.call_args_list), 6)
|
|
104
|
+
self.assertEqual(
|
|
105
|
+
mockATW32.call_args_list[4][1]['autoreset'], False)
|
|
106
|
+
self.assertEqual(
|
|
107
|
+
mockATW32.call_args_list[5][1]['autoreset'], False)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@patch('colorama.initialise.atexit.register')
|
|
111
|
+
def testAtexitRegisteredOnlyOnce(self, mockRegister):
|
|
112
|
+
init()
|
|
113
|
+
self.assertTrue(mockRegister.called)
|
|
114
|
+
mockRegister.reset_mock()
|
|
115
|
+
init()
|
|
116
|
+
self.assertFalse(mockRegister.called)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class JustFixWindowsConsoleTest(TestCase):
|
|
120
|
+
def _reset(self):
|
|
121
|
+
_wipe_internal_state_for_tests()
|
|
122
|
+
sys.stdout = orig_stdout
|
|
123
|
+
sys.stderr = orig_stderr
|
|
124
|
+
|
|
125
|
+
def tearDown(self):
|
|
126
|
+
self._reset()
|
|
127
|
+
|
|
128
|
+
@patch("colorama.ansitowin32.winapi_test", lambda: True)
|
|
129
|
+
def testJustFixWindowsConsole(self):
|
|
130
|
+
if sys.platform != "win32":
|
|
131
|
+
# just_fix_windows_console should be a no-op
|
|
132
|
+
just_fix_windows_console()
|
|
133
|
+
self.assertIs(sys.stdout, orig_stdout)
|
|
134
|
+
self.assertIs(sys.stderr, orig_stderr)
|
|
135
|
+
else:
|
|
136
|
+
def fake_std():
|
|
137
|
+
# Emulate stdout=not a tty, stderr=tty
|
|
138
|
+
# to check that we handle both cases correctly
|
|
139
|
+
stdout = Mock()
|
|
140
|
+
stdout.closed = False
|
|
141
|
+
stdout.isatty.return_value = False
|
|
142
|
+
stdout.fileno.return_value = 1
|
|
143
|
+
sys.stdout = stdout
|
|
144
|
+
|
|
145
|
+
stderr = Mock()
|
|
146
|
+
stderr.closed = False
|
|
147
|
+
stderr.isatty.return_value = True
|
|
148
|
+
stderr.fileno.return_value = 2
|
|
149
|
+
sys.stderr = stderr
|
|
150
|
+
|
|
151
|
+
for native_ansi in [False, True]:
|
|
152
|
+
with patch(
|
|
153
|
+
'colorama.ansitowin32.enable_vt_processing',
|
|
154
|
+
lambda *_: native_ansi
|
|
155
|
+
):
|
|
156
|
+
self._reset()
|
|
157
|
+
fake_std()
|
|
158
|
+
|
|
159
|
+
# Regular single-call test
|
|
160
|
+
prev_stdout = sys.stdout
|
|
161
|
+
prev_stderr = sys.stderr
|
|
162
|
+
just_fix_windows_console()
|
|
163
|
+
self.assertIs(sys.stdout, prev_stdout)
|
|
164
|
+
if native_ansi:
|
|
165
|
+
self.assertIs(sys.stderr, prev_stderr)
|
|
166
|
+
else:
|
|
167
|
+
self.assertIsNot(sys.stderr, prev_stderr)
|
|
168
|
+
|
|
169
|
+
# second call without resetting is always a no-op
|
|
170
|
+
prev_stdout = sys.stdout
|
|
171
|
+
prev_stderr = sys.stderr
|
|
172
|
+
just_fix_windows_console()
|
|
173
|
+
self.assertIs(sys.stdout, prev_stdout)
|
|
174
|
+
self.assertIs(sys.stderr, prev_stderr)
|
|
175
|
+
|
|
176
|
+
self._reset()
|
|
177
|
+
fake_std()
|
|
178
|
+
|
|
179
|
+
# If init() runs first, just_fix_windows_console should be a no-op
|
|
180
|
+
init()
|
|
181
|
+
prev_stdout = sys.stdout
|
|
182
|
+
prev_stderr = sys.stderr
|
|
183
|
+
just_fix_windows_console()
|
|
184
|
+
self.assertIs(prev_stdout, sys.stdout)
|
|
185
|
+
self.assertIs(prev_stderr, sys.stderr)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
if __name__ == '__main__':
|
|
189
|
+
main()
|