gam7 7.5.15__tar.gz → 7.5.16__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 gam7 might be problematic. Click here for more details.

Files changed (107) hide show
  1. {gam7-7.5.15 → gam7-7.5.16}/PKG-INFO +1 -1
  2. {gam7-7.5.15 → gam7-7.5.16}/src/GamCommands.txt +3 -3
  3. {gam7-7.5.15 → gam7-7.5.16}/src/GamUpdate.txt +7 -1
  4. {gam7-7.5.15 → gam7-7.5.16}/src/gam/__init__.py +22 -3
  5. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glglobals.py +3 -0
  6. {gam7-7.5.15 → gam7-7.5.16}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  7. {gam7-7.5.15 → gam7-7.5.16}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  8. {gam7-7.5.15 → gam7-7.5.16}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  9. {gam7-7.5.15 → gam7-7.5.16}/.github/ISSUE_TEMPLATE.txt +0 -0
  10. {gam7-7.5.15 → gam7-7.5.16}/.github/actions/creds.tar.xz.gpg +0 -0
  11. {gam7-7.5.15 → gam7-7.5.16}/.github/actions/decrypt.sh +0 -0
  12. {gam7-7.5.15 → gam7-7.5.16}/.github/actions/entitlements.plist +0 -0
  13. {gam7-7.5.15 → gam7-7.5.16}/.github/actions/package_exclusions.txt +0 -0
  14. {gam7-7.5.15 → gam7-7.5.16}/.github/stale.yml +0 -0
  15. {gam7-7.5.15 → gam7-7.5.16}/.github/workflows/build.yml +0 -0
  16. {gam7-7.5.15 → gam7-7.5.16}/.github/workflows/codeql-analysis.yml +0 -0
  17. {gam7-7.5.15 → gam7-7.5.16}/.github/workflows/get-cacerts.yml +0 -0
  18. {gam7-7.5.15 → gam7-7.5.16}/.github/workflows/pypi.yml +0 -0
  19. {gam7-7.5.15 → gam7-7.5.16}/.pre-commit-config.yaml +0 -0
  20. {gam7-7.5.15 → gam7-7.5.16}/LICENSE +0 -0
  21. {gam7-7.5.15 → gam7-7.5.16}/README.md +0 -0
  22. {gam7-7.5.15 → gam7-7.5.16}/pyproject.toml +0 -0
  23. {gam7-7.5.15 → gam7-7.5.16}/src/.gitignore +0 -0
  24. {gam7-7.5.15 → gam7-7.5.16}/src/LICENSE +0 -0
  25. {gam7-7.5.15 → gam7-7.5.16}/src/cacerts.pem +0 -0
  26. {gam7-7.5.15 → gam7-7.5.16}/src/callgam.py +0 -0
  27. {gam7-7.5.15 → gam7-7.5.16}/src/gam/__main__.py +0 -0
  28. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/__init__.py +0 -0
  29. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/auth.py +0 -0
  30. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/client.py +0 -0
  31. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/core.py +0 -0
  32. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/data.py +0 -0
  33. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/http.py +0 -0
  34. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/http_core.py +0 -0
  35. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/http_interface.py +0 -0
  36. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/mock_http.py +0 -0
  37. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/mock_http_core.py +0 -0
  38. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/mock_service.py +0 -0
  39. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/service.py +0 -0
  40. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/token_store.py +0 -0
  41. {gam7-7.5.15 → gam7-7.5.16}/src/gam/atom/url.py +0 -0
  42. {gam7-7.5.15 → gam7-7.5.16}/src/gam/cacerts.pem +0 -0
  43. {gam7-7.5.15 → gam7-7.5.16}/src/gam/cbcm-v1.1beta1.json +0 -0
  44. {gam7-7.5.15 → gam7-7.5.16}/src/gam/contactdelegation-v1.json +0 -0
  45. {gam7-7.5.15 → gam7-7.5.16}/src/gam/datastudio-v1.json +0 -0
  46. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/__init__.py +0 -0
  47. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glaction.py +0 -0
  48. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glapi.py +0 -0
  49. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glcfg.py +0 -0
  50. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glclargs.py +0 -0
  51. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glentity.py +0 -0
  52. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glgapi.py +0 -0
  53. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glgdata.py +0 -0
  54. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glindent.py +0 -0
  55. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glmsgs.py +0 -0
  56. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glskus.py +0 -0
  57. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/gluprop.py +0 -0
  58. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/glverlibs.py +0 -0
  59. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gamlib/yubikey.py +0 -0
  60. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/__init__.py +0 -0
  61. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/alt/__init__.py +0 -0
  62. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/alt/app_engine.py +0 -0
  63. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/alt/appengine.py +0 -0
  64. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/apps/__init__.py +0 -0
  65. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/apps/audit/__init__.py +0 -0
  66. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/apps/audit/service.py +0 -0
  67. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  68. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/apps/contacts/service.py +0 -0
  69. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/apps/service.py +0 -0
  70. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/service.py +0 -0
  71. {gam7-7.5.15 → gam7-7.5.16}/src/gam/gdata/urlfetch.py +0 -0
  72. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/__init__.py +0 -0
  73. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/_auth.py +0 -0
  74. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/_helpers.py +0 -0
  75. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/channel.py +0 -0
  76. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/discovery.py +0 -0
  77. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  78. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  79. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  80. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  81. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/errors.py +0 -0
  82. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/http.py +0 -0
  83. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/mimeparse.py +0 -0
  84. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/model.py +0 -0
  85. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/schema.py +0 -0
  86. {gam7-7.5.15 → gam7-7.5.16}/src/gam/googleapiclient/version.py +0 -0
  87. {gam7-7.5.15 → gam7-7.5.16}/src/gam/iso8601/__init__.py +0 -0
  88. {gam7-7.5.15 → gam7-7.5.16}/src/gam/iso8601/iso8601.py +0 -0
  89. {gam7-7.5.15 → gam7-7.5.16}/src/gam/meet-v2beta.json +0 -0
  90. {gam7-7.5.15 → gam7-7.5.16}/src/gam/serviceaccountlookup-v1.json +0 -0
  91. {gam7-7.5.15 → gam7-7.5.16}/src/gam/six.py +0 -0
  92. {gam7-7.5.15 → gam7-7.5.16}/src/gam-install.sh +0 -0
  93. {gam7-7.5.15 → gam7-7.5.16}/src/gam-setup.bat +0 -0
  94. {gam7-7.5.15 → gam7-7.5.16}/src/gam.exe.manifest +0 -0
  95. {gam7-7.5.15 → gam7-7.5.16}/src/gam.py +0 -0
  96. {gam7-7.5.15 → gam7-7.5.16}/src/gam.spec +0 -0
  97. {gam7-7.5.15 → gam7-7.5.16}/src/gam.wxs +0 -0
  98. {gam7-7.5.15 → gam7-7.5.16}/src/license.rtf +0 -0
  99. {gam7-7.5.15 → gam7-7.5.16}/src/requirements-dev.txt +0 -0
  100. {gam7-7.5.15 → gam7-7.5.16}/src/requirements.txt +0 -0
  101. {gam7-7.5.15 → gam7-7.5.16}/src/setup.cfg +0 -0
  102. {gam7-7.5.15 → gam7-7.5.16}/src/setup.py +0 -0
  103. {gam7-7.5.15 → gam7-7.5.16}/src/tools/a_atleast_b.py +0 -0
  104. {gam7-7.5.15 → gam7-7.5.16}/src/tools/gen-wix-xml-filelist.py +0 -0
  105. {gam7-7.5.15 → gam7-7.5.16}/src/tools/mkGamRef.py +0 -0
  106. {gam7-7.5.15 → gam7-7.5.16}/src/tools/openssl.props +0 -0
  107. {gam7-7.5.15 → gam7-7.5.16}/src/version_info.txt.in +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.5.15
