# -*- 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
#!/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
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"""
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():
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