Hi Bolke,

(Switching email to avoid moderation on my emails.)

The normal Airflow test suite does not fail as it uses a LC_ALL set to
utf-8.

I think it is a proper test though, it is a minimal reproducible version of
the code that fails. And the only difference in behaviour is at 3.7 which
we don’t support anyway so I’m fairly sure it is broken for all supported
Python 3 versions.

I now tried running the tests in docker using 3.5 with the LC_ALL/LANG
unset and I see the same failure.

I don’t think this is a big thing though and we could release it without
the fix I made. I think most people run it with a sane LC_ALL, but
apparently we didn’t.
Here’s the log for the test:

> docker run -t -i -v `pwd`:/airflow/ python:3.5 bash
root@b99b297df111:/# locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
> unset LANG
root@b99b297df111:/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
root@b99b297df111:/# pip install -e .[devel]
root@b99b297df111:/airflow# ./run_unit_tests.sh
+ export AIRFLOW_HOME=/root/airflow
+ AIRFLOW_HOME=/root/airflow
+ export AIRFLOW__CORE__UNIT_TEST_MODE=True
+ AIRFLOW__CORE__UNIT_TEST_MODE=True
+ export AIRFLOW__TESTSECTION__TESTKEY=testvalue
+ AIRFLOW__TESTSECTION__TESTKEY=testvalue
+ export AIRFLOW_USE_NEW_IMPORTS=1
+ AIRFLOW_USE_NEW_IMPORTS=1
+++ dirname ./run_unit_tests.sh
++ cd .
++ pwd
+ DIR=/airflow
+ export PYTHONPATH=:/airflow/tests/test_utils
+ PYTHONPATH=:/airflow/tests/test_utils
+ nose_args=
+ which airflow
+ echo 'Initializing the DB'
Initializing the DB
+ airflow resetdb
+ yes
Traceback (most recent call last):
  File "/usr/local/bin/airflow", line 6, in <module>
    exec(compile(open(__file__).read(), __file__, 'exec'))
  File "/airflow/airflow/bin/airflow", line 21, in <module>
    from airflow import configuration
  File "/airflow/airflow/__init__.py", line 35, in <module>
    from airflow import configuration as conf
  File "/airflow/airflow/configuration.py", line 106, in <module>
    DEFAULT_CONFIG = f.read()
  File "/usr/local/lib/python3.5/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 21082:
ordinal not in range(128)
+ '[' '' ']'
+ '[' -z '' ']'
+ nose_args='--with-coverage     --cover-erase     --cover-html
--cover-package=airflow     --cover-html-dir=airflow/www/static/coverage
  --with-ignore-docstrings     --rednose     --with-timer     -s     -v
--logging-level=DEBUG '
+ echo 'Starting the unit tests with the following nose arguments:
--with-coverage' --cover-erase --cover-html --cover-package=airflow
--cover-html-dir=airflow/www/static/coverage --with-ignore-docstrings
--rednose --with-timer -s -v --logging-level=DEBUG
Starting the unit tests with the following nose arguments: --with-coverage
--cover-erase --cover-html --cover-package=airflow
--cover-html-dir=airflow/www/static/coverage --with-ignore-docstrings
--rednose --with-timer -s -v --logging-level=DEBUG
+ nosetests --with-coverage --cover-erase --cover-html
--cover-package=airflow --cover-html-dir=airflow/www/static/coverage
--with-ignore-docstrings --rednose --with-timer -s -v --logging-level=DEBUG
nose.plugins.cover: ERROR: Coverage not available: unable to import
coverage module
Failure: UnicodeDecodeError ('ascii' codec can't decode byte 0xe2 in
position 21082: ordinal not in range(128)) ... ERROR
Failure: UnicodeDecodeError ('ascii' codec can't decode byte 0xe2 in
position 21082: ordinal not in range(128)) ... ERROR
======================================================================
1) ERROR: Failure: UnicodeDecodeError ('ascii' codec can't decode byte 0xe2
in position 21082: ordinal not in range(128))
----------------------------------------------------------------------
   Traceback (most recent call last):
    /usr/local/lib/python3.5/site-packages/nose/failure.py line 39 in
runTest
      raise self.exc_val.with_traceback(self.tb)
    /usr/local/lib/python3.5/site-packages/nose/loader.py line 418 in
loadTestsFromName
      addr.filename, addr.module)
    /usr/local/lib/python3.5/site-packages/nose/importer.py line 47 in