3
+ Version: 7.5.16
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
@@ -102,7 +102,7 @@ If an item contains spaces, it should be surrounded by ".
102
102
  banana|basil|blueberry|flamingo|graphite|grape|
103
103
  lavender|peacock|sage|tangerine|tomato
104
104
  <FileFormat> ::=
105
- csv|doc|dot|docx|dotx|epub|html|jpeg|jpg|mht|odp|ods|odt|
105
+ csv|doc|dot|docx|dotx|epub|html|jpeg|jpg|json|mht|odp|ods|odt|
106
106
  pdf|png|ppt|pot|potx|pptx|rtf|svg|tsv|txt|xls|xlt|xlsx|xltx|zip|
107
107
  ms|microsoft|openoffice|
108
108
  <LabelColorHex> ::=
@@ -1276,8 +1276,8 @@ If the pattern {{Section}} appears in <FileName>, it will be replaced with the n
1276
1276
  For redirect csv, the optional arguments must appear in the order shown.
1277
1277
  <Redirect> ::=
1278
1278
  redirect csv <FileName> [multiprocess] [append] [noheader] [charset <Charset>]
1279
- [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
1280
- [sortheaders <StringList>] [timestampcolumn <String>]
1279
+ [columndelimiter <Character>] [noescapechar [<Boolean>]] [quotechar <Character>]
1280
+ [sortheaders <StringList>] [timestampcolumn <String>] [transpose [<Bopolean>]]
1281
1281
  [todrive <ToDriveAttribute>*] |
1282
1282
  redirect stdout <FileName> [multiprocess] [append] |
1283
1283
  redirect stdout null [multiprocess] |
@@ -1,7 +1,13 @@
1
+ 7.05.16
2
+
3
+ Added option `transpose [<Boolean>]` to `redirect csv` that causes
4
+ GAM to transpose CSV output rows and columns. This will most useful
5
+ when a `countsonly` option is used in a `print` or `report` command.
6
+
1
7
  7.05.15
2
8
 
3
9
  Updated `gam <UserTypeEntity> get drivefile` and `gam <UserTypeEntity> create drivefile`
4
- to allow downloading and uploading of Google App Scripts.
10
+ to allow downloading and uploading of Google Apps Scripts.
5
11
  ```
6
12
  $ gam user user1@domain.com get drivefile 1ZY-YkS3E0OKipALra_XzfIh9cvxoILSbb8TRdHBFCpyB_mXI_J8FmjHv format json
7
13
  User: user1@domain.com, Download 1 Drive File
@@ -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.05.15'
28
+ __version__ = '7.05.16'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -4113,8 +4113,8 @@ def SetGlobalVariables():
4113
4113
  if checkArgumentPresent(Cmd.MULTIPROCESSEXIT_CMD):
4114
4114
  _setMultiprocessExit()
4115
4115
  # redirect csv <FileName> [multiprocess] [append] [noheader] [charset <CharSet>]
4116
- # [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]]
4117
- # [sortheaders <StringList>] [timestampcolumn <String>]
4116
+ # [columndelimiter <Character>] [noescapechar [<Boolean>]] [quotechar <Character>]]
4117
+ # [sortheaders <StringList>] [timestampcolumn <String>] [transpose [<Boolean>]]
4118
4118
  # [todrive <ToDriveAttribute>*]
4119
4119
  # redirect stdout <FileName> [multiprocess] [append]
4120
4120
  # redirect stdout null
@@ -4139,6 +4139,8 @@ def SetGlobalVariables():
4139
4139
  GM.Globals[GM.CSV_OUTPUT_SORT_HEADERS] = GC.Values[GC.CSV_OUTPUT_SORT_HEADERS] = getString(Cmd.OB_STRING_LIST, minLen=0).replace(',', ' ').split()
4140
4140
  if checkArgumentPresent('timestampcolumn'):
4141
4141
  GM.Globals[GM.CSV_OUTPUT_TIMESTAMP_COLUMN] = GC.Values[GC.CSV_OUTPUT_TIMESTAMP_COLUMN] = getString(Cmd.OB_STRING, minLen=0)
4142
+ if checkArgumentPresent('transpose'):
4143
+ GM.Globals[GM.CSV_OUTPUT_TRANSPOSE] = getBoolean()
4142
4144
  _setCSVFile(filename, mode, encoding, writeHeader, multi)
4143
4145
  GM.Globals[GM.CSVFILE][GM.REDIRECT_QUEUE_CSVPF] = CSVPrintFile()
4144
4146
  if checkArgumentPresent('todrive'):
@@ -7794,6 +7796,7 @@ class CSVPrintFile():
7794
7796
  def __init__(self, titles=None, sortTitles=None, indexedTitles=None):
7795
7797
  self.rows = []
7796
7798
  self.rowCount = 0
7799
+ self.outputTranspose = GM.Globals[GM.CSV_OUTPUT_TRANSPOSE]
7797
7800
  self.todrive = GM.Globals[GM.CSV_TODRIVE]
7798
7801
  self.titlesSet = set()
7799
7802
  self.titlesList = []
@@ -8993,6 +8996,22 @@ class CSVPrintFile():
8993
8996
  self.JSONtitlesList = self.orderHeaders(self.JSONtitlesList)
8994
8997
  titlesList = self.JSONtitlesList
8995
8998
  normalizeSortHeaders()
8999
+ if self.outputTranspose:
9000
+ newRows = []
9001
+ pivotKey = titlesList[0]
9002
+ newTitlesList = [pivotKey]
9003
+ newTitlesSet = set(newTitlesList)
9004
+ for title in titlesList[1:]:
9005
+ newRow = {pivotKey: title}
9006
+ for row in self.rows:
9007
+ pivotValue = row[pivotKey]
9008
+ if pivotValue not in newTitlesSet:
9009
+ newTitlesSet.add(pivotValue)
9010
+ newTitlesList.append(pivotValue)
9011
+ newRow[pivotValue] = row.get(title)
9012
+ newRows.append(newRow)
9013
+ titlesList = newTitlesList
9014
+ self.rows = newRows
8996
9015
  if (not self.todrive) or self.todrive['localcopy']:
8997
9016
  if GM.Globals[GM.CSVFILE][GM.REDIRECT_NAME] == '-':
8998
9017
  if GM.Globals[GM.STDOUT][GM.REDIRECT_MULTI_FD]:
@@ -85,6 +85,8 @@ CSV_OUTPUT_ROW_FILTER_MODE = 'corm'
85
85
  CSV_OUTPUT_ROW_LIMIT = 'corl'
86
86
  # Add timestamp column to CSV output file
87
87
  CSV_OUTPUT_TIMESTAMP_COLUMN = 'cotc'
88
+ # Transpose output rows/columns
89
+ CSV_OUTPUT_TRANSPOSE = 'cotr'
88
90
  # Output sort headers
89
91
  CSV_OUTPUT_SORT_HEADERS = 'cosh'
90
92
  # CSV todrive options
@@ -250,6 +252,7 @@ Globals = {
250
252
  CSV_OUTPUT_ROW_LIMIT: 0,
251
253
  CSV_OUTPUT_SORT_HEADERS: [],
252
254
  CSV_OUTPUT_TIMESTAMP_COLUMN: None,
255
+ CSV_OUTPUT_TRANSPOSE: False,
253
256
  CSV_TODRIVE: {},
254
257
  CURRENT_API_SERVICES: {},
255
258
  CURRENT_CLIENT_API: None,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes