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.
Files changed (125) hide show
  1. kurumera-0.1.0/.gitignore +7 -0
  2. kurumera-0.1.0/.release-venv/Lib/site-packages/build-1.6.1.dist-info/licenses/LICENSE +20 -0
  3. kurumera-0.1.0/.release-venv/Lib/site-packages/certifi/tests/__init__.py +0 -0
  4. kurumera-0.1.0/.release-venv/Lib/site-packages/certifi/tests/test_certify.py +18 -0
  5. kurumera-0.1.0/.release-venv/Lib/site-packages/certifi-2026.7.22.dist-info/licenses/LICENSE +20 -0
  6. kurumera-0.1.0/.release-venv/Lib/site-packages/charset_normalizer-3.5.1.dist-info/licenses/LICENSE +21 -0
  7. kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/__init__.py +1 -0
  8. kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/ansi_test.py +76 -0
  9. kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/ansitowin32_test.py +294 -0
  10. kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/initialise_test.py +189 -0
  11. kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/isatty_test.py +57 -0
  12. kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/utils.py +49 -0
  13. kurumera-0.1.0/.release-venv/Lib/site-packages/colorama/tests/winterm_test.py +131 -0
  14. kurumera-0.1.0/.release-venv/Lib/site-packages/id-1.6.1.dist-info/licenses/LICENSE +202 -0
  15. kurumera-0.1.0/.release-venv/Lib/site-packages/jaraco.classes-3.4.0.dist-info/LICENSE +17 -0
  16. kurumera-0.1.0/.release-venv/Lib/site-packages/jaraco_context-6.1.2.dist-info/licenses/LICENSE +18 -0
  17. kurumera-0.1.0/.release-venv/Lib/site-packages/jaraco_functools-4.6.0.dist-info/licenses/LICENSE +18 -0
  18. kurumera-0.1.0/.release-venv/Lib/site-packages/keyring-25.7.0.dist-info/licenses/LICENSE +18 -0
  19. kurumera-0.1.0/.release-venv/Lib/site-packages/markdown_it_py-4.2.0.dist-info/licenses/LICENSE +21 -0
  20. kurumera-0.1.0/.release-venv/Lib/site-packages/mdurl-0.1.2.dist-info/LICENSE +46 -0
  21. kurumera-0.1.0/.release-venv/Lib/site-packages/more_itertools-11.1.0.dist-info/licenses/LICENSE +19 -0
  22. kurumera-0.1.0/.release-venv/Lib/site-packages/nh3-0.3.7.dist-info/licenses/LICENSE +21 -0
  23. kurumera-0.1.0/.release-venv/Lib/site-packages/packaging-26.3.dist-info/licenses/LICENSE +3 -0
  24. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/certifi/LICENSE +20 -0
  25. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/distro/LICENSE +202 -0
  26. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/packaging/LICENSE +3 -0
  27. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/pkg_resources/LICENSE +17 -0
  28. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/platformdirs/LICENSE +21 -0
  29. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/pygments/LICENSE +25 -0
  30. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/pyproject_hooks/LICENSE +21 -0
  31. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/requests/LICENSE +175 -0
  32. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/resolvelib/LICENSE +13 -0
  33. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/rich/LICENSE +19 -0
  34. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/tomli/LICENSE +21 -0
  35. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/tomli_w/LICENSE +21 -0
  36. kurumera-0.1.0/.release-venv/Lib/site-packages/pip/_vendor/truststore/LICENSE +21 -0
  37. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/certifi/LICENSE +20 -0
  38. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/distro/LICENSE +202 -0
  39. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/packaging/LICENSE +3 -0
  40. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE +17 -0
  41. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE +21 -0
  42. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pygments/LICENSE +25 -0
  43. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE +21 -0
  44. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/requests/LICENSE +175 -0
  45. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE +13 -0
  46. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/rich/LICENSE +19 -0
  47. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/tomli/LICENSE +21 -0
  48. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE +21 -0
  49. kurumera-0.1.0/.release-venv/Lib/site-packages/pip-25.3.dist-info/licenses/src/pip/_vendor/truststore/LICENSE +21 -0
  50. kurumera-0.1.0/.release-venv/Lib/site-packages/pygments-2.21.0.dist-info/licenses/LICENSE +25 -0
  51. kurumera-0.1.0/.release-venv/Lib/site-packages/pyproject_hooks-1.3.3.dist-info/licenses/LICENSE +21 -0
  52. kurumera-0.1.0/.release-venv/Lib/site-packages/readme_renderer-46.0.dist-info/licenses/LICENSE +174 -0
  53. kurumera-0.1.0/.release-venv/Lib/site-packages/requests-2.34.2.dist-info/licenses/LICENSE +175 -0
  54. kurumera-0.1.0/.release-venv/Lib/site-packages/requests_toolbelt-1.0.0.dist-info/LICENSE +13 -0
  55. kurumera-0.1.0/.release-venv/Lib/site-packages/rfc3986-2.0.0.dist-info/LICENSE +13 -0
  56. kurumera-0.1.0/.release-venv/Lib/site-packages/rich-15.0.0.dist-info/licenses/LICENSE +19 -0
  57. kurumera-0.1.0/.release-venv/Lib/site-packages/twine-7.0.0.dist-info/licenses/LICENSE +174 -0
  58. kurumera-0.1.0/.release-venv/Lib/site-packages/win32ctypes/tests/__init__.py +21 -0
  59. kurumera-0.1.0/.release-venv/Lib/site-packages/win32ctypes/tests/test_backends.py +36 -0
  60. kurumera-0.1.0/.release-venv/Lib/site-packages/win32ctypes/tests/test_win32api.py +304 -0
  61. kurumera-0.1.0/.release-venv/Lib/site-packages/win32ctypes/tests/test_win32cred.py +230 -0
  62. kurumera-0.1.0/LICENSE +21 -0
  63. kurumera-0.1.0/PKG-INFO +205 -0
  64. kurumera-0.1.0/README.md +183 -0
  65. kurumera-0.1.0/docs/TOOLS.md +274 -0
  66. kurumera-0.1.0/pyproject.toml +47 -0
  67. kurumera-0.1.0/src/kurumera/__init__.py +66 -0
  68. kurumera-0.1.0/src/kurumera/_generated/__init__.py +122 -0
  69. kurumera-0.1.0/src/kurumera/_generated/alias_tools.py +65 -0
  70. kurumera-0.1.0/src/kurumera/_generated/analytics_tools.py +169 -0
  71. kurumera-0.1.0/src/kurumera/_generated/blog_tools.py +100 -0
  72. kurumera-0.1.0/src/kurumera/_generated/branch_tools.py +91 -0
  73. kurumera-0.1.0/src/kurumera/_generated/branding_tools.py +98 -0
  74. kurumera-0.1.0/src/kurumera/_generated/campaign_tools.py +103 -0
  75. kurumera-0.1.0/src/kurumera/_generated/cart_tools.py +58 -0
  76. kurumera-0.1.0/src/kurumera/_generated/collection_tools.py +189 -0
  77. kurumera-0.1.0/src/kurumera/_generated/commercial_tools.py +161 -0
  78. kurumera-0.1.0/src/kurumera/_generated/content_access.py +82 -0
  79. kurumera-0.1.0/src/kurumera/_generated/content_delete.py +49 -0
  80. kurumera-0.1.0/src/kurumera/_generated/crm_file_tools.py +118 -0
  81. kurumera-0.1.0/src/kurumera/_generated/crm_tools.py +1118 -0
  82. kurumera-0.1.0/src/kurumera/_generated/currency_tools.py +72 -0
  83. kurumera-0.1.0/src/kurumera/_generated/customer_tools.py +71 -0
  84. kurumera-0.1.0/src/kurumera/_generated/discount_tools.py +45 -0
  85. kurumera-0.1.0/src/kurumera/_generated/doc_tools.py +102 -0
  86. kurumera-0.1.0/src/kurumera/_generated/email_tools.py +236 -0
  87. kurumera-0.1.0/src/kurumera/_generated/faq_tools.py +50 -0
  88. kurumera-0.1.0/src/kurumera/_generated/finance_tools.py +173 -0
  89. kurumera-0.1.0/src/kurumera/_generated/forecast_tools.py +211 -0
  90. kurumera-0.1.0/src/kurumera/_generated/form_tools.py +64 -0
  91. kurumera-0.1.0/src/kurumera/_generated/gift_card_tools.py +60 -0
  92. kurumera-0.1.0/src/kurumera/_generated/inbox_tools.py +256 -0
  93. kurumera-0.1.0/src/kurumera/_generated/inventory_tools.py +156 -0
  94. kurumera-0.1.0/src/kurumera/_generated/invoice_tools.py +259 -0
  95. kurumera-0.1.0/src/kurumera/_generated/media_library_tools.py +114 -0
  96. kurumera-0.1.0/src/kurumera/_generated/media_tools.py +188 -0
  97. kurumera-0.1.0/src/kurumera/_generated/merge_tools.py +148 -0
  98. kurumera-0.1.0/src/kurumera/_generated/merged_tools.py +249 -0
  99. kurumera-0.1.0/src/kurumera/_generated/migration_tools.py +126 -0
  100. kurumera-0.1.0/src/kurumera/_generated/nav_tools.py +58 -0
  101. kurumera-0.1.0/src/kurumera/_generated/notification_tools.py +45 -0
  102. kurumera-0.1.0/src/kurumera/_generated/order_tools.py +245 -0
  103. kurumera-0.1.0/src/kurumera/_generated/page_locale_tools.py +96 -0
  104. kurumera-0.1.0/src/kurumera/_generated/page_tools.py +106 -0
  105. kurumera-0.1.0/src/kurumera/_generated/pagebuilder_authoring_tools.py +178 -0
  106. kurumera-0.1.0/src/kurumera/_generated/pagebuilder_component_tools.py +75 -0
  107. kurumera-0.1.0/src/kurumera/_generated/pagebuilder_visual_tools.py +42 -0
  108. kurumera-0.1.0/src/kurumera/_generated/pos_tools.py +54 -0
  109. kurumera-0.1.0/src/kurumera/_generated/product_tools.py +248 -0
  110. kurumera-0.1.0/src/kurumera/_generated/review_tools.py +41 -0
  111. kurumera-0.1.0/src/kurumera/_generated/site_gen_tools.py +115 -0
  112. kurumera-0.1.0/src/kurumera/_generated/social_tools.py +165 -0
  113. kurumera-0.1.0/src/kurumera/_generated/store_tools.py +46 -0
  114. kurumera-0.1.0/src/kurumera/_generated/translation_tools.py +67 -0
  115. kurumera-0.1.0/src/kurumera/_generated/webhook_tools.py +58 -0
  116. kurumera-0.1.0/src/kurumera/_transport.py +227 -0
  117. kurumera-0.1.0/src/kurumera/_version.py +1 -0
  118. kurumera-0.1.0/src/kurumera/client.py +266 -0
  119. kurumera-0.1.0/src/kurumera/credentials.py +146 -0
  120. kurumera-0.1.0/src/kurumera/errors.py +264 -0
  121. kurumera-0.1.0/src/kurumera/py.typed +0 -0
  122. kurumera-0.1.0/src/kurumera/registry.json +12990 -0
  123. kurumera-0.1.0/src/kurumera/registry.py +89 -0
  124. kurumera-0.1.0/src/kurumera/types.py +199 -0
  125. kurumera-0.1.0/tests/test_sdk.py +404 -0
@@ -0,0 +1,7 @@
1
+ # Build artifacts. Never commit these: the only copy that matters is the one on
2
+ # PyPI, and a stale wheel in the tree is how the wrong version gets uploaded.
3
+ dist/
4
+ build/
5
+ *.egg-info/
6
+ __pycache__/
7
+ .release-venv/
@@ -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.
@@ -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 $
@@ -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()