diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b677982 --- /dev/null +++ b/LICENSE @@ -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. + diff --git a/python-texttable.changes b/python-texttable.changes index 7c48bab..f10228e 100644 --- a/python-texttable.changes +++ b/python-texttable.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Fri Feb 15 01:35:10 UTC 2019 - John Vandenberg + +- 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 diff --git a/python-texttable.spec b/python-texttable.spec index a38ed0a..5c530a7 100644 --- a/python-texttable.spec +++ b/python-texttable.spec @@ -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 diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..8ef0598 --- /dev/null +++ b/tests.py @@ -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 diff --git a/texttable-1.4.0.tar.gz b/texttable-1.4.0.tar.gz deleted file mode 100644 index d3f1ac8..0000000 --- a/texttable-1.4.0.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95e8cfe85f8395a7eacdfbc8f09d885b9ef3a6ac6ead0364ea721de1127aa36b -size 12274 diff --git a/texttable-1.6.0.tar.gz b/texttable-1.6.0.tar.gz new file mode 100644 index 0000000..afaf3c5 --- /dev/null +++ b/texttable-1.6.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:624b9d6a94255b3d168b22f0808b78eca8b765d8b14c095e530641b8655c7dfc +size 9106