Mopidy: Перенос Mopidy на Python 3

Созданный на 13 июл. 2014  ·  32Комментарии  ·  Источник: mopidy/mopidy

Python 3 - это будущее Python, он широко доступен в средах, в которых развернут Mopidy, и я очень заинтересован в возможности использовать asyncio, для которого требуется Python 3.3+. За пределами проекта Mopidy ничто не мешает нам перейти на Python 3.

Это основная ошибка, позволяющая отслеживать наш путь к запуску Mopidy на Python 3.

  • Зависимости:

    • [x] Pykka поддерживает Python 2.6+, 3.2+.

    • [x] Tornado поддерживает Python 2.6+, 3.2+.

    • GStreamer:

    • [x] # 225: Переключить привязки GStreamer Python с gst-python (только Python 2) на PyGI (Python 2 + 3). Чтобы все работало с PyGI, требуется одновременный перенос GStreamer с 0.10 на 1.x.

    • [x] # 665: Сделать микшеры независимыми от GStreamer, поскольку микшеры удалены из GStreamer 1.x.

    • [x] # 671: Извлечь / повторно реализовать поддержку формата нашего списка воспроизведения, чтобы он не зависел от GStreamer. Есть некоторые проблемы с повторной реализацией этого поверх PyGI / GStreamer 1.x.

  • Переместить стиль кода в сторону совместимости с Python 2 + 3:

    • [x] flake8 предупреждение чистый код.

    • [x] Отказ от поддержки всех версий Python старше 2.7.

    • [x] Используйте везде from __future__ import unicode_literals и пометьте двоичные строки с помощью b'foo' .

    • [x] Выборочное исправление проблем переносимости, выявленных инструментом 2to3 .

  • Поддержка разработки:

    • [x] Используйте tox для запуска тестов, поэтому мы можем легко добавить тестирование Python 3 параллельно с Python 2.7.

  • Mopidy-Spotify:

    • [x] Реализовать новую привязку libspotify, pyspotify 2, которая поддерживает Python 2.7, 3.2+.

    • [x] Повторная реализация Mopidy-Spotify поверх pyspotify 2.

  • Мопиды-МПРИС:

    • [x] привязки к libindicate, указывающие на python, можно заменить на PyGI.

    • [x] python-dbus можно заменить на GDBus через PyGI.

  • Экосистема расширений:

    • [x] Используйте tox в качестве средства запуска тестов в cookiecutter-mopidy-ext, чтобы быть готовым к запуску тестов и на Python 3.

    • [] Отправлять запросы на вытягивание / создавать проблемы для поддержки Python 2 + 3 во всех расширениях, когда Mopidy сам работает на Python 2 + 3.

  • [x] Как только ~ все расширения будут поддерживать Python 2 + 3, откажитесь от поддержки Python 2 в Mopidy.
  • [x] Удалите 2измы Python.
  • [x] Наслаждайтесь новыми функциями Python 3, такими как asyncio.
C-enhancement

Самый полезный комментарий

Я по-прежнему привержен портированию Mopidy на Python 3. Я не позволю Mopidy умереть с Python 2.

История

Большая часть работы по переводу нас на Python 3 была сделана много лет назад, чтобы гарантировать, что все наши зависимости работают на Python 3:

  • Pykka совместим с Python 3 с момента его извлечения из Mopidy в 2011 году.
  • pyspotify 2.x был полностью переписан, чтобы получить поддержку Python 3 и полные привязки libspotify. Одно только это заняло почти два года от начала до конца, и сейчас эта работа по большей части аннулирована из-за того, что Spotify сломал большую часть libspotify.
  • Перенос Mopidy с GStreamer 0.10 / PyGObject на GStreamer 1.x / PyGI, выпущенный в Mopidy 2.0 три года назад, был основным проектом моего второго отпуска по уходу за ребенком.

Как вы, вероятно, можете прочитать между строк из долгой истории этой проблемы и состояния системы отслеживания проблем, этот проект и открытый исходный код в целом не были для меня главным приоритетом с тех пор, как я перешел из работы на большом предприятии в стартап. три года назад.

Однако я медленно начинаю снова брать свои проекты с открытым исходным кодом. Я пытаюсь сосредоточиться на одном проекте за раз и отправить его, прежде чем браться за следующий. Пока что Mopidy.js и Mopidy-MPRIS получили нежную любовь и заботу. В настоящее время я работаю над новой версией Pykka , которая среди других небольших улучшений значительно сократит время запуска многих настроек Mopidy.

