nkululeko 0.83.3__py3-none-any.whl → 0.84.1__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.
nkululeko/utils/util.py CHANGED
@@ -1,10 +1,13 @@
1
1
  # util.py
2
- import pandas as pd
3
2
  import ast
3
+ import configparser
4
+ import os.path
5
+ import pickle
4
6
  import sys
7
+
5
8
  import numpy as np
6
- import os.path
7
- import configparser
9
+ import pandas as pd
10
+
8
11
  import audeer
9
12
  import audformat
10
13
 
@@ -30,43 +33,58 @@ class Util:
30
33
  else:
31
34
  self.caller = ""
32
35
  if has_config:
33
- import nkululeko.glob_conf as glob_conf
34
-
35
- self.config = glob_conf.config
36
- self.got_data_roots = self.config_val("DATA", "root_folders", False)
37
- if self.got_data_roots:
38
- # if there is a global data rootfolder file, read from there
39
- if not os.path.isfile(self.got_data_roots):
40
- self.error(f"no such file: {self.got_data_roots}")
41
- self.data_roots = configparser.ConfigParser()
42
- self.data_roots.read(self.got_data_roots)
43
- # self.debug(f"getting data roots from {self.got_data_roots}")
36
+ try:
37
+ import nkululeko.glob_conf as glob_conf
38
+ self.config = glob_conf.config
39
+ self.got_data_roots = self.config_val(
40
+ "DATA", "root_folders", False)
41
+ if self.got_data_roots:
42
+ # if there is a global data rootfolder file, read from there
43
+ if not os.path.isfile(self.got_data_roots):
44
+ self.error(f"no such file: {self.got_data_roots}")
45
+ self.data_roots = configparser.ConfigParser()
46
+ self.data_roots.read(self.got_data_roots)
47
+ except (ModuleNotFoundError, AttributeError):
48
+ self.config = None
49
+ self.got_data_roots = False
44
50
 
45
51
  def get_path(self, entry):
46
52
  """
47
53
  This method allows the user to get the directory path for the given argument.
48
54
  """
49
- root = os.path.join(self.config["EXP"]["root"], "")
50
- name = self.config["EXP"]["name"]
51
- try:
52
- entryn = self.config["EXP"][entry]
53
- except KeyError:
54
- # some default values
55
+ if self.config is None:
56
+ # If no configuration file is provided, use default paths
55
57
  if entry == "fig_dir":
56
- entryn = "./images/"
58
+ dir_name = "./images/"
57
59
  elif entry == "res_dir":
58
- entryn = "./results/"
60
+ dir_name = "./results/"
59
61
  elif entry == "model_dir":
60
- entryn = "./models/"
62
+ dir_name = "./models/"
61
63
  else:
62
- entryn = "./store/"
63
-
64
- # Expand image, model and result directories with run index
65
- if entry == "fig_dir" or entry == "res_dir" or entry == "model_dir":
66
- run = self.config_val("EXP", "run", 0)
67
- entryn = entryn + f"run_{run}/"
64
+ dir_name = "./store/"
65
+ else:
66
+ root = os.path.join(self.config["EXP"]["root"], "")
67
+ name = self.config["EXP"]["name"]
68
+ try:
69
+ entryn = self.config["EXP"][entry]
70
+ except KeyError:
71
+ # some default values
72
+ if entry == "fig_dir":
73
+ entryn = "./images/"
74
+ elif entry == "res_dir":
75
+ entryn = "./results/"
76
+ elif entry == "model_dir":
77
+ entryn = "./models/"
78
+ else:
79
+ entryn = "./store/"
80
+
81
+ # Expand image, model and result directories with run index
82
+ if entry == "fig_dir" or entry == "res_dir" or entry == "model_dir":
83
+ run = self.config_val("EXP", "run", 0)
84
+ entryn = entryn + f"run_{run}/"
85
+
86
+ dir_name = f"{root}{name}/{entryn}"
68
87
 
69
- dir_name = f"{root}{name}/{entryn}"
70
88
  audeer.mkdir(dir_name)
71
89
  return dir_name
72
90
 
@@ -98,7 +116,8 @@ class Util:
98
116
  )
99
117
  return default
100
118
  if not default in self.stopvals:
