diff --git a/sandbox/grist/imports/dateguess.py b/sandbox/grist/imports/dateguess.py index dcc13b56..5b9980ff 100644 --- a/sandbox/grist/imports/dateguess.py +++ b/sandbox/grist/imports/dateguess.py @@ -420,6 +420,12 @@ def guess(date): >>> guess('12/12/12') set(['%y/%m/%d', '%d/%m/%y', '%m/%d/%y', '%y/%d/%m']) """ + # Don't attempt to parse strings that are so long as to be certainly non-dates. Somewhat long + # strings could be dates (like "Wednesday, September 16, 2020 A.D. 08:47:02.2667911 AM -06:00", + # and who knows what other languages do). A limit is important also because the current approach + # can run into "maximum recursion depth exceeded" on a very long string. + if len(date) > 150: + return set() tokens = _tokenize_by_character_class(date) _analyze_tokens(tokens) return _generate_all_permutations(tuple(tokens)) diff --git a/sandbox/grist/imports/fixtures/test_long_cell.csv b/sandbox/grist/imports/fixtures/test_long_cell.csv new file mode 100644 index 00000000..b44545e6 --- /dev/null +++ b/sandbox/grist/imports/fixtures/test_long_cell.csv @@ -0,0 +1,23 @@ +ID,LongText +17,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Neque viverra justo nec ultrices dui sapien eget mi proin. Id aliquet risus feugiat in ante. Duis convallis convallis tellus id interdum velit laoreet id. Nunc faucibus a pellentesque sit amet. Enim ut tellus elementum sagittis vitae et. Nam at lectus urna duis convallis. In iaculis nunc sed augue lacus. Aenean et tortor at risus. Ultrices gravida dictum fusce ut placerat orci nulla. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Nibh sit amet commodo nulla facilisi. Amet justo donec enim diam vulputate ut pharetra sit. Pellentesque elit eget gravida cum sociis. Sed vulputate mi sit amet mauris commodo quis. + +Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui. + +Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta. + +Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui. + +Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta. + +Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui. + +Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta. + +Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui. + +Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta. + +Cursus sit amet dictum sit amet. Nam at lectus urna duis convallis convallis. Sollicitudin nibh sit amet commodo. Sit amet tellus cras adipiscing enim eu. Egestas purus viverra accumsan in. Sit amet porttitor eget dolor morbi non. Sem viverra aliquet eget sit amet tellus cras adipiscing. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Bibendum enim facilisis gravida neque convallis. Ipsum dolor sit amet consectetur. Et ultrices neque ornare aenean. Urna neque viverra justo nec. Ac felis donec et odio pellentesque diam. Arcu risus quis varius quam quisque id diam. Id aliquet lectus proin nibh. Purus sit amet volutpat consequat mauris nunc. Quam elementum pulvinar etiam non quam lacus suspendisse. Sed adipiscing diam donec adipiscing tristique risus nec. Molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed. Diam quis enim lobortis scelerisque fermentum dui. + +Malesuada fames ac turpis egestas sed tempus urna et. In aliquam sem fringilla ut morbi tincidunt augue interdum. Turpis massa tincidunt dui ut ornare lectus sit amet est. Rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Tincidunt ornare massa eget egestas purus viverra accumsan. Egestas fringilla phasellus faucibus scelerisque. Lectus mauris ultrices eros in cursus turpis massa. Vulputate eu scelerisque felis imperdiet proin fermentum leo. Tristique senectus et netus et malesuada. Nec nam aliquam sem et tortor consequat id porta. +" diff --git a/sandbox/grist/imports/test_import_csv.py b/sandbox/grist/imports/test_import_csv.py index 4424383f..025fff43 100644 --- a/sandbox/grist/imports/test_import_csv.py +++ b/sandbox/grist/imports/test_import_csv.py @@ -328,6 +328,14 @@ class TestImportCSV(unittest.TestCase): self._check_col(parsed_file, 2, "n3", "Text", ["c1", "c2", "c3"]) self._check_col(parsed_file, 3, "", "Text", [ "d1", "", ""]) + def test_csv_with_very_long_cell(self): + parsed_file = import_csv.parse_file(_get_fixture('test_long_cell.csv'), parse_options='') + sheet = parsed_file[1][0] + long_cell = sheet["table_data"][1][0] + self.assertEqual(len(long_cell), 8058) + self._check_col(sheet, 0, "ID", "Int", [17]) + self._check_col(sheet, 1, "LongText", "Text", [long_cell]) + if __name__ == '__main__': unittest.main()