oafuncs 0.0.76__py2.py3-none-any.whl → 0.0.78__py2.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.
oafuncs/oa_down/test.py CHANGED
@@ -4,7 +4,7 @@
4
4
  Author: Liu Kun && 16031215@qq.com
5
5
  Date: 2024-12-01 19:32:25
6
6
  LastEditors: Liu Kun && 16031215@qq.com
7
- LastEditTime: 2024-12-01 19:38:40
7
+ LastEditTime: 2024-12-01 19:50:32
8
8
  FilePath: \\Python\\My_Funcs\\OAFuncs\\oafuncs\\oa_down\\test.py
9
9
  Description:
10
10
  EditPlatform: vscode
@@ -16,6 +16,24 @@ Python Version: 3.12
16
16
  import os
17
17
  import random
18
18
 
19
+ txtfile = r'E:\Code\Python\My_Funcs\OAFuncs\oafuncs\oa_down\User_Agent-list.txt'
20
+
21
+ with open(txtfile, 'r') as f:
22
+ lines = f.readlines()
23
+ # 去掉换行符和空行
24
+ lines = [line.strip() for line in lines if line.strip()]
25
+ new_line = []
26
+ for i in range(len(lines)):
27
+ if '/' in lines[i]:
28
+ new_line.append(lines[i])
29
+ else:
30
+ print(lines[i])
31
+
32
+ newtxtfile = r'E:\Code\Python\My_Funcs\OAFuncs\oafuncs\oa_down\ua_list_new.txt'
33
+ """ with open(newtxtfile, 'w') as f:
34
+ for line in new_line:
35
+ f.write(line + '\n') """
36
+
19
37
 
20
38
  def get_ua():
21
39
  current_dir = os.path.dirname(os.path.abspath(__file__))
@@ -99,6 +117,11 @@ def get_ua_org():
99
117
  "Openwave/UCWEB7.0.2.37/28/999",
100
118
 
101
119
  ]
120
+ with open(newtxtfile, 'w') as f:
121
+ for line in ua_list:
122
+ f.write(line + '\n')
102
123
  # print(f'Using User-Agent: {ua}')
103
124
  ua = random.choice(ua_list)
104
125
  return ua
126
+
127
+ # get_ua_org()
oafuncs/oa_file.py CHANGED
@@ -4,7 +4,7 @@
4
4
  Author: Liu Kun && 16031215@qq.com
5
5
  Date: 2024-09-17 15:07:13
6
6
  LastEditors: Liu Kun && 16031215@qq.com
7
- LastEditTime: 2024-11-21 13:07:54
7
+ LastEditTime: 2024-12-02 10:33:19
8
8
  FilePath: \\Python\\My_Funcs\\OAFuncs\\oafuncs\\oa_file.py
9
9
  Description:
10
10
  EditPlatform: vscode
@@ -19,7 +19,43 @@ import os
19
19
  import re
20
20
  import shutil
21
21
 
22
- __all__ = ['link_file', 'copy_file', 'rename_files', 'make_folder', 'clear_folder', 'remove_empty_folders', 'remove', 'file_size']
22
+ __all__ = ['find_file', 'link_file', 'copy_file', 'rename_file', 'make_folder', 'clear_folder', 'remove_empty_folders', 'remove', 'file_size']
23
+
24
+
25
+ def find_file(parent_path, fname, mode='path'):
26
+ '''
27
+ description:
28
+ param {*} parent_path: The parent path where the files are located
29
+ param {*} fname: The file name pattern to search for
30
+ param {*} mode: 'path' to return the full path of the files, 'file' to return only the file names
31
+ return {*} A list of file paths or file names if files are found, None otherwise
32
+ '''
33
+ def natural_sort_key(s):
34
+ """生成一个用于自然排序的键"""
35
+ return [int(text) if text.isdigit() else text.lower() for text in re.split('([0-9]+)', s)]
36
+
37
+ # 将parent_path和fname结合成完整的搜索路径
38
+ search_pattern = os.path.join(str(parent_path), fname)
39
+
40
+ # 使用glob模块查找所有匹配的文件
41
+ matched_files = glob.glob(search_pattern)
42
+
43
+ # 如果没有找到任何文件,则返回False
44
+ if not matched_files:
45
+ return None
46
+
47
+ # 在find_files函数中替换natsorted调用
48
+ matched_files = sorted(matched_files, key=natural_sort_key)
49
+
50
+ # 根据mode参数决定返回的内容
51
+ if mode == 'file':
52
+ # 只返回文件名
53
+ result = [os.path.basename(file) for file in matched_files]
54
+ else: # 默认为'path'
55
+ # 返回文件的绝对路径
56
+ result = [os.path.abspath(file) for file in matched_files]
57
+
58
+ return result
23
59
 
