2
2
import os
3
3
import re
4
4
import pathlib
5
+ import collections
5
6
6
7
__version__ = 0 , 0 , 5
7
8
__all__ = 'Elf' , 'OriginalElf' ,
8
9
9
10
10
- class ElfEntry :
11
+ class OrderedProperties (type ):
12
+ "metaclass for custom ordered properties access on Python 3.5 and earlier"
13
+
14
+ @classmethod
15
+ def __prepare__ (mcs , name , bases ):
16
+ "provide order-keeping support"
17
+ return collections .OrderedDict ()
18
+
19
+ def __new__ (cls , name , bases , classdict ):
20
+ "inject a custom __properties__ magic method"
21
+ customclass = type .__new__ (cls , name , bases , classdict )
22
+ customclass .__properties__ = tuple (k for k ,v in classdict .items () if isinstance (v , property ))
23
+ return customclass
24
+
25
+
26
+ class ElfEntry (metaclass = OrderedProperties ):
11
27
def __init__ (self , data ):
12
28
self .__data = data
13
29
@@ -75,9 +91,6 @@ def modification_date(self):
75
91
def reason (self ):
76
92
return self ._ElfEntry__data ['reason' ]
77
93
78
- @classmethod
79
- def labels (cls ):
80
- return tuple ((k for k , v in cls .__dict__ .items () if isinstance (v , property )))
81
94
82
95
def __str__ (self ):
83
96
return self .elf + ': ' + self .local_name
@@ -104,7 +117,7 @@ def __len__(self):
104
117
def read_from_csv (filepath :pathlib .Path , sep = ',' ):
105
118
"read CSV file at a given path"
106
119
table = {}
107
- columns = ElfEntry .labels ()
120
+ columns = ElfEntry .__properties__
108
121
with filepath .open ('r' , encoding = 'utf-8' ) as csvfile :
109
122
next (csvfile )
110
123
spamreader = csv .reader (csvfile , delimiter = ',' , quotechar = '"' , strict = True )
0 commit comments