From 57635e2bdd3c7f0e1fc33c1f6acf029647f49e45 Mon Sep 17 00:00:00 2001 From: "Aliaksei Yaletski (Tiendil)" Date: Tue, 9 Nov 2021 13:23:38 +0300 Subject: [PATCH] Support Python 3.10, drop support of Python 3.5 --- .github/workflows/run_tests.yml | 26 ++++++++++++++++++ MANIFEST.in | 3 --- poetry.lock | 17 ++++++++++++ pynames/from_tables_generator.py | 15 +++++------ pynames/names.py | 6 ++--- pynames/tests/test_from_list_generator.py | 18 ++++++------- pynames/tests/test_from_tables_generator.py | 21 +++++++-------- pynames/tests/test_generators.py | 5 +++- pynames/tests/test_name.py | 7 +++-- pyproject.toml | 28 +++++++++++++++++++ setup.py | 30 --------------------- 11 files changed, 104 insertions(+), 72 deletions(-) create mode 100644 .github/workflows/run_tests.yml delete mode 100644 MANIFEST.in create mode 100644 poetry.lock create mode 100644 pyproject.toml delete mode 100644 setup.py diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml new file mode 100644 index 0000000..c9a6ece --- /dev/null +++ b/.github/workflows/run_tests.yml @@ -0,0 +1,26 @@ +name: Run tests + +on: [push, pull_request] + +jobs: + + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install poetry + poetry install + - name: Run Tests + run: poetry run python -m unittest discover pynames diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 4ad42ee..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -global-include *.json -global-include *.csv -global-include *.rst \ No newline at end of file diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..dcc5d18 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,17 @@ +[[package]] +name = "unicodecsv" +version = "0.14.1" +description = "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*." +category = "main" +optional = false +python-versions = "*" + +[metadata] +lock-version = "1.1" +python-versions = "^3.6" +content-hash = "a2dbfe0efb1a442b962c7ba3ba3b8426f520795bc6b7be369207178e4c320fae" + +[metadata.files] +unicodecsv = [ + {file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"}, +] diff --git a/pynames/from_tables_generator.py b/pynames/from_tables_generator.py index 8688ec8..7fa5d4e 100644 --- a/pynames/from_tables_generator.py +++ b/pynames/from_tables_generator.py @@ -5,10 +5,9 @@ from __future__ import unicode_literals # python lib: import json import random -from collections import Iterable +from collections.abc import Iterable # thirdparties: -import six import unicodecsv # pynames: @@ -42,15 +41,15 @@ class Template(object): @classmethod def merge_forms(cls, left, right): - if not isinstance(left, six.string_types): - if not isinstance(right, six.string_types): + if not isinstance(left, str): + if not isinstance(right, str): if len(left) != len(right): raise exceptions.NotEqualFormsLengths(left=left, right=right) return [l+r for l, r in zip(left, right)] else: return [l+right for l in left] else: - if not isinstance(right, six.string_types): + if not isinstance(right, str): return [left+r for r in right] else: return left + right @@ -63,7 +62,7 @@ class Template(object): record = random.choice(tables[slug]) languages = { lang: self.merge_forms(forms, record['languages'][lang]) - for lang, forms in six.iteritems(languages) + for lang, forms in languages.items() } genders = dict( @@ -141,7 +140,7 @@ class FromTablesGenerator(BaseGenerator): templates = self._get_templates_slice(genders) definition_number = sum([template.probability for template in templates]) - choice = random.randint(1, definition_number) + choice = random.uniform(0.0, definition_number) for template in templates: if choice > template.probability: @@ -156,7 +155,7 @@ class FromTablesGenerator(BaseGenerator): return name.get_for(gender, language) def test_names_consistency(self, test): - for table_name, table in six.iteritems(self.tables): + for table_name, table in self.tables.items(): for record in table: test.assertEqual(set(record['languages'].keys()) & self.languages, self.languages) diff --git a/pynames/names.py b/pynames/names.py index d69a297..9fd734d 100644 --- a/pynames/names.py +++ b/pynames/names.py @@ -2,8 +2,6 @@ from __future__ import unicode_literals -import six - from pynames.relations import GENDER, LANGUAGE from pynames import exceptions @@ -24,7 +22,7 @@ class Name(object): forms = self.translations[gender][language] - if not isinstance(forms, six.string_types): + if not isinstance(forms, str): return forms[0] return forms @@ -35,7 +33,7 @@ class Name(object): forms = self.translations[gender][language] - if not isinstance(forms, six.string_types): + if not isinstance(forms, str): return list(forms) return None diff --git a/pynames/tests/test_from_list_generator.py b/pynames/tests/test_from_list_generator.py index 3ffc28a..90c836a 100644 --- a/pynames/tests/test_from_list_generator.py +++ b/pynames/tests/test_from_list_generator.py @@ -5,8 +5,6 @@ from __future__ import unicode_literals import os import unittest -from six.moves import xrange - from pynames.relations import GENDER, LANGUAGE from pynames.from_list_generator import FromListGenerator @@ -50,19 +48,19 @@ class TestFromListGenerator(unittest.TestCase): def test_get_name__simple(self): generator = self.TestGenerator() - for i in xrange(100): + for i in range(100): name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.RU) self.assertTrue(name in self.NAMES_RU_MALE) - for i in xrange(100): + for i in range(100): name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.RU) self.assertTrue(name in self.NAMES_RU_FEMALE) - for i in xrange(100): + for i in range(100): name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.EN) self.assertTrue(name in self.NAMES_EN_MALE) - for i in xrange(100): + for i in range(100): name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.EN) self.assertTrue(name in self.NAMES_EN_FEMALE) @@ -70,24 +68,24 @@ class TestFromListGenerator(unittest.TestCase): def test_get_name__with_forms(self): generator = self.TestGeneratorWithForms() - for i in xrange(100): + for i in range(100): name = generator.get_name(genders=[GENDER.MALE]) self.assertTrue(name.get_for(GENDER.MALE, LANGUAGE.RU) in self.NAMES_RU_MALE) self.assertNotEqual(name.get_forms_for(GENDER.MALE, LANGUAGE.RU), None) self.assertTrue(name.get_forms_for(GENDER.MALE, LANGUAGE.RU)[1] in self.NAMES_RU_MALE_FORMS) - for i in xrange(100): + for i in range(100): name = generator.get_name(genders=[GENDER.FEMALE]) self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.RU) in self.NAMES_RU_FEMALE) self.assertNotEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.RU), None) self.assertTrue(name.get_forms_for(GENDER.FEMALE, LANGUAGE.RU)[1] in self.NAMES_RU_FEMALE_FORMS) - for i in xrange(100): + for i in range(100): name = generator.get_name(genders=[GENDER.MALE]) self.assertTrue(name.get_for(GENDER.MALE, LANGUAGE.EN) in self.NAMES_EN_MALE) self.assertEqual(name.get_forms_for(GENDER.MALE, LANGUAGE.EN), None) - for i in xrange(100): + for i in range(100): name = generator.get_name(genders=[GENDER.FEMALE]) self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.EN) in self.NAMES_EN_FEMALE) self.assertEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.EN), None) diff --git a/pynames/tests/test_from_tables_generator.py b/pynames/tests/test_from_tables_generator.py index b1aef3f..7f7f158 100644 --- a/pynames/tests/test_from_tables_generator.py +++ b/pynames/tests/test_from_tables_generator.py @@ -5,9 +5,6 @@ from __future__ import unicode_literals import os import unittest -import six -from six.moves import xrange - from pynames.relations import GENDER, LANGUAGE from pynames.from_tables_generator import FromTablesGenerator, FromCSVTablesGenerator @@ -49,19 +46,19 @@ class TestFromTablesGenerator(unittest.TestCase): def test_get_name_simple(self): generator = self.TestGenerator() - for i in xrange(100): + for i in range(100): name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.RU) self.assertTrue(name in self.NAMES_RU_MALE) - for i in xrange(100): + for i in range(100): name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.RU) self.assertTrue(name in self.NAMES_RU_FEMALE) - for i in xrange(100): + for i in range(100): name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.EN) self.assertTrue(name in self.NAMES_EN_MALE) - for i in xrange(100): + for i in range(100): name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.EN) self.assertTrue(name in self.NAMES_EN_FEMALE) @@ -70,14 +67,14 @@ class TestFromTablesGenerator(unittest.TestCase): has_none = set() - for i in xrange(100): + for i in range(100): name = generator.get_name(genders=[GENDER.MALE]) self.assertTrue(name.get_for(GENDER.MALE, LANGUAGE.RU) in self.NAMES_RU_MALE) has_none.add(name.get_forms_for(GENDER.MALE, LANGUAGE.RU) is None) self.assertEqual(has_none, set([True, False])) - for i in xrange(100): + for i in range(100): name = generator.get_name(genders=[GENDER.FEMALE]) self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.RU) in self.NAMES_RU_FEMALE) self.assertNotEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.RU), None) @@ -85,14 +82,14 @@ class TestFromTablesGenerator(unittest.TestCase): has_none = set() - for i in xrange(100): + for i in range(100): name = generator.get_name(genders=[GENDER.MALE]) self.assertTrue(name.get_for(GENDER.MALE, LANGUAGE.EN) in self.NAMES_EN_MALE) has_none.add(name.get_forms_for(GENDER.MALE, LANGUAGE.RU) is None) self.assertEqual(has_none, set([True, False])) - for i in xrange(100): + for i in range(100): name = generator.get_name(genders=[GENDER.FEMALE]) self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.EN) in self.NAMES_EN_FEMALE) self.assertEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.EN), None) @@ -124,6 +121,6 @@ class TestFromCSVTablesGenerator(unittest.TestCase): json_attr = getattr(json_generator, attr_name) csv_attr = getattr(csv_generator, attr_name) if isinstance(json_attr, list): - six.assertCountEqual(self, csv_attr, json_attr) + self.assertCountEqual(csv_attr, json_attr) else: self.assertEqual(csv_attr, json_attr) diff --git a/pynames/tests/test_generators.py b/pynames/tests/test_generators.py index 2a6e977..96255da 100644 --- a/pynames/tests/test_generators.py +++ b/pynames/tests/test_generators.py @@ -21,7 +21,10 @@ def create_test_method(generator_class): generator = generator_class() self.assertTrue(generator.get_names_number() > 0) - self.assertTrue(generator.get_names_number(GENDER.MALE) + generator.get_names_number(GENDER.FEMALE) >= generator.get_names_number()) + + self.assertTrue(generator.get_names_number(GENDER.MALE) + generator.get_names_number(GENDER.FEMALE) >= + generator.get_names_number()) + self.assertTrue(generator.get_name_simple()) self.assertTrue(generator.get_name()) diff --git a/pynames/tests/test_name.py b/pynames/tests/test_name.py index 0403736..3fe4b51 100644 --- a/pynames/tests/test_name.py +++ b/pynames/tests/test_name.py @@ -2,7 +2,6 @@ from __future__ import unicode_literals -import six import unittest from pynames.relations import GENDER, LANGUAGE @@ -13,7 +12,7 @@ class TestName(unittest.TestCase): def test_base(self): name = Name('ru', {'genders': {'m': {'ru': 'ru_name'}}}) - self.assertEqual(six.text_type(name), 'ru_name') + self.assertEqual(str(name), 'ru_name') self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_name') self.assertEqual(name.get_for(GENDER.MALE), 'ru_name') self.assertEqual(name.get_forms_for(GENDER.MALE), None) @@ -21,7 +20,7 @@ class TestName(unittest.TestCase): def test_genders(self): name = Name('ru', {'genders': {'m': {'ru': 'ru_m_name'}, 'f': {'ru': 'ru_f_name'}}}) - self.assertEqual(six.text_type(name), 'ru_m_name') + self.assertEqual(str(name), 'ru_m_name') self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_m_name') self.assertEqual(name.get_for(GENDER.FEMALE, LANGUAGE.RU), 'ru_f_name') @@ -30,7 +29,7 @@ class TestName(unittest.TestCase): 'en': 'en_m_name'}, 'f': {'ru': 'ru_f_name', 'en': 'en_f_name'}}}) - self.assertEqual(six.text_type(name), 'ru_m_name') + self.assertEqual(str(name), 'ru_m_name') self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_m_name') self.assertEqual(name.get_for(GENDER.FEMALE, LANGUAGE.RU), 'ru_f_name') self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.EN), 'en_m_name') diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..805f705 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,28 @@ +[tool.poetry] +name = "pynames" +version = "0.2.4" +description = "Name generation library." +readme = "README.rst" +repository = "https://github.com/Tiendil/pynames" +authors = ["Aliaksei Yaletski (Tiendil) "] +license = "BSD-3" +include = ["*.json", "*.csv", "*.rst"] + +keywords = ["gamedev", "game", "game development", "names", "procedural content generation"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + + "Intended Audience :: Developers", + + "Topic :: Games/Entertainment", + "Topic :: Software Development :: Libraries :: Python Modules", + + "License :: OSI Approved :: BSD License", + + "Natural Language :: English", + "Natural Language :: Russian"] + +[tool.poetry.dependencies] +python = "^3.6" + +unicodecsv = "^0.14" \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index e749a09..0000000 --- a/setup.py +++ /dev/null @@ -1,30 +0,0 @@ -# coding: utf-8 -import setuptools - -setuptools.setup( - name='Pynames', - version='0.2.3', - description='name generation library', - long_description=open('README.rst').read(), - url='https://github.com/Tiendil/pynames', - author='Aleksey Yeletsky ', - author_email='a.eletsky@gmail.com', - license='BSD', - classifiers=[ - 'Development Status :: 5 - Production/Stable', - - 'Intended Audience :: Developers', - - 'Topic :: Games/Entertainment', - 'Topic :: Software Development :: Libraries :: Python Modules', - - 'License :: OSI Approved :: BSD License', - - 'Natural Language :: English', - 'Natural Language :: Russian'], - keywords=['gamedev', 'game', 'game development', 'names', 'names generation'], - packages=setuptools.find_packages(), - install_requires=['six', 'unicodecsv'], - include_package_data=True, - test_suite = 'tests', - )