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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +84 -0
- data/Rakefile +29 -0
- data/app/assets/javascripts/marty/application.js +15 -0
- data/app/assets/stylesheets/marty/application.css +13 -0
- data/app/components/marty/api_auth_view.rb +32 -0
- data/app/components/marty/auth_app.rb +55 -0
- data/app/components/marty/auth_app.rb~ +51 -0
- data/app/components/marty/auth_app/javascripts/auth_app.js +91 -0
- data/app/components/marty/auth_app/javascripts/auth_app.js~ +91 -0
- data/app/components/marty/cm_form_panel.rb~ +5 -0
- data/app/components/marty/cm_grid_panel.rb~ +35 -0
- data/app/components/marty/data_import_view.rb~ +142 -0
- data/app/components/marty/extras/layout.rb +46 -0
- data/app/components/marty/extras/layout.rb~ +46 -0
- data/app/components/marty/extras/misc.rb +18 -0
- data/app/components/marty/form.rb +6 -0
- data/app/components/marty/grid.rb +45 -0
- data/app/components/marty/grid_append_only.rb +12 -0
- data/app/components/marty/import_type_view.rb +53 -0
- data/app/components/marty/live_search_grid_panel.rb +46 -0
- data/app/components/marty/live_search_grid_panel.rb~ +49 -0
- data/app/components/marty/main_auth_app.rb +269 -0
- data/app/components/marty/main_auth_app.rb~ +238 -0
- data/app/components/marty/mcfly_grid_panel.rb +62 -0
- data/app/components/marty/mcfly_grid_panel.rb~ +80 -0
- data/app/components/marty/new_posting_form.rb +46 -0
- data/app/components/marty/new_posting_form.rb~ +46 -0
- data/app/components/marty/new_posting_window.rb +21 -0
- data/app/components/marty/new_posting_window.rb~ +21 -0
- data/app/components/marty/panel.rb +12 -0
- data/app/components/marty/pivot_grid.rb +52 -0
- data/app/components/marty/pivot_grid/endpoints.rb +45 -0
- data/app/components/marty/pivot_grid/javascripts/extensions.js +150 -0
- data/app/components/marty/pivot_grid/javascripts/pivot_grid.js +86 -0
- data/app/components/marty/pivot_grid/services.rb +44 -0
- data/app/components/marty/posting_grid.rb +139 -0
- data/app/components/marty/posting_grid.rb~ +140 -0
- data/app/components/marty/posting_window.rb +27 -0
- data/app/components/marty/promise_view.rb +177 -0
- data/app/components/marty/promise_view.rb~ +157 -0
- data/app/components/marty/promise_view/stylesheets/promise_view.css +26 -0
- data/app/components/marty/promise_view/stylesheets/promise_view.css~ +15 -0
- data/app/components/marty/report_form.rb +225 -0
- data/app/components/marty/report_form.rb~ +217 -0
- data/app/components/marty/report_select.rb +145 -0
- data/app/components/marty/report_select.rb~ +133 -0
- data/app/components/marty/reporting.rb +39 -0
- data/app/components/marty/reporting.rb~ +39 -0
- data/app/components/marty/script_detail.rb~ +430 -0
- data/app/components/marty/script_form.rb +233 -0
- data/app/components/marty/script_form.rb~ +233 -0
- data/app/components/marty/script_form/javascripts/Ext.ux.form.field.CodeMirror.js +698 -0
- data/app/components/marty/script_form/javascripts/Ext.ux.form.field.CodeMirror.js~ +909 -0
- data/app/components/marty/script_form/javascripts/codemirror.js +3130 -0
- data/app/components/marty/script_form/javascripts/mode/clike/clike.js +284 -0
- data/app/components/marty/script_form/javascripts/mode/clike/index.html +102 -0
- data/app/components/marty/script_form/javascripts/mode/clike/scala.html +766 -0
- data/app/components/marty/script_form/javascripts/mode/clojure/clojure.js +206 -0
- data/app/components/marty/script_form/javascripts/mode/clojure/index.html +67 -0
- data/app/components/marty/script_form/javascripts/mode/coffeescript/LICENSE +22 -0
- data/app/components/marty/script_form/javascripts/mode/coffeescript/coffeescript.js +346 -0
- data/app/components/marty/script_form/javascripts/mode/coffeescript/index.html +728 -0
- data/app/components/marty/script_form/javascripts/mode/commonlisp/commonlisp.js +101 -0
- data/app/components/marty/script_form/javascripts/mode/commonlisp/index.html +165 -0
- data/app/components/marty/script_form/javascripts/mode/css/css.js +448 -0
- data/app/components/marty/script_form/javascripts/mode/css/index.html +58 -0
- data/app/components/marty/script_form/javascripts/mode/css/test.js +501 -0
- data/app/components/marty/script_form/javascripts/mode/delorean/delorean.js +189 -0
- data/app/components/marty/script_form/javascripts/mode/diff/diff.js +32 -0
- data/app/components/marty/script_form/javascripts/mode/diff/index.html +105 -0
- data/app/components/marty/script_form/javascripts/mode/ecl/ecl.js +203 -0
- data/app/components/marty/script_form/javascripts/mode/ecl/index.html +42 -0
- data/app/components/marty/script_form/javascripts/mode/erlang/erlang.js +463 -0
- data/app/components/marty/script_form/javascripts/mode/erlang/index.html +63 -0
- data/app/components/marty/script_form/javascripts/mode/gfm/gfm.js +150 -0
- data/app/components/marty/script_form/javascripts/mode/gfm/index.html +48 -0
- data/app/components/marty/script_form/javascripts/mode/go/go.js +170 -0
- data/app/components/marty/script_form/javascripts/mode/go/index.html +73 -0
- data/app/components/marty/script_form/javascripts/mode/groovy/groovy.js +210 -0
- data/app/components/marty/script_form/javascripts/mode/groovy/index.html +72 -0
- data/app/components/marty/script_form/javascripts/mode/haskell/haskell.js +242 -0
- data/app/components/marty/script_form/javascripts/mode/haskell/index.html +61 -0
- data/app/components/marty/script_form/javascripts/mode/haxe/haxe.js +429 -0
- data/app/components/marty/script_form/javascripts/mode/haxe/index.html +91 -0
- data/app/components/marty/script_form/javascripts/mode/htmlembedded/htmlembedded.js +72 -0
- data/app/components/marty/script_form/javascripts/mode/htmlembedded/index.html +50 -0
- data/app/components/marty/script_form/javascripts/mode/htmlmixed/htmlmixed.js +84 -0
- data/app/components/marty/script_form/javascripts/mode/htmlmixed/index.html +52 -0
- data/app/components/marty/script_form/javascripts/mode/javascript/index.html +78 -0
- data/app/components/marty/script_form/javascripts/mode/javascript/javascript.js +361 -0
- data/app/components/marty/script_form/javascripts/mode/jinja2/index.html +38 -0
- data/app/components/marty/script_form/javascripts/mode/jinja2/jinja2.js +42 -0
- data/app/components/marty/script_form/javascripts/mode/less/index.html +740 -0
- data/app/components/marty/script_form/javascripts/mode/less/less.js +266 -0
- data/app/components/marty/script_form/javascripts/mode/lua/index.html +73 -0
- data/app/components/marty/script_form/javascripts/mode/lua/lua.js +140 -0
- data/app/components/marty/script_form/javascripts/mode/markdown/index.html +343 -0
- data/app/components/marty/script_form/javascripts/mode/markdown/markdown.js +382 -0
- data/app/components/marty/script_form/javascripts/mode/markdown/test.js +1084 -0
- data/app/components/marty/script_form/javascripts/mode/mysql/index.html +42 -0
- data/app/components/marty/script_form/javascripts/mode/mysql/mysql.js +186 -0
- data/app/components/marty/script_form/javascripts/mode/ntriples/index.html +33 -0
- data/app/components/marty/script_form/javascripts/mode/ntriples/ntriples.js +172 -0
- data/app/components/marty/script_form/javascripts/mode/ocaml/index.html +130 -0
- data/app/components/marty/script_form/javascripts/mode/ocaml/ocaml.js +114 -0
- data/app/components/marty/script_form/javascripts/mode/pascal/LICENSE +7 -0
- data/app/components/marty/script_form/javascripts/mode/pascal/index.html +49 -0
- data/app/components/marty/script_form/javascripts/mode/pascal/pascal.js +94 -0
- data/app/components/marty/script_form/javascripts/mode/perl/LICENSE +19 -0
- data/app/components/marty/script_form/javascripts/mode/perl/index.html +63 -0
- data/app/components/marty/script_form/javascripts/mode/perl/perl.js +816 -0
- data/app/components/marty/script_form/javascripts/mode/php/index.html +49 -0
- data/app/components/marty/script_form/javascripts/mode/php/php.js +148 -0
- data/app/components/marty/script_form/javascripts/mode/pig/index.html +43 -0
- data/app/components/marty/script_form/javascripts/mode/pig/pig.js +172 -0
- data/app/components/marty/script_form/javascripts/mode/plsql/index.html +63 -0
- data/app/components/marty/script_form/javascripts/mode/plsql/plsql.js +217 -0
- data/app/components/marty/script_form/javascripts/mode/properties/index.html +41 -0
- data/app/components/marty/script_form/javascripts/mode/properties/properties.js +63 -0
- data/app/components/marty/script_form/javascripts/mode/python/LICENSE.txt +21 -0
- data/app/components/marty/script_form/javascripts/mode/python/index.html +123 -0
- data/app/components/marty/script_form/javascripts/mode/python/python.js +338 -0
- data/app/components/marty/script_form/javascripts/mode/r/LICENSE +24 -0
- data/app/components/marty/script_form/javascripts/mode/r/index.html +74 -0
- data/app/components/marty/script_form/javascripts/mode/r/r.js +141 -0
- data/app/components/marty/script_form/javascripts/mode/rpm/changes/changes.js +19 -0
- data/app/components/marty/script_form/javascripts/mode/rpm/changes/index.html +54 -0
- data/app/components/marty/script_form/javascripts/mode/rpm/spec/index.html +100 -0
- data/app/components/marty/script_form/javascripts/mode/rpm/spec/spec.css +5 -0
- data/app/components/marty/script_form/javascripts/mode/rpm/spec/spec.js +66 -0
- data/app/components/marty/script_form/javascripts/mode/rst/index.html +526 -0
- data/app/components/marty/script_form/javascripts/mode/rst/rst.js +326 -0
- data/app/components/marty/script_form/javascripts/mode/ruby/LICENSE +24 -0
- data/app/components/marty/script_form/javascripts/mode/ruby/index.html +172 -0
- data/app/components/marty/script_form/javascripts/mode/ruby/ruby.js +195 -0
- data/app/components/marty/script_form/javascripts/mode/rust/index.html +49 -0
- data/app/components/marty/script_form/javascripts/mode/rust/rust.js +432 -0
- data/app/components/marty/script_form/javascripts/mode/scheme/index.html +65 -0
- data/app/components/marty/script_form/javascripts/mode/scheme/scheme.js +230 -0
- data/app/components/marty/script_form/javascripts/mode/shell/index.html +50 -0
- data/app/components/marty/script_form/javascripts/mode/shell/shell.js +118 -0
- data/app/components/marty/script_form/javascripts/mode/sieve/LICENSE +23 -0
- data/app/components/marty/script_form/javascripts/mode/sieve/index.html +81 -0
- data/app/components/marty/script_form/javascripts/mode/sieve/sieve.js +156 -0
- data/app/components/marty/script_form/javascripts/mode/smalltalk/index.html +56 -0
- data/app/components/marty/script_form/javascripts/mode/smalltalk/smalltalk.js +139 -0
- data/app/components/marty/script_form/javascripts/mode/smarty/index.html +83 -0
- data/app/components/marty/script_form/javascripts/mode/smarty/smarty.js +148 -0
- data/app/components/marty/script_form/javascripts/mode/sparql/index.html +41 -0
- data/app/components/marty/script_form/javascripts/mode/sparql/sparql.js +143 -0
- data/app/components/marty/script_form/javascripts/mode/stex/index.html +98 -0
- data/app/components/marty/script_form/javascripts/mode/stex/stex.js +182 -0
- data/app/components/marty/script_form/javascripts/mode/stex/test.js +343 -0
- data/app/components/marty/script_form/javascripts/mode/tiddlywiki/index.html +141 -0
- data/app/components/marty/script_form/javascripts/mode/tiddlywiki/tiddlywiki.css +14 -0
- data/app/components/marty/script_form/javascripts/mode/tiddlywiki/tiddlywiki.js +384 -0
- data/app/components/marty/script_form/javascripts/mode/tiki/index.html +83 -0
- data/app/components/marty/script_form/javascripts/mode/tiki/tiki.css +26 -0
- data/app/components/marty/script_form/javascripts/mode/tiki/tiki.js +309 -0
- data/app/components/marty/script_form/javascripts/mode/vb/LICENSE.txt +21 -0
- data/app/components/marty/script_form/javascripts/mode/vb/index.html +89 -0
- data/app/components/marty/script_form/javascripts/mode/vb/vb.js +260 -0
- data/app/components/marty/script_form/javascripts/mode/vbscript/index.html +43 -0
- data/app/components/marty/script_form/javascripts/mode/vbscript/vbscript.js +26 -0
- data/app/components/marty/script_form/javascripts/mode/velocity/index.html +104 -0
- data/app/components/marty/script_form/javascripts/mode/velocity/velocity.js +146 -0
- data/app/components/marty/script_form/javascripts/mode/verilog/index.html +211 -0
- data/app/components/marty/script_form/javascripts/mode/verilog/verilog.js +194 -0
- data/app/components/marty/script_form/javascripts/mode/xml/index.html +45 -0
- data/app/components/marty/script_form/javascripts/mode/xml/xml.js +318 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/LICENSE +20 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/index.html +223 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/test/index.html +27 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/test/testBase.js +42 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/test/testEmptySequenceKeyword.js +16 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/test/testMultiAttr.js +16 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/test/testNamespaces.js +91 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/test/testProcessingInstructions.js +16 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/test/testQuotes.js +19 -0
- data/app/components/marty/script_form/javascripts/mode/xquery/xquery.js +451 -0
- data/app/components/marty/script_form/javascripts/mode/yaml/index.html +68 -0
- data/app/components/marty/script_form/javascripts/mode/yaml/yaml.js +95 -0
- data/app/components/marty/script_form/javascripts/util/closetag.js +164 -0
- data/app/components/marty/script_form/javascripts/util/dialog.css +27 -0
- data/app/components/marty/script_form/javascripts/util/dialog.js +70 -0
- data/app/components/marty/script_form/javascripts/util/foldcode.js +196 -0
- data/app/components/marty/script_form/javascripts/util/formatting.js +193 -0
- data/app/components/marty/script_form/javascripts/util/javascript-hint.js +134 -0
- data/app/components/marty/script_form/javascripts/util/loadmode.js +51 -0
- data/app/components/marty/script_form/javascripts/util/match-highlighter.js +44 -0
- data/app/components/marty/script_form/javascripts/util/multiplex.js +77 -0
- data/app/components/marty/script_form/javascripts/util/overlay.js +54 -0
- data/app/components/marty/script_form/javascripts/util/pig-hint.js +123 -0
- data/app/components/marty/script_form/javascripts/util/runmode-standalone.js +90 -0
- data/app/components/marty/script_form/javascripts/util/runmode.js +53 -0
- data/app/components/marty/script_form/javascripts/util/search.js +118 -0
- data/app/components/marty/script_form/javascripts/util/searchcursor.js +119 -0
- data/app/components/marty/script_form/javascripts/util/simple-hint.css +16 -0
- data/app/components/marty/script_form/javascripts/util/simple-hint.js +97 -0
- data/app/components/marty/script_form/javascripts/util/xml-hint.js +137 -0
- data/app/components/marty/script_form/stylesheets/codemirror.css +172 -0
- data/app/components/marty/script_form/stylesheets/delorean.css +10 -0
- data/app/components/marty/script_form/stylesheets/theme/ambiance.css +81 -0
- data/app/components/marty/script_form/stylesheets/theme/blackboard.css +25 -0
- data/app/components/marty/script_form/stylesheets/theme/cobalt.css +18 -0
- data/app/components/marty/script_form/stylesheets/theme/eclipse.css +25 -0
- data/app/components/marty/script_form/stylesheets/theme/elegant.css +10 -0
- data/app/components/marty/script_form/stylesheets/theme/erlang-dark.css +21 -0
- data/app/components/marty/script_form/stylesheets/theme/lesser-dark.css +44 -0
- data/app/components/marty/script_form/stylesheets/theme/monokai.css +28 -0
- data/app/components/marty/script_form/stylesheets/theme/neat.css +9 -0
- data/app/components/marty/script_form/stylesheets/theme/night.css +21 -0
- data/app/components/marty/script_form/stylesheets/theme/rubyblue.css +21 -0
- data/app/components/marty/script_form/stylesheets/theme/vibrant-ink.css +27 -0
- data/app/components/marty/script_form/stylesheets/theme/xq-dark.css +46 -0
- data/app/components/marty/script_grid.rb +104 -0
- data/app/components/marty/script_grid.rb~ +99 -0
- data/app/components/marty/script_tester.rb +114 -0
- data/app/components/marty/script_tester.rb~ +213 -0
- data/app/components/marty/scripting.rb +132 -0
- data/app/components/marty/scripting.rb~ +124 -0
- data/app/components/marty/select_report.rb~ +143 -0
- data/app/components/marty/simple_app.rb +97 -0
- data/app/components/marty/simple_app.rb~ +101 -0
- data/app/components/marty/simple_app/javascripts/simple_app.js +50 -0
- data/app/components/marty/simple_app/javascripts/statusbar_ext.js +8 -0
- data/app/components/marty/tag_grid.rb +83 -0
- data/app/components/marty/tag_grid.rb~ +89 -0
- data/app/components/marty/tree_panel.rb~ +256 -0
- data/app/components/marty/tree_panel/javascripts/tree_panel.js~ +317 -0
- data/app/components/marty/user_pivot.rb +128 -0
- data/app/components/marty/user_view.rb +181 -0
- data/app/components/marty/user_view.rb~ +188 -0
- data/app/controllers/marty/application_controller.rb +124 -0
- data/app/controllers/marty/application_controller.rb~ +133 -0
- data/app/controllers/marty/components_controller.rb +41 -0
- data/app/controllers/marty/components_controller.rb~ +37 -0
- data/app/controllers/marty/job_controller.rb +28 -0
- data/app/controllers/marty/job_controller.rb~ +28 -0
- data/app/controllers/marty/rpc_controller.rb +64 -0
- data/app/controllers/marty/rpc_controller.rb~ +61 -0
- data/app/helpers/marty/application_helper.rb +4 -0
- data/app/helpers/marty/script_set.rb +57 -0
- data/app/helpers/marty/script_set.rb~ +59 -0
- data/app/models/marty/api_auth.rb +44 -0
- data/app/models/marty/api_auth.rb~ +48 -0
- data/app/models/marty/base.rb +4 -0
- data/app/models/marty/data_change.rb +179 -0
- data/app/models/marty/data_change.rb~ +141 -0
- data/app/models/marty/enum.rb +22 -0
- data/app/models/marty/enum.rb~ +16 -0
- data/app/models/marty/import_type.rb +44 -0
- data/app/models/marty/import_type.rb~ +48 -0
- data/app/models/marty/poop.rb~ +169 -0
- data/app/models/marty/posting.rb +101 -0
- data/app/models/marty/posting.rb~ +86 -0
- data/app/models/marty/posting_type.rb +12 -0
- data/app/models/marty/posting_type.rb~ +21 -0
- data/app/models/marty/promise.rb +252 -0
- data/app/models/marty/promise.rb~ +196 -0
- data/app/models/marty/role.rb +6 -0
- data/app/models/marty/role.rb~ +10 -0
- data/app/models/marty/script.rb +144 -0
- data/app/models/marty/script.rb~ +62 -0
- data/app/models/marty/tag.rb +96 -0
- data/app/models/marty/tag.rb~ +91 -0
- data/app/models/marty/token.rb +30 -0
- data/app/models/marty/user.rb +146 -0
- data/app/models/marty/user.rb~ +148 -0
- data/app/models/marty/user_role.rb +7 -0
- data/app/models/marty/user_role.rb~ +13 -0
- data/app/views/layouts/marty/application.html.erb +12 -0
- data/app/views/layouts/marty/application.html.erb~ +11 -0
- data/config/locales/en.yml +134 -0
- data/config/routes.rb +6 -0
- data/config/routes.rb~ +10 -0
- data/db/migrate/001_create_marty_scripts.rb +14 -0
- data/db/migrate/003_create_marty_users.rb +12 -0
- data/db/migrate/004_create_marty_roles.rb +7 -0
- data/db/migrate/005_create_marty_user_roles.rb +14 -0
- data/db/migrate/006_create_marty_tokens.rb +14 -0
- data/db/migrate/008_create_marty_posting_types.rb +7 -0
- data/db/migrate/019_create_marty_postings.rb +18 -0
- data/db/migrate/019_create_marty_postings.rb~ +19 -0
- data/db/migrate/068_create_marty_import_types.rb +12 -0
- data/db/migrate/069_create_marty_import_synonyms.rb +15 -0
- data/db/migrate/070_create_versions.rb +18 -0
- data/db/migrate/071_add_object_changes_column_to_versions.rb +9 -0
- data/db/migrate/072_add_validation_function_to_import_types.rb +6 -0
- data/db/migrate/073_add_preprocess_function_to_import_types.rb +5 -0
- data/db/migrate/090_create_delayed_jobs.rb +22 -0
- data/db/migrate/091_create_marty_promises.rb +36 -0
- data/db/migrate/095_create_marty_tags.rb +14 -0
- data/db/migrate/095_create_marty_tags.rb~ +19 -0
- data/db/migrate/096_add_user_roles_to_import_types.rb +11 -0
- data/db/migrate/097_drop_versions.rb +9 -0
- data/db/migrate/098_create_marty_api_auths.rb +20 -0
- data/db/seeds.rb +48 -0
- data/lib/marty.rb +18 -0
- data/lib/marty.rb~ +13 -0
- data/lib/marty/content_handler.rb +97 -0
- data/lib/marty/content_handler.rb~ +93 -0
- data/lib/marty/data_conversion.rb +298 -0
- data/lib/marty/data_exporter.rb +150 -0
- data/lib/marty/data_exporter.rb~ +137 -0
- data/lib/marty/data_importer.rb +122 -0
- data/lib/marty/data_importer.rb~ +114 -0
- data/lib/marty/data_row_processor.rb~ +206 -0
- data/lib/marty/drop_folder_hook.rb~ +17 -0
- data/lib/marty/engine.rb +10 -0
- data/lib/marty/folder_hook.rb~ +9 -0
- data/lib/marty/lazy_column_loader.rb +57 -0
- data/lib/marty/lazy_column_loader.rb~ +47 -0
- data/lib/marty/mcfly_query.rb +189 -0
- data/lib/marty/mcfly_query.rb~ +188 -0
- data/lib/marty/migrations.rb +108 -0
- data/lib/marty/migrations.rb~ +65 -0
- data/lib/marty/monkey.rb +163 -0
- data/lib/marty/monkey.rb~ +160 -0
- data/lib/marty/permissions.rb +64 -0
- data/lib/marty/permissions.rb~ +69 -0
- data/lib/marty/promise.rb~ +41 -0
- data/lib/marty/promise_job.rb +123 -0
- data/lib/marty/promise_job.rb~ +121 -0
- data/lib/marty/promise_proxy.rb +94 -0
- data/lib/marty/promise_proxy.rb~ +69 -0
- data/lib/marty/railtie.rb +5 -0
- data/lib/marty/relation.rb +39 -0
- data/lib/marty/util.rb +110 -0
- data/lib/marty/util.rb~ +80 -0
- data/lib/marty/version.rb +3 -0
- data/lib/marty/version.rb~ +3 -0
- data/lib/marty/xl.rb +527 -0
- data/lib/marty/xl.rb~ +526 -0
- data/lib/pyxll/README.txt +19 -0
- data/lib/pyxll/README.txt~ +16 -0
- data/lib/pyxll/gemini.py +155 -0
- data/lib/pyxll/gemini.py~ +110 -0
- data/lib/pyxll/pyxll.cfg +12 -0
- data/lib/pyxll/pyxll.cfg~ +12 -0
- data/lib/pyxll/sample.xlsx +0 -0
- data/lib/tasks/marty_tasks.rake +37 -0
- metadata +517 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
require 'mcfly'
|
|
2
|
+
|
|
3
|
+
module Mcfly
|
|
4
|
+
module Model
|
|
5
|
+
|
|
6
|
+
def self.included(base)
|
|
7
|
+
base.send :extend, ClassMethods
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module ClassMethods
|
|
11
|
+
def clear_cache
|
|
12
|
+
@LOOKUP_CACHE.clear if @LOOKUP_CACHE
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Implements a VERY HACKY class-based caching mechanism for
|
|
16
|
+
# database lookup results. Issues include: cached values are
|
|
17
|
+
# ActiveRecord objects. Not sure if these should be shared
|
|
18
|
+
# across connections. Query results can potentially be very
|
|
19
|
+
# large lists which we simply count as one item in the cache.
|
|
20
|
+
# Caching mechanism will result in large processes. Caches are
|
|
21
|
+
# not sharable across different Ruby processes.
|
|
22
|
+
def cached_delorean_fn(name, options = {}, &block)
|
|
23
|
+
@LOOKUP_CACHE ||= {}
|
|
24
|
+
|
|
25
|
+
delorean_fn(name, options) do |ts, *args|
|
|
26
|
+
cache_key = [name, ts] + args.map{ |a|
|
|
27
|
+
a.is_a?(ActiveRecord::Base) ? a.id : a
|
|
28
|
+
} unless Mcfly.is_infinity(ts)
|
|
29
|
+
|
|
30
|
+
next @LOOKUP_CACHE[cache_key] if
|
|
31
|
+
cache_key && @LOOKUP_CACHE.has_key?(cache_key)
|
|
32
|
+
|
|
33
|
+
res = block.call(ts, *args)
|
|
34
|
+
|
|
35
|
+
if cache_key
|
|
36
|
+
# Cache has >1000 items, clear out the oldest 200. FIXME:
|
|
37
|
+
# hard-coded, should be configurable. Cache
|
|
38
|
+
# size/invalidation should be per lookup and not class.
|
|
39
|
+
# We're invalidating cache items simply based on age and
|
|
40
|
+
# not usage. This is faster but not as fair.
|
|
41
|
+
if @LOOKUP_CACHE.count > 1000
|
|
42
|
+
@LOOKUP_CACHE.keys[0..200].each{|k| @LOOKUP_CACHE.delete(k)}
|
|
43
|
+
end
|
|
44
|
+
@LOOKUP_CACHE[cache_key] = res
|
|
45
|
+
|
|
46
|
+
# Since we're caching this object and don't want anyone
|
|
47
|
+
# changing it. FIXME: ideally should freeze this object
|
|
48
|
+
# recursively.
|
|
49
|
+
res.freeze unless res.is_a?(ActiveRecord::Relation)
|
|
50
|
+
end
|
|
51
|
+
res
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# FIXME: duplicate code from Mcfly's mcfly_lookup.
|
|
56
|
+
def cached_mcfly_lookup(name, options = {}, &block)
|
|
57
|
+
cached_delorean_fn(name, options) do |ts, *args|
|
|
58
|
+
raise "time cannot be nil" if ts.nil?
|
|
59
|
+
|
|
60
|
+
ts = Mcfly.normalize_infinity(ts)
|
|
61
|
+
|
|
62
|
+
where("obsoleted_dt >= ? AND created_dt < ?", ts, ts).scoping do
|
|
63
|
+
block.call(ts, *args)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# FIXME: for validation purposes, this mechanism should make
|
|
69
|
+
# sure that the allable attrs are not required.
|
|
70
|
+
def gen_mcfly_lookup(name, attrs, options={})
|
|
71
|
+
raise "bad options" unless options.is_a?(Hash)
|
|
72
|
+
|
|
73
|
+
# FIXME: mode should be sent later, not as a part of
|
|
74
|
+
# gen_mcfly_lookup. i.e. we just generate the search and the
|
|
75
|
+
# mode is applied at runtime by delorean code. That would
|
|
76
|
+
# allow lookups to be used in either mode dynamically.
|
|
77
|
+
mode = options.fetch(:mode, :first)
|
|
78
|
+
|
|
79
|
+
assoc = Set.new(self.reflect_on_all_associations.map(&:name))
|
|
80
|
+
attr_names = attrs.keys
|
|
81
|
+
|
|
82
|
+
allables = attrs.select {|k, v| v}
|
|
83
|
+
|
|
84
|
+
order = allables.keys.reverse.map { |k|
|
|
85
|
+
k = "#{k}_id" if assoc.member?(k)
|
|
86
|
+
"#{k} NULLS LAST"
|
|
87
|
+
}.join(", ")
|
|
88
|
+
|
|
89
|
+
qstr = attrs.map {|k, v|
|
|
90
|
+
k = "#{k}_id" if assoc.member?(k)
|
|
91
|
+
v ? "(#{k} = ? OR #{k} IS NULL)" : "(#{k} = ?)"
|
|
92
|
+
}.join(" AND ")
|
|
93
|
+
|
|
94
|
+
cached_mcfly_lookup(name, sig: attrs.length+1) do
|
|
95
|
+
|t, *attr_list|
|
|
96
|
+
|
|
97
|
+
attr_list_ids = attr_list.each_with_index.map {|x, i|
|
|
98
|
+
assoc.member?(attr_names[i]) ?
|
|
99
|
+
(attr_list[i] && attr_list[i].id) : attr_list[i]
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
q = self.where(qstr, *attr_list_ids)
|
|
103
|
+
q = q.order(order) unless order.empty?
|
|
104
|
+
mode ? q.send(mode) : q
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
######################################################################
|
|
109
|
+
|
|
110
|
+
# Generates Gemini categorization lookups. For instance,
|
|
111
|
+
# suppose we have the following in class GFee:
|
|
112
|
+
#
|
|
113
|
+
# gen_mcfly_lookup_cat :lookup_q,
|
|
114
|
+
# [:security_instrument,
|
|
115
|
+
# 'Gemini::SecurityInstrumentCategorization',
|
|
116
|
+
# :g_fee_category],
|
|
117
|
+
# {
|
|
118
|
+
# entity: true,
|
|
119
|
+
# security_instrument: true,
|
|
120
|
+
# coupon: true,
|
|
121
|
+
# },
|
|
122
|
+
# nil
|
|
123
|
+
|
|
124
|
+
# In the above case,
|
|
125
|
+
# rel_attr = :security_instrument
|
|
126
|
+
# cat_assoc_klass = Gemini::SecurityInstrumentCategorization
|
|
127
|
+
# cat_attr = :g_fee_category
|
|
128
|
+
# name = :lookup_q
|
|
129
|
+
# pc_name = :pc_lookup_q
|
|
130
|
+
# pc_attrs = {entity: true, security_instrument: true,
|
|
131
|
+
# g_fee_category: true, coupon: true}
|
|
132
|
+
|
|
133
|
+
def gen_mcfly_lookup_cat(name, catrel, attrs, options={})
|
|
134
|
+
rel_attr, cat_assoc_name, cat_attr = catrel
|
|
135
|
+
|
|
136
|
+
raise "#{rel_attr} should be mapped in attrs" if
|
|
137
|
+
attrs[rel_attr].nil?
|
|
138
|
+
|
|
139
|
+
cat_assoc_klass = cat_assoc_name.constantize
|
|
140
|
+
|
|
141
|
+
raise "need lookup method on #{cat_assoc_klass}" unless
|
|
142
|
+
cat_assoc_klass.respond_to? :lookup
|
|
143
|
+
|
|
144
|
+
# replace rel_attr with cat_attr in attrs
|
|
145
|
+
pc_attrs = attrs.each_with_object({}) {|(k, v), h|
|
|
146
|
+
h[k == rel_attr ? cat_attr : k] = v
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
pc_name = "pc_#{name}".to_sym
|
|
150
|
+
gen_mcfly_lookup(pc_name, pc_attrs, options)
|
|
151
|
+
|
|
152
|
+
lpi = attrs.keys.index rel_attr
|
|
153
|
+
|
|
154
|
+
raise "should not include #{cat_attr}" if
|
|
155
|
+
attrs.member?(cat_attr)
|
|
156
|
+
|
|
157
|
+
raise "need #{rel_attr} argument" unless lpi
|
|
158
|
+
|
|
159
|
+
delorean_fn(name, sig: attrs.length+1) do |ts, *args|
|
|
160
|
+
# Example: rel is a Gemini::SecurityInstrument instance.
|
|
161
|
+
rel = args[lpi]
|
|
162
|
+
raise "#{rel_attr} can't be nil" unless rel
|
|
163
|
+
|
|
164
|
+
# Assumes there's a mcfly :lookup function on
|
|
165
|
+
# cat_assoc_klass.
|
|
166
|
+
categorizing_obj = cat_assoc_klass.lookup(ts, rel)
|
|
167
|
+
raise "no categorization #{cat_assoc_klass} for #{rel}" unless
|
|
168
|
+
categorizing_obj
|
|
169
|
+
|
|
170
|
+
pc = categorizing_obj.send(cat_attr)
|
|
171
|
+
raise ("#{categorizing_obj} must have assoc." +
|
|
172
|
+
" #{cat_attr}/#{rel.inspect}") unless pc
|
|
173
|
+
|
|
174
|
+
args[lpi] = pc
|
|
175
|
+
self.send(pc_name, ts, *args)
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
module Mcfly::Controller
|
|
184
|
+
# define mcfly user to be Flowscape's current_user.
|
|
185
|
+
def user_for_mcfly
|
|
186
|
+
find_current_user rescue nil
|
|
187
|
+
end
|
|
188
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require 'digest/md5'
|
|
2
|
+
|
|
3
|
+
module Marty::Migrations
|
|
4
|
+
def tb_prefix
|
|
5
|
+
"marty_"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def add_fk(from_table, to_table, options = {})
|
|
9
|
+
options[:column] ||= "#{to_table.to_s.singularize}_id"
|
|
10
|
+
|
|
11
|
+
from_table = "#{tb_prefix}#{from_table}" unless
|
|
12
|
+
from_table.to_s.start_with?(tb_prefix)
|
|
13
|
+
|
|
14
|
+
# FIXME: so hacky to specifically check for "marty_"
|
|
15
|
+
to_table = "#{tb_prefix}#{to_table}" unless
|
|
16
|
+
to_table.to_s.start_with?(tb_prefix) ||
|
|
17
|
+
to_table.to_s.start_with?("marty_")
|
|
18
|
+
|
|
19
|
+
add_foreign_key(from_table,
|
|
20
|
+
to_table,
|
|
21
|
+
fk_opts(from_table,
|
|
22
|
+
to_table,
|
|
23
|
+
options[:column]).update(options),
|
|
24
|
+
)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# created_dt/obsoleted_dt need to be indexed since they appear in
|
|
28
|
+
# almost all queries.
|
|
29
|
+
MCFLY_INDEX_COLUMNS = [
|
|
30
|
+
:created_dt,
|
|
31
|
+
:obsoleted_dt,
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
def add_mcfly_index(tb, *attrs)
|
|
35
|
+
tb = "#{tb_prefix}#{tb}" unless
|
|
36
|
+
tb.to_s.start_with?(tb_prefix)
|
|
37
|
+
|
|
38
|
+
add_mcfly_attrs_index(tb, *attrs)
|
|
39
|
+
|
|
40
|
+
MCFLY_INDEX_COLUMNS.each { |a|
|
|
41
|
+
add_index tb.to_sym, a, index_opts(tb, a)
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def add_mcfly_unique_index(klass)
|
|
46
|
+
raise "bad class arg #{klass}" unless
|
|
47
|
+
klass.is_a?(Class) && klass < ActiveRecord::Base
|
|
48
|
+
|
|
49
|
+
attrs = get_attrs(klass)
|
|
50
|
+
|
|
51
|
+
add_index(klass.table_name.to_sym,
|
|
52
|
+
attrs,
|
|
53
|
+
unique: true,
|
|
54
|
+
name: unique_index_name(klass)
|
|
55
|
+
) unless index_exists?(klass.table_name.to_sym,
|
|
56
|
+
attrs,
|
|
57
|
+
name: unique_index_name(klass),
|
|
58
|
+
unique: true)
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def remove_mcfly_unique_index(klass)
|
|
63
|
+
raise "bad class arg #{klass}" unless
|
|
64
|
+
klass.is_a?(Class) && klass < ActiveRecord::Base
|
|
65
|
+
|
|
66
|
+
attrs = get_attrs(klass)
|
|
67
|
+
|
|
68
|
+
remove_index(klass.table_name.to_sym,
|
|
69
|
+
name: unique_index_name(klass)
|
|
70
|
+
) if index_exists?(klass.table_name.to_sym,
|
|
71
|
+
attrs,
|
|
72
|
+
name: unique_index_name(klass),
|
|
73
|
+
unique: true)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
def fk_opts(from, to, column)
|
|
78
|
+
name = "fk_#{from}_#{to}_#{column}"
|
|
79
|
+
if name.length > 63
|
|
80
|
+
s = Digest::MD5.hexdigest("#{to}_#{column}").slice(0..9)
|
|
81
|
+
name = "fk_#{from}_#{s}"
|
|
82
|
+
end
|
|
83
|
+
{name: name}
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def index_opts(tb, a)
|
|
87
|
+
name = "index_#{tb}_on_#{a}"
|
|
88
|
+
name.length > 63 ? {
|
|
89
|
+
name: "index_#{tb}_#{Digest::MD5.hexdigest(a.to_s).slice(0..9)}",
|
|
90
|
+
} : {}
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def add_mcfly_attrs_index(tb, *attrs)
|
|
94
|
+
attrs.each { |a|
|
|
95
|
+
options = index_opts(tb, a)
|
|
96
|
+
options[:order] = {a.to_sym => "NULLS LAST"}
|
|
97
|
+
add_index tb.to_sym, a, options
|
|
98
|
+
}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def unique_index_name(klass)
|
|
102
|
+
"unique_#{klass.table_name}"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def get_attrs(klass)
|
|
106
|
+
(Mcfly.mcfly_uniqueness(klass) + ['obsoleted_dt']).uniq
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'digest/md5'
|
|
2
|
+
|
|
3
|
+
module Marty::Migrations
|
|
4
|
+
def tb_prefix
|
|
5
|
+
"marty_"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def fk_opts(from, to, column)
|
|
9
|
+
name = "fk_#{from}_#{to}_#{column}"
|
|
10
|
+
if name.length > 63
|
|
11
|
+
s = Digest::MD5.hexdigest("#{to}_#{column}").slice(0..9)
|
|
12
|
+
name = "fk_#{from}_#{s}"
|
|
13
|
+
end
|
|
14
|
+
{name: name}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add_fk(from_table, to_table, options = {})
|
|
18
|
+
options[:column] ||= "#{to_table.to_s.singularize}_id"
|
|
19
|
+
|
|
20
|
+
from_table = "#{tb_prefix}#{from_table}" unless
|
|
21
|
+
from_table.to_s.start_with?(tb_prefix)
|
|
22
|
+
|
|
23
|
+
# FIXME: so hacky to specifically check for "marty_"
|
|
24
|
+
to_table = "#{tb_prefix}#{to_table}" unless
|
|
25
|
+
to_table.to_s.start_with?(tb_prefix) ||
|
|
26
|
+
to_table.to_s.start_with?("marty_")
|
|
27
|
+
|
|
28
|
+
add_foreign_key(from_table,
|
|
29
|
+
to_table,
|
|
30
|
+
fk_opts(from_table,
|
|
31
|
+
to_table,
|
|
32
|
+
options[:column]).update(options),
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def index_opts(tb, a)
|
|
37
|
+
name = "index_#{tb}_on_#{a}"
|
|
38
|
+
name.length > 63 ? {
|
|
39
|
+
name: "index_#{tb}_#{Digest::MD5.hexdigest(a.to_s).slice(0..9)}",
|
|
40
|
+
} : {}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# created_dt/obsoleted_dt need to be indexed since they appear in
|
|
44
|
+
# almost all queries.
|
|
45
|
+
MCFLY_INDEX_COLUMNS = [
|
|
46
|
+
:created_dt,
|
|
47
|
+
:obsoleted_dt,
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
def add_mcfly_index(tb, *attrs)
|
|
51
|
+
tb = "#{tb_prefix}#{tb}" unless
|
|
52
|
+
tb.to_s.start_with?(tb_prefix)
|
|
53
|
+
|
|
54
|
+
attrs.each { |a|
|
|
55
|
+
options = index_opts(tb, a)
|
|
56
|
+
options[:order] = {a.to_sym => "NULLS LAST"}
|
|
57
|
+
add_index tb.to_sym, a, options
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
MCFLY_INDEX_COLUMNS.each { |a|
|
|
61
|
+
add_index tb.to_sym, a, index_opts(tb, a)
|
|
62
|
+
}
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
data/lib/marty/monkey.rb
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
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
|
+
if Marty::Enum === obj && !obj.respond_to?(attr)
|
|
23
|
+
obj[attr]
|
|
24
|
+
else
|
|
25
|
+
old_get_attr(obj, attr, _e)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
######################################################################
|
|
32
|
+
|
|
33
|
+
class Hash
|
|
34
|
+
# define addition on hashes -- useful in Delorean code.
|
|
35
|
+
def +(x)
|
|
36
|
+
self.merge(x)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# define hash slice (similar to node slice in Delorean)
|
|
40
|
+
def %(x)
|
|
41
|
+
x.each_with_object({}) { |k, h|
|
|
42
|
+
h[k] = self[k]
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
######################################################################
|
|
48
|
+
|
|
49
|
+
require 'netzke-basepack'
|
|
50
|
+
|
|
51
|
+
class Netzke::Base
|
|
52
|
+
# get root component session
|
|
53
|
+
def root_sess(component=nil)
|
|
54
|
+
component ||= self
|
|
55
|
+
component.parent ? root_sess(component.parent) : component.component_session
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
######################################################################
|
|
60
|
+
|
|
61
|
+
# The following is a hack to get around ActiveRecord's broken handling
|
|
62
|
+
# of PostgreSQL ranges. Essentially, AR doesn't allow numranges to
|
|
63
|
+
# exclude the range start e.g. anything like: "(1.1,2.2]". This hack
|
|
64
|
+
# turns off the casting of PostgreSQL ranges to ruby ranges. i.e. we
|
|
65
|
+
# keep them as strings.
|
|
66
|
+
|
|
67
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
|
68
|
+
|
|
69
|
+
module ActiveRecord
|
|
70
|
+
module ConnectionAdapters
|
|
71
|
+
module PostgreSQL
|
|
72
|
+
module OID
|
|
73
|
+
class Range
|
|
74
|
+
def cast_value(value)
|
|
75
|
+
super
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def type_cast_for_database(value)
|
|
79
|
+
super
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
module ActiveRecord
|
|
89
|
+
module ConnectionAdapters
|
|
90
|
+
module PostgreSQL
|
|
91
|
+
module OID # :nodoc:
|
|
92
|
+
class Array
|
|
93
|
+
|
|
94
|
+
# In the 4.2.1 version of this code, under Mutable, the code
|
|
95
|
+
# checks for raw_old_value != type_cast_for_database(new_value)
|
|
96
|
+
#
|
|
97
|
+
# Since this is comparing db (string) version, we end up
|
|
98
|
+
# comparing "{1}"!="{1.0}" for float arrays. The following
|
|
99
|
+
# is a hack to check the new_value which is the ruby array.
|
|
100
|
+
# This could be problematic in other ways. But, works for
|
|
101
|
+
# our purposes. FIXME: In Rails 5.0 all this code has been
|
|
102
|
+
# changed and this should no longer be an issue.
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def changed_in_place?(raw_old_value, new_value)
|
|
106
|
+
new_value != type_cast_from_database(raw_old_value)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
######################################################################
|
|
116
|
+
|
|
117
|
+
# Rails 4 doesn't handle 'infinity' datetime properly due to
|
|
118
|
+
# in_time_zone conversion. Ergo this hack.
|
|
119
|
+
|
|
120
|
+
class String
|
|
121
|
+
alias_method :old_in_time_zone, :in_time_zone
|
|
122
|
+
|
|
123
|
+
def in_time_zone(zone = ::Time.zone)
|
|
124
|
+
self == 'infinity' ? self : old_in_time_zone(zone)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
######################################################################
|
|
129
|
+
|
|
130
|
+
# Axlsx::sanitize modifies strings in worksheet definition -- this
|
|
131
|
+
# doesn't work with Delorean's frozen strings.
|
|
132
|
+
require 'axlsx'
|
|
133
|
+
module Axlsx
|
|
134
|
+
def self.sanitize(str)
|
|
135
|
+
str.delete(CONTROL_CHARS)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
######################################################################
|
|
140
|
+
|
|
141
|
+
require 'netzke/basepack/data_adapters/active_record_adapter'
|
|
142
|
+
module Netzke::Basepack::DataAdapters
|
|
143
|
+
class ActiveRecordAdapter < AbstractAdapter
|
|
144
|
+
# FIXME: another giant hack to handle lazy_load columns.
|
|
145
|
+
# Modified original count_records to call count('*') instead of
|
|
146
|
+
# count when lazy-loaded. Otherwise, we run into issues with
|
|
147
|
+
# counting records in the default_scope placed by the lazy_load
|
|
148
|
+
# module.
|
|
149
|
+
def count_records(params, columns=[])
|
|
150
|
+
|
|
151
|
+
relation = @relation || get_relation(params)
|
|
152
|
+
columns.each do |c|
|
|
153
|
+
assoc, method = c[:name].split('__')
|
|
154
|
+
relation = relation.includes(assoc.to_sym).references(assoc.to_sym) if method
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
@model_class.const_defined?(:LAZY_LOADED) ? relation.count('*') :
|
|
158
|
+
relation.count
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|