101
- self.debug(f"value for {key} not found, using default: {default}")
119
+ self.debug(
120
+ f"value for {key} not found, using default: {default}")
102
121
  return default
103
122
 
104
123
  def set_config(self, config):
@@ -135,7 +154,8 @@ class Util:
135
154
  if len(df) == 0:
136
155
  return df
137
156
  if not isinstance(df.index, pd.MultiIndex):
138
- df.index = audformat.utils.to_segmented_index(df.index, allow_nat=False)
157
+ df.index = audformat.utils.to_segmented_index(
158
+ df.index, allow_nat=False)
139
159
  return df
140
160
 
141
161
  def _get_value_descript(self, section, name):
@@ -240,11 +260,14 @@ class Util:
240
260
  print(df.head(1))
241
261
 
242
262
  def config_val(self, section, key, default):
263
+ if self.config is None:
264
+ return default
243
265
  try:
244
266
  return self.config[section][key]
245
267
  except KeyError:
246
- if not default in self.stopvals:
247
- self.debug(f"value for {key} not found, using default: {default}")
268
+ if default not in self.stopvals:
269
+ self.debug(
270
+ f"value for {key} not found, using default: {default}")
248
271
  return default
249
272
 
250
273
  def config_val_list(self, section, key, default):
@@ -252,7 +275,8 @@ class Util:
252
275
  return ast.literal_eval(self.config[section][key])
253
276
  except KeyError:
254
277
  if not default in self.stopvals:
255
- self.debug(f"value for {key} not found, using default: {default}")
278
+ self.debug(
279
+ f"value for {key} not found, using default: {default}")
256
280
  return default
257
281
 
258
282
  def continuous_to_categorical(self, series):
@@ -295,6 +319,28 @@ class Util:
295
319
  f" {vals.argmax()}"
296
320
  )
297
321
 
322
+ def exist_pickle(self, name):
323
+ store = self.get_path("store")
324
+ name = "/".join([store, name]) + ".pkl"
325
+ if os.path.isfile(name):
326
+ return True
327
+ return False
328
+
329
+ def to_pickle(self, anyobject, name):
330
+ store = self.get_path("store")
331
+ name = "/".join([store, name]) + ".pkl"
332
+ self.debug(f"saving {name}")
333
+ with open(name, "wb") as handle:
334
+ pickle.dump(anyobject, handle)
335
+
336
+ def from_pickle(self, name):
337
+ store = self.get_path("store")
338
+ name = "/".join([store, name]) + ".pkl"
339
+ self.debug(f"loading {name}")
340
+ with open(name, "rb") as handle:
341
+ any_opject = pickle.load(handle)
342
+ return any_opject
343
+
298
344
  def write_store(self, df, storage, format):
299
345
  if format == "pkl":
300
346
  df.to_pickle(storage)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nkululeko
3
- Version: 0.83.3
3
+ Version: 0.84.1
4
4
  Summary: Machine learning audio prediction experiments based on templates
5
5
  Home-page: https://github.com/felixbur/nkululeko
6
6
  Author: Felix Burkhardt
@@ -333,6 +333,15 @@ F. Burkhardt, Johannes Wagner, Hagen Wierstorf, Florian Eyben and Björn Schulle
333
333
  Changelog
334
334
  =========
335
335
 
336
+ Version 0.84.1
337
+ --------------
338
+ * made resample independent of config file
339
+
340
+ Version 0.84.0
341
+ --------------
342
+ * added SHAP analysis
343
+ * started with finetuning
344
+
336
345
  Version 0.83.3
337
346
  --------------
338
347
  * fixed a naming error in trill features that prevented storage of experiment
@@ -2,35 +2,36 @@ nkululeko/__init__.py,sha256=62f8HiEzJ8rG2QlTFJXUCMpvuH3fKI33DoJSj33mscc,63
2
2
  nkululeko/aug_train.py,sha256=YhuZnS_WVWnun9G-M6g5n6rbRxoVREz6Zh7k6qprFNQ,3194
3
3
  nkululeko/augment.py,sha256=4MG0apTAG5RgkuJrYEjGgDdbodZWi_HweSPNI1JJ5QA,3051