24
60
 
25
61
  def link_file(src_pattern, dst):
@@ -113,14 +149,14 @@ def copy_file(src_pattern, dst):
113
149
  print(f'复制文件或目录并重命名: {src_file} -> {dst_file}')
114
150
 
115
151
 
116
- def rename_files(directory, old_str, new_str):
152
+ def rename_file(directory, old_str, new_str):
117
153
  '''
118
154
  # 描述:重命名目录下的文件,支持通配符
119
155
  # 使用示例
120
156
  directory_path = r"E:\windfarm\CROCO_FILES"
121
157
  old_str = "croco"
122
158
  new_str = "roms"
123
- rename_files(directory_path, old_str, new_str)
159
+ rename_file(directory_path, old_str, new_str)
124
160
  param {*} directory # 目录
125
161
  param {*} old_str # 要替换的字符串
126
162
  param {*} new_str # 新字符串
oafuncs/oa_nc.py CHANGED
@@ -1,18 +1,17 @@
1
1
  #!/usr/bin/env python
2
2
  # coding=utf-8
3
- '''
3
+ """
4
4
  Author: Liu Kun && 16031215@qq.com
5
5
  Date: 2024-09-17 14:58:50
6
6
  LastEditors: Liu Kun && 16031215@qq.com
7
- LastEditTime: 2024-11-21 13:05:51
7
+ LastEditTime: 2024-12-06 14:16:56
8
8
  FilePath: \\Python\\My_Funcs\\OAFuncs\\oafuncs\\oa_nc.py
9
- Description:
9
+ Description:
10
10
  EditPlatform: vscode
11
11
  ComputerInfo: XPS 15 9510
12
12
  SystemInfo: Windows 11
13
13
  Python Version: 3.11
14
- '''
15
-
14
+ """
16
15
 
17
16
  import os
18
17
 
@@ -20,16 +19,16 @@ import netCDF4 as nc
20
19
  import numpy as np
21
20
  import xarray as xr
22
21
 
23
- __all__ = ['get_var', 'extract5nc', 'write2nc', 'merge5nc', 'modify_var_value', 'modify_var_attr', 'rename_var_or_dim', 'check_ncfile']
22
+ __all__ = ["get_var", "extract5nc", "write2nc", "merge5nc", "modify_var_value", "modify_var_attr", "rename_var_or_dim", "check_ncfile"]
24
23
 
25
24
 
26
25
  def get_var(file, *vars):
27
- '''
26
+ """
28
27
  description: 读取nc文件中的变量
29
28
  param {file: 文件路径, *vars: 变量名}
30
29
  example: datas = get_var(file_ecm, 'h', 't', 'u', 'v')
31
30
  return {datas: 变量数据}
32
- '''
31
+ """
33
32
  ds = xr.open_dataset(file)
34
33
  datas = []
35
34
  for var in vars:
@@ -40,7 +39,7 @@ def get_var(file, *vars):
40
39
 
41
40
 
42
41
  def extract5nc(file, varname):
43
- '''
42
+ """
44
43
  描述:
45
44
  1、提取nc文件中的变量
46
45
  2、将相应维度提取,建立字典
@@ -49,7 +48,7 @@ def extract5nc(file, varname):
49
48
  file: 文件路径
50
49
  varname: 变量名
51
50
  example: data, dimdict = extract5nc(file_ecm, 'h')
