Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/isodate/isostrf.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
comparison
equal
deleted
inserted
replaced
| 4:79f47841a781 | 5:9b1c78e6ba9c |
|---|---|
| 1 ############################################################################## | |
| 2 # Copyright 2009, Gerhard Weis | |
| 3 # All rights reserved. | |
| 4 # | |
| 5 # Redistribution and use in source and binary forms, with or without | |
| 6 # modification, are permitted provided that the following conditions are met: | |
| 7 # | |
| 8 # * Redistributions of source code must retain the above copyright notice, | |
| 9 # this list of conditions and the following disclaimer. | |
| 10 # * Redistributions in binary form must reproduce the above copyright notice, | |
| 11 # this list of conditions and the following disclaimer in the documentation | |
| 12 # and/or other materials provided with the distribution. | |
| 13 # * Neither the name of the authors nor the names of its contributors | |
| 14 # may be used to endorse or promote products derived from this software | |
| 15 # without specific prior written permission. | |
| 16 # | |
| 17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 18 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 20 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | |
| 21 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| 22 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| 23 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| 24 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| 25 # CONTRACT, STRICT LIABILITY, OR TORT | |
| 26 ############################################################################## | |
| 27 """ | |
| 28 This module provides an alternative strftime method. | |
| 29 | |
| 30 The strftime method in this module allows only a subset of Python's strftime | |
| 31 format codes, plus a few additional. It supports the full range of date values | |
| 32 possible with standard Python date/time objects. Furthermore there are several | |
| 33 pr-defined format strings in this module to make ease producing of ISO 8601 | |
| 34 conforming strings. | |
| 35 """ | |
| 36 import re | |
| 37 from datetime import date, timedelta | |
| 38 | |
| 39 from isodate.duration import Duration | |
| 40 from isodate.isotzinfo import tz_isoformat | |
| 41 | |
| 42 # Date specific format strings | |
| 43 DATE_BAS_COMPLETE = '%Y%m%d' | |
| 44 DATE_EXT_COMPLETE = '%Y-%m-%d' | |
| 45 DATE_BAS_WEEK_COMPLETE = '%YW%W%w' | |
| 46 DATE_EXT_WEEK_COMPLETE = '%Y-W%W-%w' | |
| 47 DATE_BAS_ORD_COMPLETE = '%Y%j' | |
| 48 DATE_EXT_ORD_COMPLETE = '%Y-%j' | |
| 49 DATE_BAS_WEEK = '%YW%W' | |
| 50 DATE_EXT_WEEK = '%Y-W%W' | |
| 51 DATE_BAS_MONTH = '%Y%m' | |
| 52 DATE_EXT_MONTH = '%Y-%m' | |
| 53 DATE_YEAR = '%Y' | |
| 54 DATE_CENTURY = '%C' | |
| 55 | |
| 56 # Time specific format strings | |
| 57 TIME_BAS_COMPLETE = '%H%M%S' | |
| 58 TIME_EXT_COMPLETE = '%H:%M:%S' | |
| 59 TIME_BAS_MINUTE = '%H%M' | |
| 60 TIME_EXT_MINUTE = '%H:%M' | |
| 61 TIME_HOUR = '%H' | |
| 62 | |
| 63 # Time zone formats | |
| 64 TZ_BAS = '%z' | |
| 65 TZ_EXT = '%Z' | |
| 66 TZ_HOUR = '%h' | |
| 67 | |
| 68 # DateTime formats | |
| 69 DT_EXT_COMPLETE = DATE_EXT_COMPLETE + 'T' + TIME_EXT_COMPLETE + TZ_EXT | |
| 70 DT_BAS_COMPLETE = DATE_BAS_COMPLETE + 'T' + TIME_BAS_COMPLETE + TZ_BAS | |
| 71 DT_EXT_ORD_COMPLETE = DATE_EXT_ORD_COMPLETE + 'T' + TIME_EXT_COMPLETE + TZ_EXT | |
| 72 DT_BAS_ORD_COMPLETE = DATE_BAS_ORD_COMPLETE + 'T' + TIME_BAS_COMPLETE + TZ_BAS | |
| 73 DT_EXT_WEEK_COMPLETE = (DATE_EXT_WEEK_COMPLETE + 'T' + | |
| 74 TIME_EXT_COMPLETE + TZ_EXT) | |
| 75 DT_BAS_WEEK_COMPLETE = (DATE_BAS_WEEK_COMPLETE + 'T' + | |
| 76 TIME_BAS_COMPLETE + TZ_BAS) | |
| 77 | |
| 78 # Duration formts | |
| 79 D_DEFAULT = 'P%P' | |
| 80 D_WEEK = 'P%p' | |
| 81 D_ALT_EXT = 'P' + DATE_EXT_COMPLETE + 'T' + TIME_EXT_COMPLETE | |
| 82 D_ALT_BAS = 'P' + DATE_BAS_COMPLETE + 'T' + TIME_BAS_COMPLETE | |
| 83 D_ALT_EXT_ORD = 'P' + DATE_EXT_ORD_COMPLETE + 'T' + TIME_EXT_COMPLETE | |
| 84 D_ALT_BAS_ORD = 'P' + DATE_BAS_ORD_COMPLETE + 'T' + TIME_BAS_COMPLETE | |
| 85 | |
| 86 STRF_DT_MAP = {'%d': lambda tdt, yds: '%02d' % tdt.day, | |
| 87 '%f': lambda tdt, yds: '%06d' % tdt.microsecond, | |
| 88 '%H': lambda tdt, yds: '%02d' % tdt.hour, | |
| 89 '%j': lambda tdt, yds: '%03d' % (tdt.toordinal() - | |
| 90 date(tdt.year, | |
| 91 1, 1).toordinal() + | |
| 92 1), | |
| 93 '%m': lambda tdt, yds: '%02d' % tdt.month, | |
| 94 '%M': lambda tdt, yds: '%02d' % tdt.minute, | |
| 95 '%S': lambda tdt, yds: '%02d' % tdt.second, | |
| 96 '%w': lambda tdt, yds: '%1d' % tdt.isoweekday(), | |
| 97 '%W': lambda tdt, yds: '%02d' % tdt.isocalendar()[1], | |
| 98 '%Y': lambda tdt, yds: (((yds != 4) and '+') or '') + | |
| 99 (('%%0%dd' % yds) % tdt.year), | |
| 100 '%C': lambda tdt, yds: (((yds != 4) and '+') or '') + | |
| 101 (('%%0%dd' % (yds - 2)) % | |
| 102 (tdt.year / 100)), | |
| 103 '%h': lambda tdt, yds: tz_isoformat(tdt, '%h'), | |
| 104 '%Z': lambda tdt, yds: tz_isoformat(tdt, '%Z'), | |
| 105 '%z': lambda tdt, yds: tz_isoformat(tdt, '%z'), | |
| 106 '%%': lambda tdt, yds: '%'} | |
| 107 | |
| 108 STRF_D_MAP = {'%d': lambda tdt, yds: '%02d' % tdt.days, | |
| 109 '%f': lambda tdt, yds: '%06d' % tdt.microseconds, | |
| 110 '%H': lambda tdt, yds: '%02d' % (tdt.seconds / 60 / 60), | |
| 111 '%m': lambda tdt, yds: '%02d' % tdt.months, | |
| 112 '%M': lambda tdt, yds: '%02d' % ((tdt.seconds / 60) % 60), | |
| 113 '%S': lambda tdt, yds: '%02d' % (tdt.seconds % 60), | |
| 114 '%W': lambda tdt, yds: '%02d' % (abs(tdt.days / 7)), | |
| 115 '%Y': lambda tdt, yds: (((yds != 4) and '+') or '') + | |
| 116 (('%%0%dd' % yds) % tdt.years), | |
| 117 '%C': lambda tdt, yds: (((yds != 4) and '+') or '') + | |
| 118 (('%%0%dd' % (yds - 2)) % | |
| 119 (tdt.years / 100)), | |
| 120 '%%': lambda tdt, yds: '%'} | |
| 121 | |
| 122 | |
| 123 def _strfduration(tdt, format, yeardigits=4): | |
| 124 ''' | |
| 125 this is the work method for timedelta and Duration instances. | |
| 126 | |
| 127 see strftime for more details. | |
| 128 ''' | |
| 129 def repl(match): | |
| 130 ''' | |
| 131 lookup format command and return corresponding replacement. | |
| 132 ''' | |
| 133 if match.group(0) in STRF_D_MAP: | |
| 134 return STRF_D_MAP[match.group(0)](tdt, yeardigits) | |
| 135 elif match.group(0) == '%P': | |
| 136 ret = [] | |
| 137 if isinstance(tdt, Duration): | |
| 138 if tdt.years: | |
| 139 ret.append('%sY' % abs(tdt.years)) | |
| 140 if tdt.months: | |
| 141 ret.append('%sM' % abs(tdt.months)) | |
| 142 usecs = abs((tdt.days * 24 * 60 * 60 + tdt.seconds) * 1000000 + | |
| 143 tdt.microseconds) | |
| 144 seconds, usecs = divmod(usecs, 1000000) | |
| 145 minutes, seconds = divmod(seconds, 60) | |
| 146 hours, minutes = divmod(minutes, 60) | |
| 147 days, hours = divmod(hours, 24) | |
| 148 if days: | |
| 149 ret.append('%sD' % days) | |
| 150 if hours or minutes or seconds or usecs: | |
| 151 ret.append('T') | |
| 152 if hours: | |
| 153 ret.append('%sH' % hours) | |
| 154 if minutes: | |
| 155 ret.append('%sM' % minutes) | |
| 156 if seconds or usecs: | |
| 157 if usecs: | |
| 158 ret.append(("%d.%06d" % (seconds, usecs)).rstrip('0')) | |
| 159 else: | |
| 160 ret.append("%d" % seconds) | |
| 161 ret.append('S') | |
| 162 # at least one component has to be there. | |
| 163 return ret and ''.join(ret) or '0D' | |
| 164 elif match.group(0) == '%p': | |
| 165 return str(abs(tdt.days // 7)) + 'W' | |
| 166 return match.group(0) | |
| 167 return re.sub('%d|%f|%H|%m|%M|%S|%W|%Y|%C|%%|%P|%p', repl, | |
| 168 format) | |
| 169 | |
| 170 | |
| 171 def _strfdt(tdt, format, yeardigits=4): | |
| 172 ''' | |
| 173 this is the work method for time and date instances. | |
| 174 | |
| 175 see strftime for more details. | |
| 176 ''' | |
| 177 def repl(match): | |
| 178 ''' | |
| 179 lookup format command and return corresponding replacement. | |
| 180 ''' | |
| 181 if match.group(0) in STRF_DT_MAP: | |
| 182 return STRF_DT_MAP[match.group(0)](tdt, yeardigits) | |
| 183 return match.group(0) | |
| 184 return re.sub('%d|%f|%H|%j|%m|%M|%S|%w|%W|%Y|%C|%z|%Z|%h|%%', repl, | |
| 185 format) | |
| 186 | |
| 187 | |
| 188 def strftime(tdt, format, yeardigits=4): | |
| 189 '''Directive Meaning Notes | |
| 190 %d Day of the month as a decimal number [01,31]. | |
| 191 %f Microsecond as a decimal number [0,999999], zero-padded | |
| 192 on the left (1) | |
| 193 %H Hour (24-hour clock) as a decimal number [00,23]. | |
| 194 %j Day of the year as a decimal number [001,366]. | |
| 195 %m Month as a decimal number [01,12]. | |
| 196 %M Minute as a decimal number [00,59]. | |
| 197 %S Second as a decimal number [00,61]. (3) | |
| 198 %w Weekday as a decimal number [0(Monday),6]. | |
| 199 %W Week number of the year (Monday as the first day of the week) | |
| 200 as a decimal number [00,53]. All days in a new year preceding the | |
| 201 first Monday are considered to be in week 0. (4) | |
| 202 %Y Year with century as a decimal number. [0000,9999] | |
| 203 %C Century as a decimal number. [00,99] | |
| 204 %z UTC offset in the form +HHMM or -HHMM (empty string if the | |
| 205 object is naive). (5) | |
| 206 %Z Time zone name (empty string if the object is naive). | |
| 207 %P ISO8601 duration format. | |
| 208 %p ISO8601 duration format in weeks. | |
| 209 %% A literal '%' character. | |
| 210 | |
| 211 ''' | |
| 212 if isinstance(tdt, (timedelta, Duration)): | |
| 213 return _strfduration(tdt, format, yeardigits) | |
| 214 return _strfdt(tdt, format, yeardigits) |