importFromPath
      return self.importFromDir(dir_path, fqname)
    /usr/local/lib/python3.5/site-packages/nose/importer.py line 94 in
importFromDir
      mod = load_module(part_fqname, fh, filename, desc)
    /usr/local/lib/python3.5/imp.py line 245 in load_module
      return load_package(name, filename)
    /usr/local/lib/python3.5/imp.py line 217 in load_package
      return _load(spec)
    <frozen importlib._bootstrap> line 693 in _load

    <frozen importlib._bootstrap> line 673 in _load_unlocked

    <frozen importlib._bootstrap_external> line 697 in exec_module

    <frozen importlib._bootstrap> line 222 in _call_with_frames_removed

    airflow/__init__.py line 35 in <module>
      from airflow import configuration as conf
    airflow/configuration.py line 106 in <module>
      DEFAULT_CONFIG = f.read()
    /usr/local/lib/python3.5/encodings/ascii.py line 26 in decode
      return codecs.ascii_decode(input, self.errors)[0]
   UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position
21082: ordinal not in range(128)
======================================================================
2) ERROR: Failure: UnicodeDecodeError ('ascii' codec can't decode byte 0xe2
in position 21082: ordinal not in range(128))
----------------------------------------------------------------------
   Traceback (most recent call last):
    /usr/local/lib/python3.5/site-packages/nose/failure.py line 39 in
runTest
      raise self.exc_val.with_traceback(self.tb)
    /usr/local/lib/python3.5/site-packages/nose/loader.py line 418 in
loadTestsFromName
      addr.filename, addr.module)
    /usr/local/lib/python3.5/site-packages/nose/importer.py line 47 in
importFromPath
      return self.importFromDir(dir_path, fqname)
    /usr/local/lib/python3.5/site-packages/nose/importer.py line 94 in
importFromDir
      mod = load_module(part_fqname, fh, filename, desc)
    /usr/local/lib/python3.5/imp.py line 245 in load_module
      return load_package(name, filename)
    /usr/local/lib/python3.5/imp.py line 217 in load_package
      return _load(spec)
    <frozen importlib._bootstrap> line 693 in _load

    <frozen importlib._bootstrap> line 673 in _load_unlocked

    <frozen importlib._bootstrap_external> line 697 in exec_module

    <frozen importlib._bootstrap> line 222 in _call_with_frames_removed

    tests/__init__.py line 25 in <module>
      from .configuration import *
    tests/configuration.py line 28 in <module>
      from airflow import configuration
    airflow/__init__.py line 35 in <module>
      from airflow import configuration as conf
    airflow/configuration.py line 106 in <module>
      DEFAULT_CONFIG = f.read()
    /usr/local/lib/python3.5/encodings/ascii.py line 26 in decode
      return codecs.ascii_decode(input, self.errors)[0]
   UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position
21082: ordinal not in range(128)

[error] 100.00% nose.failure.Failure.runTest: 0.0004s
-----------------------------------------------------------------------------
2 tests run in 0.060 seconds.
2 errors (0 tests passed)


-- 
Carl Johan Gustavsson

On 11 July 2018 at 23:24:01, Bolke de Bruin (bdbr...@gmail.com) wrote:

Hi Carl,

That is not a real check, ie. Does Airflow have the same issue clean
install on 3.5? Travis’ tests run on 3.5.

B.

Verstuurd vanaf mijn iPad

