rda-python-metrics 1.0.18__tar.gz → 1.0.20__tar.gz

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.

Potentially problematic release.


This version of rda-python-metrics might be problematic. Click here for more details.

Files changed (59) hide show
  1. {rda_python_metrics-1.0.18/src/rda_python_metrics.egg-info → rda_python_metrics-1.0.20}/PKG-INFO +1 -1
  2. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/pyproject.toml +1 -1
  3. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/PgIPInfo.py +47 -20
  4. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillcdgusage.py +7 -39
  5. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillipinfo.py +4 -23
  6. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewallusage.usg +1 -1
  7. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewtdsusage.usg +1 -1
  8. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20/src/rda_python_metrics.egg-info}/PKG-INFO +1 -1
  9. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/LICENSE +0 -0
  10. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/MANIFEST.in +0 -0
  11. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/README.md +0 -0
  12. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/setup.cfg +0 -0
  13. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/PgView.py +0 -0
  14. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/__init__.py +0 -0
  15. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillawsusage.py +0 -0
  16. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillawsusage.usg +0 -0
  17. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillcdgusage.usg +0 -0
  18. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillcodusage.py +0 -0
  19. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillcodusage.usg +0 -0
  20. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillcountry.py +0 -0
  21. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillendtime.py +0 -0
  22. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillglobususage.py +0 -0
  23. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillglobususage.usg +0 -0
  24. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillipinfo.usg +0 -0
  25. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/filloneorder.py +0 -0
  26. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/filloneorder.usg +0 -0
  27. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillosdfusage.py +0 -0
  28. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillosdfusage.usg +0 -0
  29. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillrdadb.py +0 -0
  30. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/fillrdadb.usg +0 -0
  31. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/filltdsusage.py +0 -0
  32. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/filltdsusage.usg +0 -0
  33. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/filluser.py +0 -0
  34. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/filluser.usg +0 -0
  35. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/logarch.py +0 -0
  36. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/logarch.usg +0 -0
  37. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/pgperson.py +0 -0
  38. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/pgsyspath.py +0 -0
  39. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/pgusername.py +0 -0
  40. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewallusage.py +0 -0
  41. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewcheckusage.py +0 -0
  42. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewcheckusage.usg +0 -0
  43. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewcodusage.py +0 -0
  44. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewcodusage.usg +0 -0
  45. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewordusage.py +0 -0
  46. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewordusage.usg +0 -0
  47. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewrqstusage.py +0 -0
  48. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewrqstusage.usg +0 -0
  49. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewtdsusage.py +0 -0
  50. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewwebfile.py +0 -0
  51. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewwebfile.usg +0 -0
  52. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewwebusage.py +0 -0
  53. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics/viewwebusage.usg +0 -0
  54. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics.egg-info/SOURCES.txt +0 -0
  55. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics.egg-info/dependency_links.txt +0 -0
  56. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics.egg-info/entry_points.txt +0 -0
  57. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics.egg-info/requires.txt +0 -0
  58. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/src/rda_python_metrics.egg-info/top_level.txt +0 -0
  59. {rda_python_metrics-1.0.18 → rda_python_metrics-1.0.20}/tests/test_metrics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rda_python_metrics
3
- Version: 1.0.18
3
+ Version: 1.0.20
4
4
  Summary: RDA Python Package to gather and view data usage metrics
5
5
  Author-email: Zaihua Ji <zji@ucar.edu>
6
6
  Project-URL: Homepage, https://github.com/NCAR/rda-python-metrics
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "rda_python_metrics"
9
- version = "1.0.18"
9
+ version = "1.0.20"
10
10
  authors = [
11
11
  { name="Zaihua Ji", email="zji@ucar.edu" },
12
12
  ]
@@ -13,6 +13,7 @@
13
13
  #
14
14
  ###############################################################################
15
15
  #
16
+ import re
16
17
  import geoip2.database as geodb
17
18
  import ipinfo
18
19
  import socket
