#==============================================================================# # paratime.py # #==============================================================================# """Module for paratessares time conversions. This module provides several functions that covert earth seconds into paratessares time.""" ################################################################################ __version__ = "$Revision: 3 $" __date__ = "14 January 2009" __author__ = "Stephen Chappell <Noctis.Skytower@gmail.com>" __credits__ = """\ S. Schaub, for teaching me about interpreted languages. D. Wooster, for teaching me about simulations and C#. B. Gates, for allowing timers to be included with C#.""" ################################################################################ import time as _time import _thread import sys as _sys ################################################################################ EPOCH_DELTA = 946684800 MICREV_IN_DAY = 1000000 MILREV_IN_DAY = 1000 SECOND_IN_DAY = 86400 DAY_IN_WEEK = 7 WEEK_IN_MONTH = 4 MONTH_IN_SEASON = 3 SEASON_IN_YEAR = 4 SECOND_IN_WEEK = SECOND_IN_DAY * DAY_IN_WEEK SECOND_IN_MONTH = SECOND_IN_WEEK * WEEK_IN_MONTH SECOND_IN_SEASON = SECOND_IN_MONTH * MONTH_IN_SEASON SECOND_IN_YEAR = SECOND_IN_SEASON * SEASON_IN_YEAR ################################################################################ def seconds(): "Return seconds since the epoch." return _time.time() - EPOCH_DELTA def micrev(seconds): "Convert from seconds to micrev." x = seconds % SECOND_IN_DAY * MICREV_IN_DAY / SECOND_IN_DAY % MILREV_IN_DAY return int(x) def milrev(seconds): "Convert from seconds to milrev." x = seconds % SECOND_IN_DAY * MILREV_IN_DAY / SECOND_IN_DAY return int(x) def day(seconds): "Convert from seconds to days." x = seconds / SECOND_IN_DAY % DAY_IN_WEEK return int(x) def week(seconds): "Convert from seconds to weeks." x = seconds / SECOND_IN_WEEK % WEEK_IN_MONTH return int(x) def month(seconds): "Convert from seconds to months." x = seconds / SECOND_IN_MONTH % MONTH_IN_SEASON return int(x) def season(seconds): "Convert from seconds to seasons." x = seconds / SECOND_IN_SEASON % SEASON_IN_YEAR return int(x) def year(seconds): "Convert from seconds to years." x = seconds / SECOND_IN_YEAR return int(x) ################################################################################ UNITS = year, season, month, week, day, milrev, micrev def text(seconds, spec='{0}.{1}.{2}.{3}.{4}.{5:03}.{6:03}', unit=UNITS): "Convert from seconds to text." return spec.format(*[func(seconds) for func in unit]) ################################################################################ class Micrev_Timer: "Micrev_Timer(function, *args, **kwargs) -> Micrev_Timer" def __init__(self, function, *args, **kwargs): "Initialize the Micrev_Timer object." self.__function = function self.__args = args self.__kwargs = kwargs self.__thread = False self.__lock = _thread.allocate_lock() def start(self): "Start the Micrev_Timer object." with self.__lock: self.__active = True if not self.__thread: self.__thread = True _thread.start_new_thread(self.__run, ()) def stop(self): "Stop the Micrev_Timer object." with self.__lock: self.__active = False def __run(self): "Private class method." start = _time.clock() timer = 0 while True: timer += 1 sleep = start + timer * 0.0864 - _time.clock() assert sleep >= 0, 'Function Was Too Slow' _time.sleep(sleep) with self.__lock: if not self.__active: self.__thread = False break self.__function(*self.__args, **self.__kwargs) ################################################################################ class Quantum_Timer: "Quantum_Timer(function, *args, **kwargs) -> Quantum_Timer" def __init__(self, function, *args, **kwargs): "Initialize the Quantum_Timer object." self.__function = function self.__args = args self.__kwargs = kwargs self.__thread = False self.__lock = _thread.allocate_lock() def start(self): "Start the Quantum_Timer object." with self.__lock: self.__active = True if not self.__thread: self.__thread = True _thread.start_new_thread(self.__run, ()) def stop(self): "Stop the Quantum_Timer object." with self.__lock: self.__active = False def __run(self): "Private class method." while True: time = _time.clock() plus = time + 0.0864 over = plus % 0.0864 diff = plus - time - over _time.sleep(diff) with self.__lock: if not self.__active: self.__thread = False break self.__function(*self.__args, **self.__kwargs) ################################################################################ if __name__ == '__main__': _sys.stdout.write('Content-Type: text/plain\n\n') _sys.stdout.write(open(_sys.argv[0]).read()) #==============================================================================# # test_paratime.py # #==============================================================================# import paratime import time import datetime import inspect import unittest from test import support class ConstantTest(unittest.TestCase): def test_existance(self): # See if all required constants exist and do not equal zero. constants = ['EPOCH_DELTA', 'MICREV_IN_DAY', 'MILREV_IN_DAY', 'SECOND_IN_DAY', 'DAY_IN_WEEK', 'WEEK_IN_MONTH', 'MONTH_IN_SEASON', 'SEASON_IN_YEAR', 'SECOND_IN_WEEK', 'SECOND_IN_MONTH', 'SECOND_IN_SEASON', 'SECOND_IN_YEAR'] for name in constants: self.assert_(hasattr(paratime, name), 'AttributeError: ' + name) CONSTANT = getattr(paratime, name) self.assert_(isinstance(CONSTANT, int), 'TypeError: ' + name) self.assert_(CONSTANT != 0, 'ValueError: ' + name) def test_epoch(self): # Ensure that EPOCH_DELTA is correct for this system. delta = paratime.EPOCH_DELTA epoch = time.gmtime(0)[:3] edate = datetime.date(*epoch) pdate = datetime.date(2000, 1, 1) days = (pdate - edate).days seconds = days * 24 * 60 * 60 self.assert_(delta == seconds, 'ValueError: EPOCH_DELTA') def test_division(self): # Check that the daily divisions have not changed. micrev = paratime.MICREV_IN_DAY milrev = paratime.MILREV_IN_DAY second = paratime.SECOND_IN_DAY self.assert_(micrev == 10 ** 6, 'ValueError: MICREV_IN_DAY') self.assert_(milrev == 10 ** 3, 'ValueError: MILREV_IN_DAY') self.assert_(second == 24 * 60 * 60, 'ValueError: SECOND_IN_DAY') def test_year(self): # Use various checksums to verify the design of a year. d = paratime.DAY_IN_WEEK w = paratime.WEEK_IN_MONTH m = paratime.MONTH_IN_SEASON s = paratime.SEASON_IN_YEAR self.assert_(d ^ w ^ m ^ s == 4, 'ValueError: XOR') self.assert_(d + w + m + s == 18, 'ValueError: Addition') self.assert_(d * w * m * s == 336, 'ValueError: Multiplication') self.assert_(hash((d, w, m, s)) == 1672362005, 'ValueError: Hash') def test_second(self): # Test that the dynmaic constants were created correctly. week = paratime.SECOND_IN_WEEK month = paratime.SECOND_IN_MONTH season = paratime.SECOND_IN_SEASON year = paratime.SECOND_IN_YEAR self.assert_(week == 604800, 'ValueError: SECOND_IN_WEEK') self.assert_(month == 2419200, 'ValueError: SECOND_IN_MONTH') self.assert_(season == 7257600, 'ValueError: SECOND_IN_SEASON') self.assert_(year == 29030400, 'ValueError: SECOND_IN_YEAR') def test_unit(self): # Examine the constant UNITS for proper compostion. functions = ['year', 'season', 'month', 'week', 'day', 'milrev', 'micrev'] self.assert_(hasattr(paratime, 'UNITS'), 'AttributeError: UNITS') istuple = isinstance(getattr(paratime, 'UNITS'), tuple) self.assert_(istuple, 'TypeError: UNITS') units = tuple(getattr(paratime, name) for name in functions) self.assert_(paratime.UNITS == units, 'ValueError: UNITS') class FunctionTest(unittest.TestCase): def test_existance(self): # Make sure that all required functions exist. functions = ['seconds', 'micrev', 'milrev', 'day', 'week', 'month', 'season', 'year', 'text'] for name in functions: self.assert_(hasattr(paratime, name), 'AttributeError: ' + name) isfunction = inspect.isfunction(getattr(paratime, name)) self.assert_(isfunction, 'TypeError: ' + name) def test_zero(self): # Test that argument 0.0 always returns 0.0 from functions. functions = ['micrev', 'milrev', 'day', 'week', 'month', 'season', 'year'] for name in functions: func = getattr(paratime, name) self.assert_(func(0.0) == 0.0, 'ArithmeticError: ' + name) def test_year(self): # Find out if proper mathamatical divisions exist in a year. functions = ['day', 'week', 'month', 'season'] for name in functions: func = getattr(paratime, name) constant = 'SECOND_IN_' + name.upper() CONSTANT = getattr(paratime, constant) self.assert_(func(CONSTANT) == 1, 'ArithmeticError: ' + name) self.assert_(func(CONSTANT - 1) == 0, 'ArithmeticError: ' + name) def test_rev(self): # Check that partioning of the day is computed correctly. micrev = paratime.micrev milrev = paratime.milrev test_mic = lambda s: int(s * 1000000 / 86400 % 1000) test_mil = lambda s: int(s * 1000 / 86400 % 1000) for s in range(int(24 * 60 * 60 * 1.01)): self.assert_(micrev(s) == test_mic(s), 'ArithmeticError: micrev') self.assert_(milrev(s) == test_mil(s), 'ArithmeticError: milrev') class TextTest(unittest.TestCase): def setUp(self): # Create some variables to help with the upcoming tests. self.T = paratime.text self.S = [10344926.962133339, 94639768.804546028, 265532741.01112196, 16253695.553989811, 108469967.14143418, 268212543.20094055, 56911478.644419812, 135376331.24554729, 300908237.98332906, 63510559.911042809, 137084486.30913293, 373636131.91095936, 72101267.095945552, 140265693.15057722, 380887195.47359467, 78426890.295372367, 146538409.07728666, 404198696.61584091, 83581780.421440393, 197104443.98377159, 405806804.27733558, 85208640.256408677, 217453332.36529338, 410940507.48093152, 88576536.868952677, 232335476.22987685, 411771351.90179437, 90854227.747951403, 263271517.23457572, 412037865.73197347] def test_seconds(self): # Ensure that the default settings work properly. keys = ['0.1.1.1.0.732.950', '3.1.0.0.3.367.694', '9.0.1.3.0.295.613', '0.2.0.2.6.121.476', '3.2.2.3.2.439.434', '9.0.2.3.3.311.842', '1.3.2.2.0.697.669', '4.2.1.3.5.855.685', '10.1.1.1.3.734.235', '2.0.2.1.0.075.924', '4.2.2.2.4.625.998', '12.3.1.1.5.492.267', '2.1.2.3.1.505.406', '4.3.0.3.6.445.522', '13.0.1.1.5.416.614', '2.2.2.1.4.718.637', '5.0.0.2.2.046.401', '13.3.2.0.2.225.655', '2.3.1.2.1.381.717', '6.3.0.1.6.301.434', '13.3.2.2.6.838.012', '2.3.2.0.6.211.114', '7.1.2.3.3.820.976', '14.0.1.3.3.255.873', '3.0.0.2.3.191.398', '8.0.0.0.1.068.011', '14.0.2.0.5.872.128', '3.0.1.2.1.553.561', '9.0.0.3.2.124.042', '14.0.2.1.1.956.779'] for seconds, results in zip(self.S, keys): self.assert_(self.T(seconds) == results, 'ValueError: Default') def test_spec(self): # Check that various format specifications do not cause errors. form = ['Year = {0}', 'Season = {1}', 'Month = {2}', 'Week = {3}', 'Day = {4}', 'Milrev = {5:03}', 'Micrev = {6:03}', 'Season {1} of Year {0}', 'Month {2} of Season {1}', 'Week {3} of Month {2}', 'Day {4} of Week {3}', 'The time is {5}:{6}.', 'This is year {0}.'] keys = ['0 1 1 1 0 732 950 10 11 11 01 732:950 0', '3 1 0 0 3 367 694 13 01 00 30 367:694 3', '9 0 1 3 0 295 613 09 10 31 03 295:613 9', '0 2 0 2 6 121 476 20 02 20 62 121:476 0', '3 2 2 3 2 439 434 23 22 32 23 439:434 3', '9 0 2 3 3 311 842 09 20 32 33 311:842 9', '1 3 2 2 0 697 669 31 23 22 02 697:669 1', '4 2 1 3 5 855 685 24 12 31 53 855:685 4', '10 1 1 1 3 734 235 110 11 11 31 734:235 10', '2 0 2 1 0 075 924 02 20 12 01 75:924 2', '4 2 2 2 4 625 998 24 22 22 42 625:998 4', '12 3 1 1 5 492 267 312 13 11 51 492:267 12', '2 1 2 3 1 505 406 12 21 32 13 505:406 2', '4 3 0 3 6 445 522 34 03 30 63 445:522 4', '13 0 1 1 5 416 614 013 10 11 51 416:614 13', '2 2 2 1 4 718 637 22 22 12 41 718:637 2', '5 0 0 2 2 046 401 05 00 20 22 46:401 5', '13 3 2 0 2 225 655 313 23 02 20 225:655 13', '2 3 1 2 1 381 717 32 13 21 12 381:717 2', '6 3 0 1 6 301 434 36 03 10 61 301:434 6', '13 3 2 2 6 838 012 313 23 22 62 838:12 13', '2 3 2 0 6 211 114 32 23 02 60 211:114 2', '7 1 2 3 3 820 976 17 21 32 33 820:976 7', '14 0 1 3 3 255 873 014 10 31 33 255:873 14', '3 0 0 2 3 191 398 03 00 20 32 191:398 3', '8 0 0 0 1 068 011 08 00 00 10 68:11 8', '14 0 2 0 5 872 128 014 20 02 50 872:128 14', '3 0 1 2 1 553 561 03 10 21 12 553:561 3', '9 0 0 3 2 124 042 09 00 30 23 124:42 9', '14 0 2 1 1 956 779 014 20 12 11 956:779 14'] table = str.maketrans('', '', ' .=DMSTWYacefhiklmnorstvy') clean = lambda S: S.translate(table) for seconds, results in zip(self.S, keys): for spec, result in zip(form, results.split()): purged = clean(self.T(seconds, spec)) self.assert_(purged == result, 'ValueError: Format') def test_unit(self): # Try running through several custom unit combinations. days = lambda x: int(x / 86400) hours = lambda x: int(x / 3600) % 24 minutes = lambda x: int(x / 60) % 60 seconds = lambda x: int(x) % 60 args = [('D{0}', [days]), ('H{0}', [hours]), ('M{0}', [minutes]), ('S{0}', [seconds]), ('{0}:{1:02}:{2:02}:{3:02}', [days, hours, minutes, seconds])] keys = ['119 17 35 26 119173526', '1095 8 49 28 1095084928', '3073 7 5 41 3073070541', '188 2 54 55 188025455', '1255 10 32 47 1255103247', '3104 7 29 3 3104072903', '658 16 44 38 658164438', '1566 20 32 11 1566203211', '3482 17 37 17 3482173717', '735 1 49 19 735014919', '1586 15 1 26 1586150126', '4324 11 48 51 4324114851', '834 12 7 47 834120747', '1623 10 41 33 1623104133', '4408 9 59 55 4408095955', '907 17 14 50 907171450', '1696 1 6 49 1696010649', '4678 5 24 56 4678052456', '967 9 9 40 967090940', '2281 7 14 3 2281071403', '4696 20 6 44 4696200644', '986 5 4 0 986050400', '2516 19 42 12 2516194212', '4756 6 8 27 4756060827', '1025 4 35 36 1025043536', '2689 1 37 56 2689013756', '4765 20 55 51 4765205551', '1051 13 17 7 1051131707', '3047 2 58 37 3047025837', '4768 22 57 45 4768225745'] prefix = ['D', 'H', 'M', 'S', ''] finish = lambda S: ':'.join((S[:-6], S[-6:-4], S[-4:-2], S[-2:])) for seconds, results in zip(self.S, keys): for unit, plus, result in zip(args, prefix, results.split()): ans = self.T(seconds, *unit) key = (plus + result) if plus else finish(result) self.assert_(ans == key, 'ValueError: Functions') class TimerTest(unittest.TestCase): def test_fast(self): # Check that quick functions can be run without failing. MT = self.timer(self.increment, 0.0625) MT.start() time.sleep(0.5) MT.stop() time.sleep(0.25) self.assert_(self.fast(), 'ValueError: Count') def test_slow(self): # Verify the behavior of the timer's thread under load. MT = self.timer(self.increment, 0.125) with support.captured_output('stderr') as stderr: MT.start() time.sleep(0.5) MT.stop() time.sleep(0.25) self.assert_(self.slow(), 'ValueError: Count') self.assert_(self.test(stderr.getvalue()), 'IOError: Thread') def increment(self, seconds): # Keep track of how many times the thread runs. time.sleep(seconds) self.count += 1 class MicrevTest(TimerTest): def setUp(self): # Create variables specifically for testing Micrev_Timer. self.count = 0 self.timer = paratime.Micrev_Timer self.fast = lambda: self.count == 5 self.slow = lambda: self.count == 1 self.test = lambda S: 'Function Was Too Slow' in S class QuantumTest(TimerTest): def setUp(self): # Create variables specifically for testing Quantum_Timer. self.count = 0 self.timer = paratime.Quantum_Timer self.fast = lambda: 5 <= self.count <= 6 self.slow = lambda: self.count == 3 self.test = lambda S: len(S) == 0 def test_main(): support.run_unittest(ConstantTest, FunctionTest, TextTest, MicrevTest, QuantumTest) if __name__ == '__main__': test_main() #==============================================================================# # Clock.pyw # #==============================================================================# import tkinter import paratime def main(): root = tkinter.Tk() root.resizable(False, False) root.title('Time in Tessaressunago') time = tkinter.StringVar() text = tkinter.Label(textvariable=time, font=('helvetica', 16, 'bold')) text.grid(padx=5, pady=5) thread = paratime.Quantum_Timer(update, time) thread.start() root.mainloop() def update(time): s = paratime.seconds() t = paratime.text(s) p = 1000000000 * 1.01 ** (s / paratime.SECOND_IN_YEAR) time.set('Time = {0}\nNational = {1}'.format(t, fix(p))) def fix(number, sep=','): number = str(int(number)) string = '' while number: string = number[-1] + string number = number[:-1] if number and not (len(string) + 1) % 4: string = sep + string return string if __name__ == '__main__': main() #==============================================================================# # BACKUP 3.0.py # #==============================================================================# from getpass import getuser from paratime import seconds, text import os ############################################################################### GET = os.path.join('C:\\Documents and Settings', getuser(), 'My Documents') SET = os.path.join('G:\\BACKUP', text(seconds())) JUNK_FILE = 'Thumbs.db', 'Desktop.ini' JUNK_EXT = 'pyc', 'pyo' ############################################################################### def main(): prune_junk() prune_dirs() backup_dirs(GET, SET) show_prompt() def show_prompt(): if WARNINGS: print('====================') print('Warnings Will Follow') input('====================') for warning in WARNINGS: print('ERROR: ', warning) print('==================') print('Backup Is Complete') input('==================') ############################################################################### JUNK_FILE = [name.lower() for name in JUNK_FILE] JUNK_EXT = ['.' + name.lower() for name in JUNK_EXT] def prune_junk(): for root, dirs, files in os.walk(GET): for name in files: path = name.lower() if path in JUNK_FILE or os.path.splitext(path)[1] in JUNK_EXT: path = os.path.join(root, name) os.remove(path) print('REMOVE:', path) def prune_dirs(): for root, dirs, files in os.walk(GET, False): for name in dirs: path = os.path.join(root, name) if empty(path): os.rmdir(path) print('RMDIR: ', path) def empty(path): for name in os.listdir(path): path_name = os.path.join(path, name) if os.path.isdir(path_name) and not empty(path_name): return False elif os.path.isfile(path_name): return False return True ############################################################################### WARNINGS = [] def backup_dirs(source, destination): contents = os.listdir(source) os.mkdir(destination) print('MKDIR: ', destination) for name in contents: source_name = os.path.join(source, name) destination_name = os.path.join(destination, name) try: if os.path.isdir(source_name): backup_dirs(source_name, destination_name) elif os.path.isfile(source_name): backup_file(source_name, destination_name) except: WARNINGS.append(source_name) def backup_file(source, destination): sour = open(source, 'rb') dest = open(destination, 'wb') print('OPEN: ', destination) buff = sour.read(1 << 20) while buff: dest.write(buff) buff = sour.read(1 << 20) sour.close() dest.close() ############################################################################### if __name__ == '__main__': main()