marty 0.5.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +84 -0
  4. data/Rakefile +29 -0
  5. data/app/assets/javascripts/marty/application.js +15 -0
  6. data/app/assets/stylesheets/marty/application.css +13 -0
  7. data/app/components/marty/api_auth_view.rb +32 -0
  8. data/app/components/marty/auth_app.rb +55 -0
  9. data/app/components/marty/auth_app.rb~ +51 -0
  10. data/app/components/marty/auth_app/javascripts/auth_app.js +91 -0
  11. data/app/components/marty/auth_app/javascripts/auth_app.js~ +91 -0
  12. data/app/components/marty/cm_form_panel.rb~ +5 -0
  13. data/app/components/marty/cm_grid_panel.rb~ +35 -0
  14. data/app/components/marty/data_import_view.rb~ +142 -0
  15. data/app/components/marty/extras/layout.rb +46 -0
  16. data/app/components/marty/extras/layout.rb~ +46 -0
  17. data/app/components/marty/extras/misc.rb +18 -0
  18. data/app/components/marty/form.rb +6 -0
  19. data/app/components/marty/grid.rb +45 -0
  20. data/app/components/marty/grid_append_only.rb +12 -0
  21. data/app/components/marty/import_type_view.rb +53 -0
  22. data/app/components/marty/live_search_grid_panel.rb +46 -0
  23. data/app/components/marty/live_search_grid_panel.rb~ +49 -0
  24. data/app/components/marty/main_auth_app.rb +269 -0
  25. data/app/components/marty/main_auth_app.rb~ +238 -0
  26. data/app/components/marty/mcfly_grid_panel.rb +62 -0
  27. data/app/components/marty/mcfly_grid_panel.rb~ +80 -0
  28. data/app/components/marty/new_posting_form.rb +46 -0
  29. data/app/components/marty/new_posting_form.rb~ +46 -0
  30. data/app/components/marty/new_posting_window.rb +21 -0
  31. data/app/components/marty/new_posting_window.rb~ +21 -0
  32. data/app/components/marty/panel.rb +12 -0
  33. data/app/components/marty/pivot_grid.rb +52 -0
  34. data/app/components/marty/pivot_grid/endpoints.rb +45 -0
  35. data/app/components/marty/pivot_grid/javascripts/extensions.js +150 -0
  36. data/app/components/marty/pivot_grid/javascripts/pivot_grid.js +86 -0
  37. data/app/components/marty/pivot_grid/services.rb +44 -0
  38. data/app/components/marty/posting_grid.rb +139 -0
  39. data/app/components/marty/posting_grid.rb~ +140 -0
  40. data/app/components/marty/posting_window.rb +27 -0
  41. data/app/components/marty/promise_view.rb +177 -0
  42. data/app/components/marty/promise_view.rb~ +157 -0
  43. data/app/components/marty/promise_view/stylesheets/promise_view.css +26 -0
  44. data/app/components/marty/promise_view/stylesheets/promise_view.css~ +15 -0
  45. data/app/components/marty/report_form.rb +225 -0
  46. data/app/components/marty/report_form.rb~ +217 -0
  47. data/app/components/marty/report_select.rb +145 -0
  48. data/app/components/marty/report_select.rb~ +133 -0
  49. data/app/components/marty/reporting.rb +39 -0
  50. data/app/components/marty/reporting.rb~ +39 -0
  51. data/app/components/marty/script_detail.rb~ +430 -0
  52. data/app/components/marty/script_form.rb +233 -0
  53. data/app/components/marty/script_form.rb~ +233 -0
  54. data/app/components/marty/script_form/javascripts/Ext.ux.form.field.CodeMirror.js +698 -0
  55. data/app/components/marty/script_form/javascripts/Ext.ux.form.field.CodeMirror.js~ +909 -0
  56. data/app/components/marty/script_form/javascripts/codemirror.js +3130 -0
  57. data/app/components/marty/script_form/javascripts/mode/clike/clike.js +284 -0
  58. data/app/components/marty/script_form/javascripts/mode/clike/index.html +102 -0
  59. data/app/components/marty/script_form/javascripts/mode/clike/scala.html +766 -0
  60. data/app/components/marty/script_form/javascripts/mode/clojure/clojure.js +206 -0
  61. data/app/components/marty/script_form/javascripts/mode/clojure/index.html +67 -0
  62. data/app/components/marty/script_form/javascripts/mode/coffeescript/LICENSE +22 -0
  63. data/app/components/marty/script_form/javascripts/mode/coffeescript/coffeescript.js +346 -0
  64. data/app/components/marty/script_form/javascripts/mode/coffeescript/index.html +728 -0
  65. data/app/components/marty/script_form/javascripts/mode/commonlisp/commonlisp.js +101 -0
  66. data/app/components/marty/script_form/javascripts/mode/commonlisp/index.html +165 -0
  67. data/app/components/marty/script_form/javascripts/mode/css/css.js +448 -0
  68. data/app/components/marty/script_form/javascripts/mode/css/index.html +58 -0
  69. data/app/components/marty/script_form/javascripts/mode/css/test.js +501 -0
  70. data/app/components/marty/script_form/javascripts/mode/delorean/delorean.js +189 -0
  71. data/app/components/marty/script_form/javascripts/mode/diff/diff.js +32 -0
  72. data/app/components/marty/script_form/javascripts/mode/diff/index.html +105 -0
  73. data/app/components/marty/script_form/javascripts/mode/ecl/ecl.js +203 -0
  74. data/app/components/marty/script_form/javascripts/mode/ecl/index.html +42 -0
  75. data/app/components/marty/script_form/javascripts/mode/erlang/erlang.js +463 -0
  76. data/app/components/marty/script_form/javascripts/mode/erlang/index.html +63 -0
  77. data/app/components/marty/script_form/javascripts/mode/gfm/gfm.js +150 -0
  78. data/app/components/marty/script_form/javascripts/mode/gfm/index.html +48 -0
  79. data/app/components/marty/script_form/javascripts/mode/go/go.js +170 -0
  80. data/app/components/marty/script_form/javascripts/mode/go/index.html +73 -0
  81. data/app/components/marty/script_form/javascripts/mode/groovy/groovy.js +210 -0
  82. data/app/components/marty/script_form/javascripts/mode/groovy/index.html +72 -0
  83. data/app/components/marty/script_form/javascripts/mode/haskell/haskell.js +242 -0
  84. data/app/components/marty/script_form/javascripts/mode/haskell/index.html +61 -0
  85. data/app/components/marty/script_form/javascripts/mode/haxe/haxe.js +429 -0
  86. data/app/components/marty/script_form/javascripts/mode/haxe/index.html +91 -0
  87. data/app/components/marty/script_form/javascripts/mode/htmlembedded/htmlembedded.js +72 -0
  88. data/app/components/marty/script_form/javascripts/mode/htmlembedded/index.html +50 -0
  89. data/app/components/marty/script_form/javascripts/mode/htmlmixed/htmlmixed.js +84 -0
  90. data/app/components/marty/script_form/javascripts/mode/htmlmixed/index.html +52 -0
  91. data/app/components/marty/script_form/javascripts/mode/javascript/index.html +78 -0
  92. data/app/components/marty/script_form/javascripts/mode/javascript/javascript.js +361 -0
  93. data/app/components/marty/script_form/javascripts/mode/jinja2/index.html +38 -0
  94. data/app/components/marty/script_form/javascripts/mode/jinja2/jinja2.js +42 -0
  95. data/app/components/marty/script_form/javascripts/mode/less/index.html +740 -0
  96. data/app/components/marty/script_form/javascripts/mode/less/less.js +266 -0
  97. data/app/components/marty/script_form/javascripts/mode/lua/index.html +73 -0
  98. data/app/components/marty/script_form/javascripts/mode/lua/lua.js +140 -0
  99. data/app/components/marty/script_form/javascripts/mode/markdown/index.html +343 -0
  100. data/app/components/marty/script_form/javascripts/mode/markdown/markdown.js +382 -0
  101. data/app/components/marty/script_form/javascripts/mode/markdown/test.js +1084 -0
  102. data/app/components/marty/script_form/javascripts/mode/mysql/index.html +42 -0
  103. data/app/components/marty/script_form/javascripts/mode/mysql/mysql.js +186 -0
  104. data/app/components/marty/script_form/javascripts/mode/ntriples/index.html +33 -0
  105. data/app/components/marty/script_form/javascripts/mode/ntriples/ntriples.js +172 -0
  106. data/app/components/marty/script_form/javascripts/mode/ocaml/index.html +130 -0
  107. data/app/components/marty/script_form/javascripts/mode/ocaml/ocaml.js +114 -0
  108. data/app/components/marty/script_form/javascripts/mode/pascal/LICENSE +7 -0
  109. data/app/components/marty/script_form/javascripts/mode/pascal/index.html +49 -0
  110. data/app/components/marty/script_form/javascripts/mode/pascal/pascal.js +94 -0
  111. data/app/components/marty/script_form/javascripts/mode/perl/LICENSE +19 -0
  112. data/app/components/marty/script_form/javascripts/mode/perl/index.html +63 -0
  113. data/app/components/marty/script_form/javascripts/mode/perl/perl.js +816 -0
  114. data/app/components/marty/script_form/javascripts/mode/php/index.html +49 -0
  115. data/app/components/marty/script_form/javascripts/mode/php/php.js +148 -0
  116. data/app/components/marty/script_form/javascripts/mode/pig/index.html +43 -0
  117. data/app/components/marty/script_form/javascripts/mode/pig/pig.js +172 -0
  118. data/app/components/marty/script_form/javascripts/mode/plsql/index.html +63 -0
  119. data/app/components/marty/script_form/javascripts/mode/plsql/plsql.js +217 -0
  120. data/app/components/marty/script_form/javascripts/mode/properties/index.html +41 -0
  121. data/app/components/marty/script_form/javascripts/mode/properties/properties.js +63 -0
  122. data/app/components/marty/script_form/javascripts/mode/python/LICENSE.txt +21 -0
  123. data/app/components/marty/script_form/javascripts/mode/python/index.html +123 -0
  124. data/app/components/marty/script_form/javascripts/mode/python/python.js +338 -0
  125. data/app/components/marty/script_form/javascripts/mode/r/LICENSE +24 -0
  126. data/app/components/marty/script_form/javascripts/mode/r/index.html +74 -0
  127. data/app/components/marty/script_form/javascripts/mode/r/r.js +141 -0
  128. data/app/components/marty/script_form/javascripts/mode/rpm/changes/changes.js +19 -0
  129. data/app/components/marty/script_form/javascripts/mode/rpm/changes/index.html +54 -0
  130. data/app/components/marty/script_form/javascripts/mode/rpm/spec/index.html +100 -0
  131. data/app/components/marty/script_form/javascripts/mode/rpm/spec/spec.css +5 -0
  132. data/app/components/marty/script_form/javascripts/mode/rpm/spec/spec.js +66 -0
  133. data/app/components/marty/script_form/javascripts/mode/rst/index.html +526 -0
  134. data/app/components/marty/script_form/javascripts/mode/rst/rst.js +326 -0
  135. data/app/components/marty/script_form/javascripts/mode/ruby/LICENSE +24 -0
  136. data/app/components/marty/script_form/javascripts/mode/ruby/index.html +172 -0
  137. data/app/components/marty/script_form/javascripts/mode/ruby/ruby.js +195 -0
  138. data/app/components/marty/script_form/javascripts/mode/rust/index.html +49 -0
  139. data/app/components/marty/script_form/javascripts/mode/rust/rust.js +432 -0
  140. data/app/components/marty/script_form/javascripts/mode/scheme/index.html +65 -0
  141. data/app/components/marty/script_form/javascripts/mode/scheme/scheme.js +230 -0
  142. data/app/components/marty/script_form/javascripts/mode/shell/index.html +50 -0
  143. data/app/components/marty/script_form/javascripts/mode/shell/shell.js +118 -0
  144. data/app/components/marty/script_form/javascripts/mode/sieve/LICENSE +23 -0
  145. data/app/components/marty/script_form/javascripts/mode/sieve/index.html +81 -0
  146. data/app/components/marty/script_form/javascripts/mode/sieve/sieve.js +156 -0
  147. data/app/components/marty/script_form/javascripts/mode/smalltalk/index.html +56 -0
  148. data/app/components/marty/script_form/javascripts/mode/smalltalk/smalltalk.js +139 -0
  149. data/app/components/marty/script_form/javascripts/mode/smarty/index.html +83 -0
  150. data/app/components/marty/script_form/javascripts/mode/smarty/smarty.js +148 -0
  151. data/app/components/marty/script_form/javascripts/mode/sparql/index.html +41 -0
  152. data/app/components/marty/script_form/javascripts/mode/sparql/sparql.js +143 -0
  153. data/app/components/marty/script_form/javascripts/mode/stex/index.html +98 -0
  154. data/app/components/marty/script_form/javascripts/mode/stex/stex.js +182 -0
  155. data/app/components/marty/script_form/javascripts/mode/stex/test.js +343 -0
  156. data/app/components/marty/script_form/javascripts/mode/tiddlywiki/index.html +141 -0
  157. data/app/components/marty/script_form/javascripts/mode/tiddlywiki/tiddlywiki.css +14 -0
  158. data/app/components/marty/script_form/javascripts/mode/tiddlywiki/tiddlywiki.js +384 -0
  159. data/app/components/marty/script_form/javascripts/mode/tiki/index.html +83 -0
  160. data/app/components/marty/script_form/javascripts/mode/tiki/tiki.css +26 -0
  161. data/app/components/marty/script_form/javascripts/mode/tiki/tiki.js +309 -0
  162. data/app/components/marty/script_form/javascripts/mode/vb/LICENSE.txt +21 -0
  163. data/app/components/marty/script_form/javascripts/mode/vb/index.html +89 -0
  164. data/app/components/marty/script_form/javascripts/mode/vb/vb.js +260 -0
  165. data/app/components/marty/script_form/javascripts/mode/vbscript/index.html +43 -0
  166. data/app/components/marty/script_form/javascripts/mode/vbscript/vbscript.js +26 -0
  167. data/app/components/marty/script_form/javascripts/mode/velocity/index.html +104 -0
  168. data/app/components/marty/script_form/javascripts/mode/velocity/velocity.js +146 -0
  169. data/app/components/marty/script_form/javascripts/mode/verilog/index.html +211 -0
  170. data/app/components/marty/script_form/javascripts/mode/verilog/verilog.js +194 -0
  171. data/app/components/marty/script_form/javascripts/mode/xml/index.html +45 -0
  172. data/app/components/marty/script_form/javascripts/mode/xml/xml.js +318 -0
  173. data/app/components/marty/script_form/javascripts/mode/xquery/LICENSE +20 -0
  174. data/app/components/marty/script_form/javascripts/mode/xquery/index.html +223 -0
  175. data/app/components/marty/script_form/javascripts/mode/xquery/test/index.html +27 -0
  176. data/app/components/marty/script_form/javascripts/mode/xquery/test/testBase.js +42 -0
  177. data/app/components/marty/script_form/javascripts/mode/xquery/test/testEmptySequenceKeyword.js +16 -0
  178. data/app/components/marty/script_form/javascripts/mode/xquery/test/testMultiAttr.js +16 -0
  179. data/app/components/marty/script_form/javascripts/mode/xquery/test/testNamespaces.js +91 -0
  180. data/app/components/marty/script_form/javascripts/mode/xquery/test/testProcessingInstructions.js +16 -0
  181. data/app/components/marty/script_form/javascripts/mode/xquery/test/testQuotes.js +19 -0
  182. data/app/components/marty/script_form/javascripts/mode/xquery/xquery.js +451 -0
  183. data/app/components/marty/script_form/javascripts/mode/yaml/index.html +68 -0
  184. data/app/components/marty/script_form/javascripts/mode/yaml/yaml.js +95 -0
  185. data/app/components/marty/script_form/javascripts/util/closetag.js +164 -0
  186. data/app/components/marty/script_form/javascripts/util/dialog.css +27 -0
  187. data/app/components/marty/script_form/javascripts/util/dialog.js +70 -0
  188. data/app/components/marty/script_form/javascripts/util/foldcode.js +196 -0
  189. data/app/components/marty/script_form/javascripts/util/formatting.js +193 -0
  190. data/app/components/marty/script_form/javascripts/util/javascript-hint.js +134 -0
  191. data/app/components/marty/script_form/javascripts/util/loadmode.js +51 -0
  192. data/app/components/marty/script_form/javascripts/util/match-highlighter.js +44 -0
  193. data/app/components/marty/script_form/javascripts/util/multiplex.js +77 -0
  194. data/app/components/marty/script_form/javascripts/util/overlay.js +54 -0
  195. data/app/components/marty/script_form/javascripts/util/pig-hint.js +123 -0
  196. data/app/components/marty/script_form/javascripts/util/runmode-standalone.js +90 -0
  197. data/app/components/marty/script_form/javascripts/util/runmode.js +53 -0
  198. data/app/components/marty/script_form/javascripts/util/search.js +118 -0
  199. data/app/components/marty/script_form/javascripts/util/searchcursor.js +119 -0
  200. data/app/components/marty/script_form/javascripts/util/simple-hint.css +16 -0
  201. data/app/components/marty/script_form/javascripts/util/simple-hint.js +97 -0
  202. data/app/components/marty/script_form/javascripts/util/xml-hint.js +137 -0
  203. data/app/components/marty/script_form/stylesheets/codemirror.css +172 -0
  204. data/app/components/marty/script_form/stylesheets/delorean.css +10 -0
  205. data/app/components/marty/script_form/stylesheets/theme/ambiance.css +81 -0
  206. data/app/components/marty/script_form/stylesheets/theme/blackboard.css +25 -0
  207. data/app/components/marty/script_form/stylesheets/theme/cobalt.css +18 -0
  208. data/app/components/marty/script_form/stylesheets/theme/eclipse.css +25 -0
  209. data/app/components/marty/script_form/stylesheets/theme/elegant.css +10 -0
  210. data/app/components/marty/script_form/stylesheets/theme/erlang-dark.css +21 -0
  211. data/app/components/marty/script_form/stylesheets/theme/lesser-dark.css +44 -0
  212. data/app/components/marty/script_form/stylesheets/theme/monokai.css +28 -0
  213. data/app/components/marty/script_form/stylesheets/theme/neat.css +9 -0
  214. data/app/components/marty/script_form/stylesheets/theme/night.css +21 -0
  215. data/app/components/marty/script_form/stylesheets/theme/rubyblue.css +21 -0
  216. data/app/components/marty/script_form/stylesheets/theme/vibrant-ink.css +27 -0
  217. data/app/components/marty/script_form/stylesheets/theme/xq-dark.css +46 -0
  218. data/app/components/marty/script_grid.rb +104 -0
  219. data/app/components/marty/script_grid.rb~ +99 -0
  220. data/app/components/marty/script_tester.rb +114 -0
  221. data/app/components/marty/script_tester.rb~ +213 -0
  222. data/app/components/marty/scripting.rb +132 -0
  223. data/app/components/marty/scripting.rb~ +124 -0
  224. data/app/components/marty/select_report.rb~ +143 -0
  225. data/app/components/marty/simple_app.rb +97 -0
  226. data/app/components/marty/simple_app.rb~ +101 -0
  227. data/app/components/marty/simple_app/javascripts/simple_app.js +50 -0
  228. data/app/components/marty/simple_app/javascripts/statusbar_ext.js +8 -0
  229. data/app/components/marty/tag_grid.rb +83 -0
  230. data/app/components/marty/tag_grid.rb~ +89 -0
  231. data/app/components/marty/tree_panel.rb~ +256 -0
  232. data/app/components/marty/tree_panel/javascripts/tree_panel.js~ +317 -0
  233. data/app/components/marty/user_pivot.rb +128 -0
  234. data/app/components/marty/user_view.rb +181 -0
  235. data/app/components/marty/user_view.rb~ +188 -0
  236. data/app/controllers/marty/application_controller.rb +124 -0
  237. data/app/controllers/marty/application_controller.rb~ +133 -0
  238. data/app/controllers/marty/components_controller.rb +41 -0
  239. data/app/controllers/marty/components_controller.rb~ +37 -0
  240. data/app/controllers/marty/job_controller.rb +28 -0
  241. data/app/controllers/marty/job_controller.rb~ +28 -0
  242. data/app/controllers/marty/rpc_controller.rb +64 -0
  243. data/app/controllers/marty/rpc_controller.rb~ +61 -0
  244. data/app/helpers/marty/application_helper.rb +4 -0
  245. data/app/helpers/marty/script_set.rb +57 -0
  246. data/app/helpers/marty/script_set.rb~ +59 -0
  247. data/app/models/marty/api_auth.rb +44 -0
  248. data/app/models/marty/api_auth.rb~ +48 -0
  249. data/app/models/marty/base.rb +4 -0
  250. data/app/models/marty/data_change.rb +179 -0
  251. data/app/models/marty/data_change.rb~ +141 -0
  252. data/app/models/marty/enum.rb +22 -0
  253. data/app/models/marty/enum.rb~ +16 -0
  254. data/app/models/marty/import_type.rb +44 -0
  255. data/app/models/marty/import_type.rb~ +48 -0
  256. data/app/models/marty/poop.rb~ +169 -0
  257. data/app/models/marty/posting.rb +101 -0
  258. data/app/models/marty/posting.rb~ +86 -0
  259. data/app/models/marty/posting_type.rb +12 -0
  260. data/app/models/marty/posting_type.rb~ +21 -0
  261. data/app/models/marty/promise.rb +252 -0
  262. data/app/models/marty/promise.rb~ +196 -0
  263. data/app/models/marty/role.rb +6 -0
  264. data/app/models/marty/role.rb~ +10 -0
  265. data/app/models/marty/script.rb +144 -0
  266. data/app/models/marty/script.rb~ +62 -0
  267. data/app/models/marty/tag.rb +96 -0
  268. data/app/models/marty/tag.rb~ +91 -0
  269. data/app/models/marty/token.rb +30 -0
  270. data/app/models/marty/user.rb +146 -0
  271. data/app/models/marty/user.rb~ +148 -0
  272. data/app/models/marty/user_role.rb +7 -0
  273. data/app/models/marty/user_role.rb~ +13 -0
  274. data/app/views/layouts/marty/application.html.erb +12 -0
  275. data/app/views/layouts/marty/application.html.erb~ +11 -0
  276. data/config/locales/en.yml +134 -0
  277. data/config/routes.rb +6 -0
  278. data/config/routes.rb~ +10 -0
  279. data/db/migrate/001_create_marty_scripts.rb +14 -0
  280. data/db/migrate/003_create_marty_users.rb +12 -0
  281. data/db/migrate/004_create_marty_roles.rb +7 -0
  282. data/db/migrate/005_create_marty_user_roles.rb +14 -0
  283. data/db/migrate/006_create_marty_tokens.rb +14 -0
  284. data/db/migrate/008_create_marty_posting_types.rb +7 -0
  285. data/db/migrate/019_create_marty_postings.rb +18 -0
  286. data/db/migrate/019_create_marty_postings.rb~ +19 -0
  287. data/db/migrate/068_create_marty_import_types.rb +12 -0
  288. data/db/migrate/069_create_marty_import_synonyms.rb +15 -0
  289. data/db/migrate/070_create_versions.rb +18 -0
  290. data/db/migrate/071_add_object_changes_column_to_versions.rb +9 -0
  291. data/db/migrate/072_add_validation_function_to_import_types.rb +6 -0
  292. data/db/migrate/073_add_preprocess_function_to_import_types.rb +5 -0
  293. data/db/migrate/090_create_delayed_jobs.rb +22 -0
  294. data/db/migrate/091_create_marty_promises.rb +36 -0
  295. data/db/migrate/095_create_marty_tags.rb +14 -0
  296. data/db/migrate/095_create_marty_tags.rb~ +19 -0
  297. data/db/migrate/096_add_user_roles_to_import_types.rb +11 -0
  298. data/db/migrate/097_drop_versions.rb +9 -0
  299. data/db/migrate/098_create_marty_api_auths.rb +20 -0
  300. data/db/seeds.rb +48 -0
  301. data/lib/marty.rb +18 -0
  302. data/lib/marty.rb~ +13 -0
  303. data/lib/marty/content_handler.rb +97 -0
  304. data/lib/marty/content_handler.rb~ +93 -0
  305. data/lib/marty/data_conversion.rb +298 -0
  306. data/lib/marty/data_exporter.rb +150 -0
  307. data/lib/marty/data_exporter.rb~ +137 -0
  308. data/lib/marty/data_importer.rb +122 -0
  309. data/lib/marty/data_importer.rb~ +114 -0
  310. data/lib/marty/data_row_processor.rb~ +206 -0
  311. data/lib/marty/drop_folder_hook.rb~ +17 -0
  312. data/lib/marty/engine.rb +10 -0
  313. data/lib/marty/folder_hook.rb~ +9 -0
  314. data/lib/marty/lazy_column_loader.rb +57 -0
  315. data/lib/marty/lazy_column_loader.rb~ +47 -0
  316. data/lib/marty/mcfly_query.rb +189 -0
  317. data/lib/marty/mcfly_query.rb~ +188 -0
  318. data/lib/marty/migrations.rb +108 -0
  319. data/lib/marty/migrations.rb~ +65 -0
  320. data/lib/marty/monkey.rb +163 -0
  321. data/lib/marty/monkey.rb~ +160 -0
  322. data/lib/marty/permissions.rb +64 -0
  323. data/lib/marty/permissions.rb~ +69 -0
  324. data/lib/marty/promise.rb~ +41 -0
  325. data/lib/marty/promise_job.rb +123 -0
  326. data/lib/marty/promise_job.rb~ +121 -0
  327. data/lib/marty/promise_proxy.rb +94 -0
  328. data/lib/marty/promise_proxy.rb~ +69 -0
  329. data/lib/marty/railtie.rb +5 -0
  330. data/lib/marty/relation.rb +39 -0
  331. data/lib/marty/util.rb +110 -0
  332. data/lib/marty/util.rb~ +80 -0
  333. data/lib/marty/version.rb +3 -0
  334. data/lib/marty/version.rb~ +3 -0
  335. data/lib/marty/xl.rb +527 -0
  336. data/lib/marty/xl.rb~ +526 -0
  337. data/lib/pyxll/README.txt +19 -0
  338. data/lib/pyxll/README.txt~ +16 -0
  339. data/lib/pyxll/gemini.py +155 -0
  340. data/lib/pyxll/gemini.py~ +110 -0
  341. data/lib/pyxll/pyxll.cfg +12 -0
  342. data/lib/pyxll/pyxll.cfg~ +12 -0
  343. data/lib/pyxll/sample.xlsx +0 -0
  344. data/lib/tasks/marty_tasks.rake +37 -0
  345. metadata +517 -0