@@ -54,8 +55,6 @@ def dns_to_ip(dmname, type = 'A'):
54
55
 
55
56
  ipdns = get_dns_resolver()
56
57
 
57
- result = []
58
-
59
58
  try:
60
59
  answers = ipdns.resolve(dmname, type)
61
60
  return [str(rdata) for rdata in answers]
@@ -113,14 +112,11 @@ def get_ipinfo_record(ip):
113
112
  if not IPDB: set_ipinfo_database()
114
113
  try:
115
114
  iprec = IPDB.getDetails(ip).all
116
- if 'hostname' not in iprec:
117
- PgLOG.pglog("ipinfo: {} - ip address is not in the database".format(ip), PgLOG.LOGERR)
118
- return None
119
115
  except Exception as e:
120
116
  PgLOG.pglog("ipinfo: {} - {}".format(ip, str(e)), PgLOG.LOGWRN)
121
117
  return None
122
118
 
123
- record = {'ip' : ip, 'stat_flag' : 'A', 'hostname' : ip}
119
+ record = {'ip' : ip, 'stat_flag' : 'A', 'hostname' : ip, 'org_type' : '-'}
124
120
  if 'hostname' in iprec:
125
121
  record['hostname'] = iprec['hostname']
126
122
  record['org_type'] = PgDBI.get_org_type(None, record['hostname'])
@@ -128,7 +124,7 @@ def get_ipinfo_record(ip):
128
124
  record['lon'] = float(iprec['longitude']) if iprec['longitude'] else 0
129
125
  if 'org' in iprec: record['org_name'] = iprec['org']
130
126
  record['country'] = get_country_record_code(iprec, 'country_name')
131
- if 'region' in iprec: record['region'] = PgLOG.convert_chars(iprec['region'])
127
+ record['region'] = PgLOG.convert_chars(iprec['region']) if 'region' in iprec else None
132
128
  if 'city' in iprec: record['city'] = PgLOG.convert_chars(iprec['city'])
133
129
  if 'postal' in iprec: record['postal'] = iprec['postal']
134
130
  record['timezone'] = iprec['timezone']
@@ -156,17 +152,16 @@ def get_geoip2_record(ip):
156
152
  PgLOG.pglog("geoip2: {} - {}".format(ip, str(e)), PgLOG.LOGWRN)
157
153
  return None
158
154
 
159
- record = {'ip' : ip, 'stat_flag' : 'M'}
155
+ record = {'ip' : ip, 'stat_flag' : 'M', 'org_type' : '-'}
160
156
  record['lat'] = float(city.location.latitude) if city.location.latitude else 0
161
157
  record['lon'] = float(city.location.longitude) if city.location.longitude else 0
162
158
  record['country'] = get_country_name_code(city.country.name)
163
159
  record['city'] = PgLOG.convert_chars(city.city.name)
164
- if city.subdivisions.most_specific.name: record['region'] = PgLOG.convert_chars(city.subdivisions.most_specific.name)
160
+ record['region'] = PgLOG.convert_chars(city.subdivisions.most_specific.name) if city.subdivisions.most_specific.name else None
165
161
  record['postal'] = city.postal.code
166
162
  record['timezone'] = city.location.time_zone
167
163
  record['hostname'] = ip
168
- record['org_type'] = '-'
169
- record['ipinfo'] = json.dumps(city.__dict__)
164
+ record['ipinfo'] = json.dumps(object_to_dict(city))
170
165
 
171
166
  try:
172
167
  hostrec = socket.gethostbyaddr(ip)
@@ -178,6 +173,20 @@ def get_geoip2_record(ip):
178
173
 
179
174
  return record
180
175
 
176
+ #
177
+ # change an object to dict recursively
178
+ #
179
+ def object_to_dict(obj):
180
+ if hasattr(obj, "__dict__"):
181
+ result = {}
182
+ for key, value in obj.__dict__.items():
183
+ result[key] = object_to_dict(value)
184
+ return result
185
+ elif isinstance(obj, list):
186
+ return [object_to_dict(item) for item in obj]
187
+ else:
188
+ return obj
189
+
181
190
  #