Следующий

После того, как Pykka 2 будет выпущен, моя основная цель - перевести Mopidy на Python 3.

Я не буду давать никаких оценок времени, когда эта работа будет завершена, так как это просто настроит меня на провал. Все во многом зависит от внешних факторов и мотивации.

Что касается помощи, я не вижу, чтобы новые участники могли что-то сделать, чтобы напрямую существенно помочь усилиям. Я все еще не вернулся к работе над открытым исходным кодом в предсказуемой и регулярной ритме, поэтому PR-обзоры быстро станут демотивацией для обеих сторон. Как упоминалось ранее в этом выпуске, любая помощь по снижению общей нагрузки на техническое обслуживание всегда помогает косвенно.

Что касается других основных разработчиков, я уверен, что они смогут помочь, но у всех нас есть свои приоритеты и проекты. Я не буду ждать, пока наше время и мотивация все выровняются. Если они присоединятся, как только я начну должным образом работать над Mopidy 3, это будет прекрасно, но у меня нет никаких ожиданий.

Если отбросить всю мою бессвязную жизнь и все остальное, это не грандиозная задача и не задача, с которой я незнаком. В основном это вопрос завершения других текущих дел, чтобы на какое-то время это могло стать основным фокусом.

Mopidy 3

С тех пор, как я написал последний план здесь в марте 2017 года, внедрение Python 3 зашло так далеко, что я больше не вижу смысла в постепенных шагах от Python 2 только через 2 + 3 только к Python 3. Mopidy 2.x достаточно хорошо служил нам в течение трех лет и будет хорошим и стабильным местом, чтобы оставить тех, кто застрял на Python 2 по какой-либо причине.

Таким образом, пересматривая план от марта 2017 года, я представляю себе такой процесс:

  • [x] Удалите все устаревшее из Mopidy. См. Подробные сведения о вехе v3.0 .
  • [x] Портирование Mopidy на Python 3.
  • [x] Сделайте предварительный выпуск PyPI, например 3.0.0-rc1. Это не повлияет на тех, кто использует pip install mopidy , но дает возможность запустить pip install --pre mopidy для установки предварительной версии для тестирования перенесенных расширений.
  • [x] Переносите все расширения в Mopidy org на Python 3 и, при желании, делайте предварительные выпуски на PyPI.
  • [] Перенести / помочь перенести другие расширения на Python 3. Нужна помощь, как только мы сюда попали.
  • [] Сделайте скоординированный основной выпуск ядра Mopidy и всех расширений в Mopidy org.

Все 32 Комментарий

Привет, я хотел бы помочь с миграцией на Python 3, что-нибудь конкретное, что сейчас происходит? не хочу никому наступать на пятки

Я открыл ветку в jodal / feature / py3-compat, где у меня:

  • обновлена ​​проверка версии Python, которая мешает запускать Mopidy под Python 3
  • обновил настройку tox.ini
  • начало исправления проблем Py3 модуль за модулем, запуск тестов как на Python 2, так и на Python 3

Я не касался этого с ноября, за исключением того, что пару дней назад я перебазировал ветку поверх Mopidy 2.0.0. Текущее состояние таково, что я исправил около 1000 тестов, осталось около 240.

В планах на будущее:

  1. Остальные проблемы устраняйте по модулю.
  2. Воспользуйтесь опытом исправления всех проблем и постарайтесь максимально использовать его в Mopidy 2.x. Мой нынешний модульный подход меняет вещи (например, он начинает угрожать путям файлов как Unicode, а не байтами), что я не хочу использовать в Mopidy до выпуска 3.0, где нам разрешено что-то ломать. Разница «невозможно посадить до 3.0» должна быть как можно меньше.
  3. Используйте Mopidy с Python 3, чтобы найти все проблемы, не охваченные тестами.

хорошо, я открою эту ветку и постараюсь исправить все тесты, которые смогу

Привет, ребята, есть новости по этому поводу?

На это осталось 3½ года 😉

Есть ли обновления по этому поводу?

Перенос на Python 3 - моя личная первоочередная задача при работе над Mopidy, проблема в том, что я был очень занят работой в течение последнего года.