@@ -0,0 +1,145 @@
1
+ class Marty::ReportSelect < Marty::Form
2
+ include Marty::Extras::Layout
3
+
4
+ component :tag_grid do |c|
5
+ c.klass = Marty::TagGrid
6
+ c.height = 200
7
+ c.load_inline_data = false
8
+ c.title = I18n.t("script.selection_history")
9
+ c.columns = [:name, :created_dt, :comment]
10
+ c.bbar = []
11
+ end
12
+
13
+ component :script_grid do |c|
14
+ c.height = 350
15
+ c.klass = Marty::ScriptGrid
16
+ c.title = I18n.t("script.selection_list")
17
+ c.bbar = []
18
+ c.columns = [:name, :tag]
19
+ c.scope = ["name like '%Report'"]
20
+ end
21
+
22
+ ######################################################################
23
+
24
+ def configure(c)
25
+ super
26
+
27
+ c.items =
28
+ [
29
+ :tag_grid,
30
+ :script_grid,
31
+ fieldset(I18n.t("reporting.report_select"),
32
+ {
33
+ xtype: :netzkeremotecombo,
34
+ name: "nodename",
35
+ attr_type: :string,
36
+ virtual: true,
37
+ hide_label: true,
38
+ width: 200,
39
+ },
40
+ {},
41
+ ),
42
+ ]
43
+ c.bbar = []
44
+ end
45
+
46
+ js_configure do |c|
47
+ c.header = false
48
+
49
+ c.init_component = <<-JS
50
+ function() {
51
+ var me = this;
52
+ me.callParent();
53
+
54
+ var tag_grid = me.netzkeGetComponent('tag_grid').getView();
55
+ var script_grid = me.netzkeGetComponent('script_grid').getView();
56
+ var nodename = me.getForm().findField('nodename');
57
+
58
+ nodename.on('select', function(self, record) {
59
+ if(record instanceof Array) {
60
+ record = record[0]
61
+ }
62
+ var data = record && record.data;
63
+ me.selectNode({node: data.value});
64
+ });
65
+
66
+ tag_grid.getSelectionModel().on('selectionchange',
67
+ function(self, records) {
68
+ var tag_id = records[0].get('id');
69
+ me.selectTag({tag_id: tag_id});
70
+ script_grid.getStore().load();
71
+ }, me);
72
+
73
+ script_grid.getSelectionModel().on('selectionchange',
74
+ function(self, records) {
75
+ if(script_grid.getStore().isLoading() == true) return;
76
+
77
+ if(records[0] == null)
78
+ return;
79
+
80
+ var script_name = records[0].get('name');
81
+ me.selectScript({script_name: script_name});
82
+ nodename.reset();
83
+ nodename.store.load({params: {}});
84
+ }, me);
85
+ }
86
+ JS
87
+
88
+ c.parent_select_report = <<-JS
89
+ function() {
90
+ this.netzkeGetParentComponent().selectReport();
91
+ }
92
+ JS
93
+ end
94
+
95
+ # FIXME: should be in a library
96
+ REPORT_ATTR_SET = Set["title", "form", "result", "format"]
97
+
98
+ def node_list
99
+ sset = Marty::ScriptSet.new root_sess[:selected_tag_id]
100
+ engine = sset.get_engine(root_sess[:selected_script_name])
101
+
102
+ return [] unless engine
103
+
104
+ nodes = engine.enumerate_nodes.select { |n|
105
+ attrs = Set.new(engine.enumerate_attrs_by_node(n))
106
+ attrs.superset? REPORT_ATTR_SET
107
+ }
108
+
109
+ nodes.map { |node|
110
+ roles = engine.evaluate(node, "roles") rescue nil
111
+ next if roles && !roles.any?{ |r| Marty::User.has_role(r) }
112
+
113
+ begin
114
+ title, format = engine.evaluate_attrs(node, ["title", "format"])
115
+ format ? [node, "#{title} (#{format})"] : nil
116
+ rescue
117
+ [node, node]
118
+ end
119
+ }.compact.sort{ |a,b| a[1] <=> b[1]}
120
+ end
121
+
122
+ endpoint :get_combobox_options do |params, this|
123
+ this.data = node_list if params["attr"] == "nodename"
124
+ end
125
+
126
+ ######################################################################
127
+
128
+ endpoint :select_tag do |params, this|
129
+ root_sess[:selected_tag_id] = params[:tag_id]
130
+ root_sess[:selected_script_name] = nil
131
+ root_sess[:selected_node] = nil
132
+ end
133
+
134
+ endpoint :select_script do |params, this|
135
+ root_sess[:selected_script_name] = params[:script_name]
136
+ root_sess[:selected_node] = nil
137
+ end
138
+
139
+ endpoint :select_node do |params, this|
140
+ root_sess[:selected_node] = params[:node]
141
+ this.parent_select_report
142
+ end
143
+ end
144
+
145
+ ReportSelect = Marty::ReportSelect
@@ -0,0 +1,133 @@
1
+ class Marty::SelectReport < Marty::CmFormPanel
2
+ include Marty::Extras::Layout
3
+
4
+ component :tag_grid do |c|
5
+ c.klass = Marty::TagGrid
6
+ c.height = 200
7
+ c.load_inline_data = false
8
+ c.title = I18n.t("script.selection_history")
9
+ c.columns = [:name, :created_dt, :comment]
10
+ c.bbar = []
11
+ end
12
+
13
+ component :script_grid do |c|
14
+ c.height = 300
15
+ c.klass = Marty::ScriptGrid
16
+ c.title = I18n.t("script.selection_list")
17
+ c.bbar = []
18
+ c.columns = [:name, :tag]
19
+ c.scope = ["name like '%Report'"]
20
+ end
21
+
22
+ ######################################################################
23
+
24
+ def configure(c)
25
+ super
26
+
27
+ c.items =
28
+ [
29
+ :tag_grid,
30
+ :script_grid,
31
+ fieldset(I18n.t("reporting.select_report"),
32
+ {
33
+ xtype: :netzkeremotecombo,
34
+ name: "nodename",
35
+ attr_type: :string,
36
+ virtual: true,
37
+ hide_label: true,
38
+ width: 200,
39
+ },
40
+ {},
41
+ ),
42
+ ]
43
+ c.bbar = []
44
+ end
45
+
46
+ js_configure do |c|
47
+ c.header = false
48
+
49
+ c.init_component = <<-JS
50
+ function() {
51
+ var me = this;
52
+ me.callParent();
53
+
54
+ var tag_grid = me.netzkeGetComponent('tag_grid').getView();
55
+ var script_grid = me.netzkeGetComponent('script_grid').getView();
56
+ var form = me.getForm();
57
+ var nodename = form.findField('nodename');
58
+
59
+ tag_grid.on('itemclick', function(tag_grid, record) {
60
+ var tag_id = record.get('id');
61
+ me.selectTag({tag_id: tag_id});
62
+ script_grid.getStore().load();
63
+ }, me);
64
+
65
+ script_grid.on('itemclick', function(script_grid, record) {
66
+ var script_name = record.get('name');
67
+ me.selectScript({script_name: script_name});
68
+ nodename.reset();
69
+ nodename.store.load({params: {}});
70
+ }, me);
71
+
72
+ nodename.on('select', function(combo, record) {
73
+ var data = record[0] && record[0].data;
74
+ me.selectNode({node: data.value});
75
+ });
76
+ }
77
+ JS
78
+
79
+ c.parent_select_report = <<-JS
80
+ function() {
81
+ this.netzkeGetParentComponent().selectReport();
82
+ }
83
+ JS
84
+ end
85
+
86
+ # FIXME: should be in a library
87
+ REPORT_ATTR_SET = Set["title", "form", "result", "format"]
88
+
89
+ def node_list
90
+ sset = Marty::ScriptSet.new root_sess[:selected_tag_id]
91
+ engine = sset.get_engine(root_sess[:selected_script_name])
92
+
93
+ return [] unless engine
94
+
95
+ nodes = engine.enumerate_nodes.select { |n|
96
+ attrs = Set.new(engine.enumerate_attrs_by_node(n))
97
+ attrs.superset? REPORT_ATTR_SET
98
+ }
99
+
100
+ nodes.map { |node|
101
+ begin
102
+ title, format = engine.evaluate_attrs(node, ["title", "format"])
103
+ format ? [node, "#{title} (#{format})"] : nil
104
+ rescue
105
+ [node, node]
106
+ end
107
+ }.compact.sort{ |a,b| a[1] <=> b[1]}
108
+ end
109
+
110
+ endpoint :get_combobox_options do |params, this|
111
+ this.data = node_list if params["attr"] == "nodename"
112
+ end
113
+
114
+ ######################################################################
115
+
116
+ endpoint :select_tag do |params, this|
117
+ root_sess[:selected_tag_id] = params[:tag_id]
118
+ root_sess[:selected_script_name] = nil
119
+ root_sess[:selected_node] = nil
120
+ end
121
+
122
+ endpoint :select_script do |params, this|
123
+ root_sess[:selected_script_name] = params[:script_name]
124
+ root_sess[:selected_node] = nil
125
+ end
126
+
127
+ endpoint :select_node do |params, this|
128
+ root_sess[:selected_node] = params[:node]
129
+ this.parent_select_report
130
+ end
131
+ end
132
+
133
+ SelectReport = Marty::SelectReport
@@ -0,0 +1,39 @@
1
+ class Marty::Reporting < Netzke::Base
2
+ def configure(c)
3
+ super
4
+ c.items = [
5
+ :report_select,
6
+ :report_form,
7
+ ]
8
+ end
9
+
10
+ js_configure do |c|
11
+ c.header = false
12
+ c.layout = :border
13
+ c.defaults = {body_style: 'padding:0px'}
14
+
15
+ c.select_report = <<-JS
16
+ function() {
17
+ // this.netzkeGetComponent('report_form').netzkeLoad({});
18
+ // FIXME: NetzkeReload() doesn't work when performed on
19
+ // ReportForm. So, reload all of Reporting.
20
+ this.netzkeReload();
21
+ }
22
+ JS
23
+ end
24
+
25
+ component :report_form do |c|
26
+ c.klass = Marty::ReportForm
27
+ c.flex = 1
28
+ c.region = :center
29
+ end
30
+
31
+ component :report_select do |c|
32
+ c.klass = Marty::ReportSelect
33
+ c.split = true
34
+ c.region = :west
35
+ c.width = 325
36
+ end
37
+ end
38
+
39
+ Reporting = Marty::Reporting
@@ -0,0 +1,39 @@
1
+ class Marty::Reporting < Netzke::Base
2
+ def configure(c)
3
+ super
4
+ c.items = [
5
+ :select_report,
6
+ :report_form,
7
+ ]
8
+ end
9
+
10
+ js_configure do |c|
11
+ c.header = false
12
+ c.layout = :border
13
+ c.defaults = {body_style: 'padding:0px'}
14
+
15
+ c.select_report = <<-JS
16
+ function() {
17
+ // this.netzkeGetComponent('report_form').netzkeLoad({});
18
+ // FIXME: NetzkeReload() doesn't work when performed on
19
+ // ReportForm. So, reload all of Reporting.
20
+ this.netzkeReload();
21
+ }
22
+ JS
23
+ end
24
+
25
+ component :report_form do |c|
26
+ c.klass = Marty::ReportForm
27
+ c.flex = 1
28
+ c.region = :center
29
+ end
30
+
31
+ component :select_report do |c|
32
+ c.klass = Marty::SelectReport
33
+ c.split = true
34
+ c.region = :west
35
+ c.width = 300
36
+ end
37
+ end
38
+
39
+ Reporting = Marty::Reporting
@@ -0,0 +1,430 @@
1
+ require 'delorean_lang'
2
+ require 'coderay'
3
+
4
+ class Marty::ScriptDetail < Marty::CmFormPanel
5
+ DASH = 0x2012.chr('utf-8')
6
+
7
+ css_configure do |c|
8
+ c.require :codemirror
9
+ c.require :delorean
10
+ end
11
+
12
+ js_configure do |c|
13
+ c.require :"Ext.ux.form.field.CodeMirror"
14
+ c.require :codemirror
15
+ c.require "#{File.dirname(__FILE__)}/script_detail/javascripts/mode/delorean/delorean.js"
16
+
17
+ c.set_action_modes = <<-JS
18
+ function(a) {
19
+ this.actions.apply.setDisabled(!a["save"]);
20
+ this.actions.checkin.setDisabled(!a["checkin"]);
21
+ this.actions.checkout.setDisabled(!a["checkout"]);
22
+ this.actions.discard.setDisabled(!a["discard"]);
23
+ // style input field text based on whether it is editable
24
+ this.getForm().findField('body').editor.setOption("readOnly", !a["save"]);
25
+ }
26
+ JS
27
+
28
+ c.get_script_id = <<-JS
29
+ function() {
30
+ return this.getForm().findField('id').getValue();
31
+ }
32
+ JS
33
+
34
+ c.get_script_body = <<-JS
35
+ function() {
36
+ return this.getForm().findField('body').getValue();
37
+ }
38
+ JS
39
+
40
+ # Sets an editor line class (unset any previous line class). For
41
+ # now, only one line is classed at a time.
42
+ c.set_line_error = <<-JS
43
+ function(line) {
44
+ line -= 1;
45
+ var editor = this.getForm().findField('body').editor;
46
+ if (editor.oldline) { editor.oldline.className = null; }
47
+ if (line > -1) {
48
+ editor.oldline = editor.setLineClass(line, "errorline");
49
+ }
50
+ editor.refresh();
51
+ }
52
+ JS
53
+
54
+ ######################################################################
55
+
56
+ c.refresh_parent = <<-JS
57
+ function(script_id) {
58
+ this.netzkeGetParentComponent().scriptRefresh(script_id);
59
+ }
60
+ JS
61
+
62
+ ######################################################################
63
+
64
+ c.on_checkin = <<-JS
65
+ function() {
66
+ var form_obj = this;
67
+ Ext.Msg.show({
68
+ title: 'Confirm Checkin',
69
+ msg: 'Enter a checkin message:',
70
+ width: 400,
71
+ buttons: Ext.MessageBox.OKCANCEL,
72
+ multiline: true,
73
+ fn: function (btn, value, cfg) {
74
+ (btn == "ok") && form_obj.serverCheckin(
75
+ {
76
+ body: form_obj.getScriptBody(),
77
+ logmsg: value,
78
+ script_id: form_obj.getScriptId(),
79
+ });
80
+ },
81
+ });
82
+ }
83
+ JS
84
+
85
+ c.on_discard = <<-JS
86
+ function() {
87
+ var form_obj = this;
88
+ Ext.Msg.confirm('Confirm',
89
+ 'This action will remove the current DEV version.<br>' +
90
+ 'All changes since the last checkin <b>will be lost</b>. <br>' +
91
+ 'This action cannot be undone. Are you sure?',
92
+ function (btn, value, cfg) {
93
+ (btn == "yes") && form_obj.serverDiscard({script_id: form_obj.getScriptId()});
94
+ });
95
+ }
96
+ JS
97
+
98
+ c.on_checkout = <<-JS
99
+ function() {
100
+ this.serverCheckout({script_id: this.getScriptId()});
101
+ }
102
+ JS
103
+
104
+ c.on_print = <<-JS
105
+ function() {
106
+ window.open("/marty/components/#{self.name}.html?script_id=" + this.getScriptId(),
107
+ "printing", 'width=800,height=700,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,copyhistory=no,resizable=yes');
108
+ }
109
+ JS
110
+ end
111
+
112
+ ######################################################################
113
+
114
+ def get_title
115
+ return unless @record
116
+
117
+ status = @record.isdev? ? "Checked out by #{@record.group_dscript.user}" :
118
+ "Checked in by #{@record.user}"
119
+
120
+ [@record.name, "Ver: #{@record.version}", status].
121
+ join(" #{Marty::ScriptDetail::DASH} ")
122
+ end
123
+
124
+ def isdev?
125
+ @record && @record.isdev?
126
+ end
127
+
128
+ def istip?
129
+ @record && @record.istip?
130
+ end
131
+
132
+ def ismodified?
133
+ @record && @record.differs_from_dscript?
134
+ end
135
+
136
+ ######################################################################
137
+
138
+ def can_save?(ds)
139
+ self.class.has_admin_perm? || (ds.user == Mcfly.whodunnit)
140
+ end
141
+
142
+ def can_checkin?(ds)
143
+ ds.user == Mcfly.whodunnit
144
+ end
145
+
146
+ def can_discard?(ds)
147
+ self.class.has_admin_perm? || (ds.user == Mcfly.whodunnit)
148
+ end
149
+
150
+ def can_checkout?
151
+ config[:allow_edit]
152
+ end
153
+
154
+ ######################################################################
155
+
156
+ endpoint :netzke_load do |params, this|
157
+ unless self.class.has_any_perm?
158
+ this.netzke_feedback "Permission Denied"
159
+ return
160
+ end
161
+
162
+ # logic copied from basepack's form_panel.service
163
+ @record = Marty::Script.find_by_id(params[:id])
164
+
165
+ this.set_form_values js_record_data
166
+ this.set_title get_title
167
+ this.set_readonly_mode !isdev?
168
+
169
+ modes = {
170
+ save: isdev? && can_save?(@record.group_dscript),
171
+ checkin: isdev? && ismodified? && can_checkin?(@record.group_dscript),
172
+ checkout: istip? && !@record.dscript && can_checkout?,
173
+ discard: isdev? && can_discard?(@record.group_dscript),
174
+ }
175
+
176
+ this.set_action_modes(modes)
177
+ end
178
+
179
+ ######################################################################
180
+
181
+ action :apply do |a|
182
+ a.text = I18n.t("script_detail.save")
183
+ a.tooltip = I18n.t("script_detail.save")
184
+ a.icon = :database_save
185
+ a.disabled = true
186
+ end
187
+
188
+ endpoint :netzke_submit do |params, this|
189
+ unless self.class.has_any_perm?
190
+ this.netzke_feedback "Permission Denied"
191
+ return
192
+ end
193
+
194
+ # p 'X'*30, params
195
+
196
+ # copied from corresponding method in form_panel.services
197
+ data = ActiveSupport::JSON.decode(params[:data])
198
+ data.each_pair do |k,v|
199
+ data[k] = nil if v.blank? || v == "null"
200
+ end
201
+
202
+ @record = Marty::Script.find_by_id(data["id"])
203
+
204
+ # p 'd.'*30, data, @record
205
+
206
+ unless @record
207
+ this.netzke_feedback "no record"
208
+ return
209
+ end
210
+
211
+ ds = @record.group_dscript
212
+
213
+ unless ds
214
+ this.netzke_feedback "no dev record"
215
+ return
216
+ end
217
+
218
+ if ds.body == data["body"]
219
+ this.netzke_feedback "no save needed"
220
+ # clear the error line if any
221
+ this.set_line_error -1
222
+ return
223
+ end
224
+
225
+ unless can_save?(ds)
226
+ this.netzke_feedback "Permission denied"
227
+ return
228
+ end
229
+
230
+ begin
231
+ engine = Marty::ScriptSet.parse(@record.name, data["body"])
232
+ rescue Delorean::ParseError => exc
233
+ this.netzke_feedback exc.message
234
+ this.apply_form_errors({})
235
+ this.set_line_error(exc.line)
236
+ return
237
+ end
238
+
239
+ ds.body = data["body"]
240
+
241
+ if ds.save
242
+ this.set_form_values(js_record_data)
243
+ this.netzke_set_result(true)
244
+ this.refresh_parent(@record.id)
245
+ return
246
+ end
247
+
248
+ data_adapter.errors_array(ds).each do |error|
249
+ flash error: error
250
+ end
251
+
252
+ this.netzke_feedback @flash
253
+ this.apply_form_errors(build_form_errors(record))
254
+ end
255
+
256
+ ######################################################################
257
+
258
+ action :checkin do |a|
259
+ a.text = I18n.t("script_detail.checkin")
260
+ a.tooltip = I18n.t("script_detail.checkin")
261
+ a.icon = :tag_blue_add
262
+ a.disabled = true
263
+ end
264
+
265
+ endpoint :server_checkin do |params, this|
266
+ @record = Marty::Script.find_by_id(params[:script_id])
267
+
268
+ unless @record
269
+ this.netzke_feedback "no record"
270
+ return
271
+ end
272
+
273
+ ds = @record.group_dscript
274
+
275
+ unless ds
276
+ this.netzke_feedback "no dev record"
277
+ return
278
+ end
279
+
280
+ if ds.body != params[:body]
281
+ this.netzke_feedback "Error: Unsaved changes. Save before checkin."
282
+ return
283
+ end
284
+
285
+ unless can_checkin?(ds)
286
+ this.netzke_feedback "Permission denied"
287
+ return
288
+ end
289
+
290
+ ds.checkin(params[:logmsg])
291
+
292
+ this.netzke_feedback "checkin done"
293
+ this.refresh_parent @record.group_id
294
+ end
295
+
296
+ ######################################################################
297
+
298
+ action :checkout do |a|
299
+ a.text = I18n.t("script_detail.checkout")
300
+ a.tooltip = I18n.t("script_detail.checkout")
301
+ a.icon = :tag_blue_edit
302
+ a.disabled = true
303
+ end
304
+
305
+ endpoint :server_checkout do |params, this|
306
+ @record = Marty::Script.find_by_id(params[:script_id])
307
+
308
+ unless @record
309
+ this.netzke_feedback "no record"
310
+ return
311
+ end
312
+
313
+ unless can_checkout?
314
+ this.netzke_feedback "Permission denied"
315
+ return
316
+ end
317
+
318
+ begin
319
+ @record.checkout
320
+ rescue => exc
321
+ this.netzke_feedback exc.message
322
+ return
323
+ end
324
+
325
+ this.netzke_feedback I18n.t("script_detail.checked_out")
326
+ this.refresh_parent @record.dev_version.id
327
+ end
328
+
329
+ ######################################################################
330
+
331
+ action :discard do |a|
332
+ a.text = I18n.t("script_detail.discard")
333
+ a.tooltip = I18n.t("script_detail.discard")
334
+ a.icon = :tag_blue_delete
335
+ a.disabled = true
336
+ end
337
+
338
+ endpoint :server_discard do |params, this|
339
+ r = Marty::Script.find_by_id(params[:script_id])
340
+
341
+ unless r
342
+ this.netzke_feedback "no record"
343
+ return
344
+ end
345
+
346
+ @record = r.last_version
347
+
348
+ unless @record.dscript
349
+ this.netzke_feedback "no dev record"
350
+ return
351
+ end
352
+
353
+ unless can_discard?(@record.dscript)
354
+ this.netzke_feedback "Permission denied"
355
+ return
356
+ end
357
+
358
+ @record.dscript.discard
359
+
360
+ this.netzke_feedback I18n.t("script_detail.discarded")
361
+ this.refresh_parent(@record.isdev? ? -1 : @record.group_id)
362
+ end
363
+
364
+ ######################################################################
365
+
366
+ action :print do |a|
367
+ a.text = I18n.t("script_detail.print")
368
+ a.tooltip = I18n.t("script_detail.print")
369
+ a.icon = :printer
370
+ a.handler = :on_print
371
+ end
372
+
373
+ ######################################################################
374
+
375
+ def configure_bbar(c)
376
+ c[:bbar] = [
377
+ :apply,
378
+ :checkin,
379
+ :checkout,
380
+ :discard,
381
+ :print,
382
+ ]
383
+ end
384
+
385
+ ######################################################################
386
+
387
+ # used for printing
388
+ def export_content(format, title, params={})
389
+ raise "unknown format: #{format}" unless format == "html"
390
+
391
+ r = Marty::Script.find_by_id(params[:script_id])
392
+ body = get_body(r)
393
+ res = CodeRay.scan(body, :ruby).div(line_numbers: :table)
394
+
395
+ [res, "text/html", "inline", "#{title}.html"]
396
+ end
397
+
398
+ def get_body(r)
399
+ r = r.group_dscript if r.isdev?
400
+ r ? r.body : "ERROR: NO BODY"
401
+ end
402
+
403
+ def configure(c)
404
+ super
405
+
406
+ # Hacky fix to allow for testing
407
+ c.allow_edit = true if c.allow_edit.nil? && ENV["RAILS_ENV"] == "test" &&
408
+ self.class.current_user_roles.include?(:dev)
409
+
410
+ c.title = "Script Detail"
411
+ c.model = "Marty::Script"
412
+ c.items = [
413
+ {
414
+ mode: "text/x-delorean",
415
+ line_numbers: true,
416
+ indent_unit: 4,
417
+ tab_mode: "shift",
418
+ match_brackets: true,
419
+
420
+ hide_label: true,
421
+ xtype: :codemirror,
422
+ name: :body,
423
+ empty_text: "No script selected.",
424
+ getter: lambda { |r| get_body(r) },
425
+ },
426
+ ]
427
+ end
428
+ end
429
+
430
+ ScriptDetail = Marty::ScriptDetail