Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Python3 #41

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
49 changes: 38 additions & 11 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,45 @@
language: python
python:
- "2.7"
- "3.6"
env:
- TOXENV="py27-django11"
- TOXENV="py36-django11"
- TOXENV="py36-django20"
sudo: false
dist: xenial
matrix:
exclude:
- python: "2.7"
include:
- python: "3.5"
env: TOXENV="py35-django11"
- python: "3.5"
env: TOXENV="py35-django20"
- python: "3.5"
env: TOXENV="py35-django21"
- python: "3.5"
env: TOXENV="py35-django22"
- python: "3.6"
env: TOXENV="py36-django11"
- python: "2.7"
- python: "3.6"
env: TOXENV="py36-django20"
- python: "3.6"
env: TOXENV="py27-django11"
env: TOXENV="py36-django21"
- python: "3.6"
env: TOXENV="py36-django22"
- python: "3.6"
env: TOXENV="py36-django30"
- python: "3.7"
env: TOXENV="py37-django11"
- python: "3.7"
env: TOXENV="py37-django20"
- python: "3.7"
env: TOXENV="py37-django21"
- python: "3.7"
env: TOXENV="py37-django22"
- python: "3.7"
env: TOXENV="py37-django30"
- python: "3.8"
env: TOXENV="py38-django11"
- python: "3.8"
env: TOXENV="py38-django20"
- python: "3.8"
env: TOXENV="py38-django21"
- python: "3.8"
env: TOXENV="py38-django22"
- python: "3.8"
env: TOXENV="py38-django30"
install: pip install tox
script: tox -e $TOXENV
20 changes: 16 additions & 4 deletions doc/examples-django/pytilsex/manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,19 @@

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

from django.core.management import execute_from_command_line

execute_from_command_line(sys.argv)
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)
6 changes: 4 additions & 2 deletions doc/examples-django/pytilsex/settings.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-

# Django settings for pytilsex project.

# find current path
Expand Down Expand Up @@ -55,9 +57,9 @@
SECRET_KEY = '-)^ay7gz76#9!j=ssycphb7*(gg74zhx9h-(j_1k7!wfr7j(o^'


MIDDLEWARE_CLASSES = (
MIDDLEWARE = [
'django.middleware.common.CommonMiddleware',
)
]

ROOT_URLCONF = 'urls'

Expand Down
19 changes: 10 additions & 9 deletions doc/examples-django/pytilsex/tests.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# -*- encoding: utf-8 -*-

from django.urls import reverse
from django.test import TestCase
from django.test.client import Client
Expand Down Expand Up @@ -27,8 +28,8 @@ def testDt(self):
self.assertTrue('ru_strftime' in body)
self.assertTrue('ru_strftime_inflected' in body)
self.assertTrue('ru_strftime_preposition' in body)
self.assertTrue(u'вчера' in body)
self.assertTrue(u'завтра' in body)
self.assertTrue('вчера' in body)
self.assertTrue('завтра' in body)

def testNumeral(self):
resp = self.c.get(reverse('pytils_numeral_example'))
Expand All @@ -39,13 +40,13 @@ def testNumeral(self):
self.assertTrue('rubles' in body)
self.assertTrue('in_words' in body)
self.assertTrue('sum_string' in body)
self.assertTrue(u'комментарий' in body)
self.assertTrue(u'без примеров' in body)
self.assertTrue(u'двадцать три рубля пятнадцать копеек' in body)
self.assertTrue(u'двенадцать рублей' in body)
self.assertTrue(u'двадцать один' in body)
self.assertTrue(u'тридцать одна целая триста восемьдесят пять тысячных' in body)
self.assertTrue(u'двадцать один комментарий' in body)
self.assertTrue('комментарий' in body)
self.assertTrue('без примеров' in body)
self.assertTrue('двадцать три рубля пятнадцать копеек' in body)
self.assertTrue('двенадцать рублей' in body)
self.assertTrue('двадцать один' in body)
self.assertTrue('тридцать одна целая триста восемьдесят пять тысячных' in body)
self.assertTrue('двадцать один комментарий' in body)

def testTranslit(self):
resp = self.c.get(reverse('pytils_translit_example'))
Expand Down
30 changes: 9 additions & 21 deletions doc/examples/dt.distance_of_time_in_words.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,6 @@
import time
from pytils import dt

