Changeset 1573:663b036bb8f7


Ignore:
Timestamp:
Oct 4, 2014, 5:34:46 PM (7 years ago)
Author:
Stefan Schwarzer <sschwarzer@…>
Branch:
default
Message:
Use more specific error handling when parsing datetimes.
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • ftputil/stat.py

    r1572 r1573  
    150150        return st_mode
    151151
     152    def _as_int(self, int_string, int_description):
     153        """
     154        Return `int_string` converted to an integer.
     155
     156        If it can't be converted, raise a `ParserError`, using
     157        `int_description` in the error message. For example, if the
     158        integer value is a day, pass "day" for `int_description`.
     159        """
     160        try:
     161            return int(int_string)
     162        except ValueError:
     163            raise ftputil.error.ParserError("non-integer {0} value {1!r}".
     164                                            format(int_description,
     165                                                   int_string))
     166
    152167    def _mktime(self, mktime_tuple):
    153168        """
     
    219234            raise ftputil.error.ParserError("invalid month abbreviation {0!r}".
    220235                                            format(month_abbreviation))
    221         try:
    222             day = int(day)
    223         except ValueError:
    224             raise ftputil.error.ParserError("non-integer day value {0!r}".
    225                                             format(day))
     236        day = self._as_int(day, "day")
    226237        if ":" not in year_or_time:
    227238            # `year_or_time` is really a year.
    228             year, hour, minute = int(year_or_time), 0, 0
     239            year, hour, minute = self._as_int(year_or_time, "year"), 0, 0
    229240            st_mtime = self._mktime( (year, month, day,
    230241                                      hour, minute, 0, 0, 0, -1) )
     
    234245            # `year_or_time` is a time hh:mm.
    235246            hour, minute = year_or_time.split(":")
    236             year, hour, minute = None, int(hour), int(minute)
     247            year, hour, minute = (
     248              None, self._as_int(hour, "hour"), self._as_int(minute, "minute"))
    237249            # Try the current year
    238250            year = time.localtime()[0]
     
    292304        # support for `with_precision` for a derived class, please
    293305        # send a mail (see ftputil.txt/html).
    294         try:
    295             month, day, year = [int(part) for part in date.split("-")]
    296             if year >= 1000:
    297                 # We have a four-digit year, so no need for heuristics.
    298                 pass
    299             elif year >= 70:
    300                 year = 1900 + year
    301             else:
    302                 year = 2000 + year
     306        month, day, year = [self._as_int(part, "year/month/day")
     307                            for part in date.split("-")]
     308        if year >= 1000:
     309            # We have a four-digit year, so no need for heuristics.
     310            pass
     311        elif year >= 70:
     312            year = 1900 + year
     313        else:
     314            year = 2000 + year
     315        try:
    303316            hour, minute, am_pm = time_[0:2], time_[3:5], time_[5]
    304             hour, minute = int(hour), int(minute)
    305         except (ValueError, IndexError):
     317        except IndexError:
    306318            raise ftputil.error.ParserError("invalid time string '{0}'".
    307319                                            format(time_))
     320        hour, minute = (
     321          self._as_int(hour, "hour"), self._as_int(minute, "minute"))
    308322        if hour == 12 and am_pm == "A":
    309323            hour = 0
    310324        if hour != 12 and am_pm == "P":
    311325            hour += 12
    312         st_mtime = time.mktime( (year, month, day,
    313                                  hour, minute, 0, 0, 0, -1) )
     326        st_mtime = self._mktime( (year, month, day,
     327                                  hour, minute, 0, 0, 0, -1) )
    314328        return st_mtime
    315329
  • test/test_stat.py

    r1572 r1573  
    125125          # Invalid month abbreviation
    126126          "drwxr-sr-x   2 45854    200           512 Max  4  2000 chemeng",
    127           # Day value is not an integer
     127          # Year value isn't an integer
     128          "drwxr-sr-x   2 45854    200           512 May  4  abcd chemeng",
     129          # Day value isn't an integer
    128130          "drwxr-sr-x   2 45854    200           512 May ab  2000 chemeng",
     131          # Hour value isn't an integer
     132          "-rw-r--r--   1 45854    200          4604 Dec 19 ab:11 index.html",
     133          # Minute value isn't an integer
     134          "-rw-r--r--   1 45854    200          4604 Dec 19 23:ab index.html",
    129135          # Day value too large
    130136          "drwxr-sr-x   2 45854    200           512 May 32  2000 chemeng",
     
    238244          # "AM"/"PM" missing
    239245          "07-17-00  02:08             12266720 test.exe",
     246          # Year not an int
     247          "07-17-ab  02:08AM           12266720 test.exe",
     248          # Month not an int
     249          "ab-17-00  02:08AM           12266720 test.exe",
     250          # Day not an int
     251          "07-ab-00  02:08AM           12266720 test.exe",
     252          # Hour not an int
     253          "07-17-00  ab:08AM           12266720 test.exe",
    240254          # Invalid size value
    241255          "07-17-00  02:08AM           1226672x test.exe"
Note: See TracChangeset for help on using the changeset viewer.