Extract parsetimezone from util.py to utils/dateutil.py
Details
Details
Diff Detail
Diff Detail
- Repository
- rHG Mercurial
- Lint
- Lint Skipped 
- Unit
- Unit Tests Skipped 
| lothiraldan | 
| hg-reviewers | 
Extract parsetimezone from util.py to utils/dateutil.py
| Lint Skipped | 
| Unit Tests Skipped | 
| Path | Packages | |||
|---|---|---|---|---|
| M | mercurial/templater.py (2 lines) | |||
| M | mercurial/util.py (36 lines) | |||
| M | mercurial/utils/dateutil.py (28 lines) | 
| Status | Author | Revision | |
|---|---|---|---|
| Abandoned | lothiraldan | ||
| Abandoned | durin42 | D2056 util: extract matchdate  | |
| Abandoned | durin42 | D2055 util: extract parsedate  | |
| Abandoned | durin42 | D2054 util: extract strdate  | |
| Abandoned | durin42 | ||
| Abandoned | durin42 | D2052 util: extract shortdate  | |
| Abandoned | durin42 | D2051 util: extract datestr  | |
| Abandoned | durin42 | D2050 util: extract makedate  | |
| Abandoned | durin42 | ||
| Abandoned | lothiraldan | ||
| Abandoned | durin42 | 
| date = util.parsedate(date) | date = util.parsedate(date) | ||||
| except AttributeError: # not str nor date tuple | except AttributeError: # not str nor date tuple | ||||
| # i18n: "localdate" is a keyword | # i18n: "localdate" is a keyword | ||||
| raise error.ParseError(_("localdate expects a date information")) | raise error.ParseError(_("localdate expects a date information")) | ||||
| if len(args) >= 2: | if len(args) >= 2: | ||||
| tzoffset = None | tzoffset = None | ||||
| tz = evalfuncarg(context, mapping, args[1]) | tz = evalfuncarg(context, mapping, args[1]) | ||||
| if isinstance(tz, str): | if isinstance(tz, str): | ||||
| tzoffset, remainder = util.parsetimezone(tz) | tzoffset, remainder = dateutil.parsetimezone(tz) | ||||
| if remainder: | if remainder: | ||||
| tzoffset = None | tzoffset = None | ||||
| if tzoffset is None: | if tzoffset is None: | ||||
| try: | try: | ||||
| tzoffset = int(tz) | tzoffset = int(tz) | ||||
| except (TypeError, ValueError): | except (TypeError, ValueError): | ||||
| # i18n: "localdate" is a keyword | # i18n: "localdate" is a keyword | ||||
| raise error.ParseError(_("localdate expects a timezone")) | raise error.ParseError(_("localdate expects a timezone")) | ||||
| nbytes = min(limit, size) | nbytes = min(limit, size) | ||||
| s = nbytes and f.read(nbytes) | s = nbytes and f.read(nbytes) | ||||
| if not s: | if not s: | ||||
| break | break | ||||
| if limit: | if limit: | ||||
| limit -= len(s) | limit -= len(s) | ||||
| yield s | yield s | ||||
| def parsetimezone(s): | |||||
| """find a trailing timezone, if any, in string, and return a | |||||
| (offset, remainder) pair""" | |||||
| if s.endswith("GMT") or s.endswith("UTC"): | |||||
| return 0, s[:-3].rstrip() | |||||
| # Unix-style timezones [+-]hhmm | |||||
| if len(s) >= 5 and s[-5] in "+-" and s[-4:].isdigit(): | |||||
| sign = (s[-5] == "+") and 1 or -1 | |||||
| hours = int(s[-4:-2]) | |||||
| minutes = int(s[-2:]) | |||||
| return -sign * (hours * 60 + minutes) * 60, s[:-5].rstrip() | |||||
| # ISO8601 trailing Z | |||||
| if s.endswith("Z") and s[-2:-1].isdigit(): | |||||
| return 0, s[:-1] | |||||
| # ISO8601-style [+-]hh:mm | |||||
| if (len(s) >= 6 and s[-6] in "+-" and s[-3] == ":" and | |||||
| s[-5:-3].isdigit() and s[-2:].isdigit()): | |||||
| sign = (s[-6] == "+") and 1 or -1 | |||||
| hours = int(s[-5:-3]) | |||||
| minutes = int(s[-2:]) | |||||
| return -sign * (hours * 60 + minutes) * 60, s[:-6] | |||||
| return None, s | |||||
| def strdate(string, format, defaults=None): | def strdate(string, format, defaults=None): | ||||
| """parse a localized time string and return a (unixtime, offset) tuple. | """parse a localized time string and return a (unixtime, offset) tuple. | ||||
| if the string cannot be parsed, ValueError is raised.""" | if the string cannot be parsed, ValueError is raised.""" | ||||
| if defaults is None: | if defaults is None: | ||||
| defaults = {} | defaults = {} | ||||
| # NOTE: unixtime = localunixtime + offset | # NOTE: unixtime = localunixtime + offset | ||||
| offset, date = parsetimezone(string) | offset, date = dateutil.parsetimezone(string) | ||||
| # add missing elements from defaults | # add missing elements from defaults | ||||
| usenow = False # default to using biased defaults | usenow = False # default to using biased defaults | ||||
| for part in ("S", "M", "HI", "d", "mb", "yY"): # decreasing specificity | for part in ("S", "M", "HI", "d", "mb", "yY"): # decreasing specificity | ||||
| part = pycompat.bytestr(part) | part = pycompat.bytestr(part) | ||||
| found = [True for p in part if ("%"+p) in format] | found = [True for p in part if ("%"+p) in format] | ||||
| if not found: | if not found: | ||||
| date += "@" + defaults[part][usenow] | date += "@" + defaults[part][usenow] | ||||
| return dateutil.datestr(*args, **kwargs) | return dateutil.datestr(*args, **kwargs) | ||||
| def shortdate(*args, **kwargs): | def shortdate(*args, **kwargs): | ||||
| msg = ("'util.shortdate' is deprecated, " | msg = ("'util.shortdate' is deprecated, " | ||||
| "use 'utils.dateutil.shortdate'") | "use 'utils.dateutil.shortdate'") | ||||
| nouideprecwarn(msg, "4.6") | nouideprecwarn(msg, "4.6") | ||||
| return dateutil.shortdate(*args, **kwargs) | return dateutil.shortdate(*args, **kwargs) | ||||
| def parsetimezone(*args, **kwargs): | |||||
| msg = ("'util.parsetimezone' is deprecated, " | |||||
| "use 'utils.dateutil.parsetimezone'") | |||||
| nouideprecwarn(msg, "4.6") | |||||
| return dateutil.parsetimezone(*args, **kwargs) | |||||
| t = datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=d) | t = datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=d) | ||||
| s = encoding.strtolocal(t.strftime(encoding.strfromlocal(format))) | s = encoding.strtolocal(t.strftime(encoding.strfromlocal(format))) | ||||
| return s | return s | ||||
| def shortdate(date=None): | def shortdate(date=None): | ||||
| """turn (timestamp, tzoff) tuple into iso 8631 date.""" | """turn (timestamp, tzoff) tuple into iso 8631 date.""" | ||||
| return datestr(date, format='%Y-%m-%d') | return datestr(date, format='%Y-%m-%d') | ||||
| def parsetimezone(s): | |||||
| """find a trailing timezone, if any, in string, and return a | |||||
| (offset, remainder) pair""" | |||||
| if s.endswith("GMT") or s.endswith("UTC"): | |||||
| return 0, s[:-3].rstrip() | |||||
| # Unix-style timezones [+-]hhmm | |||||
| if len(s) >= 5 and s[-5] in "+-" and s[-4:].isdigit(): | |||||
| sign = (s[-5] == "+") and 1 or -1 | |||||
| hours = int(s[-4:-2]) | |||||
| minutes = int(s[-2:]) | |||||
| return -sign * (hours * 60 + minutes) * 60, s[:-5].rstrip() | |||||
| # ISO8601 trailing Z | |||||
| if s.endswith("Z") and s[-2:-1].isdigit(): | |||||
| return 0, s[:-1] | |||||
| # ISO8601-style [+-]hh:mm | |||||
| if (len(s) >= 6 and s[-6] in "+-" and s[-3] == ":" and | |||||
| s[-5:-3].isdigit() and s[-2:].isdigit()): | |||||
| sign = (s[-6] == "+") and 1 or -1 | |||||
| hours = int(s[-5:-3]) | |||||
| minutes = int(s[-2:]) | |||||
| return -sign * (hours * 60 + minutes) * 60, s[:-6] | |||||
| return None, s | |||||