def print_(s):
# pytils всегда возвращает юникод (строка в Py3.x)
# обычно это ОК выводить юникод в терминал
# но если это неинтерактивный вывод
# (например, использования модуля subprocess)
# то для Py2.x нужно использовать перекодировку в utf-8
from pytils.third import six
if six.PY3:
out = s
else:
out = s.encode('UTF-8')
print(out)

# поддерживаются оба модуля работы со временем:
# time
Expand All @@ -37,30 +25,30 @@ def print_(s):

# если to_time не передано, считается от "сейчас",
# и тогда -1 день -> "вчера", а +1 день -> "завтра"
print_(dt.distance_of_time_in_words(in_past))
print(dt.distance_of_time_in_words(in_past))
#-> вчера
print_(dt.distance_of_time_in_words(dt_in_future))
print(dt.distance_of_time_in_words(dt_in_future))
#-> завтра


# а вот если передано to_time, то нельзя говорить "вчера",
# потому что to_time не обязательно "сейчас",
# поэтому -1 день -> "1 день назад"
print_(dt.distance_of_time_in_words(in_past, to_time=current_time))
print(dt.distance_of_time_in_words(in_past, to_time=current_time))
#-> 1 день назад

# увеличение точности отражается на результате
print_(dt.distance_of_time_in_words(in_past, accuracy=2))
print(dt.distance_of_time_in_words(in_past, accuracy=2))
#-> 1 день 3 часа назад
print_(dt.distance_of_time_in_words(in_past, accuracy=3))
print(dt.distance_of_time_in_words(in_past, accuracy=3))
#-> 1 день 3 часа 46 минут назад

# аналогично и с будущим временем:
print_(dt.distance_of_time_in_words(in_future))
print(dt.distance_of_time_in_words(in_future))
#-> завтра
print_(dt.distance_of_time_in_words(in_future, to_time=current_time))
print(dt.distance_of_time_in_words(in_future, to_time=current_time))
#-> через 1 день
print_(dt.distance_of_time_in_words(in_future, accuracy=2))
print(dt.distance_of_time_in_words(in_future, accuracy=2))
#-> через 1 день 3 часа
print_(dt.distance_of_time_in_words(in_future, accuracy=3))
print(dt.distance_of_time_in_words(in_future, accuracy=3))
#-> через 1 день 3 часа 46 минут
31 changes: 9 additions & 22 deletions doc/examples/dt.ru_strftime.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,42 @@
import datetime
from pytils import dt

def print_(s):
# pytils всегда возвращает юникод (строка в Py3.x)
# обычно это ОК выводить юникод в терминал
# но если это неинтерактивный вывод
# (например, использования модуля subprocess)
# то для Py2.x нужно использовать перекодировку в utf-8
from pytils.third import six
if six.PY3:
out = s
else:
out = s.encode('UTF-8')
print(out)


# действие ru_strftime аналогично оригинальному strftime
# только в %a, %A, %b и %B вместо английских названий будут русские

d = datetime.date(2006, 9, 15)

# оригинал
print_(d.strftime("%d.%m.%Y (%a)"))
print(d.strftime("%d.%m.%Y (%a)"))
# -> 15.09.2006 (Fri)

# теперь на русском
# (единственно, что нужно формат строки передавать в unicode
# в то время, как в оригинальном strftime это обязательно str)
print_(dt.ru_strftime(u"%d.%m.%Y (%a)", d))
print(dt.ru_strftime("%d.%m.%Y (%a)", d))
# -> 15.09.2006 (пт)

# %A дает полное название дня недели
print_(dt.ru_strftime(u"%d.%m.%Y (%A)", d))
print(dt.ru_strftime("%d.%m.%Y (%A)", d))
# -> 15.09.2006 (пятница)

# %B -- название месяца
print_(dt.ru_strftime(u"%d %B %Y", d))
print(dt.ru_strftime("%d %B %Y", d))
# -> 15 сентябрь 2006

# ru_strftime умеет правильно склонять месяц (опция inflected)
print_(dt.ru_strftime(u"%d %B %Y", d, inflected=True))
print(dt.ru_strftime("%d %B %Y", d, inflected=True))
# -> 15 сентября 2006

# ... и день (опция inflected_day)
print_(dt.ru_strftime(u"%d.%m.%Y, в %A", d, inflected_day=True))
print(dt.ru_strftime("%d.%m.%Y, в %A", d, inflected_day=True))
# -> 15.09.2006, в пятницу

# ... и добавлять правильный предлог (опция preposition)
print_(dt.ru_strftime(u"%d.%m.%Y, %A", d, preposition=True))
print(dt.ru_strftime("%d.%m.%Y, %A", d, preposition=True))
# -> 15.09.2006, в пятницу

