commit 3f8493851bd538bc4aa3d868b880271697ecf516 Author: Damian Johnson atagar@torproject.org Date: Wed Jan 17 11:37:40 2018 -0800
Add an IntString class
Most stem.client enumerations are backed by integer values. This class will let us avoid storing two variables for all of those fields. --- docs/change_log.rst | 4 ++++ stem/util/str_tools.py | 26 ++++++++++++++++++++++++++ test/unit/doctest.py | 1 + test/unit/util/str_tools.py | 6 ++++++ 4 files changed, 37 insertions(+)
diff --git a/docs/change_log.rst b/docs/change_log.rst index fcfc0115..ebdf8e3e 100644 --- a/docs/change_log.rst +++ b/docs/change_log.rst @@ -56,6 +56,10 @@ The following are only available within Stem's `git repository * `Fallback directory v2 support https://lists.torproject.org/pipermail/tor-dev/2017-December/012721.html`_, which adds *nickname* and *extrainfo* * Reduced maximum descriptors fetched by the remote module to match tor's new limit (:trac:`24743`)
+ * **Utilities** + + * Added :class:`~stem.util.str_tools.IntString` + * **Website**
* Added `terminal styling <tutorials/east_of_the_sun.html#terminal-styling>`_ to our utilities tutorial diff --git a/stem/util/str_tools.py b/stem/util/str_tools.py index bc0446fa..108d21ea 100644 --- a/stem/util/str_tools.py +++ b/stem/util/str_tools.py @@ -12,6 +12,8 @@ Toolkit for various string activity.
::
+ IntString - string that can also be used as an integer + crop - shortens string to a given length
size_label - human readable label for a number of bytes @@ -185,6 +187,30 @@ def _split_by_length(msg, size): Ending = stem.util.enum.Enum('ELLIPSE', 'HYPHEN')
+class IntString(str): + """ + String that can be used as an integer as well... + + :: + + >>> s = IntString('me', 5) + >>> print('hi %s, the number is %i' % (s, s)) + hi me, the number is 5 + + .. versionadded:: 1.7.0 + """ + + def __new__(self, str_value, int_value): + return str.__new__(self, str_value) + + def __init__(self, str_value, int_value): + self._str_value = str_value + self._int_value = int_value + + def __int__(self): + return self._int_value + + def crop(msg, size, min_word_length = 4, min_crop = 0, ending = Ending.ELLIPSE, get_remainder = False): """ Shortens a string to a given length. diff --git a/test/unit/doctest.py b/test/unit/doctest.py index 7e40e873..9dda1422 100644 --- a/test/unit/doctest.py +++ b/test/unit/doctest.py @@ -67,6 +67,7 @@ class TestDocumentation(unittest.TestCase): args['globs'] = { '_to_camel_case': stem.util.str_tools._to_camel_case, '_split_by_length': stem.util.str_tools._split_by_length, + 'IntString': stem.util.str_tools.IntString, 'crop': stem.util.str_tools.crop, 'size_label': stem.util.str_tools.size_label, 'time_label': stem.util.str_tools.time_label, diff --git a/test/unit/util/str_tools.py b/test/unit/util/str_tools.py index ee270717..7349bd56 100644 --- a/test/unit/util/str_tools.py +++ b/test/unit/util/str_tools.py @@ -50,6 +50,12 @@ class TestStrTools(unittest.TestCase): self.assertEqual(['hello'], str_tools._split_by_length('hello', 5)) self.assertEqual(['hello'], str_tools._split_by_length('hello', 6))
+ def test_int_string(self): + s = str_tools.IntString('me', 5) + self.assertEqual('me', s) + self.assertEqual(5, int(s)) + self.assertEqual('hi me, the number is 5', 'hi %s, the number is %i' % (s, s)) + def test_crop(self): # test the pydoc examples self.assertEqual('This is a looo...', str_tools.crop('This is a looooong message', 17))
tor-commits@lists.torproject.org