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,196 @@
1
+ class Marty::Promise < Marty::Base
2
+ class MarshalResult
3
+ def dump(v)
4
+ Marshal.dump(v)
5
+ end
6
+
7
+ def load(v)
8
+ # FIXME: Rails4 bytea interface seems to remove the trailing
9
+ # \x00 char.
10
+ v += "\x00" if v
11
+
12
+ # Marshal.load can't handle nil
13
+ v.nil? ? {} : Marshal.load(v)
14
+ end
15
+ end
16
+
17
+ # default timeout (seconds) to wait for promise values
18
+ DEFAULT_PROMISE_TIMEOUT = Rails.configuration.marty.promise_timeout || 30
19
+
20
+ # default timeout (seconds) to wait for jobs to start
21
+ DEFAULT_JOB_TIMEOUT = Rails.configuration.marty.job_timeout || 10
22
+
23
+ lazy_load :result
24
+
25
+ serialize :result, MarshalResult.new
26
+
27
+ validates_presence_of :title
28
+
29
+ has_many :children,
30
+ foreign_key: 'parent_id',
31
+ class_name: "Marty::Promise",
32
+ dependent: :destroy
33
+
34
+ belongs_to :parent, class_name: "Marty::Promise"
35
+ belongs_to :user, class_name: "Marty::User"
36
+
37
+ def self.cleanup(all=false)
38
+ begin
39
+ where('start_dt < ? AND parent_id IS NULL',
40
+ DateTime.now - (all ? 0.hours : 2.hours)).destroy_all
41
+ rescue => exc
42
+ Marty::Util.logger.error("promise GC error: #{exc}")
43
+ end
44
+ end
45
+
46
+ def raw_conn
47
+ self.class.connection.raw_connection
48
+ end
49
+
50
+ def pg_notify
51
+ raw_conn.async_exec("NOTIFY promise_#{id}")
52
+ end
53
+
54
+ def set_start
55
+ if self.start_dt || self.result != {}
56
+ Marty::Util.logger.error("promise already started: #{self}")
57
+ return
58
+ end
59
+
60
+ # mark promise as started
61
+ self.start_dt = DateTime.now
62
+ self.save!
63
+ end
64
+
65
+ def set_result(res)
66
+ # log "SETRES #{Process.pid} #{res} #{self}"
67
+
68
+ # promise must have been started and not yet ended
69
+ if !self.start_dt || self.end_dt || self.result != {}
70
+ # log "SETERR #{Process.pid} #{self}"
71
+ Marty::Util.logger.error("unexpected promise state: #{self}")
72
+ return
73
+ end
74
+
75
+ raise "bad result" unless res.is_a?(Hash)
76
+
77
+ self.status = res["error"].nil?
78
+ self.result = res
79
+
80
+ # update title/format from result hash (somewhat hacky)
81
+ self.title = res["title"].to_s if res["title"]
82
+ self.cformat = res["format"].to_s if res["format"]
83
+
84
+ # mark promise as ended
85
+ self.end_dt = DateTime.now
86
+ self.save!
87
+
88
+ # log "NOTIFY #{Process.pid}"
89
+ pg_notify
90
+ end
91
+
92
+ def to_s
93
+ inspect
94
+ end
95
+
96
+ # def log(msg)
97
+ # open('/tmp/dj.out', 'a') { |f| f.puts msg }
98
+ # end
99
+
100
+ def wait_for_my_notify(timeout)
101
+ while true do
102
+ # FIXME: we keep using the same timeout. The timeout should be
103
+ # reduced by total time spent here.
104
+ n = raw_conn.wait_for_notify(timeout)
105
+ return n if !n || n=="promise_#{id}"
106
+ end
107
+ end
108
+
109
+ def latest
110
+ # FIXME: Not sure if this is idiomatic. What's the best way to
111
+ # force AR to reload the promise object? reset+reload doesn't
112
+ # seems to work.
113
+
114
+ # get latest uncached version
115
+ Marty::Promise.uncached {Marty::Promise.find(id)}
116
+ end
117
+
118
+ def work_off_job(job)
119
+ # Create a temporary worker to work off the job
120
+ Delayed::Job.where(id: job.id).
121
+ update_all(locked_at: Delayed::Job.db_time_now, locked_by: "Temp")
122
+ w = Delayed::Worker.new
123
+ w.run(job)
124
+ end
125
+
126
+ def wait_for_result(timeout)
127
+ return self.result if self.result != {}
128
+
129
+ begin
130
+ # start listening on promise's notification
131
+ raw_conn.exec("LISTEN promise_#{id}")
132
+
133
+ last = latest
134
+
135
+ # if job hasn't started yet, wait for it to start
136
+ if !last.start_dt
137
+ # log "AAAA #{Process.pid} #{last}"
138
+
139
+ job = Delayed::Job.find_by_id(last.job_id)
140
+ job.reload if job # paranoid
141
+
142
+ if !job && job.locked_at
143
+ # job has been locked, so it looks like it started already
144
+ # and we need to wait for it.
145
+ wait_for_my_notify(Marty::Promise::DEFAULT_JOB_TIMEOUT)
146
+ else
147
+ # work off the job instead of waiting for a real worker to
148
+ # pick it up.
149
+ # log "OFF0 #{Process.pid} #{last}"
150
+ begin
151
+ work_off_job(job)
152
+ rescue => exc
153
+ # log "OFFERR #{exc}"
154
+ res = Delorean::Engine.grok_runtime_exception(exc)
155
+ last.set_result(res)
156
+ end
157
+ # log "OFF1 #{Process.pid} #{last}"
158
+ end
159
+
160
+ last = latest
161
+
162
+ # we waited for it but it never started. So, mark it with a
163
+ # timeout error.
164
+ if !last.start_dt
165
+ # log "TO11 #{Process.pid} #{last}"
166
+ return {"error" => "promise #{last.id} timed out (never started)"}
167
+ end
168
+ end
169
+
170
+ # reload promise in case out copy doesn't have a result yet
171
+ last = latest unless last.end_dt
172
+
173
+ # at this point, we know the promise has already started
174
+ if !last.end_dt
175
+ wait_for_my_notify(timeout)
176
+ # log "UUUU #{Process.pid} #{id} #{Time.now.to_f}"
177
+ last = latest
178
+
179
+ # log "XXXX #{Process.pid} #{Time.now.to_f} #{last}"
180
+
181
+ if !last.end_dt
182
+ # log "TO22 #{Process.pid} #{last}"
183
+ return {"error" => "promise #{last.id} timed out (didn't end)"}
184
+ end
185
+ end
186
+
187
+ # log "RRRR #{Process.pid} #{last} #{Time.now.to_f}"
188
+
189
+ last.result
190
+ ensure
191
+ # Stop listening to the promise notifications
192
+ raw_conn.exec("UNLISTEN promise_#{id}")
193
+ end
194
+
195
+ end
196
+ end
@@ -0,0 +1,6 @@
1
+ class Marty::Role < Marty::Base
2
+ extend Marty::Enum
3
+
4
+ validates_uniqueness_of :name
5
+ # FIXME: should have before_destroy
6
+ end
@@ -0,0 +1,10 @@
1
+ class Marty::Role < Marty::Base
2
+ extend Marty::Enum
3
+
4
+ <<<<<<< HEAD
5
+ # attr_accessible :name
6
+ =======
7
+ >>>>>>> master
8
+ validates_uniqueness_of :name
9
+ # FIXME: should have before_destroy
10
+ end
@@ -0,0 +1,144 @@
1
+ require 'mcfly'
2
+
3
+ class Marty::Script < Marty::Base
4
+ has_mcfly
5
+
6
+ validates_presence_of :name, :body
7
+ mcfly_validates_uniqueness_of :name
8
+ validates_format_of :name, {
9
+ with: /\A[A-Z][a-zA-Z0-9]*\z/,
10
+ message: I18n.t('script.save_error'),
11
+ }
12
+
13
+ belongs_to :user, class_name: "Marty::User"
14
+
15
+ gen_mcfly_lookup :lookup, {
16
+ name: false,
17
+ }
18
+
19
+ gen_mcfly_lookup :get_all, {}, mode: :all
20
+
21
+ # find script by name/tag
22
+ def self.find_script(sname, tag=nil)
23
+ tag = Marty::Tag.map_to_tag(tag)
24
+ Marty::Script.lookup(tag.created_dt, sname)
25
+ end
26
+
27
+ def find_tag
28
+ # find the first tag created after this script.
29
+ Marty::Tag.where("created_dt >= ?", created_dt).order(:created_dt).first
30
+ end
31
+
32
+ def self.create_script(name, body)
33
+ script = new
34
+ script.name = name
35
+ script.body = body
36
+ script.save
37
+ script
38
+ end
39
+
40
+ def self.load_a_script(sname, body, dt=nil)
41
+ s = Marty::Script.lookup('infinity', sname)
42
+
43
+ if !s
44
+ s = Marty::Script.new
45
+ s.body = body
46
+ s.name = sname
47
+ s.created_dt = dt if dt
48
+ s.save!
49
+ elsif s.body != body
50
+ s.body = body
51
+ s.created_dt = dt if dt
52
+ s.save!
53
+ end
54
+ end
55
+
56
+ def self.load_script_bodies(bodies, dt=nil)
57
+ bodies.each {
58
+ |sname, body|
59
+ load_a_script(sname, body, dt)
60
+ }
61
+
62
+ # Create a new tag if scripts were modified after the last tag
63
+ tag = Marty::Tag.get_latest1
64
+ latest = Marty::Script.order("created_dt DESC").first
65
+
66
+ tag_time = (dt || [latest.try(:created_dt), Time.now].compact.max) +
67
+ 1.second
68
+
69
+ # If no tag_time is provided, the tag created_dt will be the same
70
+ # as the scripts.
71
+ tag = Marty::Tag.do_create(tag_time, "tagged from load scripts") if
72
+ !(tag && latest) || tag.created_dt <= latest.created_dt
73
+
74
+ tag
75
+ end
76
+
77
+ def self.load_scripts(path=nil, dt=nil)
78
+ files = get_script_filenames(path)
79
+
80
+ bodies = read_script_files(files)
81
+
82
+ load_script_bodies(bodies, dt)
83
+ end
84
+
85
+ def self.read_script_files(files)
86
+ files.collect { |fpath|
87
+ fname = File.basename(fpath)[0..-4].camelize
88
+ [fname, File.read(fpath)]
89
+ }
90
+ end
91
+
92
+ def self.get_script_filenames(paths = nil)
93
+ paths = get_script_paths(paths)
94
+
95
+ filenames = {}
96
+ paths.each do |path|
97
+ Dir.glob("#{path}/*.dl").each do |filename|
98
+ basename = File.basename(filename)
99
+ filenames[basename] = filename unless filenames.has_key?(basename)
100
+ end
101
+ end
102
+
103
+ filenames.values
104
+ end
105
+
106
+ def self.get_script_paths(paths)
107
+ if paths
108
+ paths = Array(paths)
109
+ elsif Rails.configuration.marty.delorean_scripts_path
110
+ paths = Rails.configuration.marty.delorean_scripts_path
111
+ else
112
+ paths = ["#{Rails.root}/delorean",
113
+ File.expand_path('../../../../delorean', __FILE__)]
114
+ end
115
+ end
116
+
117
+
118
+ def self.delete_scripts
119
+ ActiveRecord::Base.connection.
120
+ execute("ALTER TABLE marty_scripts DISABLE TRIGGER USER;")
121
+ Marty::Script.delete_all
122
+ ActiveRecord::Base.connection.
123
+ execute("ALTER TABLE marty_scripts ENABLE TRIGGER USER;")
124
+ end
125
+
126
+ delorean_fn :eval_to_hash, sig: 5 do
127
+ |dt, script, node, attrs, params|
128
+ tag = Marty::Tag.find_match(dt)
129
+
130
+ # IMPORTANT: engine evals (e.g. eval_to_hash) modify the
131
+ # params. So, need to clone it.
132
+ params = params.clone
133
+
134
+ raise "no tag found for #{dt}" unless tag
135
+
136
+ engine = Marty::ScriptSet.new(tag).get_engine(script)
137
+ res = engine.eval_to_hash(node, attrs, params)
138
+
139
+ # FIXME: should sanitize res to make sure that no nodes are being
140
+ # passed back. It's likely that nodes which are not from the
141
+ # current tag can caused problems.
142
+ res
143
+ end
144
+ end
@@ -0,0 +1,62 @@
1
+ require 'mcfly'
2
+
3
+ class Marty::Script < Marty::Base
4
+ has_mcfly
5
+
6
+ <<<<<<< HEAD
7
+ # attr_accessible :name, :body
8
+ =======
9
+ >>>>>>> master
10
+ validates_presence_of :name, :body
11
+ mcfly_validates_uniqueness_of :name
12
+ validates_format_of :name, {
13
+ with: /\A[A-Z][a-zA-Z0-9]*\z/,
14
+ message: I18n.t('script.save_error'),
15
+ }
16
+
17
+ belongs_to :user, class_name: "Marty::User"
18
+
19
+ gen_mcfly_lookup :lookup, {
20
+ name: false,
21
+ }
22
+
23
+ gen_mcfly_lookup :get_all, {}, mode: :all
24
+
25
+ # find script by name/tag
26
+ def self.find_script(sname, tag=nil)
27
+ tag = Marty::Tag.map_to_tag(tag)
28
+ Marty::Script.lookup(tag.created_dt, sname)
29
+ end
30
+
31
+ def find_tag
32
+ # find the first tag created after this script.
33
+ Marty::Tag.where("created_dt >= ?", created_dt).order(:created_dt).first
34
+ end
35
+
36
+ def self.create_script(name, body)
37
+ script = new
38
+ script.name = name
39
+ script.body = body
40
+ script.save
41
+ script
42
+ end
43
+
44
+ delorean_fn :eval_to_hash, sig: 5 do
45
+ |dt, script, node, attrs, params|
46
+ tag = Marty::Tag.find_match(dt)
47
+
48
+ # IMPORTANT: engine evals (e.g. eval_to_hash) modify the
49
+ # params. So, need to clone it.
50
+ params = params.clone
51
+
52
+ raise "no tag found for #{dt}" unless tag
53
+
54
+ engine = Marty::ScriptSet.new(tag).get_engine(script)
55
+ res = engine.eval_to_hash(node, attrs, params)
56
+
57
+ # FIXME: should sanitize res to make sure that no nodes are being
58
+ # passed back. It's likely that nodes which are not from the
59
+ # current tag can caused problems.
60
+ res
61
+ end
62
+ end
@@ -0,0 +1,96 @@
1
+ class Marty::Tag < Marty::Base
2
+ has_mcfly append_only: true
3
+
4
+ mcfly_validates_uniqueness_of :name
5
+ validates_presence_of :name, :comment
6
+
7
+ belongs_to :user, class_name: "Marty::User"
8
+
9
+ def self.make_name(dt)
10
+ return 'DEV' if Mcfly.is_infinity(dt)
11
+
12
+ # If no dt is provided (which is the usual non-testing case), we
13
+ # use Time.now.strftime to name the posting. This has the effect
14
+ # of using the host's timezone. i.e. since we're in PST8PDT, names
15
+ # will be based off of the Pacific TZ.
16
+ dt ||= Time.now
17
+ dt.strftime('%Y%m%d-%H%M')
18
+ end
19
+
20
+ before_validation :set_tag_name
21
+ def set_tag_name
22
+ self.name = self.class.make_name(self.created_dt)
23
+ true
24
+ end
25
+
26
+ def self.do_create(dt, comment)
27
+ o = new
28
+ o.comment = comment
29
+ o.created_dt = dt
30
+ o.save!
31
+ o
32
+ end
33
+
34
+ def isdev?
35
+ Mcfly.is_infinity(created_dt)
36
+ end
37
+
38
+ def self.map_to_tag(tag_id)
39
+ case tag_id
40
+ when String
41
+ tag = find_by_name(tag_id)
42
+ # if tag name wasn't found, look for a matching
43
+ # posting, then find the tag whose created_dt <= posting dt.
44
+ if !tag
45
+ posting = Marty::Posting.lookup(tag_id)
46
+ tag = find_match(Mcfly.normalize_infinity(posting.created_dt)) if
47
+ posting
48
+ end
49
+ when Fixnum
50
+ tag = find_by_id(tag_id)
51
+ when nil
52
+ tag = get_latest1
53
+ else
54
+ tag = tag_id
55
+ end
56
+
57
+ raise "bad tag identifier #{tag_id || 'nil'}" unless tag.is_a? Marty::Tag
58
+ tag
59
+ end
60
+
61
+ cached_delorean_fn :lookup, sig: 1 do
62
+ |name|
63
+ self.find_by_name(name)
64
+ end
65
+
66
+ # Performance hack to cache AR object
67
+ cached_delorean_fn :lookup_id, sig: 1 do
68
+ |id|
69
+ find_by_id(id)
70
+ end
71
+
72
+ delorean_fn :lookup_dt, sig: 1 do
73
+ |name|
74
+ lookup(name).try(:created_dt)
75
+ end
76
+
77
+ delorean_fn :get_latest1, sig: 0 do
78
+ where("created_dt <> 'infinity'").order("created_dt DESC").first
79
+ end
80
+
81
+ delorean_fn :find_match, sig: 1 do
82
+ |dt|
83
+ id = select(:id).where("created_dt <= ?", dt).order("created_dt DESC").first.id
84
+
85
+ # performance hack to use cached version
86
+ id && lookup_id(id)
87
+ end
88
+
89
+ # Performance hack for script sets -- FIXME: making find_mtach
90
+ # cached breaks Gemini tests. Need to look into it.
91
+ cached_delorean_fn :cached_find_match, sig: 1 do
92
+ |dt|
93
+
94
+ find_match dt
95
+ end
96
+ end