4
4
  nkululeko/cacheddataset.py,sha256=lIJ6hUo5LoxSrzXtWV8mzwO7wRtUETWnOQ4ws2XfL1E,969
5
- nkululeko/constants.py,sha256=zgeDgqWCuY5esPoOf_ve4SZAnwvJCy_A_qNl_zaWAHM,39
6
- nkululeko/demo.py,sha256=55kNFA2helMhOxD4yZuKg1JWDtlUUpxm-6uAnroIydI,3264
5
+ nkululeko/constants.py,sha256=31GQXyAN-nrfQCNIt6_aSkBVeE_J3GO-PklTEy6EgBg,39
6
+ nkululeko/demo.py,sha256=8bl15Kitoesnz8oa8yrs52T6YCSOhWbbq9PnZ8Hj6D0,3232
7
7
  nkululeko/demo_feats.py,sha256=sAeGFojhEj9WEDFtG3SzPBmyYJWLF2rkbpp65m8Ujo4,2025
8
- nkululeko/demo_predictor.py,sha256=-ggSHc3DXxRzjzcGB4qFBOMvKsfUdTkkde50BDrS9dA,4755
9
- nkululeko/experiment.py,sha256=RZfVevt7bYX8SGJ8o9HWKoZ_OVec7K_9A0HkgJYt8dA,29873
10
- nkululeko/explore.py,sha256=2wdoGRqldvsN1zCiWk0quSDgHHHUoF2UZOWQ1r-2OLM,2310
8
+ nkululeko/demo_predictor.py,sha256=es56xbT8ifkS_vnrlb5NTZT54gNmeUtNlA4zVA_gnN8,4757
9
+ nkululeko/experiment.py,sha256=mYdHfInMkuOI3frkZo7oaEe9viO-Qa1ZShyF6MPozcU,30225
10
+ nkululeko/explore.py,sha256=lDzRoW_Taa5u4BBABZLD89BcQWnYlrftJR4jgt1yyj0,2609
11
11
  nkululeko/export.py,sha256=mHeEAAmtZuxdyebLlbSzPrHSi9OMgJHbk35d3DTxRBc,4632
12
12
  nkululeko/feature_extractor.py,sha256=8mssYKmo4LclVI-hiLmJEDZ0ZPyDavFG2YwtXcrGzwM,3976
13
13
  nkululeko/file_checker.py,sha256=LoLnL8aHpW-axMQ46qbqrManTs5otG9ShpEZuz9iRSk,3474
14
14
  nkululeko/filter_data.py,sha256=w-X2mhKdYr5DxDIz50E5yzO6Jmzk4jjDBoXsgOOVtcA,7222
15
- nkululeko/glob_conf.py,sha256=iHiVSxDYgmYwdx6z0HuGUMSWrfZfufPHxHb60q2dLRY,453
15
+ nkululeko/glob_conf.py,sha256=KL9YJQTHvTztxo1vr25qRRgaPnx4NTg0XrdbovKGMmw,525
16
16
  nkululeko/modelrunner.py,sha256=GwDXcE2gDQXat4W0-HhHQ1BcUNCRBXMBQ4QycfHp_5c,9288
17
17
  nkululeko/multidb.py,sha256=fG3VukEWP1vreVN4gB1IRXxwwg4jLftsSEYtu0o1f78,5634
18
18
  nkululeko/nkuluflag.py,sha256=PGWSmZz-PiiHLgcZJAoGOI_Y-sZDVI1ksB8p5r7riWM,3725
19
19
  nkululeko/nkululeko.py,sha256=Kn3s2E3yyH8cJ7z6lkMxrnqtCxTu7-qfe9Zr_ONTD5g,1968
20
20
  nkululeko/plots.py,sha256=nd9tF_61DyAx7oGZF8gTrHXazkgFjFe4eClxu1nQ_XU,23276
21
21
  nkululeko/predict.py,sha256=sF091sSSLnEWcISx9ZcULLie3tY5XeFsQJd6b3vrxFg,2409
