summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Removing helper functions providing Python < 3.3 compatibilityHEAD4.3.0masterJiri Podivin2023-03-013-68/+20
| | | | | | | | | | | | | | | | | | Functions used for deriving terminal width are no longer necessary, as Python 3.3 introduced[0] built in solution. Remaining helper function `utils.terminal_width` received docstring explaining return parameters. Method `_assign_max_widths` of the `TableFormatter` class was refactored to no longer use the `stdout` argument. Uses of the method were adjusted accordingly. Method now also has minimal docstring. Minor adjustment was made to inline comments to more closely reflect functionality of the code. [0]https://docs.python.org/3.8/library/os.html?highlight=get_terminal_size#os.get_terminal_size Signed-off-by: Jiri Podivin <jpodivin@redhat.com> Change-Id: I2898f099227e8c97aef6492c60f2f99038aa1357
* Strip trailing periods when getting description4.2.0Stephen Finucane2022-12-123-3/+9
| | | | | | | This yields slightly prettier output. Change-Id: Ibec7cd861eacc3630182d6a782ffaf361f449aa6 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* Merge "columns: Useful __str__, __repr__ implementation"4.1.0Zuul2022-10-042-3/+23
|\
| * columns: Useful __str__, __repr__ implementationStephen Finucane2022-10-032-3/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The default implementations for __str__ and __repr__ are rubbish. >>> from osc_lib.cli import format_columns >>> str(format_columns.DictColumn({'foo': 'bar'})) '<osc_lib.cli.format_columns.DictColumn object at 0x7f6e26771e40>' >>> repr(format_columns.DictColumn({'foo': 'bar'})) '<osc_lib.cli.format_columns.DictColumn object at 0x7f6e26b57ac0>' Make it useful. >>> from osc_lib.cli import format_columns >>> str(format_columns.DictColumn({'foo': 'bar'})) "foo='bar'" >>> repr(format_columns.DictColumn({'foo': 'bar'})) "DictColumn({'foo': 'bar'})" This helps when testing as the reason for mismatches will be more obvious. Change-Id: I8b8598875f896cb3dbf417515d377e7758b3b98b Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | Merge "Replace abc.abstractproperty with property and abc.abstractmethod"Zuul2022-10-041-2/+4
|\ \ | |/ |/|
| * Replace abc.abstractproperty with property and abc.abstractmethodljhuang2022-08-042-3/+5
| | | | | | | | | | | | | | | | | | Replace abc.abstractproperty with property and abc.abstractmethod, as abc.abstractproperty has been deprecated since python3.3[1] [1]https://docs.python.org/3.8/whatsnew/3.3.html?highlight=deprecated#abc Change-Id: I5e86211323c5e08553a5c777c0b6d1d85f95e1a9
* | Add Python3 antelope unit testsOpenStack Release Bot2022-09-091-1/+1
| | | | | | | | | | | | | | | | | | | | | | This is an automatically generated patch to ensure unit testing is in place for all the of the tested runtimes for antelope. See also the PTI in governance [1]. [1]: https://governance.openstack.org/tc/reference/project-testing-interface.html Change-Id: I96731db47eee8597bce78d69529695d76db998e4
* | Merge "Removing brackets around tested conditional"4.0.0Zuul2022-08-041-1/+1
|\ \ | |/ |/|
| * Removing brackets around tested conditionalJiri Podivin2022-08-041-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | While permissible syntactically, using brackets to wrap tested conditional is unnecessary and potentially confusing. As without inserted whitspace the code may look as a function call, rather than a statement and expression. The construct is also considered erroneous by linters. Closes-Bug: 1983593 Signed-off-by: Jiri Podivin <jpodivin@redhat.com> Change-Id: I0a086a8349e2a72cae024857e148fddc3556c319
* | Merge "Remove final use of pkg_resources"Zuul2022-07-182-17/+9
|\ \
| * | Remove final use of pkg_resourcesStephen Finucane2022-07-152-17/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 'pkg_resources' is slow, while 'importlib.metadata' is the new shiny and is *much* faster. Recent version of 'importlib.metadata' - namely those found in Python 3.10 or provided by the 4.4 'importlib-metadata' backport - now provide the last bit of functionality we were missing to remove 'pkg_resources' entirely, namely the ability to map package names to modules. This is used for generating epilogs. The benefits of this are huge, yielding a near 40% decrease in runtime for the cliffdemo app (100mS after compared to 160mS) before. Change-Id: I934d8a196d76622671781643f36bdb8a07d2f319 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "Defer loading PyYAML"Zuul2022-07-181-2/+6
|\ \ \ | |/ /
| * | Defer loading PyYAMLStephen Finucane2022-05-251-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | Yet another library that's slow to import and is totally optional. Defer loading this one also and speed up initial start time. Change-Id: Ic694b4d36dbf7ce87bc8fe9a2f8b0597719418a1 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "Defer loading cmd2"Zuul2022-07-181-3/+6
|\ \ \ | |/ /
| * | Defer loading cmd2Stephen Finucane2022-05-251-3/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We were importing cmd2 purely so we could do some exception transformation. However, this is only needed if we're in interactive mode. Avoid both the import of cmd2 and the transformation of the exceptions unless this is the case. This speeds up import time by ~30% for the demoapp on my machine (~160mS after compared to ~210mS before) Change-Id: I2356dc9803b4d0eef3528c6d057207509932e6b2 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "requirements: Remove explicit python-subunit dependency"Zuul2022-07-181-5/+0
|\ \ \ | |/ /
| * | requirements: Remove explicit python-subunit dependencyStephen Finucane2022-05-251-5/+0
| | | | | | | | | | | | | | | | | | | | | We don't rely on this ourselves and stestr will bring it in for us. Change-Id: I51f305ac080c41463081e7039421d238b81f5d95 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "requirements: Remove explicit pbr dependency"Zuul2022-07-181-4/+0
|\ \ \ | |/ /
| * | requirements: Remove explicit pbr dependencyStephen Finucane2022-05-251-4/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We don't use pbr at runtime; ergo, there is no reason to include this in requirements.txt. While we're here, we remove a note that is no longer true with the new dependency resolver introduced in pip 20.3. Change-Id: I39ee12f052fff6d69f8fe97949e6e5df7511647b Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "requirements: Remove explicit pyparsing dependency"Zuul2022-07-141-1/+0
|\ \ \ | |/ /
| * | requirements: Remove explicit pyparsing dependencyStephen Finucane2022-05-251-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | This was added nearly a decade ago to work around a packaging bug in cmd2. We don't use this explicitly ourselves so we can and should remove it. Do that. Change-Id: Ia6061a22b9037d157c0b2afecb4e06bbc62c2d74 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "Update Python testing per Zed cycle testing runtime"Zuul2022-05-271-3/+2
|\ \ \ | |/ /
| * | Update Python testing per Zed cycle testing runtimeStephen Finucane2022-05-251-3/+2
| | | | | | | | | | | | | | | | | | | | | | | | In the Zed cycle, we have dropped the Python 3.6/3.7 [1] testing and its support. Update the Python classifiers to reflect this. Change-Id: Ieb80faf01d87e7fa7d717b74de6c5ec518ef9b05 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "setup.cfg: Replace dashes with underscores"Zuul2022-05-250-0/+0
|\ \ \ | |/ / |/| |
| * | setup.cfg: Replace dashes with underscoresYandong Xuan2021-04-261-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Resolves warnings like the following: UserWarning: Usage of dash-separated 'description-file' will not be supported in future versions. Please use the underscore name 'description_file' instead Change-Id: I328d2e7843e3ba62a6de4ef221c4f8564a64f234
* | | Migrate Python 3.6/7 jobs to Python 3.8Takashi Kajinami2022-05-241-7/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Support for Python 3.6 and 3.7 is being removed globally. The current latest release of python-novaclient (18.0.0) does not support these two versions. The next python-neutronclient release does not, either. This migrates Python 3.6/7 jobs to Python 3.8 because 3.8 is now the minimum supported version. This also replaces Python3 yoga unit tests by zena unit tests. Depends-on: https://review.opendev.org/843115 Change-Id: I03957cf4bd0a96cb1d07e80727c184854b869fc3
* | | Merge "Add Python3 yoga unit tests"Zuul2022-03-041-1/+1
|\ \ \ | |_|/ |/| |
| * | Add Python3 yoga unit testsOpenStack Release Bot2021-09-101-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is an automatically generated patch to ensure unit testing is in place for all the of the tested runtimes for yoga. See also the PTI in governance [1]. [1]: https://governance.openstack.org/tc/reference/project-testing-interface.html Change-Id: I4b6bb766c1272e32b09d59fac226792404895bc1
* | | Removing modindex link from docs3.10.1Jiri Podivin2021-11-191-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The global module documentation is no longer being generated and the link points to a non-existent document. The purpose of global module documentation is now fulfilled by the automatically generated class, and function level reference documents which are linked properly. As such there is no need to keep the link around, or to reestablish module level documentation. Signed-off-by: Jiri Podivin <jpodivin@redhat.com> Change-Id: I05e5144a36f33aa5feb996964d1a098b1716cf6a
* | | Merge "Automatically page interactive root help output"3.10.0Zuul2021-09-201-3/+11
|\ \ \ | |/ / |/| |
| * | Automatically page interactive root help outputZane Bitter2021-07-121-3/+11
| | | | | | | | | | | | | | | | | | | | | | | | The previous commit already ensures that the interactive help for individual commands is sent to a pager. This does the same for the 'help' command with no arguments. Change-Id: If5e38421d21e09f88a572dbb508b1997381bdb87
* | | Merge "Colourise and automatically page help output"xena-em3.9.0Zuul2021-08-063-38/+57
|\ \ \ | |/ /
| * | Colourise and automatically page help outputZane Bitter2021-07-123-38/+57
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Using the autopage library we can automatically send the help output to a pager (less, by default), git-style. The pager is configured to not reset the terminal on exit, avoiding the problem when piping to less manually that the help text you want to refer to disappears off the screen when you go to use it. The pager is only invoked when the output is to the terminal. Since we invoke the pager, we can ensure that it is correctly set up to interpret ANSI escape codes, so it is safe to use colour to make the output easier to read. The autopage library provides light styling of the default argparse help output, and some additional colour highlighting is added here for the command list (which is generated by cliff, not using argparse's formatting code). Change-Id: If9e1aa5166da32c58cc0fa617f4f81eaa9b2c470 Depends-On: https://review.opendev.org/c/openstack/requirements/+/799343
* | | Merge "Update unit test to satisfy python3.10+"Zuul2021-08-061-1/+1
|\ \ \
| * | | Update unit test to satisfy python3.10+Joel Capitao2021-06-151-1/+1
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fedora is already testing Python 3.10 [1] and an issue has been raised [2]. All the details are in the BZ ticket but TLDR is that "optional arguments" was replaced with "options [3]. So, I used assertRegexp to accept both of them (i.e "optional arguments" and "options"). [1] https://fedoraproject.org/wiki/Changes/Python3.10 [2] https://bugzilla.redhat.com/show_bug.cgi?id=1914138 [3] https://github.com/python/cpython/commit/fb35fa49d192368e94ffec09c092260ed0fea2e1 Change-Id: I18d9f1bea7bb5a7afb273550314c36da7b466a69
* | | Merge "Add conflict_handler parameter as attribut in Command class"Zuul2021-07-202-1/+48
|\ \ \ | |/ / |/| |
| * | Add conflict_handler parameter as attribut in Command classmatbu2021-06-042-1/+48
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Adding conflict_handler as attribut in the Command class in order to be able to take control of this parameter and change to different behavior that argparse is handling: error / resolve / ignore. Callers will be able to override it and get a proper Parser object. Change-Id: I327ece99a04bc8b2ebfa554dea643b1f2a456336
* | | Handle SIGPIPE exit gracefullyZane Bitter2021-06-072-0/+48
|/ / | | | | | | | | | | | | | | | | If we are piping output to a command that exits before the entire output is written (e.g. "head") then we will receive a BrokenPipeError. This is expected and we should react by exiting gracefully, setting an appropriate return code (128 + SIGPIPE). Change-Id: I0d60e44450da1f48dbd8f459549da80fda69aad5
* | Merge "setup.cfg: Replace dashes with underscores"3.8.0Zuul2021-05-141-4/+4
|\ \
| * | setup.cfg: Replace dashes with underscoreslikui2021-05-131-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Setuptools v54.1.0 introduces a warning that the use of dash-separated options in 'setup.cfg' will not be supported in a future version [1]. Get ahead of the issue by replacing the dashes with underscores. Without this, we see 'UserWarning' messages like the following on new enough versions of setuptools: UserWarning: Usage of dash-separated 'description-file' will not be supported in future versions. Please use the underscore name 'description_file' instead [1] https://github.com/pypa/setuptools/commit/a2e9ae4cb Change-Id: Icccc9cc2b3a0d236746c4b58a8815d25d8b0a443
* | | Replace getargspec with getfullargspeclikui2021-05-134-14/+6
|/ / | | | | | | | | | | | | | | inspect.getargspec() is deprecated since py3 [1] https://docs.python.org/3/library/inspect.html#inspect.getargspec Change-Id: I7a1692d9979e9ffaf781de1f39f5bfa59a01cf3c
* | Use py3 as the default runtime for toxsongwenping2021-04-201-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Moving on py3 as the default runtime for tox to avoid to update this at each new cycle. Wallaby support officially the following runtimes [1]: - Python 3.6 - Python 3.8 During Victoria Python 3.7 was used as the default runtime [2] however this version isn't longer officially supported. [1] https://governance.openstack.org/tc/reference/runtimes/wallaby.html#python-runtimes-for-wallaby [2] https://governance.openstack.org/tc/reference/runtimes/victoria.html#python-runtimes-for-victoria Change-Id: I5d419e881a42e627fd0699cb2ab68b66e7295cee
* | Add Python3 xena unit testsOpenStack Release Bot2021-03-191-1/+1
| | | | | | | | | | | | | | | | | | | | | | This is an automatically generated patch to ensure unit testing is in place for all the of the tested runtimes for xena. See also the PTI in governance [1]. [1]: https://governance.openstack.org/tc/reference/project-testing-interface.html Change-Id: Id810ebcb6620b4f6235ef3d616b858b4ab6b18b4
* | requirements: Uncap PrettyTablewallaby-em3.7.0Stephen Finucane2021-02-114-14/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | PrettyTable was capped at a < 0.8, which meant we were getting the veritably ancient 0.7.2 release first release in April 2013 (!) [1]. The project is now being maintained as a Jazzband project [2], meaning we should switch to this new version. The only significant change required here is that we no longer set the 'min_width' attribute since that actually does something - the wrong thing - now. We want this attribute to set a lower bound on the wrap width as opposed to an absolute minimum we can use, which is what setting the 'min_width' attribute would do. While we're here, we also remove a now useless bit of Python 2 code and bump cmd2 to a slightly newer version. [1] https://pypi.org/project/prettytable/#history [2] https://github.com/jazzband/prettytable Change-Id: Iceac729e7a9429e8ab25c60524a48d0aaeebeb37 Signed-off-by: Stephen Finucane <sfinucan@redhat.com> Depends-On: https://review.opendev.org/c/openstack/requirements/+/774917
* | Merge "Add '--sort-ascending', '--sort-descending' parameters"Zuul2021-02-103-21/+82
|\ \
| * | Add '--sort-ascending', '--sort-descending' parametersStephen Finucane2021-01-293-21/+82
| | | | | | | | | | | | | | | | | | | | | Allow users to reverse sorting direction. Change-Id: Iecd539139c5a7ce4abaaee2ff5632a2459437d51 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "Make 'FormattableColumn' comparable"Zuul2021-02-103-0/+27
|\ \ \ | |/ /
| * | Make 'FormattableColumn' comparableStephen Finucane2021-01-293-0/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Implement the '__lt__' magic method, thus providing the minimal set of rich comparison methods necessary to support sorting. This will allows users using these formatters for the more basic types (i.e. not dicts) to sort their output using the standard '--sort-column' option. Change-Id: I08e1f1bc75fa6452f19dfb9d221c1daec194d58d Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
* | | Merge "Handle null values when sorting"Zuul2021-02-093-7/+80
|\ \ \ | |/ /
| * | Handle null values when sortingStephen Finucane2021-01-293-7/+80
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | One unfortunate change (or fortunate, depending on how you look at types) in Python 3 is the inability to sort iterables of different types. For example: >>> x = ['foo', 'bar', None, 'qux'] >>> sorted(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '<' not supported between instances of 'NoneType' and 'str' Fortunately, we can take advantage of the fact that by providing a function for the 'key' that returns a tuple, we can sort on multiple conditions. In this case, "when the first key returns that two elements are equal, the second key is used to compare." [1] We can use this to first separate the values by whether they are None or not, punting those that are not to the end, before sorting the non-None values normally. For example: >>> x = ['foo', 'bar', None, 'qux'] >>> sorted(x, key=lambda k: (k is None, k)) ['bar', 'foo', 'qux', None] We were already using this feature implicitly through our use of 'operator.itemgetter(*indexes)', which will return a tuple if there is more than one item in 'indexes', and now we simply make that explicit, fixing the case where we're attempting to compare a comparable type with None. For all other cases, such as comparing a value that isn't comparable, we surround things with a try-catch and a debug logging statement to allow things to continue. Note that we could optimize what we're done further by building a key value that covers all indexes, rather than using a for loop to do so. For example: >>> x = [('baz', 2), (None, 0), ('bar', 3), ('baz', 4), ('qux', 0)] >>> sorted(x, key=lambda k: list( ... itertools.chain((k[i] is None, k[i]) for i in (0, 1))) ... ) [('bar', 3), ('baz', 2), ('baz', 4), ('qux', 0), (None, 0)] However, this would be harder to grok and would also mean we're unable to handle exceptions on a single column where e.g. there are mixed types or types that are not comparable while still sorting on the other columns. Perhaps this would be desirable for some users, but sorting on a best-effort basis does seem wiser and generally more user friendly. Anyone that wants to sort on such columns should ensure their types are comparable or implement their own sorting implementation. [1] https://www.kite.com/python/answers/how-to-sort-by-two-keys-in-python Change-Id: I4803051a6dd05c143a15923254af97e32cd39693 Signed-off-by: Stephen Finucane <sfinucan@redhat.com> Story: 2008456 Task: 41466