redislabs-training / ru101

Source code and examples for Redis University RU101 Introduction to Redis Data Structures
https://university.redis.com/courses/ru101/
MIT License
112 stars 73 forks source link

Example code doesn't run with Python 3.12 #16

Closed simonprickett closed 10 months ago

simonprickett commented 10 months ago

It looks like with Python 3.12 that the distutils package that redis-py uses isn't present. This was raised by a student on Discord:

➜ python redisu/ru101/uc01-faceted-search/search.py
Traceback (most recent call last):
  File "/home/nbarreiro/Repos/redis-university/ru101/redisu/ru101/uc01-faceted-search/search.py", line 4, in <module>
    from redis import Redis
  File "/home/nbarreiro/Repos/redis-university/ru101/venv/lib/python3.12/site-packages/redis/__init__.py", line 1, in <module>
    from redis.client import Redis, StrictRedis
  File "/home/nbarreiro/Repos/redis-university/ru101/venv/lib/python3.12/site-packages/redis/client.py", line 12, in <module>
    from redis.connection import (ConnectionPool, UnixDomainSocketConnection,
  File "/home/nbarreiro/Repos/redis-university/ru101/venv/lib/python3.12/site-packages/redis/connection.py", line 2, in <module>
    from distutils.version import StrictVersion
ModuleNotFoundError: No module named 'distutils'

Try upgrading the version of redis-py used in this course: https://github.com/redislabs-training/ru101/blob/main/requirements.txt - currently quite old (3.0.1).

simonprickett commented 10 months ago

See also https://stackoverflow.com/questions/77233855/why-did-i-got-an-error-modulenotfounderror-no-module-named-distutils

simonprickett commented 10 months ago

I've been able to reproduce this with Python 3.12.0rc2 which is what's available via pyenv at the moment.

(venv) redisu $ python utils/dumpload.py load ru101/data/ru101.json
Traceback (most recent call last):
  File "/Users/simonprickett/source/github/ru101/redisu/utils/dumpload.py", line 8, in <module>
    from redis import StrictRedis
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/redis/__init__.py", line 1, in <module>
    from redis.client import Redis, StrictRedis
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/redis/client.py", line 12, in <module>
    from redis.connection import (ConnectionPool, UnixDomainSocketConnection,
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/redis/connection.py", line 2, in <module>
    from distutils.version import StrictVersion
ModuleNotFoundError: No module named 'distutils'
(venv) redisu $ python --version
Python 3.12.0rc2

Fixed this by moving to redis-py 5.0.1 in requirements.txt.

simonprickett commented 10 months ago

I'm moving this to redis-py 5.0.1 which will fix this issue. It does introduce some deprecation warnings that I'll fix at the same time. Example (I'll log all of these as I test each course script):

(venv) redisu $ python utils/dumpload.py load ru101/data/ru101.json
/Users/simonprickett/source/github/ru101/redisu/utils/dumpload.py:76: DeprecationWarning: Pipeline.hmset() is deprecated. Use Pipeline.hset() instead.
  p.hmset(obj['k'], obj['v'])
total keys loaded: 14328

Fixed this one.

simonprickett commented 10 months ago

Found an issue with the uc02 script inventory.py.

Same issue in uc03 script seat_reservation.py and uc04 notify.py and uc06 inventory-lua.py.

(venv) uc02-inventory-control $ python inventory.py
Traceback (most recent call last):
  File "/Users/simonprickett/source/github/ru101/redisu/ru101/uc02-inventory-control/inventory.py", line 8, in <module>
    import redisu.ru101.common.generate as generate
  File "/Users/simonprickett/source/github/ru101/redisu/ru101/common/generate.py", line 2, in <module>
    from faker import Faker
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/faker/__init__.py", line 1, in <module>
    from faker.factory import Factory  # noqa F401
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/faker/factory.py", line 7, in <module>
    from faker.config import AVAILABLE_LOCALES, DEFAULT_LOCALE, PROVIDERS
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/faker/config.py", line 14, in <module>
    AVAILABLE_LOCALES = find_available_locales(PROVIDERS)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/faker/utils/loading.py", line 45, in find_available_locales
    provider_module = import_module(provider_path)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/simonprickett/.pyenv/versions/3.12.0rc2/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/faker/providers/address/__init__.py", line 1, in <module>
    from .. import BaseProvider, date_time
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/faker/providers/date_time/__init__.py", line 7, in <module>
    from dateutil.tz import gettz, tzlocal, tzutc
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/dateutil/tz/__init__.py", line 2, in <module>
    from .tz import *
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/dateutil/tz/tz.py", line 21, in <module>
    from six.moves import _thread
ModuleNotFoundError: No module named 'six.moves'
simonprickett commented 10 months ago

Found an issue with uc05 where the GEOADD signature has changed:

(venv) uc05-finding-venues $ python finding_venues.py

==Test 1 - geo searches around a venue
Traceback (most recent call last):
  File "/Users/simonprickett/source/github/ru101/redisu/ru101/uc05-finding-venues/finding_venues.py", line 163, in <module>
    main()
  File "/Users/simonprickett/source/github/ru101/redisu/ru101/uc05-finding-venues/finding_venues.py", line 157, in main
    test_venue_search()
  File "/Users/simonprickett/source/github/ru101/redisu/ru101/uc05-finding-venues/finding_venues.py", line 69, in test_venue_search
    create_venue(olympic_stadium)
  File "/Users/simonprickett/source/github/ru101/redisu/ru101/uc05-finding-venues/finding_venues.py", line 64, in create_venue
    redis.geoadd(key, venue['geo']['long'], venue['geo']['lat'], venue['venue'])
  File "/Users/simonprickett/source/github/ru101/venv/lib/python3.12/site-packages/redis/commands/core.py", line 5438, in geoadd
    raise DataError("GEOADD allows either 'nx' or 'xx', not both")
redis.exceptions.DataError: GEOADD allows either 'nx' or 'xx', not both

Fixed in 636ad29

simonprickett commented 10 months ago

Closed by #17