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,160 @@
1
+ # Various monkey patches go here
2
+
3
+ ######################################################################
4
+
5
+ require 'delorean_lang'
6
+
7
+ # Very hacky to overwrite delorean's whitelist. But, there's no
8
+ # better way now.
9
+
10
+ Delorean::RUBY_WHITELIST.
11
+ merge!({
12
+ })
13
+
14
+ ######################################################################
15
+
16
+ # Be able to access Enums from Delorean
17
+ class Delorean::BaseModule::BaseClass
18
+ class << self
19
+ alias_method :old_get_attr, :_get_attr
20
+
21
+ def _get_attr(obj, attr, _e)
22
+ Marty::Enum === obj ? obj[attr] : old_get_attr(obj, attr, _e)
23
+ end
24
+ end
25
+ end
26
+
27
+ ######################################################################
28
+ # FIXME: not sure why the following is needed. Otherwise, the monkey
29
+ # patch doesn't work.
30
+ ActiveSupport::JSON.encode([Date.today])
31
+
32
+ class Date
33
+ # Very Hacky: The date JSON encoding format doesn't include TZ info.
34
+ # Therefore, the ExtJS client interprets it as GMT. This causes
35
+ # dates to be displayed as previous day on Pacific TZ clients. So,
36
+ # we just tack on 12:00 time to force the client to use the correct
37
+ # date (at least in the US).
38
+ def as_json(options = nil)
39
+ strftime("%Y-%m-%dT12:00:00-00:00")
40
+ end
41
+ end
42
+
43
+ ######################################################################
44
+
45
+ class Hash
46
+ # define addition on hashes -- useful in Delorean code.
47
+ def +(x)
48
+ self.merge(x)
49
+ end
50
+
51
+ # define hash slice (similar to node slice in Delorean)
52
+ def %(x)
53
+ x.each_with_object({}) { |k, h|
54
+ h[k] = self[k]
55
+ }
56
+ end
57
+ end
58
+
59
+ ######################################################################
60
+
61
+ require 'netzke-basepack'
62
+
63
+ class Netzke::Base
64
+ # get root component session
65
+ def root_sess(component=nil)
66
+ component ||= self
67
+ component.parent ? root_sess(component.parent) : component.component_session
68
+ end
69
+ end
70
+
71
+ ######################################################################
72
+
73
+ # The following is a hack to get around postgres_ext's broken handling
74
+ # of PostgreSQL ranges. Essentially, postgres_ext doesn't allow
75
+ # numranges to exlude the range start e.g. anything like: "(1.1,2.2]".
76
+ # This hack turns off the casting of PostgreSQL ranges to ruby
77
+ # ranges. i.e. we keep them as strings. Note that this hack would be
78
+ # quite different for Rails 4.0.
79
+
80
+ require 'active_record/connection_adapters/postgresql_adapter'
81
+
82
+
83
+ [:numrange,:int4range,:int8range,:daterange,:tsrange,:tstzrange].each {|t|
84
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID.
85
+ alias_type t.to_s, 'text'
86
+ }
87
+
88
+ # The following is a hack to work around a bug in Rails4 array
89
+ # handling which doesn't currently support multidimensional arrays.
90
+ module ActiveRecord::ConnectionAdapters::PostgreSQLColumn::Cast
91
+ def string_to_array(string, oid)
92
+ type_cast_array parse_pg_array(string), oid
93
+ end
94
+
95
+ private
96
+ def type_cast_array(value, oid)
97
+ Array === value ?
98
+ value.map {|val| type_cast_array val, oid} : oid.type_cast(value)
99
+ end
100
+ end
101
+
102
+ ######################################################################
103
+
104
+ def pg_range_to_human(r)
105
+ m = /\A(?<open>\[|\()(?<start>.*?),(?<end>.*?)(?<close>\]|\))\z/.match(r)
106
+
107
+ raise "bad pg range #{r}" unless m
108
+
109
+ if m[:start] == ""
110
+ res = ""
111
+ else
112
+ op = m[:open] == "(" ? ">" : ">="
113
+ res = "#{op}#{m[:start]}"
114
+ end
115
+
116
+ if m[:end] != ""
117
+ op = m[:close] == ")" ? "<" : "<="
118
+ res += "#{op}#{m[:end]}"
119
+ end
120
+
121
+ res
122
+ end
123
+
124
+ def human_to_pg_range(r)
125
+ m = /\A
126
+ ((?<op0>\>|\>=)(?<start>[^\<\>\=]*?))?
127
+ ((?<op1>\<|\<=)(?<end>[^\<\>\=]*?))?
128
+ \z/x.match(r)
129
+
130
+ raise "bad range '#{r}'" unless m
131
+
132
+ if m[:op0]
133
+ open = m[:op0] == ">" ? "(" : "["
134
+ start = "#{open}#{m[:start]}"
135
+ else
136
+ start = "["
137
+ end
138
+
139
+ if m[:op1]
140
+ close = m[:op1] == "<" ? ")" : "]"
141
+ ends = "#{m[:end]}#{close}"
142
+ else
143
+ ends = "]"
144
+ end
145
+
146
+ "#{start},#{ends}"
147
+ end
148
+
149
+ ######################################################################
150
+
151
+ # Rails 4 doesn't handle 'infinity' datetime correctly properly due to
152
+ # in_time_zone conversion. Ergo this hack.
153
+
154
+ class String
155
+ alias_method :old_in_time_zone, :in_time_zone
156
+
157
+ def in_time_zone(zone = ::Time.zone)
158
+ self == 'infinity' ? self : old_in_time_zone(zone)
159
+ end
160
+ end
@@ -0,0 +1,64 @@
1
+ module Marty
2
+ module Permissions
3
+ # Make sure there are admin and user_manager roles,
4
+ # even if hosting app doesn't define them
5
+ REQ_ROLES = [:admin, :user_manager]
6
+ ALL_ROLES = Rails.configuration.marty.roles.to_set.merge(REQ_ROLES)
7
+
8
+ # Call using following format
9
+ # has_marty_permissions create: [:dev, :admin],
10
+ # read: :any,
11
+ # update: :admin,
12
+ # delete: []
13
+ #
14
+ # :any gives permission to the action if user belongs to at least 1 role
15
+ def has_marty_permissions(attrs)
16
+ raise "bad attrs" unless attrs.is_a?(Hash)
17
+ raise "unknown role" unless
18
+ attrs.values.flatten.to_set.subset? (ALL_ROLES << :any)
19
+
20
+ self.define_singleton_method(:marty_permissions) { attrs }
21
+ end
22
+
23
+ def current_user_roles
24
+ roles = Mcfly.whodunnit.roles rescue []
25
+ roles.map {|r| r.name.to_sym}.to_set
26
+ end
27
+
28
+ def can_perform_action?(action)
29
+ return false unless self.respond_to?(:marty_permissions)
30
+
31
+ roles = self.current_user_roles
32
+ roles = roles << :any if self.has_any_perm?
33
+
34
+ aroles = self.marty_permissions[action.to_sym] || []
35
+ # TODO: Use code below when switching to Ruby 2.1
36
+ # Set[ *aroles].intersect? roles.to_set
37
+ (Set[ *aroles] & roles.to_set).length > 0
38
+ end
39
+
40
+ def can_perform_actions
41
+ return [] unless self.respond_to?(:marty_permissions)
42
+
43
+ roles = self.current_user_roles
44
+ roles = roles << :any if self.has_any_perm?
45
+
46
+ self.marty_permissions.map { |action, aroles|
47
+ # TODO: Use code below when switching to Ruby 2.1
48
+ #action if Set[ *aroles].intersect? roles.to_set
49
+ action if (Set[ *aroles] & roles.to_set).length > 0
50
+ }.compact
51
+ end
52
+
53
+ # generate has_xxx_perm? methods for all permissions.
54
+ Rails.configuration.marty.roles.each { |role|
55
+ define_method("has_#{role}_perm?") do
56
+ current_user_roles.member? role
57
+ end
58
+ }
59
+
60
+ def has_any_perm?
61
+ !(current_user_roles & ALL_ROLES).empty?
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,69 @@
1
+ module Marty
2
+ module Permissions
3
+ # Make sure there are admin and user_manager roles,
4
+ # even if hosting app doesn't define them
5
+ REQ_ROLES = [:admin, :user_manager]
6
+ ALL_ROLES = (Set.new Rails.configuration.marty.roles.clone).merge(REQ_ROLES)
7
+ ACTIONS = Set.new [:create, :read, :update, :delete] # CRUD
8
+
9
+ # Call using following format
10
+ # has_marty_permissions create: [:dev, :admin],
11
+ # read: :any,
12
+ # update: :admin,
13
+ # delete: :none
14
+ #
15
+ # Allowed actions are only :create, :read, :update, :delete
16
+ # Roles can be passed in as a symbol or array of symbols
17
+ #
18
+ # :any gives permission to the action if user belongs to at least 1 role
19
+ # :none overrides any other roles
20
+ # e.g. delete: [:none, :admin] would return false when calling
21
+ # can_allow_action? even if the user belong to the admin role
22
+ def has_marty_permissions(attrs)
23
+ raise "bad attrs" unless attrs.is_a?(Hash)
24
+ raise "unknown action - only create/read/update/delete allowed" unless
25
+ attrs.keys.to_set.subset? ACTIONS
26
+ raise "unknown role" unless
27
+ attrs.values.flatten.to_set.subset? (ALL_ROLES << :any << :none)
28
+
29
+ #klass = self.to_s
30
+ #return "#{klass} with #{attrs.inspect}"
31
+ self.define_singleton_method(:marty_permissions) { attrs }
32
+ end
33
+
34
+ def current_user_roles
35
+ roles = Mcfly.whodunnit.roles rescue []
36
+ Set.new(roles.map {|r| r.name.to_sym})
37
+ end
38
+
39
+ def can_perform_action?(action)
40
+ roles = self.current_user_roles
41
+ roles << :any if self.has_any_perm?
42
+
43
+ allow = false
44
+
45
+ if self.respond_to?(:marty_permissions)
46
+ perms = self.marty_permissions
47
+ result = []
48
+ result = (result << perms.fetch(action.to_sym)).flatten if
49
+ perms.include?(action.to_sym)
50
+
51
+ result.each {|r| allow ||= roles.include? r} unless
52
+ result.include?(:none)
53
+ #puts "#{self.to_s} #{action} - #{allow}"
54
+ end
55
+ allow
56
+ end
57
+
58
+ # generate has_xxx_perm? methods for all permissions.
59
+ Rails.configuration.marty.roles.each { |role|
60
+ define_method("has_#{role}_perm?") do
61
+ current_user_roles.member? role
62
+ end
63
+ }
64
+
65
+ def has_any_perm?
66
+ !(current_user_roles & ALL_ROLES).empty?
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,41 @@
1
+ class Marty::Promise < Struct.new(:arg1)
2
+ def log(msg)
3
+ open('/tmp/dj.out', 'a') { |f|
4
+ f.puts msg
5
+ }
6
+ end
7
+
8
+ def perform
9
+ log "hello there #{Process.pid} #{arg1}"
10
+
11
+ raise "oops #{Process.pid}" if arg1 == 5
12
+
13
+ sleep 0.2
14
+ end
15
+
16
+ def error(job, exc)
17
+ log "Error #{Process.pid} #{job} #{exc}"
18
+ end
19
+
20
+ def failure(job)
21
+ log "failure #{Process.pid}, #{job}"
22
+ end
23
+
24
+ def before(job)
25
+ log "before #{Process.pid}, #{job}"
26
+ end
27
+
28
+ def after(job)
29
+ log "after #{Process.pid}, #{job}"
30
+ end
31
+
32
+ def success(job)
33
+ log "success #{Process.pid}, #{job}"
34
+ end
35
+
36
+ def max_attempts
37
+ return 1
38
+ end
39
+ end
40
+
41
+
@@ -0,0 +1,123 @@
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
+ raise "background_eval bad params" unless params.is_a?(Hash)
69
+
70
+ nc = Delorean::BaseModule::NodeCall.new({}, self, node, params)
71
+ # start the background promise
72
+ nc | attrs
73
+ end
74
+ end
75
+
76
+ class Marty::PromiseJob < Struct.new(:promise,
77
+ :title,
78
+ :sname,
79
+ :tag,
80
+ :node,
81
+ :params,
82
+ :attrs,
83
+ :hook,
84
+ )
85
+ # def log(msg)
86
+ # open('/tmp/dj.out', 'a') { |f| f.puts msg }
87
+ # end
88
+
89
+ def perform
90
+ # log "PERF #{Process.pid} #{title}"
91
+
92
+ promise.set_start
93
+
94
+ begin
95
+ # in case the job writes to the the database
96
+ Mcfly.whodunnit = promise.user
97
+
98
+ engine = Marty::ScriptSet.new(tag).get_engine(sname)
99
+
100
+ engine.evaluate_attrs(node, attrs, params)
101
+
102
+ res = attrs.each_with_object({}) { |attr, h|
103
+ h[attr] = engine.evaluate(node, attr, params)
104
+ }
105
+
106
+ # log "DONE #{Process.pid} #{promise.id} #{Time.now.to_f} #{res}"
107
+ rescue => exc
108
+ res = Delorean::Engine.grok_runtime_exception(exc)
109
+ # log "ERR- #{Process.pid} #{promise.id} #{Time.now.to_f} #{exc}"
110
+ end
111
+ promise.set_result(res)
112
+
113
+ begin
114
+ hook.run(res) if hook
115
+ rescue => exc
116
+ Marty::Util.logger.error "promise hook failed: #{exc}"
117
+ end
118
+ end
119
+
120
+ def max_attempts
121
+ 1
122
+ end
123
+ end