forked from pool/python-texttable
		
	Accepting request 676515 from home:jayvdb:pyexcel
- Update to 1.6.0 * Added texttable.pyi * Added missing set_header_align method stub * Allow chaining of method calls * Replace distutils with setuptools * Create a method for redefining the max_width * Switch to MIT License * Use wcwidth if available for better rendering (basic emoji support) * Update README.md OBS-URL: https://build.opensuse.org/request/show/676515 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-texttable?expand=0&rev=9
This commit is contained in:
		
				
					committed by
					
						 Git OBS Bridge
						Git OBS Bridge
					
				
			
			
				
	
			
			
			
						parent
						
							15934b809b
						
					
				
				
					commit
					4acbb44c14
				
			
							
								
								
									
										22
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| The MIT License (MIT) | ||||
|  | ||||
| Copyright (c) 2018 Gerome Fournier | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|  | ||||
| @@ -1,3 +1,16 @@ | ||||
| ------------------------------------------------------------------- | ||||
| Fri Feb 15 01:35:10 UTC 2019 - John Vandenberg <jayvdb@gmail.com> | ||||
|  | ||||
| - Update to 1.6.0 | ||||
|   * Added texttable.pyi  | ||||
|   * Added missing set_header_align method stub | ||||
|   * Allow chaining of method calls | ||||
|   * Replace distutils with setuptools | ||||
|   * Create a method for redefining the max_width  | ||||
|   * Switch to MIT License | ||||
|   * Use wcwidth if available for better rendering (basic emoji support) | ||||
|   * Update README.md  | ||||
|  | ||||
| ------------------------------------------------------------------- | ||||
| Fri Jul 20 11:36:41 UTC 2018 - tchvatal@suse.com | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| # | ||||
| # spec file for package python-texttable | ||||
| # | ||||
| # Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. | ||||
| # Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. | ||||
| # | ||||
| # All modifications and additions to the file contributed by third parties | ||||
| # remain the property of their copyright owners, unless otherwise agreed | ||||
| @@ -12,25 +12,28 @@ | ||||
| # license that conforms to the Open Source Definition (Version 1.9) | ||||
| # published by the Open Source Initiative. | ||||
|  | ||||
| # Please submit bugfixes or comments via http://bugs.opensuse.org/ | ||||
| # Please submit bugfixes or comments via https://bugs.opensuse.org/ | ||||
| # | ||||
|  | ||||
|  | ||||
| %{?!python_module:%define python_module() python-%{**} python3-%{**}} | ||||
| Name:           python-texttable | ||||
| Version:        1.4.0 | ||||
| Version:        1.6.0 | ||||
| Release:        0 | ||||
| Summary:        Module for creating simple ASCII tables | ||||
| License:        LGPL-3.0-only | ||||
| License:        MIT | ||||
| Group:          Development/Languages/Python | ||||
| Url:            https://github.com/foutaise/texttable/ | ||||
| URL:            https://github.com/foutaise/texttable/ | ||||
| Source:         https://files.pythonhosted.org/packages/source/t/texttable/texttable-%{version}.tar.gz | ||||
| Source1:        https://raw.githubusercontent.com/foutaise/texttable/v%{version}/LICENSE | ||||
| Source2:        https://raw.githubusercontent.com/foutaise/texttable/master/tests.py | ||||
| BuildRequires:  %{python_module pytest} | ||||
| BuildRequires:  %{python_module setuptools} | ||||
| BuildRequires:  fdupes | ||||
| BuildRequires:  python-rpm-macros | ||||
| Requires:       python-base | ||||
| Recommends:     python-wcwidth | ||||
| BuildArch:      noarch | ||||
|  | ||||
| %python_subpackages | ||||
|  | ||||
| %description | ||||
| @@ -39,6 +42,7 @@ characters. | ||||
|  | ||||
| %prep | ||||
| %setup -q -n texttable-%{version} | ||||
| cp %{SOURCE1} %{SOURCE2} . | ||||
|  | ||||
| %build | ||||
| %python_build | ||||
|   | ||||
							
								
								
									
										290
									
								
								tests.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										290
									
								
								tests.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,290 @@ | ||||
