diff --git a/lib/assets/Lib/time.py b/lib/assets/Lib/time.py new file mode 100644 --- /dev/null +++ b/lib/assets/Lib/time.py @@ -0,0 +1,383 @@ +from browser import window +import javascript + +# use Javascript Date constructor +date = javascript.JSConstructor(window.Date) + +#daylight = 0 # fix me.. returns Non zero if DST timezone is defined + +############################################## +# Added to pass some tests +# Are there timezone always in the browser? +# I'm assuming we don't have always this info +_STRUCT_TM_ITEMS = 9 +############################################## + + +############################################## +## Helper functions +def _get_day_of_year(arg): + """ + Get the day position in the year starting from 1 + + Parameters + ---------- + arg : tuple + + Returns + ------- + int with the correct day of the year starting from 1 + """ + ml = [31,28,31,30,31,30,31,31,30,31,30,31] + if arg[0]%4==0: + ml[1] += 1 + i=1 + yday=0 + while i mm > 13: raise ValueError("month out of range") + + dd = t[2] + if dd == 0: dd = 1 + if -1 > dd > 32: raise ValueError("day of month out of range") + + hh = t[3] + if -1 > hh > 24: raise ValueError("hour out of range") + + minu = t[4] + if -1 > minu > 60: raise ValueError("minute out of range") + + ss = t[5] + if -1 > ss > 62: raise ValueError("seconds out of range") + + wd = t[6] % 7 + if wd < -2: raise ValueError("day of week out of range") + + dy = t[7] + if dy == 0: dy = 1 + if -1 > dy > 367: raise ValueError("day of year out of range") + + return t[0], mm, dd, hh, minu, ss, wd, dy, t[-1] + + +def _is_dst(secs = None): + "Check if data has daylight saving time" + d = date() + if secs is not None: + d = date(secs*1000) + # calculate if we are in daylight savings time or not. + # borrowed from http://stackoverflow.com/questions/11887934/check-if-daylight-saving-time-is-in-effect-and-if-it-is-for-how-many-hours + jan = date(d.getFullYear(), 0, 1) + jul = date(d.getFullYear(), 6, 1) + dst = int(d.getTimezoneOffset() < max(abs(jan.getTimezoneOffset()), abs(jul.getTimezoneOffset()))) + return dst + +def _get_tzname(): + "check if timezone is available, if not return a tuple of empty str" + d = date() + d = d.toTimeString() + try: + d = d.split('(')[1].split(')')[0] + return (d, 'NotAvailable') + except: + return ('', '') + +def _set_altzone(): + d = date() + jan = date(d.getFullYear(), 0, 1) + jul = date(d.getFullYear(), 6, 1) + result = timezone - (jan.getTimezoneOffset() - jul.getTimezoneOffset()) * 60 + return result + +def _check_input(t): + if t and isinstance(t, struct_time) and len(t.args) == 9: + t = t.args + elif t and isinstance(t, tuple) and len(t) == 9: + t = t + elif t and isinstance(t, struct_time) and len(t.args) != 9: + raise TypeError("function takes exactly 9 arguments ({} given)".format(len(t.args))) + elif t and isinstance(t, tuple) and len(t) != 9: + raise TypeError("function takes exactly 9 arguments ({} given)".format(len(t.args))) + elif t and not isinstance(t, (tuple, struct_time)): + raise TypeError("Tuple or struct_time argument required") + else: + t = localtime().args + return t +## end of helper functions +############################################## + +############################################## +## Values depending the timezone of the browser. +daylight = _is_dst() +timezone = date().getTimezoneOffset() * 60 +tzname = _get_tzname() +altzone = _set_altzone() if daylight else timezone +############################################## + +def asctime(t = None): + weekdays = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", + 4: "Fri", 5: "Sat", 6: "Sun"} + months = {1:'Jan',2:'Feb',3:'Mar',4:'Apr',5:'May',6:'Jun', + 7:'Jul',8:'Aug',9:'Sep',10:'Oct',11:'Nov',12:'Dec'} + + t = _check_input(t) + t = _check_struct_time(t) + + result = "%s %s %2d %02d:%02d:%02d %d" % ( + weekdays[t[6]], months[t[1]], t[2], t[3], t[4], t[5], t[0]) + return result + +def ctime(timestamp=None): + return asctime(localtime(timestamp)) + +def gmtime(secs = None): + d = date() + if secs is not None: + d = date(secs*1000) + wday = d.getUTCDay() - 1 if d.getUTCDay() - 1 >= 0 else 6 + tmp = struct_time([d.getUTCFullYear(), + d.getUTCMonth()+1, d.getUTCDate(), + d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), + wday, 0, 0]) + tmp.args[7] = _get_day_of_year(tmp.args) + return tmp + +def localtime(secs = None): + d = date() + if secs is not None: + d = date(secs * 1000) + dst = _is_dst(secs) + wday = d.getDay() - 1 if d.getDay() - 1 >= 0 else 6 + tmp = struct_time([d.getFullYear(), + d.getMonth()+1, d.getDate(), + d.getHours(), d.getMinutes(), d.getSeconds(), + wday, 0, dst]) + tmp.args[7] = _get_day_of_year(tmp.args) + return tmp + +def mktime(t): + if isinstance(t, struct_time): + d1 = date(t.tm_year, t.tm_mon - 1, t.tm_mday, + t.tm_hour, t.tm_min, t.tm_sec, 0).getTime() + elif isinstance(t, tuple): + d1 = date(t[0], t[1] - 1, t[2], t[3], t[4], t[5], 0).getTime() + else: + raise ValueError("Tuple or struct_time argument required") + d2 = date(0).getTime() + return (d1 - d2) / 1000. + +def monotonic(): + return javascript.JSObject(window.performance.now)()/1000. + +def perf_counter(): + return float(date().getTime()/1000.0) + +def time(): + return float(date().getTime()/1000) + +def sleep(secs): + """Javascript can't block execution for a given time, expect by an + infinite loop that freezes the browser. It's better to raise an + exception""" + #start = date().getTime() + #while date().getTime() - start < secs * 1000.: + # pass + raise NotImplementedError("Blocking functions like time.sleep() are not " + "supported in the browser. Use functions in module browser.timer " + "instead.") + +def strftime(_format,t = None): + + def ns(t,nb): + # left padding with 0 + res = str(t) + while len(res)