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,91 @@
1
+ class Marty::Tag < Marty::Base
2
+ has_mcfly append_only: true
3
+
4
+ <<<<<<< HEAD
5
+ # attr_accessible :created_dt, :name, :comment
6
+ =======
7
+ >>>>>>> master
8
+ mcfly_validates_uniqueness_of :name
9
+ validates_presence_of :name, :comment
10
+
11
+ belongs_to :user, class_name: "Marty::User"
12
+
13
+ def self.make_name(dt)
14
+ return 'DEV' if Mcfly.is_infinity(dt)
15
+
16
+ # If no dt is provided (which is the usual non-testing case), we
17
+ # use Time.now.strftime to name the posting. This has the effect
18
+ # of using the host's timezone. i.e. since we're in PST8PDT, names
19
+ # will be based off of the Pacific TZ.
20
+ dt ||= Time.now
21
+ dt.strftime('%Y%m%d-%H%M')
22
+ end
23
+
24
+ before_validation :set_tag_name
25
+ def set_tag_name
26
+ self.name = self.class.make_name(self.created_dt)
27
+ true
28
+ end
29
+
30
+ def self.do_create(dt, comment)
31
+ o = new
32
+ o.comment = comment
33
+ o.created_dt = dt
34
+ o.save!
35
+ o
36
+ end
37
+
38
+ def isdev?
39
+ Mcfly.is_infinity(created_dt)
40
+ end
41
+
42
+ def self.map_to_tag(tag_id)
43
+ case tag_id
44
+ when String
45
+ tag = find_by_name(tag_id)
46
+ # if tag name wasn't found, look for a matching
47
+ # posting, then find the tag whose created_dt <= posting dt.
48
+ if !tag
49
+ posting = Marty::Posting.lookup(tag_id)
50
+ tag = find_match(Mcfly.normalize_infinity(posting.created_dt)) if
51
+ posting
52
+ end
53
+ when Fixnum
54
+ tag = find_by_id(tag_id)
55
+ when nil
56
+ tag = get_latest1
57
+ else
58
+ tag = tag_id
59
+ end
60
+
61
+ raise "bad tag identifier #{tag_id}" unless tag.is_a? Marty::Tag
62
+ tag
63
+ end
64
+
65
+ cached_delorean_fn :lookup, sig: 1 do
66
+ |name|
67
+ self.find_by_name(name)
68
+ end
69
+
70
+ # Performance hack to cache Rule AR object
71
+ cached_delorean_fn :lookup_id, sig: 1 do
72
+ |id|
73
+ find_by_id(id)
74
+ end
75
+
76
+ delorean_fn :lookup_dt, sig: 1 do
77
+ |name|
78
+ lookup(name).try(:created_dt)
79
+ end
80
+
81
+ delorean_fn :get_latest1, sig: 0 do
82
+ where("created_dt <> 'infinity'").order("created_dt DESC").first
83
+ end
84
+
85
+ delorean_fn :find_match, sig: 1 do
86
+ |dt|
87
+ id = where("created_dt <= ?", dt).order("created_dt DESC").pluck(:id).first
88
+ # performance hack
89
+ id && lookup_id(id)
90
+ end
91
+ end
@@ -0,0 +1,30 @@
1
+ class Marty::Token < Marty::Base
2
+ belongs_to :user
3
+ validates_uniqueness_of :value
4
+
5
+ before_create :delete_previous_tokens, :generate_new_token
6
+
7
+ # @@validity_time = 1.day
8
+
9
+ def generate_new_token
10
+ self.value = Token.generate_token_value
11
+ end
12
+
13
+ # # Return true if token has expired
14
+ # def expired?
15
+ # return Time.now > self.created_on + @@validity_time
16
+ # end
17
+
18
+ private
19
+ def self.generate_token_value
20
+ SecureRandom.hex(20)
21
+ end
22
+
23
+ # Removes obsolete tokens
24
+ def delete_previous_tokens
25
+ if user && !Marty::Util.db_in_recovery?
26
+ Token.delete_all(['user_id = ?', user.id])
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,146 @@
1
+ require 'mcfly'
2
+ require 'net/ldap'
3
+
4
+ class Marty::User < Marty::Base
5
+ validates_presence_of :login, :firstname, :lastname
6
+ validates_uniqueness_of :login
7
+
8
+ validates_format_of :login, :with => /\A[a-z0-9_\-@\.]*\z/i
9
+ validates_length_of :login, :firstname, :lastname, maximum: 100
10
+
11
+ has_many :user_roles, dependent: :destroy
12
+ has_many :roles, through: :user_roles
13
+
14
+ scope :active, -> { where("#{self.table_name}.active = ?", true) }
15
+
16
+ validate :verify_changes
17
+ before_destroy :destroy_user
18
+
19
+ def name
20
+ "#{firstname} #{lastname}"
21
+ end
22
+
23
+ def to_s
24
+ name
25
+ end
26
+
27
+ # Returns the user who matches the given autologin +key+ or nil
28
+ def self.try_to_autologin(key)
29
+ tokens = Marty::Token.find_all_by_action_and_value('autologin', key.to_s)
30
+ # Make sure there's only 1 token that matches the key
31
+ if tokens.size == 1
32
+ token = tokens.first
33
+ autologin = Rails.configuration.marty.autologin || 0
34
+
35
+ if (token.created_on > autologin.to_i.day.ago) &&
36
+ token.user && token.user.active?
37
+ token.user
38
+ end
39
+ end
40
+ end
41
+
42
+ # Returns the user that matches provided login and password, or nil
43
+ def self.try_to_login(login, password)
44
+ login = login.to_s
45
+ password = password.to_s
46
+
47
+ # Make sure no one can sign in with an empty password
48
+ return nil if password.empty?
49
+
50
+ user = find_by_login(login)
51
+
52
+ return nil if !user || !user.active?
53
+
54
+ authenticate_with?(login, password) || nil
55
+ end
56
+
57
+ def self.authenticate_with?(login, password)
58
+ cf = Rails.configuration.marty
59
+
60
+ auth_source = cf.auth_source.to_s
61
+
62
+ if auth_source == "local"
63
+ ok = password == cf.local_password
64
+ elsif auth_source == "ldap"
65
+ # IMPORTANT NOTE: if server allows anonymous LDAP access, empty
66
+ # passwords will succeed! i.e. if a valid user with empty
67
+ # password is sent in, ldap.bind will return OK.
68
+ cf = Rails.configuration.marty.ldap
69
+ ldap = Net::LDAP.new(host: cf.host,
70
+ port: cf.port,
71
+ base: cf.base_dn,
72
+ auth: {
73
+ method: :simple,
74
+ username: cf.domain + "\\" + login,
75
+ password: password,
76
+ })
77
+ ok = ldap.bind
78
+ else
79
+ raise "bad auth_source: #{auth_source.inspect}"
80
+ end
81
+
82
+ find_by_login(login) if ok
83
+ end
84
+
85
+ def self.current=(user)
86
+ Mcfly.whodunnit = user
87
+ end
88
+
89
+ def self.current
90
+ Mcfly.whodunnit
91
+ end
92
+
93
+ def self.has_role(role)
94
+ mr = Mcfly.whodunnit.roles rescue []
95
+ mr.any? {|attr| attr.name == role}
96
+ end
97
+
98
+ private
99
+ def verify_changes
100
+ # If current users role is only user_manager, restrict following
101
+ # 1 - Do not allow user to edit own record
102
+ # 2 - Do not allow user to edit the application system record
103
+ if user_manager_only
104
+ system_user = Marty::User.find_by_login(
105
+ Rails.configuration.marty.system_account.to_s)
106
+ system_id = system_user.id if system_user
107
+
108
+ if self.id == Mcfly.whodunnit.id
109
+ roles.each {|r| roles.delete r unless r.name == "user_manager"}
110
+ errors.add :base, "User Managers cannot edit "\
111
+ "or add additional roles to their own accounts"
112
+ elsif self.id == system_id
113
+ errors.add :base,
114
+ "User Managers cannot edit the application system account"
115
+ end
116
+ end
117
+
118
+ errors.add :base, "The application system account cannot be deactivated" if
119
+ self.login == Rails.configuration.marty.system_account.to_s &&
120
+ !self.active
121
+
122
+ errors.blank?
123
+ end
124
+
125
+ delorean_fn :get_roles, sig: 0 do
126
+ Mcfly.whodunnit.roles
127
+ end
128
+
129
+ def user_manager_only
130
+ Marty::User.has_role("user_manager") && !Marty::User.has_role("admin")
131
+ end
132
+
133
+ def destroy_user
134
+ errors.add :base, "You cannot delete your own account" if
135
+ self.login == Mcfly.whodunnit.login
136
+
137
+ errors.add :base, "You cannot delete the system account" if
138
+ self.login == Rails.configuration.marty.system_account.to_s
139
+ # Default to disallowing any deletions for now
140
+
141
+ errors.add :base,
142
+ "Users cannot be deleted - set 'Active' to false to disable the account"
143
+
144
+ errors.blank?
145
+ end
146
+ end
@@ -0,0 +1,148 @@
1
+ require 'mcfly'
2
+ require 'net/ldap'
3
+
4
+ class Marty::User < Marty::Base
5
+ has_paper_trail
6
+
7
+ validates_presence_of :login, :firstname, :lastname
8
+ validates_uniqueness_of :login
9
+
10
+ validates_format_of :login, :with => /\A[a-z0-9_\-@\.]*\z/i
11
+ validates_length_of :login, :firstname, :lastname, maximum: 100
12
+
13
+ has_many :user_roles, dependent: :destroy
14
+ has_many :roles, through: :user_roles
15
+
16
+ scope :active, -> { where("#{self.table_name}.active = ?", true) }
17
+
18
+ validate :verify_changes
19
+ before_destroy :destroy_user
20
+
21
+ def name
22
+ "#{firstname} #{lastname}"
23
+ end
24
+
25
+ def to_s
26
+ name
27
+ end
28
+
29
+ # Returns the user who matches the given autologin +key+ or nil
30
+ def self.try_to_autologin(key)
31
+ tokens = Marty::Token.find_all_by_action_and_value('autologin', key.to_s)
32
+ # Make sure there's only 1 token that matches the key
33
+ if tokens.size == 1
34
+ token = tokens.first
35
+ autologin = Rails.configuration.marty.autologin || 0
36
+
37
+ if (token.created_on > autologin.to_i.day.ago) &&
38
+ token.user && token.user.active?
39
+ token.user
40
+ end
41
+ end
42
+ end
43
+
44
+ # Returns the user that matches provided login and password, or nil
45
+ def self.try_to_login(login, password)
46
+ login = login.to_s
47
+ password = password.to_s
48
+
49
+ # Make sure no one can sign in with an empty password
50
+ return nil if password.empty?
51
+
52
+ user = find_by_login(login)
53
+
54
+ return nil if !user || !user.active?
55
+
56
+ authenticate_with?(login, password) || nil
57
+ end
58
+
59
+ def self.authenticate_with?(login, password)
60
+ cf = Rails.configuration.marty
61
+
62
+ auth_source = cf.auth_source.to_s
63
+
64
+ if auth_source == "local"
65
+ ok = password == cf.local_password
66
+ elsif auth_source == "ldap"
67
+ # IMPORTANT NOTE: if server allows anonymous LDAP access, empty
68
+ # passwords will succeed! i.e. if a valid user with empty
69
+ # password is sent in, ldap.bind will return OK.
70
+ cf = Rails.configuration.marty.ldap
71
+ ldap = Net::LDAP.new(host: cf.host,
72
+ port: cf.port,
73
+ base: cf.base_dn,
74
+ auth: {
75
+ method: :simple,
76
+ username: cf.domain + "\\" + login,
77
+ password: password,
78
+ })
79
+ ok = ldap.bind
80
+ else
81
+ raise "bad auth_source: #{auth_source.inspect}"
82
+ end
83
+
84
+ find_by_login(login) if ok
85
+ end
86
+
87
+ def self.current=(user)
88
+ Mcfly.whodunnit = user
89
+ end
90
+
91
+ def self.current
92
+ Mcfly.whodunnit
93
+ end
94
+
95
+ def self.has_role(role)
96
+ mr = Mcfly.whodunnit.roles rescue []
97
+ mr.any? {|attr| attr.name == role}
98
+ end
99
+
100
+ private
101
+ def verify_changes
102
+ # If current users role is only user_manager, restrict following
103
+ # 1 - Do not allow user to edit own record
104
+ # 2 - Do not allow user to edit the Gemini system record
105
+ if user_manager_only
106
+ gemini_user = Marty::User.find_by_login(
107
+ Rails.configuration.marty.system_account.to_s)
108
+ gemini_id = gemini_user.id if gemini_user
109
+
110
+ if self.id == Mcfly.whodunnit.id
111
+ roles.each {|r| roles.delete r unless r.name == "user_manager"}
112
+ errors.add :base, "User Managers cannot edit "\
113
+ "or add additional roles to their own accounts"
114
+ elsif self.id == gemini_id
115
+ errors.add :base,
116
+ "User Managers cannot edit the Gemini system account"
117
+ end
118
+ end
119
+
120
+ errors.add :base, "The Gemini system account cannot be deactivated" if
121
+ self.login == Rails.configuration.marty.system_account.to_s &&
122
+ !self.active
123
+
124
+ errors.blank?
125
+ end
126
+
127
+ delorean_fn :get_roles, sig: 0 do
128
+ Mcfly.whodunnit.roles
129
+ end
130
+
131
+ def user_manager_only
132
+ Marty::User.has_role("user_manager") && !Marty::User.has_role("admin")
133
+ end
134
+
135
+ def destroy_user
136
+ errors.add :base, "You cannot delete your own account" if
137
+ self.login == Mcfly.whodunnit.login
138
+
139
+ errors.add :base, "You cannot delete the system account" if
140
+ self.login == Rails.configuration.marty.system_account.to_s
141
+ # Default to disallowing any deletions for now
142
+
143
+ errors.add :base,
144
+ "Users cannot be deleted - set 'Active' to false to disable the account"
145
+
146
+ errors.blank?
147
+ end
148
+ end
@@ -0,0 +1,7 @@
1
+ class Marty::UserRole < Marty::Base
2
+ validates_uniqueness_of :user_id, scope: [:role_id]
3
+ validates_presence_of :user_id, :role_id
4
+
5
+ belongs_to :user
6
+ belongs_to :role
7
+ end
@@ -0,0 +1,13 @@
1
+ class Marty::UserRole < Marty::Base
2
+ has_paper_trail
3
+
4
+ <<<<<<< HEAD
5
+ # attr_accessible :user_id, :role_id
6
+ =======
7
+ >>>>>>> master
8
+ validates_uniqueness_of :user_id, scope: [:role_id]
9
+ validates_presence_of :user_id, :role_id
10
+
11
+ belongs_to :user
12
+ belongs_to :role
13
+ end
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
5
+ <title><%= Rails.application.class.parent %></title>
6
+ <%= load_netzke theme: "classic" %>
7
+ <%= csrf_meta_tag %>
8
+ </head>
9
+ <body>
10
+ <%= yield %>
11
+ </body>
12
+ </html>