Exemplo n.º 1
0
 def delete_apex_checkpoint(self, **kwargs):
     if 'overlay_id' in kwargs:
         r = requests.delete(self.get_tooling_url()+"/sobjects/ApexExecutionOverlayAction/{0}".format(kwargs['overlay_id']), headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
         if self.__is_failed_request(r):
             self.__exception_handler(r)
         return util.generate_success_response('OK')
     else:
         id = kwargs.get('id', None)
         file_path = kwargs.get('file_path', None)
         line_number = kwargs.get('line_number', None)
         if id == None:
             ext = util.get_file_extension_no_period(file_path)
             api_name = util.get_file_name_no_extension(file_path)
             mtype = util.get_meta_type_by_suffix(ext)
             id = self.get_apex_entity_id_by_name(object_type=mtype['xmlName'], name=api_name)
         
         query_string = "Select Id from ApexExecutionOverlayAction Where ExecutableEntityId = '{0}' AND Line = {1}".format(id, line_number)
         r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
         if self.__is_failed_request(r):
             self.__exception_handler(r)
         query_result = util.parse_rest_response(r.text)
         overlay_id = query_result['records'][0]['Id']
         r = requests.delete(self.get_tooling_url()+"/sobjects/ApexExecutionOverlayAction/{0}".format(overlay_id), headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
         if self.__is_failed_request(r):
             self.__exception_handler(r)
         return util.generate_success_response('OK')
Exemplo n.º 2
0
 def create_trace_flag(self, payload):
     if 'ScopeId' not in payload:
         payload['ScopeId'] = self.user_id
     payload = json.dumps(payload)
     r = requests.post(self.get_tooling_url()+"/sobjects/TraceFlag", data=payload, headers=self.get_rest_headers('POST'), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     return util.parse_rest_response(r.text)
Exemplo n.º 3
0
 def new_metadatacontainer_for_this_user(self):
     payload = {}
     payload['Name'] = "MavensMate-"+self.user_id
     payload = json.dumps(payload)
     r = requests.post(self.get_tooling_url()+"/sobjects/MetadataContainer", data=payload, headers=self.get_rest_headers('POST'), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     return util.parse_rest_response(r.text)            
Exemplo n.º 4
0
 def delete_apex_checkpoints(self):
     query_string = 'Select Id FROM ApexExecutionOverlayAction'
     r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, proxies=self.__get_proxies(), headers=self.get_rest_headers(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     qr = util.parse_rest_response(r.text)
     for r in qr['records']:
         self.delete_tooling_entity("ApexExecutionOverlayAction", r["Id"])
Exemplo n.º 5
0
 def get_symbol_table(self, ids=[]):        
     id_string = "','".join(ids)
     id_string = "'"+id_string+"'"
     query_string = "Select ContentEntityId, ContentEntity.Name, SymbolTable From ApexClassMember Where ContentEntityId IN (" + id_string + ")"
     payload = { 'q' : query_string }
     r = requests.get(self.get_tooling_url()+"/query/", params=payload, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     return util.parse_rest_response(r.text)
Exemplo n.º 6
0
 def get_symbol_tables_by_class_id(self, ids=[]):        
     id_string = "','".join(ids)
     id_string = "'"+id_string+"'"
     query_string = "Select NamespacePrefix, SymbolTable, Name From ApexClass Where Id IN (" + id_string + ") AND NamespacePrefix = '"+self.get_org_namespace()+"'"
     payload = { 'q' : query_string }
     r = requests.get(self.get_tooling_url()+"/query/", params=payload, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     return util.parse_rest_response(r.text)
Exemplo n.º 7
0
 def delete_apex_checkpoint_results(self):
     query_string = 'Select Id From ApexExecutionOverlayResult Where UserId = \''+self.user_id+'\' order by CreatedDate'
     r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     qr = util.parse_rest_response(r.text)
     for record in qr['records']:
         self.delete_tooling_entity("ApexExecutionOverlayResult", record["Id"])
     return util.generate_success_response("Done")
Exemplo n.º 8
0
def sign_in(creds):
    r = requests.get('https://mavensmate.appspot.com/github',
                     params={
                         'username': creds['username'],
                         'password': creds['password']
                     },
                     proxies=urllib.getproxies(),
                     verify=False)
    r.raise_for_status()
    return util.parse_rest_response(r.text)
Exemplo n.º 9
0
 def delete_mavensmate_metadatacontainers_for_this_user(self):
     query_string = "Select Id from MetadataContainer Where Name = 'MavensMate-"+self.user_id+"'"
     r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     qr = util.parse_rest_response(r.text)
     responses = []
     for r in qr['records']:
         resp = self.delete_tooling_entity("MetadataContainer", r["Id"])
         responses.append(resp.status_code)
     return responses
Exemplo n.º 10
0
 def get_apex_checkpoint_results(self, user_id=None, limit=20):
     if user_id == None:
         user_id = self.user_id
     #dont query heapdump, soqlresult, or apexresult here - JF
     query_string = 'Select Id, CreatedDate, ActionScript, ActionScriptType, ExpirationDate, IsDumpingHeap, Iteration, Line, UserId From ApexExecutionOverlayResult order by CreatedDate desc limit '+str(limit)
     r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     qr = util.parse_rest_response(r.text)
     for record in qr['records']:
         heap_query = 'SELECT HeapDump, ApexResult, SOQLResult, ActionScript FROM ApexExecutionOverlayResult WHERE Id = \''+record['Id']+'\''
         rr = requests.get(self.get_tooling_url()+"/query/", params={'q':heap_query}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
         if rr.status_code != 200:
             self.__exception_handler(rr)
         qrr = util.parse_rest_response(rr.text)
         record["HeapDump"] = qrr['records'][0]['HeapDump']
         record["ApexResult"] = qrr['records'][0]['ApexResult']
         record["SOQLResult"] = qrr['records'][0]['SOQLResult']
         record["ActionScript"] = qrr['records'][0]['ActionScript']
     return qr
Exemplo n.º 11
0
 def get_metadata_container_id(self):
     query_string = "Select Id from MetadataContainer Where Name = 'MavensMate-"+self.user_id+"'"
     r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     query_result = util.parse_rest_response(r.text)
     #print query_result
     try:
         return query_result['records'][0]['Id']
     except:
         payload = {}
         payload['Name'] = "MavensMate-"+self.user_id
         payload = json.dumps(payload)
         r = requests.post(self.get_tooling_url()+"/sobjects/MetadataContainer", data=payload, headers=self.get_rest_headers('POST'), proxies=self.__get_proxies(), verify=False)
         if self.__is_failed_request(r):
             self.__exception_handler(r)
         create_response = util.parse_rest_response(r.text)
         if create_response["success"] == True:
             return create_response["id"]
         else:
             return "error"
Exemplo n.º 12
0
 def delete_debug_logs(self, scope="user"):
     if scope != "user":
         query_string = "Select Id From ApexLog"
     else:
         query_string = "Select Id From ApexLog WHERE LogUserId = '{0}'".format(self.user_id)
     r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     qr = util.parse_rest_response(r.text)
     for record in qr['records']:
         self.delete_tooling_entity("ApexLog", record["Id"])
     return util.generate_success_response("Done")
Exemplo n.º 13
0
 def get_apex_checkpoints(self, **kwargs):        
     if 'file_path' in kwargs:
         id = kwargs.get('id', None)
         file_path = kwargs.get('file_path', None)
         if id == None:
             ext = util.get_file_extension_no_period(file_path)
             api_name = util.get_file_name_no_extension(file_path)
             mtype = util.get_meta_type_by_suffix(ext)
             id = self.get_apex_entity_id_by_name(object_type=mtype['xmlName'], name=api_name)
         query_string = "Select Id, Line, Iteration, ExpirationDate, IsDumpingHeap from ApexExecutionOverlayAction Where ExecutableEntityId = '{0}'".format(id)
         payload = { 'q' : query_string }
         r = requests.get(self.get_tooling_url()+"/query/", params=payload, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
         if self.__is_failed_request(r):
             self.__exception_handler(r)
         return util.parse_rest_response(r.text)
     else:
         query_string = "Select Id, ScopeId, ExecutableEntityId, Line, Iteration, ExpirationDate, IsDumpingHeap from ApexExecutionOverlayAction limit 5000"
         payload = { 'q' : query_string }
         r = requests.get(self.get_tooling_url()+"/query/", params=payload, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
         if self.__is_failed_request(r):
             self.__exception_handler(r)
         return util.parse_rest_response(r.text)
Exemplo n.º 14
0
 def get_debug_logs(self, download_body=False, limit=20, scope="user"):
     if scope == "user":
         query_string = "Select Id,Application,Location,LogLength,LogUserId,Operation,Request,StartTime,Status From ApexLog WHERE LogUserId = '{0}' Order By StartTime desc limit {1}".format(self.user_id, limit)
     else:
         query_string = "Select Id,Application,Location,LogLength,LogUserId,Operation,Request,StartTime,Status From ApexLog Order By StartTime desc limit {1}".format(self.user_id, limit)
     r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
     if self.__is_failed_request(r):
         self.__exception_handler(r)
     qr = util.parse_rest_response(r.text)
     for record in qr['records']:
         if download_body:
             record['Body'] = self.download_log(record['Id'])
     return qr
Exemplo n.º 15
0
def sign_in(creds):
    r = requests.get('https://mavensmate.appspot.com/github', params={'username':creds['username'], 'password':creds['password']}, proxies=urllib.getproxies(), verify=False)
    r.raise_for_status()
    return util.parse_rest_response(r.text)
Exemplo n.º 16
0
    def run_async_apex_tests(self, params, dump_to_json=False):
        classes = params.get("classes", None)
        if classes == None:
            classes = params.get("files", None)
        if classes == None or classes == []:
            raise MMException("Please submit Apex test classes to run")
        responses = []
        debug(classes)
        downloaded_log_ids = []
        for c in classes:
            class_id = self.get_apex_entity_id_by_name(object_type="ApexClass", name=c)
            if class_id == None: continue
            params = {
                "ApexClassId" : class_id
            }
            payload = json.dumps(params)
            r = requests.post(self.get_tooling_url()+"/sobjects/ApexTestQueueItem", data=payload, headers=self.get_rest_headers('POST'), proxies=self.__get_proxies(), verify=False)
            if self.__is_failed_request(r):
                self.__exception_handler(r)
            res = util.parse_rest_response(r.text)
            if "success" not in res and "message" in res:
                raise MMException(r["message"])
            debug('test queue submission response')
            debug(res)
            if res["success"] == True:
                parentJobId = None
                qr = self.query("Select ParentJobId FROM ApexTestQueueItem WHERE Id='{0}'".format(res["id"]))
                if qr["done"] == True and qr["totalSize"] == 1 and 'records' in qr:
                    parentJobId = qr['records'][0]["ParentJobId"]
                finished = False
                while finished == False:
                    time.sleep(1)
                    query_string = "SELECT ApexClassId, ApexClass.Name, Status, ExtendedStatus FROM ApexTestQueueItem WHERE ParentJobId = '{0}'".format(parentJobId)
                    query_result = self.query(query_string)
                    if query_result["done"] == True and query_result["totalSize"] == 1 and 'records' in query_result:
                        done_statuses = ['Aborted', 'Completed', 'Failed']
                        if query_result['records'][0]["Status"] in done_statuses:
                            #now check for method results
                            qr = self.query("SELECT Outcome, ApexClassId, ApexClass.Name, MethodName, Message, StackTrace, ApexLogId FROM ApexTestResult WHERE AsyncApexJobId ='{0}'".format(parentJobId))
                            parent_response = query_result['records'][0]
                            parent_response["detailed_results"] = []
                            for r in qr["records"]:
                                parent_response["detailed_results"].append(r)
                                if "ApexLogId" in r and r["ApexLogId"] != None and r["ApexLogId"] not in downloaded_log_ids:
                                    cname = r["ApexClass"]["Name"]
                                    if os.path.isdir(os.path.join(config.connection.workspace,config.project.project_name,"debug","tests",cname)) == False:
                                        os.makedirs(os.path.join(config.connection.workspace,config.project.project_name,"debug","tests",cname))
                                    ts = time.time()
                                    if not config.is_windows:
                                        st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
                                    else:
                                        st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H %M %S')
                                    file_name = cname+"-"+st+".log"
                                    file_path = os.path.join(config.connection.workspace,config.project.project_name,"debug","tests",cname,file_name)
                                    debug_log_body = self.download_log(r["ApexLogId"])
                                    src = open(file_path, "w")
                                    src.write(debug_log_body)
                                    src.close()
                                    downloaded_log_ids.append(r["ApexLogId"]) 
                            responses.append(parent_response)
                            finished = True
            else:
                responses.append({"class":c,"success":False})

        if dump_to_json:
            return json.dumps(responses)
        else:
            return responses
Exemplo n.º 17
0
    def compile_with_tooling_api(self, files, container_id):
        for file_path in files:
            payload = {}
            file_name = file_path.split('.')[0]
            file_name = util.get_file_name_no_extension(file_path)
            metadata_def = util.get_meta_type_by_suffix(file_path.split('.')[-1])
            metadata_type = metadata_def['xmlName']
            if metadata_type == 'ApexPage':
                tooling_type = 'ApexPageMember'
            elif metadata_type == 'ApexComponent':
                tooling_type = 'ApexComponentMember'
            elif metadata_type == 'ApexClass':
                tooling_type = 'ApexClassMember'
            elif metadata_type == 'ApexTrigger':
                tooling_type = 'ApexTriggerMember'

            #create/submit "member"
            payload['MetadataContainerId']  = container_id
            if file_name in config.api_name_to_id_dict:
                payload['ContentEntityId']      = config.api_name_to_id_dict[file_name]
            else:
                payload['ContentEntityId']      = self.get_apex_entity_id_by_name(object_type=metadata_type, name=file_name)
            payload['Body']                 = open(file_path, 'r').read()
            #payload['LastSyncDate']         = TODO
            payload = json.dumps(payload)
            config.logger.debug(payload)
            r = requests.post(self.get_tooling_url()+"/sobjects/"+tooling_type, data=payload, headers=self.get_rest_headers('POST'), proxies=self.__get_proxies(), verify=False)
            response = util.parse_rest_response(r.text)
            
            #if the member already exists, patch it (TODO: cache member ids and go right to patch, handle exception)
            if type(response) is list and 'errorCode' in response[0]:
                debug('----> post to tooling member failed')
                #debug(response[0]['errorCode'])

                if response[0]['errorCode'] == 'DUPLICATE_VALUE':
                    dup_id = response[0]['message'].split(':')[-1]
                    dup_id = dup_id.strip()
                    
                    payload = json.loads(payload)
                    payload.pop("MetadataContainerId", None)
                    payload.pop("ContentEntityId", None)
                    payload = json.dumps(payload)
                    r = requests.patch(self.get_tooling_url()+"/sobjects/{0}/{1}".format(tooling_type, dup_id), data=payload, headers=self.get_rest_headers('PATCH'), proxies=self.__get_proxies(), verify=False)
                    if self.__is_failed_request(r):
                       self.__exception_handler(r)

                    member_id = dup_id
                elif response[0]['errorCode'] == 'INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY' or response[0]['errorCode'] == 'MALFORMED_ID':
                    debug('----> bad metadata container')
                    raise MetadataContainerException('Invalid metadata container')
                else:
                    return util.generate_error_response(response[0]['errorCode'])
            else:
                member_id = response['id']

        #ok, now we're ready to submit an async request
        payload = {}
        payload['MetadataContainerId'] = container_id
        payload['IsCheckOnly'] = False
        payload['IsRunTests'] = False
        payload = json.dumps(payload)
        config.logger.debug(payload)
        r = requests.post(self.get_tooling_url()+"/sobjects/ContainerAsyncRequest", data=payload, headers=self.get_rest_headers('POST'), proxies=self.__get_proxies(), verify=False)
        if self.__is_failed_request(r):
            self.__exception_handler(r)
        response = util.parse_rest_response(r.text)

        finished = False
        while finished == False:
            time.sleep(1)
            query_string = "Select Id, MetadataContainerId, MetadataContainerMemberId, State, IsCheckOnly, CompilerErrors, ErrorMsg FROM ContainerAsyncRequest WHERE Id='"+response["id"]+"'"
            r = requests.get(self.get_tooling_url()+"/query/", params={'q':query_string}, headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
            if self.__is_failed_request(r):
                self.__exception_handler(r)
            query_result = util.parse_rest_response(r.text)
            if query_result["done"] == True and query_result["size"] == 1 and 'records' in query_result:
                if query_result['records'][0]["State"] != 'Queued':
                    response = query_result['records'][0]
                    finished = True

        #clean up the apex member
        # if 'id' in response:
        #     #delete member
        #     r = requests.delete(self.get_tooling_url()+"/sobjects/{0}/{1}".format(tooling_type, member_id), headers=self.get_rest_headers(), proxies=self.__get_proxies(), verify=False)
        #     r.raise_for_status()

        return response