182
191
  # update wuser.email for hostname changed
183
192
  #
@@ -237,17 +246,36 @@ def get_update_record(nrec, orec):
237
246
  record[fld] = nrec[fld]
238
247
  return record
239
248
 
240
- # return wuser record upon success, None otherwise
241
- def get_wuser_record(ip, date):
249
+ #
250
+ # fill the missing info for given ip
251
+ #
252
+ def get_missing_ipinfo(ip, email = None):
253
+
254
+ if not ip:
255
+ if email and '@' in email: ip = dns_to_ip(email.split('@')[1])
256
+ if not ip: return None
242
257
 
243
258
  ipinfo = set_ipinfo(ip)
244
- if not ipinfo: return None
259
+ if ipinfo:
260
+ record = {'org_type' : ipinfo['org_type'],
261
+ 'country' : ipinfo['country'],
262
+ 'region' : ipinfo['region']}
263
+ if not email or re.search(r'-$', email):
264
+ record['email'] = 'unknown@' + ipinfo['hostname']
265
+ else:
266
+ record['email'] = email
267
+ return record
268
+ else:
269
+ return None
270
+
271
+
272
+ # return wuser record upon success, None otherwise
273
+ def get_wuser_record(ip, date, email = None):
274
+
275
+ record = get_missing_ipinfo(ip, email)
276
+ if not record: return None
245
277
 
246
- record = {'org_type' : ipinfo['org_type'],
247
- 'country' : ipinfo['country'],
248
- 'region' : ipinfo['region']}
249
- email = 'unknown@' + ipinfo['hostname']
250
- emcond = "email = '{}'".format(email)
278
+ emcond = "email = '{}'".format(record['email'])
251
279
  flds = 'wuid, email, org_type, country, region, start_date'
252
280
  pgrec = PgDBI.pgget("wuser", flds, emcond, PgLOG.LOGERR)
253
281
  if pgrec:
@@ -257,7 +285,6 @@ def get_wuser_record(ip, date):
257
285
  return pgrec
258
286
 
259
287
  # now add one in
260
- record['email'] = email
261
288
  record['stat_flag'] = 'A'
262
289
  record['start_date'] = date
263
290
  wuid = PgDBI.pgadd("wuser", record, PgLOG.LOGERR|PgLOG.AUTOID)
@@ -72,7 +72,6 @@ DSIDS = {
72
72
  ALLIDS = list(DSIDS.keys())
73
73
 
74
74
  WFILES = {}
75
- WUSERS = {}
76
75
 
77
76
  #
78
77
  # main function to run this program
@@ -276,12 +275,12 @@ def fill_cdg_usages(dsids, dranges):
276
275
  trecs[tkey]['size'] += dsize
277
276
  trecs[tkey]['fcount'] += 1
278
277
  else:
279
- wurec = get_wuser_record(ip, cdate)
280
- if not wurec: continue
278
+ iprec = PgIPInfo.get_missing_ipinfo(ip)
279
+ if not iprec: continue
281
280
  trecs[tkey] = {'ip' : ip, 'dsid' : dsid, 'date' : cdate, 'time' : time, 'quarter' : quarter,
282
281
  'size' : dsize, 'fcount' : 1, 'method' : method, 'etype' : etype,
283
- 'engine' : engine, 'org_type' : wurec['org_type'], 'country' : wurec['country'],
284
- 'email' : wurec['email']}
282
+ 'engine' : engine, 'org_type' : iprec['org_type'], 'country' : iprec['country'],
283
+ 'region' : iprec['region'], 'email' : iprec['email']}
285
284
  else:
286
285
  # web usage
287
286
  fsize = pgrec['dataset_file_size']
@@ -347,6 +346,7 @@ def add_tds_allusage(year, logrec):
347
346
  pgrec['email'] = logrec['email']
348
347
  pgrec['org_type'] = logrec['org_type']
349
348
  pgrec['country'] = logrec['country']
