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 | |||||