From 94f96b67546f6457f4dda2ad4d4ce420762b0c51 Mon Sep 17 00:00:00 2001 From: Samuel Grayson Date: Tue, 13 Jun 2023 15:19:11 -0500 Subject: [PATCH] Replace boolean methods with isinstance --- src/reposcanner/contrib.py | 7 +---- src/reposcanner/manager.py | 48 ++++++++++++++++++----------------- src/reposcanner/provenance.py | 7 ++--- src/reposcanner/requests.py | 45 -------------------------------- src/reposcanner/routines.py | 9 ++++--- src/{ => reposcanner}/util.py | 0 tests/test_baseRoutines.py | 14 +++++----- tests/test_requests.py | 20 --------------- 8 files changed, 42 insertions(+), 108 deletions(-) rename src/{ => reposcanner}/util.py (100%) diff --git a/src/reposcanner/contrib.py b/src/reposcanner/contrib.py index 7bc9748..fe50cc3 100644 --- a/src/reposcanner/contrib.py +++ b/src/reposcanner/contrib.py @@ -31,9 +31,6 @@ class CommitInfoMiningRoutine(OfflineRepositoryRoutine): authorship information, the commit message, and which files were interacted with. """ - def getRequestType(self): - return CommitInfoMiningRoutineRequest - def offlineImplementation(self, request, session): factory = DataEntityFactory() @@ -335,10 +332,8 @@ def __init__(self): try: import gambit except ImportError: - self.gambitIsAvailable = False self.gambitImportRef = None else: - self.gambitIsAvailable = True self.gambitImportRef = gambit def getRequestType(self): @@ -350,7 +345,7 @@ def getRequestType(self): def execute(self, request): responseFactory = ResponseFactory() - if not self.gambitIsAvailable: + if not self.gambitImportRef is not None: return responseFactory.createFailureResponse(message="Gambit is not \ installed, halting execution.") diff --git a/src/reposcanner/manager.py b/src/reposcanner/manager.py index c01758a..d604665 100644 --- a/src/reposcanner/manager.py +++ b/src/reposcanner/manager.py @@ -1,6 +1,7 @@ from reposcanner.git import CredentialKeychain from reposcanner.data import DataEntityStore from reposcanner.response import ResponseFactory +from reposcanner.requests import AnalysisRequestModel, ExternalCommandLineToolRoutineRequest, OnlineRoutineRequest, RepositoryRoutineRequestModel from reposcanner.routines import RepositoryRoutine, ExternalCommandLineToolRoutine from reposcanner.analyses import DataAnalysis import warnings @@ -63,7 +64,7 @@ def process(self, agents, store, notebook): if selectedAgent is not None: if notebook is not None: notebook.onTaskStart(self, store, selectedAgent) - if self._request.isAnalysisRequestType(): + if isinstance(self._request, AnalysisRequestModel): self._request.fetchDataFromStore(store) self._response = selectedAgent.run(self._request) if notebook is not None: @@ -73,7 +74,7 @@ def process(self, agents, store, notebook): self._response = responseFactory.createFailureResponse( message="No routine/analysis was found that could \ execute the request ({requestType}).".format( - requestType=type(request))) + requestType=type(self._request))) @abstractmethod def getResponseDescription(self): @@ -348,27 +349,28 @@ def isGUIModeEnabled(self): def buildTask(self, projectID, projectName, url, routineOrAnalysis): """Constructs a task to hold a request/response pair.""" requestType = routineOrAnalysis.getRequestType() - if requestType.isRoutineRequestType(): - if requestType.isExternalCommandLineToolRequestType(): - request = requestType(outputDirectory=self._outputDirectory) - task = ManagerExternalCommandLineToolTask(request) - return task - else: - if requestType.requiresOnlineAPIAccess(): - request = requestType(repositoryURL=url, - outputDirectory=self._outputDirectory, - keychain=self._keychain) - else: - request = requestType(repositoryURL=url, - outputDirectory=self._outputDirectory, - workspaceDirectory=self._workspaceDirectory) - task = ManagerRepositoryRoutineTask( - projectID=projectID, projectName=projectName, url=url, request=request) - return task - elif requestType.isAnalysisRequestType(): - request = requestType() - task = ManagerAnalysisTask(request) - return task + if issubclass(requestType, ExternalCommandLineToolRoutineRequest): + cmd_request = requestType(outputDirectory=self._outputDirectory) + cmd_task = ManagerExternalCommandLineToolTask(cmd_request) + return cmd_task + elif issubclass(requestType, OnlineRoutineRequest): + online_request = requestType(repositoryURL=url, + outputDirectory=self._outputDirectory, + keychain=self._keychain) + online_task = ManagerRepositoryRoutineTask( + projectID=projectID, projectName=projectName, url=url, request=online_request) + return online_task + elif issubclass(requestType, RepositoryRoutineRequestModel): + repo_request = requestType(repositoryURL=url, + outputDirectory=self._outputDirectory, + workspaceDirectory=self._workspaceDirectory) + repo_task = ManagerRepositoryRoutineTask( + projectID=projectID, projectName=projectName, url=url, request=repo_request) + return repo_task + elif issubclass(requestType, AnalysisRequestModel): + analysis_request = requestType() + analysis_task = ManagerAnalysisTask(analysis_request) + return analysis_task else: raise TypeError( "Encountered unrecognized request type when building task: {requestType}.".format( diff --git a/src/reposcanner/provenance.py b/src/reposcanner/provenance.py index 2a22c43..7d0547c 100644 --- a/src/reposcanner/provenance.py +++ b/src/reposcanner/provenance.py @@ -30,6 +30,8 @@ import subprocess import os import reposcanner.data as dataEntities +from reposcanner.manager import ManagerRepositoryRoutineTask +from reposcanner.requests import AnalysisRequestModel """ trungdong/prov, a W3C-compliant provenance Data Model @@ -265,8 +267,7 @@ def onTaskCreation(self, task): task: The ManagerTask object. """ - request = task.getRequest() - if request.isRoutineRequestType(): + if isinstance(task, ManagerRepositoryRoutineTask): task = self._document.activity("rs:task{taskid}".format(taskid=id(task)), other_attributes=( ('rs:requestType', task.getRequestClassName()), ('rs:projectID', task.getProjectID()), @@ -300,7 +301,7 @@ def onTaskStart(self, task, store, agent): # If the request is an analysis request, we can probe the request to see which # files it intends to grab from the data store. request = task.getRequest() - if request.isAnalysisRequestType(): + if isinstance(request, AnalysisRequestModel): filesToBeUsedInAnalysis = store.getByCriteria(request.getDataCriteria()) for entity in filesToBeUsedInAnalysis: entityID = None diff --git a/src/reposcanner/requests.py b/src/reposcanner/requests.py index 59503bc..18cea45 100644 --- a/src/reposcanner/requests.py +++ b/src/reposcanner/requests.py @@ -23,21 +23,8 @@ def hasErrors(self): def getErrors(self): return self._errors - @classmethod - def isRoutineRequestType(cls): - return False - - @classmethod - def isAnalysisRequestType(cls): - return False - class AnalysisRequestModel(BaseRequestModel): - - @classmethod - def isAnalysisRequestType(cls): - return True - def __init__(self, outputDirectory="./"): super().__init__() self._data = [] @@ -145,14 +132,6 @@ def __init__(self, outputDirectory): def getOutputDirectory(self): return self._outputDirectory - @classmethod - def isRoutineRequestType(cls): - return True - - @classmethod - def isExternalCommandLineToolRequestType(cls): - return True - class RepositoryRoutineRequestModel(BaseRequestModel): """ @@ -213,14 +192,6 @@ def getRepositoryLocation(self): def getOutputDirectory(self): return self._outputDirectory - @classmethod - def isRoutineRequestType(cls): - return True - - @classmethod - def isExternalCommandLineToolRequestType(cls): - return False - class OnlineRoutineRequest(RepositoryRoutineRequestModel): """ @@ -228,14 +199,6 @@ class OnlineRoutineRequest(RepositoryRoutineRequestModel): Request classes for OnlineRepositoryRoutine should inherit from this class. """ - @classmethod - def requiresOnlineAPIAccess(cls): - """ - Tells the caller whether this request requires access to an online - version control API. - """ - return True - def __init__( self, repositoryURL, @@ -286,14 +249,6 @@ class OfflineRoutineRequest(RepositoryRoutineRequestModel): Request classes for OfflineRepositoryRoutine should inherit from this class. """ - @classmethod - def requiresOnlineAPIAccess(cls): - """ - Tells the caller whether this request requires access to an online - version control API. - """ - return False - def __init__(self, repositoryURL, outputDirectory, workspaceDirectory): """ Additional Parameters: diff --git a/src/reposcanner/routines.py b/src/reposcanner/routines.py index 5c7f4f8..07c9263 100644 --- a/src/reposcanner/routines.py +++ b/src/reposcanner/routines.py @@ -4,6 +4,7 @@ import pygit2 from reposcanner.git import GitEntityFactory, RepositoryLocation from reposcanner.response import ResponseFactory +from reposcanner.requests import ExternalCommandLineToolRoutineRequest, OfflineRoutineRequest, OnlineRoutineRequest class DataMiningRoutine(ABC): @@ -112,14 +113,14 @@ def commandLineToolImplementation(self, request): def execute(self, request): responseFactory = ResponseFactory() - if not self.canHandleRequest(request): + if not self.canHandleRequest(request) or not isinstance(request, ExternalCommandLineToolRoutineRequest): return responseFactory.createFailureResponse( message="The routine was passed a request of the wrong type.") elif request.hasErrors(): return responseFactory.createFailureResponse( message="The request had errors in it and cannot be processed.", attachments=request.getErrors()) - elif not self.isExternalToolAvailable(): + elif not isinstance(request, ExternalCommandLineToolRoutineRequest): return responseFactory.createFailureResponse( message="The command-line tool required by this routine is not available or\ is otherwise unable to be called.") @@ -144,7 +145,7 @@ def execute(self, request): overriding that methods. """ responseFactory = ResponseFactory() - if not self.canHandleRequest(request): + if not self.canHandleRequest(request) or not isinstance(request, OfflineRoutineRequest): return responseFactory.createFailureResponse( message="The routine was passed a request of the wrong type.") elif request.hasErrors(): @@ -214,7 +215,7 @@ def execute(self, request): overriding those methods. """ responseFactory = ResponseFactory() - if not self.canHandleRequest(request): + if not self.canHandleRequest(request) or not isinstance(request, OnlineRoutineRequest): return responseFactory.createFailureResponse( message="The routine was passed a request of the wrong type.") elif request.hasErrors(): diff --git a/src/util.py b/src/reposcanner/util.py similarity index 100% rename from src/util.py rename to src/reposcanner/util.py diff --git a/tests/test_baseRoutines.py b/tests/test_baseRoutines.py index bf70128..9dd091f 100644 --- a/tests/test_baseRoutines.py +++ b/tests/test_baseRoutines.py @@ -136,8 +136,8 @@ def canAlwaysHandleRequest(self, request): routines.OfflineRepositoryRoutine.canHandleRequest = canAlwaysHandleRequest genericRoutine = routines.OfflineRepositoryRoutine() - genericRequest = requests.RepositoryRoutineRequestModel( - repositoryURL="https://github.com/owner/repo", outputDirectory="./") + genericRequest = requests.OfflineRoutineRequest( + repositoryURL="https://github.com/owner/repo", outputDirectory="./out", workspaceDirectory="./workspace") genericRequest.addError(message="Something has gone horribly wrong.") response = genericRoutine.run(genericRequest) assert(not response.wasSuccessful()) @@ -161,8 +161,8 @@ def canNeverHandleRequest(self, request): routines.OnlineRepositoryRoutine.canHandleRequest = canNeverHandleRequest genericRoutine = routines.OnlineRepositoryRoutine() - genericRequest = requests.RepositoryRoutineRequestModel( - repositoryURL="https://github.com/owner/repo", outputDirectory="./") + genericRequest = requests.OnlineRoutineRequest( + repositoryURL="https://github.com/owner/repo", outputDirectory="./out") response = genericRoutine.run(genericRequest) assert(not response.wasSuccessful()) assert(response.hasMessage()) @@ -179,7 +179,7 @@ def canAlwaysHandleRequest(self, request): routines.OnlineRepositoryRoutine.canHandleRequest = canAlwaysHandleRequest genericRoutine = routines.OnlineRepositoryRoutine() - genericRequest = requests.RepositoryRoutineRequestModel( + genericRequest = requests.OnlineRoutineRequest( repositoryURL="https://github.com/owner/repo", outputDirectory="./") genericRequest.addError(message="Something has gone horribly wrong.") response = genericRoutine.run(genericRequest) @@ -203,8 +203,8 @@ def canAlwaysHandleRequest(self, request): emptyAPICreator = gitEntityFactory.createVCSAPISessionCompositeCreator() genericRoutine.sessionCreator = emptyAPICreator - genericRequest = requests.RepositoryRoutineRequestModel( - repositoryURL="https://github.com/owner/repo", outputDirectory="./") + genericRequest = requests.OnlineRoutineRequest( + repositoryURL="https://github.com/owner/repo", outputDirectory="./", username="foo", password="bar") response = genericRoutine.run(genericRequest) assert(not response.wasSuccessful()) assert(response.hasMessage()) diff --git a/tests/test_requests.py b/tests/test_requests.py index 0ff1df9..50a7293 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -9,12 +9,6 @@ def test_AnalysisRequestModel_isDirectlyConstructible(): analysisRequest = requests.AnalysisRequestModel(outputDirectory="./") -def test_AnalysisRequestModel_isAnAnalysisRequestType(): - analysisRequest = requests.AnalysisRequestModel(outputDirectory="./") - assert(analysisRequest.isAnalysisRequestType()) - assert(not analysisRequest.isRoutineRequestType()) - - def test_AnalysisRequestModel_hasNoErrorsForValidInput(): analysisRequest = requests.AnalysisRequestModel(outputDirectory="./") assert(not analysisRequest.hasErrors()) @@ -52,13 +46,6 @@ def test_ExternalCommandLineToolRoutineRequest_isDirectlyConstructible(): requests.ExternalCommandLineToolRoutineRequest(outputDirectory="./") -def test_ExternalCommandLineToolRoutineRequest_isARoutineRequestType(): - commandLineToolRequest = requests.ExternalCommandLineToolRoutineRequest( - outputDirectory="./") - assert(not commandLineToolRequest.isAnalysisRequestType()) - assert(commandLineToolRequest.isRoutineRequestType()) - - def test_ExternalCommandLineToolRoutineRequest_hasNoErrorsForValidInput(): commandLineToolRequest = requests.ExternalCommandLineToolRoutineRequest( outputDirectory="./") @@ -87,13 +74,6 @@ def test_RepositoryRoutineRequestModel_isDirectlyConstructible(): outputDirectory="./") -def test_AnalysisRequestModel_isARoutineRequestType(): - routineRequest = requests.RepositoryRoutineRequestModel( - repositoryURL="https://github.com/owner/repo", outputDirectory="./") - assert(not routineRequest.isAnalysisRequestType()) - assert(routineRequest.isRoutineRequestType()) - - def test_RepositoryRoutineRequestModel_hasNoErrorsForValidInput(): request = requests.RepositoryRoutineRequestModel( repositoryURL="https://github.com/owner/repo", outputDirectory="./")