├── Commands ├── Clean.tmCommand ├── Compile.tmCommand ├── Create WAR.tmCommand ├── Create ….tmCommand ├── Go To Controller.tmCommand ├── Go To Domain Class Test.tmCommand ├── Go To Domain Class.tmCommand ├── Go To Service Test.tmCommand ├── Go To Service.tmCommand ├── Go To Tag Lib Test.tmCommand ├── Go To Tag Lib.tmCommand ├── Go To Test.tmCommand ├── Go To View.tmCommand ├── Install Plugin.tmCommand ├── List Plugins.tmCommand ├── Run App.tmCommand ├── Run Grails Task.tmCommand ├── Run Test (Current File).tmCommand ├── Run Tests.tmCommand └── Set Environment….tmCommand ├── README.mdown ├── Snippets ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── .tmSnippet ├── New Controller.tmSnippet ├── New Tag 2.tmSnippet ├── New Tag Library.tmSnippet ├── New Unit Test.tmSnippet ├── New short tag__ .tmSnippet ├── New tag__ 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh clean 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Clean 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | 81EFF7DA-D8FD-49D3-AD14-285E135CAA9D 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/Compile.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh compile 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Compile 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | 65B60924-7A50-4539-AB02-54E802C3B58C 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/Create WAR.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh war 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Create WAR 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | 90AF1D77-BD5E-454C-A5E0-D8B19DA4089A 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/Create ….tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh create 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Create … 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | ED4C9595-F749-4803-98BF-EA73357D8AE0 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/Go To Controller.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" controller 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To Controller 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy, text.html.grails 20 | uuid 21 | F23B2416-2A90-4F89-8E53-79848D149E25 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Go To Domain Class Test.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" domain_class_test 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To Domain Class Test 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy 20 | uuid 21 | 9DD9D0CD-7470-49A0-97B8-78852DF6D401 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Go To Domain Class.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" domain_class 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To Domain Class 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy, text.html.grails 20 | uuid 21 | F3547D2C-0CC0-45E1-BDCE-CFD4D45BED15 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Go To Service Test.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" service_test 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To Service Test 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy 20 | uuid 21 | 4933DBBB-1BFA-4EC7-B40E-F3AF80D54FEA 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Go To Service.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" service 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To Service 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy, text.html.grails 20 | uuid 21 | B6320071-EA2B-4ABD-8BF0-4BF0481F2877 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Go To Tag Lib Test.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" taglib_test 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To Tag Lib Test 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy 20 | uuid 21 | A6E1AD30-CEA6-4632-A40C-092E48643B26 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Go To Tag Lib.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" taglib 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To Tag Lib 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy, text.html.grails 20 | uuid 21 | 4BBF0689-BAEE-4BC9-9272-73BD7705A79E 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Go To Test.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" controller_test 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To Controller Test 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy 20 | uuid 21 | 819737E6-F9B0-4C61-A5CE-1A9EF7B8C172 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Go To View.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | RUBYLIB="$TM_BUNDLE_SUPPORT/lib:$RUBYLIB" 9 | ruby18 -- "${TM_BUNDLE_SUPPORT}/bin/go_to_alternate_file.rb" view 10 | input 11 | none 12 | keyEquivalent 13 | ~@ 14 | name 15 | Go To View 16 | output 17 | showAsTooltip 18 | scope 19 | source.groovy 20 | uuid 21 | 0867DC60-0DD7-483A-86BA-07763BD2D8DB 22 | 23 | 24 | -------------------------------------------------------------------------------- /Commands/Install Plugin.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh install_plugin 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Install Plugin … 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | 9B67E226-4E45-4DDD-99FC-31545A67B7B9 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/List Plugins.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh list_plugins 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | List Plugins 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | A77539E3-ACBE-4AD4-9DE8-625340CBACC7 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/Run App.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh run_app 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Run App 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | FD3BEFAC-5C8C-4D03-9DF1-A07EB8B79807 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/Run Grails Task.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh run_grails_task 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Run Arbitrary Grails Task … 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | DEFDA7D4-BB3B-47D4-9408-C63C7A901A97 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/Run Test (Current File).tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | if [ "$TM_SELECTED_FILES" ] 11 | then 12 | eval grailsmate_bootstrap.sh focussed_test "$TM_SELECTED_FILES" 13 | else 14 | grailsmate_bootstrap.sh focussed_test "$TM_FILEPATH" 15 | fi 16 | input 17 | none 18 | keyEquivalent 19 | ^@G 20 | name 21 | Test App (selected) 22 | output 23 | showAsHTML 24 | scope 25 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 26 | uuid 27 | 2922A132-7A49-4193-B959-D30D817160B5 28 | 29 | 30 | -------------------------------------------------------------------------------- /Commands/Run Tests.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh test_app 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Test App 17 | output 18 | showAsHTML 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | CE0A3C0D-2E58-47B2-8271-F8FBA3846CB4 23 | 24 | 25 | -------------------------------------------------------------------------------- /Commands/Set Environment….tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | autoScrollOutput 6 | 7 | beforeRunningCommand 8 | nop 9 | command 10 | grailsmate_bootstrap.sh set_env 11 | input 12 | none 13 | keyEquivalent 14 | ^@G 15 | name 16 | Set Environment… 17 | output 18 | showAsTooltip 19 | scope 20 | source.groovy, source.java, source.java-props, text.xml, text.html.grails, text.html.textile 21 | uuid 22 | A085D123-3C2B-4960-AC5B-0D576FE55F49 23 | 24 | 25 | -------------------------------------------------------------------------------- /README.mdown: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | You can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you. 4 | 5 | # General 6 | 7 | * [Bundle Styleguide](http://kb.textmate.org/bundle_styleguide) — _before you make changes_ 8 | * [Commit Styleguide](http://kb.textmate.org/commit_styleguide) — _before you send a pull request_ 9 | * [Writing Bug Reports](http://kb.textmate.org/writing_bug_reports) — _before you report an issue_ 10 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:checkBox name="${1:name}" value="${2:true}" /> 7 | name 8 | <g:checkBox> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | input 13 | uuid 14 | 763D4A25-C07F-4FDD-BE49-20C1853E7049 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:createLink ${1:action="$2" }${3:controller="$4" }${5:id="$6" }${7:params="$8" }${9:url="$10" }${11:absolute="$12" }${13:base="$14" }>$15</g:createLink> 7 | name 8 | <g:createLink> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | createlink 13 | uuid 14 | 0B125EC5-B157-428B-87B8-93DD46FB417C 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:createLinkTo ${1:dir="$2" }${3:file="$4" }${5:absolute="$6" }${7:base="$8" } /> 7 | name 8 | <g:createLinkTo> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | createlinkto 13 | uuid 14 | 3F5C0C2A-395A-4D96-9128-8A9B96DAAA64 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:currencySelect name="${1:currencyName}" value="\${${2:currency}}" /> 7 | name 8 | <g:currencySelect ..> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | select 13 | uuid 14 | 2527E20F-D60E-486F-BD10-38C2751C22AF 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:each in="\${${1:item}}" var="${2:e}" status="${3:i}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:each> 9 | name 10 | <g:each in=".." var="e" status="i"> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | eavs 15 | uuid 16 | 2DA4083A-D3A9-45BD-8B65-EDEF8F508672 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:each in="\${${1:item}}" var="${2:i}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:each> 9 | name 10 | <g:each in=".." var="i"> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | eav 15 | uuid 16 | 182781ED-932C-49BC-A455-F0FE029CDE13 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:each in="\${${1:item}}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:each> 9 | name 10 | <g:each in=".."> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | ea 15 | uuid 16 | DFCB9C12-7638-4AD7-8634-45095CE41F5D 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:each ${1:var="${2}" }in="\${$3}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:each> 9 | name 10 | <g:each> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | each 15 | uuid 16 | D72519A0-AC1C-40B5-AEEC-146727D173F3 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:else> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:else> 9 | name 10 | <g:else> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | else 15 | uuid 16 | 17F32C97-B861-41BB-95D3-556C1426994A 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:elseif test="\${$1}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:elseif> 9 | name 10 | <g:elseif> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | elseif 15 | uuid 16 | 34AA063A-B57C-4C2B-84B1-DAB133476173 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:field type="${1:type}" name="${2:name}" value="${3:someValue}" /> 7 | name 8 | <g:field type=".."> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | input 13 | uuid 14 | CE3269DC-38A7-4B1E-AADC-B4B3B00D5178 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:form name="${1:name}" action="${2:action}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:form> 9 | name 10 | <g:form action=".."> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | form 15 | uuid 16 | 69E74F74-6AEC-43A3-9F82-580CD17DE40B 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/ .tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:form name="${1:name}" controller="${2:controller}" action="${3:action}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:form> 9 | name 10 | <g:form controller=".." action=".."> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | form 15 | uuid 16 | E65AF691-8006-4EAF-8BA4-D379F97C6CA7 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:hasErrors ${1:bean="$2" }${3:model="$4" }${5:field="$6" }> 7 | $0 8 | </g:hasErrors> 9 | 10 | name 11 | <g:hasErrors> 12 | scope 13 | text.html.grails 14 | tabTrigger 15 | haserrors 16 | uuid 17 | 1422E213-5533-4F2E-90B8-A5D2F69E2CCC 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:hiddenField name="${1:name}" value="${2:someValue}" /> 7 | name 8 | <g:hiddenField> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | input 13 | uuid 14 | FBE8D5E8-6FCC-4936-8B4C-60509B77B42D 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:if test="\${$1}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:if> 9 | 10 | name 11 | <g:if> 12 | scope 13 | text.html.grails 14 | tabTrigger 15 | if 16 | uuid 17 | 0CC426AF-7257-44DC-8511-785C784C5B64 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:javascript library="${1:prototype}" /> 7 | name 8 | <g:javascript library=".."> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | jsl 13 | uuid 14 | 110D7DDB-59CE-4DD5-A66C-2C9ADFF5F1C7 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:javascript> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:javascript> 9 | name 10 | <g:javascript> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | js 15 | uuid 16 | AC7E256F-1B73-4975-A5D1-FDC84E667481 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:link ${1:action="$2" }${3:controller="$4" }${5:id="$6" }${7:params="$8" }${9:url="$10" }${11:absolute="$12" }${13:base="$14" }>$15</g:link> 7 | name 8 | <g:link> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | link 13 | uuid 14 | 407CC9F3-55BF-484B-B48D-989BA5916E58 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:localeSelect name="${1:localeName}" value="\${${2:request.locale}}" /> 7 | name 8 | <g:localeSelect ..> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | select 13 | uuid 14 | 7CA17672-29EA-4978-A34A-0520AB700E36 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:message code="${1}"${2: args="${3}"}${4: default="${5}"}/>$0 7 | name 8 | <g:message> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | msg 13 | uuid 14 | 6369A08A-2B14-4993-9CCF-0876FA142706 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/ .tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:radio name="${1:name}" value="${2:true}" checked="${3:true}" /> 7 | name 8 | <g:radio> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | input 13 | uuid 14 | 86EB0B0F-E050-44AA-89A9-841C36FF5991 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:render ${1:template="$2" }${3:bean="$4" }${5:model="$6" }${7:collection="$8" }${9:var="$10" }${11:plugin="$12" }/> 7 | name 8 | <g:render> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | render 13 | uuid 14 | D0969043-B070-4CD5-9A23-3FFD9D45ADC6 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:select name="${1:name}" value="\${${2:value}}" from="\${${3:[1,2,3]}}" /> 7 | name 8 | <g:select from=".." > 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | select 13 | uuid 14 | 230911E9-EE4E-4309-9C19-BD3BA5763AB7 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:set ${1:var="$2" }${3:value="$4" }${5:scope="${6:request/page/flash/session}" }/> 7 | name 8 | <g:set> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | set 13 | uuid 14 | D874BAA6-C6C8-4259-87EB-8764F187AA6F 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:submitButton name="${1:name}" value="${2:someValue}" /> 7 | name 8 | <g:submitButton> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | input 13 | uuid 14 | F97F4845-11BC-463E-9A6F-D5DB4B6DFDC4 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:textField name="${1:name}" value="${2:someValue}" /> 7 | name 8 | <g:textField> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | input 13 | uuid 14 | 4F46D369-43F4-4A6F-A11D-8906FCE8992D 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:timeZoneSelect name="${1:selectName}" value="\${${2:tz}}" /> 7 | name 8 | <g:timeZoneSelect ..> 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | select 13 | uuid 14 | 698250E4-E144-4F89-B7F7-C9B8FA8113AB 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:while test="\${$1}"> 7 | ${0:$TM_SELECTED_TEXT} 8 | </g:while> 9 | 10 | name 11 | <g:while> 12 | scope 13 | text.html.grails 14 | tabTrigger 15 | while 16 | uuid 17 | 0C1988E9-A250-46E2-9608-3FD217BD8C61 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/New Controller.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | class ${1:Name}Controller { 7 | def index = { 8 | $0 9 | } 10 | } 11 | name 12 | New Controller 13 | scope 14 | source.groovy 15 | tabTrigger 16 | cont 17 | uuid 18 | 602B1BBF-315A-4F64-B0D9-B9B211058A27 19 | 20 | 21 | -------------------------------------------------------------------------------- /Snippets/New Tag 2.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | def ${1:closureName} = { attrs, body -> 7 | $0 8 | } 9 | name 10 | New Tag 11 | scope 12 | source.groovy 13 | tabTrigger 14 | tag 15 | uuid 16 | 4C3F139B-D57D-4595-B6FA-8D5F7919148A 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/New Tag Library.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | class ${1:Name}TagLib { 7 | $0 8 | } 9 | name 10 | New Tag Library 11 | scope 12 | source.groovy 13 | tabTrigger 14 | taglib 15 | uuid 16 | C82DAAA6-61CF-4A30-977F-5A1986F8EF04 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/New Unit Test.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | package ${1} 7 | 8 | import grails.test.* 9 | 10 | class ${2:Name}Tests extends GrailsUnitTestCase { 11 | 12 | protected void setUp() { 13 | super.setUp() 14 | } 15 | 16 | protected void tearDown() { 17 | super.tearDown() 18 | } 19 | 20 | void test${3:Something}() { 21 | $0 22 | } 23 | 24 | } 25 | name 26 | New Unit Test 27 | scope 28 | source.groovy 29 | tabTrigger 30 | unit 31 | uuid 32 | 5E358AE7-2B58-4B13-B5DE-13834E7951B3 33 | 34 | 35 | -------------------------------------------------------------------------------- /Snippets/New short tag__ .tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | <g:${1:name} ${2:attr}="${3:value}" /> 7 | keyEquivalent 8 | ^> 9 | name 10 | New short tag.. <g: /> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | g:> 15 | uuid 16 | 5694EFD5-1C2E-40FE-A282-695B43FD170A 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/New tag__ 2 | 3 | 4 | 5 | content 6 | <g:${1:name} ${2:attr}="${3:value}">${0:$TM_SELECTED_TEXT}</g:$1> 7 | keyEquivalent 8 | ^> 9 | name 10 | New tag.. <g: ></g:> 11 | scope 12 | text.html.grails 13 | tabTrigger 14 | g: 15 | uuid 16 | 463F165A-4D1B-42BE-85AF-36EF1EC7937B 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/belongsTo.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | static belongsTo = [${1:ClassName}] 7 | name 8 | belongsTo 9 | scope 10 | source.groovy 11 | tabTrigger 12 | bt 13 | uuid 14 | 0D2FE949-F722-4802-8E99-44BF2516F4A8 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/constraints.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | static constraints = { 7 | $0 8 | } 9 | name 10 | constraints 11 | scope 12 | source.groovy 13 | tabTrigger 14 | constraints 15 | uuid 16 | FC4117F8-C3AB-4430-8E46-C81F1F00177F 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/g_message().tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | g.message(code:"${1}"${2:, args:${3}}${4:, default:"${5}"})$0 7 | name 8 | g.message() 9 | scope 10 | source.groovy.embedded.html.grails 11 | tabTrigger 12 | msg 13 | uuid 14 | B2B2C397-3DBB-4C1F-9C01-19B63740456D 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/hasMany.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | static hasMany = [${1:items}:${2:ClassName}] 7 | name 8 | hasMany 9 | scope 10 | source.groovy 11 | tabTrigger 12 | hm 13 | uuid 14 | 2B2758A5-B0FD-4203-A8C8-38058E16CC68 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/hasOne.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | static hasOne = [${1:item}:${2:ClassName}] 7 | name 8 | hasOne 9 | scope 10 | source.groovy 11 | tabTrigger 12 | ho 13 | uuid 14 | 74DE99D0-4BFA-4C83-8A1C-53237A83FE44 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/mockConstraints.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | mockForConstraintsTests(${1:DomainClass}) 7 | def test${1} = new ${1}() 8 | assertFalse test${1}.validate() 9 | assertEquals "${2:nullable}", test${1}.errors["${3:someproperty}"] 10 | name 11 | mockConstraints 12 | scope 13 | source.groovy 14 | tabTrigger 15 | mc 16 | uuid 17 | EAED6F03-BBDF-43CE-9536-C965EA21840B 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/mockDomain.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | mockDomain(${1:DomainClass}, [ 7 | new ${1}($0) 8 | ]) 9 | name 10 | mockDomain 11 | scope 12 | source.groovy 13 | tabTrigger 14 | md 15 | uuid 16 | 927DB595-92AE-4E2B-9CAA-7F270CD21032 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/mockFor.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | def ${1:mockControl} = mockFor(${2:ClassName}) 7 | ${1}.demand.${3:yourMethod}(${4:1}..${5:1}) = {-&gt; 8 | $0 9 | } 10 | def test${2} = ${1}.createMock() 11 | name 12 | mockFor 13 | scope 14 | source.groovy 15 | tabTrigger 16 | mf 17 | uuid 18 | 75FFE634-ECF7-4FFB-9A22-2D88C8166722 19 | 20 | 21 | -------------------------------------------------------------------------------- /Snippets/mockLogging.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | mockLogging(${1:ClassName}) 7 | name 8 | mockLogging 9 | scope 10 | source.groovy 11 | tabTrigger 12 | ml 13 | uuid 14 | 96BADBF6-D3F2-494E-B65F-3B4078DDF8C7 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/mockSession.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | mockSession.${1:property} = ${2:value} 7 | name 8 | mockSession 9 | scope 10 | source.groovy 11 | tabTrigger 12 | ms 13 | uuid 14 | 60D7E667-547A-4057-8960-10EF89CBFB85 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/namedQueries.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | static namedQueries = { 7 | ${1:queryName} { 8 | $0 9 | } 10 | } 11 | name 12 | namedQueries 13 | scope 14 | source.groovy 15 | tabTrigger 16 | nq 17 | uuid 18 | 72D7EC1C-E105-41F3-9D8D-9D48FB3B94DE 19 | 20 | 21 | -------------------------------------------------------------------------------- /Snippets/out << "".tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | out << "${1:output}" 7 | name 8 | out << "" 9 | scope 10 | text.html.grails 11 | tabTrigger 12 | out 13 | uuid 14 | 0412E351-735A-4D11-8089-66D70843CA3F 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/redirect(action:__).tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | redirect(action:"${1:name}") 7 | name 8 | redirect(action:..) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rea 13 | uuid 14 | 86B0FEAB-6E08-47BF-8433-842B45453A93 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/redirect(action:__, id:___).tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | redirect(action:"${1:name}",id:${2:1}) 7 | name 8 | redirect(action:.., id:...) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | reai 13 | uuid 14 | 4D085BE8-073E-4DF2-82B2-CD22E55571F5 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/redirect(controller:__).tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | redirect(controller:"${1:name}") 7 | name 8 | redirect(controller:..) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rec 13 | uuid 14 | F1948640-F514-478C-A765-B17EA54F78E1 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/redirect(controller:__, action:__ , id:__).tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | redirect(controller:"${1:c}",action:"${2:a}",id:${3:1}) 7 | name 8 | redirect(controller:.., action:.. , id:..) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | recai 13 | uuid 14 | 4E8393F8-7E76-4370-9576-81E0A9C1C9CD 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/redirect(controller:__, action:__).tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | redirect(controller:"${1:c}",action:"${2:a}") 7 | name 8 | redirect(controller:.., action:..) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | reca 13 | uuid 14 | 1887D21A-3F26-438D-A12F-4C1E4AB78149 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(contentType:"text:json") { ___ } .tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(contentType:"text/json", builder:"json") { 7 | $0 8 | } 9 | name 10 | render(contentType:"text/json") { ... } 11 | scope 12 | source.groovy 13 | tabTrigger 14 | rjson 15 | uuid 16 | E4A625FD-7B23-41C5-9CB1-1C6AB007B0D9 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/render(contentType:"text:xml") { ___ }.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(contentType:"text/xml") { 7 | $0 8 | } 9 | name 10 | render(contentType:"text/xml") { ... } 11 | scope 12 | source.groovy 13 | tabTrigger 14 | rxml 15 | uuid 16 | 4A6625A0-FB94-46A4-BF8D-8EBBC77A4778 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/render(template:"__").tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(template:"${1:name}") 7 | name 8 | render(template:"..") 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rte 13 | uuid 14 | 289C69E5-D989-4E03-A1F2-DB181F88DD5A 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(template:"__",bean:b).tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(template:"${1:name}",bean:${2:b}) 7 | name 8 | render(template:"..",bean:b) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rteb 13 | uuid 14 | A1FE9F42-2A7A-4CE6-91FC-16AA6609B303 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(template:"__",bean:b,var:"x").tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(template:"${1:name}",bean:${2:b}, var:"${3:x}") 7 | name 8 | render(template:"..",bean:b,var:"x") 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rtebv 13 | uuid 14 | 4B447F0E-FE01-4E9D-A15C-A7660EF267BE 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(template:"__",collection:c).tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(template:"${1:name}",collection:${1:col}) 7 | name 8 | render(template:"..",collection:c) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rtec 13 | uuid 14 | 8656F441-5683-4C5A-BB94-AE7C37223440 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(template:"__",collection:c, var:"x").tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(template:"${1:name}",collection:${2:col}, var:"${3:x}") 7 | name 8 | render(template:"..",collection:c, var:"x") 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rtecb 13 | uuid 14 | 645A8378-2ECF-454E-AE30-B6D097FECBD4 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(template:"__",model:m) .tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(template:"${1:name}",model:[${2:name}:${3:obj}]) 7 | name 8 | render(template:"..",model:m) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rtem 13 | uuid 14 | 606D2C16-3C65-4541-8D04-FE37264A2BF9 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(text:"__").tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(text:"${1:value}") 7 | name 8 | render(text:"..") 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rt 13 | uuid 14 | BFFEE9A8-577E-4DDA-8F58-FCE2504FC102 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(text:"__", contentType:"__").tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(text:"${1:value}", contentType:"${2:text/xml}") 7 | name 8 | render(text:"..", contentType:"..") 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rtc 13 | uuid 14 | D8EABAB3-BA50-4C0E-AE3B-99AC754C269C 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(view:"__").tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(view:"${1:name}") 7 | name 8 | render(view:"..") 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rv 13 | uuid 14 | 4E6DAF52-FD4B-470B-B230-224B525C2EFD 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/render(view:"__", model:m).tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | render(view:"${1:name}", model:[${2:name}:${3:obj}]) 7 | name 8 | render(view:"..", model:m) 9 | scope 10 | source.groovy 11 | tabTrigger 12 | rvm 13 | uuid 14 | 740B0115-F2DC-48DA-B295-42E877176D07 15 | 16 | 17 | -------------------------------------------------------------------------------- /Support/GrailsMate/GrailsMate.rb: -------------------------------------------------------------------------------- 1 | require "#{ENV["TM_SUPPORT_PATH"]}/lib/escape" 2 | require "#{ENV["TM_SUPPORT_PATH"]}/lib/ui" 3 | require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/process" 4 | require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/htmloutput" 5 | 6 | require ENV['TM_BUNDLE_SUPPORT'] + '/lib/grails/application' 7 | 8 | require "shellwords" 9 | require "pstore" 10 | 11 | class GrailsCommand 12 | 13 | attr_reader :colorisations 14 | 15 | 16 | @@location = ENV['TM_PROJECT_DIRECTORY'] || ENV['TM_DIRECTORY'] 17 | @@prefs = PStore.new(File.expand_path( "~/Library/Preferences/com.macromates.textmate.grailsmate")) 18 | 19 | @application = Grails::Application.new(@@location) 20 | 21 | def self.prefs(&t) 22 | @@prefs.transaction do |p| 23 | t.call(p) 24 | end 25 | end 26 | 27 | def self.location_prefs(&t) 28 | prefs do |p| 29 | p[@@location] = {} if p[@@location].nil? 30 | t.call(p[@@location]) 31 | end 32 | end 33 | 34 | def self.get_location_pref(key) 35 | location_prefs do |p| 36 | p[key] 37 | end 38 | end 39 | 40 | def self.set_location_pref(key, value) 41 | location_prefs do |p| 42 | p[key] = value 43 | end 44 | end 45 | 46 | def self.last_option_prefs(&t) 47 | location_prefs do |p| 48 | p["task"] = {} if p["task"].nil? 49 | t.call(p["task"]) 50 | end 51 | end 52 | 53 | def self.set_last_option_pref(task, option) 54 | last_option_prefs do |p| 55 | p[task] = option 56 | end 57 | end 58 | 59 | def self.get_last_option_pref(task) 60 | last_option_prefs do |p| 61 | p[task] 62 | end 63 | end 64 | 65 | def self.select_env 66 | env = TextMate::UI.request_string( 67 | :title => "Grails Environment", 68 | :prompt => 'Enter the full name of the environment you wish to set (leave blank for default)', 69 | :default => get_env(), 70 | :button2 => "Clear" 71 | ) 72 | set_location_pref("env", env) 73 | env 74 | end 75 | 76 | def self.get_env 77 | get_location_pref("env") 78 | end 79 | 80 | def initialize(task, &option_getter) 81 | @grails = ENV['TM_GRAILS'] 82 | @task = task 83 | @option_getter = option_getter 84 | @command = nil 85 | @colorisations = { 86 | "green" => [/SUCCESS/,/Server running/, /Tests PASSED/, /PASSED$/], 87 | "red" => [/FAILURE/,/Tests FAILED/,/Compilation error/,/threw exception/, /Exception:/, /FAILED$/], 88 | "blue" => [/Environment set to/], 89 | "aquamarine" => [/^Running test [\w\.]+...(?!PASSED|FAILED)/] 90 | } 91 | end 92 | 93 | def command 94 | if @command.nil? 95 | option = nil 96 | unless @option_getter.nil? 97 | last_value = self.class.get_last_option_pref(@task) 98 | option = @option_getter[last_value] 99 | return nil if option.nil? 100 | self.class.set_last_option_pref(@task, option) 101 | end 102 | @command = construct_command(@task, option) 103 | end 104 | @command 105 | end 106 | 107 | def construct_command(task, option) 108 | env = self.class.get_env 109 | command = [] 110 | command << "-Dgrails.env=#{env}" if env 111 | command << task unless task.nil? or task.empty? 112 | unless option.nil? or option.empty? 113 | (Shellwords.shellwords(option).each { |option| command << option }) 114 | end 115 | command 116 | end 117 | 118 | def run 119 | Dir.chdir(@@location) do 120 | cmd = command 121 | TextMate::HTMLOutput.show(:window_title => "GrailsMate", :page_title => "GrailsMate", :sub_title => "#{@@location}") do |io| 122 | if cmd.nil? 123 | io << "Command cancelled." 124 | else 125 | io << "
"
126 |           io << "grails " + htmlize(cmd.join(' ')) + "
" 127 | TextMate::Process.run(@grails, cmd) do |line| 128 | line.chomp! 129 | match = false 130 | @colorisations.each do | color, patterns | 131 | if match == false and patterns.detect { |pattern| line =~ pattern } 132 | match = "#{htmlize line}
" 133 | end 134 | end 135 | line = (match ? match : "#{htmlize line}
") 136 | line.sub!(/(Running test )(\S+)(\.\.\.)/, "\\1\\2\\3") 137 | line.sub!(/(Browse to )([^\<\s]+)( or )?([^\<\s]+)?/, "\\1\\2\\3\\4") 138 | line.sub!(/(view reports in )(.+)(\.)/, "\\0