22
- nkululeko/resample.py,sha256=3WbxkwgyTe_fW38046Rjxk3knOkFdhqn2C4nfhbUurQ,2287
22
+ nkululeko/resample.py,sha256=IPtYqU0nhZ-CqO_O1jJN0EvpfjxHZdFRwdTpEJOVuaQ,3354
23
23
  nkululeko/runmanager.py,sha256=eTM1DNQKt1lxYhzt4vZyZluPXW9sWlIJHNQzex4lkJU,7624
24
24
  nkululeko/scaler.py,sha256=4nkIqoajkIkuTPK0Z02ifMN_awl6fP_i-GBYdoGYgGM,4101
25
25
  nkululeko/segment.py,sha256=YLKckX44tbvTb3LrdgYw9X4guzuF27sutl92z9DkpZU,4835
26
26
  nkululeko/syllable_nuclei.py,sha256=Sky-C__MeUDaxqHnDl2TGLLYOYvsahD35TUjWGeG31k,10047
27
27
  nkululeko/test.py,sha256=1w624vo5KTzmFC8BUStGlLDmIEAFuJUz7J0W-gp7AxI,1677
28
28
  nkululeko/test_predictor.py,sha256=_w5J8CxH6hmW3mLTKbdfmywl5QpdNAnW1Y8TE5GtlfE,3237
29
+ nkululeko/test_pretrain.py,sha256=4b_39l01dySei_e0ys2NKo9Gipf1Fukp1GvhQllFHt8,8131
29
30
  nkululeko/augmenting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
31
  nkululeko/augmenting/augmenter.py,sha256=XAt0dpmlnKxqyysqCgV3rcz-pRIvOz7rU7dmGDCVAzs,2905
31
32
  nkululeko/augmenting/randomsplicer.py,sha256=Z5rxdKKUpuncLWuTS6xVfVKUeVbeiYU_dLRHQ5fcg4Y,2669
32
33
  nkululeko/augmenting/randomsplicing.py,sha256=ldym9vZNsZIU5BAAaJVaOmAgmVHNs4a5i5K3bW-WAQU,1791
33
- nkululeko/augmenting/resampler.py,sha256=cRrn27w_f2I6aN0CftlTuHT2edi7pTREh3Yc6BxhcGU,3335
34
+ nkululeko/augmenting/resampler.py,sha256=nOBsiQpX6p4jXsP7x6wak78F3B5YYYRmC_iHX8iuOXs,3542
34
35
  nkululeko/autopredict/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
36
  nkululeko/autopredict/ap_age.py,sha256=2Wn5E-Jd49sTn40WqaMcYtUEl4zEq3OY75XmjOpdxsA,1095
36
37
  nkululeko/autopredict/ap_arousal.py,sha256=ymt0diu4v1osw3VxJbSglsVKDAJYRzebQ2TTfFMKKxk,1024
@@ -49,7 +50,7 @@ nkululeko/data/dataset_csv.py,sha256=uLa7jW4w2ft299NkpXZMD361kPHF8oSYoIZ_ucxhuOM
49
50
  nkululeko/feat_extract/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
51
  nkululeko/feat_extract/feats_agender.py,sha256=Qm69G4kqAyTVVk7wwRgrXlNwGaDMGRYyKGpuf0vOEgM,3113
51
52
  nkululeko/feat_extract/feats_agender_agender.py,sha256=tgH2BnwcxpvuLmOkrMbVdBSX0Onfz2MG12FsddalRKI,3424
52
- nkululeko/feat_extract/feats_analyser.py,sha256=_5oz4y-NZCEBgfNP2GZ9WNqQR50Hbykm0TvDVomWP0U,11399
53
+ nkululeko/feat_extract/feats_analyser.py,sha256=Y9hMpZ9WsQOrxTP3B1diHnzMeOgwbVpVFWVlIyhHMJs,12722
53
54
  nkululeko/feat_extract/feats_auddim.py,sha256=VlzKKXTXa5kjLgQBWyEFy-daIyU1SkOwCCOIhKsWCvE,3162
54
55
  nkululeko/feat_extract/feats_audmodel.py,sha256=VjBNgAoxsHJhwr6Kwt9CxX6SaCM4RK_OV-GU2W5-bhU,3187
55
56
  nkululeko/feat_extract/feats_clap.py,sha256=nR6eEIRdsMHcfmD1bNtt5WfDvkxKjvEbukSSrXHm-HU,3489