# второй параметр можно не передавать, будет использована текущая дата
print_(dt.ru_strftime(u"%d %B %Y", inflected=True))
# ->> 1 декабря 2013
print(dt.ru_strftime("%d %B %Y", inflected=True))
# ->> 1 декабря 2013
29 changes: 8 additions & 21 deletions doc/examples/numeral.choose_plural.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,6 @@

from pytils import numeral

def print_(s):
# pytils всегда возвращает юникод (строка в Py3.x)
# обычно это ОК выводить юникод в терминал
# но если это неинтерактивный вывод
# (например, использования модуля subprocess)
# то для Py2.x нужно использовать перекодировку в utf-8
from pytils.third import six
if six.PY3:
out = s
else:
out = s.encode('UTF-8')
print(out)


# choose_plural нужен для выбора правильной формы
# существительного
Expand All @@ -28,28 +15,28 @@ def print_(s):
# (один, два, пять)
# т.е. для 1, 2 и 5 объектов, например для слова "пример"
# (пример, примера, примеров)
print_(numeral.choose_plural(21, (u"пример", u"примера", u"примеров")))
print(numeral.choose_plural(21, ("пример", "примера", "примеров")))
#-> пример
print_(numeral.choose_plural(12, (u"пример", u"примера", u"примеров")))
print(numeral.choose_plural(12, ("пример", "примера", "примеров")))
#-> примеров
print_(numeral.choose_plural(32, (u"пример", u"примера", u"примеров")))
print(numeral.choose_plural(32, ("пример", "примера", "примеров")))
#-> примера

# также можно задавать варианты в одну строку, разделенные запятой
print_(numeral.choose_plural(32, u"пример,примера, примеров"))
print(numeral.choose_plural(32, "пример,примера, примеров"))
#-> примера

# если в варианте используется запятая, она экранируется слешем
print_(numeral.choose_plural(35, u"гвоздь, гвоздя, гвоздей\, шпунтов"))
print(numeral.choose_plural(35, "гвоздь, гвоздя, гвоздей\, шпунтов"))
#-> гвоздей, шпунтов

# зачастую требуется не просто вариант, а вместе с числительным
# в этом случае следует использовать get_plural
print_(numeral.get_plural(32, u"пример,примера, примеров"))
print(numeral.get_plural(32, "пример,примера, примеров"))
#-> 32 примера

# часто хочется, чтобы в случае отсутсвия значения (т.е. количество равно нулю)
# выводилось не "0 примеров", а "примеров нет"
# в этом случае используйте третий параметр get_plural:
print_(numeral.get_plural(0, u"пример,примера, примеров", u"без примеров"))
# -> без примеров
print(numeral.get_plural(0, "пример,примера, примеров", "без примеров"))
# -> без примеров
28 changes: 7 additions & 21 deletions doc/examples/numeral.in_words.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,30 @@

from pytils import numeral

def print_(s):
# pytils всегда возвращает юникод (строка в Py3.x)
# обычно это ОК выводить юникод в терминал
# но если это неинтерактивный вывод
# (например, использования модуля subprocess)
# то для Py2.x нужно использовать перекодировку в utf-8
from pytils.third import six
if six.PY3:
out = s
else:
out = s.encode('UTF-8')
print(out)


# in_words нужен для представления цифр словами

print_(numeral.in_words(12))
print(numeral.in_words(12))
#-> двенадцать

# вторым параметром можно задать пол:
# мужской=numeral.MALE, женский=numeral.FEMALE, срелний=numeral.NEUTER (по умолчанию -- мужской)
print_(numeral.in_words(21))
print(numeral.in_words(21))
#-> двадцать один

# можно передавать неименованным параметром:
print_(numeral.in_words(21, numeral.FEMALE))
print(numeral.in_words(21, numeral.FEMALE))
#-> двадцать одна

# можно именованным
print_(numeral.in_words(21, gender=numeral.FEMALE))
print(numeral.in_words(21, gender=numeral.FEMALE))
#-> двадцать одна
print_(numeral.in_words(21, gender=numeral.NEUTER))
print(numeral.in_words(21, gender=numeral.NEUTER))
#-> двадцать одно

# можно и дробные
print_(numeral.in_words(12.5))
print(numeral.in_words(12.5))
#-> двенадцать целых пять десятых

# причем "пишутся" только значимые цифры
print_(numeral.in_words(5.30000))
print(numeral.in_words(5.30000))
#-> пять целых три десятых