349
+ pgrec['region'] = logrec['region']
350
350
  pgrec['dsid'] = logrec['dsid']
351
351
  pgrec['date'] = logrec['date']
352
352
  pgrec['quarter'] = logrec['quarter']
@@ -367,7 +367,7 @@ def add_webfile_usage(year, logrec):
367
367
  cond = "wid = {} AND method = '{}' AND date_read = '{}' AND time_read = '{}'".format(logrec['wid'], logrec['method'], cdate, logrec['time'])
368
368
  if PgDBI.pgget(table, "", cond, PgLOG.LOGWRN): return 0
369
369
 
370
- wurec = get_wuser_record(ip, cdate)
370
+ wurec = PgIPInfo.get_wuser_record(ip, cdate)
371
371
  if not wurec: return 0
372
372
 
373
373
  record = {'wid' : logrec['wid'], 'dsid' : logrec['dsid']}
@@ -391,6 +391,7 @@ def add_web_allusage(year, logrec, wurec):
391
391
  pgrec['email'] = wurec['email']
392
392
  pgrec['org_type'] = wurec['org_type']
393
393
  pgrec['country'] = wurec['country']
394
+ pgrec['region'] = wurec['region']
394
395
  pgrec['dsid'] = logrec['dsid']
395
396
  pgrec['date'] = logrec['date']
396
397
  pgrec['quarter'] = logrec['quarter']
@@ -431,39 +432,6 @@ def get_wfile_record(dsids, wfile):
431
432
  WFILES[wkey] = pgrec
432
433
  return pgrec
433
434
 
434
- # return wuser record upon success, None otherwise
435
- def get_wuser_record(ip, date = None):
436
-
437
- if ip in WUSERS: return WUSERS[ip]
438
-
439
- ipinfo = PgIPInfo.set_ipinfo(ip)
440
- if not ipinfo: return None
441
-
442
- record = {'org_type' : ipinfo['org_type'], 'country' : ipinfo['country']}
443
- email = 'unknown@' + ipinfo['hostname']
444
- emcond = "email = '{}'".format(email)
445
- flds = 'wuid, email, org_type, country, start_date'
446
- pgrec = PgDBI.pgget("wuser", flds, emcond, PgLOG.LOGERR)
447
- if pgrec:
448
- if date and PgUtil.diffdate(pgrec['start_date'], date) > 0:
449
- pgrec['start_date'] = record['start_date'] = date
450
- PgDBI.pgupdt('wuser', record, emcond)
451
- WUSERS[ip] = pgrec
452
- return pgrec
453
-
454
- # now add one in
455
- record['email'] = email
456
- record['stat_flag'] = 'A'
457
- record['start_date'] = date
458
- wuid = PgDBI.pgadd("wuser", record, PgLOG.LOGERR|PgLOG.AUTOID)
459
- if wuid:
460
- record['wuid'] = wuid
461
- PgLOG.pglog("{} Added as wuid({})".format(email, wuid), PgLOG.LGWNEM)
462
- WUSERS[ip] = record
463
- return record
464
-
465
- return None
466
-
467
435
  #
468
436
  # call main() to start program
469
437
  #
@@ -126,7 +126,7 @@ def fix_allusage_records(date):
126
126
  cnt = len(pgrecs['ip']) if pgrecs else 0
127
127
  mcnt = 0
128
128
  for i in range(cnt):
129
- record = get_missing_info(pgrecs['ip'][i], pgrecs['email'][i])
129
+ record = PgIPInfo.get_missing_ipinfo(pgrecs['ip'][i], pgrecs['email'][i])
130
130
  if record:
131
131
  mcnt += PgDBI.pgupdt(table, record, "aidx = '{}'".format(pgrecs['aidx'][i]))
132
132
 
@@ -145,7 +145,7 @@ def fix_tdsusage_records(date):
145
145
  mcnt = 0
146
146
  for i in range(cnt):
147
147
  ip = pgrecs['ip'][i]
148
- record = get_missing_info(ip, pgrecs['email'][i])
148
+ record = PgIPInfo.get_missing_ipinfo(ip, pgrecs['email'][i])
149
149
  if record:
