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,157 @@
1
+ class Marty::PromiseView < Marty::TreePanel
2
+ extend Marty::Permissions
3
+
4
+ css_configure do |c|
5
+ c.require :promise_view
6
+ end
7
+
8
+ js_configure do |c|
9
+ c.default_get_row_class = <<-JS
10
+ function(record, index, rowParams, ds) {
11
+ var status = record.get('status');
12
+ if (status === false) return "red-row";
13
+ if (status === true) return "green-row";
14
+ return "orange-row";
15
+ }
16
+ JS
17
+ end
18
+
19
+ def configure(c)
20
+ c.title = I18n.t("jobs.promise_view")
21
+ c.model = "Marty::Promise"
22
+ c.columns = [
23
+ :parent,
24
+ :user__login,
25
+ :job_id,
26
+ :start_dt,
27
+ :end_dt,
28
+ :status,
29
+ :cformat,
30
+ :error,
31
+ ]
32
+ c.treecolumn = :parent
33
+ super
34
+
35
+ c.data_store.sorters = {
36
+ property: "id",
37
+ direction: 'DESC',
38
+ }
39
+
40
+ # garbage collect old promises (hacky to do this here)
41
+ Marty::Promise.cleanup(false)
42
+ end
43
+
44
+ def bbar
45
+ [:clear, '->', :refresh, :download]
46
+ end
47
+
48
+ js_configure do |c|
49
+ c.init_component = <<-JS
50
+ function() {
51
+ this.callParent();
52
+ this.getSelectionModel().on('selectionchange', function(selModel) {
53
+ this.actions.download &&
54
+ this.actions.download.setDisabled(!selModel.hasSelection());
55
+ }, this);
56
+ }
57
+ JS
58
+
59
+ c.on_download = <<-JS
60
+ function() {
61
+ var jid = this.getSelectionModel().selected.first().getId();
62
+ // FIXME: seems pretty hacky
63
+ window.location = "#{Marty::Util.marty_path}/job/download?job_id=" + jid;
64
+ }
65
+ JS
66
+
67
+ c.on_refresh = <<-JS
68
+ function() {
69
+ this.store.load();
70
+ }
71
+ JS
72
+
73
+ c.on_clear = <<-JS
74
+ function(params) {
75
+ var me = this;
76
+ Ext.Msg.prompt('Clear All Jobs',
77
+ 'Enter CLEAR and press OK to clear all previous jobs',
78
+ function (btn, value) {
79
+ (btn == "ok" && value == "CLEAR") && me.serverClear({});
80
+ });
81
+ }
82
+ JS
83
+ end
84
+
85
+ action :clear do |a|
86
+ a.text = a.tooltip = 'Clear'
87
+ a.disabled = false
88
+ a.icon = :application_delete
89
+ a.hidden = !self.class.has_admin_perm?
90
+ end
91
+
92
+ action :download do |a|
93
+ a.text = a.tooltip = 'Download'
94
+ a.disabled = true
95
+ a.icon = :application_put
96
+ end
97
+
98
+ action :refresh do |a|
99
+ a.text = a.tooltip = 'Refresh'
100
+ a.disabled = false
101
+ a.icon = :arrow_refresh
102
+ end
103
+
104
+ endpoint :server_clear do |params, this|
105
+ Marty::Promise.cleanup(true)
106
+ this.on_refresh
107
+ end
108
+
109
+ def get_children(params)
110
+ params[:scope] = config[:scope]
111
+
112
+ parent_id = params[:node]
113
+ parent_id = nil if parent_id == 'root'
114
+
115
+ scope_data_class(params) do
116
+ data_class.where(parent_id: parent_id).scoping do
117
+ data_adapter.get_records(params, final_columns)
118
+ end
119
+ end
120
+ end
121
+
122
+ column :parent do |c|
123
+ c.text = 'Job Name'
124
+ c.getter = lambda { |r| r.title }
125
+ c.width = 275
126
+ end
127
+
128
+ column :status do |c|
129
+ c.hidden = true
130
+ # FIXME: TreePanel appears to not work with hidden boolean cols
131
+ c.xtype = 'numbercolumn'
132
+ end
133
+
134
+ column :user__login do |c|
135
+ c.text = I18n.t('jobs.user_login')
136
+ end
137
+
138
+ column :start_dt do |c|
139
+ c.text = I18n.t('jobs.start_dt')
140
+ end
141
+
142
+ column :end_dt do |c|
143
+ c.text = I18n.t('jobs.end_dt')
144
+ end
145
+
146
+ column :error do |c|
147
+ c.getter = lambda {|r| r.result.to_s if r.status == false}
148
+ c.flex = 1
149
+ end
150
+
151
+ column :cformat do |c|
152
+ c.text = "Format"
153
+ end
154
+
155
+ end
156
+
157
+ PromiseView = Marty::PromiseView
@@ -0,0 +1,26 @@
1
+ .green-row {
2
+ background-color: #91FF91;
3
+ }
4
+
5
+ .red-row {
6
+ background-color: #FF4545;
7
+ }
8
+
9
+ .orange-row {
10
+ background-color: #FF9D5C;
11
+ }
12
+
13
+ .x-grid-item-selected .green-row {
14
+ background-color: #549454; /* V: 58 */
15
+ font-weight: bold;
16
+ }
17
+
18
+ .x-grid-item-selected .red-row {
19
+ background-color: #bd3333; /* V: 74 */
20
+ font-weight: bold;
21
+ }
22
+
23
+ .x-grid-item-selected .orange-row {
24
+ background-color: #b87243; /* V: 74 */
25
+ font-weight: bold;
26
+ }
@@ -0,0 +1,15 @@
1
+ .green-row td {
2
+ background-color: #77FF77 !important;
3
+ }
4
+
5
+ .red-row td {
6
+ background-color: red !important;
7
+ }
8
+
9
+ .orange-row td {
10
+ background-color: orange !important;
11
+ }
12
+
13
+ .gray-row td {
14
+ background-color: #D3D3D3 !important;
15
+ }
@@ -0,0 +1,225 @@
1
+ require 'delorean_lang'
2
+
3
+ class Marty::ReportForm < Marty::Form
4
+
5
+ # override apply for background generation
6
+ action :apply do |a|
7
+ a.text = a.tooltip = I18n.t("reporting.background")
8
+ a.handler = :on_apply
9
+ a.icon = :report_disk
10
+ a.disabled = false
11
+ end
12
+
13
+ action :foreground do |a|
14
+ a.text = a.tooltip = I18n.t("reporting.generate")
15
+ a.handler = :on_foreground
16
+ a.icon = :report_go
17
+ a.disabled = false
18
+ end
19
+
20
+ ######################################################################
21
+
22
+ def configure_bbar(c)
23
+ c[:bbar] = ['->', :apply, :foreground]
24
+ end
25
+
26
+ ######################################################################
27
+
28
+ def _get_report_engine(params)
29
+ d_params = ActiveSupport::JSON.decode(params[:data] || "{}")
30
+ d_params.each_pair do |k,v|
31
+ d_params[k] = nil if v.blank? || v == "null"
32
+ end
33
+
34
+ tag_id, script_name =
35
+ session[:selected_tag_id], session[:selected_script_name]
36
+
37
+ engine = Marty::ScriptSet.new(tag_id).get_engine(script_name)
38
+
39
+ [engine, d_params]
40
+ end
41
+
42
+ def run_eval(params)
43
+ engine, d_params = _get_report_engine(params)
44
+
45
+ begin
46
+ engine.evaluate(session[:selected_node], "result", d_params)
47
+ rescue => exc
48
+ Marty::Util.logger.error "run_eval failed: #{exc.backtrace}"
49
+
50
+ res = Delorean::Engine.grok_runtime_exception(exc)
51
+ res["backtrace"] =
52
+ res["backtrace"].map {|m, line, fn| "#{m}:#{line} #{fn}"}.join('\n')
53
+ res
54
+ end
55
+ end
56
+
57
+ def export_content(format, title, params={})
58
+ data = run_eval(params)
59
+
60
+ # hacky: shouldn't have error parsing logic here
61
+ format = "json" if data.is_a?(Hash) && (data[:error] || data["error"])
62
+
63
+ # hack for testing -- txt -> csv
64
+ exp_format = format == "txt" ? "csv" : format
65
+
66
+ res, type, disposition, filename =
67
+ Marty::ContentHandler.export(data, exp_format, title)
68
+
69
+ # hack for testing -- set content-type
70
+ type = "text/plain" if format == "txt" && type =~ /csv/
71
+
72
+ [res, type, disposition, filename]
73
+ end
74
+
75
+ endpoint :netzke_submit do |params, this|
76
+ # We get here when user is asking for a background report
77
+
78
+ engine, d_params = _get_report_engine(params)
79
+
80
+ roles = engine.
81
+ evaluate(session[:selected_node], "roles", {}) rescue nil
82
+
83
+ if roles && !roles.any?{ |r| Marty::User.has_role(r) }
84
+ this.netzke_feedback "Insufficient permissions to run report!"
85
+ return
86
+ end
87
+
88
+ d_params["p_title"] ||= engine.
89
+ evaluate(session[:selected_node], "title", {}).to_s
90
+
91
+ # start background promise to get report result
92
+ engine.background_eval(session[:selected_node],
93
+ d_params,
94
+ ["result", "title", "format"],
95
+ )
96
+
97
+ this.netzke_feedback "Report can be accessed from the Jobs Dashboard ..."
98
+ end
99
+
100
+ ######################################################################
101
+
102
+ js_configure do |c|
103
+ # FIXME: Can we use POST instead of get:
104
+ # http://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit
105
+ # arman -- I tried this solution. However, with a POST the
106
+ # component no longer has the session cookie. Therefore, we don't
107
+ # have access to the selected script. We likely needs to rethink
108
+ # this whole mechanism.
109
+ c.on_foreground = <<-JS
110
+ function() {
111
+ var values = this.getForm().getValues();
112
+ var data = escape(Ext.encode(values));
113
+ if (data.length > 4096) {
114
+ msg = "There is too much data to run as a foreground report." +\
115
+ "<br/>Please run as a background report."
116
+ Ext.create('Ext.Window', {
117
+ height: 100,
118
+ minWidth: 350,
119
+ autoWidth: true,
120
+ modal: true,
121
+ autoScroll: true,
122
+ html: msg,
123
+ title: "Warning"
124
+ }).show();
125
+ } else {
126
+ // FIXME: this is very hacky since it bypasses Netzke channel.
127
+ // This is a security hole wrt to the report role mechanism.
128
+ window.location = "/marty/components/#{self.name}." + this.repformat +\
129
+ "?data=" + data + "&reptitle=" + this.reptitle;
130
+ }
131
+ }
132
+ JS
133
+ end
134
+
135
+ endpoint :netzke_load do |params, this|
136
+ end
137
+
138
+ def eval_form_items(engine, items)
139
+ case items
140
+ when Array
141
+ items.map {|x| eval_form_items(engine, x)}
142
+ when Hash
143
+ items.each_with_object({}) { |(key, value), result|
144
+ result[key] = eval_form_items(engine, value)
145
+ }
146
+ when String
147
+ items.starts_with?(':') ? items[1..-1].to_sym : items
148
+ when Class
149
+ raise "bad value in form #{items}" unless
150
+ items < Delorean::BaseModule::BaseClass
151
+
152
+ attrs = engine.enumerate_attrs_by_node(items)
153
+
154
+ engine.eval_to_hash(items, attrs, {})
155
+ when Numeric, TrueClass, FalseClass
156
+ items
157
+ else
158
+ raise "bad value in form #{items}"
159
+ end
160
+ end
161
+
162
+ def configure(c)
163
+ super
164
+
165
+ unless root_sess[:selected_script_name] && root_sess[:selected_node]
166
+ c.title = "No Report selected."
167
+ return
168
+ end
169
+
170
+ begin
171
+ sset = Marty::ScriptSet.new(root_sess[:selected_tag_id])
172
+ engine = sset.get_engine(root_sess[:selected_script_name])
173
+
174
+ raise engine.to_s if engine.is_a?(Hash)
175
+
176
+ items, title, format = engine.
177
+ evaluate_attrs(root_sess[:selected_node],
178
+ ["form", "title", "format"],
179
+ {},
180
+ )
181
+
182
+ raise "bad form items" unless items.is_a?(Array)
183
+ raise "bad format" unless
184
+ ["csv", "xlsx", "zip", "json"].member?(format)
185
+ rescue => exc
186
+ c.title = "ERROR"
187
+ c.items =
188
+ [
189
+ {
190
+ field_label: 'Exception',
191
+ xtype: :displayfield,
192
+ name: 'displayfield1',
193
+ value: "<span style=\"color:red;\">#{exc}</span>"
194
+ },
195
+ ]
196
+ return
197
+ end
198
+
199
+ # if there's a background_only flag, we disable the foreground submit
200
+ background_only =
201
+ engine.evaluate(root_sess[:selected_node], "background_only") rescue nil
202
+
203
+ items = Marty::Xl.symbolize_keys(eval_form_items(engine, items), ':')
204
+
205
+ items = [{html: "<br><b>No input is needed for this report.</b>"}] if
206
+ items.empty?
207
+
208
+ # Hacky: store these globally in session so we can get them on
209
+ # report generation request which comes out of band. Also, if the
210
+ # user's script/tag selection changes, we don't need to redraw
211
+ # report_form.
212
+ session[:selected_tag_id] = root_sess[:selected_tag_id]
213
+ session[:selected_script_name] = root_sess[:selected_script_name]
214
+ session[:selected_node] = root_sess[:selected_node]
215
+
216
+ c.items = items
217
+ c.repformat = format
218
+ c.title = "Generate: #{title}-#{sset.tag.name}"
219
+ c.reptitle = title
220
+
221
+ actions[:foreground].disabled = !!background_only
222
+ end
223
+ end
224
+
225
+ ReportForm = Marty::ReportForm
@@ -0,0 +1,217 @@
1
+ require 'delorean_lang'
2
+
3
+ class Marty::ReportForm < Marty::CmFormPanel
4
+
5
+ # override apply for background generation
6
+ action :apply do |a|
7
+ a.text = a.tooltip = I18n.t("reporting.background")
8
+ a.handler = :on_apply
9
+ a.icon = :report_disk
10
+ a.disabled = false
11
+ end
12
+
13
+ action :generate do |a|
14
+ a.text = a.tooltip = I18n.t("reporting.generate")
15
+ a.handler = :on_generate
16
+ a.icon = :report_go
17
+ a.disabled = false
18
+ end
19
+
20
+ ######################################################################
21
+
22
+ def configure_bbar(c)
23
+ c[:bbar] = ['->', :apply, :generate]
24
+ end
25
+
26
+ ######################################################################
27
+
28
+ def _get_report_engine(params)
29
+ d_params = ActiveSupport::JSON.decode(params[:data] || "{}")
30
+ d_params.each_pair do |k,v|
31
+ d_params[k] = nil if v.blank? || v == "null"
32
+ end
33
+
34
+ tag_id, script_name =
35
+ session[:selected_tag_id], session[:selected_script_name]
36
+
37
+ engine = Marty::ScriptSet.new(tag_id).get_engine(script_name)
38
+
39
+ [engine, d_params]
40
+ end
41
+
42
+ def run_eval(params)
43
+ engine, d_params = _get_report_engine(params)
44
+
45
+ begin
46
+ engine.evaluate(session[:selected_node], "result", d_params)
47
+ rescue => exc
48
+ Marty::Util.logger.error "run_eval failed: #{exc.backtrace}"
49
+
50
+ res = Delorean::Engine.grok_runtime_exception(exc)
51
+ res["backtrace"] =
52
+ res["backtrace"].map {|m, line, fn| "#{m}:#{line} #{fn}"}.join('\n')
53
+ res
54
+ end
55
+ end
56
+
57
+ def export_content(format, title, params={})
58
+ data = run_eval(params)
59
+
60
+ # hacky: shouldn't have error parsing logic here
61
+ format = "json" if data.is_a?(Hash) && (data[:error] || data["error"])
62
+
63
+ # hack for testing -- txt -> csv
64
+ exp_format = format == "txt" ? "csv" : format
65
+
66
+ res, type, disposition, filename =
67
+ Marty::ContentHandler.export(data, exp_format, title)
68
+
69
+ # hack for testing -- set content-type
70
+ type = "text/plain" if format == "txt" && type =~ /csv/
71
+
72
+ [res, type, disposition, filename]
73
+ end
74
+
75
+ endpoint :netzke_submit do |params, this|
76
+ # We get here when user is asking for a background report
77
+
78
+ engine, d_params = _get_report_engine(params)
79
+
80
+ roles = engine.
81
+ evaluate(session[:selected_node], "roles", {}) rescue nil
82
+
83
+ if roles && !roles.any?{ |r| Marty::User.has_role(r) }
84
+ this.netzke_feedback "Insufficient permissions to run report!"
85
+ return
86
+ end
87
+
88
+ d_params["p_title"] ||= engine.
89
+ evaluate(session[:selected_node], "title", {}).to_s
90
+
91
+ # start background promise to get report result
92
+ engine.background_eval(session[:selected_node],
93
+ d_params,
94
+ ["result", "title", "format"],
95
+ )
96
+
97
+ this.netzke_feedback "Report can be accessed from the Jobs Dashboard ..."
98
+ end
99
+
100
+ ######################################################################
101
+
102
+ js_configure do |c|
103
+ # FIXME: can replace HTTP GET with a POST this would solve the
104
+ # data.length issue:
105
+ # http://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit
106
+ c.on_generate = <<-JS
107
+ function() {
108
+ var values = this.getForm().getValues();
109
+ var data = escape(Ext.encode(values));
110
+ if (data.length > 4096) {
111
+ msg = "There is too much data to run as a foreground report." +\
112
+ "<br/>Please run as a background report."
113
+ Ext.create('Ext.Window', {
114
+ height: 100,
115
+ minWidth: 350,
116
+ autoWidth: true,
117
+ modal: true,
118
+ autoScroll: true,
119
+ html: msg,
120
+ title: "Warning"
121
+ }).show();
122
+ } else {
123
+ // FIXME: this is very hacky since it bypasses Netzke channel.
124
+ // This is a security hole wrt to the report role mechanism.
125
+ window.location = "#{Marty::Util.marty_path}/components" +\
126
+ "/#{self.name}." + this.repformat +\
127
+ "?data=" + data + "&reptitle=" + this.reptitle;
128
+ }
129
+ }
130
+ JS
131
+ end
132
+
133
+ endpoint :netzke_load do |params, this|
134
+ end
135
+
136
+ def eval_form_items(engine, items)
137
+ case items
138
+ when Array
139
+ items.map {|x| eval_form_items(engine, x)}
140
+ when Hash
141
+ items.each_with_object({}) { |(key, value), result|
142
+ result[key] = eval_form_items(engine, value)
143
+ }
144
+ when String
145
+ items.starts_with?(':') ? items[1..-1].to_sym : items
146
+ when Class
147
+ raise "bad value in form #{items}" unless
148
+ items < Delorean::BaseModule::BaseClass
149
+
150
+ attrs = engine.enumerate_attrs_by_node(items)
151
+
152
+ engine.eval_to_hash(items, attrs, {})
153
+ when Numeric, TrueClass, FalseClass
154
+ items
155
+ else
156
+ raise "bad value in form #{items}"
157
+ end
158
+ end
159
+
160
+ def configure(c)
161
+ super
162
+
163
+ unless root_sess[:selected_script_name] && root_sess[:selected_node]
164
+ c.title = "No Report selected."
165
+ return
166
+ end
167
+
168
+ begin
169
+ sset = Marty::ScriptSet.new(root_sess[:selected_tag_id])
170
+ engine = sset.get_engine(root_sess[:selected_script_name])
171
+
172
+ raise engine.to_s if engine.is_a?(Hash)
173
+
174
+ items, title, format = engine.
175
+ evaluate_attrs(root_sess[:selected_node],
176
+ ["form", "title", "format"],
177
+ {},
178
+ )
179
+
180
+ raise "bad form items" unless items.is_a?(Array)
181
+ raise "bad format" unless
182
+ ["csv", "xlsx", "zip", "json"].member?(format)
183
+ rescue => exc
184
+ c.title = "ERROR"
185
+ c.items =
186
+ [
187
+ {
188
+ field_label: 'Exception',
189
+ xtype: :displayfield,
190
+ name: 'displayfield1',
191
+ value: "<span style=\"color:red;\">#{exc}</span>"
192
+ },
193
+ ]
194
+ return
195
+ end
196
+
197
+ items = Marty::Xl.symbolize_keys(eval_form_items(engine, items), ':')
198
+
199
+ items = [{html: "<br><b>No input is needed for this report.</b>"}] if
200
+ items.empty?
201
+
202
+ # Hacky: store these globally in session so we can get them on
203
+ # report generation request which comes out of band. Also, if the
204
+ # user's script/tag selection changes, we don't need to redraw
205
+ # report_form.
206
+ session[:selected_tag_id] = root_sess[:selected_tag_id]
207
+ session[:selected_script_name] = root_sess[:selected_script_name]
208
+ session[:selected_node] = root_sess[:selected_node]
209
+
210
+ c.items = items
211
+ c.repformat = format
212
+ c.title = "Generate: #{title}-#{sset.tag.name}"
213
+ c.reptitle = title
214
+ end
215
+ end
216
+
217
+ ReportForm = Marty::ReportForm