52
- '''
51
+ """
53
52
  ds = xr.open_dataset(file)
54
53
  vardata = ds[varname]
55
54
  dims = vardata.dims
@@ -63,22 +62,22 @@ def extract5nc(file, varname):
63
62
  def _numpy_to_nc_type(numpy_type):
64
63
  """将NumPy数据类型映射到NetCDF数据类型"""
65
64
  numpy_to_nc = {
66
- 'float32': 'f4',
67
- 'float64': 'f8',
68
- 'int8': 'i1',
69
- 'int16': 'i2',
70
- 'int32': 'i4',
71
- 'int64': 'i8',
72
- 'uint8': 'u1',
73
- 'uint16': 'u2',
74
- 'uint32': 'u4',
75
- 'uint64': 'u8',
65
+ "float32": "f4",
66
+ "float64": "f8",
67
+ "int8": "i1",
68
+ "int16": "i2",
69
+ "int32": "i4",
70
+ "int64": "i8",
71
+ "uint8": "u1",
72
+ "uint16": "u2",
73
+ "uint32": "u4",
74
+ "uint64": "u8",
76
75
  }
77
- return numpy_to_nc.get(str(numpy_type), 'f4') # 默认使用 'float32'
76
+ return numpy_to_nc.get(str(numpy_type), "f4") # 默认使用 'float32'
78
77
 
79
78
 
80
79
  def write2nc(file, data, varname, coords, mode):
81
- '''
80
+ """
82
81
  description: 写入数据到nc文件
83
82
  参数:
84
83
  file: 文件路径
@@ -87,16 +86,16 @@ def write2nc(file, data, varname, coords, mode):
87
86
  coords: 坐标,字典,键为维度名称,值为坐标数据
88
87
  mode: 写入模式,'w'为写入,'a'为追加
89
88
  example: write2nc(r'test.nc', data, 'data', {'time': np.linspace(0, 120, 100), 'lev': np.linspace(0, 120, 50)}, 'a')
90
- '''
89
+ """
91
90
  # 判断mode是写入还是追加
92
- if mode == 'w':
91
+ if mode == "w":
93
92
  if os.path.exists(file):
94
93
  os.remove(file)
95
94
  print("Warning: File already exists. Deleting it.")
96
- elif mode == 'a':
95
+ elif mode == "a":
97
96
  if not os.path.exists(file):
98
97
  print("Warning: File doesn't exist. Creating a new file.")
99
- mode = 'w'
98
+ mode = "w"
100
99
 
101
100
  # 打开 NetCDF 文件
102
101
  with nc.Dataset(file, mode, format="NETCDF4") as ncfile:
@@ -146,65 +145,74 @@ def write2nc(file, data, varname, coords, mode):
146
145
  raise ValueError("Number of dimensions does not match the data shape.")
147
146
 
148
147
 
149
- def merge5nc(file_list, var_name, dim_name, target_filename):
148
+ def merge5nc(file_list, var_name=None, dim_name=None, target_filename=None):
150
149
  """
151
- 批量提取 nc 文件中的某一变量,按照某一维度合并后写入新的 nc 文件。
150
+ 批量提取 nc 文件中的变量,按照某一维度合并后写入新的 nc 文件。
151
+ 如果 var_name 是字符串,则认为是单变量;如果是列表,且只有一个元素,也是单变量;
152
+ 如果列表元素大于1,则是多变量;如果 var_name 是 None,则合并所有变量。
152
153
 
153
154
  参数:
154
155
  file_list:nc 文件路径列表
155
- var_name:要提取的变量名
156
+ var_name:要提取的变量名或变量名列表,默认为 None,表示提取所有变量
156
157
  dim_name:用于合并的维度名
157
158
  target_filename:合并后的目标文件名
158
- example: merge5nc(file_list, 'sst', 'time', 'merged_data.nc')
159
+
160
+ example:
161
+ merge5nc(file_list, var_name='data', dim_name='time', target_filename='merged.nc')
162
+ merge5nc(file_list, var_name=['data1', 'data2'], dim_name='time', target_filename='merged.nc')
163
+ merge5nc(file_list, var_name=None, dim_name='time', target_filename='merged.nc')
159
164
  """
160
- data_list = []
161
- for i, file in enumerate(file_list):
162
- print(f"\rReading file {i + 1}/{len(file_list)}...", end="")
163
- ds = xr.open_dataset(file)
164
- var = ds[var_name]
165
- data_list.append(var)
165
+ # 初始化变量名列表
166
+ var_names = None
167
+
168
+ # 判断 var_name 是单变量、多变量还是合并所有变量
169
+ if var_name is None:
170
+ # 获取第一个文件中的所有变量名
171
+ ds = xr.open_dataset(file_list[0])
172
+ var_names = list(ds.variables.keys())
166
173
  ds.close()
