marty 0.5.12

Sign up to get free protection for your applications and to get access to all the features.
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,121 @@
1
+ require 'delorean_lang'
2
+
3
+ class Delorean::BaseModule::NodeCall
4
+ def initialize(_e, engine, node, params)
5
+ super
6
+
7
+ # If call has a promise_id (i.e. is from a promise) then that's
8
+ # our parent. Otherwise, we use its parent as our parent.
9
+ params[:_parent_id] = _e[:_promise_id] || _e[:_parent_id]
10
+ params[:_user_id] = _e[:_user_id] || Mcfly.whodunnit.try(:id)
11
+ end
12
+
13
+ # Monkey-patch '|' method for Delorean NodeCall to create promise
14
+ # jobs and return promise proxy objects.
15
+ def |(args)
16
+ if args.is_a?(String)
17
+ attr = args
18
+ args = [attr]
19
+ else
20
+ raise "bad arg to %" unless args.is_a?(Array)
21
+ attr = nil
22
+ end
23
+
24
+ script, tag = engine.module_name, engine.sset.tag
25
+ nn = node.is_a?(Class) ? node.name : node.to_s
26
+
27
+ begin
28
+ # make sure params is serialzable before starting a Job
29
+ Marshal.dump(params)
30
+ rescue => exc
31
+ raise "non-serializable parameters"
32
+ end
33
+
34
+ title = params["p_title"] || "#{script}::#{nn.demodulize}"
35
+ timeout = params["p_timeout"] || Marty::Promise::DEFAULT_PROMISE_TIMEOUT
36
+ hook = params["p_hook"]
37
+ promise = Marty::Promise.
38
+ create(title: title,
39
+ user_id: params[:_user_id],
40
+ parent_id: params[:_parent_id],
41
+ )
42
+ params[:_promise_id] = promise.id
43
+
44
+ begin
45
+ job = Delayed::Job.enqueue Marty::PromiseJob.
46
+ new(promise, title, script, tag, nn, params, args, hook)
47
+ rescue => exc
48
+ # log "CALLERR #{exc}"
49
+ res = Delorean::Engine.grok_runtime_exception(exc)
50
+ promise.set_start
51
+ promise.set_result(res)
52
+ # log "CALLERRSET #{res}"
53
+ raise
54
+ end
55
+
56
+ # keep a reference to the job. This is needed in case we want to
57
+ # work off a promise job that we're waiting for and which hasn't
58
+ # been reserved yet.
59
+ promise.job_id = job.id
60
+ promise.save!
61
+
62
+ Marty::PromiseProxy.new(promise.id, timeout, attr)
63
+ end
64
+ end
65
+
66
+ class Delorean::Engine
67
+ def background_eval(node, params, attrs)
68
+ nc = Delorean::BaseModule::NodeCall.new({}, self, node, params)
69
+ # start the background promise
70
+ nc | attrs
71
+ end
72
+ end
73
+
74
+ class Marty::PromiseJob < Struct.new(:promise,
75
+ :title,
76
+ :sname,
77
+ :tag,
78
+ :node,
79
+ :params,
80
+ :attrs,
81
+ :hook,
82
+ )
83
+ # def log(msg)
84
+ # open('/tmp/dj.out', 'a') { |f| f.puts msg }
85
+ # end
86
+
87
+ def perform
88
+ # log "PERF #{Process.pid} #{title}"
89
+
90
+ promise.set_start
91
+
92
+ begin
93
+ # in case the job writes to the the database
94
+ Mcfly.whodunnit = promise.user
95
+
96
+ engine = Marty::ScriptSet.new(tag).get_engine(sname)
97
+
98
+ engine.evaluate_attrs(node, attrs, params)
99
+
100
+ res = attrs.each_with_object({}) { |attr, h|
101
+ h[attr] = engine.evaluate(node, attr, params)
102
+ }
103
+
104
+ # log "DONE #{Process.pid} #{promise.id} #{Time.now.to_f} #{res}"
105
+ rescue => exc
106
+ res = Delorean::Engine.grok_runtime_exception(exc)
107
+ # log "ERR- #{Process.pid} #{promise.id} #{Time.now.to_f} #{exc}"
108
+ end
109
+ promise.set_result(res)
110
+
111
+ begin
112
+ hook.run(res) if hook
113
+ rescue => exc
114
+ Marty::Util.logger.error "promise hook failed: #{exc}"
115
+ end
116
+ end
117
+
118
+ def max_attempts
119
+ 1
120
+ end
121
+ end
@@ -0,0 +1,94 @@
1
+ # Promise mechanism shamelessly stolen and modified from
2
+ # https://github.com/bhuga/promising-future/blob/master/lib/promise.rb
3
+
4
+ class Marty::PromiseProxy < BasicObject
5
+ NOT_SET = ::Object.new.freeze
6
+ METH_SET = ::Set[
7
+ :marshal_load,
8
+ :marshal_dump,
9
+ :force,
10
+ :__force__,
11
+ # Added for Rails 4 -- were causing forced eval.
12
+ # This list is very hacky and will depend on how
13
+ # ActiveRecord treats assignment to proxy objs.
14
+ :is_a?,
15
+ :nested_under_indifferent_access,
16
+ ]
17
+
18
+ instance_methods.each {|m| undef_method m unless m =~ /^(__.*|object_id)$/}
19
+
20
+ def initialize(promise_id, timeout, attr=nil)
21
+ marshal_load([promise_id, timeout, attr])
22
+ end
23
+
24
+ def marshal_dump
25
+ [@promise.id, @timeout, @attr]
26
+ end
27
+
28
+ def marshal_load(args)
29
+ promise_id, @timeout, @attr = args
30
+ @promise = ::Marty::Promise.find(promise_id)
31
+ @mutex = ::Mutex.new
32
+ @result = NOT_SET
33
+ end
34
+
35
+ def __promise__
36
+ @promise
37
+ end
38
+
39
+ def is_a?(c)
40
+ # Marty::PromiseProxy == c
41
+ # {}.is_a? c
42
+
43
+ # FIXME: not sure why this has to return false. Otherwise, some
44
+ # spec tests fail.
45
+ false
46
+ end
47
+
48
+ def nested_under_indifferent_access
49
+ false
50
+ end
51
+
52
+ ##
53
+ # Force the evaluation of this promise immediately
54
+ #
55
+ # @return [Object]
56
+ def __force__
57
+ if @result.equal?(NOT_SET)
58
+ @mutex.synchronize do
59
+ if @result.equal?(NOT_SET)
60
+ begin
61
+ @result = @promise.wait_for_result(@timeout)
62
+ @result = @result[@attr] if @attr && !@result["error"]
63
+ rescue ::Exception => exc
64
+ @result = ::Delorean::Engine.grok_runtime_exception(exc)
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ # FIXME: the logic for shape of exceptions from Delorean is spread
71
+ # all over the place.
72
+ @result.is_a?(::Hash) &&
73
+ @result["error"] ? ::Kernel.raise(@result["error"]) : @result
74
+ end
75
+
76
+ alias_method :force, :__force__
77
+
78
+ ##
79
+ # Does this promise support the given method?
80
+ #
81
+ # @param [Symbol]
82
+ # @return [Boolean]
83
+ def respond_to?(method, include_all=false)
84
+ METH_SET.member?(method) || __force__.respond_to?(method, include_all)
85
+ end
86
+
87
+ private
88
+
89
+ def method_missing(method, *args, &block)
90
+ # ::File.open('/tmp/dj.out', 'a') { |f| f.puts "FORCE MISS #{method}" }
91
+
92
+ __force__.__send__(method, *args, &block)
93
+ end
94
+ end
@@ -0,0 +1,69 @@
1
+ # Promise mechanism shamelessly stolen and modified from
2
+ # https://github.com/bhuga/promising-future/blob/master/lib/promise.rb
3
+
4
+ class Marty::PromiseProxy < BasicObject
5
+ NOT_SET = ::Object.new.freeze
6
+ METH_SET = ::Set[:marshal_load, :marshal_dump, :force, :__force__]
7
+
8
+ instance_methods.each {|m| undef_method m unless m =~ /^(__.*|object_id)$/}
9
+
10
+ def initialize(promise_id, timeout, attr=nil)
11
+ marshal_load([promise_id, timeout, attr])
12
+ end
13
+
14
+ def marshal_dump
15
+ [@promise.id, @timeout, @attr]
16
+ end
17
+
18
+ def marshal_load(args)
19
+ promise_id, @timeout, @attr = args
20
+ @promise = ::Marty::Promise.find(promise_id)
21
+ @mutex = ::Mutex.new
22
+ @result = NOT_SET
23
+ end
24
+
25
+ def __promise_id__
26
+ @promise.id
27
+ end
28
+
29
+ ##
30
+ # Force the evaluation of this promise immediately
31
+ #
32
+ # @return [Object]
33
+ def __force__
34
+ if @result.equal?(NOT_SET)
35
+ @mutex.synchronize do
36
+ if @result.equal?(NOT_SET)
37
+ begin
38
+ @result = @promise.wait_for_result(@timeout)
39
+ @result = @result[@attr] if @attr && !@result["error"]
40
+ rescue ::Exception => exc
41
+ @result = ::Delorean::Engine.grok_runtime_exception(exc)
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ # FIXME: the logic for shape of exceptions from Delorean is spread
48
+ # all over the place.
49
+ @result.is_a?(::Hash) &&
50
+ @result["error"] ? ::Kernel.raise(@result["error"]) : @result
51
+ end
52
+
53
+ alias_method :force, :__force__
54
+
55
+ ##
56
+ # Does this promise support the given method?
57
+ #
58
+ # @param [Symbol]
59
+ # @return [Boolean]
60
+ def respond_to?(method, include_all=false)
61
+ METH_SET.member?(method) || __force__.respond_to?(method, include_all)
62
+ end
63
+
64
+ private
65
+
66
+ def method_missing(method, *args, &block)
67
+ __force__.__send__(method, *args, &block)
68
+ end
69
+ end
@@ -0,0 +1,5 @@
1
+ module Marty
2
+ class Railtie < Rails::Railtie
3
+ config.marty = ActiveSupport::OrderedOptions.new
4
+ end
5
+ end
@@ -0,0 +1,39 @@
1
+ require 'mcfly'
2
+
3
+ class Marty::Relation
4
+ # Given a Mcfly class (klass) and a list of classes which can
5
+ # reference klass, returns instaces of klass which have no references.
6
+ def self.not_referenced(klass, ref_classes)
7
+ col = (klass.name.split('::').last.snakecase + "_id").to_sym
8
+
9
+ ids = klass.where(obsoleted_dt: 'infinity').pluck(:group_id)
10
+
11
+ ref_ids = ref_classes.map { |rclass|
12
+ rclass.where(obsoleted_dt: 'infinity', col => ids).pluck(col)
13
+ }.flatten.uniq
14
+
15
+ klass.where(id: ids - ref_ids).to_a
16
+ end
17
+
18
+ # Find Mcfly references from klass instances which have been
19
+ # obsoleted. A hash is returned with a key for each
20
+ # mcfly_belongs_to reference from klass.
21
+ def self.obsoleted_references(klass)
22
+ assoc_h = Marty::DataConversion.associations(klass)
23
+ assoc_h.each_with_object({}) do
24
+ |(a, ah), h|
25
+ assoc_class = ah[:assoc_class]
26
+ foreign_key = ah[:foreign_key]
27
+
28
+ next unless Mcfly.has_mcfly? assoc_class
29
+
30
+ h[a] = klass.where(obsoleted_dt: 'infinity').map do
31
+ |obj|
32
+ ref_key = obj.send(foreign_key)
33
+ next unless ref_key
34
+ ref = assoc_class.find(ref_key)
35
+ obj unless Mcfly.is_infinity(ref.obsoleted_dt)
36
+ end.compact
37
+ end
38
+ end
39
+ end
data/lib/marty/util.rb ADDED
@@ -0,0 +1,110 @@
1
+ module Marty::Util
2
+ def self.set_posting_id(sid)
3
+ snap = Marty::Posting.find_by_id(sid)
4
+ sid = nil if snap && (snap.created_dt == Float::INFINITY)
5
+ Netzke::Base.session[:posting] = sid
6
+ end
7
+
8
+ def self.get_posting
9
+ sid = Netzke::Base.session && Netzke::Base.session[:posting]
10
+ return unless sid.is_a? Fixnum
11
+ sid && Marty::Posting.find_by_id(sid)
12
+ end
13
+
14
+ def self.get_posting_time
15
+ snap = self.get_posting
16
+ snap ? snap.created_dt : Float::INFINITY
17
+ end
18
+
19
+ def self.warped?
20
+ self.get_posting_time != Float::INFINITY
21
+ end
22
+
23
+ def self.logger
24
+ @@s_logger ||= Rails.logger || Logger.new($stderr)
25
+ end
26
+
27
+ # route path to where Marty is mounted
28
+ def self.marty_path
29
+ Rails.application.routes.named_routes[:marty].path.spec
30
+ end
31
+
32
+ def self.pg_range_match(r)
33
+ /\A(?<open>\[|\()(?<start>.*?),(?<end>.*?)(?<close>\]|\))\z/.match(r)
34
+ end
35
+
36
+ def self.pg_range_to_human(r)
37
+ return r if r == "empty" || r.nil?
38
+
39
+ m = pg_range_match(r)
40
+
41
+ raise "bad PG range #{r}" unless m
42
+
43
+ if m[:start] == ""
44
+ res = ""
45
+ else
46
+ op = m[:open] == "(" ? ">" : ">="
47
+ res = "#{op}#{m[:start]}"
48
+ end
49
+
50
+ if m[:end] != ""
51
+ op = m[:close] == ")" ? "<" : "<="
52
+ res += "#{op}#{m[:end]}"
53
+ end
54
+
55
+ res
56
+ end
57
+
58
+ def self.human_to_pg_range(r)
59
+ return r if r == "empty"
60
+
61
+ m = /\A
62
+ ((?<op0>\>|\>=)(?<start>[^\<\>\=]*?))?
63
+ ((?<op1>\<|\<=)(?<end>[^\<\>\=]*?))?
64
+ \z/x.match(r)
65
+
66
+ raise "bad range #{r}" unless m
67
+
68
+ if m[:op0]
69
+ open = m[:op0] == ">" ? "(" : "["
70
+ start = "#{open}#{m[:start]}"
71
+ else
72
+ start = "["
73
+ end
74
+
75
+ if m[:op1]
76
+ close = m[:op1] == "<" ? ")" : "]"
77
+ ends = "#{m[:end]}#{close}"
78
+ else
79
+ ends = "]"
80
+ end
81
+
82
+ "#{start},#{ends}"
83
+ end
84
+
85
+ def self.db_in_recovery?
86
+ status = false
87
+ begin
88
+ sql = 'select pg_is_in_recovery();'
89
+ result = ActiveRecord::Base.connection.execute(sql)
90
+ status = result[0]['pg_is_in_recovery'] == 't' if result && result[0]
91
+ rescue => e
92
+ Marty::Util.logger.error 'unable to determine recovery status'
93
+ end
94
+ status
95
+ end
96
+
97
+ def self.deep_round(obj, digits)
98
+ case obj
99
+ when Array
100
+ obj.map {|o| deep_round(o, digits)}
101
+ when Hash
102
+ obj.inject({}) { |result, (key, value)|
103
+ result[key] = deep_round(value, digits)
104
+ result
105
+ }
106
+ else
107
+ obj.is_a?(Float)? obj.round(digits) : obj
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,80 @@
1
+ module Marty::Util
2
+ def self.set_posting_id(sid)
3
+ snap = Marty::Posting.find_by_id(sid)
4
+ sid = nil if snap && (snap.created_dt == Float::INFINITY)
5
+ Netzke::Base.session[:posting] = sid
6
+ end
7
+
8
+ def self.get_posting
9
+ sid = Netzke::Base.session && Netzke::Base.session[:posting]
10
+ return unless sid.is_a? Fixnum
11
+ sid && Marty::Posting.find_by_id(sid)
12
+ end
13
+
14
+ def self.get_posting_time
15
+ snap = self.get_posting
16
+ snap ? snap.created_dt : Float::INFINITY
17
+ end
18
+
19
+ def self.warped?
20
+ self.get_posting_time != Float::INFINITY
21
+ end
22
+
23
+ def self.logger
24
+ @@s_logger ||= Rails.logger || Logger.new($stderr)
25
+ end
26
+
27
+ # route path to where Marty is mounted
28
+ def self.marty_path
29
+ Rails.application.routes.named_routes[:marty].path.spec
30
+ end
31
+
32
+ def self.pg_range_to_human(r)
33
+ return r if r == "empty" || r.nil?
34
+
35
+ m = /\A(?<open>\[|\()(?<start>.*?),(?<end>.*?)(?<close>\]|\))\z/.match(r)
36
+
37
+ raise "bad PG range #{r}" unless m
38
+
39
+ if m[:start] == ""
40
+ res = ""
41
+ else
42
+ op = m[:open] == "(" ? ">" : ">="
43
+ res = "#{op}#{m[:start]}"
44
+ end
45
+
46
+ if m[:end] != ""
47
+ op = m[:close] == ")" ? "<" : "<="
48
+ res += "#{op}#{m[:end]}"
49
+ end
50
+
51
+ res
52
+ end
53
+
54
+ def self.human_to_pg_range(r)
55
+ return r if r == "empty"
56
+
57
+ m = /\A
58
+ ((?<op0>\>|\>=)(?<start>[^\<\>\=]*?))?
59
+ ((?<op1>\<|\<=)(?<end>[^\<\>\=]*?))?
60
+ \z/x.match(r)
61
+
62
+ raise "bad range #{r}" unless m
63
+
64
+ if m[:op0]
65
+ open = m[:op0] == ">" ? "(" : "["
66
+ start = "#{open}#{m[:start]}"
67
+ else
68
+ start = "["
69
+ end
70
+
71
+ if m[:op1]
72
+ close = m[:op1] == "<" ? ")" : "]"
73
+ ends = "#{m[:end]}#{close}"
74
+ else
75
+ ends = "]"
76
+ end
77
+
78
+ "#{start},#{ends}"
79
+ end
80
+ end