gam7 7.27.4__py3-none-any.whl → 7.28.0__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.

Potentially problematic release.


This version of gam7 might be problematic. Click here for more details.

gam/__init__.py CHANGED
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
25
25
  """
26
26
 
27
27
  __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
28
- __version__ = '7.27.04'
28
+ __version__ = '7.28.00'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -13411,12 +13411,14 @@ REPORTS_PARAMETERS_SIMPLE_TYPES = ['intValue', 'boolValue', 'datetimeValue', 'st
13411
13411
  # [skipdates <Date>[:<Date>](,<Date>[:<Date>])*] [skipdaysofweek <DayOfWeek>(,<DayOfWeek>)*]
13412
13412
  # [fields|parameters <String>)]
13413
13413
  # [convertmbtogb]
13414
+ # (addcsvdata <FieldName> <String>)*
13414
13415
  # gam report usage customer [todrive <ToDriveAttribute>*]
13415
13416
  # [([start|startdate <Date>] [end|enddate <Date>])|(range <Date> <Date>)|
13416
13417
  # thismonth|(previousmonths <Integer>)]
13417
13418
  # [skipdates <Date>[:<Date>](,<Date>[:<Date>])*] [skipdaysofweek <DayOfWeek>(,<DayOfWeek>)*]
13418
13419
  # [fields|parameters <String>)]
13419
13420
  # [convertmbtogb]
13421
+ # (addcsvdata <FieldName> <String>)*
13420
13422
  def doReportUsage():
13421
13423
  def usageEntitySelectors():
13422
13424
  selectorChoices = Cmd.USER_ENTITY_SELECTORS+Cmd.USER_CSVDATA_ENTITY_SELECTORS
@@ -13468,6 +13470,7 @@ def doReportUsage():
13468
13470
  startEndTime = StartEndTime('startdate', 'enddate', 'date')
13469
13471
  skipDayNumbers = []
13470
13472
  skipDates = set()
13473
+ addCSVData = {}
13471
13474
  while Cmd.ArgumentsRemaining():
13472
13475
  myarg = getArgument()
13473
13476
  if csvPF and myarg == 'todrive':
@@ -13522,6 +13525,9 @@ def doReportUsage():
13522
13525
  select = True
13523
13526
  elif myarg == 'convertmbtogb':
13524
13527
  convertMbToGb = True
13528
+ elif myarg == 'addcsvdata':
13529
+ k = getString(Cmd.OB_STRING)
13530
+ addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
13525
13531
  else:
13526
13532
  unknownArgumentExit()
13527
13533
  if startEndTime.endDateTime is None:
@@ -13555,6 +13561,8 @@ def doReportUsage():
13555
13561
  titles.append('orgUnitPath')
13556
13562
  else:
13557
13563
  pageMessage = None
13564
+ if addCSVData:
13565
+ titles.extend(sorted(addCSVData.keys()))
13558
13566
  csvPF.SetTitles(titles)
13559
13567
  csvPF.SetSortAllTitles()
13560
13568
  parameters = ','.join(parameters) if parameters else None
@@ -13589,6 +13597,8 @@ def doReportUsage():
13589
13597
  row['orgUnitPath'] = userOrgUnits.get(row['user'], UNKNOWN)
13590
13598
  else:
13591
13599
  row['user'] = UNKNOWN
13600
+ if addCSVData:
13601
+ row.update(addCSVData)
13592
13602
  for item in entity.get('parameters', []):
13593
13603
  if 'name' not in item:
13594
13604
  continue
@@ -13720,12 +13730,14 @@ REPORT_ACTIVITIES_TIME_OBJECTS = {'time'}
13720
13730
  # [aggregatebydate|aggregatebyuser [Boolean]]
13721
13731
  # [maxresults <Number>]
13722
13732
  # [convertmbtogb]
13733
+ # (addcsvdata <FieldName> <String>)*
13723
13734
  # gam report customers|customer|domain [todrive <ToDriveAttribute>*]
13724
13735
  # [(date <Date>)|(range <Date> <Date>)|
13725
13736
  # yesterday|today|thismonth|(previousmonths <Integer>)]
13726
13737
  # [nodatechange | (fulldatarequired all|<CustomerServiceNameList>)]
13727
13738
  # [(fields|parameters <String>)|(services <CustomerServiceNameList>)] [noauthorizedapps]
13728
13739
  # [convertmbtogb]
13740
+ # (addcsvdata <FieldName> <String>)*
13729
13741
  def doReport():
13730
13742
  def processUserUsage(usage, lastDate):
13731
13743
  if not usage:
@@ -13743,6 +13755,8 @@ def doReport():
13743
13755
  row['orgUnitPath'] = userOrgUnits.get(row['email'], UNKNOWN)
13744
13756
  else:
13745
13757
  row['email'] = UNKNOWN
13758
+ if addCSVData:
13759
+ row.update(addCSVData)
13746
13760
  for item in user_report.get('parameters', []):
13747
13761
  if 'name' not in item:
13748
13762
  continue
@@ -13834,6 +13848,8 @@ def doReport():
13834
13848
  return (False, lastDate)
13835
13849
  lastDate = usage[0]['date']
13836
13850
  row = {'date': lastDate}
13851
+ if addCSVData:
13852
+ row.update(addCSVData)
13837
13853
  for item in usage[0].get('parameters', []):
13838
13854
  if 'name' not in item:
13839
13855
  continue
@@ -13908,12 +13924,16 @@ def doReport():
13908
13924
  continue
13909
13925
  for ptype in REPORTS_PARAMETERS_SIMPLE_TYPES:
13910
13926
  if ptype in item:
13927
+ row = {'date': lastDate}
13928
+ if addCSVData:
13929
+ row.update(addCSVData)
13911
13930
  if ptype != 'datetimeValue':
13912
13931
  if convertMbToGb and name.endswith('_in_mb'):
13913
13932
  name = convertReportMBtoGB(name, item)
13914
- csvPF.WriteRow({'date': lastDate, 'name': name, 'value': item[ptype]})
13933
+ row.update({'name': name, 'value': item[ptype]})
13915
13934
  else:
13916
- csvPF.WriteRow({'date': lastDate, 'name': name, 'value': formatLocalTime(item[ptype])})
13935
+ row.update({'name': name, 'value': formatLocalTime(item[ptype])})
13936
+ csvPF.WriteRow(row)
13917
13937
  break
13918
13938
  else:
13919
13939
  if 'msgValue' in item:
@@ -13922,6 +13942,8 @@ def doReport():
13922
13942
  continue
13923
13943
  for subitem in item['msgValue']:
13924
13944
  app = {'date': lastDate}
13945
+ if addCSVData:
13946
+ app.update(addCSVData)
13925
13947
  for an_item in subitem:
13926
13948
  if an_item == 'client_name':
13927
13949
  app['name'] = f'App: {escapeCRsNLs(subitem[an_item])}'
@@ -13934,7 +13956,11 @@ def doReport():
13934
13956
  values = []
13935
13957
  for subitem in item['msgValue']:
13936
13958
  values.append(f'{subitem["version_number"]}:{subitem["num_devices"]}')
13937
- csvPF.WriteRow({'date': lastDate, 'name': name, 'value': ' '.join(sorted(values, reverse=True))})
13959
+ row = {'date': lastDate}
13960
+ if addCSVData:
13961
+ row.update(addCSVData)
13962
+ row.update({'name': name, 'value': ' '.join(sorted(values, reverse=True))})
13963
+ csvPF.WriteRow(row)
13938
13964
  else:
13939
13965
  values = []
13940
13966
  for subitem in item['msgValue']:
@@ -13949,7 +13975,11 @@ def doReport():
13949
13975
  values.append(f'{myvalue}:{mycount}')
13950
13976
  else:
13951
13977
  continue
13952
- csvPF.WriteRow({'date': lastDate, 'name': name, 'value': ' '.join(sorted(values, reverse=True))})
13978
+ row = {'date': lastDate}
13979
+ if addCSVData:
13980
+ row.update(addCSVData)
13981
+ row.update({'name': name, 'value': ' '.join(sorted(values, reverse=True))})
13982
+ csvPF.WriteRow(row)
13953
13983
  csvPF.SortRowsTwoTitles('date', 'name', False)
13954
13984
  if authorizedApps:
13955
13985
  csvPF.AddTitle('client_id')
@@ -14099,7 +14129,7 @@ def doReport():
14099
14129
  eventRowFilter = True
14100
14130
  elif activityReports and myarg == 'groupidfilter':
14101
14131
  groupIdFilter = getString(Cmd.OB_STRING)
14102
- elif activityReports and myarg == 'addcsvdata':
14132
+ elif myarg == 'addcsvdata':
14103
14133
  k = getString(Cmd.OB_STRING)
14104
14134
  addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
14105
14135
  elif activityReports and myarg == 'shownoactivities':
@@ -14164,6 +14194,8 @@ def doReport():
14164
14194
  titles = ['email'] if not showOrgUnit else ['email', 'orgUnitPath']
14165
14195
  else:
14166
14196
  titles = ['email', 'date'] if not showOrgUnit else ['email', 'orgUnitPath', 'date']
14197
+ if addCSVData:
14198
+ titles.extend(sorted(addCSVData.keys()))
14167
14199
  csvPF.SetTitles(titles)
14168
14200
  csvPF.SetSortAllTitles()
14169
14201
  i = 0
@@ -14250,6 +14282,8 @@ def doReport():
14250
14282
  if aggregateByDate:
14251
14283
  for usageDate, events in eventCounts.items():
14252
14284
  row = {'date': usageDate}
14285
+ if addCSVData:
14286
+ row.update(addCSVData)
14253
14287
  for event, count in events.items():
14254
14288
  if convertMbToGb and event.endswith('_in_gb'):
14255
14289
  count = f'{count/1024:.2f}'
@@ -14262,6 +14296,8 @@ def doReport():
14262
14296
  row = {'email': email}
14263
14297
  if showOrgUnit:
14264
14298
  row['orgUnitPath'] = userOrgUnits.get(email, UNKNOWN)
14299
+ if addCSVData:
14300
+ row.update(addCSVData)
14265
14301
  for event, count in events.items():
14266
14302
  if convertMbToGb and event.endswith('_in_gb'):
14267
14303
  count = f'{count/1024:.2f}'
@@ -14276,6 +14312,8 @@ def doReport():
14276
14312
  if startEndTime.startDateTime is None:
14277
14313
  startEndTime.startDateTime = startEndTime.endDateTime = todaysDate()
14278
14314
  csvPF.SetTitles('date')
14315
+ if addCSVData:
14316
+ csvPF.AddTitles(sorted(addCSVData.keys()))
14279
14317
  if not userCustomerRange or (startEndTime.startDateTime == startEndTime.endDateTime):
14280
14318
  csvPF.AddTitles(['name', 'value'])
14281
14319
  authorizedApps = []
@@ -24227,6 +24265,7 @@ CROS_LIST_FIELDS_CHOICE_MAP = {
24227
24265
 
24228
24266
  CROS_TIME_OBJECTS = {
24229
24267
  'createTime',
24268
+ 'extendedSupportStart',
24230
24269
  'firstEnrollmentTime',
24231
24270
  'lastDeprovisionTimestamp',
24232
24271
  'lastEnrollmentTime',
@@ -35921,7 +35960,7 @@ def doPrintShowGroupTree():
35921
35960
  # gam create cigroup <EmailAddress>
35922
35961
  # [copyfrom <GroupItem>] <GroupAttribute>
35923
35962
  # [makeowner] [alias|aliases <CIGroupAliasList>]
35924
- # [security|makesecuritygroup]
35963
+ # [security|makesecuritygroup] [locked]
35925
35964
  # [dynamic <QueryDynamicGroup>]
35926
35965
  def doCreateCIGroup():
35927
35966
  doCreateGroup(ciGroupsAPI=True)
@@ -36105,7 +36144,6 @@ def doUpdateCIGroups():
36105
36144
 
36106
36145
  cd = buildGAPIObject(API.DIRECTORY)
36107
36146
  ci = buildGAPIObject(API.CLOUDIDENTITY_GROUPS)
36108
- cib = None
36109
36147
  entityType = Ent.CLOUD_IDENTITY_GROUP
36110
36148
  csvPF = None
36111
36149
  getBeforeUpdate = preview = False
@@ -36214,7 +36252,6 @@ def doUpdateCIGroups():
36214
36252
  _, name, _ = convertGroupEmailToCloudID(ci, group, i, count)
36215
36253
  if not name:
36216
36254
  continue
36217
- cipl = ci
36218
36255
  twoUpdates = False
36219
36256
  if 'labels' in ci_body or lockGroup is not None:
36220
36257
  try:
@@ -36243,20 +36280,16 @@ def doUpdateCIGroups():
36243
36280
  else:
36244
36281
  if CIGROUP_LOCKED_LABEL in ci_body['labels']:
36245
36282
  ci_body['labels'].pop(CIGROUP_LOCKED_LABEL)
36246
- if CIGROUP_LOCKED_LABEL in ci_body['labels']:
36247
- if cib is None:
36248
- cib = buildGAPIObject(API.CLOUDIDENTITY_GROUPS_BETA)
36249
- cipl = cib
36250
36283
  if ci_body:
36251
36284
  try:
36252
36285
  if twoUpdates:
36253
36286
  ci_body['labels'].pop(CIGROUP_LOCKED_LABEL)
36254
- callGAPI(cipl.groups(), 'patch',
36287
+ callGAPI(ci.groups(), 'patch',
36255
36288
  throwReasons=GAPI.CIGROUP_UPDATE_THROW_REASONS,
36256
36289
  retryReasons=GAPI.CIGROUP_RETRY_REASONS,
36257
36290
  name=name, body=ci_body, updateMask=','.join(list(ci_body.keys())))
36258
36291
  ci_body['labels'][CIGROUP_LOCKED_LABEL] = ''
36259
- callGAPI(cipl.groups(), 'patch',
36292
+ callGAPI(ci.groups(), 'patch',
36260
36293
  throwReasons=GAPI.CIGROUP_UPDATE_THROW_REASONS,
36261
36294
  retryReasons=GAPI.CIGROUP_RETRY_REASONS,
36262
36295
  name=name, body=ci_body, updateMask=','.join(list(ci_body.keys())))
@@ -37240,20 +37273,17 @@ def doPrintCIGroups():
37240
37273
  else:
37241
37274
  getFullFieldsList = list(CIGROUP_FULL_FIELDS)
37242
37275
  getFullFields = ','.join(getFullFieldsList)#
37243
- cipl = ci
37244
37276
  if query:
37245
37277
  method = 'search'
37246
37278
  if 'parent' not in query:
37247
37279
  query += f" && parent == '{parent}'"
37248
37280
  kwargs = {'query': query}
37249
- if CIGROUP_LOCKED_LABEL in query:
37250
- cipl = buildGAPIObject(API.CLOUDIDENTITY_GROUPS_BETA)
37251
37281
  else:
37252
37282
  method = 'list'
37253
37283
  kwargs = {'parent': parent}
37254
37284
  printGettingAllAccountEntities(Ent.CLOUD_IDENTITY_GROUP, query)
37255
37285
  try:
37256
- entityList = callGAPIpages(cipl.groups(), method, 'groups',
37286
+ entityList = callGAPIpages(ci.groups(), method, 'groups',
37257
37287
  pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute=['groupKey', 'id'],
37258
37288
  throwReasons=GAPI.CIGROUP_LIST_THROW_REASONS, retryReasons=GAPI.CIGROUP_RETRY_REASONS,
37259
37289
  view='FULL', fields=fieldsnp, pageSize=pageSize, **kwargs)
@@ -49166,6 +49196,7 @@ def _getCoursesInfo(croom, courseSelectionParameters, courseShowProperties, getO
49166
49196
  # [show none|all|students|teachers] [countsonly]
49167
49197
  # [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>]
49168
49198
  # [timefilter creationtime|updatetime] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
49199
+ # (addcsvdata <FieldName> <String>)*
49169
49200
  # [showitemcountonly] [formatjson [quotechar <Character>]]
49170
49201
  def doPrintCourses():
49171
49202
  def _saveParticipants(course, participants, role, rtitles):
@@ -49209,6 +49240,7 @@ def doPrintCourses():
49209
49240
  delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
49210
49241
  showItemCountOnly = False
49211
49242
  useOwnerAccess = GC.Values[GC.USE_COURSE_OWNER_ACCESS]
49243
+ addCSVData = {}
49212
49244
  while Cmd.ArgumentsRemaining():
49213
49245
  myarg = getArgument()
49214
49246
  if myarg == 'todrive':
@@ -49223,6 +49255,9 @@ def doPrintCourses():
49223
49255
  pass
49224
49256
  elif myarg == 'showitemcountonly':
49225
49257
  showItemCountOnly = True
49258
+ elif myarg == 'addcsvdata':
49259
+ k = getString(Cmd.OB_STRING)
49260
+ addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
49226
49261
  else:
49227
49262
  FJQC.GetFormatJSONQuoteChar(myarg, True)
49228
49263
  applyCourseItemFilter = _setApplyCourseItemFilter(courseItemFilter, None)
@@ -49234,6 +49269,11 @@ def doPrintCourses():
49234
49269
  if showItemCountOnly:
49235
49270
  writeStdout('0\n')
49236
49271
  return
49272
+ if addCSVData:
49273
+ csvPF.AddTitles(sorted(addCSVData.keys()))
49274
+ if FJQC.formatJSON:
49275
+ csvPF.AddJSONTitles(sorted(addCSVData.keys()))
49276
+ csvPF.MoveJSONTitlesToEnd(['JSON'])
49237
49277
  if courseShowProperties['aliases']:
49238
49278
  if FJQC.formatJSON:
49239
49279
  csvPF.AddJSONTitles('JSON-aliases')
@@ -49291,11 +49331,15 @@ def doPrintCourses():
49291
49331
  if courseShowProperties['members'] != 'teachers':
49292
49332
  _saveParticipants(course, students, 'students', stitles)
49293
49333
  row = flattenJSON(course, timeObjects=COURSE_TIME_OBJECTS, noLenObjects=COURSE_NOLEN_OBJECTS)
49334
+ if addCSVData:
49335
+ row.update(addCSVData)
49294
49336
  if not FJQC.formatJSON:
49295
49337
  csvPF.WriteRowTitles(row)
49296
49338
  elif csvPF.CheckRowTitles(row):
49297
49339
  row = {'id': courseId, 'JSON': json.dumps(cleanJSON(course, timeObjects=COURSE_TIME_OBJECTS),
49298
49340
  ensure_ascii=False, sort_keys=True)}
49341
+ if addCSVData:
49342
+ row.update(addCSVData)
49299
49343
  if courseShowProperties['aliases']:
49300
49344
  row['JSON-aliases'] = json.dumps(list(aliases))
49301
49345
  if courseShowProperties['members'] != 'none':
gam/gamlib/glapi.py CHANGED
@@ -46,7 +46,6 @@ CLASSROOM = 'classroom'
46
46
  CLOUDCHANNEL = 'cloudchannel'
47
47
  CLOUDIDENTITY_DEVICES = 'cloudidentitydevices'
48
48
  CLOUDIDENTITY_GROUPS = 'cloudidentitygroups'
49
- CLOUDIDENTITY_GROUPS_BETA = 'cloudidentitygroupsbeta'
50
49
  CLOUDIDENTITY_INBOUND_SSO = 'cloudidentityinboundsso'
51
50
  CLOUDIDENTITY_ORGUNITS = 'cloudidentityorgunits'
52
51
  CLOUDIDENTITY_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
@@ -242,7 +241,6 @@ _INFO = {
242
241
  CLOUDCHANNEL: {'name': 'Cloud Channel API', 'version': 'v1', 'v2discovery': True},
243
242
  CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity API - Devices', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
244
243
  CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity API - Groups', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
245
- CLOUDIDENTITY_GROUPS_BETA: {'name': 'Cloud Identity API - Groups Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
246
244
  CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity API - Inbound SSO Settings', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
247
245
  CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity API - OrgUnits', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
248
246
  CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity API - OrgUnits Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
@@ -387,10 +385,6 @@ _CLIENT_SCOPES = [
387
385
  'api': CLOUDIDENTITY_GROUPS,
388
386
  'subscopes': READONLY,
389
387
  'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
390
- {'name': 'Cloud Identity API - Groups Beta (Enables group locking/unlocking)',
391
- 'api': CLOUDIDENTITY_GROUPS_BETA,
392
- 'subscopes': [],
393
- 'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
394
388
  {'name': 'Cloud Identity API - Inbound SSO Settings',
395
389
  'api': CLOUDIDENTITY_INBOUND_SSO,
396
390
  'subscopes': READONLY,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.27.4
3
+ Version: 7.28.0
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,4 +1,4 @@
1
- gam/__init__.py,sha256=ezWRtUli0pIMM9dMgTN_FzHCzS5NalnUjOQRio_zJmo,3629588
1
+ gam/__init__.py,sha256=Pvf8RhfAqdaC0TBrQ2wCZfBCcJdcCgMPHcMNyULxFPE,3630867
2
2
  gam/__main__.py,sha256=VwEYS7a9vYQPbT6iLduMOoVUJ6p4R-HZgerZQmM1NpE,1307
3
3
  gam/cacerts.pem,sha256=DUsVo2XlFYwfkhe3gnxa-Km4Z4noz74hSApXwTT-nQE,44344
4
4
  gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
@@ -22,7 +22,7 @@ gam/atom/token_store.py,sha256=7E6Ecvxa86WCvl1pJAhv78jg9OxQv8pMtIUcPhZCq04,3803
22
22
  gam/atom/url.py,sha256=pxO1TlORxyKQTQ1bkBE1unFzjnv9c8LjJkm-UEORShY,4276
23
23
  gam/gamlib/__init__.py,sha256=z5mF-y0j8pm-YNFBaiuxB4M_GAUPG-cXWwrhYwrVReM,679
24
24
  gam/gamlib/glaction.py,sha256=1Il_HrChVnPkzZwiZs5au4mFQVtq4K1Z42uIuR6qdnI,9419
25
- gam/gamlib/glapi.py,sha256=g49VStWE64nCdrpNIMl60U06m98d3AGO8-vUDxgcBog,37048
25
+ gam/gamlib/glapi.py,sha256=t2ivDXJg4kH0SbdUJNdJH7IZG0uGEUz9gFuU3ri8CpQ,36638
26
26
  gam/gamlib/glcfg.py,sha256=do_FR9m9m7Bmh2SgjLPk2pysU-wPHt7PlqPPjX90tpw,28684
27
27
  gam/gamlib/glclargs.py,sha256=LlTtwJJHqU48l7SQT4bcZCWlw3Y46g42Bn1ACGW8gIk,53307
28
28
  gam/gamlib/glentity.py,sha256=KWFomkoNE6lLE83zVqVIlJ2rkzfLkhEasW1M0TWGieA,35373
@@ -47,8 +47,8 @@ gam/gdata/apps/audit/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrK
47
47
  gam/gdata/apps/audit/service.py,sha256=Z1eueThcNeVUMWP1DRWc_DGHrJCiJI8W_xj6L-cqu-Q,9658
48
48
  gam/gdata/apps/contacts/__init__.py,sha256=Um6zgIkiahZns7yAEuC3pxHSMD8iciZ_EoynSLoYPfU,30463
49
49
  gam/gdata/apps/contacts/service.py,sha256=5lNb-Ii1Gyek6ePFji3kyoYtCBc8CuJTwagx2BL2o14,15684
50
- gam7-7.27.4.dist-info/METADATA,sha256=xxXl0dxVoU3Qr_D_k38_AeeyLfP0smoiVPSFbIcSpzs,3093
51
- gam7-7.27.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
- gam7-7.27.4.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
- gam7-7.27.4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
- gam7-7.27.4.dist-info/RECORD,,
50
+ gam7-7.28.0.dist-info/METADATA,sha256=6__1Zip1BIpmCYvLD2z3bY6ZEm8geD8qeTv_f_32StM,3093
51
+ gam7-7.28.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
+ gam7-7.28.0.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
+ gam7-7.28.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
+ gam7-7.28.0.dist-info/RECORD,,
File without changes