Skip to content

Instantly share code, notes, and snippets.

@KellyLSB
Last active January 1, 2016 18:39
Show Gist options
  • Save KellyLSB/8184857 to your computer and use it in GitHub Desktop.
Save KellyLSB/8184857 to your computer and use it in GitHub Desktop.
Ruby Post Processing Plugin for `Sublime Text 2` Place in `~/Library/Application Support/Sublime Text 2/Packages/User/ruby_post_process.py`
import sublime, sublime_plugin, os, re
class RubyPostProcess(sublime_plugin.EventListener):
def on_pre_save(self, view):
syntax = os.path.basename(view.settings().get('syntax'))
syntax = os.path.splitext(syntax)[0]
filepath = view.file_name()
filename = os.path.basename(filepath)
if syntax == "Ruby":
print "Cleaning up Ruby file: %(filename)s" % locals()
# Tabs to spaces
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r"\t", sublime.IGNORECASE, " ", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# Remove spaces between ends
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r" (end|.*)\n[\n]+([ ]*)end", sublime.IGNORECASE, " \\1\n\\2end", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# New lines between method
# and spec definitions
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r" end\n[\n]*([ ]*)(def|it|describe|context|before|let)", sublime.IGNORECASE, " end\n\n\\1\\2", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# Ruby hash format
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r"([{|(| ]{1}):([a-z_]+)[ ]*=>[ ]*", sublime.IGNORECASE, "\\1\\2: ", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# Spec file only replacements
filename = view.file_name()
if re.search('[sS]{1}pec\.rb$', filename):
# Fix missing before each
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r"before(\(\)|)[ ]+do", sublime.IGNORECASE, "before(:each) do", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# Spec replacements add parentheses to the before methods
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r"^([ ]*)(before)[ ]+(.*)[ ]+do[ ]*(| #(.*))$", sublime.IGNORECASE, "\\1\\2(\\3) do\\4", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# Spec replacements remove parentheses
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r"^([ ]*)(describe|it|context)\((.*)\)[ ]*do[ ]*(.*| #(.*))$", sublime.IGNORECASE, "\\1\\2 \\3 do\\4", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# Replace should be ? to nicer format
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r"\.should[ ]*==[ ]*(true|false|nil)", sublime.IGNORECASE, ".should be_\\1", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# Replace should include to nicer format
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r"\.should[ ]+include[ ]+(.*)$", sublime.IGNORECASE, ".should include(\\1)", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# New lines between end of let segments
# and spec definitions
replacements = []
edit = view.begin_edit()
regions_result = view.find_all(r"(\}|end)\n[\n]*([ ]*)(((?!let).)*)\(", sublime.IGNORECASE, "\\1\n\n\\2\\3(", replacements)
for i, thisregion in reversed(list(enumerate(regions_result))):
view.replace(edit, thisregion, replacements[i])
view.end_edit(edit)
# # Replace should eq empty to nicer format
# replacements = []
# edit = view.begin_edit()
# regions_result = view.find_all(r"\.should[ ]*==[ ]*(\[\]|{})", sublime.IGNORECASE, ".should be_empty", replacements)
# for i, thisregion in reversed(list(enumerate(regions_result))):
# view.replace(edit, thisregion, replacements[i])
# view.end_edit(edit)
# # Replace should be to nicer format
# replacements = []
# edit = view.begin_edit()
# regions_result = view.find_all(r"\.should[ ]*==[ ]*(.*?)(|[ ]+#[^{]{1}.*[^\"]{1})$", sublime.IGNORECASE, ".should be(\\1)\\2", replacements)
# for i, thisregion in reversed(list(enumerate(regions_result))):
# view.replace(edit, thisregion, replacements[i])
# view.end_edit(edit)
print "Finished cleaning up Ruby file: %(filename)s" % locals()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment