TSVZ 3.18__py3-none-any.whl → 3.20__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
TSVZ.py CHANGED
@@ -22,7 +22,7 @@ if os.name == 'nt':
22
22
  elif os.name == 'posix':
23
23
  import fcntl
24
24
 
25
- version = '3.18'
25
+ version = '3.20'
26
26
  __version__ = version
27
27
  author = 'pan@zopyr.us'
28
28
 
@@ -30,12 +30,13 @@ DEFAULT_DELIMITER = '\t'
30
30
  DEFAULTS_INDICATOR_KEY = '#_defaults_#'
31
31
 
32
32
  def get_delimiter(delimiter,file_name = ''):
33
+ global DEFAULT_DELIMITER
33
34
  if not delimiter:
34
35
  return DEFAULT_DELIMITER
35
36
  elif delimiter == ...:
36
37
  if not file_name:
37
38
  rtn = '\t'
38
- if file_name.endswith('.csv'):
39
+ elif file_name.endswith('.csv'):
39
40
  rtn = ','
40
41
  elif file_name.endswith('.nsv'):
41
42
  rtn = '\0'
@@ -58,6 +59,7 @@ def get_delimiter(delimiter,file_name = ''):
58
59
 
59
60
  def pretty_format_table(data, delimiter = DEFAULT_DELIMITER,header = None):
60
61
  version = 1.11
62
+ _ = version
61
63
  if not data:
62
64
  return ''
63
65
  if isinstance(data, str):
@@ -262,10 +264,10 @@ def __teePrintOrNot(message,level = 'info',teeLogger = None):
262
264
  teeLogger.teelog(message,level)
263
265
  else:
264
266
  print(message,flush=True)
265
- except Exception as e:
267
+ except Exception:
266
268
  print(message,flush=True)
267
269
 
268
- def _processLine(line,taskDic,correctColumnNum,verbose = False,teeLogger = None,strict = True,delimiter = DEFAULT_DELIMITER,defaults = []):
270
+ def _processLine(line,taskDic,correctColumnNum,verbose = False,teeLogger = None,strict = True,delimiter = DEFAULT_DELIMITER,defaults = None):
269
271
  """
270
272
  Process a line of text and update the task dictionary.
271
273
 
@@ -282,6 +284,8 @@ def _processLine(line,taskDic,correctColumnNum,verbose = False,teeLogger = None,
282
284
  tuple: A tuple containing the updated correctColumnNum and the processed lineCache.
283
285
 
284
286
  """
287
+ if not defaults:
288
+ defaults = []
285
289
  line = line.strip(' ').strip('\x00').rstrip('\r\n')
286
290
  # we throw away the lines that start with '#'
287
291
  if not line :