") 139 | io << line 140 | end 141 | io << "
" 142 | end 143 | end 144 | end 145 | end 146 | 147 | end -------------------------------------------------------------------------------- /Support/GrailsMate/clean.rb: -------------------------------------------------------------------------------- 1 | GrailsCommand.new("clean").run -------------------------------------------------------------------------------- /Support/GrailsMate/compile.rb: -------------------------------------------------------------------------------- 1 | GrailsCommand.new("compile").run -------------------------------------------------------------------------------- /Support/GrailsMate/create.rb: -------------------------------------------------------------------------------- 1 | class GrailsCreateCommand < GrailsCommand 2 | 3 | def initialize() 4 | super "create" do |default| 5 | TextMate::UI.request_string( 6 | :title => "Create Artefact", 7 | :prompt => "Enter the kind of artefact (e.g. domain-class)", 8 | :default => "" 9 | ) 10 | end 11 | self.colorisations['green'] << /Created (.)+ for (\w)+/ 12 | end 13 | 14 | def construct_command(task, option) 15 | if option.nil? or option.empty? 16 | return nil 17 | else 18 | options = Shellwords.shellwords(option) 19 | ["#{task}-#{options.shift}"] + options 20 | end 21 | end 22 | 23 | end 24 | 25 | GrailsCreateCommand.new.run -------------------------------------------------------------------------------- /Support/GrailsMate/focussed_test.rb: -------------------------------------------------------------------------------- 1 | require "#{ENV['TM_SUPPORT_PATH']}/lib/exit_codes" 2 | 3 | potential_phases = {"unit" => "unit", "integration" => "integration", "functional" => "functional", "webtest" => "functional", "other" => "other"} 4 | 5 | testclasses = [] 6 | phases = [] 7 | 8 | ARGV.each do |t| 9 | test = File.basename(t) 10 | test =~ /^(.+)\.(.+)$/ 11 | clazz = $1 12 | extension = $2 13 | if extension != "groovy" and extension != "java" 14 | TextMate.exit_show_tool_tip "#{test} is not a test case" 15 | end 16 | potential_phases.each do |dir, potential_phase| 17 | phases << "--#{potential_phase}" if t =~ /test\/#{dir}\// 18 | end 19 | testclasses << clazz.sub(/(Tests|Spec|Specification)$/, "") 20 | end 21 | 22 | GrailsCommand.new("test-app #{testclasses.uniq.join(' ')} #{phases.uniq.join(' ')}").run -------------------------------------------------------------------------------- /Support/GrailsMate/install_plugin.rb: -------------------------------------------------------------------------------- 1 | gc = GrailsCommand.new("install-plugin") do |default| 2 | TextMate::UI.request_string( 3 | :title => "Install Grails Plug-in", 4 | :prompt => "Enter the Plug-in name", 5 | :default => default 6 | ) 7 | end 8 | 9 | gc.colorisations['green'] << /Plugin (.)+ installed/ 10 | gc.colorisations['red'] << /Plugin (.)+ was not found in repository/ 11 | gc.run -------------------------------------------------------------------------------- /Support/GrailsMate/list_plugins.rb: -------------------------------------------------------------------------------- 1 | gc = GrailsCommand.new("list-plugins") 2 | gc.run -------------------------------------------------------------------------------- /Support/GrailsMate/run_app.rb: -------------------------------------------------------------------------------- 1 | gc = GrailsCommand.new("run-app") 2 | gc.colorisations['red'] << /Server failed to start/ 3 | gc.run -------------------------------------------------------------------------------- /Support/GrailsMate/run_grails_task.rb: -------------------------------------------------------------------------------- 1 | gc = GrailsCommand.new("") do |default| 2 | TextMate::UI.request_string( 3 | :title => "Run Grails Task", 4 | :prompt => "Enter a command to pass to grails", 5 | :default => default 6 | ) 7 | end 8 | 9 | gc.run -------------------------------------------------------------------------------- /Support/GrailsMate/set_env.rb: -------------------------------------------------------------------------------- 1 | GrailsCommand.select_env -------------------------------------------------------------------------------- /Support/GrailsMate/test_app.rb: -------------------------------------------------------------------------------- 1 | GrailsCommand.new("test-app").run -------------------------------------------------------------------------------- /Support/GrailsMate/war.rb: -------------------------------------------------------------------------------- 1 | gc = GrailsCommand.new("war") 2 | gc.colorisations['green'] << /Created WAR (.)+/ 3 | gc.run -------------------------------------------------------------------------------- /Support/bin/find_test_report.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby18 2 | 3 | require ENV['TM_SUPPORT_PATH'] + '/lib/textmate' 4 | require ENV['TM_BUNDLE_SUPPORT'] + '/lib/grails/application' 5 | require ENV['TM_SUPPORT_PATH'] + '/lib/ui' 6 | 7 | test_class = ARGV[0] 8 | 9 | test_report = Grails::Application.new.find_test_report(test_class) 10 | if test_report 11 | TextMate.go_to(:file => test_report) 12 | else 13 | TextMate::UI.tool_tip("Could not find report for #{test_class}") 14 | end 15 | -------------------------------------------------------------------------------- /Support/bin/go_to_alternate_file.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby18 2 | 3 | # Copyright: 4 | # (c) 2006 syncPEOPLE, LLC. 5 | # Visit us at http://syncpeople.com/ 6 | # Author: Duane Johnson (duane.johnson@gmail.com) 7 | # Description: 8 | # Makes an intelligent decision on which file to go to based on the current line or current context. 9 | 10 | require 'GrailsPath' 11 | require 'TextMate' 12 | 13 | choice = ARGV.shift 14 | current_file = GrailsPath.new 15 | 16 | if grails_path = current_file.grails_path_for(choice.to_sym) 17 | if grails_path.exists? 18 | TextMate.open grails_path 19 | else 20 | if TextMate.message_ok_cancel "#{grails_path.basename} does not exist", "Would you like to create it?" 21 | grails_path.touch 22 | TextMate.open grails_path 23 | else 24 | TextMate.exit_discard 25 | end 26 | end 27 | end -------------------------------------------------------------------------------- /Support/bin/grailsmate_bootstrap.sh: -------------------------------------------------------------------------------- 1 | source "$TM_SUPPORT_PATH/lib/bash_init.sh" 2 | export RUBYLIB="$TM_BUNDLE_SUPPORT/GrailsMate:$TM_SUPPORT_PATH/lib/${RUBYLIB:+:$RUBYLIB}" 3 | 4 | TM_GRAILS=${TM_GRAILS:-grails} 5 | 6 | require_cmd "$TM_GRAILS" "If you have installed grails, then you need to either update your PATH or set the TM_GRAILS shell variable (e.g. in Preferences / Advanced)" 7 | 8 | export TM_GRAILS=`which $TM_GRAILS` 9 | script="$1" 10 | shift 11 | 12 | ruby18 -r GrailsMate -r ui -- "$TM_BUNDLE_SUPPORT/GrailsMate/$script.rb" $@ 13 | 14 | rescan_project -------------------------------------------------------------------------------- /Support/lib/GrailsPath.rb: -------------------------------------------------------------------------------- 1 | # Copyright: 2 | # (c) 2006 syncPEOPLE, LLC. 3 | # Visit us at http://syncpeople.com/ 4 | # Author: Duane Johnson (duane.johnson@gmail.com) 5 | # Description: 6 | # Makes analyzing of a Grails path + filename easier. 7 | # 8 | # Mercileslly ripped off from the Rails bundle by Luke Daley. 9 | 10 | require 'misc' 11 | require 'TextMate' 12 | require 'buffer' 13 | 14 | module AssociationMessages 15 | # Return associated_with_*? methods 16 | def method_missing(method, *args) 17 | case method.to_s 18 | when /^associated_with_(.+)\?$/ 19 | return associations[$1.to_sym].include?(file_type) 20 | else 21 | super(method, *args) 22 | end 23 | end 24 | 25 | @@associations = { 26 | :controller => [:view, :domain_class, :service, :taglib, :controller_test], 27 | :view => [:controller, :domain_class, :taglib], 28 | :domain_class => [:controller, :service, :domain_class_test], 29 | :service => [:controller, :domain_class, :taglib, :service_test], 30 | :taglib => [:controller, :view, :taglib_test], 31 | :controller_test => [:controller, :domain_class], 32 | :domain_class_test => [:domain_class], 33 | :service_test => [:service, :controller], 34 | :taglib_test => [:taglib] 35 | } 36 | 37 | # Make associations hash publicly available to each object 38 | def associations; self.class.class_eval("@@associations") end 39 | end 40 | 41 | class GrailsPath 42 | attr_reader :filepath 43 | 44 | include AssociationMessages 45 | 46 | def initialize(filepath = TextMate.filepath) 47 | if filepath[0..0] == '/' 48 | # Absolute file, treat as is 49 | @filepath = filepath 50 | else 51 | # Relative file, prepend grails_root 52 | @filepath = File.join(grails_root, filepath) 53 | end 54 | end 55 | 56 | def buffer 57 | @buffer ||= Buffer.new_from_file(self) 58 | end 59 | 60 | def exists? 61 | File.file?(@filepath) 62 | end 63 | 64 | def basename 65 | File.basename(@filepath) 66 | end 67 | 68 | def dirname 69 | File.dirname(@filepath) 70 | end 71 | 72 | def touch_directories 73 | return if dirname[0..0] != '/' 74 | dirs = dirname[1..-1].split('/') 75 | for i in 0..(dirs.size) 76 | new_dir = '/' + File.join(dirs[0..i]) 77 | Dir.mkdir(new_dir) if !File.exist?(new_dir) 78 | end 79 | end 80 | 81 | # Make sure the file exists by creating it if it doesn't 82 | def touch 83 | if !exists? 84 | touch_directories 85 | f = File.open(@filepath, "w"); f.close 86 | end 87 | end 88 | 89 | def artifact_base_name 90 | name = basename 91 | # Remove extension 92 | name.sub!(/\.\w+$/, '') 93 | # Remove extras 94 | case file_type 95 | when :controller then name.sub!(/Controller$/, '') 96 | when :view then name = dirname.split('/').pop 97 | name[0..0] = name[0..0].upcase 98 | when :domain_class then name 99 | when :service then name.sub!(/Service$/, '') 100 | when :taglib then name.sub!(/TagLib$/, '') 101 | when :controller_test then name.sub!(/ControllerTests$/, '') 102 | when :domain_class_test then name.sub!(/Tests$/, '') 103 | when :service_test then name.sub!(/ServiceTests$/, '') 104 | when :taglib_test then name.sub!(/TagLibTests$/, '') 105 | end 106 | 107 | return name 108 | end 109 | 110 | def action_name 111 | name = 112 | case file_type 113 | when :controller 114 | buffer.find_method(:direction => :backwards).first rescue nil 115 | when :view 116 | basename 117 | # when :unit_test 118 | # buffer.find_method(:direction => :backwards).first.sub('^test_', '') 119 | else nil 120 | end 121 | 122 | return name.sub(/\.\w+$/, '') rescue nil # Remove extension 123 | end 124 | 125 | def grails_root 126 | return TextMate.project_directory 127 | # TODO: Look for the root_indicators inside TM_PROJECT_DIRECTORY and return nil if not found 128 | 129 | #self.class.root_indicators.each do |i| 130 | # if index = @filepath.index(i) 131 | # return @filepath[0...index] 132 | # end 133 | #end 134 | end 135 | 136 | # This is used in :file_type and :grails_path_for_view 137 | VIEW_EXTENSIONS = %w( gsp ) 138 | 139 | def file_type 140 | return @file_type if @file_type 141 | 142 | @file_type = 143 | case @filepath 144 | when %r{/grails-app/controllers/(.+Controller\.(groovy))$} then :controller 145 | when %r{/grails-app/views/(.+\.(#{VIEW_EXTENSIONS * '|'}))$} then :view 146 | when %r{/grails-app/domain/(.+\.(groovy))$} then :domain_class 147 | when %r{/grails-app/services/(.+Service\.(groovy))$} then :service 148 | when %r{/grails-app/taglib/(.+TagLib\.(groovy))$} then :taglib 149 | when %r{/test/unit/(.+ControllerTests\.(groovy))$} then :controller_test 150 | when %r{/test/unit/(.+ServiceTests\.(groovy))$} then :service_test 151 | when %r{/test/unit/(.+TagLibTests\.(groovy))$} then :taglib_test 152 | when %r{/test/unit/(.+Tests\.(groovy))$} then :domain_class_test 153 | else nil 154 | end 155 | # Store the tail (modules + file) after the regexp 156 | # The first set of parens in each case will become the "tail" 157 | @tail = $1 158 | # Store the file extension 159 | @extension = $2 160 | return @file_type 161 | end 162 | 163 | def tail 164 | # Get the tail if it's not set yet 165 | file_type unless @tail 166 | return @tail 167 | end 168 | 169 | def extension 170 | # Get the extension if it's not set yet 171 | file_type unless @extension 172 | return @extension 173 | end 174 | 175 | # View file that does not begin with _ 176 | def partial? 177 | file_type == :view and basename !~ /^_/ 178 | end 179 | 180 | def artifact_base_name_modified_for(type) 181 | case type 182 | when :controller then artifact_base_name + 'Controller' 183 | when :service then artifact_base_name + 'Service' 184 | when :taglib then artifact_base_name + 'TagLib' 185 | when :controller_test then artifact_base_name + 'ControllerTests' 186 | when :domain_class_test then artifact_base_name + 'Tests' 187 | when :service_test then artifact_base_name + 'ServiceTests' 188 | when :taglib_test then artifact_base_name + 'TagLibTests' 189 | else artifact_base_name 190 | end 191 | end 192 | 193 | def default_extension_for(type) 194 | case type 195 | when :view then '.gsp' 196 | else '.groovy' 197 | end 198 | end 199 | 200 | def grails_path_for(type) 201 | return grails_path_for_view if type == :view 202 | if TextMate.project_directory 203 | GrailsPath.new(File.join(grails_root, stubs[type], artifact_base_name_modified_for(type) + default_extension_for(type))) 204 | else 205 | puts "There needs to be a project associated with this file." 206 | end 207 | end 208 | 209 | def view_dir 210 | if @view_dir.nil? 211 | @view_dir = artifact_base_name 212 | @view_dir[0..0] = @view_dir[0..0].downcase 213 | end 214 | @view_dir 215 | end 216 | def grails_path_for_view 217 | return ask_for_view("index") if action_name.nil? 218 | 219 | file_exists = false 220 | VIEW_EXTENSIONS.each do |e| 221 | filename_with_extension = action_name + "." + e 222 | existing_view = File.join(grails_root, stubs[:view], view_dir, filename_with_extension) 223 | return GrailsPath.new(existing_view) if File.exist?(existing_view) 224 | end 225 | default_view = File.join(grails_root, stubs[:view], view_dir, action_name + default_extension_for(:view)) 226 | return GrailsPath.new(default_view) 227 | end 228 | 229 | def ask_for_view(default_name = action_name) 230 | if designated_name = TextMate.input("Enter the name of the new view file:", default_name + default_extension_for(:view)) 231 | view_file = File.join(grails_root, stubs[:view], view_dir, designated_name) 232 | # FIXME: For some reason the following line freezes TextMate 233 | # TextMate.refresh_project_drawer 234 | return GrailsPath.new(view_file) 235 | end 236 | return nil 237 | end 238 | 239 | def self.stubs 240 | { 241 | :controller => 'grails-app/controllers', 242 | :view => 'grails-app/views/', 243 | :domain_class => 'grails-app/domain', 244 | :service => 'grails-app/services', 245 | :taglib => 'grails-app/taglib', 246 | :controller_test => 'test/unit', 247 | :domain_class_test => 'test/unit', 248 | :service_test => 'test/unit', 249 | :taglib_test => 'test/unit' 250 | } 251 | end 252 | 253 | def stubs; self.class.stubs end 254 | 255 | def ==(other) 256 | other = other.filepath if other.respond_to?(:filepath) 257 | @filepath == other 258 | end 259 | end -------------------------------------------------------------------------------- /Support/lib/TextMate.rb: -------------------------------------------------------------------------------- 1 | # Copyright: 2 | # (c) 2006 syncPEOPLE, LLC. 3 | # Visit us at http://syncpeople.com/ 4 | # Author: Duane Johnson (duane.johnson@gmail.com) 5 | # Description: 6 | # Helper module for accesing TextMate facilities such as environment variables. 7 | 8 | module TextMate 9 | class < "Message", :informative_text => text, :button1 => "Ok"}.update(options) 102 | return cocoa_dialog('msgbox', options)[0] == "1" 103 | end 104 | 105 | def textbox(informative_text, text, options = {}) 106 | options = {:title => "Message", :informative_text => informative_text, :text => text, :button1 => "Ok"}.update(options) 107 | return cocoa_dialog('textbox', options)[0] == "1" 108 | end 109 | 110 | def message_yes_no_cancel(text, options = {}) 111 | options = {:title => "Message", :text => text}.update(options) 112 | return cocoa_dialog('yesno-msgbox', options)[0] == "1" 113 | end 114 | 115 | def message_ok_cancel(text, informative_text = nil, options = {}) 116 | options = {:title => "Message", :text => text, :informative_text => informative_text}.update(options) 117 | return cocoa_dialog('ok-msgbox', options)[0] == "1" 118 | end 119 | 120 | def input(text, default_text = "", options = {}) 121 | options = {:title => "Input", :informative_text => text, :text => default_text}.update(options) 122 | button, text = cocoa_dialog('standard-inputbox', options) 123 | if button == '1' 124 | return text.strip 125 | else 126 | return nil 127 | end 128 | end 129 | 130 | def choose(text, choices = ["none"], options = {}) 131 | options = {:title => "Choose", :text => text, :items => choices, :button1 => 'Ok', :button2 => 'Cancel'}.update(options) 132 | button, choice = cocoa_dialog('dropdown', options) 133 | if button == '1' 134 | return choice.strip.to_i 135 | else 136 | return nil 137 | end 138 | end 139 | end 140 | end 141 | 142 | 143 | module TextMate 144 | 145 | def TextMate.call_with_progress( args, &block ) 146 | output_filepath = args[:output_filepath] # path to open after execution 147 | 148 | title = args[:title] || 'Progress' 149 | message = args[:message] || 'Frobbing the widget...' 150 | 151 | cocoa_dialog = "#{ENV['TM_SUPPORT_PATH']}/bin/CocoaDialog.app/Contents/MacOS/CocoaDialog" 152 | 153 | tempdir = "/tmp/TextMate_progress_cmd_tmp.#{$PID}" 154 | Dir.mkdir(tempdir) 155 | Dir.chdir(tempdir) 156 | pipe = IO.popen( %Q("#{cocoa_dialog}" progressbar --indeterminate --title "#{title}" --text "#{message}"), "w+") 157 | begin 158 | pipe.puts "" 159 | data = block.call 160 | puts data 161 | ensure 162 | pipe.close 163 | %x{rm -rf "#{tempdir}"} 164 | end 165 | 166 | sleep 0.1 167 | 168 | end 169 | 170 | end 171 | -------------------------------------------------------------------------------- /Support/lib/buffer.rb: -------------------------------------------------------------------------------- 1 | # Copyright: 2 | # (c) 2006 syncPEOPLE, LLC. 3 | # Visit us at http://syncpeople.com/ 4 | # Author: Duane Johnson (duane.johnson@gmail.com) 5 | # Description: 6 | # Makes analyzing of a Rails path + filename easier. 7 | 8 | require 'TextMate' 9 | require 'misc' 10 | 11 | # Stores lines of text 12 | class Buffer 13 | # The actual lines of the text file 14 | attr_reader :lines 15 | # State of caret positions (both 0-based indexes) 16 | attr_accessor :line_number, :column_number 17 | # Stack for remembering caret positions 18 | attr_reader :stack 19 | 20 | # Init from a String or Buffer object 21 | def initialize(buffer, line_number = nil, column_number = nil) 22 | self.text = buffer 23 | @line_number = line_number || TextMate.line_number 24 | @column_number = column_number || TextMate.column_number 25 | @stack = [] 26 | end 27 | 28 | # Init from a String (filename) or FilePath 29 | def self.new_from_file(filepath, line_number = nil, column_number = nil) 30 | # In case it's a RailsPath, get the string representing the filepath 31 | filepath = filepath.filepath if filepath.respond_to?(:filepath) 32 | new(IO.read(filepath, line_number, column_number)) 33 | end 34 | 35 | def index 36 | @lines.slice(0...line_number).join.length 37 | end 38 | 39 | def current_line 40 | lines[line_number] 41 | end 42 | 43 | def push_position 44 | @stack.push [@line_number, @column_number] 45 | end 46 | 47 | def pop_position 48 | @line_number, @column_number = @stack.pop 49 | end 50 | 51 | def to_a 52 | @lines 53 | end 54 | 55 | def text 56 | @text ||= lines.join 57 | end 58 | 59 | def text=(buffer) 60 | @text = buffer.gsub("\r\n", "\n") 61 | @lines = @text.to_a 62 | end 63 | 64 | def =~(other) 65 | text =~ other 66 | end 67 | 68 | # Searches a region of the buffer, lines :from to :to 69 | # Accepts a block which can evaluate to either true/false indication of a line match, 70 | # or a Regexp indicating that the line must match the regexp for the line to match. 71 | # An optional :direction of :backward is also accepted if the search is to be reversed. 72 | def find(options = {}, &block) 73 | options = {:direction => :forward}.update(options) 74 | 75 | # Use some sensible defaults if just a direction is given 76 | if direction = options[:direction] == :forward 77 | from = options[:from] || line_number 78 | to = options[:to] || lines.size - 1 79 | from, to = to, from if from > to 80 | direction = 1 81 | else 82 | from = options[:from] || 0 83 | to = options[:to] || line_number 84 | from, to = to, from if from < to 85 | direction = -1 86 | end 87 | 88 | from.step(to, direction) do |i| 89 | value = yield(lines[i]) 90 | value = lines[i].scan(value).flatten.compact.first if value.is_a? Regexp 91 | return [value, i] if value 92 | end 93 | return nil 94 | end 95 | 96 | # Search for the nearest "def [method]" declaration 97 | def find_method(options = {}) 98 | options = {:direction => :backwards}.update(options) 99 | find(options) { %r{def\s+(\w+)\s+=\s+\{} } 100 | end 101 | 102 | def find_nearest_string_or_symbol(current_line = current_line) 103 | current_line.find_nearest_string_or_symbol(column_number) 104 | end 105 | 106 | end 107 | -------------------------------------------------------------------------------- /Support/lib/grails/application.rb: -------------------------------------------------------------------------------- 1 | require "find" 2 | 3 | module Grails 4 | 5 | class Application 6 | 7 | attr_reader :path 8 | 9 | def initialize(path = nil) 10 | @path = path || ENV['TM_PROJECT_DIRECTORY'] 11 | end 12 | 13 | def properties 14 | @properties = read_properties if @properties.nil? 15 | @properties 16 | end 17 | 18 | def file(path, mode, &b) 19 | File.open(@path + '/' + path, mode, &b) 20 | end 21 | 22 | def grails_version 23 | properties['app.grails.version'] 24 | end 25 | 26 | def version 27 | properties['app.version'] 28 | end 29 | 30 | def plugins 31 | properties.inject({}) do |p,e| 32 | p[$1] = e.last if e.first =~ /^plugins\.(.+)$/ 33 | p 34 | end 35 | end 36 | 37 | def is_pre_1_2 38 | grails_version[0,1] == '0' or (grails_version[0,1] == '1' and grails_version =~ /^1\.1.*/) 39 | end 40 | 41 | def test_reports_dir 42 | is_pre_1_2 ? "#{@path}/test/reports" : "#{@path}/target/test-reports" 43 | end 44 | 45 | def find_test_report(test_class_name) 46 | matches = [] 47 | Find.find("#{test_reports_dir}/plain") do |path| 48 | if File.basename(path) =~ /#{Regexp.escape(test_class_name)}\.txt$/ 49 | matches << path 50 | end 51 | end 52 | matches.first # we eventually need something more sophisticated here 53 | end 54 | 55 | protected 56 | 57 | def read_properties 58 | p = {} 59 | file('application.properties', 'r') do |f| 60 | f.each_line do |s| 61 | if s =~ /(?!\s#)([\w\.]+)=(.+)$/ 62 | p[$1] = $2 63 | end 64 | end 65 | end 66 | p 67 | end 68 | 69 | end 70 | end -------------------------------------------------------------------------------- /Support/lib/misc.rb: -------------------------------------------------------------------------------- 1 | class String 2 | # Gets the line number of character +i+ (0-base index) 3 | def line_from_index(i) 4 | slice(0..i).count("\n") 5 | end 6 | 7 | # Gets the index of the beginning of line number +l+ (0-base index) 8 | def index_from_line(l) 9 | to_a.slice(0...l).join.length 10 | end 11 | 12 | # Temporarily replace "strings" with (parens) and :symbols with .notation. 13 | # Useful before a find_nearest_string_or_symbol search when method calls have 14 | # special meaning for lists of strings or symbols (e.g. javascript_include_tag) 15 | def unstringify_hash_arguments 16 | gsub(/'([^']+?)'(?=\s*=>)/, '(\1)'). 17 | gsub(/"([^"]+?)"(?=\s*=>)/, '(\1)'). 18 | gsub(/:(\w+)(?=\s*=>)/, '.\1'). 19 | gsub(/(=>\s*)'([^']+?)'/, '\1(\2)'). 20 | gsub(/(=>\s*)"([^"]+?)"/, '\1(\2)'). 21 | gsub(/(=>\s*):(\w+)/, '\1.\2') 22 | end 23 | 24 | # Finds the nearest "string" or :symbol to +column_number+ 25 | def find_nearest_string_or_symbol(column_number) 26 | re = /'([^']+?)'|"([^"]+)"|:([a-zA-Z0-9_]+)\b/ 27 | matching_tokens = scan(re).flatten.compact 28 | # Which token is nearest to column_number? 29 | nearest_token = nearest_index = distance = nil 30 | matching_tokens.each do |token| 31 | i = index(token, column_number) 32 | if i and (distance.nil? or (column_number - i).abs < distance) 33 | nearest_token = token 34 | nearest_index = i 35 | distance = (column_number - i).abs 36 | end 37 | 38 | i = rindex(token, column_number) 39 | if i and (distance.nil? or ((column_number - i).abs - token.length) < distance) 40 | nearest_token = token 41 | nearest_index = i 42 | distance = (column_number - i).abs - token.length 43 | end 44 | end 45 | (nearest_token.nil?) ? nil : [nearest_token, nearest_index] 46 | end 47 | 48 | def underscore 49 | gsub(/::/, '/'). 50 | gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). 51 | gsub(/([a-z\d])([A-Z])/,'\1_\2'). 52 | tr("-", "_"). 53 | downcase 54 | end 55 | 56 | def camelize 57 | gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase } 58 | end 59 | alias camelcase camelize 60 | end 61 | 62 | -------------------------------------------------------------------------------- /Syntaxes/GSP.tmLanguage: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | fileTypes 6 | 7 | gsp 8 | 9 | foldingStartMarker 10 | (?x) 11 | (<(?i:head|body|table|thead|tbody|tfoot|tr|div|select|fieldset|style|script|ul|ol|form|dl|g:javascript)\b.*?> 12 | |<!--(?!.*-->) 13 | |\{\s*($|\?>\s*$|//|/\*(.*\*/\s*$|(?!.*?\*/))) 14 | ) 15 | foldingStopMarker 16 | (?x) 17 | (</(?i:head|body|table|thead|tbody|tfoot|tr|div|select|fieldset|style|script|ul|ol|form|dl|g:javascript)> 18 | |^\s*--> 19 | |(^|\s)\} 20 | ) 21 | keyEquivalent 22 | ^~G 23 | name 24 | Grails Server Page 25 | patterns 26 | 27 | 28 | begin 29 | <%--+(?!>)=? 30 | contentName 31 | comment.block 32 | end 33 | --%> 34 | 35 | 36 | begin 37 | <%+(?!>)=? 38 | beginCaptures 39 | 40 | 0 41 | 42 | name 43 | punctuation.section.embedded.begin.groovy 44 | 45 | 46 | end 47 | (%)> 48 | endCaptures 49 | 50 | 0 51 | 52 | name 53 | punctuation.section.embedded.end.groovy 54 | 55 | 1 56 | 57 | name 58 | source.groovy 59 | 60 | 61 | name 62 | source.groovy 63 | patterns 64 | 65 | 66 | include 67 | source.groovy 68 | 69 | 70 | 71 | 72 | include 73 | #embedded-groovy 74 | 75 | 76 | begin 77 | (^\s*)?(?=<(?i:g:javascript)) 78 | beginCaptures 79 | 80 | 0 81 | 82 | name 83 | punctuation.whitespace.embedded.leading.js 84 | 85 | 86 | contentName 87 | source.js 88 | end 89 | (?<=>)(?!<(?i:g:javascript))(\s*\n)? 90 | endCaptures 91 | 92 | 0 93 | 94 | name 95 | punctuation.whitespace.embedded.trailing.js 96 | 97 | 98 | patterns 99 | 100 | 101 | begin 102 | (<)((?i:g:javascript)) 103 | beginCaptures 104 | 105 | 1 106 | 107 | name 108 | punctuation.definition.tag.html.grails 109 | 110 | 2 111 | 112 | name 113 | entity.name.tag.template.html.grails 114 | 115 | 116 | end 117 | />|(?=>) 118 | endCaptures 119 | 120 | 0 121 | 122 | name 123 | punctuation.definition.tag.html.grails 124 | 125 | 126 | name 127 | meta.tag.template.javascript.html.grails 128 | patterns 129 | 130 | 131 | include 132 | #tag-stuff 133 | 134 | 135 | 136 | 137 | captures 138 | 139 | 1 140 | 141 | name 142 | punctuation.definition.tag.html.grails 143 | 144 | 2 145 | 146 | name 147 | source.js 148 | 149 | 3 150 | 151 | name 152 | entity.name.tag.template.html.grails 153 | 154 | 4 155 | 156 | name 157 | punctuation.definition.tag.html.grails 158 | 159 | 160 | match 161 | ((<)/)((?i:g:javascript))(>) 162 | name 163 | meta.tag.template.javascript.html.grails 164 | 165 | 166 | begin 167 | (>) 168 | beginCaptures 169 | 170 | 0 171 | 172 | name 173 | meta.tag.template.javascript.html.grails 174 | 175 | 1 176 | 177 | name 178 | punctuation.definition.tag.html.grails 179 | 180 | 181 | contentName 182 | source.js 183 | end 184 | (?=</(?i:g:javascript)>) 185 | patterns 186 | 187 | 188 | captures 189 | 190 | 1 191 | 192 | name 193 | punctuation.definition.comment.begin.js 194 | 195 | 196 | match 197 | (//).*?((?=</(?i:g:javascript))|$\n?) 198 | name 199 | comment.line.double-slash.js 200 | 201 | 202 | begin 203 | /\* 204 | beginCaptures 205 | 206 | 0 207 | 208 | name 209 | punctuation.definition.comment.begin.js 210 | 211 | 212 | end 213 | \*/|(?=</(?i:g:javascript)) 214 | endCaptures 215 | 216 | 0 217 | 218 | name 219 | punctuation.definition.comment.end.js 220 | 221 | 222 | name 223 | comment.block.js 224 | 225 | 226 | include 227 | source.js 228 | 229 | 230 | 231 | 232 | 233 | 234 | begin 235 | (</?)(\w+:\w+) 236 | captures 237 | 238 | 1 239 | 240 | name 241 | punctuation.definition.tag.html.grails 242 | 243 | 2 244 | 245 | name 246 | entity.name.tag.template.html.grails 247 | 248 | 249 | end 250 | (/?>) 251 | name 252 | meta.tag.template.html.grails 253 | patterns 254 | 255 | 256 | include 257 | #tag-stuff 258 | 259 | 260 | 261 | 262 | include 263 | text.html.basic 264 | 265 | 266 | repository 267 | 268 | embedded-groovy 269 | 270 | patterns 271 | 272 | 273 | begin 274 | \$\{ 275 | captures 276 | 277 | 0 278 | 279 | name 280 | punctuation.section.embedded.groovy 281 | 282 | 283 | end 284 | \} 285 | name 286 | source.groovy.embedded.html.grails 287 | patterns 288 | 289 | 290 | include 291 | source.groovy 292 | 293 | 294 | 295 | 296 | 297 | string-double-quoted 298 | 299 | begin 300 | " 301 | beginCaptures 302 | 303 | 0 304 | 305 | name 306 | punctuation.definition.string.begin.html.grails 307 | 308 | 309 | end 310 | " 311 | endCaptures 312 | 313 | 0 314 | 315 | name 316 | punctuation.definition.string.end.html.grails 317 | 318 | 319 | name 320 | string.quoted.double.html.grails 321 | patterns 322 | 323 | 324 | include 325 | #embedded-groovy 326 | 327 | 328 | 329 | string-single-quoted 330 | 331 | begin 332 | ' 333 | beginCaptures 334 | 335 | 0 336 | 337 | name 338 | punctuation.definition.string.begin.html.grails 339 | 340 | 341 | end 342 | ' 343 | endCaptures 344 | 345 | 0 346 | 347 | name 348 | punctuation.definition.string.end.html.grails 349 | 350 | 351 | name 352 | string.quoted.single.html.grails 353 | 354 | tag-attribute 355 | 356 | match 357 | \b([a-zA-Z\-:]+) 358 | name 359 | entity.other.attribute-name.html.grails 360 | 361 | tag-stuff 362 | 363 | patterns 364 | 365 | 366 | include 367 | #tag-attribute 368 | 369 | 370 | include 371 | #string-double-quoted 372 | 373 | 374 | include 375 | #string-single-quoted 376 | 377 | 378 | 379 | 380 | scopeName 381 | text.html.grails 382 | uuid 383 | E4DECA1B-424C-4A75-AD67-E907F182E4FB 384 | 385 | 386 | -------------------------------------------------------------------------------- /info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | contactEmailRot13 6 | yq@yqnyrl.pbz 7 | contactName 8 | Luke Daley 9 | description 10 | <a href="http://grails.org/">Grails</a> - A ‘code by convention’ Groovy web framework. 11 | mainMenu 12 | 13 | items 14 | 15 | 92666D01-AFA7-4477-8851-6DAA03302AD6 16 | 262B9C49-AE5B-40F9-BFDA-70171E0EFD21 17 | ------------------------------------ 18 | 34236282-295F-4DAA-B26F-DF7A9B0861AB 19 | E097DAE7-3831-4229-8F89-DF6BA00021B1 20 | 2E8619E7-3A10-4C8F-8BDB-FC99CCF340C9 21 | F2592BD8-DCBE-4B7C-AE1A-1FF86C826530 22 | 21F6B25B-D980-4A72-8C5F-B8231111C9BC 23 | 24 | submenus 25 | 26 | 21F6B25B-D980-4A72-8C5F-B8231111C9BC 27 | 28 | items 29 | 30 | 5E358AE7-2B58-4B13-B5DE-13834E7951B3 31 | EAED6F03-BBDF-43CE-9536-C965EA21840B 32 | 927DB595-92AE-4E2B-9CAA-7F270CD21032 33 | 96BADBF6-D3F2-494E-B65F-3B4078DDF8C7 34 | 75FFE634-ECF7-4FFB-9A22-2D88C8166722 35 | 60D7E667-547A-4057-8960-10EF89CBFB85 36 | 37 | name 38 | Testing 39 | 40 | 262B9C49-AE5B-40F9-BFDA-70171E0EFD21 41 | 42 | items 43 | 44 | F23B2416-2A90-4F89-8E53-79848D149E25 45 | 0867DC60-0DD7-483A-86BA-07763BD2D8DB 46 | F3547D2C-0CC0-45E1-BDCE-CFD4D45BED15 47 | B6320071-EA2B-4ABD-8BF0-4BF0481F2877 48 | 4BBF0689-BAEE-4BC9-9272-73BD7705A79E 49 | ------------------------------------ 50 | 819737E6-F9B0-4C61-A5CE-1A9EF7B8C172 51 | 9DD9D0CD-7470-49A0-97B8-78852DF6D401 52 | 4933DBBB-1BFA-4EC7-B40E-F3AF80D54FEA 53 | A6E1AD30-CEA6-4632-A40C-092E48643B26 54 | 55 | name 56 | Go To … 57 | 58 | 2E8619E7-3A10-4C8F-8BDB-FC99CCF340C9 59 | 60 | items 61 | 62 | 463F165A-4D1B-42BE-85AF-36EF1EC7937B 63 | 5694EFD5-1C2E-40FE-A282-695B43FD170A 64 | ------------------------------------ 65 | D874BAA6-C6C8-4259-87EB-8764F187AA6F 66 | D0969043-B070-4CD5-9A23-3FFD9D45ADC6 67 | 6369A08A-2B14-4993-9CCF-0876FA142706 68 | ------------------------------------ 69 | B2B2C397-3DBB-4C1F-9C01-19B63740456D 70 | BAB71041-D058-475B-A1D7-1C71274E3418 71 | 9A7B8516-05B7-420C-AC55-E509424FB701 72 | 7E107420-11E5-464E-8485-A8B302BC10B7 73 | 7FAB7CC9-A8CB-4AFD-BC3D-38687D6157D2 74 | 74C86A36-E5CE-4C4D-B4E4-788C6EBE84A9 75 | 76 | name 77 | GSP 78 | 79 | 34236282-295F-4DAA-B26F-DF7A9B0861AB 80 | 81 | items 82 | 83 | 2B2758A5-B0FD-4203-A8C8-38058E16CC68 84 | 74DE99D0-4BFA-4C83-8A1C-53237A83FE44 85 | 0D2FE949-F722-4802-8E99-44BF2516F4A8 86 | FC4117F8-C3AB-4430-8E46-C81F1F00177F 87 | 72D7EC1C-E105-41F3-9D8D-9D48FB3B94DE 88 | 89 | name 90 | GORM 91 | 92 | 74C86A36-E5CE-4C4D-B4E4-788C6EBE84A9 93 | 94 | items 95 | 96 | 407CC9F3-55BF-484B-B48D-989BA5916E58 97 | 0B125EC5-B157-428B-87B8-93DD46FB417C 98 | 3F5C0C2A-395A-4D96-9128-8A9B96DAAA64 99 | 100 | name 101 | Links 102 | 103 | 7E107420-11E5-464E-8485-A8B302BC10B7 104 | 105 | items 106 | 107 | 69E74F74-6AEC-43A3-9F82-580CD17DE40B 108 | E65AF691-8006-4EAF-8BA4-D379F97C6CA7 109 | ------------------------------------ 110 | 230911E9-EE4E-4309-9C19-BD3BA5763AB7 111 | 7CA17672-29EA-4978-A34A-0520AB700E36 112 | 698250E4-E144-4F89-B7F7-C9B8FA8113AB 113 | 2527E20F-D60E-486F-BD10-38C2751C22AF 114 | ------------------------------------ 115 | 4F46D369-43F4-4A6F-A11D-8906FCE8992D 116 | 763D4A25-C07F-4FDD-BE49-20C1853E7049 117 | 86EB0B0F-E050-44AA-89A9-841C36FF5991 118 | FBE8D5E8-6FCC-4936-8B4C-60509B77B42D 119 | F97F4845-11BC-463E-9A6F-D5DB4B6DFDC4 120 | CE3269DC-38A7-4B1E-AADC-B4B3B00D5178 121 | 122 | name 123 | Forms 124 | 125 | 7FAB7CC9-A8CB-4AFD-BC3D-38687D6157D2 126 | 127 | items 128 | 129 | AC7E256F-1B73-4975-A5D1-FDC84E667481 130 | 110D7DDB-59CE-4DD5-A66C-2C9ADFF5F1C7 131 | 132 | name 133 | Ajax 134 | 135 | 92666D01-AFA7-4477-8851-6DAA03302AD6 136 | 137 | items 138 | 139 | FD3BEFAC-5C8C-4D03-9DF1-A07EB8B79807 140 | CE0A3C0D-2E58-47B2-8271-F8FBA3846CB4 141 | 2922A132-7A49-4193-B959-D30D817160B5 142 | ------------------------------------ 143 | 65B60924-7A50-4539-AB02-54E802C3B58C 144 | 81EFF7DA-D8FD-49D3-AD14-285E135CAA9D 145 | ------------------------------------ 146 | ED4C9595-F749-4803-98BF-EA73357D8AE0 147 | ------------------------------------ 148 | A77539E3-ACBE-4AD4-9DE8-625340CBACC7 149 | 9B67E226-4E45-4DDD-99FC-31545A67B7B9 150 | ------------------------------------ 151 | 90AF1D77-BD5E-454C-A5E0-D8B19DA4089A 152 | ------------------------------------ 153 | DEFDA7D4-BB3B-47D4-9408-C63C7A901A97 154 | A085D123-3C2B-4960-AC5B-0D576FE55F49 155 | 156 | name 157 | Commands 158 | 159 | 9A7B8516-05B7-420C-AC55-E509424FB701 160 | 161 | items 162 | 163 | D72519A0-AC1C-40B5-AEEC-146727D173F3 164 | DFCB9C12-7638-4AD7-8634-45095CE41F5D 165 | 2DA4083A-D3A9-45BD-8B65-EDEF8F508672 166 | 182781ED-932C-49BC-A455-F0FE029CDE13 167 | ------------------------------------ 168 | 0C1988E9-A250-46E2-9608-3FD217BD8C61 169 | 170 | name 171 | Iteration 172 | 173 | BAB71041-D058-475B-A1D7-1C71274E3418 174 | 175 | items 176 | 177 | 0CC426AF-7257-44DC-8511-785C784C5B64 178 | 17F32C97-B861-41BB-95D3-556C1426994A 179 | 34AA063A-B57C-4C2B-84B1-DAB133476173 180 | ------------------------------------ 181 | 1422E213-5533-4F2E-90B8-A5D2F69E2CCC 182 | 183 | name 184 | Control 185 | 186 | E097DAE7-3831-4229-8F89-DF6BA00021B1 187 | 188 | items 189 | 190 | 602B1BBF-315A-4F64-B0D9-B9B211058A27 191 | ------------------------------------ 192 | 86B0FEAB-6E08-47BF-8433-842B45453A93 193 | 4D085BE8-073E-4DF2-82B2-CD22E55571F5 194 | F1948640-F514-478C-A765-B17EA54F78E1 195 | 1887D21A-3F26-438D-A12F-4C1E4AB78149 196 | 4E8393F8-7E76-4370-9576-81E0A9C1C9CD 197 | ------------------------------------ 198 | BFFEE9A8-577E-4DDA-8F58-FCE2504FC102 199 | D8EABAB3-BA50-4C0E-AE3B-99AC754C269C 200 | 4E6DAF52-FD4B-470B-B230-224B525C2EFD 201 | 740B0115-F2DC-48DA-B295-42E877176D07 202 | 289C69E5-D989-4E03-A1F2-DB181F88DD5A 203 | 8656F441-5683-4C5A-BB94-AE7C37223440 204 | 645A8378-2ECF-454E-AE30-B6D097FECBD4 205 | 606D2C16-3C65-4541-8D04-FE37264A2BF9 206 | A1FE9F42-2A7A-4CE6-91FC-16AA6609B303 207 | 4B447F0E-FE01-4E9D-A15C-A7660EF267BE 208 | 4A6625A0-FB94-46A4-BF8D-8EBBC77A4778 209 | E4A625FD-7B23-41C5-9CB1-1C6AB007B0D9 210 | 211 | name 212 | Controllers 213 | 214 | F2592BD8-DCBE-4B7C-AE1A-1FF86C826530 215 | 216 | items 217 | 218 | 0412E351-735A-4D11-8089-66D70843CA3F 219 | 4C3F139B-D57D-4595-B6FA-8D5F7919148A 220 | C82DAAA6-61CF-4A30-977F-5A1986F8EF04 221 | 222 | name 223 | Tag Libraries 224 | 225 | 226 | 227 | name 228 | Groovy Grails 229 | ordering 230 | 231 | F23B2416-2A90-4F89-8E53-79848D149E25 232 | 0867DC60-0DD7-483A-86BA-07763BD2D8DB 233 | F3547D2C-0CC0-45E1-BDCE-CFD4D45BED15 234 | B6320071-EA2B-4ABD-8BF0-4BF0481F2877 235 | 4BBF0689-BAEE-4BC9-9272-73BD7705A79E 236 | 819737E6-F9B0-4C61-A5CE-1A9EF7B8C172 237 | 9DD9D0CD-7470-49A0-97B8-78852DF6D401 238 | 4933DBBB-1BFA-4EC7-B40E-F3AF80D54FEA 239 | A6E1AD30-CEA6-4632-A40C-092E48643B26 240 | E4DECA1B-424C-4A75-AD67-E907F182E4FB 241 | 86B0FEAB-6E08-47BF-8433-842B45453A93 242 | 4D085BE8-073E-4DF2-82B2-CD22E55571F5 243 | F1948640-F514-478C-A765-B17EA54F78E1 244 | 1887D21A-3F26-438D-A12F-4C1E4AB78149 245 | 4E8393F8-7E76-4370-9576-81E0A9C1C9CD 246 | BFFEE9A8-577E-4DDA-8F58-FCE2504FC102 247 | D8EABAB3-BA50-4C0E-AE3B-99AC754C269C 248 | 4E6DAF52-FD4B-470B-B230-224B525C2EFD 249 | 740B0115-F2DC-48DA-B295-42E877176D07 250 | 289C69E5-D989-4E03-A1F2-DB181F88DD5A 251 | 8656F441-5683-4C5A-BB94-AE7C37223440 252 | 645A8378-2ECF-454E-AE30-B6D097FECBD4 253 | 606D2C16-3C65-4541-8D04-FE37264A2BF9 254 | A1FE9F42-2A7A-4CE6-91FC-16AA6609B303 255 | 4B447F0E-FE01-4E9D-A15C-A7660EF267BE 256 | 4A6625A0-FB94-46A4-BF8D-8EBBC77A4778 257 | E4A625FD-7B23-41C5-9CB1-1C6AB007B0D9 258 | 2DA4083A-D3A9-45BD-8B65-EDEF8F508672 259 | AC7E256F-1B73-4975-A5D1-FDC84E667481 260 | D0969043-B070-4CD5-9A23-3FFD9D45ADC6 261 | 0B125EC5-B157-428B-87B8-93DD46FB417C 262 | 3F5C0C2A-395A-4D96-9128-8A9B96DAAA64 263 | 407CC9F3-55BF-484B-B48D-989BA5916E58 264 | D874BAA6-C6C8-4259-87EB-8764F187AA6F 265 | 110D7DDB-59CE-4DD5-A66C-2C9ADFF5F1C7 266 | 5694EFD5-1C2E-40FE-A282-695B43FD170A 267 | 463F165A-4D1B-42BE-85AF-36EF1EC7937B 268 | 0CC426AF-7257-44DC-8511-785C784C5B64 269 | 1422E213-5533-4F2E-90B8-A5D2F69E2CCC 270 | D72519A0-AC1C-40B5-AEEC-146727D173F3 271 | 17F32C97-B861-41BB-95D3-556C1426994A 272 | 34AA063A-B57C-4C2B-84B1-DAB133476173 273 | 0C1988E9-A250-46E2-9608-3FD217BD8C61 274 | DFCB9C12-7638-4AD7-8634-45095CE41F5D 275 | 182781ED-932C-49BC-A455-F0FE029CDE13 276 | E65AF691-8006-4EAF-8BA4-D379F97C6CA7 277 | 230911E9-EE4E-4309-9C19-BD3BA5763AB7 278 | 7CA17672-29EA-4978-A34A-0520AB700E36 279 | 698250E4-E144-4F89-B7F7-C9B8FA8113AB 280 | 2527E20F-D60E-486F-BD10-38C2751C22AF 281 | 4F46D369-43F4-4A6F-A11D-8906FCE8992D 282 | 763D4A25-C07F-4FDD-BE49-20C1853E7049 283 | 86EB0B0F-E050-44AA-89A9-841C36FF5991 284 | FBE8D5E8-6FCC-4936-8B4C-60509B77B42D 285 | F97F4845-11BC-463E-9A6F-D5DB4B6DFDC4 286 | CE3269DC-38A7-4B1E-AADC-B4B3B00D5178 287 | 6369A08A-2B14-4993-9CCF-0876FA142706 288 | B2B2C397-3DBB-4C1F-9C01-19B63740456D 289 | FC4117F8-C3AB-4430-8E46-C81F1F00177F 290 | 0D2FE949-F722-4802-8E99-44BF2516F4A8 291 | 74DE99D0-4BFA-4C83-8A1C-53237A83FE44 292 | 2B2758A5-B0FD-4203-A8C8-38058E16CC68 293 | 72D7EC1C-E105-41F3-9D8D-9D48FB3B94DE 294 | C82DAAA6-61CF-4A30-977F-5A1986F8EF04 295 | 4C3F139B-D57D-4595-B6FA-8D5F7919148A 296 | 0412E351-735A-4D11-8089-66D70843CA3F 297 | 602B1BBF-315A-4F64-B0D9-B9B211058A27 298 | FD3BEFAC-5C8C-4D03-9DF1-A07EB8B79807 299 | CE0A3C0D-2E58-47B2-8271-F8FBA3846CB4 300 | 2922A132-7A49-4193-B959-D30D817160B5 301 | 65B60924-7A50-4539-AB02-54E802C3B58C 302 | ED4C9595-F749-4803-98BF-EA73357D8AE0 303 | 81EFF7DA-D8FD-49D3-AD14-285E135CAA9D 304 | A77539E3-ACBE-4AD4-9DE8-625340CBACC7 305 | 9B67E226-4E45-4DDD-99FC-31545A67B7B9 306 | 90AF1D77-BD5E-454C-A5E0-D8B19DA4089A 307 | DEFDA7D4-BB3B-47D4-9408-C63C7A901A97 308 | A085D123-3C2B-4960-AC5B-0D576FE55F49 309 | 69E74F74-6AEC-43A3-9F82-580CD17DE40B 310 | 96BADBF6-D3F2-494E-B65F-3B4078DDF8C7 311 | 5E358AE7-2B58-4B13-B5DE-13834E7951B3 312 | EAED6F03-BBDF-43CE-9536-C965EA21840B 313 | 927DB595-92AE-4E2B-9CAA-7F270CD21032 314 | 75FFE634-ECF7-4FFB-9A22-2D88C8166722 315 | 60D7E667-547A-4057-8960-10EF89CBFB85 316 | 317 | uuid 318 | 2536CAAD-FADB-4C08-B950-A7FAAD24A738 319 | 320 | 321 | --------------------------------------------------------------------------------