[Debian-astro-commits] [python-astropy] 01/02: Revert "FIX: improved detection of ascii fast_reader in non-fast parsers"

Ole Streicher olebole at moszumanska.debian.org
Thu Jan 26 09:08:55 UTC 2017


This is an automated email from the git hooks/post-receive script.

olebole pushed a commit to branch debian
in repository python-astropy.

commit 77057ebf1e94511fea09bca5ec1cd36426e97925
Author: Ole Streicher <olebole at debian.org>
Date:   Wed Jan 25 16:14:40 2017 +0100

    Revert "FIX: improved detection of ascii fast_reader in non-fast parsers"
    
    This reverts commit 52109dc398f434dc238688ed905aba4bf6acf68e.
---
 ...ection-of-ascii-fast_reader-in-non-fast-p.patch | 646 ---------------------
 debian/patches/series                              |   1 -
 2 files changed, 647 deletions(-)

diff --git a/debian/patches/FIX-improved-detection-of-ascii-fast_reader-in-non-fast-p.patch b/debian/patches/FIX-improved-detection-of-ascii-fast_reader-in-non-fast-p.patch
deleted file mode 100644
index 08cb2f0..0000000
--- a/debian/patches/FIX-improved-detection-of-ascii-fast_reader-in-non-fast-p.patch
+++ /dev/null
@@ -1,646 +0,0 @@
-From: Derek Homeier <dhomeie at gwdg.de>
-Date: Fri, 9 Dec 2016 01:15:41 +0100
-Subject: FIX: improved detection of ascii fast_reader in non-fast parsers
-
-Pull request: https://github.com/astropy/astropy/pull/5578
----
- astropy/io/ascii/core.py                |  11 +-
- astropy/io/ascii/cparser.pyx            |   7 +-
- astropy/io/ascii/tests/test_c_reader.py | 265 +++++++++++++++++++++++---------
- astropy/io/ascii/tests/test_read.py     |   7 +-
- astropy/io/ascii/ui.py                  |  28 +++-
- docs/io/ascii/fast_ascii_io.rst         |  25 +--
- docs/io/ascii/read.rst                  |   2 +
- 7 files changed, 257 insertions(+), 88 deletions(-)
-
-diff --git a/astropy/io/ascii/core.py b/astropy/io/ascii/core.py
-index 48a3f58..0bf9f68 100644
---- a/astropy/io/ascii/core.py
-+++ b/astropy/io/ascii/core.py
-@@ -1345,8 +1345,17 @@ def _get_reader(Reader, Inputter=None, Outputter=None, **kwargs):
-             kwargs['Inputter'] = Inputter
-         return Reader(**kwargs)
- 
-+    # If user explicitly passed a fast reader with 'force' or with non-default
-+    # options for the fast reader, raise an error for slow readers
-     if 'fast_reader' in kwargs:
--        del kwargs['fast_reader'] # ignore fast_reader parameter for slow readers
-+        if kwargs['fast_reader'] == 'force' or \
-+           isinstance(kwargs['fast_reader'] , dict):
-+            raise ParameterError('fast_reader required with ' +
-+                                 '{0}, but this is a slow reader: {1}'
-+                                 .format(kwargs['fast_reader'], Reader))
-+        else:
-+            del kwargs['fast_reader'] # otherwise ignore fast_reader parameter
-+
-     reader_kwargs = dict([k, v] for k, v in kwargs.items() if k not in extra_reader_pars)
-     reader = Reader(**reader_kwargs)
- 
-diff --git a/astropy/io/ascii/cparser.pyx b/astropy/io/ascii/cparser.pyx
-index 1ac24c0..b5b7b05 100644
---- a/astropy/io/ascii/cparser.pyx
-+++ b/astropy/io/ascii/cparser.pyx
-@@ -386,7 +386,12 @@ cdef class CParser:
-             data_end = max(self.data_end - self.data_start, 0) # read nothing if data_end < 0
- 
-         if tokenize(self.tokenizer, data_end, 0, <int>len(self.names)) != 0:
--            self.raise_error("an error occurred while parsing table data")
-+            if self.tokenizer.code in (NOT_ENOUGH_COLS, TOO_MANY_COLS):
-+                raise core.InconsistentTableError("Number of header columns " +
-+                      "({0}) inconsistent with data columns in data line {1}"
-+                      .format(self.tokenizer.num_cols, self.tokenizer.num_rows))
-+            else:
-+                self.raise_error("an error occurred while parsing table data")
-         elif self.tokenizer.num_rows == 0: # no data
-             return ([np.array([], dtype=np.int_)] * self.width, [])
-         self._set_fill_values()
-diff --git a/astropy/io/ascii/tests/test_c_reader.py b/astropy/io/ascii/tests/test_c_reader.py
-index cc28830..33b9e43 100644
---- a/astropy/io/ascii/tests/test_c_reader.py
-+++ b/astropy/io/ascii/tests/test_c_reader.py
-@@ -8,6 +8,7 @@ except ImportError: # cStringIO doesn't exist in Python 3
- 
- import os
- import functools
-+import copy
- 
- from textwrap import dedent
- 
-@@ -16,7 +17,7 @@ from numpy import ma
- 
- from ....table import Table, MaskedColumn, Column
- from ... import ascii
--from ...ascii.core import ParameterError, FastOptionsError
-+from ...ascii.core import ParameterError, FastOptionsError, InconsistentTableError
- from ...ascii.cparser import CParserError
- from ..fastbasic import FastBasic, FastCsv, FastTab, FastCommentedHeader, \
-     FastRdb, FastNoHeader
-@@ -27,7 +28,11 @@ from ....extern.six.moves import range
- 
- TRAVIS = os.environ.get('TRAVIS', False)
- 
--def assert_table_equal(t1, t2, check_meta=False):
-+def assert_table_equal(t1, t2, check_meta=False, rtol=1.e-15, atol=1.e-300):
-+    """
-+    Test equality of all columns in a table, with stricter tolerances for
-+    float columns than the np.allclose default.
-+    """
-     assert_equal(len(t1), len(t2))
-     assert_equal(t1.colnames, t2.colnames)
-     if check_meta:
-@@ -43,7 +48,7 @@ def assert_table_equal(t1, t2, check_meta=False):
-                     elif isinstance(el, six.string_types):
-                         assert_equal(el, t2[name][i])
-                     else:
--                        assert_almost_equal(el, t2[name][i])
-+                        assert_almost_equal(el, t2[name][i], rtol=rtol, atol=atol)
-                 except (TypeError, NotImplementedError):
-                     pass # ignore for now
- 
-@@ -374,10 +379,10 @@ A B C
- 7 8 9 10
- 11 12 13
- """
--    with pytest.raises(CParserError) as e:
-+    with pytest.raises(InconsistentTableError) as e:
-         table = FastBasic().read(text)
--    assert 'CParserError: an error occurred while parsing table data: too many ' \
--        'columns found in line 3 of data' in str(e)
-+    assert 'InconsistentTableError: Number of header columns (3) ' \
-+           'inconsistent with data columns in data line 2' in str(e)
- 
- 
- def test_too_many_cols2():
-@@ -386,10 +391,10 @@ aaa,bbb
- 1,2,
- 3,4,
- """
--    with pytest.raises(CParserError) as e:
-+    with pytest.raises(InconsistentTableError) as e:
-         table = FastCsv().read(text)
--    assert 'CParserError: an error occurred while parsing table data: too many ' \
--        'columns found in line 1 of data' in str(e)
-+    assert 'InconsistentTableError: Number of header columns (2) ' \
-+           'inconsistent with data columns in data line 0' in str(e)
- 
- 
- def test_too_many_cols3():
-@@ -398,10 +403,10 @@ aaa,bbb
- 1,2,,
- 3,4,
- """
--    with pytest.raises(CParserError) as e:
-+    with pytest.raises(InconsistentTableError) as e:
-         table = FastCsv().read(text)
--    assert 'CParserError: an error occurred while parsing table data: too many ' \
--        'columns found in line 1 of data' in str(e)
-+    assert 'InconsistentTableError: Number of header columns (2) ' \
-+           'inconsistent with data columns in data line 0' in str(e)
- 
- 
- @pytest.mark.parametrize("parallel", [True, False])
-@@ -420,7 +425,7 @@ A,B,C
-     assert table['B'][1] is not ma.masked
-     assert table['C'][1] is ma.masked
- 
--    with pytest.raises(CParserError) as e:
-+    with pytest.raises(InconsistentTableError) as e:
-         table = FastBasic(delimiter=',').read(text)
- 
- 
-@@ -755,10 +760,11 @@ A B C
-     expected = Table([[7, 10], [8, 11], [91, 12]], names=('A', 'B', 'C'))
-     assert_table_equal(table, expected)
- 
--    with pytest.raises(CParserError) as e:
-+    with pytest.raises(InconsistentTableError) as e:
-         # tries to begin in the middle of quoted field
-         read_basic(text, data_start=4, parallel=parallel)
--    assert 'not enough columns found in line 1 of data' in str(e)
-+    assert 'header columns (3) inconsistent with data columns in data line 0' \
-+        in str(e)
- 
-     table = read_basic(text, data_start=5, parallel=parallel)
-     # ignore commented line
-@@ -825,9 +831,10 @@ def test_strip_line_trailing_whitespace(parallel, read_basic):
-     row.
-     """
-     text = 'a b c\n1 2 \n3 4 5'
--    with pytest.raises(CParserError) as e:
-+    with pytest.raises(InconsistentTableError) as e:
-         ascii.read(StringIO(text), format='fast_basic', guess=False)
--    assert 'not enough columns found in line 1' in str(e)
-+    assert 'header columns (3) inconsistent with data columns in data line 0' \
-+        in str(e)
- 
-     text = 'a b c\n 1 2 3   \t \n 4 5 6 '
-     table = read_basic(text, parallel=parallel)
-@@ -956,7 +963,8 @@ def test_read_big_table(tmpdir):
- 
- 
- # fast_reader configurations: False| 'use_fast_converter'=False|True
-- at pytest.mark.parametrize('reader', [ 0, 1, 2])
-+ at pytest.mark.parametrize('reader', [ False, dict(use_fast_converter=False),
-+                                     dict(use_fast_converter=True) ])
- # catch Windows environment since we cannot use _read() with custom fast_reader
- @pytest.mark.parametrize("parallel", [ False,
-     pytest.mark.xfail(os.name == 'nt', reason=
-@@ -971,43 +979,45 @@ def test_data_out_of_range(parallel, reader):
-     """
-     # Python reader and strtod() are expected to return precise results
-     rtol = 1.e-30
--    if reader > 1:
--        rtol = 1.e-15
--    # passing fast_reader dict with parametrize does not work!
--    if reader > 0:
--        fast_reader = {'parallel': parallel, 'use_fast_converter': reader > 1}
--    else:
--        fast_reader = False
-+
-+    # update fast_reader dict; pass only copies to avoid changing during read()!
-+    if reader:
-+        reader['parallel'] = parallel
-+        if reader.get('use_fast_converter'):
-+            rtol = 1.e-15
-+
-     if parallel:
--        if reader < 1:
-+        if not reader:
-             pytest.skip("Multiprocessing only available in fast reader")
-         elif TRAVIS:
-             pytest.xfail("Multiprocessing can sometimes fail on Travis CI")
- 
-     fields = [ '10.1E+199', '3.14e+313', '2048e+306', '0.6E-325', '-2.e345' ]
-     values = np.array([ 1.01e200, np.inf, np.inf, 0.0, -np.inf ])
--    t = ascii.read(StringIO(' '.join(fields)), format='no_header', guess=False,
--                   fast_reader=fast_reader)
-+    t = ascii.read(StringIO(' '.join(fields)), format='no_header',
-+                   fast_reader=copy.deepcopy(reader))
-     read_values = np.array([col[0] for col in t.itercols()])
-     assert_almost_equal(read_values, values, rtol=rtol, atol=1.e-324)
- 
-     # test some additional corner cases
-     fields = [ '.0101E202', '0.000000314E+314', '1777E+305', '-1799E+305', '0.2e-323',
--               '2500e-327', ' 0.0000000000000000000001024E+330' ]
-+               '5200e-327', ' 0.0000000000000000000001024E+330' ]
-     values = np.array([ 1.01e200, 3.14e307, 1.777e308, -np.inf, 0.0, 4.94e-324, 1.024e308 ])
--    t = ascii.read(StringIO(' '.join(fields)), format='no_header', guess=False,
--                   fast_reader=fast_reader)
-+    t = ascii.read(StringIO(' '.join(fields)), format='no_header',
-+                   fast_reader=copy.deepcopy(reader))
-     read_values = np.array([col[0] for col in t.itercols()])
-     assert_almost_equal(read_values, values, rtol=rtol, atol=1.e-324)
- 
-     # test corner cases again with non-standard exponent_style (auto-detection)
--    if  reader < 2:
-+    if reader and reader.get('use_fast_converter'):
-+        reader.update({'exponent_style': 'A'})
-+    else:
-         pytest.skip("Fortran exponent style only available in fast converter")
--    fast_reader.update({'exponent_style': 'A'})
-+
-     fields = [ '.0101D202', '0.000000314d+314', '1777+305', '-1799E+305', '0.2e-323',
-                '2500-327', ' 0.0000000000000000000001024Q+330' ]
--    t = ascii.read(StringIO(' '.join(fields)), format='no_header', guess=False,
--                   fast_reader=fast_reader)
-+    t = ascii.read(StringIO(' '.join(fields)), format='no_header',
-+                   fast_reader=copy.deepcopy(reader))
-     read_values = np.array([col[0] for col in t.itercols()])
-     assert_almost_equal(read_values, values, rtol=rtol, atol=1.e-324)
- 
-@@ -1029,14 +1039,14 @@ def test_int_out_of_range(parallel):
- 
-     text = 'P M S\n {:d} {:d} {:s}'.format(imax, imin, huge)
-     expected = Table([[imax], [imin], [huge]], names=('P', 'M', 'S'))
--    table = ascii.read(text, format='basic', guess=False,
-+    table = ascii.read(text, format='basic',
-                        fast_reader={'parallel': parallel})
-     assert_table_equal(table, expected)
- 
-     # check with leading zeroes to make sure strtol does not read them as octal
-     text = 'P M S\n000{:d} -0{:d} 00{:s}'.format(imax, -imin, huge)
-     expected = Table([[imax], [imin], ['00'+huge]], names=('P', 'M', 'S'))
--    table = ascii.read(text, format='basic', guess=False,
-+    table = ascii.read(text, format='basic',
-                        fast_reader={'parallel': parallel})
-     assert_table_equal(table, expected)
- 
-@@ -1047,10 +1057,10 @@ def test_int_out_of_range(parallel):
-     expected = Table([[12.3, 10.*imax], [10.*imax, 4.56e8]],
-                      names=('A', 'B'))
- 
--    table = ascii.read(text, format='basic', guess=False,
-+    table = ascii.read(text, format='basic',
-                        fast_reader={'parallel': parallel})
-     assert_table_equal(table, expected)
--    table = ascii.read(text, format='basic', guess=False, fast_reader=False)
-+    table = ascii.read(text, format='basic', fast_reader=False)
-     assert_table_equal(table, expected)
- 
- 
-@@ -1064,39 +1074,40 @@ def test_fortran_reader(parallel):
-     Make sure that ascii.read() can read Fortran-style exponential notation
-     using the fast_reader.
-     """
--    text = 'A B C\n100.01{:s}+99 2.0 3\n 4.2{:s}-1 5.0{:s}-1 0.6{:s}4'
--    expected = Table([[1.0001e101, 0.42], [2, 0.5], [3.0, 6000]],
--                     names=('A', 'B', 'C'))
-+    # check for nominal np.float64 precision
-+    rtol = 1.e-15
-+    atol = 0.0
-+    text = 'A B C D\n100.01{:s}99       2.0  2.0{:s}-103 3\n' + \
-+           ' 4.2{:s}-1 5.0{:s}-1     0.6{:s}4 .017{:s}+309'
-+    expc = Table([[1.0001e101, 0.42], [2, 0.5], [2.e-103, 6.e3], [3, 1.7e307]],
-+                 names=('A', 'B', 'C', 'D'))
- 
--    expstyles = { 'e': 4*('E'), 'D': ('D', 'd', 'd', 'D'), 'Q': 2*('q', 'Q'),
--                  'fortran': ('D', 'E', 'Q', 'd') }
-+    expstyles = { 'e': 6*('E'),
-+                  'D': ('D', 'd', 'd', 'D', 'd', 'D'),
-+                  'Q': 3*('q', 'Q'),
-+                  'Fortran': ('E', '0', 'D', 'Q', 'd', '0') }
- 
-     # C strtod (not-fast converter) can't handle Fortran exp
-     with pytest.raises(FastOptionsError) as e:
--        ascii.read(text.format(*(4*('D'))), format='basic', guess=False,
-+        ascii.read(text.format(*(6*('D'))), format='basic',
-                    fast_reader={'use_fast_converter': False,
-                                 'parallel': parallel, 'exponent_style': 'D'})
-     assert 'fast_reader: exponent_style requires use_fast_converter' in str(e)
- 
--    # enable multiprocessing and the fast converter
--    # iterate over all style-exponent combinations
-+    # enable multiprocessing and the fast converter iterate over
-+    # all style-exponent combinations, with auto-detection
-     for s, c in expstyles.items():
--        table = ascii.read(text.format(*c), format='basic', guess=False,
--                           fast_reader={'parallel': parallel,
--                                        'exponent_style': s})
--        assert_table_equal(table, expected)
--
--    # mixes and triple-exponents without any character using autodetect option
--    text = 'A B C\n1.0001+101 2.0E0 3\n.42d0 0.5 6.+003'
--    table = ascii.read(text, format='basic', guess=False,
--                       fast_reader={'parallel': parallel, 'exponent_style': 'fortran'})
--    assert_table_equal(table, expected)
-+        table = ascii.read(text.format(*c), fast_reader={'parallel': parallel,
-+                                                         'exponent_style': s})
-+        assert_table_equal(table, expc, rtol=rtol, atol=atol)
- 
--    # additional corner-case checks
--    text = 'A B C\n1.0001+101 2.0+000 3\n0.42+000 0.5 6000.-000'
--    table = ascii.read(text, format='basic', guess=False,
--                       fast_reader={'parallel': parallel, 'exponent_style': 'fortran'})
--    assert_table_equal(table, expected)
-+    # additional corner-case checks including triple-exponents without
-+    # any character and mixed whitespace separators
-+    text = 'A B\t\t C D\n1.0001+101 2.0+000\t 0.0002-099 3\n ' + \
-+           '0.42-000 \t 0.5 6.+003   0.000000000000000000000017+330'
-+    table = ascii.read(text, fast_reader={'parallel': parallel,
-+                                          'exponent_style': 'A'})
-+    assert_table_equal(table, expc, rtol=rtol, atol=atol)
- 
- 
- @pytest.mark.parametrize("parallel", [
-@@ -1112,12 +1123,126 @@ def test_fortran_invalid_exp(parallel):
-     if parallel and TRAVIS:
-         pytest.xfail("Multiprocessing can sometimes fail on Travis CI")
- 
-+    rtol = 1.e-15
-+    atol = 0.0
-+
-+    formats = { 'basic': ' ', 'tab': '\t', 'csv': ',' }
-+    header = ['S1', 'F2', 'S2', 'F3', 'S3', 'F4', 'F5', 'S4', 'I1', 'F6', 'F7']
-+    # tested entries and expected returns, first for auto-detect,
-+    # then for different specified exponents
-     fields = [ '1.0001+1', '.42d1', '2.3+10', '0.5', '3+1001', '3000.',
--               '2', '4.56e-2.3', '8000', '4.2-122' ]
--    values = [ '1.0001+1', 4.2, '2.3+10', 0.5, '3+1001', 3.e3,
--               2, '4.56e-2.3', 8000, 4.2e-122 ]
--
--    t = ascii.read(StringIO(' '.join(fields)), format='no_header', guess=False,
--                   fast_reader={'parallel': parallel, 'exponent_style': 'A'})
--    read_values = [col[0] for col in t.itercols()]
--    assert read_values == values
-+               '2', '4.56e-2.3', '8000', '4.2-022', '.00000145e314' ]
-+    vals_e = [ '1.0001+1', '.42d1', '2.3+10',   0.5, '3+1001',  3.e3,
-+               2, '4.56e-2.3',    8000,  '4.2-022', 1.45e308 ]
-+    vals_d = [ '1.0001+1',     4.2, '2.3+10',   0.5, '3+1001',  3.e3,
-+               2, '4.56e-2.3',    8000,  '4.2-022', '.00000145e314' ]
-+    vals_a = [ '1.0001+1',     4.2, '2.3+10',   0.5, '3+1001',  3.e3,
-+               2, '4.56e-2.3',    8000,   4.2e-22,  1.45e308 ]
-+    vals_v = [ '1.0001+1', 4.2, '2.3+10',   0.5, '3+1001',  3.e3,
-+               2, '4.56e-2.3',    8000,  '4.2-022', 1.45e308 ]
-+
-+    # iterate over supported format types and separators
-+    for f, s in formats.items():
-+        t1 = ascii.read(StringIO(s.join(header)+'\n'+s.join(fields)), format=f,
-+                fast_reader={'parallel': parallel, 'exponent_style': 'A'})
-+        # assert t1['I1'].dtype.kind == 'i'
-+        assert_table_equal(t1, Table([[col] for col in vals_a], names=header))
-+
-+    # try another separator as well with auto-detection
-+    #formats['bar'] = '|'
-+
-+    for s in formats.values():
-+        t2 = ascii.read(StringIO(s.join(header)+'\n'+s.join(fields)),
-+                fast_reader={'parallel': parallel, 'exponent_style': 'a'})
-+
-+        assert_table_equal(t2, Table([[col] for col in vals_a], names=header))
-+
-+    # iterate for (default) expchar 'E'
-+    for s in formats.values():
-+        t3 = ascii.read(StringIO(s.join(header)+'\n'+s.join(fields)),
-+                fast_reader={'parallel': parallel, 'use_fast_converter': True})
-+
-+        assert_table_equal(t3, Table([[col] for col in vals_e], names=header))
-+
-+    # iterate for expchar 'D'
-+    for s in formats.values():
-+        t4 = ascii.read(StringIO(s.join(header)+'\n'+s.join(fields)),
-+                fast_reader={'parallel': parallel, 'exponent_style': 'D'})
-+
-+        assert_table_equal(t4, Table([[col] for col in vals_d], names=header))
-+
-+    # iterate for regular converter (strtod)
-+    for s in formats.values():
-+        t5 = ascii.read(StringIO(s.join(header)+'\n'+s.join(fields)),
-+                fast_reader={'parallel': parallel, 'use_fast_converter': False})
-+
-+        read_values = [col[0] for col in t5.itercols()]
-+        if os.name == 'nt':
-+            # apparently C strtod() on (some?) MSVC recognises 'd' exponents!
-+            assert read_values == vals_v or read_values == vals_e
-+        else:
-+            assert read_values == vals_e
-+
-+
-+def test_fortran_reader_notbasic():
-+    """
-+    Check if readers without a fast option raise a value error when a
-+    fast_reader is asked for.
-+    """
-+
-+    tabstr = dedent("""
-+    a b
-+    1 1.23D4
-+    2 5.67D-8
-+    """)[1:-1]
-+
-+    t1 = ascii.read(tabstr.split('\n'), fast_reader=dict(exponent_style='D'))
-+
-+    assert t1['b'].dtype.kind == 'f'
-+
-+    tabrdb = dedent("""
-+    a\tb
-+    # A simple RDB table
-+    N\tN
-+    1\t 1.23D4
-+    2\t 5.67-008
-+    """)[1:-1]
-+
-+    t2 = ascii.read(tabrdb.split('\n'), format='rdb',
-+                    fast_reader=dict(exponent_style='fortran'))
-+
-+    assert t2['b'].dtype.kind == 'f'
-+
-+    tabrst = dedent("""
-+    = =======
-+    a b
-+    = =======
-+    1 1.23E4
-+    2 5.67E-8
-+    = =======
-+    """)[1:-1]
-+
-+    t3 = ascii.read(tabrst.split('\n'), format='rst')
-+
-+    assert t3['b'].dtype.kind == 'f'
-+
-+    # in the special case of fast_converter=True (the default),
-+    # incompatibility is ignored
-+    t4 = ascii.read(tabrst.split('\n'), format='rst', fast_reader=True)
-+
-+    assert t4['b'].dtype.kind == 'f'
-+
-+    # pytest.xfail("Readers do not correctly check for incompatible options")
-+    with pytest.raises(ParameterError):
-+        t5 = ascii.read(tabrst.split('\n'), format='rst', guess=False,
-+                        fast_reader='force')
-+
-+    with pytest.raises(ParameterError):
-+        t6 = ascii.read(tabrst.split('\n'), format='rst', guess=False,
-+                        fast_reader=dict(use_fast_converter=False))
-+
-+    tabrst = tabrst.replace('E', 'D')
-+
-+    with pytest.raises(ParameterError):
-+        t7 = ascii.read(tabrst.split('\n'), format='rst', guess=False,
-+                        fast_reader=dict(exponent_style='D'))
-diff --git a/astropy/io/ascii/tests/test_read.py b/astropy/io/ascii/tests/test_read.py
-index e1a571b..e878a3d 100644
---- a/astropy/io/ascii/tests/test_read.py
-+++ b/astropy/io/ascii/tests/test_read.py
-@@ -112,7 +112,12 @@ def test_read_with_names_arg(fast_reader):
-     """
-     Test that a bad value of `names` raises an exception.
-     """
--    with pytest.raises(ValueError):
-+    # CParser only uses columns in `names` and thus reports mismach in num_col
-+    if fast_reader:
-+        e = ascii.InconsistentTableError
-+    else:
-+        e = ValueError
-+    with pytest.raises(e):
-         dat = ascii.read(['c d', 'e f'], names=('a', ), guess=False, fast_reader=fast_reader)
- 
- 
-diff --git a/astropy/io/ascii/ui.py b/astropy/io/ascii/ui.py
-index 5b5e09a..ae3e625 100644
---- a/astropy/io/ascii/ui.py
-+++ b/astropy/io/ascii/ui.py
-@@ -162,7 +162,10 @@ def get_reader(Reader=None, Inputter=None, Outputter=None, **kwargs):
-     # This function is a light wrapper around core._get_reader to provide a public interface
-     # with a default Reader.
-     if Reader is None:
--        Reader = basic.Basic
-+        if kwargs.get('fast_reader', False):
-+            Reader = fastbasic.FastBasic
-+        else:
-+            Reader = basic.Basic
-     reader = core._get_reader(Reader, Inputter=Inputter, Outputter=Outputter, **kwargs)
-     return reader
- 
-@@ -324,7 +327,6 @@ def read(table, guess=None, **kwargs):
-             guess = False
- 
-     if not guess:
--        reader = get_reader(**new_kwargs)
-         # Try the fast reader version of `format` first if applicable.  Note that
-         # if user specified a fast format (e.g. format='fast_basic') this test
-         # will fail and the else-clause below will be used.
-@@ -339,14 +341,16 @@ def read(table, guess=None, **kwargs):
-                                     'status': 'Success with fast reader (no guessing)'})
-             except (core.ParameterError, cparser.CParserError) as e:
-                 # special testing value to avoid falling back on the slow reader
--                if fast_reader_param == 'force':
-+                if fast_reader_param == 'force' or isinstance(fast_reader_param, dict):
-                     raise e
-                 # If the fast reader doesn't work, try the slow version
-+                reader = get_reader(**new_kwargs)
-                 dat = reader.read(table)
-                 _read_trace.append({'kwargs': new_kwargs,
-                                     'status': 'Success with slow reader after failing'
-                                              ' with fast (no guessing)'})
-         else:
-+            reader = get_reader(**new_kwargs)
-             dat = reader.read(table)
-             _read_trace.append({'kwargs': new_kwargs,
-                                 'status': 'Success with specified Reader class '
-@@ -407,6 +411,11 @@ def _guess(table, read_kwargs, format, fast_reader):
-     else:
-         fast_kwargs = None
- 
-+    # dictionary arguments are passed by reference per default and might
-+    # (usually will!) be altered by `read()` - especially `cparser` - calls,
-+    # backup them here
-+    user_kwargs = copy.deepcopy(read_kwargs)
-+
-     # Filter the full guess list so that each entry is consistent with user kwarg inputs.
-     # This also removes any duplicates from the list.
-     filtered_guess_kwargs = []
-@@ -417,8 +426,10 @@ def _guess(table, read_kwargs, format, fast_reader):
-         if fast_reader is False and guess_kwargs['Reader'] in core.FAST_CLASSES.values():
-             continue
- 
--        # If user required a fast reader with 'force' then skip all non-fast readers
--        if fast_reader == 'force' and guess_kwargs['Reader'] not in core.FAST_CLASSES.values():
-+        # If user explicitly required a fast reader with 'force' or as dict of
-+        # options then skip all non-fast readers
-+        if (fast_reader == 'force' or isinstance(fast_reader, dict)) \
-+           and guess_kwargs['Reader'] not in core.FAST_CLASSES.values():
-             continue
- 
-         guess_kwargs_ok = True  # guess_kwargs are consistent with user_kwargs?
-@@ -460,12 +471,19 @@ def _guess(table, read_kwargs, format, fast_reader):
-     # keep track of the failed guess and move on.
-     for guess_kwargs in filtered_guess_kwargs:
-         t0 = time.time()
-+        for key, val in user_kwargs.items():
-+            # update guess_kwargs again; need a deep copy to preserve dicts
-+            if key not in guess_kwargs:
-+                guess_kwargs[key] = val.copy()
-+            elif val != guess_kwargs[key] and guess_kwargs != fast_kwargs:
-+                guess_kwargs[key] = val.copy()
-         try:
-             # If guessing will try all Readers then use strict req'ts on column names
-             if 'Reader' not in read_kwargs:
-                 guess_kwargs['strict_names'] = True
- 
-             reader = get_reader(**guess_kwargs)
-+
-             reader.guessing = True
-             dat = reader.read(table)
-             _read_trace.append({'kwargs': guess_kwargs, 'status': 'Success (guessing)',
-diff --git a/docs/io/ascii/fast_ascii_io.rst b/docs/io/ascii/fast_ascii_io.rst
-index ac25cba..fe7b0a9 100644
---- a/docs/io/ascii/fast_ascii_io.rst
-+++ b/docs/io/ascii/fast_ascii_io.rst
-@@ -19,7 +19,9 @@ are currently compatible with the fast engine:
-  * ``tab``
- 
- The fast engine can also be enabled through the format parameter by prefixing
--a compatible format with "fast" and then an underscore. In this case, |read|
-+a compatible format with "fast" and then an underscore. In this case, or
-+when enforcing the fast engine by either setting ``fast_reader='force'``
-+or explicitly setting any of the :ref:`fast_conversion_opts`, |read|
- will not fall back on an ordinary reader if fast reading fails.
- For example::
- 
-@@ -35,21 +37,24 @@ To disable the fast engine, specify ``fast_reader=False`` or
- 
- .. Note:: Guessing and Fast reading
- 
--   By default |read| will try to guess the format of in the input data by successively
--   trying different formats until one succeeds ([reference the guessing section]).
--   For the default ``'ascii'`` format this means that a number of pure Python readers
--   with no fast implementation will be tried before getting to the fast readers.
-+   By default |read| will try to guess the format of in the input data by
-+   successively trying different formats until one succeeds
-+   (see the section on :ref:`guess_formats`). 
-+   For the default ``'ascii'`` format it will try all fast reader formats
-+   before testing any pure Python readers with no fast implementation.
- 
--   **For optimum performance**, turn off guessing entirely (``guess=False``) or
--   narrow down the format options as much as possible by specifying the format
--   (e.g. ``format='csv'``) and/or other options such as the delimiter.
-+   **For optimum performance** however, it is recommended to turn off
-+   guessing entirely (``guess=False``) or narrow down the format options
-+   as much as possible by specifying the format (e.g. ``format='csv'``)
-+   and/or other options such as the delimiter.
- 
- Reading
- ^^^^^^^
- Since the fast engine is not part of the ordinary :mod:`astropy.io.ascii`
- infrastructure, fast readers raise an error when passed certain
--parameters which are not implemented in the fast reader
--infrastructure. In this case |read| will fall back on the ordinary reader.
-+parameters which are not implemented in the fast reader infrastructure.
-+In this case |read| will fall back on the ordinary reader, unless the
-+fast reader has been explicitly requested (see above).
- These parameters are:
- 
-  * Negative ``header_start`` (except for commented-header format)
-diff --git a/docs/io/ascii/read.rst b/docs/io/ascii/read.rst
-index eec45d8..a3210dd 100644
---- a/docs/io/ascii/read.rst
-+++ b/docs/io/ascii/read.rst
-@@ -284,6 +284,8 @@ values in with typical placeholders::
-          used ``'nan'`` for the ``<match_string>`` value then integer columns
-          would wind up as float.
- 
-+.. _guess_formats:
-+
- Guess table format
- ^^^^^^^^^^^^^^^^^^
- 
diff --git a/debian/patches/series b/debian/patches/series
index 67910dc..c47f1df 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -7,4 +7,3 @@ external_python_pkgs.patch
 Fix-default-value-for-remote_data-option.patch
 Use-parametrize-instead-of-yield.patch
 Allow-pytest-3.x-to-use-plugin-for-doctests-in-.rst-files.patch
-FIX-improved-detection-of-ascii-fast_reader-in-non-fast-p.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-astro/packages/python-astropy.git



More information about the Debian-astro-commits mailing list