@@ -465,7 +469,7 @@ def _lineContainHeader(header,line,verbose = False,teeLogger = None,strict = Fal
465
469
  if len(header) != len(line) or any([header[i] not in line[i] for i in range(len(header))]):
466
470
  __teePrintOrNot(f"Header mismatch: \n{line} \n!= \n{header}",teeLogger=teeLogger)
467
471
  if strict:
468
- raise Exception("Data format error! Header mismatch")
472
+ raise ValueError("Data format error! Header mismatch")
469
473
  return False
470
474
  return True
471
475
 
@@ -500,7 +504,7 @@ def _verifyFileExistence(fileName,createIfNotExist = True,teeLogger = None,heade
500
504
  return True
501
505
  elif strict:
502
506
  __teePrintOrNot('File not found','error',teeLogger=teeLogger)
503
- raise Exception("File not found")
507
+ raise FileNotFoundError("File not found")
504
508
  else:
505
509
  return False
506
510
  return True
@@ -566,8 +570,7 @@ def readTabularFile(fileName,teeLogger = None,header = '',createIfNotExist = Fal
566
570
  return taskDic
567
571
  with open(fileName, mode ='rb')as file:
568
572
  correctColumnNum = -1
569
- if header.rstrip():
570
- if verifyHeader:
573
+ if header.rstrip() and verifyHeader:
571
574
  line = file.readline().decode(encoding=encoding)
572
575
  if _lineContainHeader(header,line,verbose = verbose,teeLogger = teeLogger,strict = strict):
573
576
  correctColumnNum = len(header.split(delimiter))
@@ -659,14 +662,12 @@ def appendLinesTabularFile(fileName,linesToAppend,teeLogger = None,header = '',c
659
662
  line[i] = str(line[i])
660
663
  except Exception as e:
661
664
  line[i] = str(e)
662
- if isinstance(linesToAppend,dict):
663
- if not line or line[0] != key:
665
+ if isinstance(linesToAppend,dict) and not line or line[0] != key:
664
666
  line = [key]+line
665
667
  formatedLines.append(line)
666
668
  with open(fileName, mode ='r+b')as file:
667
669
  correctColumnNum = max([len(line) for line in formatedLines])
668
- if header.rstrip():
669
- if verifyHeader:
670
+ if header.rstrip() and verifyHeader:
670
671
  line = file.readline().decode(encoding=encoding)
671
672
  if _lineContainHeader(header,line,verbose = verbose,teeLogger = teeLogger,strict = strict):
672
673
  correctColumnNum = len(header.split(delimiter))
@@ -716,7 +717,7 @@ def clearTabularFile(fileName,teeLogger = None,header = '',verifyHeader = False,
716
717
  delimiter = get_delimiter(delimiter,file_name=fileName)
717
718
  header = _formatHeader(header,verbose = verbose,teeLogger = teeLogger,delimiter=delimiter)
718
719
  if not _verifyFileExistence(fileName,createIfNotExist = True,teeLogger = teeLogger,header = header,encoding = encoding,strict = False,delimiter=delimiter):
719
- raise Exception("Something catastrophic happened! File still not found after creation")
720
+ raise FileNotFoundError("Something catastrophic happened! File still not found after creation")
720
721
  else:
721
722
  with open(fileName, mode ='r+',encoding=encoding)as file:
722
723
  if header.rstrip() and verifyHeader:
@@ -754,13 +755,13 @@ class TSVZed(OrderedDict):
754
755
  self.teeLogger.teelog(message,level)
755
756
  else:
756
757
  print(message,flush=True)
757
- except Exception as e:
758
+ except Exception:
758
759
  print(message,flush=True)
759
760
 
760
761
  def getResourseUsage(self,return_dict = False):
761
762
  return get_resource_usage(return_dict = return_dict)
762
763
 
763
- def __init__ (self,fileName,teeLogger = None,header = '',createIfNotExist = True,verifyHeader = True,rewrite_on_load = True,rewrite_on_exit = False,rewrite_interval = 0, append_check_delay = 0.01,monitor_external_changes = True,verbose = False,encoding = 'utf8',delimiter = ...,defualts = [],strict = False):
764
+ def __init__ (self,fileName,teeLogger = None,header = '',createIfNotExist = True,verifyHeader = True,rewrite_on_load = True,rewrite_on_exit = False,rewrite_interval = 0, append_check_delay = 0.01,monitor_external_changes = True,verbose = False,encoding = 'utf8',delimiter = ...,defualts = None,strict = False):
764
765
  super().__init__()
765
766
  self.version = version
766
767
  self.strict = strict
@@ -769,7 +770,7 @@ class TSVZed(OrderedDict):
769
770
  self._fileName = fileName
770
771
  self.teeLogger = teeLogger
771
772
  self.delimiter = get_delimiter(delimiter,file_name=fileName)
772
- self.defaults = defualts
773
+ self.defaults = defualts if defualts else []
773
774
  self.header = _formatHeader(header,verbose = verbose,teeLogger = self.teeLogger,delimiter=self.delimiter)
774
775
  self.correctColumnNum = -1
775
776
  self.createIfNotExist = createIfNotExist
@@ -835,7 +836,12 @@ class TSVZed(OrderedDict):
835
836
  readTabularFile(self._fileName, teeLogger = self.teeLogger, header = self.header, createIfNotExist = self.createIfNotExist, verifyHeader = self.verifyHeader, verbose = self.verbose, taskDic = self,encoding = self.encoding if self.encoding else None, strict = self.strict, delimiter = self.delimiter, defaults=self.defaults)
836
837
  if self.verbose:
837
838
  self.__teePrintOrNot(f"Loaded {len(self)} records from {self._fileName}")
838
- self.correctColumnNum = len(self.header.split(self.delimiter)) if (self.header and self.verifyHeader) else (len(self[next(iter(self))]) if self else -1)
839
+ if self.header and self.verifyHeader:
840
+ self.correctColumnNum = len(self.header.split(self.delimiter))
841
+ elif self:
842
+ self.correctColumnNum = len(self[next(iter(self))])
843
+ else:
844
+ self.correctColumnNum = -1
839
845
  if self.verbose:
840
846
  self.__teePrintOrNot(f"correctColumnNum: {self.correctColumnNum}")
841
847
  #super().update(loadedData)
@@ -1001,9 +1007,12 @@ class TSVZed(OrderedDict):
1001
1007
  def __enter__(self):
1002
1008
  return self
1003
1009
 
1004
- def __exit__(self,exc_type,exc_value,traceback):
1010
+ def close(self):
1005
1011
  self.stopAppendThread()
1006
1012
  return self
1013
+
1014
+ def __exit__(self,exc_type,exc_value,traceback):
1015
+ return self.close()
1007
1016
 
1008
1017
  def __repr__(self):
1009
1018
  return f"""TSVZed(
@@ -1024,16 +1033,11 @@ deSynced:{self.deSynced}
1024
1033
  memoryOnly:{self.memoryOnly}
1025
1034
  {dict(self)})"""
1026
1035
 
1027
- def close(self):
1028
- self.stopAppendThread()
1029
- return self
1030
-
1031
1036
  def __str__(self):
1032
1037
  return f"TSVZed({self._fileName},{dict(self)})"
1033
1038
 
1034
1039
  def __del__(self):
1035
- self.stopAppendThread()
1036
- return self
1040
+ return self.close()
1037
1041
 
1038
1042
  def popitem(self, last=True):
1039
1043
  key, value = super().popitem(last)
@@ -1359,14 +1363,14 @@ def __main__():
1359
1363
  args.header += '\\'
1360
1364
  try:
1361
1365
  header = args.header.encode().decode('unicode_escape') if args.header else ''
1362
- except Exception as e:
1366
+ except Exception:
1363
1367
  print(f"Failed to decode header: {args.header}")
1364
1368
  header = ''
1365
1369
  defaults = []
1366
1370
  if args.defaults:
1367
1371
  try:
1368
1372
  defaults = args.defaults.encode().decode('unicode_escape').split(args.delimiter)
1369
- except Exception as e:
1373
+ except Exception:
1370
1374
  print(f"Failed to decode defaults: {args.defaults}")
1371
1375
  defaults = []
1372
1376
 
@@ -1385,9 +1389,7 @@ def __main__():
1385
1389
  elif args.operation == 'clear':
1386
1390
  clearTabularFile(args.filename, header=header, verbose=args.verbose, verifyHeader=args.strict, delimiter=args.delimiter)
1387
1391
  else:
1388
- print("Invalid operation")
1389
- return
1390
-
1392
+ print("Invalid operation")
1391
1393
  if __name__ == '__main__':
1392
1394
  __main__()
1393
1395
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: TSVZ
3
- Version: 3.18
3
+ Version: 3.20
4
4
  Summary: An simple in memory wrapper around a TSV file to function as a database
5
5
  Home-page: https://github.com/yufei-pan/TSVZ
6
6
  Author: Yufei Pan
@@ -0,0 +1,6 @@
1
+ TSVZ.py,sha256=TcVMZcPjeBn9IF0jg6b8Z3xVOIoDqDLP90o3nsVLM1w,68422
2
+ tsvz-3.20.dist-info/METADATA,sha256=TGyylT7aW0QwyQQqUvtD677ISp6XDo5gl5PS8qy5m-U,1826
3
+ tsvz-3.20.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
4
+ tsvz-3.20.dist-info/entry_points.txt,sha256=WeXidyV5yKCRLaVsnAY35xGa08QgytOfvr1CK9aescI,60
5
+ tsvz-3.20.dist-info/top_level.txt,sha256=OPx4LvOpaYykaos7oL_jGaObSWXxLzhHiWLuz-K147g,5
6
+ tsvz-3.20.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,6 +0,0 @@
1
- TSVZ.py,sha256=-1ciQsohzOZcZ8iYmlfw4JgFfUQBurV5104tpM26F9U,68319
2
- tsvz-3.18.dist-info/METADATA,sha256=CGX-YrNOsZvau2hgduwOLbnXozNEqAEMP355LIli5sE,1826
3
- tsvz-3.18.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
4
- tsvz-3.18.dist-info/entry_points.txt,sha256=WeXidyV5yKCRLaVsnAY35xGa08QgytOfvr1CK9aescI,60
5
- tsvz-3.18.dist-info/top_level.txt,sha256=OPx4LvOpaYykaos7oL_jGaObSWXxLzhHiWLuz-K147g,5
6
- tsvz-3.18.dist-info/RECORD,,