Source: pycountry
Version: 20.7.3+ds1-1
Severity: serious
Justification: FTBFS
Tags: bookworm sid ftbfs
User: lu...@debian.org
Usertags: ftbfs-20211104 ftbfs-bookworm

Hi,

During a rebuild of all packages in sid, your package failed to build
on amd64.


Relevant part (hopefully):
>  debian/rules binary
> dh binary --with python3 --buildsystem=pybuild
>    dh_update_autotools_config -O--buildsystem=pybuild
>    dh_autoreconf -O--buildsystem=pybuild
>    dh_auto_configure -O--buildsystem=pybuild
> I: pybuild base:232: python3.9 setup.py config 
> running config
>    dh_auto_build -O--buildsystem=pybuild
> I: pybuild base:232: /usr/bin/python3 setup.py build 
> running build
> running build_py
> creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_pycountry/build/pycountry
> copying src/pycountry/__init__.py -> 
> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_pycountry/build/pycountry
> copying src/pycountry/db.py -> 
> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_pycountry/build/pycountry
> running egg_info
> creating src/pycountry.egg-info
> writing src/pycountry.egg-info/PKG-INFO
> writing dependency_links to src/pycountry.egg-info/dependency_links.txt
> writing top-level names to src/pycountry.egg-info/top_level.txt
> writing manifest file 'src/pycountry.egg-info/SOURCES.txt'
> reading manifest file 'src/pycountry.egg-info/SOURCES.txt'
> reading manifest template 'MANIFEST.in'
> warning: no previously-included files matching '*.py[co]' found anywhere in 
> distribution
> adding license file 'LICENSE.txt'
> writing manifest file 'src/pycountry.egg-info/SOURCES.txt'
> creating 
> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_pycountry/build/pycountry/tests
> copying src/pycountry/tests/test_general.py -> 
> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_pycountry/build/pycountry/tests
>    dh_auto_test -O--buildsystem=pybuild
> I: pybuild base:232: cd 
> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_pycountry/build; python3.9 -m pytest 
> /<<PKGBUILDDIR>>/src/pycountry/tests
> ============================= test session starts 
> ==============================
> platform linux -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-0.13.0
> rootdir: /<<PKGBUILDDIR>>
> collected 20 items
> 
> ../../../src/pycountry/tests/test_general.py .F..FF.......F..F...        
> [100%]
> 
> =================================== FAILURES 
> ===================================
> __________________________ test_country_fuzzy_search 
> ___________________________
> 
>     def test_country_fuzzy_search():
> >       results = pycountry.countries.search_fuzzy(u'England')
> 
> ../../../src/pycountry/tests/test_general.py:20: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> _ 
> 
> self = <pycountry.ExistingCountries object at 0x7f56b0ddaa30>, query = 
> 'england'
> 
>     def search_fuzzy(self, query):
>         query = remove_accents(query.strip().lower())
>     
>         # A country-code to points mapping for later sorting countries
>         # based on the query's matching incidence.
>         results = {}
>     
>         def add_result(country, points):
>             results.setdefault(country.alpha_2, 0)
>             results[country.alpha_2] += points
>     
>         # Prio 1: exact matches on country names
>         try:
>             add_result(self.lookup(query), 50)
>         except LookupError:
>             pass
>     
>         # Prio 2: exact matches on subdivision names
>         for candidate in subdivisions:
>             for v in candidate._fields.values():
>                 if v is None:
>                     continue
>                 v = remove_accents(v.lower())
>                 # Some names include alternative versions which we want to
>                 # match exactly.
>                 for v in v.split(';'):
>                     if v == query:
>                         add_result(candidate.country, 49)
>                         break
>     
>         # Prio 3: partial matches on country names
>         for candidate in self:
>             # Higher priority for a match on the common name
>             for v in [candidate._fields.get('name'),
>                       candidate._fields.get('official_name'),
>                       candidate._fields.get('comment')]:
>                 if v is None:
>                     continue
>                 v = remove_accents(v.lower())
>                 if query in v:
>                     # This prefers countries with a match early in their name
>                     # and also balances against countries with a number of
>                     # partial matches and their name containing 'new' in the
>                     # middle
>                     add_result(candidate, max([5, 30-(2*v.find(query))]))
>                     break
>     
>         # Prio 4: partial matches on subdivision names
>         for candidate in subdivisions:
>             v = candidate._fields.get('name')
>             if v is None:
>                 continue
>             v = remove_accents(v.lower())
>             if query in v:
>                 add_result(candidate.country, max([1, 5-v.find(query)]))
>     
>         if not results:
> >           raise LookupError(query)
> E           LookupError: england
> 
> pycountry/__init__.py:93: LookupError
> ____________________ test_subdivisions_directly_accessible 
> _____________________
> 
>     def test_subdivisions_directly_accessible():
>         #assert len(pycountry.subdivisions) == 4883
>         assert isinstance(list(pycountry.subdivisions)[0], pycountry.db.Data)
>     
>         de_st = pycountry.subdivisions.get(code='DE-ST')
>         assert de_st.code == u'DE-ST'
>         assert de_st.name == u'Sachsen-Anhalt'
> >       assert de_st.type == u'State'
> E       AssertionError: assert 'Land' == 'State'
> E         - State
> E         + Land
> 
> ../../../src/pycountry/tests/test_general.py:80: AssertionError
> _________________ test_subdivisions_have_subdivision_as_parent 
> _________________
> 
>     def test_subdivisions_have_subdivision_as_parent():
>         al_bu = pycountry.subdivisions.get(code='AL-BU')
> >       assert al_bu.code == u'AL-BU'
> E       AttributeError: 'NoneType' object has no attribute 'code'
> 
> ../../../src/pycountry/tests/test_general.py:88: AttributeError
> __________________________________ test_repr 
> ___________________________________
> 
>     def test_repr():
> >       assert re.match("Country\\(alpha_2=u?'DE', "
>                         "alpha_3=u?'DEU', "
>                         "name=u?'Germany', "
>                         "numeric=u?'276', "
>                         "official_name=u?'Federal Republic of Germany'\\)",
>                         repr(pycountry.countries.get(alpha_2='DE')))
> E       assert None
> E        +  where None = <function match at 
> 0x7f56b1a19ee0>("Country\\(alpha_2=u?'DE', alpha_3=u?'DEU', name=u?'Germany', 
> numeric=u?'276', official_name=u?'Federal Republic of Germany'\\)", 
> "Country(alpha_2='DE', alpha_3='DEU', flag='🇩🇪', name='Germany', 
> numeric='276', official_name='Federal Republic of Germany')")
> E        +    where <function match at 0x7f56b1a19ee0> = re.match
> E        +    and   "Country(alpha_2='DE', alpha_3='DEU', flag='🇩🇪', 
> name='Germany', numeric='276', official_name='Federal Republic of Germany')" 
> = repr(Country(alpha_2='DE', alpha_3='DEU', flag='🇩🇪', name='Germany', 
> numeric='276', official_name='Federal Republic of Germany'))
> E        +      where Country(alpha_2='DE', alpha_3='DEU', flag='🇩🇪', 
> name='Germany', numeric='276', official_name='Federal Republic of Germany') = 
> <bound method lazy_load.<locals>.load_if_needed of 
> <pycountry.ExistingCountries object at 0x7f56b0ddaa30>>(alpha_2='DE')
> E        +        where <bound method lazy_load.<locals>.load_if_needed of 
> <pycountry.ExistingCountries object at 0x7f56b0ddaa30>> = 
> <pycountry.ExistingCountries object at 0x7f56b0ddaa30>.get
> E        +          where <pycountry.ExistingCountries object at 
> 0x7f56b0ddaa30> = pycountry.countries
> 
> ../../../src/pycountry/tests/test_general.py:165: AssertionError
> _________________________________ test_lookup 
> __________________________________
> 
>     def test_lookup():
>         c = pycountry.countries
>         g = c.get(alpha_2='DE')
>         assert g == c.get(alpha_2='de')
>         assert g == c.lookup('de')
>         assert g == c.lookup('DEU')
>         assert g == c.lookup('276')
>         assert g == c.lookup('germany')
>         assert g == c.lookup('Federal Republic of Germany')
>         # try a generated field
>         bqaq = pycountry.historic_countries.get(alpha_4='BQAQ')
>         assert bqaq == pycountry.historic_countries.lookup('atb')
>         german = pycountry.languages.get(alpha_2='de')
>         assert german == pycountry.languages.lookup('De')
>         euro = pycountry.currencies.get(alpha_3='EUR')
>         assert euro == pycountry.currencies.lookup('euro')
>         latin = pycountry.scripts.get(name='Latin')
>         assert latin == pycountry.scripts.lookup('latn')
>         al_bu = pycountry.subdivisions.get(code='AL-BU')
> >       assert al_bu == pycountry.subdivisions.lookup('al-bu')
> 
> ../../../src/pycountry/tests/test_general.py:208: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> _ 
> pycountry/db.py:51: in load_if_needed
>     return f(self, *args, **kw)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> _ 
> 
> self = <pycountry.Subdivisions object at 0x7f56b0dda910>, value = 'al-bu'
> 
>     @lazy_load
>     def lookup(self, value):
>         if not isinstance(value, str):
>             raise LookupError()
>     
>         # Normalize for case-insensitivity
>         value = value.lower()
>     
>         # Use indexes first
>         for key in self.indices:
>             try:
>                 return self.indices[key][value]
>             except LookupError:
>                 pass
>     
>         # Use non-indexed values now. Avoid going through indexed values.
>         for candidate in self:
>             for k in self.no_index:
>                 v = candidate._fields.get(k)
>                 if v is None:
>                     continue
>                 if v.lower() == value:
>                     return candidate
>     
> >       raise LookupError('Could not find a record for %r' % value)
> E       LookupError: Could not find a record for 'al-bu'
> 
> pycountry/db.py:156: LookupError
> =========================== short test summary info 
> ============================
> FAILED ../../../src/pycountry/tests/test_general.py::test_country_fuzzy_search
> FAILED 
> ../../../src/pycountry/tests/test_general.py::test_subdivisions_directly_accessible
> FAILED 
> ../../../src/pycountry/tests/test_general.py::test_subdivisions_have_subdivision_as_parent
> FAILED ../../../src/pycountry/tests/test_general.py::test_repr - assert None
> FAILED ../../../src/pycountry/tests/test_general.py::test_lookup - 
> LookupErro...
> ========================= 5 failed, 15 passed in 0.30s 
> =========================
> E: pybuild pybuild:354: test: plugin distutils failed with: exit code=1: cd 
> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_pycountry/build; python3.9 -m pytest 
> /<<PKGBUILDDIR>>/src/pycountry/tests
> dh_auto_test: error: pybuild --test -i python{version} -p 3.9 returned exit 
> code 13


The full build log is available from:
http://qa-logs.debian.net/2021/11/04/pycountry_20.7.3+ds1-1_unstable.log

A list of current common problems and possible solutions is available at
http://wiki.debian.org/qa.debian.org/FTBFS . You're welcome to contribute!

If you reassign this bug to another package, please marking it as 'affects'-ing
this package. See https://www.debian.org/Bugs/server-control#affects

If you fail to reproduce this, please provide a build log and diff it with mine
so that we can identify if something relevant changed in the meantime.

Reply via email to