Use alphabetical order for numbers; support number argument v0.0.2
authorEugene Petkevich <nasedil.genio.code@gmail.com>
Wed, 11 Aug 2021 04:05:32 +0000 (07:05 +0300)
committerEugene Petkevich <nasedil.genio.code@gmail.com>
Wed, 11 Aug 2021 04:14:49 +0000 (07:14 +0300)
setup.py
tests/test_wordidgen.py
wordidgen/wordidgen.py

index 368f87f..c9860e4 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@ from setuptools import setup
 
 setup(name='wordidgen',
       packages=['wordidgen'],
-      version = '0.0.1',
+      version = '0.0.2',
       entry_points={
         'console_scripts': ['wordidgen = wordidgen.wordidgen:main']
       })
index 35bf0fc..04cf7ab 100644 (file)
@@ -1,3 +1,20 @@
 # -*- coding: UTF-8 -*-
 
-#TODO
\ No newline at end of file
+import locale
+locale.setlocale(locale.LC_ALL, "")
+
+import pytest
+
+from wordidgen import wordidgen
+
+def test_wordidgen():
+    word_generator = wordidgen.WordGenerator(length=1)
+    words = []
+    for i in range(word_generator.count):
+        words.append(word_generator.generate(number=i))
+    assert words == sorted(words, key=locale.strxfrm)
+    assert word_generator.count == 185
+    word_generator = wordidgen.WordGenerator(length=2)
+    assert word_generator.generate(number=0) == 'баба'
+    assert word_generator.generate(number=185) == 'беба'
+    assert word_generator.generate(number=187) == 'бебё'
\ No newline at end of file
index 4d228b7..c7df129 100755 (executable)
@@ -1,5 +1,11 @@
 #!/usr/bin/python
 # -*- coding: UTF-8 -*-
+"""
+Note that words that correspond to a smaller number generally sorts before
+a word that corresponds to a larger number, unless "ё" and "е" are in the same
+position.  So if you need fully sortable system, you have to exclude one of
+those letters in word generator.
+"""
 from argparse import ArgumentDefaultsHelpFormatter
 from argparse import ArgumentParser
 from collections import namedtuple
@@ -11,14 +17,18 @@ CONFIG_FOLDER = 'wordidgen-a20ad162-f2cb-11eb-81a6-33a7c6316f2d'
 Consonant = namedtuple('Consonant', ['hard_letter', 'soft_letter'])
 Vowel = namedtuple('Vowel', ['letter', 'is_soft'])
 
-CONSONANTS_REGULAR = [Consonant(l, l) for l in 'бвгджзклмнпÑ\80Ñ\81Ñ\84Ñ\85Ñ\87Ñ\86']
+CONSONANTS_REGULAR = [Consonant(l, l) for l in 'бвгджзклмнпÑ\80Ñ\81Ñ\84Ñ\85Ñ\86Ñ\87']
 CONSONANT_T = Consonant('т', None)
-CONSONANT_SH = Consonant('ш', 'щ')
-CONSONANTS = CONSONANTS_REGULAR + [CONSONANT_T, CONSONANT_SH]
+CONSONANT_SH_hard = Consonant('ш', None)
+CONSONANT_SH_soft = Consonant(None, 'щ')
+CONSONANTS = (CONSONANTS_REGULAR[0:13] + [CONSONANT_T]
+              + CONSONANTS_REGULAR[13:17]
+              + [CONSONANT_SH_hard, CONSONANT_SH_soft])
 
 VOWELS_HARD = [Vowel(l, False) for l in 'аоуыэ']
-VOWELS_SOFT = [Vowel(l, True) for l in 'яёюие']
-VOWELS = VOWELS_HARD + VOWELS_SOFT
+VOWELS_SOFT = [Vowel(l, True) for l in 'еёиюя']
+VOWELS = (VOWELS_HARD[0:1] + VOWELS_SOFT[0:3]
+          + VOWELS_HARD[1:5] + VOWELS_SOFT[3:5])
 
 class WordGenerator:
     """Generate word by combining syllables"""
@@ -48,7 +58,7 @@ class WordGenerator:
         for i in range(self.length):
             r = number % self.syllable_count
             number = number // self.syllable_count
-            word += self.syllables[r]
+            word = self.syllables[r] + word
         return word
 
 def main():
@@ -96,11 +106,15 @@ def main():
         return
     while True:
         #TODO what if all words are already generated?
-        #TODO when particular number is needed
-        word = word_generator.generate()
-        if word not in generated_words:
+        number = args.number
+        if args.number == -1:
+            number = None
+        word = word_generator.generate(number=number)
+        if word not in generated_words or not args.unique:
             break
-        print(word, 'duplicate')
+        if args.number != -1 and args.unique:
+            print(word, 'is already generated')
+            return
     if args.save:
         #TODO need to make thread-safe
         #TODO use correct path on different systems