From 8e3fec5d1cdeaffba701ea84c80aec0f7c4d5560 Mon Sep 17 00:00:00 2001 From: David Schach Date: Tue, 13 Aug 2013 12:47:21 -0700 Subject: [PATCH 01/20] Custom templates shown in settings Ability to specify directory for custom templates existed, but default settings has not shown it. Note: Adding custom templates to MavensMate repository as well. --- mavensmate.sublime-settings | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/mavensmate.sublime-settings b/mavensmate.sublime-settings index af3f342..1d281fb 100644 --- a/mavensmate.sublime-settings +++ b/mavensmate.sublime-settings @@ -128,7 +128,8 @@ To override default MavensMate settings, modify user-specific settings (MavensMa "url" : "UrlRewriterApexClass.html", "webservice" : "WebserviceClass.html", "empty" : "ApexClassNoConstructor.html", - "default" : "ApexClass.html" + "default" : "ApexClass.html", + "standardcontroller" : "StandardController.html" }, "ApexTrigger" : { @@ -144,6 +145,38 @@ To override default MavensMate settings, modify user-specific settings (MavensMa } }, + //the location for user custom templates. If the value does not match a valid path, the default value will be a folder named "templates" in the mm_workspace directory + "mm_apex_templates_dir" : "", + + //uncomment a line to supply your own template in the templates directory, or add a new one + "mm_apex_templates_map" : { + "ApexClass" : + { + //"test" : "UnitTestApexClass.html", + //"exception" : "ExceptionApexClass.html", + //"batch" : "BatchApexClass.html", + //"schedulable" : "SchedulableApexClass.html", + //"email" : "EmailServiceApexClass.html", + //"url" : "UrlRewriterApexClass.html", + //"webservice" : "WebserviceClass.html", + //"empty" : "ApexClassNoConstructor.html", + //"default" : "ApexClass.html" + + }, + "ApexTrigger" : + { + //"default" : "ApexTrigger.html" + }, + "ApexComponent" : + { + //"default" : "ApexComponent.html" + }, + "ApexPage" : + { + //"default" : "ApexPage.html" + } + }, + //if true, MavensMate.app will start when Sublime Text starts "mm_start_app_on_st_startup" : true, From dc785dad3b5899c1339b22d5bcfbbbc65f97ec40 Mon Sep 17 00:00:00 2001 From: David Schach Date: Tue, 13 Aug 2013 12:57:13 -0700 Subject: [PATCH 02/20] Update help text Show example of full path, indicating that it does not have to be in the workspace directory --- mavensmate.sublime-settings | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mavensmate.sublime-settings b/mavensmate.sublime-settings index 1d281fb..2acc154 100644 --- a/mavensmate.sublime-settings +++ b/mavensmate.sublime-settings @@ -145,7 +145,9 @@ To override default MavensMate settings, modify user-specific settings (MavensMa } }, - //the location for user custom templates. If the value does not match a valid path, the default value will be a folder named "templates" in the mm_workspace directory + //the location for user custom templates. + //If the value does not match a valid path, the default value will be a folder named "templates" in the mm_workspace directory + //for example: "/Users/username/Documents/templates" (notice the absolute path and ability to place in any folder) "mm_apex_templates_dir" : "", //uncomment a line to supply your own template in the templates directory, or add a new one From 7d4e8bdf4ec7598adc864b7b619fa08b7de7a02d Mon Sep 17 00:00:00 2001 From: David Schach Date: Fri, 21 Feb 2014 16:19:24 -0800 Subject: [PATCH 03/20] Add additional DML types Include undelete and upsert as highlighted DML words in Apex --- sublime/lang/Apex.tmLanguage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sublime/lang/Apex.tmLanguage b/sublime/lang/Apex.tmLanguage index 083589a..5bc26ab 100644 --- a/sublime/lang/Apex.tmLanguage +++ b/sublime/lang/Apex.tmLanguage @@ -797,7 +797,7 @@ match - \b(?i:insert|update|delete)\b + \b(?i:insert|update|delete|undelete|upsert)\b name keyword.control.dml.apex From 8fea6a3b8fb80eb27741fab773dbae0e7dd8e16e Mon Sep 17 00:00:00 2001 From: David Schach Date: Thu, 27 Feb 2014 15:53:33 -0800 Subject: [PATCH 04/20] Add words to SOQL highlighting ALL ROWS, LIMIT, NOT, IN --- sublime/lang/Apex.tmLanguage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sublime/lang/Apex.tmLanguage b/sublime/lang/Apex.tmLanguage index 5bc26ab..5a97b0a 100644 --- a/sublime/lang/Apex.tmLanguage +++ b/sublime/lang/Apex.tmLanguage @@ -552,7 +552,7 @@ match - \b(?i:SELECT|FROM|WHERE|OR|AND|LIKE|CONTAINS|ORDER BY)\b + \b(?i:SELECT|FROM|WHERE|OR|AND|LIKE|NOT|IN|CONTAINS|ORDER BY|ALL ROWS|LIMIT)\b name variable.language.java.soql From 1c24c1d417e22fe1cfe80ccf1fd0f2ed05052685 Mon Sep 17 00:00:00 2001 From: dkurylo Date: Fri, 30 May 2014 18:31:57 +0300 Subject: [PATCH 05/20] Sounds for MavensMate --- lib/mm_response_handlers.py | 78 ++++++++++++++++++------------------ lib/sound.py | 47 ++++++++++++++++++++++ mavensmate.sublime-settings | 15 ++++++- sounds/failure.wav | Bin 0 -> 25190 bytes sounds/general.wav | Bin 0 -> 25326 bytes sounds/success.wav | Bin 0 -> 57388 bytes 6 files changed, 101 insertions(+), 39 deletions(-) create mode 100644 lib/sound.py create mode 100644 sounds/failure.wav create mode 100644 sounds/general.wav create mode 100644 sounds/success.wav diff --git a/lib/mm_response_handlers.py b/lib/mm_response_handlers.py index 3ee2552..ae493cd 100644 --- a/lib/mm_response_handlers.py +++ b/lib/mm_response_handlers.py @@ -8,6 +8,7 @@ import time import html.parser import re +from .sound import Sound from .threads import ThreadTracker from .threads import ThreadProgress from .threads import PanelThreadProgress @@ -42,7 +43,7 @@ def __init__(self, context): def execute(self): #describe_object if self.result == None: - self.__print_to_panel("[OPERATION FAILED]: No response from mm. Please enable logging (http://mavensmate.com/Plugins/Sublime_Text/Plugin_Logging) and post relevant log(s) to a new issue at https://github.com/joeferraro/MavensMate") + self.__print_to_panel("[OPERATION FAILED]: No response from mm. Please enable logging (http://mavensmate.com/Plugins/Sublime_Text/Plugin_Logging) and post relevant log(s) to a new issue at https://github.com/joeferraro/MavensMate", "failure") else: try: if self.operation == 'compile' or self.operation == 'compile_project': @@ -75,23 +76,23 @@ def __handle_compile_response(self, **kwargs): diff_merge_settings = config.settings.get('mm_diff_server_conflicts', False) if diff_merge_settings: if sublime.ok_cancel_dialog(self.result["body"], self.result["actions"][0].title()): - self.__print_to_panel("Diffing with server") + self.__print_to_panel("Diffing with server", "general") th = MavensMateDiffThread(self.thread.window, self.thread.view, self.result['tmp_file_path']) th.start() else: - self.__print_to_panel(self.result["actions"][1].title()) + self.__print_to_panel(self.result["actions"][1].title(), "general") else: if sublime.ok_cancel_dialog(self.result["body"], "Overwrite Server Copy"): - self.__print_to_panel("Overwriting server copy") + self.__print_to_panel("Overwriting server copy", "general") self.thread.params['action'] = 'overwrite' if kwargs.get("callback", None) != None: sublime.set_timeout(lambda: self.callback('compile', params=self.thread.params), 100) else: - self.__print_to_panel(self.result["actions"][1].title()) + self.__print_to_panel(self.result["actions"][1].title(), "general") else: try: if 'State' in self.result and self.result['State'] == 'Error' and 'ErrorMsg' in self.result: - self.__print_to_panel("[OPERATION FAILED]: {0}\n\n{1}".format(self.result['ErrorMsg'], 'If you are having difficulty compiling, try toggling the mm_compile_with_tooling_api setting to \'false\' or cleaning your project.')) + self.__print_to_panel("[OPERATION FAILED]: {0}\n\n{1}".format(self.result['ErrorMsg'], 'If you are having difficulty compiling, try toggling the mm_compile_with_tooling_api setting to \'false\' or cleaning your project.'), "failure") elif 'State' in self.result and self.result['State'] == 'Failed' and 'CompilerErrors' in self.result: #here we're parsing a response from the tooling endpoint errors = json.loads(self.result['CompilerErrors']) @@ -136,17 +137,17 @@ def __handle_compile_response(self, **kwargs): msg += "\n\nThe Tooling API has failed to compile a separate element of metadata in your current MetadataContainer. You can either:" msg += "\n1. Fix the compilation error on "+file_base_name msg += "\n2. Reset your MetadataContainer to clear this error: MavensMate > Utilities > Reset MetadataContainer" - self.__print_to_panel(msg) + self.__print_to_panel(msg, "failure") elif current_active_view_file_name == file_base_name: util.mark_line_numbers(self.thread.view, [line], "bookmark") - self.__print_to_panel("[COMPILE FAILED]: ({0}) {1} {2}".format(file_base_name, problem, line_col)) + self.__print_to_panel("[COMPILE FAILED]: ({0}) {1} {2}".format(file_base_name, problem, line_col), "failure") elif "ErrorMsg" in self.result: msg = '' if 'object has been modified on server' in self.result['ErrorMsg']: msg = self.result['ErrorMsg'] + '. You may try resetting your MetadataContainer to clear this error: MavensMate > Utilities > Reset MetadataContainer.' else: msg = self.result['ErrorMsg'] - self.__print_to_panel("[COMPILE FAILED]: {0}".format(msg)) + self.__print_to_panel("[COMPILE FAILED]: {0}".format(msg), "failure") elif 'success' in self.result and util.to_bool(self.result['success']) == False and (('messages' in self.result or 'Messages' in self.result) or 'details' in self.result): if 'details' in self.result and 'componentFailures' in self.result['details']: @@ -177,7 +178,7 @@ def __handle_compile_response(self, **kwargs): msg = ' [DEPLOYMENT FAILED]:' for f in failures: msg += f['name'] + ', ' + f['methodName'] + ': ' + f['message'] + '\n' - self.__print_to_panel(msg) + self.__print_to_panel(msg, "failure") elif 'run_test_result' in self.result: if 'run_test_result' in self.result and 'failures' in self.result['run_test_result'] and type( self.result['run_test_result']['failures'] ) == list: failures = self.result['run_test_result']['failures'] @@ -188,7 +189,7 @@ def __handle_compile_response(self, **kwargs): msg = ' [DEPLOYMENT FAILED]:' for f in failures: msg += f['name'] + ', ' + f['methodName'] + ': ' + f['message'] + '\n' - self.__print_to_panel(msg) + self.__print_to_panel(msg, "failure") else: #compile error, build error message msg = "" for m in messages: @@ -205,7 +206,7 @@ def __handle_compile_response(self, **kwargs): filename = re.sub(r'unpackaged/[A-Z,a-z]*/', '', filename) msg += filename + ': ' + m['problem'] + line_col + "\n" - self.__print_to_panel('[DEPLOYMENT FAILED]: ' + msg) + self.__print_to_panel('[DEPLOYMENT FAILED]: ' + msg, "failure") elif 'success' in self.result and self.result["success"] == False and 'line' in self.result: #this is a response from the apex compile api @@ -231,21 +232,21 @@ def __handle_compile_response(self, **kwargs): view.sel().add(sublime.Region(pt)) view.show(pt) - self.__print_to_panel('[COMPILE FAILED]: ' + self.result['problem'] + line_col) + self.__print_to_panel('[COMPILE FAILED]: ' + self.result['problem'] + line_col, "failure") elif 'success' in self.result and util.to_bool(self.result['success']) == True and 'Messages' in self.result and len(self.result['Messages']) > 0: msg = ' [Operation completed Successfully - With Compile Errors]\n' msg += '[COMPILE ERRORS] - Count:\n' for m in self.result['Messages']: msg += ' FileName: ' + m['fileName'] + ': ' + m['problem'] + 'Line: ' + m['lineNumber'] - self.__print_to_panel(msg) + self.__print_to_panel(msg, "failure") elif 'success' in self.result and util.to_bool(self.result['success']) == True: - self.__print_to_panel("Success") + self.__print_to_panel("Success", "success") elif 'success' in self.result and util.to_bool(self.result['success']) == False and 'body' in self.result: - self.__print_to_panel('[OPERATION FAILED]: ' + self.result['body']) + self.__print_to_panel('[OPERATION FAILED]: ' + self.result['body'], "failure") elif 'success' in self.result and util.to_bool(self.result['success']) == False: - self.__print_to_panel('[OPERATION FAILED]') + self.__print_to_panel('[OPERATION FAILED]', "failure") else: - self.__print_to_panel("Success") + self.__print_to_panel("Success", "success") except Exception as e: debug(e) debug(type(self.result)) @@ -263,13 +264,13 @@ def __handle_compile_response(self, **kwargs): msg = self.result else: msg = "Check Sublime Text console for error and report issue to MavensMate-SublimeText GitHub project." - self.__print_to_panel('[OPERATION FAILED]: ' + msg) + self.__print_to_panel('[OPERATION FAILED]: ' + msg, "failure") def __handle_coverage_result(self): if self.result == []: - self.__print_to_panel("No coverage information for the requested Apex Class") + self.__print_to_panel("No coverage information for the requested Apex Class", "general") elif 'records' in self.result and self.result["records"] == []: - self.__print_to_panel("No coverage information for the requested Apex Class") + self.__print_to_panel("No coverage information for the requested Apex Class", "general") else: if 'records' in self.result: self.result = self.result['records'] @@ -279,20 +280,20 @@ def __handle_coverage_result(self): record = self.result msg = str(record["percentCovered"]) + "%" util.mark_uncovered_lines(self.thread.view, record["Coverage"]["uncoveredLines"]) - self.__print_to_panel('[PERCENT COVERED]: ' + msg) + self.__print_to_panel('[PERCENT COVERED]: ' + msg, "general") def __handle_org_wide_coverage_result(self): if 'PercentCovered' not in self.result: - self.__print_to_panel("No coverage information available") + self.__print_to_panel("No coverage information available", "general") else: msg = str(self.result["PercentCovered"]) + "%" - self.__print_to_panel('[ORG-WIDE TEST COVERAGE]: ' + msg) + self.__print_to_panel('[ORG-WIDE TEST COVERAGE]: ' + msg, "general") def __handle_coverage_report_result(self): if self.result == []: - self.__print_to_panel("No coverage information available") + self.__print_to_panel("No coverage information available", "general") elif 'records' in self.result and self.result["records"] == []: - self.__print_to_panel("No coverage information available") + self.__print_to_panel("No coverage information available", "general") else: if 'records' in self.result: self.result = self.result['records'] @@ -325,7 +326,7 @@ def __handle_coverage_report_result(self): cls_msg += msg else: trg_msg += msg - self.__print_to_panel('Success') + self.__print_to_panel('Success', "general") new_view = self.thread.window.new_file() new_view.set_scratch(True) new_view.set_name("Apex Code Coverage") @@ -346,10 +347,11 @@ def __print_result(self): msg += '[OPERATION FAILED]: Whoops, unable to parse the response. Please enable logging (http://mavensmate.com/Plugins/Sublime_Text/Plugin_Logging) and post relevant log(s) to a new issue at https://github.com/joeferraro/MavensMate-SublimeText\n' msg += '[RESPONSE FROM MAVENSMATE]: '+json.dumps(self.result, indent=4) #debug(self.result) - self.__print_to_panel(msg) + self.__print_to_panel(msg, "failure") - def __print_to_panel(self, msg): + def __print_to_panel(self, msg, soundType): self.printer.panel.run_command('write_operation_status', {'text': msg, 'region': self.__get_print_region() }) + Sound.play( soundType ) def __get_print_region(self): return [self.status_region.end(), self.status_region.end()+10] @@ -385,10 +387,10 @@ def __handle_new_metadata(self): def __handle_generic_command_result(self): if self.result["success"] == True: - self.__print_to_panel("Success") + self.__print_to_panel("Success", "general") elif self.result["success"] == False: message = "[OPERATION FAILED]: "+self.result["body"] - self.__print_to_panel(message) + self.__print_to_panel(message, "failure") try: if self.thread.alt_callback != None: self.thread.alt_callback(self.result["body"]) @@ -397,7 +399,7 @@ def __handle_generic_command_result(self): def __handle_apex_script_result(self): if self.result["success"] == True and self.result["compiled"] == True: - self.__print_to_panel("Success") + self.__print_to_panel("Success", "success") self.thread.window.open_file(self.result["log_location"], sublime.TRANSIENT) elif self.result["success"] == False: message = "[OPERATION FAILED]: " @@ -407,7 +409,7 @@ def __handle_apex_script_result(self): message += self.result["exceptionMessage"] + "\n" if "exceptionStackTrace" in self.result and self.result["exceptionStackTrace"] != None: message += self.result["exceptionStackTrace"] + "\n" - self.__print_to_panel(message) + self.__print_to_panel(message, "failure") def __handle_test_result(self): responses = [] @@ -450,10 +452,10 @@ def __handle_test_result(self): #responses.append("{0} | {1} | {2} | {3}\n".format(r["MethodName"], r["Outcome"], r["StackTrace"], r["Message"])) responses.append(rstring) response_string += "\n\n".join(responses) - self.__print_to_panel(response_string) + self.__print_to_panel(response_string, "general") self.printer.scroll_to_bottom() else: - self.__print_to_panel(json.dumps(self.result)) + self.__print_to_panel(json.dumps(self.result), "general") elif len(self.result) > 1: #run multiple tests response_string = '' @@ -492,10 +494,10 @@ def __handle_test_result(self): response_string += "\t"+r["Message"].replace("\n","\t\n") response_string += "\n" response_string += "\n\n" - #self.__print_to_panel(response_string) + #self.__print_to_panel(response_string, "general") #self.printer.scroll_to_bottom() - self.__print_to_panel('Success') + self.__print_to_panel('Success', "general") new_view = self.thread.window.new_file() new_view.set_scratch(True) new_view.set_name("Run All Tests Result") @@ -508,4 +510,4 @@ def __handle_test_result(self): sublime.set_timeout(new_view.run_command('generic_text', {'text': response_string }), 1) elif 'body' in self.result: - self.__print_to_panel(json.dumps(self.result['body'])) + self.__print_to_panel(json.dumps(self.result['body']), "general") diff --git a/lib/sound.py b/lib/sound.py new file mode 100644 index 0000000..0c27ff1 --- /dev/null +++ b/lib/sound.py @@ -0,0 +1,47 @@ +# plays only wav files +try: + import sublime + import os + import sys + import MavensMate.config as config + + class Sound: + def __init__( self ): + self.data = [] + + def play( sound ): + settings = sublime.load_settings( "mavensmate.sublime-settings" ) + if settings != None: + doPlaySounds = settings.get( "mm_play_sounds", False ) + doPlayGeneralSounds = settings.get( "mm_play_general_sounds", False ) + doPlaySuccessSounds = settings.get( "mm_play_success_sounds", False ) + doPlayFailureSounds = settings.get( "mm_play_failure_sounds", False ) + generalSound = settings.get( "mm_general_sound_path", "" ) + if generalSound == "": + generalSound = os.path.join( config.mm_dir, "sounds", "general.wav" ) + successSound = settings.get( "mm_success_sound_path", "" ) + if successSound == "": + successSound = os.path.join( config.mm_dir, "sounds", "success.wav" ) + failureSound = settings.get( "mm_failure_sound_path", "" ) + if failureSound == "": + failureSound = os.path.join( config.mm_dir, "sounds", "failure.wav" ) + if doPlaySounds: + soundFile = "" + if sound == "general" and doPlayGeneralSounds == True: + soundFile = generalSound + elif sound == "success" and doPlaySuccessSounds == True: + soundFile = successSound + elif sound == "failure" and doPlayFailureSounds == True: + soundFile = failureSound + if soundFile != "" and os.path.isfile( "%s" % soundFile ) == True: + if "linux" in sys.platform: + import subprocess + subprocess.call(["aplay", soundFile]) + elif "darwin" in sys.platform: + import subprocess + subprocess.call(["afplay", soundFile]) + else: + import winsound + winsound.PlaySound( "%s" % soundFile, winsound.SND_FILENAME|winsound.SND_ASYNC ) +except Exception as e: + print(e) \ No newline at end of file diff --git a/mavensmate.sublime-settings b/mavensmate.sublime-settings index 4c3eeef..eca0294 100644 --- a/mavensmate.sublime-settings +++ b/mavensmate.sublime-settings @@ -215,5 +215,18 @@ To override default MavensMate settings, modify user-specific settings (MavensMa "mm_download_logs_during_run_all_tests" : false, //timeout (in seconds) for calls to the Salesforce.com servers - "mm_timeout" : 10 + "mm_timeout" : 10, + //global switch; set to play sounds on MM events, such as compile successes/failures, + //file refreshes, code coverage updates etc + "mm_play_sounds" : true, + + //set paths and events that should have sounds for different types of notifications; if empty/absent, + //then default will be used. Windows users should use double backslash for path: \\ + //only .wav files allowed + "mm_play_general_sounds" : true, + "mm_play_success_sounds" : true, + "mm_play_failure_sounds" : true, + "mm_general_sound_path" : "", + "mm_success_sound_path" : "", + "mm_failure_sound_path" : "" } \ No newline at end of file diff --git a/sounds/failure.wav b/sounds/failure.wav new file mode 100644 index 0000000000000000000000000000000000000000..472f39107190844ac725defe4aa9fd6fefa4d9dc GIT binary patch literal 25190 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 F{|B~-GC%+T literal 0 HcmV?d00001 diff --git a/sounds/general.wav b/sounds/general.wav new file mode 100644 index 0000000000000000000000000000000000000000..ed6ed85e67a18c5a8659c48f9adee841210bfe3c GIT binary patch literal 25326 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 literal 0 HcmV?d00001 From 522001fd2b22d8662e8f3986d27a09fc1fa0fadb Mon Sep 17 00:00:00 2001 From: Jai Harrison Date: Wed, 30 Jul 2014 10:41:20 +0100 Subject: [PATCH 06/20] parse_templates_package: Added in support for private bitbucket repositories. --- util.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/util.py b/util.py index 973af95..2000adc 100644 --- a/util.py +++ b/util.py @@ -108,6 +108,24 @@ def parse_templates_package(mtype=None): else: response = urllib.request.urlopen('https://raw.githubusercontent.com/{0}/{1}'.format(template_source, "package.json")).read().decode('utf-8') j = json.loads(response) + # TODO: Migrate the username, password and location to mavensmate settings. + elif template_location == 'bitbucket': + # create a password manager + password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() + # Add the username and password. + # If we knew the realm, we could use it instead of None. + top_level_url = "https://bitbucket.org/" + password_mgr.add_password(None, top_level_url, 'bitbucketusername', 'bitbucketpassword') + handler = urllib.request.HTTPBasicAuthHandler(password_mgr) + # create "opener" (OpenerDirector instance) + opener = urllib.request.build_opener(handler) + # use the opener to fetch a URL + opener.open("https://bitbucket.org/tquila-ondemand/mavensmate-templates/raw/master/package.json") + # Install the opener. + # Now all calls to urllib.request.urlopen use our opener. + urllib.request.install_opener(opener) + response = urllib.request.urlopen("https://bitbucket.org/tquila-ondemand/mavensmate-templates/raw/master/package.json").read().decode('utf-8') + j = json.loads(response) else: local_template_path = os.path.join(template_source,"package.json") debug(local_template_path) From 5ebbe5f85f87f1987bd4df72b16d25e3c4f8e8d1 Mon Sep 17 00:00:00 2001 From: James Melville Date: Thu, 31 Jul 2014 22:22:51 +0100 Subject: [PATCH 07/20] Enhance template functionality to enable retrieval of templates from private repositories on github or bitbucket. Manual http basic auth used as github returns 404 errors instead of 403, also improves performance. Ability to use personal api tokens for github instead of password https://github.com/blog/1509-personal-api-tokens Does not use keyring as unavailable within Sublime Not tested on Linux fixes joeferraro/MavensMate#313 --- mavensmate.sublime-settings | 23 +++++++++----- util.py | 61 ++++++++++++++++++++++--------------- 2 files changed, 52 insertions(+), 32 deletions(-) diff --git a/mavensmate.sublime-settings b/mavensmate.sublime-settings index 54bae73..66cf7dd 100644 --- a/mavensmate.sublime-settings +++ b/mavensmate.sublime-settings @@ -159,17 +159,26 @@ To override default MavensMate settings, modify user-specific settings (MavensMa ".html" ], - //template location, e.g. "remote" or "local" ("remote" refers to templates located on github) + //template location, e.g. "github" or "bitbucket" or "local". "remote" is synonymous with "github" "mm_template_location": "remote", //template location //if "mm_template_location" is set to "local", set to absolute location of the directory where you've forked the MavensMate-Templates project - //example: "mm_template_source" : "/path/to/templates" - //if "mm_template_location" is set to "remote", set to github location) - //example: "mm_template_source" : "username/reponame/branchname" - //project directory/repository must be in the format found here: https://github.com/joeferraro/MavensMate-Templates - "mm_template_source": "joeferraro/MavensMate-Templates/master", - + "mm_template_source" : "/path/to/templates", + + //if "mm_template_location" is set to "remote","github" or "bitbucket" set the repository owner, name and branch + "mm_template_repo_owner" : "joeferraro", + "mm_template_repo_name" : "MavensMate-Templates", + "mm_template_repo_branch" : "master", + + //if you need to access a secured repository, set mm_template_auth to true, and set username and password as appropriate + //if using github, it is recommended that you generate an OAuth token here https://github.com/settings/applications#personal-access-tokens + //and set that as your username, leaving the password blank + //bitbucket does not appear to offer this capability at present + "mm_template_auth" : false, + "mm_template_username" : "", + "mm_template_password" : "", + //if true, MavensMate.app will start when Sublime Text starts "mm_start_app_on_st_startup" : true, diff --git a/util.py b/util.py index 2000adc..c8de654 100644 --- a/util.py +++ b/util.py @@ -20,6 +20,7 @@ # except ImportError: # import urllib.request as urllib import urllib.request +import base64 if sys.version_info >= (3, 0): #python 3 @@ -100,34 +101,12 @@ def parse_json_from_file(location): def parse_templates_package(mtype=None): try: settings = sublime.load_settings('mavensmate.sublime-settings') - template_source = settings.get('mm_template_source', 'joeferraro/MavensMate-Templates/master') template_location = settings.get('mm_template_location', 'remote') - if template_location == 'remote': - if 'linux' in sys.platform: - response = os.popen('wget https://raw.githubusercontent.com/{0}/{1} -q -O -'.format(template_source, "package.json")).read() - else: - response = urllib.request.urlopen('https://raw.githubusercontent.com/{0}/{1}'.format(template_source, "package.json")).read().decode('utf-8') - j = json.loads(response) - # TODO: Migrate the username, password and location to mavensmate settings. - elif template_location == 'bitbucket': - # create a password manager - password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() - # Add the username and password. - # If we knew the realm, we could use it instead of None. - top_level_url = "https://bitbucket.org/" - password_mgr.add_password(None, top_level_url, 'bitbucketusername', 'bitbucketpassword') - handler = urllib.request.HTTPBasicAuthHandler(password_mgr) - # create "opener" (OpenerDirector instance) - opener = urllib.request.build_opener(handler) - # use the opener to fetch a URL - opener.open("https://bitbucket.org/tquila-ondemand/mavensmate-templates/raw/master/package.json") - # Install the opener. - # Now all calls to urllib.request.urlopen use our opener. - urllib.request.install_opener(opener) - response = urllib.request.urlopen("https://bitbucket.org/tquila-ondemand/mavensmate-templates/raw/master/package.json").read().decode('utf-8') + if template_location == 'remote' or template_location == 'github' or template_location == 'bitbucket': + response = get_remote_package_json() j = json.loads(response) else: - local_template_path = os.path.join(template_source,"package.json") + local_template_path = os.path.join(settings.get('mm_template_source'),"package.json") debug(local_template_path) j = parse_json_from_file(local_template_path) if j == None or j == {}: @@ -142,6 +121,38 @@ def parse_templates_package(mtype=None): else: return j +def get_remote_package_json(): + settings = sublime.load_settings('mavensmate.sublime-settings') + auth = settings.get('mm_template_auth',False) + template_location = settings.get('mm_template_location', 'github') + template_repo_owner = settings.get('mm_template_repo_owner', 'joeferraro') + template__repo_name = settings.get('mm_template_repo_name', 'MavensMate-Templates') + template_repo_branch = settings.get('mm_template_repo_branch', 'master') + username = settings.get('mm_template_username') + password = settings.get('mm_template_password') + + if template_location == 'github' or template_location == 'remote': + if auth: + endpoint = ("https://api.github.com/repos/{0}/{1}/contents/package.json?ref={2}").format(template_repo_owner, template__repo_name, template_repo_branch) + else: + endpoint = ("https://raw.githubusercontent.com/{0}/{1}/{2}/package.json").format(template_repo_owner, template__repo_name, template_repo_branch) + elif template_location == 'bitbucket': + endpoint = ("https://bitbucket.org/{0}/{1}/raw/{2}/package.json").format(template_repo_owner, template__repo_name, template_repo_branch) + + if 'linux' in sys.platform: + if auth: + command = "wget {0} --header='Accept: application/vnd.github.VERSION.raw' --http-user={1} --http-password={2} -q -O -".format(endpoint, username, password) + else: + command = "wget {0} --header='Accept: application/vnd.github.VERSION.raw' -q -O -".format(endpoint) + + return os.popen(command).read() + + else: + req = urllib.request.Request(endpoint) + if auth: + req.add_header('Authorization', b'Basic ' + base64.b64encode(username.encode('ascii') + b':' + password.encode('ascii'))) + req.add_header('Accept', 'application/vnd.github.VERSION.raw') + return urllib.request.urlopen(req).read().decode('utf-8') def get_number_of_lines_in_file(file_path): f = open(file_path) From e40500ef91d96f11f54b34e00d58ea866db11755 Mon Sep 17 00:00:00 2001 From: David Esposito Date: Wed, 6 Aug 2014 13:04:22 -0400 Subject: [PATCH 08/20] fixes #354 - properly splits filename on all platforms when setting a checkpoint --- mavensmate.py | 14 ++++++-------- util.py | 4 ++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/mavensmate.py b/mavensmate.py index 3362bf8..f4fabc4 100755 --- a/mavensmate.py +++ b/mavensmate.py @@ -1099,11 +1099,9 @@ def run(self): debug('attempting to load apex overlays for current file') try: active_view = self.window.active_view() - fileName, ext = os.path.splitext(active_view.file_name()) - debug(fileName) - debug(ext) + fileName, ext = os.path.splitext(os.path.basename(util.get_active_file())) if ext == ".cls" or ext == ".trigger": - api_name = fileName.split("/")[-1] + api_name = fileName overlays = util.parse_json_from_file(util.mm_project_directory()+"/config/.overlays") lines = [] for o in overlays: @@ -1122,9 +1120,9 @@ class DeleteApexCheckpointCommand(sublime_plugin.WindowCommand): def run(self): #options = [['Delete All In This File', '*']] options = [] - fileName, ext = os.path.splitext(util.get_active_file()) + fileName, ext = os.path.splitext(os.path.basename(util.get_active_file())) if ext == ".cls" or ext == ".trigger": - self.api_name = fileName.split("/")[-1] + self.api_name = fileName overlays = util.get_execution_overlays(util.get_active_file()) for o in overlays: options.append(['Line '+str(o["Line"]), str(o["Id"])]) @@ -1204,13 +1202,13 @@ def is_enabled(command): #creates a new overlay class NewApexCheckpoint(sublime_plugin.WindowCommand): def run(self): - fileName, ext = os.path.splitext(util.get_active_file()) + fileName, ext = os.path.splitext(os.path.basename(util.get_active_file())) if ext == ".cls" or ext == ".trigger": if ext == '.cls': self.object_type = 'ApexClass' else: self.object_type = 'ApexTrigger' - self.api_name = fileName.split("/")[-1] + self.api_name = fileName number_of_lines = util.get_number_of_lines_in_file(util.get_active_file()) lines = list(range(number_of_lines)) options = [] diff --git a/util.py b/util.py index 973af95..0f0ad69 100644 --- a/util.py +++ b/util.py @@ -134,9 +134,9 @@ def get_number_of_lines_in_file(file_path): def get_execution_overlays(file_path): try: response = [] - fileName, ext = os.path.splitext(file_path) + fileName, ext = os.path.splitext(os.path.basename(file_path)) if ext == ".cls" or ext == ".trigger": - api_name = fileName.split("/")[-1] + api_name = fileName overlays = parse_json_from_file(mm_project_directory()+"/config/.overlays") for o in overlays: if o['API_Name'] == api_name: From f92189058237c67a515580de34eb8c685b8571ac Mon Sep 17 00:00:00 2001 From: Charles Koppelman Date: Tue, 13 Jan 2015 23:14:01 -0500 Subject: [PATCH 09/20] Added DESC and ASC to SOQL --- sublime/lang/Apex.tmLanguage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sublime/lang/Apex.tmLanguage b/sublime/lang/Apex.tmLanguage index 083589a..65452d3 100644 --- a/sublime/lang/Apex.tmLanguage +++ b/sublime/lang/Apex.tmLanguage @@ -552,7 +552,7 @@ match - \b(?i:SELECT|FROM|WHERE|OR|AND|LIKE|CONTAINS|ORDER BY)\b + \b(?i:SELECT|FROM|WHERE|OR|AND|LIKE|CONTAINS|ORDER BY|DESC|ASC)\b name variable.language.java.soql From 4f2b3556d4173581ee230794f1edd48c060f6d95 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Monette Date: Wed, 11 Feb 2015 13:03:37 +0000 Subject: [PATCH 10/20] Matching additional SOQL clauses --- sublime/lang/Apex.tmLanguage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sublime/lang/Apex.tmLanguage b/sublime/lang/Apex.tmLanguage index 083589a..ae08f94 100644 --- a/sublime/lang/Apex.tmLanguage +++ b/sublime/lang/Apex.tmLanguage @@ -552,7 +552,7 @@ match - \b(?i:SELECT|FROM|WHERE|OR|AND|LIKE|CONTAINS|ORDER BY)\b + \b(?i:SELECT|FROM|WHERE|OR|AND|LIKE|CONTAINS|ORDER BY|TYPEOF|USING|WITH|GROUP BY|HAVING|LIMIT|OFFSET|FOR REFERENCE|FOR VIEW|UPDATE TRACKING|UPDATE VIEWSTAT)\b name variable.language.java.soql From 7e64bc8465494dbc48c6a0d3de3657a24903ef0b Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Sun, 29 Mar 2015 13:06:39 -0600 Subject: [PATCH 11/20] fix typo in pull #540 add release info for #540 --- messages.json | 3 ++- messages/4.0.4.txt | 14 ++++++++++++++ sublime/lang/Apex.tmLanguage | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 messages/4.0.4.txt diff --git a/messages.json b/messages.json index e3038bd..77ed7ea 100644 --- a/messages.json +++ b/messages.json @@ -1,5 +1,6 @@ { "install": "messages/install.txt", "4.0.2": "messages/4.0.2.txt", - "4.0.3": "messages/4.0.3.txt" + "4.0.3": "messages/4.0.3.txt", + "4.0.4": "messages/4.0.4.txt" } \ No newline at end of file diff --git a/messages/4.0.4.txt b/messages/4.0.4.txt new file mode 100644 index 0000000..39f1054 --- /dev/null +++ b/messages/4.0.4.txt @@ -0,0 +1,14 @@ +MavensMate-SublimeText 4.0.4 changelog + +- Improvements to SOQL syntax highlighting + +MavensMate-SublimeText 4.0.3 changelog + +- Fixes trailing comma in messages.json, so release notes should now display automatically upon plugin updates + +MavensMate-SublimeText 4.0.2 changelog + +- Fixes issue where incorrect version number was being displayed in Panel and About +- mm tool now downloaded/installed to User/MavensMate directory to ensure package updates don't require mm download +- implements mm_beta_user setting that when true will download pre-release versions of the mm command-line tool +- implements check for OSX 10.7.x and debug message to let those users know that special setup is required \ No newline at end of file diff --git a/sublime/lang/Apex.tmLanguage b/sublime/lang/Apex.tmLanguage index ae08f94..6b7babe 100644 --- a/sublime/lang/Apex.tmLanguage +++ b/sublime/lang/Apex.tmLanguage @@ -552,7 +552,7 @@ match - \b(?i:SELECT|FROM|WHERE|OR|AND|LIKE|CONTAINS|ORDER BY|TYPEOF|USING|WITH|GROUP BY|HAVING|LIMIT|OFFSET|FOR REFERENCE|FOR VIEW|UPDATE TRACKING|UPDATE VIEWSTAT)\b + \b(?i:SELECT|FROM|WHERE|OR|AND|LIKE|CONTAINS|ORDER BY|TYPEOF|USING|WITH|GROUP BY|HAVING|LIMIT|OFFSET|FOR REFERENCE|FOR VIEW|UPDATE TRACKING|UPDATE VIEWSTATE)\b name variable.language.java.soql From c6f16ce77098f9dfa60057e91dacbab99946edf7 Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Sun, 29 Mar 2015 13:31:01 -0600 Subject: [PATCH 12/20] update release message for pull #430 --- messages/4.0.4.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/messages/4.0.4.txt b/messages/4.0.4.txt index 39f1054..ea6dfc0 100644 --- a/messages/4.0.4.txt +++ b/messages/4.0.4.txt @@ -1,6 +1,7 @@ MavensMate-SublimeText 4.0.4 changelog - Improvements to SOQL syntax highlighting +- Fix windows issues with loading checkpoint (issue #354) MavensMate-SublimeText 4.0.3 changelog From 40b0bbf497f3a810c205a8fd1bc38baef84fd1ac Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Sun, 29 Mar 2015 13:41:20 -0600 Subject: [PATCH 13/20] release message for pull #427 --- messages/4.0.4.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/messages/4.0.4.txt b/messages/4.0.4.txt index ea6dfc0..ee222e1 100644 --- a/messages/4.0.4.txt +++ b/messages/4.0.4.txt @@ -2,6 +2,7 @@ MavensMate-SublimeText 4.0.4 changelog - Improvements to SOQL syntax highlighting - Fix windows issues with loading checkpoint (issue #354) +- Ability to retrieve templates from Bitbucket and Github, including private repos repos (GitHub only) (issue #30 / pull #427) MavensMate-SublimeText 4.0.3 changelog From aea1667827adc47a3f205200d4ce0296d0ae9b26 Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Sun, 29 Mar 2015 13:50:35 -0600 Subject: [PATCH 14/20] update 4.0.4 for pull request #317 --- messages/4.0.4.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messages/4.0.4.txt b/messages/4.0.4.txt index ee222e1..ec88a29 100644 --- a/messages/4.0.4.txt +++ b/messages/4.0.4.txt @@ -1,6 +1,6 @@ MavensMate-SublimeText 4.0.4 changelog -- Improvements to SOQL syntax highlighting +- Improvements to SOQL and DML syntax highlighting - Fix windows issues with loading checkpoint (issue #354) - Ability to retrieve templates from Bitbucket and Github, including private repos repos (GitHub only) (issue #30 / pull #427) From 07dc26cc895f64e204385045ae5de5c83b82ae40 Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Sun, 29 Mar 2015 17:10:34 -0600 Subject: [PATCH 15/20] disable sounds by default, add message for pull #385 --- mavensmate.sublime-settings | 2 +- messages/4.0.4.txt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mavensmate.sublime-settings b/mavensmate.sublime-settings index 1c7b684..9f0376d 100644 --- a/mavensmate.sublime-settings +++ b/mavensmate.sublime-settings @@ -249,7 +249,7 @@ To override default MavensMate settings, modify user-specific settings (MavensMa //global switch; set to play sounds on MM events, such as compile successes/failures, //file refreshes, code coverage updates etc - "mm_play_sounds" : true, + "mm_play_sounds" : false, //set paths and events that should have sounds for different types of notifications; if empty/absent, //then default will be used. Windows users should use double backslash for path: \\ diff --git a/messages/4.0.4.txt b/messages/4.0.4.txt index ec88a29..8c4b8dc 100644 --- a/messages/4.0.4.txt +++ b/messages/4.0.4.txt @@ -1,8 +1,9 @@ MavensMate-SublimeText 4.0.4 changelog - Improvements to SOQL and DML syntax highlighting -- Fix windows issues with loading checkpoint (issue #354) -- Ability to retrieve templates from Bitbucket and Github, including private repos repos (GitHub only) (issue #30 / pull #427) +- Fix windows issues with loading checkpoint (ref #354) +- Ability to retrieve templates from Bitbucket and Github, including private repos repos (GitHub only) (ref #30, #427) +- Sounds for mavens mate actions (disabled by default) (ref #385) MavensMate-SublimeText 4.0.3 changelog From fd8e4200b5af8a64a928034e403d88124c92de71 Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Sun, 29 Mar 2015 17:55:18 -0600 Subject: [PATCH 16/20] bump version --- packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages.json b/packages.json index 4c15bc0..d87847e 100644 --- a/packages.json +++ b/packages.json @@ -10,7 +10,7 @@ "platforms": { "osx": [ { - "version": "4.0.2", + "version": "4.0.4", "release_notes": "IMPORTANT: 4.0.x now available. To update, visit: http://mavensmate.com/Upgrade_Help", "url": "https://nodeload.github.com/joeferraro/MavensMate-SublimeText/zipball/master" } From e7deb63bc4b3e9d645890e0c69d9a9de83c3a0bc Mon Sep 17 00:00:00 2001 From: Dmytro Date: Mon, 20 Apr 2015 17:47:51 +0300 Subject: [PATCH 17/20] Update mavensmate.sublime-settings --- mavensmate.sublime-settings | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/mavensmate.sublime-settings b/mavensmate.sublime-settings index eca0294..ddb8b00 100644 --- a/mavensmate.sublime-settings +++ b/mavensmate.sublime-settings @@ -110,9 +110,6 @@ To override default MavensMate settings, modify user-specific settings (MavensMa //set to true if you want a history of your executed apex scripts in project/apex-scripts "mm_log_anonymous_apex" : true, - //set to true to play notification sounds - "mm_play_sounds" : true, - //local server port "mm_server_port" : 7777, @@ -216,17 +213,18 @@ To override default MavensMate settings, modify user-specific settings (MavensMa //timeout (in seconds) for calls to the Salesforce.com servers "mm_timeout" : 10, - //global switch; set to play sounds on MM events, such as compile successes/failures, - //file refreshes, code coverage updates etc + + //set to true to play notification sounds "mm_play_sounds" : true, - //set paths and events that should have sounds for different types of notifications; if empty/absent, - //then default will be used. Windows users should use double backslash for path: \\ - //only .wav files allowed - "mm_play_general_sounds" : true, - "mm_play_success_sounds" : true, - "mm_play_failure_sounds" : true, + //set true to play sounds on MM events (compile successes/failures, file refreshes, code coverage updates etc) + "mm_play_general_sounds" : false, + "mm_play_success_sounds" : false, + "mm_play_failure_sounds" : false, + + //set paths for custom MM event sounds; if empty/absent then default will be used + //only .wav files allowed; Windows users should use double backslash for path: \\ "mm_general_sound_path" : "", "mm_success_sound_path" : "", "mm_failure_sound_path" : "" -} \ No newline at end of file +} From 850afabeb132abf161c82ef6a52f21ec46dad1a7 Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Mon, 4 May 2015 07:15:12 -0600 Subject: [PATCH 18/20] Revert "Ability to retrieve templates from Bitbucket and Github, including private repos" --- mavensmate.sublime-settings | 23 ++++++-------------- util.py | 43 ++++++------------------------------- 2 files changed, 14 insertions(+), 52 deletions(-) diff --git a/mavensmate.sublime-settings b/mavensmate.sublime-settings index 1a21310..f7dc86f 100644 --- a/mavensmate.sublime-settings +++ b/mavensmate.sublime-settings @@ -174,26 +174,17 @@ To override default MavensMate settings, modify user-specific settings (MavensMa ".apxt" ], - //template location, e.g. "github" or "bitbucket" or "local". "remote" is synonymous with "github" + //template location, e.g. "remote" or "local" ("remote" refers to templates located on github) "mm_template_location": "remote", //template location //if "mm_template_location" is set to "local", set to absolute location of the directory where you've forked the MavensMate-Templates project - "mm_template_source" : "/path/to/templates", - - //if "mm_template_location" is set to "remote","github" or "bitbucket" set the repository owner, name and branch - "mm_template_repo_owner" : "joeferraro", - "mm_template_repo_name" : "MavensMate-Templates", - "mm_template_repo_branch" : "master", - - //if you need to access a secured repository, set mm_template_auth to true, and set username and password as appropriate - //if using github, it is recommended that you generate an OAuth token here https://github.com/settings/applications#personal-access-tokens - //and set that as your username, leaving the password blank - //bitbucket does not appear to offer this capability at present - "mm_template_auth" : false, - "mm_template_username" : "", - "mm_template_password" : "", - + //example: "mm_template_source" : "/path/to/templates" + //if "mm_template_location" is set to "remote", set to github location) + //example: "mm_template_source" : "username/reponame/branchname" + //project directory/repository must be in the format found here: https://github.com/joeferraro/MavensMate-Templates + "mm_template_source": "joeferraro/MavensMate-Templates/master", + //the default metadata available in a project (may be set on a per-project basis in the "advanced" tab of the new and edit project UIs) "mm_default_subscription" : [ "ApexClass", diff --git a/util.py b/util.py index aaaf84a..39e4ded 100644 --- a/util.py +++ b/util.py @@ -12,7 +12,6 @@ from xml.dom.minidom import parse import urllib.request -import base64 import MavensMate.config as config import MavensMate.lib.apex.apex_extensions as apex_extensions @@ -76,12 +75,16 @@ def parse_json_from_file(location): def parse_templates_package(mtype=None): try: settings = sublime.load_settings('mavensmate.sublime-settings') + template_source = settings.get('mm_template_source', 'joeferraro/MavensMate-Templates/master') template_location = settings.get('mm_template_location', 'remote') - if template_location == 'remote' or template_location == 'github' or template_location == 'bitbucket': - response = get_remote_package_json() + if template_location == 'remote': + if 'linux' in sys.platform: + response = os.popen('wget https://raw.githubusercontent.com/{0}/{1} -q -O -'.format(template_source, "package.json")).read() + else: + response = urllib.request.urlopen('https://raw.githubusercontent.com/{0}/{1}'.format(template_source, "package.json")).read().decode('utf-8') j = json.loads(response) else: - local_template_path = os.path.join(settings.get('mm_template_source'),"package.json") + local_template_path = os.path.join(template_source,"package.json") debug(local_template_path) j = parse_json_from_file(local_template_path) if j == None or j == {}: @@ -96,38 +99,6 @@ def parse_templates_package(mtype=None): else: return j -def get_remote_package_json(): - settings = sublime.load_settings('mavensmate.sublime-settings') - auth = settings.get('mm_template_auth',False) - template_location = settings.get('mm_template_location', 'github') - template_repo_owner = settings.get('mm_template_repo_owner', 'joeferraro') - template__repo_name = settings.get('mm_template_repo_name', 'MavensMate-Templates') - template_repo_branch = settings.get('mm_template_repo_branch', 'master') - username = settings.get('mm_template_username') - password = settings.get('mm_template_password') - - if template_location == 'github' or template_location == 'remote': - if auth: - endpoint = ("https://api.github.com/repos/{0}/{1}/contents/package.json?ref={2}").format(template_repo_owner, template__repo_name, template_repo_branch) - else: - endpoint = ("https://raw.githubusercontent.com/{0}/{1}/{2}/package.json").format(template_repo_owner, template__repo_name, template_repo_branch) - elif template_location == 'bitbucket': - endpoint = ("https://bitbucket.org/{0}/{1}/raw/{2}/package.json").format(template_repo_owner, template__repo_name, template_repo_branch) - - if 'linux' in sys.platform: - if auth: - command = "wget {0} --header='Accept: application/vnd.github.VERSION.raw' --http-user={1} --http-password={2} -q -O -".format(endpoint, username, password) - else: - command = "wget {0} --header='Accept: application/vnd.github.VERSION.raw' -q -O -".format(endpoint) - - return os.popen(command).read() - - else: - req = urllib.request.Request(endpoint) - if auth: - req.add_header('Authorization', b'Basic ' + base64.b64encode(username.encode('ascii') + b':' + password.encode('ascii'))) - req.add_header('Accept', 'application/vnd.github.VERSION.raw') - return urllib.request.urlopen(req).read().decode('utf-8') def get_number_of_lines_in_file(file_path): f = open(file_path) From d7b990159abbc9cbf46da7d50b859705045d68e0 Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Mon, 4 May 2015 08:10:58 -0600 Subject: [PATCH 19/20] sync up metadata templates with current remote source so that things work when there are errors retrieving from remote source --- .../ApexClass/ApexClass.cls | 0 .../ApexClass/ApexClassNoConstructor.cls | 0 .../metadata-templates/ApexClass/ApexRest.cls | 23 -- .../ApexClass/BDDUnitTestApexClass.cls | 16 + .../ApexClass/BatchApexClass.cls | 0 .../ApexClass/ControllerExtension.cls | 0 .../ApexClass/DomainClass.cls | 57 +++ .../ApexClass/EmailServiceApexClass.cls | 0 .../ApexClass/ExceptionApexClass.cls | 0 .../ApexClass/HttpCalloutMock.cls | 28 ++ .../ApexClass/SchedulableApexClass.cls | 0 .../ApexClass/SelectorClass.cls | 50 +++ .../ApexClass/ServiceClass.cls | 21 ++ .../ApexClass/TriggerHandler.cls | 84 +++++ .../ApexClass/UnitTestApexClass.cls | 0 .../ApexClass/UrlRewriterApexClass.cls | 0 .../ApexClass/WebServiceMock.cls | 19 + .../ApexClass/WebserviceClass.cls | 0 .../ApexComponent/ApexComponent.component | 0 .../metadata-templates/ApexPage/ApexPage.page | 0 .../ApexPage/HeaderPageBlock.page | 11 + .../ApexTrigger/ApexTrigger.trigger | 0 .../ApexTrigger/ApexTriggerAllEvents.trigger | 17 + .../ApexTrigger/ApexTriggerBulk.trigger | 2 +- .../ApexTrigger/DomainTrigger.trigger | 19 + lib/apex/metadata-templates/package.json | 332 +++++++++++++++--- 26 files changed, 615 insertions(+), 64 deletions(-) mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/ApexClass.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/ApexClassNoConstructor.cls delete mode 100644 lib/apex/metadata-templates/ApexClass/ApexRest.cls create mode 100755 lib/apex/metadata-templates/ApexClass/BDDUnitTestApexClass.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/BatchApexClass.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/ControllerExtension.cls create mode 100755 lib/apex/metadata-templates/ApexClass/DomainClass.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/EmailServiceApexClass.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/ExceptionApexClass.cls create mode 100755 lib/apex/metadata-templates/ApexClass/HttpCalloutMock.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/SchedulableApexClass.cls create mode 100755 lib/apex/metadata-templates/ApexClass/SelectorClass.cls create mode 100755 lib/apex/metadata-templates/ApexClass/ServiceClass.cls create mode 100755 lib/apex/metadata-templates/ApexClass/TriggerHandler.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/UnitTestApexClass.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/UrlRewriterApexClass.cls create mode 100755 lib/apex/metadata-templates/ApexClass/WebServiceMock.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexClass/WebserviceClass.cls mode change 100644 => 100755 lib/apex/metadata-templates/ApexComponent/ApexComponent.component mode change 100644 => 100755 lib/apex/metadata-templates/ApexPage/ApexPage.page create mode 100755 lib/apex/metadata-templates/ApexPage/HeaderPageBlock.page mode change 100644 => 100755 lib/apex/metadata-templates/ApexTrigger/ApexTrigger.trigger create mode 100755 lib/apex/metadata-templates/ApexTrigger/ApexTriggerAllEvents.trigger mode change 100644 => 100755 lib/apex/metadata-templates/ApexTrigger/ApexTriggerBulk.trigger create mode 100755 lib/apex/metadata-templates/ApexTrigger/DomainTrigger.trigger mode change 100644 => 100755 lib/apex/metadata-templates/package.json diff --git a/lib/apex/metadata-templates/ApexClass/ApexClass.cls b/lib/apex/metadata-templates/ApexClass/ApexClass.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/ApexClassNoConstructor.cls b/lib/apex/metadata-templates/ApexClass/ApexClassNoConstructor.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/ApexRest.cls b/lib/apex/metadata-templates/ApexClass/ApexRest.cls deleted file mode 100644 index 66d7889..0000000 --- a/lib/apex/metadata-templates/ApexClass/ApexRest.cls +++ /dev/null @@ -1,23 +0,0 @@ -@RestResource(urlMapping='/YourCustomResource') -global with sharing class {{ api_name }} { - - @HttpPost - global static void doPost(){ - - } - - @HttpPut - global static void doPut(){ - - } - - @HttpGet - global static void doGet(){ - - } - - @HttpDelete - global static void doDelete(){ - - } -} \ No newline at end of file diff --git a/lib/apex/metadata-templates/ApexClass/BDDUnitTestApexClass.cls b/lib/apex/metadata-templates/ApexClass/BDDUnitTestApexClass.cls new file mode 100755 index 0000000..aa38436 --- /dev/null +++ b/lib/apex/metadata-templates/ApexClass/BDDUnitTestApexClass.cls @@ -0,0 +1,16 @@ +@isTest +private class {{ api_name }} +{ + @isTest + static void itShould() + { + // Given + + + // When + + + // Then + + } +} \ No newline at end of file diff --git a/lib/apex/metadata-templates/ApexClass/BatchApexClass.cls b/lib/apex/metadata-templates/ApexClass/BatchApexClass.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/ControllerExtension.cls b/lib/apex/metadata-templates/ApexClass/ControllerExtension.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/DomainClass.cls b/lib/apex/metadata-templates/ApexClass/DomainClass.cls new file mode 100755 index 0000000..44fa304 --- /dev/null +++ b/lib/apex/metadata-templates/ApexClass/DomainClass.cls @@ -0,0 +1,57 @@ +/** + * See https://github.com/financialforcedev/fflib-apex-common for more info + * + * Install library via + * https://githubsfdeploy.herokuapp.com/app/githubdeploy/financialforcedev/fflib-apex-common + */ + +/** + * Encapsulates all behaviour logic relating to the {{ object_name }} object + * + * For more guidelines and details see + * https://developer.salesforce.com/page/Apex_Enterprise_Patterns_-_Domain_Layer + * + **/ +public class {{ api_name }} extends fflib_SObjectDomain +{ + public {{ api_name }}(List<{{ object_name }}> records) + { + super(records); + } + + public override void onValidate() + { + for({{ object_name }} record : (List<{{ object_name }}>) Records) + { + } + } + + public override void onValidate(Map existingRecords) + { + for({{ object_name }} record : (List<{{ object_name }}>) Records) + { + } + } + + public override void onBeforeInsert() + { + for({{ object_name }} record : (List<{{ object_name }}>) Records) + { + } + } + + public void someMethod() + { + for({{ object_name }} record : (List<{{ object_name }}>) Records) + { + } + } + + public class Constructor implements fflib_SObjectDomain.IConstructable + { + public fflib_SObjectDomain construct(List sObjectList) + { + return new {{ api_name }}(sObjectList); + } + } +} \ No newline at end of file diff --git a/lib/apex/metadata-templates/ApexClass/EmailServiceApexClass.cls b/lib/apex/metadata-templates/ApexClass/EmailServiceApexClass.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/ExceptionApexClass.cls b/lib/apex/metadata-templates/ApexClass/ExceptionApexClass.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/HttpCalloutMock.cls b/lib/apex/metadata-templates/ApexClass/HttpCalloutMock.cls new file mode 100755 index 0000000..3b9761c --- /dev/null +++ b/lib/apex/metadata-templates/ApexClass/HttpCalloutMock.cls @@ -0,0 +1,28 @@ +@isTest +public class {{ api_name }} implements HttpCalloutMock { + + protected Integer code; + protected String status; + protected String body; + protected Map responseHeaders; + + public {{ api_name }}(Integer code, String status, String body, Map responseHeaders) { + this.code = code; + this.status = status; + this.body = body; + this.responseHeaders = responseHeaders; + } + + public HTTPResponse respond(HTTPRequest req) { + //System.assertEquals('http://api.salesforce.com/foo/bar', req.getEndpoint()); + //System.assertEquals('GET', req.getMethod()); + + // Create a fake response + HttpResponse res = new HttpResponse(); + res.setHeader('Content-Type', 'application/json'); + res.setBody('{"foo":"bar"}'); + res.setStatusCode(200); + return res; + } + +} \ No newline at end of file diff --git a/lib/apex/metadata-templates/ApexClass/SchedulableApexClass.cls b/lib/apex/metadata-templates/ApexClass/SchedulableApexClass.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/SelectorClass.cls b/lib/apex/metadata-templates/ApexClass/SelectorClass.cls new file mode 100755 index 0000000..e2df8e3 --- /dev/null +++ b/lib/apex/metadata-templates/ApexClass/SelectorClass.cls @@ -0,0 +1,50 @@ +/** + * See https://github.com/financialforcedev/fflib-apex-common for more info + * + * Install library via + * https://githubsfdeploy.herokuapp.com/app/githubdeploy/financialforcedev/fflib-apex-common + */ + +/** + * Class encapsulates query logic for {{ object_name }} + * + * https://developer.salesforce.com/page/Apex_Enterprise_Patterns_-_Selector_Layer + **/ +public class {{ api_name }} extends fflib_SObjectSelector +{ + public List getSObjectFieldList() + { + return new List { + {{ object_name }}.Id + }; + } + + public Schema.SObjectType getSObjectType() + { + return {{ object_name }}.sObjectType; + } + + public List<{{ object_name }}> selectById(Set idSet) + { + return (List<{{ object_name }}>) selectSObjectsById(idSet); + } + + /* + * For more examples see https://github.com/financialforcedev/fflib-apex-common-samplecode + * + public List<{{ object_name }}> selectBySomethingElse(List somethings) + { + assertIsAccessible(); + return (List<{{ object_name }}>) Database.query( + String.format( + 'select {0}, ' + + 'from {1} ' + + 'where Something__c in :somethings ' + + 'order by {2}', + new List { + getFieldListString(), + getSObjectName(), + getOrderBy() } ) ); + } + */ +} diff --git a/lib/apex/metadata-templates/ApexClass/ServiceClass.cls b/lib/apex/metadata-templates/ApexClass/ServiceClass.cls new file mode 100755 index 0000000..86b54e1 --- /dev/null +++ b/lib/apex/metadata-templates/ApexClass/ServiceClass.cls @@ -0,0 +1,21 @@ +/** + * See https://github.com/financialforcedev/fflib-apex-common for more info + * + * Install library via + * https://githubsfdeploy.herokuapp.com/app/githubdeploy/financialforcedev/fflib-apex-common + */ + +/** + * Encapsulates all service layer logic for a given function or module in the application + * + * For more guidelines and details see + * https://developer.salesforce.com/page/Apex_Enterprise_Patterns_-_Service_Layer + * + **/ +public class {{ api_name }} +{ + public static void doSomething() + { + + } +} \ No newline at end of file diff --git a/lib/apex/metadata-templates/ApexClass/TriggerHandler.cls b/lib/apex/metadata-templates/ApexClass/TriggerHandler.cls new file mode 100755 index 0000000..0c5121b --- /dev/null +++ b/lib/apex/metadata-templates/ApexClass/TriggerHandler.cls @@ -0,0 +1,84 @@ +public class {{ api_name }} +{ + /** + * Enum representing each of before/after CRUD events on Sobjects + */ + public enum Evt + { + afterdelete, afterinsert, afterundelete, + afterupdate, beforedelete, beforeinsert, beforeupdate + } + + /* + * Simplistic handler to implement on any of the event. It doesn't require or enforces any pattern except the + * method name to be "handle()". + */ + public interface HandlerInterface + { + void handle(); + } + + // Internal mapping of handlers + Map> eventHandlerMapping = new Map>(); + + /** + * Core API to bind handlers with events + */ + public {{ api_name }} bind(Evt event, HandlerInterface eh) + { + List handlers = eventHandlerMapping.get(event.name()); + if (handlers == null) + { + handlers = new List(); + eventHandlerMapping.put(event.name(), handlers); + } + handlers.add(eh); + return this; + } + + /** + * Invokes correct handlers as per the context of Trigger and available registered handlers + */ + public void manage() + { + Evt ev = null; + if(Trigger.isInsert && Trigger.isBefore) + { + ev = Evt.beforeinsert; + } + else if(Trigger.isInsert && Trigger.isAfter) + { + ev = Evt.afterinsert; + } + else if(Trigger.isUpdate && Trigger.isBefore) + { + ev = Evt.beforeupdate; + } + else if(Trigger.isUpdate && Trigger.isAfter) + { + ev = Evt.afterupdate; + } + else if(Trigger.isDelete && Trigger.isBefore) + { + ev = Evt.beforedelete; + } + else if(Trigger.isDelete && Trigger.isAfter) + { + ev = Evt.afterdelete; + } + else if(Trigger.isundelete) + { + ev = Evt.afterundelete; + } + + List handlers = eventHandlerMapping.get(ev.name()); + + if (handlers != null && ! handlers.isEmpty()) + { + for (HandlerInterface h : handlers) + { + h.handle(); + } + } + } +} \ No newline at end of file diff --git a/lib/apex/metadata-templates/ApexClass/UnitTestApexClass.cls b/lib/apex/metadata-templates/ApexClass/UnitTestApexClass.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/UrlRewriterApexClass.cls b/lib/apex/metadata-templates/ApexClass/UrlRewriterApexClass.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexClass/WebServiceMock.cls b/lib/apex/metadata-templates/ApexClass/WebServiceMock.cls new file mode 100755 index 0000000..1edf81f --- /dev/null +++ b/lib/apex/metadata-templates/ApexClass/WebServiceMock.cls @@ -0,0 +1,19 @@ +@isTest +public class {{ api_name }} implements WebServiceMock { + public void doInvoke( + Object stub, + Object request, + Map response, + String endpoint, + String soapAction, + String requestName, + String responseNS, + String responseName, + String responseType) { + + // Create response element from the autogenerated class. + // Populate response element. + // Add response element to the response parameter, as follows: + //response.put('response_x', responseElement); + } +} \ No newline at end of file diff --git a/lib/apex/metadata-templates/ApexClass/WebserviceClass.cls b/lib/apex/metadata-templates/ApexClass/WebserviceClass.cls old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexComponent/ApexComponent.component b/lib/apex/metadata-templates/ApexComponent/ApexComponent.component old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexPage/ApexPage.page b/lib/apex/metadata-templates/ApexPage/ApexPage.page old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexPage/HeaderPageBlock.page b/lib/apex/metadata-templates/ApexPage/HeaderPageBlock.page new file mode 100755 index 0000000..8efa57a --- /dev/null +++ b/lib/apex/metadata-templates/ApexPage/HeaderPageBlock.page @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/lib/apex/metadata-templates/ApexTrigger/ApexTrigger.trigger b/lib/apex/metadata-templates/ApexTrigger/ApexTrigger.trigger old mode 100644 new mode 100755 diff --git a/lib/apex/metadata-templates/ApexTrigger/ApexTriggerAllEvents.trigger b/lib/apex/metadata-templates/ApexTrigger/ApexTriggerAllEvents.trigger new file mode 100755 index 0000000..7f5ea22 --- /dev/null +++ b/lib/apex/metadata-templates/ApexTrigger/ApexTriggerAllEvents.trigger @@ -0,0 +1,17 @@ +trigger {{ api_name }} on {{ object_name }} ( + before insert, + before update, + before delete, + after insert, + after update, + after delete, + after undelete) { + + if (Trigger.isBefore) { + //call your handler.before method + + } else if (Trigger.isAfter) { + //call handler.after method + + } +} diff --git a/lib/apex/metadata-templates/ApexTrigger/ApexTriggerBulk.trigger b/lib/apex/metadata-templates/ApexTrigger/ApexTriggerBulk.trigger old mode 100644 new mode 100755 index a7c53cc..8e34b80 --- a/lib/apex/metadata-templates/ApexTrigger/ApexTriggerBulk.trigger +++ b/lib/apex/metadata-templates/ApexTrigger/ApexTriggerBulk.trigger @@ -1,6 +1,6 @@ trigger {{ api_name }} on {{ object_name }} (before insert, before update, before delete, after insert, after update, after delete, after undelete) { - for( {{ object_name }} so : Trigger.new) { + for ({{ object_name }} so : Trigger.new) { //friends remind friends to bulkify } diff --git a/lib/apex/metadata-templates/ApexTrigger/DomainTrigger.trigger b/lib/apex/metadata-templates/ApexTrigger/DomainTrigger.trigger new file mode 100755 index 0000000..efd54fd --- /dev/null +++ b/lib/apex/metadata-templates/ApexTrigger/DomainTrigger.trigger @@ -0,0 +1,19 @@ +/** + * See https://github.com/financialforcedev/fflib-apex-common for more info + * + * Install library via + * https://githubsfdeploy.herokuapp.com/app/githubdeploy/financialforcedev/fflib-apex-common + */ + +/** + * Boiler plate Apex Trigger to route events to the respective Domain class methods + * + * For more guidelines and details see + * https://developer.salesforce.com/page/Apex_Enterprise_Patterns_-_Domain_Layer + **/ +trigger {{ api_name }} on {{ object_name }} (after delete, after insert, after update, + before delete, before insert, before update) +{ + // Creates Domain class instance and calls appropriate methods + fflib_SObjectDomain.triggerHandler({{ api_name }}.class); +} \ No newline at end of file diff --git a/lib/apex/metadata-templates/package.json b/lib/apex/metadata-templates/package.json old mode 100644 new mode 100755 index 3c4ab36..1f1fe6a --- a/lib/apex/metadata-templates/package.json +++ b/lib/apex/metadata-templates/package.json @@ -2,99 +2,351 @@ "ApexClass" : [ { "name" : "Default", - "file_name" : "ApexClass.cls", + "file_name" : "ApexClass.cls", "description" : "The default template for an Apex Class", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] + }, + { + "name" : "Batch", + "file_name" : "BatchApexClass.cls", + "description" : "Batch Apex Class", + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] + }, + { + "name" : "BDD Unit Test", + "file_name" : "BDDUnitTestApexClass.cls", + "description" : "Behaviour Driven Development Unit test class", + "author" : "Paul Hardaker @comic96", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyBDDClass" + } + ] }, { "name" : "Controller Extension", - "file_name" : "ControllerExtension.cls", + "file_name" : "ControllerExtension.cls", "description" : "Controller extension Apex Class", - "author" : "David Schach @dschach" + "author" : "David Schach @dschach", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] }, { - "name" : "No Constructor", - "file_name" : "ApexClassNoConstructor.cls", - "description" : "The default template for an Apex Class", - "author" : "MavensMate" + "name" : "Custom Exception", + "file_name" : "ExceptionApexClass.cls", + "description" : "A custom exception class", + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] }, { - "name" : "Batch", - "file_name" : "BatchApexClass.cls", - "description" : "Batch Apex Class", - "author" : "MavensMate" + "name" : "DomainClass", + "file_name" : "DomainClass.cls", + "description" : "Apex Enterprise Patterns Domain Class", + "author" : "Andy Fawcett @andyinthecloud", + "params" : [ + { + "name" : "api_name", + "description" : "Domain class name (typically plural)", + "default" : "Invoices" + }, + { + "name" : "object_name", + "description" : "API name of the Standard or Custom Object", + "default" : "Invoice__c" + } + ] }, { "name" : "Email Service", - "file_name" : "EmailServiceApexClass.cls", + "file_name" : "EmailServiceApexClass.cls", "description" : "Template for an Apex Email Service", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] }, { - "name" : "Custom Exception", - "file_name" : "ExceptionApexClass.cls", - "description" : "A custom exception class", - "author" : "MavensMate" + "name" : "HTTP Callout Mock", + "file_name" : "HttpCalloutMock.cls", + "description" : "Http callout mock class", + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] }, + { + "name" : "No Constructor", + "file_name" : "ApexClassNoConstructor.cls", + "description" : "The default template for an Apex Class", + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] + }, { "name" : "Schedulable", - "file_name" : "SchedulableApexClass.cls", + "file_name" : "SchedulableApexClass.cls", "description" : "A Schedulable class", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] + }, + { + "name" : "SelectorClass", + "file_name" : "SelectorClass.cls", + "description" : "Apex Enterprise Patterns Selector Class", + "author" : "Andy Fawcett @andyinthecloud", + "params" : [ + { + "name" : "api_name", + "description" : "Selector class name (typically plural e.g. AccountsSelector)", + "default" : "InvoicesSelector" + }, + { + "name" : "object_name", + "description" : "API name of the Standard or Custom Object", + "default" : "Invoice__c" + } + ] + }, + { + "name" : "ServiceClass", + "file_name" : "ServiceClass.cls", + "description" : "Apex Enterprise Patterns Selector Class", + "author" : "Andy Fawcett @andyinthecloud", + "params" : [ + { + "name" : "api_name", + "description" : "Service class name (e.g. InvoiceService)", + "default" : "InvoiceService" + } + ] + }, + { + "name" : "Trigger Handler", + "file_name" : "TriggerHandler.cls", + "description" : "An Interface that handles Trigger actions", + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] }, { "name" : "Unit Test", - "file_name" : "UnitTestApexClass.cls", + "file_name" : "UnitTestApexClass.cls", "description" : "Unit test class", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] }, { "name" : "URL Rewriter", - "file_name" : "UrlRewriterApexClass.cls", + "file_name" : "UrlRewriterApexClass.cls", "description" : "URL Rewriter class", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] }, { "name" : "Web Service", - "file_name" : "WebserviceClass.cls", + "file_name" : "WebserviceClass.cls", "description" : "Web service class", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] }, { - "name" : "Apex Rest Resource", - "file_name" : "ApexRest.cls", - "description" : "Template for custom Apex REST endpoints", - "author" : "Chris Bland @ChrisBland" + "name" : "Web Service Mock", + "file_name" : "WebServiceMock.cls", + "description" : "Web service mock class", + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Class API Name", + "default" : "MyApexClass" + } + ] } ], "ApexComponent" : [ { "name" : "Visualforce Component", - "file_name" : "ApexComponent.component", + "file_name" : "ApexComponent.component", "description" : "Basic Visualforce Component template", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Visualforce Component API Name", + "default" : "MyVisualforceComponent" + } + ] } ], "ApexPage" : [ { "name" : "Visualforce Page", - "file_name" : "ApexPage.page", + "file_name" : "ApexPage.page", "description" : "Basic Visualforce Page template", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Visualforce Page API Name", + "default" : "MyVisualforcePageName" + } + ] + }, + { + "name" : "Header and PageBlock", + "file_name" : "HeaderPageBlock.page", + "description" : "Visualforce Page with SectionHeader and PageBlock", + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Visualforce Page API Name", + "default" : "MyVisualforcePageName" + } + ] } ], "ApexTrigger" : [ { "name" : "Apex Trigger", - "file_name" : "ApexTrigger.trigger", + "file_name" : "ApexTrigger.trigger", "description" : "Basic Apex Trigger template", - "author" : "MavensMate" + "author" : "MavensMate", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Trigger API Name", + "default" : "MyCoolTrigger" + }, + { + "name" : "object_name", + "description" : "Object API Name", + "default" : "Account" + } + ] + }, + { + "name" : "Apex Trigger - All Events", + "file_name" : "ApexTriggerAllEvents.trigger", + "description" : "Apex Trigger with all Trigger events", + "author" : "@alexander-brett", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Trigger API Name", + "default" : "MyCoolTrigger" + }, + { + "name" : "object_name", + "description" : "Object API Name", + "default" : "Account" + } + ] }, { - "name" : "Bulkified Apex Trigger", - "file_name" : "ApexTriggerBulk.trigger", + "name" : "Apex Trigger - Bulkified", + "file_name" : "ApexTriggerBulk.trigger", "description" : "Bulk Apex Trigger with all Trigger events", - "author" : "David Schach @dschach" - } + "author" : "David Schach @dschach", + "params" : [ + { + "name" : "api_name", + "description" : "Apex Trigger API Name", + "default" : "MyCoolTrigger" + }, + { + "name" : "object_name", + "description" : "Object API Name", + "default" : "Account" + } + ] + }, + { + "name" : "DomainTrigger", + "file_name" : "DomainTrigger.trigger", + "description" : "Apex Enterprise Patterns Domain Trigger", + "author" : "Andy Fawcett @andyinthecloud", + "params" : [ + { + "name" : "api_name", + "description" : "Domain trigger name, must be same as Domain class name", + "default" : "Invoices" + }, + { + "name" : "object_name", + "description" : "API name of the Standard or Custom Object", + "default" : "Invoice__c" + } + ] + } ] } \ No newline at end of file From 0dc74abd30fd076f86763e1981a911e6f87f7172 Mon Sep 17 00:00:00 2001 From: Ralph Callaway Date: Mon, 4 May 2015 08:36:15 -0600 Subject: [PATCH 20/20] version bump and messages for v4.0.5 --- messages.json | 3 ++- messages/4.0.5.txt | 23 +++++++++++++++++++++++ packages.json | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 messages/4.0.5.txt diff --git a/messages.json b/messages.json index 77ed7ea..ff72e62 100644 --- a/messages.json +++ b/messages.json @@ -2,5 +2,6 @@ "install": "messages/install.txt", "4.0.2": "messages/4.0.2.txt", "4.0.3": "messages/4.0.3.txt", - "4.0.4": "messages/4.0.4.txt" + "4.0.4": "messages/4.0.4.txt", + "4.0.5": "messages/4.0.5.txt" } \ No newline at end of file diff --git a/messages/4.0.5.txt b/messages/4.0.5.txt new file mode 100644 index 0000000..30e3fa0 --- /dev/null +++ b/messages/4.0.5.txt @@ -0,0 +1,23 @@ +MavensMate-SublimeText 4.0.5 changelog + +- Revert broken partial implementation of private repos +- Remove duplicate settings for mavensmate sounds +- Update local template store + +MavensMate-SublimeText 4.0.4 changelog + +- Improvements to SOQL and DML syntax highlighting +- Fix windows issues with loading checkpoint (ref #354) +- Ability to retrieve templates from Bitbucket and Github, including private repos repos (GitHub only) (ref #30, #427) +- Sounds for mavens mate actions (disabled by default) (ref #385) + +MavensMate-SublimeText 4.0.3 changelog + +- Fixes trailing comma in messages.json, so release notes should now display automatically upon plugin updates + +MavensMate-SublimeText 4.0.2 changelog + +- Fixes issue where incorrect version number was being displayed in Panel and About +- mm tool now downloaded/installed to User/MavensMate directory to ensure package updates don't require mm download +- implements mm_beta_user setting that when true will download pre-release versions of the mm command-line tool +- implements check for OSX 10.7.x and debug message to let those users know that special setup is required \ No newline at end of file diff --git a/packages.json b/packages.json index d87847e..6a0f97b 100644 --- a/packages.json +++ b/packages.json @@ -10,7 +10,7 @@ "platforms": { "osx": [ { - "version": "4.0.4", + "version": "4.0.5", "release_notes": "IMPORTANT: 4.0.x now available. To update, visit: http://mavensmate.com/Upgrade_Help", "url": "https://nodeload.github.com/joeferraro/MavensMate-SublimeText/zipball/master" }