150
150
  cond = "date = '{}' AND time = '{}' AND ip = '{}'".format(date, pgrecs['time'][i], ip)
151
151
  mcnt += PgDBI.pgupdt(table, record, cond)
@@ -164,7 +164,7 @@ def fix_codusage_records(date):
164
164
  cnt = len(pgrecs['ip']) if pgrecs else 0
165
165
  mcnt = 0
166
166
  for i in range(cnt):
167
- record = get_missing_info(pgrecs['ip'][i], pgrecs['email'][i])
167
+ record = PgIPInfo.get_missing_ipinfo(pgrecs['ip'][i], pgrecs['email'][i])
168
168
  if record:
169
169
  mcnt += PgDBI.pgupdt(table, record, "codidx = '{}'".format(pgrecs['codidx'][i]))
170
170
 
@@ -184,10 +184,7 @@ def fix_wuser_records(date):
184
184
  for i in range(cnt):
185
185
  ip = pgrecs['ip'][i]
186
186
  email = pgrecs['email'][i]
187
- if not ip:
188
- if email and '@' in email: ip = PgIPInfo.dns_to_ip(email.split('@')[1])
189
- if not ip: continue
190
- record = get_missing_info(ip, email)
187
+ record = PgIPInfo.get_missing_ipinfo(ip, email)
191
188
  if record:
192
189
  mcnt += PgDBI.pgupdt(table, record, "wuid = '{}'".format(pgrecs['wuid'][i]))
193
190
 
@@ -213,22 +210,6 @@ def fix_ipinfo_records(date):
213
210
 
214
211
  return mcnt
215
212
 
216
- #
217
- # fill the missing info for given ip
218
- #
219
- def get_missing_info(ip, email):
220
-
221
- ipinfo = PgIPInfo.set_ipinfo(ip)
222
- if ipinfo:
223
- record = {'org_type' : ipinfo['org_type'],
224
- 'country' : ipinfo['country'],
225
- 'region' : ipinfo['region']}
226
- if not email or re.search(r'-$', email):
227
- record['email'] = 'unknown@' + ipinfo['hostname']
228
- return record
229
- else:
230
- return None
231
-
232
213
  #
233
214
  # call main() to start program
234
215
  #
@@ -6,7 +6,7 @@
6
6
  [-A RowLimit] [-c CountryCodes] [-d DateList] \
7
7
  [-D StartDate [EndDate]] [-e EMailList] -h \
8
8
  [-E StartNoticeDate [EndNoticeDate]] [-f DataFormats] \
9
- [-g SourceGroups] [-I EmailIDList] [-k RegionLost] \
9
+ [-g SourceGroups] [-I EmailIDList] [-k RegionList] \
10
10
  [-m MonthList] [-M MethodList] [-N MinNumberRead [MaxNumberRead]] \
11
11
  [-o OrganizationTypes] [-q QuaterList] [-s MinSize [MaxSize]] \
12
12
  [-S SpecialistLoginNames] [-t DatasetList] \
@@ -7,7 +7,7 @@
7
7
  [-D StartDate [EndDate]] [-e EMailList] -h \
8
8
  [-E StartNoticeDate [EndNoticeDate]] \
9
9
  [-f EndTypeFlags] [-i IPAddresses] [-I EmailIDList] \
10
- [-RegionNamess] [-m MonthList] [-M AccessMethods] \
10
+ [-k RegionNames] [-m MonthList] [-M AccessMethods] \
11
11
  [-N MinNumberRead [MaxNumberRead]] \
12
12
  [-o OrganizationTypes] \
13
13
  [-q QuaterList] [-s MinSize [MaxSize]] \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rda_python_metrics
3
- Version: 1.0.18
3
+ Version: 1.0.20
4
4
  Summary: RDA Python Package to gather and view data usage metrics
5
5
  Author-email: Zaihua Ji <zji@ucar.edu>
6
6
  Project-URL: Homepage, https://github.com/NCAR/rda-python-metrics