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,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