167
- print("\nMerging data...")
168
- data = xr.concat(data_list, dim=dim_name)
169
- print("Writing data to file...")
170
- if os.path.exists(target_filename):
171
- print("Warning: The target file already exists.")
172
- print("Removing existing file...")
173
- os.remove(target_filename)
174
- data.to_netcdf(target_filename)
175
-
176
-
177
- def merge5nc_vars(file_list, var_names, dim_name, target_filename):
178
- """
179
- 批量提取 nc 文件中的两个变量,按照某一维度合并后写入新的 nc 文件。
180
-
181
- 参数:
182
- file_list:nc 文件路径列表
183
- var_names:要提取的变量名列表,例如 ['u', 'v']
184
- dim_name:用于合并的维度名
185
- target_filename:合并后的目标文件名
174
+ elif isinstance(var_name, str):
175
+ var_names = [var_name]
176
+ elif isinstance(var_name, list):
177
+ var_names = var_name
178
+ else:
179
+ raise ValueError("var_name must be a string, a list of strings, or None")
180
+
181
+ # 初始化合并数据字典
182
+ merged_data = {}
186
183
 
187
- example: merge5nc_vars(file_list, ['u', 'v'], 'time', 'merged_data.nc')
188
- """
189
- data_lists = [[] for _ in var_names]
184
+ # 遍历文件列表
190
185
  for i, file in enumerate(file_list):
191
186
  print(f"\rReading file {i + 1}/{len(file_list)}...", end="")
192
187
  ds = xr.open_dataset(file)
193
- for j, var_name in enumerate(var_names):
188
+ for var_name in var_names:
194
189
  var = ds[var_name]
195
- data_lists[j].append(var)
190
+ # 如果变量包含合并维度,则合并它们
191
+ if dim_name in var.dims:
192
+ if var_name not in merged_data:
193
+ merged_data[var_name] = [var]
194
+ else:
195
+ merged_data[var_name].append(var)
196
+ # 如果变量不包含合并维度,则仅保留第一个文件中的值
197
+ else:
198
+ if var_name not in merged_data:
199
+ merged_data[var_name] = var
196
200
  ds.close()
201
+
197
202
  print("\nMerging data...")
198
- merged_data = {}
199
- for var_name, data_list in zip(var_names, data_lists):
200
- merged_data[var_name] = xr.concat(data_list, dim=dim_name)
203
+ for var_name in merged_data:
204
+ if isinstance(merged_data[var_name], list):
205
+ merged_data[var_name] = xr.concat(merged_data[var_name], dim=dim_name)
206
+
207
+ merged_data = xr.Dataset(merged_data)
208
+
201
209
  print("Writing data to file...")
202
- ds_merged = xr.Dataset(merged_data)
203
210
  if os.path.exists(target_filename):
204
211
  print("Warning: The target file already exists.")
205
212
  print("Removing existing file...")
206
213
  os.remove(target_filename)
207
- ds_merged.to_netcdf(target_filename)
214
+ merged_data.to_netcdf(target_filename)
215
+ print(f'File "{target_filename}" has been created.')
208
216
 
209
217
 
210
218
  def modify_var_value(nc_file_path, variable_name, new_value):
@@ -220,7 +228,7 @@ def modify_var_value(nc_file_path, variable_name, new_value):
220
228
  """
221
229
  try:
222
230
  # Open the NetCDF file
223
- dataset = nc.Dataset(nc_file_path, 'r+')
231
+ dataset = nc.Dataset(nc_file_path, "r+")
224
232
  # Get the variable to be modified
225
233
  variable = dataset.variables[variable_name]
226
234
  # Modify the value of the variable
@@ -243,7 +251,7 @@ def modify_var_attr(nc_file_path, variable_name, attribute_name, attribute_value
243
251
  example: modify_var_attr('test.nc', 'data', 'long_name', 'This is a test variable.')
244
252
  """
245
253
  try:
246
- ds = nc.Dataset(nc_file_path, 'r+')
254
+ ds = nc.Dataset(nc_file_path, "r+")
247
255
  if variable_name not in ds.variables:
248
256
  raise ValueError(f"Variable '{variable_name}' not found in the NetCDF file.")
249
257
 
@@ -272,7 +280,7 @@ def rename_var_or_dim(ncfile_path, old_name, new_name):
272
280
  example: rename_var_or_dim('test.nc', 'time', 'ocean_time')