@@ -74,21 +75,22 @@ nkululeko/losses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
74
75
  nkululeko/losses/loss_ccc.py,sha256=NOK0y0fxKUnU161B5geap6Fmn8QzoPl2MqtPiV8IuJE,976
75
76
  nkululeko/losses/loss_softf1loss.py,sha256=5gW-PuiqeAZcRgfwjueIOQtMokOjZWgQnVIv59HKTCo,1309
76
77
  nkululeko/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- nkululeko/models/model.py,sha256=oAdKq2wY5lYKfpZkQwO46ojYRsj_Z-FR56oR1uHAWI0,11569
78
- nkululeko/models/model_bayes.py,sha256=wI7-sCwibqXMCHviu349TYjgJXXNXym-Z6ZM83uxlFQ,378
79
- nkululeko/models/model_cnn.py,sha256=revCxyeX69DU6OA63YTnF28UaAFV7AmUfqODMCE_pbQ,10002
80
- nkululeko/models/model_gmm.py,sha256=onovzGBeguwZ-upXtuDLaBw9sd6fDDQslVBOrz1Z8TE,645
81
- nkululeko/models/model_knn.py,sha256=5tGqiPo2JTw9VLmD-MXNZKFJ5RTLA6uv_blJDJ9lScA,573
82
- nkululeko/models/model_knn_reg.py,sha256=Fbuk6Ku6eyrbbMEk7rB5dwfhvQOMsdZk6HI_0T0gYPw,580
83
- nkululeko/models/model_lin_reg.py,sha256=NBTnY2ULuhUBt5ArYQwskZ2Vq4BBDGkqd9SYBFl7Ql4,392
84
- nkululeko/models/model_mlp.py,sha256=IuNGrLPx54-ZmpydH2yJdm2ddCm4rgu59Csv5ikbEpI,9471
85
- nkululeko/models/model_mlp_regression.py,sha256=-ailThquUXwLkOj5jlJ4qn1vlb3nSHW5s0KS7GLp4qI,10290
86
- nkululeko/models/model_svm.py,sha256=QqwRjfG9I5y-57CcJAMUSbvYzV0DOlDcpDK5f4yQ_qw,914
87
- nkululeko/models/model_svr.py,sha256=p-Mb4Bn54yOe1upuHQKNpfj4ttOmQnm9pCB7ECkJkJQ,699
88
- nkululeko/models/model_tree.py,sha256=soXjV523eRvRZ-jbX7X_3S73Wto1B9bm7ZzzDmgYzTc,390
89
- nkululeko/models/model_tree_reg.py,sha256=QxkQEz3LOuCLkXw5xH9IwFg4IcTL3Y5RK03qKe4TtGQ,397
90
- nkululeko/models/model_xgb.py,sha256=yPJFD2jxOGcPDKuBeqJSmh83eKrfbnD_n722i6g39_g,267
91
- nkululeko/models/model_xgr.py,sha256=yY6wZV8jdiQCIYQCjYSb8gE0jjeiY44eh3rERe2HDvg,227
78
+ nkululeko/models/finetune_model.py,sha256=bx9NsFpEqf_mBohcrf-9lWjrC4AtOIJ7holNXwaFo2Y,4910
79
+ nkululeko/models/model.py,sha256=fL6LB6I9Oqo_OWUIptqiu6abuxVYYv8bW2a3m4XSLqU,11601
80
+ nkululeko/models/model_bayes.py,sha256=WJFZ8wFKwWATz6MhmjeZIi1Pal1viU549WL_PjXDSy8,406
81
+ nkululeko/models/model_cnn.py,sha256=bJxqwe6FnVR2hFeqN6EXexYGgvKYFED1VOhBXVlLWaE,9954
82
+ nkululeko/models/model_gmm.py,sha256=hZ9UO36KNf48qa3J-xkWIicIj9-TApmt21zNES2vEOs,649
83
+ nkululeko/models/model_knn.py,sha256=KlnrJfwiVnmXZrAaYGFrKA2f5sznvTzSJQ8-5etOP0k,599
84
+ nkululeko/models/model_knn_reg.py,sha256=j7YFfVm6xOR2d9yBYdQiwwqYfqkX0JynX_qLCvkr1fk,610
85
+ nkululeko/models/model_lin_reg.py,sha256=0D7mSnSwK82lNWDMwHYRyq3FmGa6y-DHDGg4qUe85q4,422
86
+ nkululeko/models/model_mlp.py,sha256=JtC83GYKtqCTW00rUm_xKSKjAsdMUAsqtnBfEFZBCwA,9854
87
+ nkululeko/models/model_mlp_regression.py,sha256=PO5qyfjgAJH8hawhmeXDaUThyXDYdM642dQHkO0NY7c,10204
88
+ nkululeko/models/model_svm.py,sha256=rsME3KvKvNG7bdE5lbvYUu85WZhaASZxxmdNDIVJRZ4,940
89
+ nkululeko/models/model_svr.py,sha256=_YZeksqB3eBENGlg3g9RwYFlk9rQQ-XCeNBKLlGGVoE,725
90
+ nkululeko/models/model_tree.py,sha256=rf16faUm4o2LJgkoYpeY998b8DQIvXZ73_m1IS3TnnE,417
91
+ nkululeko/models/model_tree_reg.py,sha256=IgQcPTE-304HQLYSKPF8Z4ot_Ur9dH01fZjS0nXke_M,428
92
+ nkululeko/models/model_xgb.py,sha256=Thgx5ESdIok4v72mKh4plxpo4smGcKALWNCJTDScY0M,447
93
+ nkululeko/models/model_xgr.py,sha256=aGBtNGLWjOE_2rICGYGFxmT8DtnHYsIl1lIpMtghHsY,418
92
94
  nkululeko/reporting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
