diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f576aa10..79db1047 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -544,6 +544,12 @@ jobs: "$PYTHON" -m pip install pytest "$PYTHON" -m pytest ../tests/ -v + - name: Lint with ruff + run: | + "$PYTHON" -m pip install ruff + ruff check ../src/gam/ + ruff check ../tests/ + - name: Install PyInstaller if: matrix.goal == 'build' run: | diff --git a/pyproject.toml b/pyproject.toml index 4b7637d6..9e9b19d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,3 +69,47 @@ requires = [ "hatchling", ] build-backend = "hatchling.build" + +# Ruff linter configuration — https://docs.astral.sh/ruff/ +[tool.ruff] +target-version = "py311" +src = ["src", "tests"] + +[tool.ruff.lint] +# Focused rules that catch real bugs without overwhelming noise. +select = [ + "F", # Pyflakes — unused imports, undefined names, etc. + "E711", # Comparison to None (use `is` / `is not`) + "E713", # Not-in test (use `not in` operator) + "UP", # pyupgrade — modernize syntax for Python 3.11+ +] +ignore = [ + # Pyflakes rules suppressed for GAM's architecture + "F402", # Import shadowed by loop variable — GAM reuses `entity` in loops + "F403", # Star import — GAM uses `from gam.constants import *` + "F405", # Undefined from star import — GAM uses `from gam.constants import *` + "F811", # Redefined while unused — GAM reassigns variables in arg-parsing loops + "F841", # Local variable assigned but never used — some GAM patterns use this intentionally + # pyupgrade rules that would be too noisy right now + "UP009", # UTF-8 encoding declaration — harmless, not worth a 17-file churn + "UP024", # os.error alias — 37 occurrences, low priority + "UP030", # Format literals — would change string formatting style + "UP031", # printf-string-formatting — 200+ occurrences, too noisy right now + "UP032", # f-string — auto-conversion can break complex expressions +] +fixable = [] # Don't auto-fix — we want to review changes manually + +[tool.ruff.lint.per-file-ignores] +# __init__.py re-exports cmd/ functions for dispatch tables +"src/gam/__init__.py" = ["F401", "E402", "F821"] +# cmd/ files use `from gam.constants import *` +"src/gam/cmd/**" = ["F821"] +# util/ modules have ordered imports and re-exports +"src/gam/util/**" = ["E402", "F821"] +# gamlib modules +"src/gam/gamlib/**" = ["F821"] +# gdata/ and atom/ are vendored third-party code — don't lint them +"src/gam/gdata/**" = ["F", "E", "UP"] +"src/gam/atom/**" = ["F", "E", "UP"] +# Test files can be more relaxed +"tests/**" = ["F401", "F811"] diff --git a/src/gam/__main__.py b/src/gam/__main__.py index e871f7be..83b0386b 100644 --- a/src/gam/__main__.py +++ b/src/gam/__main__.py @@ -18,7 +18,6 @@ # limitations under the License. import multiprocessing -import platform import sys import gam diff --git a/src/gam/cmd/admin.py b/src/gam/cmd/admin.py index 54a9b538..864d3246 100644 --- a/src/gam/cmd/admin.py +++ b/src/gam/cmd/admin.py @@ -3,7 +3,6 @@ import json -import re from gamlib import api as API from gamlib import settings as GC diff --git a/src/gam/cmd/alerts.py b/src/gam/cmd/alerts.py index d3261bc7..59a2fd72 100644 --- a/src/gam/cmd/alerts.py +++ b/src/gam/cmd/alerts.py @@ -1,15 +1,11 @@ """GAM alert center management.""" import json -import sys from gam.util.args import formatLocalTime from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.api import _getAdminEmail from gam.util.svcacct import buildGAPIServiceObject diff --git a/src/gam/cmd/aliases.py b/src/gam/cmd/aliases.py index 10b36014..ea7e739d 100644 --- a/src/gam/cmd/aliases.py +++ b/src/gam/cmd/aliases.py @@ -6,7 +6,6 @@ import time from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import entityUnknownWarning @@ -45,7 +44,6 @@ from gam.util.entity import ( getEntityArgument, getEntityList, getEntityToModify, - getQueries, ) from gam.util.errors import entityActionFailedExit, unknownArgumentExit from gam.util.orgunits import getOrgUnitItem diff --git a/src/gam/cmd/analytics.py b/src/gam/cmd/analytics.py index 2913460e..111c3346 100644 --- a/src/gam/cmd/analytics.py +++ b/src/gam/cmd/analytics.py @@ -5,8 +5,6 @@ import json from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPIpages diff --git a/src/gam/cmd/audit.py b/src/gam/cmd/audit.py index c12b720d..2886fded 100644 --- a/src/gam/cmd/audit.py +++ b/src/gam/cmd/audit.py @@ -3,13 +3,8 @@ Mailbox monitor creation/deletion/listing and the doWhatIs command. """ -import re -from gamlib import api as API -from gamlib import settings as GC -from gamlib import gapi as GAPI from gamlib import state as GM -from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import entityUnknownWarning from gam.util.api import getEmailAuditObject diff --git a/src/gam/cmd/browsers.py b/src/gam/cmd/browsers.py index 22b87b4a..72479e19 100644 --- a/src/gam/cmd/browsers.py +++ b/src/gam/cmd/browsers.py @@ -5,7 +5,6 @@ import json from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import checkEntityAFDNEorAccessErrorExit diff --git a/src/gam/cmd/caa.py b/src/gam/cmd/caa.py index 40dabcc8..c9f09219 100644 --- a/src/gam/cmd/caa.py +++ b/src/gam/cmd/caa.py @@ -4,9 +4,7 @@ import json import string from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.svcacct import buildGAPIServiceObject diff --git a/src/gam/cmd/chat/setup.py b/src/gam/cmd/chat/setup.py index df47735c..af782c49 100644 --- a/src/gam/cmd/chat/setup.py +++ b/src/gam/cmd/chat/setup.py @@ -6,7 +6,6 @@ Part of the _chat_tmp sub-package.""" import re import json -import sys import base64 import os diff --git a/src/gam/cmd/chat/spaces.py b/src/gam/cmd/chat/spaces.py index da6a9407..70152c8a 100644 --- a/src/gam/cmd/chat/spaces.py +++ b/src/gam/cmd/chat/spaces.py @@ -5,13 +5,11 @@ Part of the _chat_tmp sub-package.""" """GAM Google Chat management.""" import json -import sys import uuid from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.api import buildGAPIObject from gam.util.api_call import callGAPI, callGAPIpages diff --git a/src/gam/cmd/chromeapps.py b/src/gam/cmd/chromeapps.py index e0bf1a91..5add58c5 100644 --- a/src/gam/cmd/chromeapps.py +++ b/src/gam/cmd/chromeapps.py @@ -6,7 +6,6 @@ import json from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import checkEntityAFDNEorAccessErrorExit diff --git a/src/gam/cmd/chromepolicies.py b/src/gam/cmd/chromepolicies.py index 6c2943dd..20a67ed4 100644 --- a/src/gam/cmd/chromepolicies.py +++ b/src/gam/cmd/chromepolicies.py @@ -8,7 +8,6 @@ import os from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import entityUnknownWarning @@ -71,7 +70,6 @@ from gam.util.errors import ( usageErrorExit, ) from gam.util.fileio import UNKNOWN, setFilePath -from gam.util.orgunits import getOrgUnitId from gam.constants import DFA_URL diff --git a/src/gam/cmd/cigroups/members.py b/src/gam/cmd/cigroups/members.py index 999e409c..6dde6cb5 100644 --- a/src/gam/cmd/cigroups/members.py +++ b/src/gam/cmd/cigroups/members.py @@ -12,7 +12,6 @@ from gam.util.args import formatLocalTime from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind @@ -124,7 +123,7 @@ def getCIGroupMemberTypes(myarg, typesSet): def doInfoCIGroups(): from gam.cmd.groups.members import CIGROUP_FIELDS_CHOICE_MAP, CIGROUP_TIME_OBJECTS, _checkCIMemberMatch, _showCIGroup, finalizeIPSGMGroupRolesMemberDisplayOptions, getIPSGMGroupRolesMemberDisplayOptions, getMemberMatchOptions, initIPSGMGroupMemberDisplayOptions, initMemberOptions def printCIGroupMemberTree(group_id, showRole): - if not group_id in cachedGroupMembers: + if group_id not in cachedGroupMembers: try: cachedGroupMembers[group_id] = callGAPIpages(ci.groups().memberships(), 'list', 'memberships', throwReasons=GAPI.MEMBERS_THROW_REASONS, diff --git a/src/gam/cmd/ciuserinvitations.py b/src/gam/cmd/ciuserinvitations.py index 2141c643..c59e8632 100644 --- a/src/gam/cmd/ciuserinvitations.py +++ b/src/gam/cmd/ciuserinvitations.py @@ -4,10 +4,7 @@ import re import json from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import entityUnknownWarning from gam.util.api import buildGAPIObject diff --git a/src/gam/cmd/cloudstorage.py b/src/gam/cmd/cloudstorage.py index 9a546e32..10e16c2e 100644 --- a/src/gam/cmd/cloudstorage.py +++ b/src/gam/cmd/cloudstorage.py @@ -4,7 +4,6 @@ import re import googleapiclient.http import hashlib -import copy import base64 import os import time @@ -12,7 +11,6 @@ import time from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.api import buildGAPIObject diff --git a/src/gam/cmd/contacts.py b/src/gam/cmd/contacts.py index 0c246919..885110bb 100644 --- a/src/gam/cmd/contacts.py +++ b/src/gam/cmd/contacts.py @@ -5,10 +5,7 @@ import json import gdata.apps.contacts -from gamlib import api as API from gamlib import settings as GC -from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.constants import NO_ENTITIES_FOUND_RC @@ -54,7 +51,6 @@ from gam.util.display import ( from gam.util.entity import getEntityList from gam.util.errors import invalidChoiceExit, missingArgumentExit, unknownArgumentExit, usageErrorExit from gam.util.output import setSysExitRC, writeStdout -from gam.cmd.users.manage import ADDRESS_ARGUMENT_TO_FIELD_MAP, ORGANIZATION_ARGUMENT_TO_FIELD_MAP def _getCreateContactReturnOptions(parameters): @@ -111,7 +107,7 @@ CONTACT_RELATIONS = 'Relations' CONTACT_USER_DEFINED_FIELDS = 'User Defined Fields' CONTACT_WEBSITES = 'Websites' # -class ContactsManager(): +class ContactsManager: CONTACT_ARGUMENT_TO_PROPERTY_MAP = { 'json': CONTACT_JSON, @@ -1667,7 +1663,7 @@ PEOPLE_REMOVE_GROUPS_LIST = 'ContactRemoveGroupsList' PEOPLE_GROUP_NAME = 'name' PEOPLE_GROUP_CLIENT_DATA = 'clientData' # -class PeopleManager(): +class PeopleManager: PEOPLE_ARGUMENT_TO_PROPERTY_MAP = { 'json': PEOPLE_JSON, 'additionalname': PEOPLE_NAMES_MIDDLE_NAME, diff --git a/src/gam/cmd/courses/content.py b/src/gam/cmd/courses/content.py index b5a221a7..6df04c5a 100644 --- a/src/gam/cmd/courses/content.py +++ b/src/gam/cmd/courses/content.py @@ -4,15 +4,12 @@ Part of the _courses_tmp sub-package.""" """GAM Google Classroom course management.""" -import re import json -import sys from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI from gamlib import state as GM -from gamlib import msgs as Msg from gam.util.api import buildGAPIObject from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIpages @@ -35,7 +32,7 @@ from gam.util.csv_pf import ( from gam.util.display import entityActionFailedWarning, entityDoesNotHaveItemWarning, getPageMessageForWhom, printGettingAllEntityItemsForWhom from gam.util.entity import getEntityList -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent def doPrintCourseAnnouncements(): def _printCourseAnnouncement(course, courseAnnouncement, i, count): diff --git a/src/gam/cmd/courses/courses.py b/src/gam/cmd/courses/courses.py index cca093a9..1f09f59e 100644 --- a/src/gam/cmd/courses/courses.py +++ b/src/gam/cmd/courses/courses.py @@ -143,7 +143,7 @@ def _gettingCourseEntityQuery(entityType, courseWorkStates): query = query[:-2] return query -class CourseAttributes(): +class CourseAttributes: def __init__(self, croom, updateMode): self.croom = croom diff --git a/src/gam/cmd/courses/guardians.py b/src/gam/cmd/courses/guardians.py index a6f867b4..e3bac32b 100644 --- a/src/gam/cmd/courses/guardians.py +++ b/src/gam/cmd/courses/guardians.py @@ -4,7 +4,6 @@ Part of the _courses_tmp sub-package.""" """GAM Google Classroom course management.""" -import re import json from gamlib import uprop as UProp @@ -12,7 +11,6 @@ from gamlib import uprop as UProp from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.access import entityUnknownWarning from gam.util.api import buildGAPIObject diff --git a/src/gam/cmd/cros.py b/src/gam/cmd/cros.py index 1bd40d5c..e502cacb 100644 --- a/src/gam/cmd/cros.py +++ b/src/gam/cmd/cros.py @@ -1,7 +1,6 @@ """GAM ChromeOS device management.""" import json -import sys from gam.util.args import formatLocalTime @@ -40,7 +39,6 @@ from gam.util.args import ( getString, getStringWithCRsNLs, getTimeOrDeltaFromNow, - getYYYYMMDD, makeOrgUnitPathAbsolute, makeOrgUnitPathRelative, substituteQueryTimes, diff --git a/src/gam/cmd/customer.py b/src/gam/cmd/customer.py index f46ca687..0ec0a8e6 100644 --- a/src/gam/cmd/customer.py +++ b/src/gam/cmd/customer.py @@ -5,12 +5,11 @@ import json from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import accessErrorExit from gam.util.api import buildGAPIObject -from gam.util.api_call import callGAPI, callGAPIitems +from gam.util.api_call import callGAPI from gam.util.args import ( LANGUAGE_CODES_MAP, YYYYMMDD_FORMAT, @@ -35,13 +34,8 @@ from gam.util.errors import unknownArgumentExit from gam.util.fileio import UNKNOWN from gam.util.output import printWarningMessage, writeStdout from gam.util.entity import ( - PRINT_PRIVILEGES_FIELDS, _getCustomerId, - _getCustomerIdNoC, - _getCustomersCustomerIdNoC, - _getCustomersCustomerIdWithC, _getDomainList, - setTrueCustomerId, ) from gam.constants import DATA_NOT_AVALIABLE_RC from gam.cmd.domains import CUSTOMER_LICENSE_MAP diff --git a/src/gam/cmd/datatransfer.py b/src/gam/cmd/datatransfer.py index 25c44736..d27115ec 100644 --- a/src/gam/cmd/datatransfer.py +++ b/src/gam/cmd/datatransfer.py @@ -1,6 +1,5 @@ """GAM data transfer operations.""" -import sys from gam.util.args import formatLocalTime import time @@ -8,7 +7,6 @@ import time from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.api import buildGAPIObject diff --git a/src/gam/cmd/delegates.py b/src/gam/cmd/delegates.py index 0b562b29..e8d296ae 100644 --- a/src/gam/cmd/delegates.py +++ b/src/gam/cmd/delegates.py @@ -4,8 +4,6 @@ from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.api import buildGAPIObject from gam.util.api_call import callGAPI, callGAPIpages diff --git a/src/gam/cmd/domains.py b/src/gam/cmd/domains.py index ccb82e3e..ffacf56e 100644 --- a/src/gam/cmd/domains.py +++ b/src/gam/cmd/domains.py @@ -1,14 +1,11 @@ """GAM domain and domain alias management.""" import json -import sys -import re from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import accessErrorExit diff --git a/src/gam/cmd/drive/activity.py b/src/gam/cmd/drive/activity.py index 6ac5295d..3a15f261 100644 --- a/src/gam/cmd/drive/activity.py +++ b/src/gam/cmd/drive/activity.py @@ -4,17 +4,13 @@ """GAM Google Drive file, permission, shared drive, and label management.""" -import re import json -import sys from gam.util.args import formatLocalTime from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.util.api import _getAdminEmail, buildGAPIObject from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIitems, callGAPIpages, yieldGAPIpages diff --git a/src/gam/cmd/drive/copymove/copymove_move.py b/src/gam/cmd/drive/copymove/copymove_move.py index fe5037f6..6c19fac7 100644 --- a/src/gam/cmd/drive/copymove/copymove_move.py +++ b/src/gam/cmd/drive/copymove/copymove_move.py @@ -8,16 +8,13 @@ Part of the copymove sub-package.""" """GAM Google Drive file, permission, shared drive, and label management.""" -import re from gam.cmd.drive.core import DFA_SEARCHARGS from gam.cmd.drive.copymove.copymove_util import _checkForDuplicateTargetFile, _checkForExistingShortcut, _copyPermissions, _getCopyFolderNonInheritedPermissions, _getCopyMoveParentInfo, _getCopyMoveTargetInfo, _getUniqueFilename, _identicalSourceTarget, _printStatistics, _targetFilenameExists, _verifyUserIsOrganizer, getCopyMoveOptions, initCopyMoveOptions -from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.api_call import callGAPI, callGAPIpages from gam.util.args import getArgument, getBoolean diff --git a/src/gam/cmd/drive/copymove/copymove_util.py b/src/gam/cmd/drive/copymove/copymove_util.py index a8eeaf2f..241e681e 100644 --- a/src/gam/cmd/drive/copymove/copymove_util.py +++ b/src/gam/cmd/drive/copymove/copymove_util.py @@ -16,7 +16,6 @@ import os from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIpages @@ -1491,9 +1490,9 @@ def copyDriveFile(users): elif (sourceMimeType == MIMETYPE_GA_FOLDER) and copyMoveOptions['mergeWithParent']: destName = dest['name'] elif ((newParentsSpecified and newParentId not in sourceParents) or - ((newParentId in sourceParents and + (newParentId in sourceParents and (sourceMimeType == MIMETYPE_GA_FOLDER and copyMoveOptions['duplicateFolders'] != DUPLICATE_FOLDER_MERGE) or - (sourceMimeType != MIMETYPE_GA_FOLDER and copyMoveOptions['duplicateFiles'] not in [DUPLICATE_FILE_OVERWRITE_ALL, DUPLICATE_FILE_OVERWRITE_OLDER])))): + (sourceMimeType != MIMETYPE_GA_FOLDER and copyMoveOptions['duplicateFiles'] not in [DUPLICATE_FILE_OVERWRITE_ALL, DUPLICATE_FILE_OVERWRITE_OLDER]))): if copyMoveOptions['replaceFilename']: destName = processFilenameReplacements(sourceName, copyMoveOptions['replaceFilename']) else: diff --git a/src/gam/cmd/drive/core.py b/src/gam/cmd/drive/core.py index 1d768ae6..9648b3df 100644 --- a/src/gam/cmd/drive/core.py +++ b/src/gam/cmd/drive/core.py @@ -64,7 +64,7 @@ from gam.util.fileio import FILE_ERROR_RC, fileErrorMessage, setFilePath from gam.util.output import setSysExitRC, stderrWarningMsg, systemErrorExit from gam.constants import ANY_NON_TRASHED_FOLDER_NAME, MY_NON_TRASHED_FOLDER_NAME, NO_ENTITIES_FOUND_RC, TEAM_DRIVE -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent APPLICATION_VND_GOOGLE_APPS = 'application/vnd.google-apps.' MIMETYPE_GA_DOCUMENT = f'{APPLICATION_VND_GOOGLE_APPS}document' @@ -649,7 +649,7 @@ def _getDriveFileParentInfo(drive, user, i, count, body, parameters, emptyQueryO fileId=parameters[DFA_PARENTID], fields='id,name,mimeType,driveId', supportsAllDrives=True) if result['mimeType'] != MIMETYPE_GA_FOLDER: entityActionNotPerformedWarning([Ent.USER, user, entityType, None], - f'parentid: {parameters[DFA_PARENTID]}, {Msg.NOT_AN_ENTITY.format((Ent.Singular(Ent.DRIVE_FOLDER)))}', i, count) + f'parentid: {parameters[DFA_PARENTID]}, {Msg.NOT_AN_ENTITY.format(Ent.Singular(Ent.DRIVE_FOLDER))}', i, count) return False body['parents'].append(result['id']) if result.get('driveId'): @@ -833,7 +833,7 @@ def validateMimeType(mimeType): def getMimeType(): return validateMimeType(getString(Cmd.OB_MIMETYPE).lower()) -class MimeTypeCheck(): +class MimeTypeCheck: def __init__(self): self.mimeTypes = set() diff --git a/src/gam/cmd/drive/fileinfo.py b/src/gam/cmd/drive/fileinfo.py index 9752ad42..fbb2a2f3 100644 --- a/src/gam/cmd/drive/fileinfo.py +++ b/src/gam/cmd/drive/fileinfo.py @@ -4,16 +4,14 @@ """GAM Google Drive file, permission, shared drive, and label management.""" -import re import platform -from gam.cmd.drive.core import _getDriveFileNameFromId, _validateUserGetFileIDs, getDriveFileEntity +from gam.cmd.drive.core import _validateUserGetFileIDs, getDriveFileEntity import os from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.constants import WITH_PARENTS @@ -48,7 +46,7 @@ SHARED_WITHME = 'SharedWithMe' SHARED_DRIVES = 'SharedDrives' from gam.cmd.drive.core import ( - MimeTypeCheck, _getSharedDriveNameFromId, _simpleFileIdEntityList, + _getSharedDriveNameFromId, _simpleFileIdEntityList, _validateUserGetFileIDs, _validateUserSharedDrive, cleanFileIDsList, getDriveFileEntity, getSharedDriveEntity, initDriveFileEntity, ) diff --git a/src/gam/cmd/drive/filelist.py b/src/gam/cmd/drive/filelist.py index 966b84a1..42c30977 100644 --- a/src/gam/cmd/drive/filelist.py +++ b/src/gam/cmd/drive/filelist.py @@ -4,7 +4,6 @@ """GAM Google Drive file, permission, shared drive, and label management.""" -import re import json from gam.util.args import formatLocalTime @@ -14,7 +13,6 @@ from gam.cmd.drive.filepaths import _finalizeIncludeLabels, _finalizeIncludePerm from gam.util.csv_pf import DEFAULT_SKIP_OBJECTS -from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI from gamlib import state as GM diff --git a/src/gam/cmd/drive/filepaths.py b/src/gam/cmd/drive/filepaths.py index 05831b75..89525f12 100644 --- a/src/gam/cmd/drive/filepaths.py +++ b/src/gam/cmd/drive/filepaths.py @@ -4,7 +4,6 @@ """GAM Google Drive file, permission, shared drive, and label management.""" -import re import json from gam.cmd.drive.core import _getSharedDriveNameFromId, _validateUserGetFileIDs, getDriveFileEntity @@ -13,14 +12,11 @@ from gam.cmd.drive.labels import normalizeDriveLabelID from gam.util.csv_pf import DEFAULT_SKIP_OBJECTS -from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.constants import MY_DRIVE, TEAM_DRIVE -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent, Ind APPLICATION_VND_GOOGLE_APPS = 'application/vnd.google-apps.' MIMETYPE_GA_DOCUMENT = f'{APPLICATION_VND_GOOGLE_APPS}document' @@ -54,8 +50,6 @@ from gam.cmd.drive.core import DRIVE_LABEL_CHOICE_MAP # cross-module ref from gam.util.api_call import callGAPI, callGAPIitems, callGAPIpages from gam.util.args import ( OrderBy, - StartEndTime, - checkArgumentPresent, escapeCRsNLs, getArgument, getBoolean, @@ -575,7 +569,7 @@ def _getDriveFieldSubField(field, fieldsList, parentsSubFields): else: invalidChoiceExit(field, list(DRIVE_SUBFIELDS_CHOICE_MAP), True) -class DriveFileFields(): +class DriveFileFields: def __init__(self): self.showSharedDriveNames = False self.allFields = False diff --git a/src/gam/cmd/drive/files.py b/src/gam/cmd/drive/files.py index 573491a5..88e5d530 100644 --- a/src/gam/cmd/drive/files.py +++ b/src/gam/cmd/drive/files.py @@ -8,12 +8,10 @@ import re from gam.cmd.drive.core import DFA_IGNORE_DEFAULT_VISIBILITY, DFA_KEEP_REVISION_FOREVER, DFA_LOCALFILENAME, DFA_LOCALFILEPATH, DFA_LOCALMIMETYPE, DFA_OCRLANGUAGE, DFA_PARENTID, DFA_PRESERVE_FILE_TIMES, DFA_REPLACEFILENAME, DFA_SHAREDDRIVE_PARENT, DFA_STRIPNAMEPREFIX, DFA_TIMEFORMAT, DFA_TIMESTAMP, DFA_URL, DFA_USE_CONTENT_AS_INDEXABLE_TEXT, _getDriveFileAddRemoveParentInfo, _getDriveFileParentInfo, _validateUserGetFileIDs, escapeDriveFileName, getDriveFileAddRemoveParentAttribute, getDriveFileAttribute, getDriveFileEntity, getDriveFileParentAttribute, getMediaBody, initDriveFileAttributes, setPreservedFileTimes from gam.cmd.drive.fileinfo import writeReturnIdLink -import time from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIitems, callGAPIpages diff --git a/src/gam/cmd/drive/filetree.py b/src/gam/cmd/drive/filetree.py index 6dd11732..942849b9 100644 --- a/src/gam/cmd/drive/filetree.py +++ b/src/gam/cmd/drive/filetree.py @@ -9,15 +9,12 @@ import re from gam.cmd.drive.core import _getSharedDriveNameFromId, _mapDrive2QueryToDrive3, cleanFileIDsList, escapeDriveFileName, getEscapedDriveFileName, initDriveFileEntity from gam.cmd.drive.revisions import _stripMeInOwners, _stripNotMeInOwners, _updateAnyOwnerQuery -from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.entity import QUERY_SHORTCUTS_MAP from gam.constants import MY_DRIVE, TEAM_DRIVE -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent APPLICATION_VND_GOOGLE_APPS = 'application/vnd.google-apps.' MIMETYPE_GA_DOCUMENT = f'{APPLICATION_VND_GOOGLE_APPS}document' @@ -65,7 +62,6 @@ from gam.util.args import ( StartEndTime, checkArgumentPresent, checkGetArgument, - escapeCRsNLs, getArgument, getBoolean, getChoice, @@ -258,7 +254,7 @@ DRIVEFILE_ACL_ROLES_MAP = { DRIVEFILE_ACL_PERMISSION_TYPES = ['anyone', 'domain', 'group', 'user'] # anyone must be first element DRIVEFILE_ACL_PERMISSION_DETAILS_TYPES = ['file', 'member'] -class PermissionMatch(): +class PermissionMatch: _PERMISSION_MATCH_ACTION_MAP = {'process': True, 'skip': False} _PERMISSION_MATCH_MODE_MAP = {'or': True, 'and': False} @@ -505,7 +501,7 @@ def noFileSelectFileIdEntity(fileIdEntity): SHOW_OWNED_BY_CHOICE_MAP = {'any': None, 'me': True, 'others': False} -class DriveListParameters(): +class DriveListParameters: def __init__(self, myargOptions): self.PM = PermissionMatch() self.myargOptions = myargOptions diff --git a/src/gam/cmd/drive/labels.py b/src/gam/cmd/drive/labels.py index 7540e177..07b3240e 100644 --- a/src/gam/cmd/drive/labels.py +++ b/src/gam/cmd/drive/labels.py @@ -10,9 +10,7 @@ import json from gam.cmd.drive.core import _validateUserGetFileIDs, getDriveFileEntity from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.api import _getAdminEmail from gam.util.svcacct import buildGAPIServiceObject diff --git a/src/gam/cmd/drive/looker.py b/src/gam/cmd/drive/looker.py index 290a0ad3..7a8ed9c7 100644 --- a/src/gam/cmd/drive/looker.py +++ b/src/gam/cmd/drive/looker.py @@ -4,15 +4,11 @@ """GAM Google Drive file, permission, shared drive, and label management.""" -import re import json -import sys from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIpages from gam.util.args import ( diff --git a/src/gam/cmd/drive/permissions.py b/src/gam/cmd/drive/permissions.py index 5962edeb..4325a430 100644 --- a/src/gam/cmd/drive/permissions.py +++ b/src/gam/cmd/drive/permissions.py @@ -4,7 +4,6 @@ """GAM Google Drive file, permission, shared drive, and label management.""" -import re import json from gam.cmd.drive.core import _getDriveFileNameFromId, _getSharedDriveNameFromId, _validateUserGetFileIDs, _validateUserSharedDrive, cleanFileIDsList, getDriveFileEntity, getSharedDriveEntity, initDriveFileEntity diff --git a/src/gam/cmd/drive/revisions.py b/src/gam/cmd/drive/revisions.py index 11df4e80..c44a6973 100644 --- a/src/gam/cmd/drive/revisions.py +++ b/src/gam/cmd/drive/revisions.py @@ -4,11 +4,9 @@ """GAM Google Drive file, permission, shared drive, and label management.""" -import re from gam.cmd.drive.core import _getDriveFileNameFromId, _validateUserGetFileIDs, getDriveFileEntity -from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI from gamlib import state as GM diff --git a/src/gam/cmd/drive/shareddrives.py b/src/gam/cmd/drive/shareddrives.py index c20b347c..a1561971 100644 --- a/src/gam/cmd/drive/shareddrives.py +++ b/src/gam/cmd/drive/shareddrives.py @@ -6,7 +6,6 @@ import re import json -import sys from gam.util.args import formatLocalTime @@ -22,7 +21,6 @@ from gam.cmd.drive.core import getSharedDriveEntity, _validateUserSharedDrive from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.api import _getAdminEmail, _getValueFromOAuth, buildGAPIObject from gam.util.svcacct import buildGAPIServiceObject diff --git a/src/gam/cmd/drive/transfer/ownership.py b/src/gam/cmd/drive/transfer/ownership.py index 7bb766b1..fcddde12 100644 --- a/src/gam/cmd/drive/transfer/ownership.py +++ b/src/gam/cmd/drive/transfer/ownership.py @@ -8,8 +8,6 @@ Part of the transfer sub-package.""" """GAM Google Drive file, permission, shared drive, and label management.""" -import re -import sys from gamlib import api as API from gamlib import settings as GC diff --git a/src/gam/cmd/gmail/cse.py b/src/gam/cmd/gmail/cse.py index d6ff651b..f7ff3c14 100644 --- a/src/gam/cmd/gmail/cse.py +++ b/src/gam/cmd/gmail/cse.py @@ -4,15 +4,12 @@ Part of the _gmail_monolith sub-package.""" """GAM Gmail management: labels, messages, filters, forwarding, sendas, S/MIME, CSE, vacation.""" -import re import json -import sys import os from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIpages diff --git a/src/gam/cmd/gmail/delegates.py b/src/gam/cmd/gmail/delegates.py index 34579ef6..fa332f21 100644 --- a/src/gam/cmd/gmail/delegates.py +++ b/src/gam/cmd/gmail/delegates.py @@ -4,12 +4,10 @@ Part of the _gmail_monolith sub-package.""" """GAM Gmail management: labels, messages, filters, forwarding, sendas, S/MIME, CSE, vacation.""" -import re from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.api import buildGAPIObject from gam.util.svcacct import buildGAPIServiceObject diff --git a/src/gam/cmd/gmail/filters.py b/src/gam/cmd/gmail/filters.py index 3fa29a83..ecc17b1f 100644 --- a/src/gam/cmd/gmail/filters.py +++ b/src/gam/cmd/gmail/filters.py @@ -4,16 +4,13 @@ Part of the _gmail_monolith sub-package.""" """GAM Gmail management: labels, messages, filters, forwarding, sendas, S/MIME, CSE, vacation.""" -import re import json -import sys from gam.cmd.gmail.labels import _getLabelId, _getLabelName, _getLabelSet, _getUserGmailLabels, buildLabelPath from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIitems diff --git a/src/gam/cmd/gmail/forms.py b/src/gam/cmd/gmail/forms.py index 13504e55..d5c662d7 100644 --- a/src/gam/cmd/gmail/forms.py +++ b/src/gam/cmd/gmail/forms.py @@ -4,14 +4,10 @@ Part of the _gmail_monolith sub-package.""" """GAM Gmail management: labels, messages, filters, forwarding, sendas, S/MIME, CSE, vacation.""" -import re import json from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIpages from gam.util.args import ( diff --git a/src/gam/cmd/gmail/labels.py b/src/gam/cmd/gmail/labels.py index c607d6a1..fc57de33 100644 --- a/src/gam/cmd/gmail/labels.py +++ b/src/gam/cmd/gmail/labels.py @@ -9,7 +9,6 @@ import re from gam.util.csv_pf import RI_ENTITY, RI_J, RI_JCOUNT, RI_ITEM from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI from gamlib import state as GM from gamlib import msgs as Msg @@ -769,7 +768,7 @@ def _convertLabelNamesToIds(gmail, user, i, count, bodyLabels, labelNameMap, add # make sure to create parent labels for proper nesting parent_label = label[:label.rfind('/')] while True: - if (not parent_label in labelNameMap) and (not parent_label.upper() in labelNameMap): + if (parent_label not in labelNameMap) and (parent_label.upper() not in labelNameMap): result = callGAPI(gmail.users().labels(), 'create', userId='me', body={'name': parent_label}, fields='id') labelNameMap[parent_label] = labelNameMap[parent_label.upper()] = result['id'] diff --git a/src/gam/cmd/gmail/profile.py b/src/gam/cmd/gmail/profile.py index c07cbb06..06ce0896 100644 --- a/src/gam/cmd/gmail/profile.py +++ b/src/gam/cmd/gmail/profile.py @@ -4,17 +4,12 @@ Part of the _gmail_monolith sub-package.""" """GAM Gmail management: labels, messages, filters, forwarding, sendas, S/MIME, CSE, vacation.""" -import re import json -import sys import uuid import base64 from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.util.api import buildGAPIObject from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIpages @@ -30,7 +25,7 @@ from gam.util.display import ( from gam.util.entity import getEntityArgument from gam.util.errors import unknownArgumentExit -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Act, Cmd, Ent def watchGmail(users): maxMessages = 100 diff --git a/src/gam/cmd/gmail/settings.py b/src/gam/cmd/gmail/settings.py index 16d7cfe6..c05cb2b7 100644 --- a/src/gam/cmd/gmail/settings.py +++ b/src/gam/cmd/gmail/settings.py @@ -4,15 +4,12 @@ Part of the _gmail_monolith sub-package.""" """GAM Gmail management: labels, messages, filters, forwarding, sendas, S/MIME, CSE, vacation.""" -import re from gam.cmd.gmail.messages import forwardMessagesThreads from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIitems from gam.util.args import ( diff --git a/src/gam/cmd/gmail/signature.py b/src/gam/cmd/gmail/signature.py index a8e549c4..c3dca7fa 100644 --- a/src/gam/cmd/gmail/signature.py +++ b/src/gam/cmd/gmail/signature.py @@ -4,15 +4,11 @@ Part of the _gmail_monolith sub-package.""" """GAM Gmail management: labels, messages, filters, forwarding, sendas, S/MIME, CSE, vacation.""" -import re from gam.cmd.gmail.settings import _processSendAs, _processSignature, getSendAsAttributes from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI from gam.util.args import ( diff --git a/src/gam/cmd/gmail/smime.py b/src/gam/cmd/gmail/smime.py index 60535fb8..f308a0fd 100644 --- a/src/gam/cmd/gmail/smime.py +++ b/src/gam/cmd/gmail/smime.py @@ -4,7 +4,6 @@ Part of the _gmail_monolith sub-package.""" """GAM Gmail management: labels, messages, filters, forwarding, sendas, S/MIME, CSE, vacation.""" -import re from gam.util.args import formatLocalTimestamp import base64 @@ -12,7 +11,6 @@ import base64 from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIitems diff --git a/src/gam/cmd/groups/members.py b/src/gam/cmd/groups/members.py index c236f352..aa1c51fd 100644 --- a/src/gam/cmd/groups/members.py +++ b/src/gam/cmd/groups/members.py @@ -78,7 +78,6 @@ from gam.util.display import ( printGettingEntityItem, printGettingEntityItemForWhom, printKeyValueList, - printKeyValueListWithCount, printKeyValueWithCRsNLs, printLine, ) @@ -108,7 +107,7 @@ from gam.constants import ( ) from gam.util.domain_filters import ( getUserGroupDomainQueryFilters, initUserGroupDomainQueryFilters, - makeUserGroupDomainQueryFilters, _setUserGroupArgs, + makeUserGroupDomainQueryFilters, ) from gam.util.schema_utils import _initSchemaParms, _getSchemaNameList from gam.util.output import executeBatch, writeStderr, writeStdout @@ -1443,11 +1442,11 @@ def getGroupMembers(cd, groupEmail, memberRoles, membersList, membersSet, i, cou groupMemberList = [] for member in groupMembers: if member['type'] != Ent.TYPE_GROUP: - if ((member['type'] in typesSet and + if (member['type'] in typesSet and _checkMemberMatch(member, memberOptions) and _checkMemberRoleIsSuspendedIsArchived(member, validRoles, memberOptions[MEMBEROPTION_ISSUSPENDED], memberOptions[MEMBEROPTION_ISARCHIVED]) and (not checkShowCategory or _checkMemberCategory(member, memberDisplayOptions)) and - member['id'] not in membersSet)): + member['id'] not in membersSet): if memberOptions[MEMBEROPTION_GETDELIVERYSETTINGS]: _getMemberDeliverySettings(member) membersSet.add(member['id']) diff --git a/src/gam/cmd/licenses.py b/src/gam/cmd/licenses.py index 9e65c2a8..c70c0edd 100644 --- a/src/gam/cmd/licenses.py +++ b/src/gam/cmd/licenses.py @@ -5,11 +5,10 @@ from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI from gamlib import state as GM -from gamlib import msgs as Msg from gamlib import skus as SKU -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent from gam.util.api import buildGAPIObject from gam.util.api_call import callGAPIpages from gam.util.args import getArgument, getGoogleProductList, getGoogleSKUList, getInteger diff --git a/src/gam/cmd/meet.py b/src/gam/cmd/meet.py index 4111f416..ad098327 100644 --- a/src/gam/cmd/meet.py +++ b/src/gam/cmd/meet.py @@ -3,10 +3,7 @@ import json from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM -from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIpages diff --git a/src/gam/cmd/mobile.py b/src/gam/cmd/mobile.py index 76ed449e..0a6409f3 100644 --- a/src/gam/cmd/mobile.py +++ b/src/gam/cmd/mobile.py @@ -5,9 +5,8 @@ import json from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent, Ind from gam.util.api import buildGAPIObject from gam.util.api_call import callGAPI, callGAPIpages, yieldGAPIpages from gam.util.args import ( diff --git a/src/gam/cmd/notes.py b/src/gam/cmd/notes.py index 74585e07..1f9b459f 100644 --- a/src/gam/cmd/notes.py +++ b/src/gam/cmd/notes.py @@ -9,7 +9,6 @@ import os from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.svcacct import buildGAPIServiceObject diff --git a/src/gam/cmd/oauth.py b/src/gam/cmd/oauth.py index 2a58ae15..6a5d0d5c 100644 --- a/src/gam/cmd/oauth.py +++ b/src/gam/cmd/oauth.py @@ -11,7 +11,6 @@ import os import re import socket import sys -import datetime import time import webbrowser import wsgiref.simple_server diff --git a/src/gam/cmd/people.py b/src/gam/cmd/people.py index 884e5543..e53271bd 100644 --- a/src/gam/cmd/people.py +++ b/src/gam/cmd/people.py @@ -51,7 +51,6 @@ import google.auth.exceptions from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind diff --git a/src/gam/cmd/printers.py b/src/gam/cmd/printers.py index 2135d9b1..d1c2f7f3 100644 --- a/src/gam/cmd/printers.py +++ b/src/gam/cmd/printers.py @@ -6,7 +6,6 @@ import json from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import entityUnknownWarning diff --git a/src/gam/cmd/project.py b/src/gam/cmd/project.py index 68ee820b..f3600e89 100644 --- a/src/gam/cmd/project.py +++ b/src/gam/cmd/project.py @@ -5,7 +5,6 @@ key operations, and API enablement. """ import base64 -import datetime import json import os import re @@ -289,7 +288,7 @@ def _createClientSecretsOauth2service(httpObj, login_hint, appInfo, projectInfo, except (IndexError, KeyError, SyntaxError, TypeError, ValueError) as e: sys.stderr.write(f'{str(e)}: {content}') return False - if not 'error' in content or not 'error_description' in content: + if 'error' not in content or 'error_description' not in content: sys.stderr.write(f'Unknown error: {content}\n') return False if content['error'] == 'invalid_grant': diff --git a/src/gam/cmd/reports.py b/src/gam/cmd/reports.py index b4c418d2..116b0b36 100644 --- a/src/gam/cmd/reports.py +++ b/src/gam/cmd/reports.py @@ -2,15 +2,13 @@ import arrow -import datetime import re from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent from gam.util.access import accessErrorExit, entityUnknownWarning from gam.util.api import _getAdminEmail, buildGAPIObject from gam.util.api_call import callGAPI, callGAPIpages diff --git a/src/gam/cmd/reseller.py b/src/gam/cmd/reseller.py index 78e6f832..836300c2 100644 --- a/src/gam/cmd/reseller.py +++ b/src/gam/cmd/reseller.py @@ -3,7 +3,6 @@ import json import sys -import re from gamlib import api as API from gamlib import settings as GC diff --git a/src/gam/cmd/schemas.py b/src/gam/cmd/schemas.py index 139954c8..4d0472e4 100644 --- a/src/gam/cmd/schemas.py +++ b/src/gam/cmd/schemas.py @@ -4,7 +4,6 @@ from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import checkEntityAFDNEorAccessErrorExit diff --git a/src/gam/cmd/send_email.py b/src/gam/cmd/send_email.py index 34f0ec11..e8a2c4b0 100644 --- a/src/gam/cmd/send_email.py +++ b/src/gam/cmd/send_email.py @@ -2,23 +2,17 @@ import time -import re from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind -from gam.util.access import entityUnknownWarning -from gam.util.api import _getAdminEmail, buildGAPIObject +from gam.util.api import _getAdminEmail from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIpages from gam.util.args import ( - FALSE, SORF_MSG_FILE_ARGUMENTS, - TRUE, - TRUE_FALSE, UTF8, checkArgumentPresent, getArgument, @@ -27,12 +21,10 @@ from gam.util.args import ( getDateOrDeltaFromNow, getEmailAddress, getFilename, - getREPatternSubstitution, getString, getStringOrFile, getTimeOrDeltaFromNow, normalizeEmailAddressOrUID, - splitEmailAddress, ) from gam.util.display import ( entityActionFailedWarning, @@ -43,15 +35,13 @@ from gam.util.display import ( userGmailServiceNotEnabledWarning, ) from gam.util.email import send_email -from gam.util.entity import getEntityArgument, getEntityList, getEntityToModify, getNormalizedEmailAddressEntity +from gam.util.entity import getEntityArgument, getEntityList from gam.util.errors import ( - invalidArgumentExit, - invalidChoiceExit, missingArgumentExit, unknownArgumentExit, usageErrorExit, ) -from gam.util.output import ERROR, setSysExitRC +from gam.util.output import setSysExitRC from gam.util.tags import ( # noqa: F401 # re-export ADDRESS_FIELDS_PRINT_ORDER, CASE_MARKERS, diff --git a/src/gam/cmd/sites.py b/src/gam/cmd/sites.py index a7044eba..696ff41c 100644 --- a/src/gam/cmd/sites.py +++ b/src/gam/cmd/sites.py @@ -1,12 +1,10 @@ """GAM site verification and web resource management.""" import json -import sys from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.api import buildGAPIObject, getHttpObj diff --git a/src/gam/cmd/sso.py b/src/gam/cmd/sso.py index 57978e92..bd44ed35 100644 --- a/src/gam/cmd/sso.py +++ b/src/gam/cmd/sso.py @@ -6,7 +6,6 @@ import json from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.api import buildGAPIObject diff --git a/src/gam/cmd/tasks.py b/src/gam/cmd/tasks.py index 7450a4ef..decc53de 100644 --- a/src/gam/cmd/tasks.py +++ b/src/gam/cmd/tasks.py @@ -1,12 +1,10 @@ """GAM Google Tasks and Tag Manager management.""" import json -import sys from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.svcacct import buildGAPIServiceObject diff --git a/src/gam/cmd/userop/licenses.py b/src/gam/cmd/userop/licenses.py index 0626f233..bba12c59 100644 --- a/src/gam/cmd/userop/licenses.py +++ b/src/gam/cmd/userop/licenses.py @@ -4,8 +4,6 @@ Part of the _userop_tmp sub-package.""" """GAM user operations: Looker Studio, user groups, licenses, photos, profile, sheets, tokens, deprovision.""" -import re -import sys from gam.cmd.userop.usergroups import LICENSE_PREVIEW_TITLES @@ -14,7 +12,6 @@ from gam.cmd.userop.usergroups import LICENSE_PRODUCT_SKUIDS from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gamlib import skus as SKU from gam.util.access import entityUnknownWarning diff --git a/src/gam/cmd/userop/photos.py b/src/gam/cmd/userop/photos.py index 298d35e7..077e883f 100644 --- a/src/gam/cmd/userop/photos.py +++ b/src/gam/cmd/userop/photos.py @@ -16,7 +16,6 @@ import google.auth.exceptions from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.access import entityUnknownWarning from gam.util.api import buildGAPIObject, getHttpObj @@ -46,7 +45,7 @@ from gam.util.output import writeStdout from gam.util.tags import _substituteForUser from gam.cmd.drive.core import _validateUserGetFileIDs, getDriveFileEntity -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent from tempfile import TemporaryFile diff --git a/src/gam/cmd/userop/sheets.py b/src/gam/cmd/userop/sheets.py index f5fc1d36..9aebe4b7 100644 --- a/src/gam/cmd/userop/sheets.py +++ b/src/gam/cmd/userop/sheets.py @@ -4,13 +4,11 @@ Part of the _userop_tmp sub-package.""" """GAM user operations: Looker Studio, user groups, licenses, photos, profile, sheets, tokens, deprovision.""" -import re import json from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.svcacct import buildGAPIServiceObject from gam.util.api_call import callGAPI, callGAPIitems diff --git a/src/gam/cmd/userop/tokens.py b/src/gam/cmd/userop/tokens.py index 401bf702..14177897 100644 --- a/src/gam/cmd/userop/tokens.py +++ b/src/gam/cmd/userop/tokens.py @@ -11,7 +11,6 @@ from gam.cmd.userop.sheets import commonClientIds from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.access import ClientAPIAccessDeniedExit, entityUnknownWarning from gam.util.api import _getAdminEmail, buildGAPIObject diff --git a/src/gam/cmd/users/display.py b/src/gam/cmd/users/display.py index 5a23d247..263b67e8 100644 --- a/src/gam/cmd/users/display.py +++ b/src/gam/cmd/users/display.py @@ -34,7 +34,7 @@ from gamlib import gapi as GAPI from gamlib import state as GM from gamlib import msgs as Msg -from gam.var import Act, Cmd, Ent, Ind +from gam.var import Cmd, Ent, Ind from gamlib import skus as SKU from gamlib import uprop as UProp diff --git a/src/gam/cmd/users/manage.py b/src/gam/cmd/users/manage.py index e22460c2..474f3253 100644 --- a/src/gam/cmd/users/manage.py +++ b/src/gam/cmd/users/manage.py @@ -5,7 +5,6 @@ Part of the _users_tmp sub-package.""" """GAM user management.""" import re -import sys from gam.util.args import DEFAULT_CHOICE @@ -107,7 +106,7 @@ def hashPassword(password): Returns a tuple of (hashed_password, hash_function_name). The hash_function_name is always 'crypt' for Google's Directory API. """ - return (sha512_crypt.hash(password, rounds=10000), 'crypt') + return (sha512_crypt.using(rounds=10000).hash(password), 'crypt') def _getGroupOrgUnitMap(): @@ -139,7 +138,7 @@ def _getGroupOrgUnitMap(): closeFile(f) return groupOrgUnitMap -class PasswordOptions(): +class PasswordOptions: def __init__(self, updateCmd): self.password = '' self.notFoundPassword = '' diff --git a/src/gam/cmd/userservices.py b/src/gam/cmd/userservices.py index d954dc28..5c93739f 100644 --- a/src/gam/cmd/userservices.py +++ b/src/gam/cmd/userservices.py @@ -1,7 +1,6 @@ """GAM user service management: ASPs, backup codes, user calendars.""" import json -import sys from gam.util.args import formatLocalTimestamp @@ -22,7 +21,6 @@ from gam.cmd.calendar import ( from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.var import Act, Cmd, Ent, Ind from gam.util.access import checkEntityAFDNEorAccessErrorExit, entityUnknownWarning @@ -86,22 +84,6 @@ from gam.util.display import ( userYouTubeServiceNotEnabledWarning, ) from gam.util.entity import ( - APPLICATION_VND_GOOGLE_APPS, - ME_IN_OWNERS, - ME_IN_OWNERS_AND, - MIMETYPE_GA_3P_SHORTCUT, - MIMETYPE_GA_DOCUMENT, - MIMETYPE_GA_FOLDER, - MIMETYPE_GA_FORM, - MIMETYPE_GA_PRESENTATION, - MIMETYPE_GA_SHORTCUT, - MIMETYPE_GA_SPREADSHEET, - NOT_ME_IN_OWNERS, - NOT_ME_IN_OWNERS_AND, - QUERY_SHORTCUTS_MAP, - SHAREDDRIVE_QUERY_SHORTCUTS_MAP, - _getEntityMimeType, - _getTargetEntityMimeType, checkUserSuspended, convertEntityToList, convertUIDtoEmailAddress, diff --git a/src/gam/cmd/vault/holds.py b/src/gam/cmd/vault/holds.py index f1aaf19b..89c59a8d 100644 --- a/src/gam/cmd/vault/holds.py +++ b/src/gam/cmd/vault/holds.py @@ -4,7 +4,6 @@ Part of the _vault_tmp sub-package.""" """GAM Google Vault management.""" -import re import json from gam.cmd.vault.matters import _buildVaultQuery, _validateVaultQuery, convertHoldNameToID, convertMatterNameToID, convertQueryNameToID, formatVaultNameId, getMatterItem, warnMatterNotOpen @@ -19,9 +18,7 @@ from gam.cmd.vault.matters import ( import time from gamlib import api as API -from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.constants import NO_ENTITIES_FOUND_RC, PROJECTION_CHOICE_MAP diff --git a/src/gam/cmd/vault/matters.py b/src/gam/cmd/vault/matters.py index 6b97cfbf..95a18779 100644 --- a/src/gam/cmd/vault/matters.py +++ b/src/gam/cmd/vault/matters.py @@ -14,7 +14,6 @@ import time from gamlib import api as API from gamlib import settings as GC from gamlib import gapi as GAPI -from gamlib import state as GM from gamlib import msgs as Msg from gam.util.api import buildGAPIObject from gam.util.api_call import callGAPI, callGAPIpages @@ -528,7 +527,7 @@ def doCreateVaultExport(): body['exportOptions'][optionsField] = {'includeAccessInfo': includeAccessInfo} else: if exportFormat is not None: - if not exportFormat in VAULT_CORPUS_EXPORT_FORMATS[body['query']['corpus']]: + if exportFormat not in VAULT_CORPUS_EXPORT_FORMATS[body['query']['corpus']]: Cmd.SetLocation(formatLocation) invalidChoiceExit(exportFormat, VAULT_CORPUS_EXPORT_FORMATS[body['query']['corpus']], False) else: diff --git a/src/gam/constants.py b/src/gam/constants.py index 5532f927..1e14ee44 100644 --- a/src/gam/constants.py +++ b/src/gam/constants.py @@ -12,7 +12,7 @@ import sys from gamlib import settings as GC # Version and author (canonical source: gam/__init__.py) -from gam import __author__, __version__, __license__ +from gam import __author__, __version__ # Time formats IS08601_TIME_FORMAT = '%Y-%m-%dT%H:%M:%S%:z' diff --git a/src/gam/gamlib/action.py b/src/gam/gamlib/action.py index 3d9108ae..c63fd78a 100644 --- a/src/gam/gamlib/action.py +++ b/src/gam/gamlib/action.py @@ -20,7 +20,7 @@ """ -class GamAction(): +class GamAction: # Keys into NAMES; arbitrary values but must be unique ACCEPT = 'acpt' diff --git a/src/gam/gamlib/clargs.py b/src/gam/gamlib/clargs.py index ade9420f..409feedd 100644 --- a/src/gam/gamlib/clargs.py +++ b/src/gam/gamlib/clargs.py @@ -20,7 +20,7 @@ """ -class GamCLArgs(): +class GamCLArgs: # GAM entity types as specified on the command line ENTITY_BROWSER = 'ids' diff --git a/src/gam/gamlib/entity.py b/src/gam/gamlib/entity.py index 0b5401c1..bb869393 100644 --- a/src/gam/gamlib/entity.py +++ b/src/gam/gamlib/entity.py @@ -20,7 +20,7 @@ """ -class GamEntity(): +class GamEntity: ROLE_MANAGER = 'MANAGER' ROLE_MEMBER = 'MEMBER' diff --git a/src/gam/gamlib/indent.py b/src/gam/gamlib/indent.py index 383f875c..d455bd2d 100644 --- a/src/gam/gamlib/indent.py +++ b/src/gam/gamlib/indent.py @@ -20,7 +20,7 @@ """ -class GamIndent(): +class GamIndent: INDENT_SPACES_PER_LEVEL = ' ' diff --git a/src/gam/gamlib/yubikey.py b/src/gam/gamlib/yubikey.py index 5fc8bc38..e88489b7 100644 --- a/src/gam/gamlib/yubikey.py +++ b/src/gam/gamlib/yubikey.py @@ -55,7 +55,7 @@ YUBIKEY_NOT_FOUND_RC = 87 PIN_PUK_CHARS = string.ascii_letters+string.digits+string.punctuation -class YubiKey(): +class YubiKey: def __init__(self, service_account_info=None): self.key_type = None diff --git a/src/gam/util/access.py b/src/gam/util/access.py index f2c9f661..a34cfa47 100644 --- a/src/gam/util/access.py +++ b/src/gam/util/access.py @@ -4,7 +4,6 @@ Access-error diagnostics, API access denied handlers, and entity warning functions. """ -import sys from gamlib import action from gamlib import api as API @@ -15,12 +14,11 @@ from gamlib import state as GM from gamlib import indent from gamlib import msgs as Msg from gam.constants import API_ACCESS_DENIED_RC, INVALID_DOMAIN_RC -from util.api import _getAdminEmail, _getSvcAcctData, buildGAPIObject, APIAccessDeniedExit, ClientAPIAccessDeniedExit, SvcAcctAPIAccessDeniedExit, SvcAcctAPIDisabledExit +from util.api import _getAdminEmail, _getSvcAcctData, buildGAPIObject, APIAccessDeniedExit, ClientAPIAccessDeniedExit, SvcAcctAPIAccessDeniedExit, SvcAcctAPIDisabledExit # noqa: F401 from util.api_call import callGAPI from util.args import getEmailAddressDomain, getPhraseDNEorSNA from util.display import ENTITY_DOES_NOT_EXIST_RC, ENTITY_DUPLICATE_RC, entityActionFailedWarning, entityDoesNotExistWarning, entityServiceNotApplicableWarning -from util.errors import OAUTH2SERVICE_JSON_REQUIRED_RC -from util.output import currentCountNL, formatKeyValueList, setSysExitRC, stderrErrorMsg, systemErrorExit, writeStderr +from util.output import currentCountNL, formatKeyValueList, setSysExitRC, systemErrorExit, writeStderr diff --git a/src/gam/util/api.py b/src/gam/util/api.py index 838a5843..577b62d6 100644 --- a/src/gam/util/api.py +++ b/src/gam/util/api.py @@ -43,18 +43,16 @@ except ImportError: from gamlib import api as API from gamlib import settings as GC -from gamlib import gapi as GAPI -from gamlib import gdata as GDATA from gamlib import state as GM from gamlib import msgs as Msg from gamlib import yubikey from gam.var import Ent, Ind -from gam.constants import API_ACCESS_DENIED_RC, GOOGLE_API_ERROR_RC, HTTP_ERROR_RC, NETWORK_ERROR_RC, NO_SCOPES_FOR_API_RC, REFRESH_EXPIRY, SOCKET_ERROR_RC, SYSTEM_ERROR_RC -from util.args import UTF8, YYYYMMDDTHHMMSSZ_FORMAT, formatHTTPError -from util.display import FIRST_ITEM_MARKER, LAST_ITEM_MARKER, SERVICE_NOT_APPLICABLE_RC, TOTAL_ITEMS_MARKER, entityActionFailedWarning, printBlankLine, printKeyValueList, userServiceNotEnabledWarning +from gam.constants import API_ACCESS_DENIED_RC, GOOGLE_API_ERROR_RC, NETWORK_ERROR_RC, NO_SCOPES_FOR_API_RC, REFRESH_EXPIRY, SOCKET_ERROR_RC, SYSTEM_ERROR_RC +from util.args import UTF8, YYYYMMDDTHHMMSSZ_FORMAT +from util.display import SERVICE_NOT_APPLICABLE_RC, entityActionFailedWarning, printBlankLine, printKeyValueList, userServiceNotEnabledWarning from util.errors import INVALID_JSON_RC, OAUTH2SERVICE_JSON_REQUIRED_RC, OAUTH2_TXT_REQUIRED_RC, expiredRevokedOauth2TxtExit, invalidDiscoveryJsonExit, invalidOauth2TxtExit, invalidOauth2serviceJsonExit -from util.fileio import FILE_ERROR_RC, UNKNOWN, checkAPICallsRate, incrAPICallsRetryData, readFile, writeFile -from util.output import ERROR_PREFIX, flushStderr, setSysExitRC, stderrErrorMsg, systemErrorExit, writeStderr, writeStdout +from util.fileio import FILE_ERROR_RC, UNKNOWN, incrAPICallsRetryData, readFile, writeFile +from util.output import flushStderr, setSysExitRC, stderrErrorMsg, systemErrorExit, writeStderr, writeStdout HTML_TITLE_PATTERN = re.compile(r'.*