From afad4b61f7cb653cf18e5e722a5fc649a90264f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20=C5=9Awi=C4=99cicki?= Date: Sat, 27 Aug 2022 10:46:29 +0200 Subject: [PATCH 1/8] #11 Add Min Letter Count Feature --- .travis.yml | 2 + random_words/random_words.py | 39 +++++++++--------- random_words/test/test_random_words.py | 56 +++++++++++++++++++++++--- 3 files changed, 73 insertions(+), 24 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0377df2..314cfc4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,8 @@ python: - '3.6' - '3.7' - '3.8' +- '3.9' +- '3.10' install: - python setup.py install - pip install coverage diff --git a/random_words/random_words.py b/random_words/random_words.py index b413f2b..c96f4a6 100644 --- a/random_words/random_words.py +++ b/random_words/random_words.py @@ -55,7 +55,7 @@ def load_nicknames(self, file): self.nicknames = json.load(f) @staticmethod - def check_count(count): + def check_int(a, count): """ Checks count @@ -63,9 +63,9 @@ def check_count(count): :raises: ValueError """ if type(count) is not int: - raise ValueError('Param "count" must be int.') + raise ValueError('Param "' + a + '" must be int.') if count < 1: - raise ValueError('Param "count" must be greater than 0.') + raise ValueError('Param "' + a + '" must be greater than 0.') class RandomWords(Random): @@ -75,56 +75,57 @@ def __init__(self): super(RandomWords, self).__init__('nouns') - def random_word(self, letter=None): + def random_word(self, letter=None, min_letter_count=1): """ Return random word. :param str letter: letter + :param int min_letter_count: minimum letter count :rtype: str :returns: random word """ - return self.random_words(letter)[0] + return self.random_words(letter, min_letter_count)[0] - def random_words(self, letter=None, count=1): + def random_words(self, letter=None, min_letter_count=1, count=1): """ Returns list of random words. :param str letter: letter + :param int min_letter_count: minimum letter count :param int count: how much words :rtype: list :returns: list of random words :raises: ValueError """ - self.check_count(count) + self.check_int("count", count) + self.check_int("min_letter_count", min_letter_count) words = [] if letter is None: - all_words = list( - chain.from_iterable(self.nouns.values())) + all_words = [w for w in chain.from_iterable(self.nouns.values()) if len(w) >= min_letter_count] try: words = sample(all_words, count) except ValueError: len_sample = len(all_words) - raise ValueError('Param "count" must be less than {0}. \ -(It is only {0} words)'.format(len_sample + 1, letter)) + raise ValueError('Param "count" must be less than {0}. (There are only {0} words)'.format(len_sample, letter)) elif type(letter) is not str: raise ValueError('Param "letter" must be string.') elif letter not in self.available_letters: raise ValueError( - 'Param "letter" must be in {0}.'.format( - self.available_letters)) + 'Param "letter" must be in {0}.'.format(self.available_letters)) elif letter in self.available_letters: + all_nouns_letter = [w for w in self.nouns[letter] if len(w) >= min_letter_count] + try: - words = sample(self.nouns[letter], count) + words = sample(all_nouns_letter, count) except ValueError: - len_sample = len(self.nouns[letter]) - raise ValueError('Param "count" must be less than {0}. \ -(It is only {0} words for letter "{1}")'.format(len_sample + 1, letter)) + len_sample = len(all_nouns_letter) + raise ValueError('Param "count" must be less than {0}. (There are only {0} words for letter "{1}")'.format(len_sample, letter)) return words @@ -161,7 +162,7 @@ def random_nicks(self, letter=None, gender='u', count=1): :returns: list of random nicks :raises: ValueError """ - self.check_count(count) + self.check_int("count", count) nicks = [] @@ -222,7 +223,7 @@ def randomMails(self, count=1): :rtype: list :returns: list of random e-mails """ - self.check_count(count) + self.check_int("count", count) random_nicks = self.rn.random_nicks(count=count) random_domains = sample(list(self.dmails), count) diff --git a/random_words/test/test_random_words.py b/random_words/test/test_random_words.py index a158d5a..c17999d 100644 --- a/random_words/test/test_random_words.py +++ b/random_words/test/test_random_words.py @@ -22,6 +22,18 @@ def test_random_word(self): word = self.rw.random_word(letter) assert word[0] == letter + def test_random_word_with_min_letter_count(self): + for letter in self.letters: + word = self.rw.random_word(letter, min_letter_count=5) + assert word[0] == letter + + def test_random_word_large_min_letter_count(self): + """ + min_letter_count is too large. + """ + for letter in self.letters: + pytest.raises(ValueError, self.rw.random_word, letter, min_letter_count=3443) + def test_random_word_value_error(self): pytest.raises(ValueError, self.rw.random_word, 'x') pytest.raises(ValueError, self.rw.random_word, 0) @@ -29,6 +41,10 @@ def test_random_word_value_error(self): pytest.raises(ValueError, self.rw.random_word, 9) pytest.raises(ValueError, self.rw.random_word, ['u']) pytest.raises(ValueError, self.rw.random_word, 'fs') + + pytest.raises(ValueError, self.rw.random_word, min_letter_count=-1) + pytest.raises(ValueError, self.rw.random_word, min_letter_count=None) + pytest.raises(ValueError, self.rw.random_word, min_letter_count="fds") def test_random_words(self): for letter in self.letters: @@ -36,20 +52,50 @@ def test_random_words(self): for word in words: assert word[0] == letter - def test_random_words_value_error(self): + def test_random_words_value_error_letter(self): pytest.raises(ValueError, self.rw.random_words, 'fa') pytest.raises(ValueError, self.rw.random_words, ['fha']) pytest.raises(ValueError, self.rw.random_words, 0) pytest.raises(ValueError, self.rw.random_words, -1) - - pytest.raises(ValueError, self.rw.random_words, letter=None, - count=1000000) - + pytest.raises(ValueError, self.rw.random_words, letter=None, count=1000000) + + def test_random_words_value_error_count(self): pytest.raises(ValueError, self.rw.random_words, count=0) pytest.raises(ValueError, self.rw.random_words, count=None) pytest.raises(ValueError, self.rw.random_words, count=[8]) pytest.raises(ValueError, self.rw.random_words, count=-5) + def test_random_words_value_error_min_letter_count(self): + pytest.raises(ValueError, self.rw.random_words, min_letter_count=0) + pytest.raises(ValueError, self.rw.random_words, min_letter_count=None) + pytest.raises(ValueError, self.rw.random_words, min_letter_count=[8]) + pytest.raises(ValueError, self.rw.random_words, min_letter_count=-5) + + def test_random_words_large_min_letter_count(self): + min_letter_count = 15 + words = self.rw.random_words(count=10, min_letter_count=min_letter_count) + for w in words: + assert len(w) >= min_letter_count + + def test_random_words_small_min_letter_count(self): + min_letter_count = 3 + words = self.rw.random_words(count=1000, min_letter_count=min_letter_count) + for w in words: + assert len(w) >= min_letter_count + + def test_random_words_z_letter_min_letter_count(self): + """ + There are not enough words for such query. + """ + pytest.raises(ValueError, self.rw.random_words, "z", count=5, min_letter_count=15) + + def test_random_words_min_letter_count(self): + for letter in self.letters: + min_letter_count = random.randint(1, 5) + words = self.rw.random_words(letter, count=2, min_letter_count=min_letter_count) + for w in words: + assert len(w) >= min_letter_count + def test_random_words_length_list(self): len_words = len(self.rw.random_words()) assert len_words == 1 From 96c05df6a930e6b54fff6ea3b95b134082a8842d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20=C5=9Awi=C4=99cicki?= Date: Sat, 27 Aug 2022 11:21:08 +0200 Subject: [PATCH 2/8] support only 3.7+ pythons --- .travis.yml | 22 +++++++++------------- CHANGES.txt | 1 + setup.py | 8 +++----- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index 314cfc4..80d5eb8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,17 @@ language: python python: -- '2.7' -- '3.4' -- '3.5' -- '3.6' -- '3.7' -- '3.8' -- '3.9' -- '3.10' + - '3.7' + - '3.8' + - '3.9' + - '3.10' install: -- python setup.py install -- pip install coverage -- pip install coveralls + - python setup.py install + - pip install coverage + - pip install coveralls script: -- coverage run --source=random_words setup.py test + - coverage run --source=random_words setup.py test after_success: -- coveralls + - coveralls sudo: false deploy: provider: pypi diff --git a/CHANGES.txt b/CHANGES.txt index 31fdf54..3d5fc38 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,4 @@ +v0.4.0, 2022-08-27 -- Add Min Letter Count Feature v0.3.0, 2020-06-20 -- Fix the mess with versions v0.2.3, 2020-06-20 -- Use dirname instead of split v0.2.2, 2020-06-20 -- Add python 3.7 and 3.8 to travis (remove 3.3) diff --git a/setup.py b/setup.py index c47e1fb..c583b13 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ def run_tests(self): setup( name='RandomWords', - version='0.3.0', + version='0.4.0', author='Tomek Święcicki', author_email='tomislater@gmail.com', packages=['random_words'], @@ -34,12 +34,10 @@ def run_tests(self): 'Programming Language :: Python', 'Natural Language :: English', 'Development Status :: 5 - Production/Stable', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', 'Topic :: Software Development :: Libraries :: Python Modules', ], include_package_data=True, From 373e3958366077e2de9aea4d9520dd462ac44eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20=C5=9Awi=C4=99cicki?= Date: Sat, 27 Aug 2022 11:25:09 +0200 Subject: [PATCH 3/8] use dist jammy --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 80d5eb8..f26946d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: python +dist: jammy python: - '3.7' - '3.8' @@ -12,10 +13,9 @@ script: - coverage run --source=random_words setup.py test after_success: - coveralls -sudo: false deploy: provider: pypi - user: swiety + username: swiety password: secure: O1/w8g7QwrUPeMy0l5mnFjs2fgUU5XNyVKTWZywZ2t0X8rDACpkJGpj10jK86zi0EcI0cB/NnOSbyQ1ZvVS9clxIjb082kiunvVRFP4iznjeBg3HZ2mA0etU+bobYj4PvGbmJ4bE5fi5/W6hT0zzW++iHDNbZdstjAjHhjmJHa4= on: From d2d5902b010f33930ec5ab4af6022525e9483dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20=C5=9Awi=C4=99cicki?= Date: Sat, 27 Aug 2022 11:35:05 +0200 Subject: [PATCH 4/8] don't use dist jammy --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f26946d..e3d28a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ language: python -dist: jammy python: - '3.7' - '3.8' From 8196cb73b898f97ea53b8192a2747a7de7d02803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20=C5=9Awi=C4=99cicki?= Date: Sat, 27 Aug 2022 11:46:37 +0200 Subject: [PATCH 5/8] install importlib_metadata --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index e3d28a1..a90a541 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ python: - '3.9' - '3.10' install: + - pip install importlib_metadata - python setup.py install - pip install coverage - pip install coveralls From d7e1187810c75f305e306eb1a69ec475d6a42d88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20=C5=9Awi=C4=99cicki?= Date: Sat, 27 Aug 2022 11:49:43 +0200 Subject: [PATCH 6/8] use bionic dist --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a90a541..e52aa15 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,11 @@ language: python +dist: bionic python: - '3.7' - '3.8' - '3.9' - '3.10' install: - - pip install importlib_metadata - python setup.py install - pip install coverage - pip install coveralls From beec7330c959337e932f3175c07f0151b1a0727b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20=C5=9Awi=C4=99cicki?= Date: Sat, 27 Aug 2022 11:58:26 +0200 Subject: [PATCH 7/8] use focal dist --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e52aa15..e878459 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: python -dist: bionic +dist: focal python: - '3.7' - '3.8' From 2392f875a33da2c224c2438f0602d0a4087d060c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20=C5=9Awi=C4=99cicki?= Date: Sat, 27 Aug 2022 12:01:04 +0200 Subject: [PATCH 8/8] remove support for 3.10 --- .travis.yml | 1 - setup.py | 1 - 2 files changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e878459..5d88536 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ python: - '3.7' - '3.8' - '3.9' - - '3.10' install: - python setup.py install - pip install coverage diff --git a/setup.py b/setup.py index c583b13..c54ca13 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,6 @@ def run_tests(self): 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', 'Topic :: Software Development :: Libraries :: Python Modules', ], include_package_data=True,