273
281
  """
274
282
  try:
275
- with nc.Dataset(ncfile_path, 'r+') as dataset:
283
+ with nc.Dataset(ncfile_path, "r+") as dataset:
276
284
  # If the old name is not found as a variable or dimension, print a message
277
285
  if old_name not in dataset.variables and old_name not in dataset.dimensions:
278
286
  print(f"Variable or dimension {old_name} not found in the file.")
@@ -299,7 +307,7 @@ def check_ncfile(ncfile, if_delete=False):
299
307
  return False
300
308
 
301
309
  try:
302
- with nc.Dataset(ncfile, 'r') as f:
310
+ with nc.Dataset(ncfile, "r") as f:
303
311
  # 确保f被使用,这里我们检查文件中变量的数量
304
312
  if len(f.variables) > 0:
305
313
  return True
@@ -322,8 +330,6 @@ def check_ncfile(ncfile, if_delete=False):
322
330
  return False
323
331
 
324
332
 
325
- if __name__ == '__main__':
326
-
333
+ if __name__ == "__main__":
327
334
  data = np.random.rand(100, 50)
328
- write2nc(r'test.nc', data,
329
- 'data', {'time': np.linspace(0, 120, 100), 'lev': np.linspace(0, 120, 50)}, 'a')
335
+ write2nc(r"test.nc", data, "data", {"time": np.linspace(0, 120, 100), "lev": np.linspace(0, 120, 50)}, "a")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: oafuncs
3
- Version: 0.0.76
3
+ Version: 0.0.78
4
4
  Summary: My short description for my project.
5
5
  Home-page: https://github.com/Industry-Pays/OAFuncs
6
6
  Author: Kun Liu
@@ -9,9 +9,6 @@ License: MIT
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Programming Language :: Python
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.6
13
- Classifier: Programming Language :: Python :: 3.7
14
- Classifier: Programming Language :: Python :: 3.8
15
12
  Classifier: Programming Language :: Python :: 3.9
16
13
  Classifier: Programming Language :: Python :: 3.10
17
14
  Classifier: Programming Language :: Python :: 3.11
@@ -267,6 +264,12 @@ oafuncs.oa_nc.write2nc(r'I:\test.nc', data,
267
264
 
268
265
  - oa_file
269
266
 
267
+ - find_file
268
+
269
+ 2024/12/02更新
270
+
271
+ 查找满足条件的所有文件
272
+
270
273
  - link_file
271
274
 
272
275
  2024/10/28更新
@@ -279,9 +282,9 @@ oafuncs.oa_nc.write2nc(r'I:\test.nc', data,
279
282
 
280
283
  复制文件
281
284
 
282
- - rename_files
285
+ - rename_file
283
286
 
284
- 2024/10/28更新
287
+ 2024/12/02更新
285
288
 
286
289
  按一定规则重命名文件(可多个)
287
290
 
@@ -1,25 +1,24 @@
1
1
  oafuncs/__init__.py,sha256=2QiNjIIMtstD8y9HWlu23yiZGmmljkNUQknHEbnRwYI,673
2
- oafuncs/oa_cmap.py,sha256=iSKk4f_GsGUV3nyzgnw5SdG2c5mgAWULaO-EsMd_vF8,4981
2
+ oafuncs/oa_cmap.py,sha256=LnHI6vMCoFFkMq4P3RgItmJ01Kx5MjjwwlhnaqhRLKI,7242
3
3
  oafuncs/oa_data.py,sha256=H9qZrUziOpc456iIL-1lBwSkBPApl2rlR-ajZg-mDMs,8119
4
4
  oafuncs/oa_draw.py,sha256=K5B_otgx7Bu5P6ZYipNt9C-uRI1w9oxwY1M1F0-kGuM,17329
5
- oafuncs/oa_file.py,sha256=rUfxlks9uR5B9_TBPJFnNswfDF0lRm_ZBDUwIjYtf9U,10250
5
+ oafuncs/oa_file.py,sha256=iHgv0CTH4k_7YUnQ8-qQbLoz_f2lUmVhzGWQ2LkPFP8,11624
6
6
  oafuncs/oa_help.py,sha256=ppNktmtNzs15R20MD1bM7yImlTQ_ngMwvoIglePOKXA,1000
7
- oafuncs/oa_nc.py,sha256=ALAYfqDy5lbUNJsTU29j6ZWkM4wgqQU3p2Fxn5pkvsQ,12102
7
+ oafuncs/oa_nc.py,sha256=7Fp65BJF_PtyaaxS5PS2apA-KkkQLhqh19Xlw__8XMo,12656
8
8
  oafuncs/oa_python.py,sha256=XPTP3o7zTFzfJR_YhsKfQksa3bSYwXsne9YxlJplCEA,3994
9
- oafuncs/oa_down/User_Agent-list.txt,sha256=smLA5Xxg99VL0obpNo0tawilh4qDNvP2UK0h1Zve4ZA,878144
10
- oafuncs/oa_down/__init__.py,sha256=a6rgxHQi8spvlI-TaVEqnrDNhYsKm5_IQf7ckAZ8U4w,603
11
- oafuncs/oa_down/hycom_3hourly.py,sha256=wVJgA8SBMr0RurTz7AkI8d5pJ4sj1oWl__cnSPATiCA,50343
9
+ oafuncs/oa_down/User_Agent-list.txt,sha256=j88ML0zwVibNj484ehurfZMX-PZ7G_1TwhwpcJZMIB0,884393
10
+ oafuncs/oa_down/__init__.py,sha256=nY5X7gM1jw7DJxyooR2UJSq4difkw-flz2Ucr_OuDbA,540
11
+ oafuncs/oa_down/hycom_3hourly.py,sha256=YcLBysnU1y-qEyNLn93KoeUvjmrfe31ViDSKURilr98,52365
12
12
  oafuncs/oa_down/literature.py,sha256=dT3-7-beEzQ9mTP8LNV9Gf3q5Z1Pqqjc6FOS010HZeQ,17833
13
- oafuncs/oa_down/refs_pdf.py,sha256=lgGKO2gQ0hRjuaBYOLeBgksJB_KXYpFcXMDwMQeYVkI,18719
14
- oafuncs/oa_down/test.py,sha256=9HTGKrQ8V2YVKsvBoVsuG7W-z8BurLGFBKUuf_LP94o,8256
13
+ oafuncs/oa_down/test.py,sha256=5sm73uduL0WO1GFv66ONIDLDAFavGz5qFoQpah5PbW8,8934
15
14
  oafuncs/oa_sign/__init__.py,sha256=QKqTFrJDFK40C5uvk48GlRRbGFzO40rgkYwu6dYxatM,563
16
15
  oafuncs/oa_sign/meteorological.py,sha256=mLbupsZSq427HTfVbZMvIlFzDHwSzQAbK3X19o8anFY,6525
17
16
  oafuncs/oa_sign/ocean.py,sha256=xrW-rWD7xBWsB5PuCyEwQ1Q_RDKq2KCLz-LOONHgldU,5932
18
17
  oafuncs/oa_sign/scientific.py,sha256=a4JxOBgm9vzNZKpJ_GQIQf7cokkraV5nh23HGbmTYKw,5064
19
18
  oafuncs/oa_tool/__init__.py,sha256=IKOlqpWlb4cMDCtq2VKR_RTxQHDNqR_vfqqsOsp_lKQ,466
20
19
  oafuncs/oa_tool/email.py,sha256=4lJxV_KUzhxgLYfVwYTqp0qxRugD7fvsZkXDe5WkUKo,3052
21
- oafuncs-0.0.76.dist-info/LICENSE.txt,sha256=rMtLpVg8sKiSlwClfR9w_Dd_5WubTQgoOzE2PDFxzs4,1074
22
- oafuncs-0.0.76.dist-info/METADATA,sha256=trxZK-YWRi4peCMjXY6EwxdfPLc1Gx09fctBK2ajkzg,22531
23
- oafuncs-0.0.76.dist-info/WHEEL,sha256=pxeNX5JdtCe58PUSYP9upmc7jdRPgvT0Gm9kb1SHlVw,109
24
- oafuncs-0.0.76.dist-info/top_level.txt,sha256=bgC35QkXbN4EmPHEveg_xGIZ5i9NNPYWqtJqaKqTPsQ,8
25
- oafuncs-0.0.76.dist-info/RECORD,,
20
+ oafuncs-0.0.78.dist-info/LICENSE.txt,sha256=rMtLpVg8sKiSlwClfR9w_Dd_5WubTQgoOzE2PDFxzs4,1074
21
+ oafuncs-0.0.78.dist-info/METADATA,sha256=FIrrAy9-BXd05CDev0zlo6FtEiy3WZFYCn58hSBWiyE,22481
22
+ oafuncs-0.0.78.dist-info/WHEEL,sha256=pxeNX5JdtCe58PUSYP9upmc7jdRPgvT0Gm9kb1SHlVw,109
23
+ oafuncs-0.0.78.dist-info/top_level.txt,sha256=bgC35QkXbN4EmPHEveg_xGIZ5i9NNPYWqtJqaKqTPsQ,8
24
+ oafuncs-0.0.78.dist-info/RECORD,,