Мой текущий план, в примерном порядке, заключается в следующем:

  • [x] Исправьте набор тестов Mopidy-MPRIS, чтобы он пережил предстоящие изменения. Это немного скучно и близко к моему порогу.
  • [x] Удалите все устаревшее из Mopidy и сделайте крупный выпуск. См. Подробные сведения об этой вехе . Я с нетерпением жду этого.
  • [x] Убедитесь, что все расширения в Mopidy org по-прежнему работают после удаления, и внесите необходимые изменения и выпуски.
  • [x] Портируйте Mopidy на Python 2 + 3 и сделайте еще один крупный выпуск.
  • [] Перенести все расширения в Mopidy org только на Python 3 и выпустить.
  • [] Перенести / помочь перенести все другие расширения только на Python 3 и настоятельно рекомендовать их выпустить.
  • [] Удалите поддержку Python 2 из самого Mopidy.

Как видите, есть несколько задач, которые необходимо выполнить перед началом самого портирования. Тем не менее, большая часть работы уже завершена: переписывание pyspotify для работы на Python 3 (здесь были потрачены два года моего свободного времени) и перенос Mopidy на GStreamer 1.x (один отпуск для отца из свободного времени, проведенного здесь).

Я доберусь туда, но это займет время. Если люди хотят помочь, я думаю, что наиболее полезным было бы помочь с расширениями портов на Python 3, как только Mopidy будет поддерживать 2 + 3.

Спасибо за обновление, @jodal.

Думаю, переход на Python3 - хорошая идея.

Я новичок в mopidy и никогда не участвовал в этом, вы думаете, что я
может вам чем-то помочь?

El mié., 22 мар. de 2017 а ля (а) 07:08, Frederick Gnodtke <
[email protected]> подписка:

Спасибо за обновление, @jodal https://github.com/jodal .

-
Вы получаете это, потому что подписаны на эту беседу.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/mopidy/mopidy/issues/779#issuecomment-288352544 или отключить звук
нить
https://github.com/notifications/unsubscribe-auth/AHQMO8UqLNKzfVQZAZJ3Pnjx2N7MsHg4ks5roPMEgaJpZM4CMq8p
.

Любая помощь в проекте, которая освобождает часть бремени обслуживания, помогает в достижении больших непростых целей, таких как Python 3, поскольку освобождает время сопровождающих либо для работы над более крупными проблемами, либо для проведения надлежащего анализа кода для более крупных вкладов, что может быть довольно утомительно и отнимает много времени. Два основных примера помогают другим пользователям отлаживать свои проблемы и воспроизводить возможные ошибки, минимизировать шаги, необходимые для воспроизведения, и документировать результаты в проблемах.

@jodal Где мы можем увидеть вашу работу с python3?

С уважением

@jodal ветка py3-compat, которую вы упомянули, выглядит немного ... заброшенной. Есть где-нибудь новый?
Я подумываю о написании расширения, и я бы предпочел копаться в некоторых ошибках py3 в нестабильной ветке mopidy, а не вспоминать неприятные обходные пути py2.

Какой статус по этому поводу? есть ли версия mopidy, которую можно использовать с python3?

Pylast зависимостей скоро прекратит поддержку устаревшего Python 2: https://github.com/pylast/pylast/issues/265

Привет,
В настоящее время я поддерживаю pylast в Debian. Я собираюсь загрузить последнюю версию ([1]), которая больше не поддерживает Python 2.7.
Я планирую опубликовать эту версию в конце февраля, если mopidy все еще использует Python 2, не будет включен
в следующем выпуске Debian, что может быть позором, поскольку mopidy - потрясающая программа: smiley:

Есть ли официальная ветка где это происходит? Я хочу помочь этому случиться

С Уважением

@jodal Расширения здесь блокируют? Если это так, я бы предложил открыть проблему для каждого расширения и сослаться на них здесь, чтобы отслеживать. Если вы можете дать некоторые инструкции по вопросу о том, какие изменения, вероятно, потребуются, то люди, которые еще не знакомы с Python (например, я), могут все еще помочь.

PS Я рад помочь с расширениями, которые я использую (GMusic, Iris, Podcast, Scrobbler, Spotify), просто не знаю, что мне делать в данный момент.

Привет, ребята, может кто-нибудь уточнить статус адаптации к python3? Есть ли у нас какие-либо оценки, когда будет выпущена первая версия python3? Спасибо.