> Op 10 jul. 2018 om 15:10 heeft Carl Johan Gustavsson <
carl.j.gustavs...@gmail.com> het volgende geschreven:
>
> Hi Bolke,
>
>
> I did a quick test on 3.5.5, 3.4.0 and 3.7.0 on OS X now, all but 3.7
breaks
>
> Quick repro:
>
> ➜ ~ pyenv local 3.5.5
> ➜ ~ locale
> LANG=
> LC_COLLATE="C"
> LC_CTYPE="C"
> LC_MESSAGES="C"
> LC_MONETARY="C"
> LC_NUMERIC="C"
> LC_TIME="C"
> LC_ALL=
> ➜ ~ cat testweird.txt
> ’
> ➜ ~ python
> Python 3.5.5 (default, Jul 7 2018, 17:00:56)
> [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
> Type "help", "copyright", "credits" or "license" for more information.
> >>> open('testweird.txt').read()
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "/Users/cjg/.pyenv/versions/3.5.5/lib/python3.5/encodings/ascii.py",
line 26, in decode
> return codecs.ascii_decode(input, self.errors)[0]
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0:
ordinal not in range(128)
> >>>
>
>
> Maybe not a blocking change but it is a breaking change from 1.9 I guess.
>
>
> / Carl Johan
>
>
>> On 10 July 2018 at 14:48:47, Bolke de Bruin (bdbr...@gmail.com) wrote:
>>
>> Hi Carl,
>>
>> Did you this on python 3.5 as well? 3.6 is not an officially supported
(yet). As a workaround is available I won’t consider this blocking btw.
>>
>> Bolke
>>
>> Verstuurd vanaf mijn iPad
>>
>> Op 10 jul. 2018 om 11:53 heeft Carl Johan Gustavsson <
carl.j.gustavs...@gmail.com> het volgende geschreven:
>>
>>> Hi,
>>>
>>> First of all, thank you for all the work with the release management.
>>>
>>> I ran in to a weird issue testing the RC1, running under Python 3.6.0 /
Ubuntu 14.04.5, upgrading from a master build from February.
>>>
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01 Traceback
(most recent call last):
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01 File
"/opt/virtualenv/tictail/pipeline/bin/airflow", line 21, in <module>
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01 from airflow
import configuration
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01 File
"/opt/virtualenv/tictail/pipeline/lib/python3.6/site-packages/airflow/__init__.py",
line 35, in <module>
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01 from airflow
import configuration as conf
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01 File
"/opt/virtualenv/tictail/pipeline/lib/python3.6/site-packages/airflow/configuration.py",
line 106, in <module>
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01
DEFAULT_CONFIG = f.read()
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01 File
"/opt/virtualenv/tictail/pipeline/lib/python3.6/encodings/ascii.py", line
26, in decode
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01 return
codecs.ascii_decode(input, self.errors)[0]
>>> Jul 10 08:50:33 hostname supervisord: airflow-webserver-01
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 20770:
ordinal not in range(128)
>>>
>>> Removing the ’ on
https://github.com/apache/incubator-airflow/blob/master/airflow/config_templates/default_airflow.cfg#L613
solved the issue for me, and digging a bit deeper it seems Airflow now
requires setting LC_ALL=en_US.UTF-8 in the environment or similar to force
Python to read the file as utf-8 and not ascii. (I think this was changed
in to default to utf-8 in Python 3.7).
>>>
>>> I see 3 solutions for this
>>> 1. Document that Airflow need to run with LC_ALL=en_US.UTF-8 or
similar.
>>> 2. Change the default config file to not contain non-ascii characters.
>>> 3. Always read the file as unicode regardless of the LC_ALL
environment, by the encoding='utf-8’ parameter to open().
>>>
>>> I think 3 is the best solution, and I can prepare a PR for that if
necessary .
>>>
>>> I guess this counts as -1 (non-binding)
>>>
>>> All the best
>>>
>>> Carl Johan
>>>
>>>
>>>
>>>> On 8 July 2018 at 22:02:33, Bolke de Bruin (bdbr...@gmail.com) wrote:
>>>>
>>>> Hey all,
>>>>
>>>> I have cut Airflow 1.10.0 RC1. This email is calling a vote on the
release,
>>>> which will last for 72 hours. Consider this my (binding) +1.
>>>>
>>>> Airflow 1.10.0 RC 1 is available at:
>>>>
>>>> https://dist.apache.org/repos/dist/dev/incubator/airflow/1.10.0rc1/ <
https://dist.apache.org/repos/dist/dev/incubator/airflow/1.10.0rc1/>
>>>>
>>>> apache-airflow-1.10.0rc1+incubating-source.tar.gz is a source release
that
>>>> comes with INSTALL instructions.
>>>> apache-airflow-1.10.0rc1+incubating-bin.tar.gz is the binary Python
"sdist"
>>>> release.
>>>>
>>>> Public keys are available at:
>>>>
>>>> https://dist.apache.org/repos/dist/release/incubator/airflow/ <
https://dist.apache.org/repos/dist/release/incubator/airflow/>
>>>>
>>>> The amount of JIRAs fixed is over 700. Please have a look at the
changelog.
>>>>
>>>> Please note that the version number excludes the `rcX` string as well
>>>> as the "+incubating" string, so it's now simply 1.10.0. This will
allow us
>>>> to rename the artifact without modifying the artifact checksums when
we
>>>> actually release.
>>>>
>>>>
>>>> Cheers,
>>>> Bolke

Reply via email to