| #coding: utf-8 | ||||
|  | ||||
| import re | ||||
| import sys | ||||
| from textwrap import dedent | ||||
| from texttable import Texttable | ||||
|  | ||||
| if sys.version >= '3': | ||||
|     u_dedent = dedent | ||||
| else: | ||||
|     def u_dedent(b): | ||||
|        return unicode(dedent(b), 'utf-8') | ||||
|  | ||||
| def clean(text): | ||||
|     return re.sub(r'( +)$', '', text, flags=re.MULTILINE) + '\n' | ||||
|  | ||||
| def test_texttable(): | ||||
|     table = Texttable() | ||||
|     table.set_cols_align(["l", "r", "c"]) | ||||
|     table.set_cols_valign(["t", "m", "b"]) | ||||
|     table.add_rows([ | ||||
|         ["Name", "Age", "Nickname"], | ||||
|         ["Mr\nXavier\nHuon", 32, "Xav'"], | ||||
|         ["Mr\nBaptiste\nClement", 1, "Baby"], | ||||
|         ["Mme\nLouise\nBourgeau", 28, "Lou\n \nLoue"], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == dedent('''\ | ||||
|         +----------+-----+----------+ | ||||
|         |   Name   | Age | Nickname | | ||||
|         +==========+=====+==========+ | ||||
|         | Mr       |     |          | | ||||
|         | Xavier   |  32 |          | | ||||
|         | Huon     |     |   Xav'   | | ||||
|         +----------+-----+----------+ | ||||
|         | Mr       |     |          | | ||||
|         | Baptiste |   1 |          | | ||||
|         | Clement  |     |   Baby   | | ||||
|         +----------+-----+----------+ | ||||
|         | Mme      |     |   Lou    | | ||||
|         | Louise   |  28 |          | | ||||
|         | Bourgeau |     |   Loue   | | ||||
|         +----------+-----+----------+ | ||||
|     ''') | ||||
|  | ||||
| def test_texttable_header(): | ||||
|     table = Texttable() | ||||
|     table.set_deco(Texttable.HEADER) | ||||
|     table.set_cols_dtype([ | ||||
|         't',  # text | ||||
|         'f',  # float (decimal) | ||||
|         'e',  # float (exponent) | ||||
|         'i',  # integer | ||||
|         'a',  # automatic | ||||
|     ]) | ||||
|     table.set_cols_align(["l", "r", "r", "r", "l"]) | ||||
|     table.add_rows([ | ||||
|         ["text",    "float", "exp", "int", "auto"], | ||||
|         ["abcd",    "67",    654,   89,    128.001], | ||||
|         ["efghijk", 67.5434, .654,  89.6,  12800000000000000000000.00023], | ||||
|         ["lmn",     5e-78,   5e-78, 89.4,  .000000000000128], | ||||
|         ["opqrstu", .023,    5e+78, 92.,   12800000000000000000000], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == dedent('''\ | ||||
|          text     float       exp      int     auto | ||||
|         ============================================== | ||||
|         abcd      67.000   6.540e+02    89   128.001 | ||||
|         efghijk   67.543   6.540e-01    90   1.280e+22 | ||||
|         lmn        0.000   5.000e-78    89   0.000 | ||||
|         opqrstu    0.023   5.000e+78    92   1.280e+22 | ||||
|     ''') | ||||
|  | ||||
| def test_set_cols_width(): | ||||
|     table = Texttable() | ||||
|     table.set_deco(Texttable.HEADER) | ||||
|     table.set_cols_width([10, 10]) | ||||
|     table.add_rows([ | ||||
|         ["key", "value"], | ||||
|         [1,     "a"], | ||||
|         [2,     "b"], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == dedent('''\ | ||||
|            key         value | ||||
|         ======================= | ||||
|         1            a | ||||
|         2            b | ||||
|     ''') | ||||
|  | ||||
| def test_exceeding_max_width(): | ||||
|     table = Texttable(max_width=35) | ||||
|     table.set_deco(Texttable.HEADER) | ||||
|     table.add_rows([ | ||||
|         ["key", "value"], | ||||
|         [1,     "a"], | ||||
|         [2,     "b"], | ||||
|         [3,     "very long, very long, very long"], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == dedent('''\ | ||||
|         key               value | ||||
|         =================================== | ||||
|         1     a | ||||
|         2     b | ||||
|         3     very long, very long, very | ||||
|               long | ||||
|     ''') | ||||
|  | ||||
| def test_exceeding_max_width2(): | ||||
|     table = Texttable(max_width=14) | ||||
|     table.add_rows([ | ||||
|         ["a", "b"], | ||||
|         [1, "+"], | ||||
|         [22, "++++++++"], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == dedent('''\ | ||||
|         +----+-------+ | ||||
|         | a  |   b   | | ||||
|         +====+=======+ | ||||
|         | 1  | +     | | ||||
|         +----+-------+ | ||||
|         | 22 | +++++ | | ||||
|         |    | +++   | | ||||
|         +----+-------+ | ||||
|     ''') | ||||
|  | ||||
| def test_exceeding_max_width3(): | ||||
|     table = Texttable() | ||||
|     table.set_max_width(35) | ||||
|     table.set_deco(Texttable.HEADER) | ||||
|     table.add_rows([ | ||||
|         ["key", "value"], | ||||
|         [1,     "a"], | ||||
|         [2,     "b"], | ||||
|         [3,     "very long, very long, very long"], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == dedent('''\ | ||||
|         key               value | ||||
|         =================================== | ||||
|         1     a | ||||
|         2     b | ||||
|         3     very long, very long, very | ||||
|               long | ||||
|     ''') | ||||
|  | ||||
| def test_exceeding_max_width4(): | ||||
|     table = Texttable() | ||||
|     table.set_max_width(14) | ||||
|     table.add_rows([ | ||||
|         ["a", "b"], | ||||
|         [1, "+"], | ||||
|         [22, "++++++++"], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == dedent('''\ | ||||
|         +----+-------+ | ||||
|         | a  |   b   | | ||||
|         +====+=======+ | ||||
|         | 1  | +     | | ||||
|         +----+-------+ | ||||
|         | 22 | +++++ | | ||||
|         |    | +++   | | ||||
|         +----+-------+ | ||||
|     ''') | ||||
|  | ||||
| def test_obj2unicode(): | ||||
|     table = Texttable() | ||||
|     table.set_deco(Texttable.HEADER) | ||||
|     table.add_rows([ | ||||
|         ["key", "value"], | ||||
|         [1,     "a"], | ||||
|         [2,     1], | ||||
|         [3,     None], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == dedent('''\ | ||||
|         key   value | ||||
|         =========== | ||||
|         1     a | ||||
|         2     1 | ||||
|         3     None | ||||
|     ''') | ||||
|  | ||||
| def test_combining_char(): | ||||
|     table = Texttable() | ||||
|     table.set_cols_align(["l", "r", "r"]) | ||||
|     table.add_rows([ | ||||
|         ["str", "code-point\nlength", "display\nwidth"], | ||||
|         ["ā", 2, 1], | ||||
|         ["a", 1, 1], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == u_dedent('''\ | ||||
|         +-----+------------+---------+ | ||||
|         | str | code-point | display | | ||||
|         |     |   length   |  width  | | ||||
|         +=====+============+=========+ | ||||
|         | ā   |          2 |       1 | | ||||
|         +-----+------------+---------+ | ||||
|         | a   |          1 |       1 | | ||||
|         +-----+------------+---------+ | ||||
|     ''') | ||||
|  | ||||
| def test_combining_char2(): | ||||
|     table = Texttable() | ||||
|     table.add_rows([ | ||||
|         ["a", "b", "c"], | ||||
|         ["诶诶诶", "bbb", "西西西"], | ||||
|     ], False) | ||||
|     assert clean(table.draw()) == u_dedent('''\ | ||||
|         +--------+-----+--------+ | ||||
|         | a      | b   | c      | | ||||
|         +--------+-----+--------+ | ||||
|         | 诶诶诶 | bbb | 西西西 | | ||||
|         +--------+-----+--------+ | ||||
|     ''') | ||||
|  | ||||
|  | ||||
| def test_user_dtype(): | ||||
|     table = Texttable() | ||||
|  | ||||
|     table.set_cols_align(["l", "r", "r"]) | ||||
|     table.set_cols_dtype([ | ||||
|         'a',  # automatic | ||||
|         lambda s:str(s)+"s", # user-def | ||||
|         lambda s:('%s'%s) if s>=0 else '[%s]'%(-s),  # user-def | ||||
|     ]) | ||||
|     table.add_rows([ | ||||
|         ["str", "code-point\nlength", "display\nwidth"], | ||||
|         ["a", 2, 1], | ||||
|         ["a", 1,-3], | ||||
|     ]) | ||||
|     assert clean(table.draw()) == u_dedent('''\ | ||||
|         +-----+------------+---------+ | ||||
|         | str | code-point | display | | ||||
|         |     |   length   |  width  | | ||||
|         +=====+============+=========+ | ||||
|         | a   |         2s |       1 | | ||||
|         +-----+------------+---------+ | ||||
|         | a   |         1s |     [3] | | ||||
|         +-----+------------+---------+ | ||||
|     ''') | ||||
|  | ||||
| def test_cjkwarp(): | ||||
|     try: | ||||
|         import cjkwrap | ||||
|         table = Texttable() | ||||
|  | ||||
|         table.set_cols_align(["r", "l"]) | ||||
|         table.add_rows([ | ||||
|             ["Name", 'Discuz! 6.x/7.x 全局变量防御绕过导致命令执行'], | ||||
|             ["Description", '由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致Discuz! 6.x/7.x 全局变量防御绕过漏洞'], | ||||
|         ], header = False) | ||||
|         assert clean(table.draw()) == u_dedent('''\ | ||||
|             +-------------+----------------------------------------------------------------+ | ||||
|             |        Name | Discuz! 6.x/7.x 全局变量防御绕过导致命令执行                   | | ||||
|             +-------------+----------------------------------------------------------------+ | ||||
|             | Description | 由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致 | | ||||
|             |             | Discuz! 6.x/7.x 全局变量防御绕过漏洞                           | | ||||
|             +-------------+----------------------------------------------------------------+ | ||||
|         ''') | ||||
|     except ImportError: | ||||
|         True | ||||
|  | ||||
| def test_chaining(): | ||||
|     table = Texttable() | ||||
|     table.reset() | ||||
|     table.set_max_width(50) | ||||
|     table.set_chars(list('-|+=')) | ||||
|     table.set_deco(Texttable.BORDER) | ||||
|     table.set_header_align(list('lll')) | ||||
|     table.set_cols_align(list('lll')) | ||||
|     table.set_cols_valign(list('mmm')) | ||||
|     table.set_cols_dtype(list('ttt')) | ||||
|     table.set_cols_width([3, 3, 3]) | ||||
|     table.set_precision(3) | ||||
|     table.header(list('abc')) | ||||
|     table.add_row(list('def')) | ||||
|     table.add_rows([list('ghi')], False) | ||||
|     s1 = table.draw() | ||||
|     s2 = (Texttable() | ||||
|           .reset() | ||||
|           .set_max_width(50) | ||||
|           .set_chars(list('-|+=')) | ||||
|           .set_deco(Texttable.BORDER) | ||||
|           .set_header_align(list('lll')) | ||||
|           .set_cols_align(list('lll')) | ||||
|           .set_cols_valign(list('mmm')) | ||||
|           .set_cols_dtype(list('ttt')) | ||||
|           .set_cols_width([3, 3, 3]) | ||||
|           .set_precision(3) | ||||
|           .header(list('abc')) | ||||
|           .add_row(list('def')) | ||||
|           .add_rows([list('ghi')], False) | ||||
|           .draw()) | ||||
|     assert s1 == s2 | ||||
| @@ -1,3 +0,0 @@ | ||||
| version https://git-lfs.github.com/spec/v1 | ||||
| oid sha256:95e8cfe85f8395a7eacdfbc8f09d885b9ef3a6ac6ead0364ea721de1127aa36b | ||||
| size 12274 | ||||
							
								
								
									
										3
									
								
								texttable-1.6.0.tar.gz
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								texttable-1.6.0.tar.gz
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| version https://git-lfs.github.com/spec/v1 | ||||
| oid sha256:624b9d6a94255b3d168b22f0808b78eca8b765d8b14c095e530641b8655c7dfc | ||||
| size 9106 | ||||
		Reference in New Issue
	
	Block a user