Я по-прежнему привержен портированию Mopidy на Python 3. Я не позволю Mopidy умереть с Python 2.

История

Большая часть работы по переводу нас на Python 3 была сделана много лет назад, чтобы гарантировать, что все наши зависимости работают на Python 3:

  • Pykka совместим с Python 3 с момента его извлечения из Mopidy в 2011 году.
  • pyspotify 2.x был полностью переписан, чтобы получить поддержку Python 3 и полные привязки libspotify. Одно только это заняло почти два года от начала до конца, и сейчас эта работа по большей части аннулирована из-за того, что Spotify сломал большую часть libspotify.
  • Перенос Mopidy с GStreamer 0.10 / PyGObject на GStreamer 1.x / PyGI, выпущенный в Mopidy 2.0 три года назад, был основным проектом моего второго отпуска по уходу за ребенком.

Как вы, вероятно, можете прочитать между строк из долгой истории этой проблемы и состояния системы отслеживания проблем, этот проект и открытый исходный код в целом не были для меня главным приоритетом с тех пор, как я перешел из работы на большом предприятии в стартап. три года назад.

Однако я медленно начинаю снова брать свои проекты с открытым исходным кодом. Я пытаюсь сосредоточиться на одном проекте за раз и отправить его, прежде чем браться за следующий. Пока что Mopidy.js и Mopidy-MPRIS получили нежную любовь и заботу. В настоящее время я работаю над новой версией Pykka , которая среди других небольших улучшений значительно сократит время запуска многих настроек Mopidy.

Следующий

После того, как Pykka 2 будет выпущен, моя основная цель - перевести Mopidy на Python 3.

Я не буду давать никаких оценок времени, когда эта работа будет завершена, так как это просто настроит меня на провал. Все во многом зависит от внешних факторов и мотивации.

Что касается помощи, я не вижу, чтобы новые участники могли что-то сделать, чтобы напрямую существенно помочь усилиям. Я все еще не вернулся к работе над открытым исходным кодом в предсказуемой и регулярной ритме, поэтому PR-обзоры быстро станут демотивацией для обеих сторон. Как упоминалось ранее в этом выпуске, любая помощь по снижению общей нагрузки на техническое обслуживание всегда помогает косвенно.

Что касается других основных разработчиков, я уверен, что они смогут помочь, но у всех нас есть свои приоритеты и проекты. Я не буду ждать, пока наше время и мотивация все выровняются. Если они присоединятся, как только я начну должным образом работать над Mopidy 3, это будет прекрасно, но у меня нет никаких ожиданий.

Если отбросить всю мою бессвязную жизнь и все остальное, это не грандиозная задача и не задача, с которой я незнаком. В основном это вопрос завершения других текущих дел, чтобы на какое-то время это могло стать основным фокусом.

Mopidy 3

С тех пор, как я написал последний план здесь в марте 2017 года, внедрение Python 3 зашло так далеко, что я больше не вижу смысла в постепенных шагах от Python 2 только через 2 + 3 только к Python 3. Mopidy 2.x достаточно хорошо служил нам в течение трех лет и будет хорошим и стабильным местом, чтобы оставить тех, кто застрял на Python 2 по какой-либо причине.

Таким образом, пересматривая план от марта 2017 года, я представляю себе такой процесс:

  • [x] Удалите все устаревшее из Mopidy. См. Подробные сведения о вехе v3.0 .
  • [x] Портирование Mopidy на Python 3.
  • [x] Сделайте предварительный выпуск PyPI, например 3.0.0-rc1. Это не повлияет на тех, кто использует pip install mopidy , но дает возможность запустить pip install --pre mopidy для установки предварительной версии для тестирования перенесенных расширений.
  • [x] Переносите все расширения в Mopidy org на Python 3 и, при желании, делайте предварительные выпуски на PyPI.
  • [] Перенести / помочь перенести другие расширения на Python 3. Нужна помощь, как только мы сюда попали.
  • [] Сделайте скоординированный основной выпуск ядра Mopidy и всех расширений в Mopidy org.

Поскольку прошло пять месяцев, я думаю, пора обновить эту проблему. Релиз Pykka, о котором я говорил в прошлый раз, был отправлен как Pykka 2.0 шесть недель назад. С тех пор я снова начал работать над Mopidy:

  • Выпуск исправления ошибок 2.2.3 отсутствует, поэтому в настоящее время в ветви release-2.2 нет ничего невыпущенного.
  • В ветви develop которая станет Mopidy 3.0, большая часть устаревшего материала была удалена.