95
  nkululeko/reporting/defines.py,sha256=IsY1YgKRMaABpylVKjBJgJ5bNCEbGCVA_E6pivraqSU,648
94
96
  nkululeko/reporting/latex_writer.py,sha256=qiCRSmB4KOD_za4oHu5x-PhwjZohzfo8wecMOwlXZwc,1886
@@ -102,9 +104,9 @@ nkululeko/segmenting/seg_silero.py,sha256=lLytS38KzARS17omwv8VBw-zz60RVSXGSvZ5Ev
102
104
  nkululeko/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
105
  nkululeko/utils/files.py,sha256=UiGAtZRWYjHSvlmPaTMtzyNNGE6qaLaxQkybctS7iRM,4021
104
106
  nkululeko/utils/stats.py,sha256=1yUq0FTOyqkU8TwUocJRYdJaqMU5SlOBBRUun9STo2M,2829
105
- nkululeko/utils/util.py,sha256=_Z6OMJ3f-8TdETW9eqJYY5hwNRS5XCt9azzRnqoTTZE,12330
106
- nkululeko-0.83.3.dist-info/LICENSE,sha256=0zGP5B_W35yAcGfHPS18Q2B8UhvLRY3dQq1MhpsJU_U,1076
107
- nkululeko-0.83.3.dist-info/METADATA,sha256=rowQ7syG1q0BotCIiP9ZbiiMgNNvYxuRKYTvIztWMXs,36267
108
- nkululeko-0.83.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
109
- nkululeko-0.83.3.dist-info/top_level.txt,sha256=DPFNNSHPjUeVKj44dVANAjuVGRCC3MusJ08lc2a8xFA,10
110
- nkululeko-0.83.3.dist-info/RECORD,,
107
+ nkululeko/utils/util.py,sha256=b1IHFucRNuF9Iyv5IJeK4AEg0Rga0xKG80UM5GWWdHA,13816
108
+ nkululeko-0.84.1.dist-info/LICENSE,sha256=0zGP5B_W35yAcGfHPS18Q2B8UhvLRY3dQq1MhpsJU_U,1076
109
+ nkululeko-0.84.1.dist-info/METADATA,sha256=Y647w-vkRjPG7fssLTEF_Aa_pP74aN-WPCGv6r0_NcE,36420
110
+ nkululeko-0.84.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
111
+ nkululeko-0.84.1.dist-info/top_level.txt,sha256=DPFNNSHPjUeVKj44dVANAjuVGRCC3MusJ08lc2a8xFA,10
112
+ nkululeko-0.84.1.dist-info/RECORD,,