Следующим для меня, вероятно, будет:

  • [x] Упрощение ведения журнала (# 1452)
  • [x] Определите и реализуйте, как обрабатывать пути файловой системы при переходе от байтовых API Python 2 к текстовым API файловой системы Python 3. (Проблем с отслеживанием пока нет.)
  • [x] Начните передавать набор тестов на Python 3.

Могу ли я что-нибудь сделать, чтобы сделать ядро ​​mopidy или плагин mopidy-soundcloud, работающим с python3?

Спасибо за вашу работу @jodal!

Мне интересно, как мы должны устанавливать документы при использовании версии Sphinx для Python 3 для их сборки (с запросом на упаковку)?

Раньше я делал make -C docs SPHINXBUILD=sphinx-build-2 man но меняя это на sphinx-build-3 только ошибки:

make: Entering directory '/home/builder/aports/community/mopidy/src/Mopidy-3.0.0a1/docs'
sphinx-build-3 -b man -d _build/doctrees   . _build/man
Running Sphinx v1.8.4

Configuration error:
The configuration file (or one of the modules it imports) called sys.exit()

Это происходит как в 2.2.3, так и в 3.0.0a1. Или эта часть просто еще не портирована?

Учитывая, что v3 в любом случае нарушит обратную совместимость, а python2 будет прекращен в январе, есть ли причина сохранять совместимость python2 в v3?

@tmccombs сказал:

Учитывая, что v3 в любом случае нарушит обратную совместимость, а python2 будет прекращен в январе, есть ли причина сохранять совместимость python2 в v3?

Нет, мы не планируем сохранять совместимость с Python 2 в Mopidy 3.

Цитирую себя из февраля:

С тех пор, как я написал последний план здесь в марте 2017 года, внедрение Python 3 зашло так далеко, что я больше не вижу смысла в постепенных шагах от Python 2 только через 2 + 3 только к Python 3. Mopidy 2.x достаточно хорошо служил нам в течение трех лет и будет хорошим и стабильным местом, чтобы оставить тех, кто застрял на Python 2 по какой-либо причине.

@PureTryOut сказал:

Это происходит как в 2.2.3, так и в 3.0.0a1. Или эта часть просто еще не портирована?

Ни один из Mopidy еще не был портирован на Python 3. Мы просто сделали другие упрощения и удалили устаревшие вещи, чтобы упростить переход. После того, как мы портируем, мы создадим документы с помощью Sphinx, работающего на Python 3.

Могу я посоветовать убедиться, что следующий выпуск (2.4.0?) Совместим с Python 3? Большинство дистрибутивов работают над тем, чтобы избавиться от своих пакетов Python 2. В моем случае Alpine Linux отказывается от Python 2 к следующему выпуску (3.11, конец января следующего года), что означает, что Mopidy будет удален из репозиториев, если к тому времени он не будет совместим с Python 3.

Mopidy 3.0 будет совместим с Python 3. Планируется выпустить его до конца года.

Привет, @jodal , в ближайшие недели у меня может быть несколько свободных циклов, чтобы помочь с некоторыми функциями Python 3. Либо в мопиды напрямую, либо в пристройках. У вас есть какие-то особые проблемы, которые нужно решить?

Привет @zubieta!

Недавно мы объединили тестовую установку, которая успешно запускает ~ 10% набора тестов на Python 3. Скоро будет объединено несколько PR, что увеличит это значение до ~ 20%. Пожалуйста, проверьте, какие PR уже открыты, чтобы не дублировать какую-либо работу, и посмотрите описание # 1809 для пошагового руководства о том, как портировать еще несколько модулей и их тесты.

Расширения появятся, как только ядро ​​Mopidy будет работать на Python 3.

Думаю, пора обновить статус Mopidy и Python 3 ...

Mopidy 3.0.0a2 работает на Python 3: tada:

Каждый из тестов 2016 года в наборе тестов Mopidy теперь работает как на Python 2.7, так и на Python 3.7. Вся эта работа объединена в ветку develop . Огромное спасибо @kingosticks за помощь в портировании!

Я только что выпустил ветку develop как есть для PyPI как Mopidy 3.0.0a2 . Его можно установить с помощью:

python3.7 -m pip install --pre mopidy

Этот выпуск не подвергался никакому обширному тестированию, кроме прохождения набора тестов, ответов на несколько запросов через MPD и HTTP и воспроизведения нескольких файлов MP3.

Впереди дорога: arrow_right:

Mopidy 3.0.0a2, вероятно, будет единственным выпуском Mopidy, который когда-либо поддерживал как Python 2, так и 3. Мы незамедлительно начнем удалять поддержку Python 2.7 и сделаем Mopidy более чистой и современной базой кода Python.

План к финальному релизу примерно следующий:

  • [x] Удалите поддержку Python 2.7 из Mopidy и очистите после работы по переносу.
  • [x] Убедитесь, что поддерживается Python 3.8.
  • [x] Отформатируйте исходный код черным цветом.
  • [x] Сделайте еще одну альфа- версию.
  • [] Исправьте проблемы на этапе v3.0 .
  • [] Сделать бета- версию.
  • [] Исправьте все ошибки, обнаруженные при использовании и переносе расширений.
  • [] Сделайте релиз-кандидата .
  • [] Как только будет перенесен достаточно большой набор расширений ...
  • [] Выпуск финальной версии Mopidy 3.0.

Нужна помощь: heart_eyes:

Параллельно с движением к финальной версии 3.0 нам нужна помощь с остальной частью экосистемы из 122 пакетов на PyPI, найденных при поиске по запросу «mopidy».

Для каждого интересующего вас расширения:

  • [] Порт на Python> = 3.7. Отказаться от поддержки Python 2.7.
  • [] Рассмотрите возможность включения модернизации настройки проекта из расширения cookiecutter . Я обновлю cookiecutter в ближайшее время, когда сам займусь портированием некоторых расширений.
  • [] Сделайте предварительные релизы портов на PyPI.
  • [] Как только выйдет финальная версия Mopidy 3.0, сделайте финальную версию PyPI.

76 коммитов, 204 файла изменено, 9832 вставки (+), 9612 удалений (-) позже, у нас есть еще один предварительный выпуск: Mopidy 3.0.0a3 теперь находится на PyPI. Его можно установить с помощью:

python3 -m pip install --pre mopidy

Новое с 3.0.0a2:

  • Поддержка Python 2.7 исчезла, включая много устаревшего кода / кода совместимости:

    • Модуль mopidy.compat пропал.

    • # encoding: utf-8 комментариев больше нет.

    • from __future__ ... импорта больше нет.

    • Все подклассы object удалены.

    • .encode() и .decode() больше не включают явный аргумент "utf-8" .

  • Исходный код имеет формат black . :злое сердце:
  • isort теперь настроены и могут использоваться для очистки импорта при необходимости.
  • mock заменяется на unittest.mock .
  • Методы утверждения unittest заменены операторами pytest assert , что означает лучшую читаемость и лучшие сообщения об ошибках.
  • Большинство экземпляров % и .format() заменяются f-строками.
  • Все линтеры работают на Python 3.
  • Документы построены на Python 3.
  • Тесты в CI выполняются на Python 3.8 в дополнение к Python 3.7.
  • setup.py свернуто и заменено декларативным setup.cfg .
  • Все зависимости в tox.ini , dev-requirements.txt и docs/requirements.txt заменены на "extras" в setup.cfg . Это означает, что зависимости разработчика теперь устанавливаются с помощью python3 -m pip install -e ".[dev]" .

Путь впереди все еще выглядит так, как я написал в предыдущем комментарии.

Что касается ядра Mopidy, я думаю, что мы на этом закончили.

Оставшийся путь к финалу Mopidy 3.0 отслеживается в вехе v3.0:
https://github.com/mopidy/mopidy/milestone/55

Перенос ключевых расширений на Python 3 отслеживается на этой доске проекта:
https://github.com/orgs/mopidy/projects/2

Если вы протестируете Mopidy на Python 3 в ближайшем будущем, пожалуйста, открывайте вопросы для любых проблем, с которыми вы столкнетесь!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

simonsmiley picture simonsmiley  ·  9Комментарии

mczerski picture mczerski  ·  9Комментарии

godzillamesel picture godzillamesel  ·  6Комментарии

szuniverse picture szuniverse  ·  13Комментарии

Mestelan picture Mestelan  ·  6Комментарии