datashift 0.16.0 → 0.40.0
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 +4 -4
- data/{LICENSE.txt → LICENSE} +0 -0
- data/Rakefile +1 -20
- data/datashift.thor +125 -0
- data/lib/applications/apache_poi_extensions.rb +21 -52
- data/lib/applications/excel.rb +64 -57
- data/lib/applications/hssf_row_extensions.rb +66 -0
- data/lib/applications/jexcel_file.rb +99 -95
- data/lib/applications/jexcel_file_extensions.rb +76 -83
- data/lib/applications/jruby/word.rb +36 -36
- data/lib/applications/ruby_poi_translations.rb +34 -32
- data/lib/applications/spreadsheet_extensions.rb +21 -19
- data/lib/datashift.rb +49 -59
- data/lib/datashift/binder.rb +217 -0
- data/lib/datashift/column_packer.rb +21 -72
- data/lib/datashift/configuration.rb +317 -0
- data/lib/datashift/context_factory.rb +88 -0
- data/lib/datashift/core_ext/array.rb +15 -0
- data/lib/datashift/core_ext/csv_ext.rb +46 -0
- data/lib/datashift/core_ext/string.rb +49 -0
- data/lib/datashift/core_ext/to_b.rb +11 -0
- data/lib/datashift/delimiters.rb +55 -61
- data/lib/datashift/doc_context.rb +137 -0
- data/lib/datashift/excel_base.rb +93 -81
- data/lib/datashift/exceptions.rb +30 -28
- data/lib/datashift/file_definitions.rb +44 -39
- data/lib/datashift/guards.rb +5 -5
- data/lib/datashift/header.rb +25 -0
- data/lib/datashift/headers.rb +94 -0
- data/lib/datashift/inbound_data/column.rb +44 -0
- data/lib/datashift/inbound_data/lookup_support.rb +33 -0
- data/lib/datashift/inbound_data/method_binding.rb +139 -0
- data/lib/datashift/load_object.rb +37 -12
- data/lib/datashift/logging.rb +54 -27
- data/lib/datashift/mandatory.rb +39 -0
- data/lib/datashift/mapping/data_flow_schema.rb +198 -0
- data/lib/datashift/{model_mapper.rb → mapping/mapper_utils.rb} +30 -10
- data/lib/datashift/model_methods/catalogue.rb +183 -0
- data/lib/datashift/model_methods/collection.rb +140 -0
- data/lib/datashift/model_methods/model_method.rb +162 -0
- data/lib/datashift/model_methods/model_methods_manager.rb +76 -0
- data/lib/datashift/model_methods/operator.rb +62 -0
- data/lib/datashift/node_collection.rb +26 -0
- data/lib/datashift/node_context.rb +68 -0
- data/lib/datashift/populator.rb +308 -282
- data/lib/datashift/progress_monitor.rb +91 -0
- data/lib/datashift/querying.rb +110 -52
- data/lib/datashift/templates/import_export_config.erb +55 -0
- data/lib/datashift/transformation/factory.rb +219 -0
- data/lib/datashift/transformation/remove.rb +44 -0
- data/lib/datashift/version.rb +3 -0
- data/lib/exporters/configuration.rb +84 -0
- data/lib/exporters/csv_exporter.rb +54 -52
- data/lib/exporters/excel_exporter.rb +80 -61
- data/lib/exporters/exporter_base.rb +8 -8
- data/lib/generators/config_generator.rb +218 -0
- data/lib/generators/csv_generator.rb +13 -70
- data/lib/generators/excel_generator.rb +23 -111
- data/lib/generators/generator_base.rb +15 -70
- data/lib/loaders/configuration.rb +90 -0
- data/lib/loaders/csv_loader.rb +63 -101
- data/lib/loaders/excel_loader.rb +71 -156
- data/lib/loaders/failure_data.rb +40 -0
- data/lib/loaders/file_loader.rb +16 -0
- data/lib/loaders/loader_base.rb +82 -410
- data/lib/loaders/loader_factory.rb +42 -0
- data/lib/loaders/paperclip/attachment_loader.rb +157 -140
- data/lib/loaders/paperclip/datashift_paperclip.rb +18 -35
- data/lib/loaders/paperclip/image_loading.rb +40 -35
- data/lib/loaders/reporters/basic_stdout_reporter.rb +40 -0
- data/lib/loaders/reporters/reporter.rb +26 -0
- data/lib/tasks/config.thor +65 -0
- data/{tasks → lib/tasks}/config/seed_fu_product_template.erb +0 -0
- data/{tasks → lib/tasks}/config/tidy_config.txt +0 -0
- data/lib/tasks/export.thor +192 -0
- data/lib/tasks/generate.thor +190 -0
- data/lib/tasks/import.thor +142 -0
- data/lib/{thor → tasks}/paperclip.thor +69 -69
- data/{tasks → lib/tasks/to_convert_to_thor}/db_tasks.rake +20 -20
- data/lib/tasks/tools.thor +109 -0
- data/spec/MissingAttachmentRecords/DEMO_001_ror_bag.jpeg +0 -0
- data/spec/MissingAttachmentRecords/DEMO_002_Powerstation.jpeg +0 -0
- data/spec/MissingAttachmentRecords/DEMO_003_ror_mug.jpeg +0 -0
- data/spec/MissingAttachmentRecords/DEMO_004_ror_ringer.jpeg +0 -0
- data/spec/datashift/binder_spec.rb +266 -0
- data/spec/datashift/config_generator_spec.rb +186 -0
- data/spec/datashift/configuration.rb +66 -0
- data/spec/datashift/context_factory_spec.rb +63 -0
- data/spec/datashift/data_flow_schema_spec.rb +150 -0
- data/spec/datashift/datashift_spec.rb +52 -0
- data/spec/datashift/excel_base_spec.rb +57 -0
- data/spec/datashift/excel_spec.rb +188 -0
- data/spec/datashift/failure_data_spec.rb +27 -0
- data/spec/{file_definitions.rb → datashift/file_definitions.rb} +9 -10
- data/spec/datashift/headers_spec.rb +56 -0
- data/spec/datashift/inbound_data_spec.rb +47 -0
- data/spec/datashift/mapper_utils_spec.rb +38 -0
- data/spec/datashift/method_binding_spec.rb +60 -0
- data/spec/datashift/model_method_spec.rb +109 -0
- data/spec/datashift/model_methods_catalogue.rb +111 -0
- data/spec/datashift/model_methods_collection_spec.rb +138 -0
- data/spec/datashift/model_methods_manager_spec.rb +329 -0
- data/spec/datashift/populator_spec.rb +117 -0
- data/spec/datashift/thor_spec.rb +314 -0
- data/spec/datashift/transformation/factory_spec.rb +195 -0
- data/spec/datashift/transformation/transformer_remove_spec.rb +43 -0
- data/spec/dummy/Gemfile +53 -0
- data/spec/dummy/Gemfile.lock +197 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +16 -0
- data/spec/dummy/app/assets/javascripts/categories.js +2 -0
- data/spec/dummy/app/assets/javascripts/digitals.js +2 -0
- data/spec/dummy/app/assets/javascripts/empties.js +2 -0
- data/spec/dummy/app/assets/javascripts/loader_releases.js +2 -0
- data/spec/dummy/app/assets/javascripts/long_and_complex_table_linked_to_versions.js +2 -0
- data/spec/dummy/app/assets/javascripts/milestones.js +2 -0
- data/spec/dummy/app/assets/javascripts/owners.js +2 -0
- data/spec/dummy/app/assets/javascripts/projects.js +2 -0
- data/spec/dummy/app/assets/javascripts/users.js +2 -0
- data/spec/dummy/app/assets/javascripts/versions.js +2 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/assets/stylesheets/categories.css +4 -0
- data/spec/dummy/app/assets/stylesheets/digitals.css +4 -0
- data/spec/dummy/app/assets/stylesheets/empties.css +4 -0
- data/spec/dummy/app/assets/stylesheets/loader_releases.css +4 -0
- data/spec/dummy/app/assets/stylesheets/long_and_complex_table_linked_to_versions.css +4 -0
- data/spec/dummy/app/assets/stylesheets/milestones.css +4 -0
- data/spec/dummy/app/assets/stylesheets/owners.css +4 -0
- data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
- data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/spec/dummy/app/assets/stylesheets/users.css +4 -0
- data/spec/dummy/app/assets/stylesheets/versions.css +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/categories_controller.rb +58 -0
- data/spec/dummy/app/controllers/digitals_controller.rb +58 -0
- data/spec/dummy/app/controllers/empties_controller.rb +58 -0
- data/spec/dummy/app/controllers/loader_releases_controller.rb +58 -0
- data/spec/dummy/app/controllers/long_and_complex_table_linked_to_versions_controller.rb +58 -0
- data/spec/dummy/app/controllers/milestones_controller.rb +58 -0
- data/spec/dummy/app/controllers/owners_controller.rb +58 -0
- data/spec/dummy/app/controllers/projects_controller.rb +58 -0
- data/spec/dummy/app/controllers/users_controller.rb +58 -0
- data/spec/dummy/app/controllers/versions_controller.rb +58 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/categories_helper.rb +2 -0
- data/spec/dummy/app/helpers/digitals_helper.rb +2 -0
- data/spec/dummy/app/helpers/empties_helper.rb +2 -0
- data/spec/dummy/app/helpers/loader_releases_helper.rb +2 -0
- data/spec/dummy/app/helpers/long_and_complex_table_linked_to_versions_helper.rb +2 -0
- data/spec/dummy/app/helpers/milestones_helper.rb +2 -0
- data/spec/dummy/app/helpers/owners_helper.rb +2 -0
- data/spec/dummy/app/helpers/projects_helper.rb +2 -0
- data/spec/dummy/app/helpers/users_helper.rb +2 -0
- data/spec/dummy/app/helpers/versions_helper.rb +2 -0
- data/spec/dummy/app/models/category.rb +6 -0
- data/spec/dummy/app/models/digital.rb +22 -0
- data/spec/dummy/app/models/empty.rb +2 -0
- data/spec/dummy/app/models/loader_release.rb +10 -0
- data/spec/dummy/app/models/long_and_complex_table_linked_to_version.rb +6 -0
- data/spec/dummy/app/models/milestone.rb +15 -0
- data/spec/dummy/app/models/owner.rb +13 -0
- data/spec/dummy/app/models/project.rb +53 -0
- data/spec/dummy/app/models/user.rb +5 -0
- data/spec/dummy/app/models/version.rb +7 -0
- data/spec/dummy/app/views/categories/_form.html.erb +17 -0
- data/spec/dummy/app/views/categories/edit.html.erb +6 -0
- data/spec/dummy/app/views/categories/index.html.erb +25 -0
- data/spec/dummy/app/views/categories/new.html.erb +5 -0
- data/spec/dummy/app/views/categories/show.html.erb +4 -0
- data/spec/dummy/app/views/digitals/_form.html.erb +17 -0
- data/spec/dummy/app/views/digitals/edit.html.erb +6 -0
- data/spec/dummy/app/views/digitals/index.html.erb +25 -0
- data/spec/dummy/app/views/digitals/new.html.erb +5 -0
- data/spec/dummy/app/views/digitals/show.html.erb +4 -0
- data/spec/dummy/app/views/empties/_form.html.erb +17 -0
- data/spec/dummy/app/views/empties/edit.html.erb +6 -0
- data/spec/dummy/app/views/empties/index.html.erb +25 -0
- data/spec/dummy/app/views/empties/new.html.erb +5 -0
- data/spec/dummy/app/views/empties/show.html.erb +4 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/loader_releases/_form.html.erb +17 -0
- data/spec/dummy/app/views/loader_releases/edit.html.erb +6 -0
- data/spec/dummy/app/views/loader_releases/index.html.erb +25 -0
- data/spec/dummy/app/views/loader_releases/new.html.erb +5 -0
- data/spec/dummy/app/views/loader_releases/show.html.erb +4 -0
- data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/_form.html.erb +17 -0
- data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/edit.html.erb +6 -0
- data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/index.html.erb +25 -0
- data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/new.html.erb +5 -0
- data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/show.html.erb +4 -0
- data/spec/dummy/app/views/milestones/_form.html.erb +17 -0
- data/spec/dummy/app/views/milestones/edit.html.erb +6 -0
- data/spec/dummy/app/views/milestones/index.html.erb +25 -0
- data/spec/dummy/app/views/milestones/new.html.erb +5 -0
- data/spec/dummy/app/views/milestones/show.html.erb +4 -0
- data/spec/dummy/app/views/owners/_form.html.erb +17 -0
- data/spec/dummy/app/views/owners/edit.html.erb +6 -0
- data/spec/dummy/app/views/owners/index.html.erb +25 -0
- data/spec/dummy/app/views/owners/new.html.erb +5 -0
- data/spec/dummy/app/views/owners/show.html.erb +4 -0
- data/spec/dummy/app/views/projects/_form.html.erb +17 -0
- data/spec/dummy/app/views/projects/edit.html.erb +6 -0
- data/spec/dummy/app/views/projects/index.html.erb +25 -0
- data/spec/dummy/app/views/projects/new.html.erb +5 -0
- data/spec/dummy/app/views/projects/show.html.erb +4 -0
- data/spec/dummy/app/views/users/_form.html.erb +17 -0
- data/spec/dummy/app/views/users/edit.html.erb +6 -0
- data/spec/dummy/app/views/users/index.html.erb +25 -0
- data/spec/dummy/app/views/users/new.html.erb +5 -0
- data/spec/dummy/app/views/users/show.html.erb +4 -0
- data/spec/dummy/app/views/versions/_form.html.erb +17 -0
- data/spec/dummy/app/views/versions/edit.html.erb +6 -0
- data/spec/dummy/app/views/versions/index.html.erb +25 -0
- data/spec/dummy/app/views/versions/new.html.erb +5 -0
- data/spec/dummy/app/views/versions/show.html.erb +4 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +9 -0
- data/spec/dummy/bin/rake +9 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/bin/spring +16 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +26 -0
- data/spec/dummy/config/boot.rb +3 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +76 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20110803201325_create_test_bed.rb +98 -0
- data/spec/dummy/db/migrate/20121009161700_add_digitals.rb +24 -0
- data/spec/dummy/db/migrate/20161005123106_create_digitals.rb +8 -0
- data/spec/dummy/db/migrate/20161005123106_create_long_and_complex_table_linked_to_versions.rb +8 -0
- data/spec/dummy/db/migrate/20161005123107_create_loader_releases.rb +8 -0
- data/spec/dummy/db/migrate/20161005123108_create_owners.rb +8 -0
- data/spec/dummy/db/migrate/20161005123109_create_empties.rb +8 -0
- data/spec/dummy/db/migrate/20161005123110_create_projects.rb +8 -0
- data/spec/dummy/db/migrate/20161005123111_create_users.rb +8 -0
- data/spec/dummy/db/migrate/20161005123111_create_versions.rb +8 -0
- data/spec/dummy/db/migrate/20161005123112_create_milestones.rb +8 -0
- data/spec/dummy/db/migrate/20161005123113_create_categories.rb +8 -0
- data/spec/dummy/db/schema.rb +93 -0
- data/spec/dummy/db/seeds.rb +9 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +69 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/robots.txt +5 -0
- data/spec/dummy/sandbox_example.thor +4 -0
- data/spec/dummy/test/controllers/categories_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/digitals_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/empties_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/loader_releases_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/long_and_complex_table_linked_to_versions_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/milestones_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/owners_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/projects_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/users_controller_test.rb +49 -0
- data/spec/dummy/test/controllers/versions_controller_test.rb +49 -0
- data/spec/dummy/test/factories/categories.rb +5 -0
- data/spec/dummy/test/factories/digitals.rb +5 -0
- data/spec/dummy/test/factories/empties.rb +5 -0
- data/spec/dummy/test/factories/loader_releases.rb +5 -0
- data/spec/dummy/test/factories/long_and_complex_table_linked_to_versions.rb +5 -0
- data/spec/dummy/test/factories/milestones.rb +5 -0
- data/spec/dummy/test/factories/owners.rb +5 -0
- data/spec/dummy/test/factories/projects.rb +5 -0
- data/spec/dummy/test/factories/users.rb +5 -0
- data/spec/dummy/test/factories/versions.rb +5 -0
- data/spec/dummy/test/models/category_test.rb +7 -0
- data/spec/dummy/test/models/digital_test.rb +7 -0
- data/spec/dummy/test/models/empty_test.rb +7 -0
- data/spec/dummy/test/models/loader_release_test.rb +7 -0
- data/spec/dummy/test/models/long_and_complex_table_linked_to_version_test.rb +7 -0
- data/spec/dummy/test/models/milestone_test.rb +7 -0
- data/spec/dummy/test/models/owner_test.rb +7 -0
- data/spec/dummy/test/models/project_test.rb +7 -0
- data/spec/dummy/test/models/user_test.rb +7 -0
- data/spec/dummy/test/models/version_test.rb +7 -0
- data/spec/dummy/test/test_helper.rb +10 -0
- data/spec/exporters/csv_exporter_spec.rb +240 -0
- data/spec/exporters/csv_generator_spec.rb +139 -0
- data/spec/exporters/excel_exporter_spec.rb +193 -0
- data/spec/exporters/excel_generator_spec.rb +181 -0
- data/spec/exporters/generator_base_spec.rb +45 -0
- data/spec/factories/categories.rb +7 -0
- data/spec/factories/factories.rb +18 -0
- data/spec/factories/milestone.rb +16 -0
- data/spec/factories/projects.rb +41 -0
- data/spec/fixtures/BadAssociationName.xls +0 -0
- data/spec/fixtures/DemoNegativeTesting.xls +0 -0
- data/spec/fixtures/ProjectConfiguration.yml +18 -0
- data/spec/fixtures/ProjectsMultiCategories.xls +0 -0
- data/spec/fixtures/ProjectsMultiCategoriesHeaderLookup.xls +0 -0
- data/spec/fixtures/ProjectsSingleCategories.xls +0 -0
- data/spec/fixtures/ProjectsSingleCategories.xlsx +0 -0
- data/spec/fixtures/SimpleProjects.xls +0 -0
- data/spec/fixtures/config/database.yml +28 -0
- data/spec/fixtures/csv/BadAssociationName.csv +6 -0
- data/spec/fixtures/csv/DemoNegativeTesting.csv +6 -0
- data/spec/fixtures/csv/ProjectsMultiCategories.csv +5 -0
- data/spec/fixtures/csv/ProjectsMultiCategoriesHeaderLookup.csv +5 -0
- data/spec/fixtures/csv/ProjectsSingleCategories.csv +5 -0
- data/spec/fixtures/csv/SimpleProjects.csv +4 -0
- data/spec/fixtures/db/migrate/20110803201325_create_test_bed.rb +98 -0
- data/spec/fixtures/db/migrate/20121009161700_add_digitals.rb +24 -0
- data/spec/fixtures/db/seeds.rb +9 -0
- data/spec/fixtures/images/DEMO_001_ror_bag.jpeg +0 -0
- data/spec/fixtures/images/DEMO_002_Powerstation.jpeg +0 -0
- data/spec/fixtures/images/DEMO_003_ror_mug.jpeg +0 -0
- data/spec/fixtures/images/DEMO_004_ror_ringer.jpeg +0 -0
- data/spec/fixtures/load_datashift.thor +3 -0
- data/spec/fixtures/models/category.rb +6 -0
- data/spec/fixtures/models/digital.rb +22 -0
- data/spec/fixtures/models/empty.rb +2 -0
- data/spec/fixtures/models/loader_release.rb +10 -0
- data/spec/fixtures/models/long_and_complex_table_linked_to_version.rb +6 -0
- data/spec/fixtures/models/milestone.rb +15 -0
- data/spec/fixtures/models/owner.rb +13 -0
- data/spec/fixtures/models/project.rb +53 -0
- data/spec/fixtures/models/user.rb +5 -0
- data/spec/fixtures/models/version.rb +7 -0
- data/spec/fixtures/results/exp_project_assoc_headers.xls +0 -0
- data/spec/fixtures/results/exp_project_collection_spec.csv +2 -0
- data/spec/fixtures/results/exp_project_export.xls +0 -0
- data/spec/fixtures/results/exp_project_first_export.xls +0 -0
- data/spec/fixtures/results/exp_project_plus_assoc.xls +0 -0
- data/spec/fixtures/results/exp_project_plus_assoc_export_spec.csv +9 -0
- data/spec/fixtures/results/gen_project_plus_assoc_template.xls +0 -0
- data/spec/fixtures/results/gen_project_plus_some_assoc_template.xls +0 -0
- data/spec/fixtures/results/gen_project_template.xls +0 -0
- data/spec/fixtures/results/project_and_assoc_in_hash_export.xls +0 -0
- data/spec/fixtures/results/project_and_assoc_in_json_export.csv +9 -0
- data/spec/fixtures/results/project_and_assoc_in_json_export.xls +0 -0
- data/spec/fixtures/results/project_export_spec_with_custom_delim_,.csv +2 -0
- data/spec/fixtures/results/project_export_spec_with_custom_delim_/302/243.csv +2 -0
- data/spec/fixtures/results/project_export_spec_with_custom_delim_/302/247.csv +2 -0
- data/spec/fixtures/results/project_plus_assoc_template.csv +1 -0
- data/spec/fixtures/results/project_plus_some_assoc_template.csv +1 -0
- data/spec/fixtures/results/project_remove_export_spec.csv +2 -0
- data/spec/fixtures/results/project_template.csv +1 -0
- data/spec/fixtures/results/project_with_methods_export_spec.csv +2 -0
- data/spec/fixtures/results/thor_spec_gen_project.csv +1 -0
- data/spec/fixtures/sandbox_example.thor +4 -0
- data/spec/fixtures/simple_export_spec.xls +0 -0
- data/spec/fixtures/simple_template_spec.xls +0 -0
- data/spec/fixtures/test_model_defs.rb +7 -0
- data/spec/loaders/csv_loader_spec.rb +206 -0
- data/spec/loaders/data_flow_excel_loader_spec.rb +290 -0
- data/spec/loaders/excel_loader_failures_spec.rb +67 -0
- data/spec/loaders/excel_loader_spec.rb +294 -0
- data/spec/loaders/loader_base_spec.rb +29 -0
- data/spec/loaders/paperclip_loader_spec.rb +106 -0
- data/spec/log/datashift.log +14930 -0
- data/spec/private/digitals/1/DEMO_003_ror_mug.jpeg +0 -0
- data/spec/private/digitals/2/DEMO_002_Powerstation.jpeg +0 -0
- data/spec/private/digitals/3/DEMO_004_ror_ringer.jpeg +0 -0
- data/spec/private/digitals/4/DEMO_001_ror_bag.jpeg +0 -0
- data/spec/spec_helper.rb +26 -230
- data/spec/support/clear_and_manage_contexts.rb +25 -0
- data/spec/support/database_cleaner.rb +32 -0
- data/spec/support/datashift_test_helpers.rb +153 -0
- data/spec/support/files_paths_helper.rb +13 -0
- data/spec/support/fixtures/results/mapping_template.yaml +15 -0
- data/spec/support/sandbox.rb +136 -0
- metadata +804 -85
- data/README.markdown +0 -274
- data/README.rdoc +0 -19
- data/VERSION +0 -1
- data/datashift.gemspec +0 -48
- data/lib/applications/jruby/old_pre_proxy_jexcel_file.rb +0 -437
- data/lib/datashift/data_transforms.rb +0 -83
- data/lib/datashift/mapping_file_definitions.rb +0 -88
- data/lib/datashift/mapping_service.rb +0 -91
- data/lib/datashift/method_detail.rb +0 -165
- data/lib/datashift/method_details_manager.rb +0 -95
- data/lib/datashift/method_dictionary.rb +0 -281
- data/lib/datashift/method_mapper.rb +0 -174
- data/lib/datashift/thor_base.rb +0 -38
- data/lib/generators/mapping_generator.rb +0 -112
- data/lib/helpers/core_ext/csv_file.rb +0 -33
- data/lib/helpers/core_ext/to_b.rb +0 -24
- data/lib/loaders/reporter.rb +0 -58
- data/lib/thor/export.thor +0 -175
- data/lib/thor/generate.thor +0 -191
- data/lib/thor/import.thor +0 -110
- data/lib/thor/mapping.thor +0 -65
- data/lib/thor/tools.thor +0 -84
- data/spec/Gemfile +0 -31
- data/spec/Gemfile.lock +0 -134
- data/spec/csv_exporter_spec.rb +0 -144
- data/spec/csv_generator_spec.rb +0 -159
- data/spec/csv_loader_spec.rb +0 -212
- data/spec/datashift_spec.rb +0 -55
- data/spec/excel_exporter_spec.rb +0 -199
- data/spec/excel_generator_spec.rb +0 -203
- data/spec/excel_loader_spec.rb +0 -237
- data/spec/excel_spec.rb +0 -203
- data/spec/loader_base_spec.rb +0 -166
- data/spec/mapping_spec.rb +0 -117
- data/spec/method_dictionary_spec.rb +0 -300
- data/spec/method_mapper_spec.rb +0 -100
- data/spec/model_mapper_spec.rb +0 -41
- data/spec/paperclip_loader_spec.rb +0 -92
- data/spec/populator_spec.rb +0 -128
- data/spec/thor_spec.rb +0 -90
- data/tasks/file_tasks.rake +0 -37
- data/tasks/word_to_seedfu.rake +0 -167
data/lib/datashift/guards.rb
CHANGED
|
@@ -23,9 +23,8 @@
|
|
|
23
23
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
24
|
#++
|
|
25
25
|
|
|
26
|
-
|
|
27
26
|
# Details:: Active Record Loader
|
|
28
|
-
#
|
|
27
|
+
#
|
|
29
28
|
# To pull DataShift commands into your main application :
|
|
30
29
|
#
|
|
31
30
|
# require 'datashift'
|
|
@@ -33,14 +32,15 @@
|
|
|
33
32
|
# DataShift::load_commands
|
|
34
33
|
#
|
|
35
34
|
require 'rbconfig'
|
|
36
|
-
|
|
35
|
+
|
|
37
36
|
module DataShift
|
|
38
37
|
|
|
39
38
|
module Guards
|
|
40
39
|
|
|
41
40
|
def self.jruby?
|
|
42
|
-
|
|
41
|
+
RUBY_PLATFORM == 'java'
|
|
43
42
|
end
|
|
43
|
+
|
|
44
44
|
def self.mac?
|
|
45
45
|
RbConfig::CONFIG['target_os'] =~ /darwin/i
|
|
46
46
|
end
|
|
@@ -54,4 +54,4 @@ module DataShift
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
end
|
|
57
|
-
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2016
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# Date :: Feb 2016
|
|
4
|
+
# License:: MIT
|
|
5
|
+
#
|
|
6
|
+
# Details:: A column header
|
|
7
|
+
#
|
|
8
|
+
module DataShift
|
|
9
|
+
|
|
10
|
+
class Header
|
|
11
|
+
|
|
12
|
+
attr_accessor :source, :presentation
|
|
13
|
+
|
|
14
|
+
def initialize(source:)
|
|
15
|
+
@source = source
|
|
16
|
+
@presentation = source
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_s
|
|
20
|
+
presentation
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# License:: MIT
|
|
4
|
+
#
|
|
5
|
+
# Details:: Holds the current headers and any pre-processing
|
|
6
|
+
# mapping done on them
|
|
7
|
+
#
|
|
8
|
+
require 'forwardable'
|
|
9
|
+
|
|
10
|
+
module DataShift
|
|
11
|
+
|
|
12
|
+
# Acts as an array
|
|
13
|
+
|
|
14
|
+
class Headers
|
|
15
|
+
|
|
16
|
+
attr_accessor :source
|
|
17
|
+
|
|
18
|
+
# Row Index
|
|
19
|
+
attr_reader :idx
|
|
20
|
+
|
|
21
|
+
extend Forwardable
|
|
22
|
+
|
|
23
|
+
def_delegators :@headers, *Array.delegated_methods_for_fwdable
|
|
24
|
+
|
|
25
|
+
def initialize(source, idx = 0, headers = [])
|
|
26
|
+
@source = source
|
|
27
|
+
@idx = idx
|
|
28
|
+
@headers = headers
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Factory for dealing with Active Record models and collections
|
|
32
|
+
# Catalogs the supplied Klass and builds set of expected/valid Headers for Klass
|
|
33
|
+
#
|
|
34
|
+
def self.klass_to_headers(klass)
|
|
35
|
+
|
|
36
|
+
headers = Headers.new(klass)
|
|
37
|
+
|
|
38
|
+
headers.class_source_to_headers
|
|
39
|
+
|
|
40
|
+
DataShift::Transformation::Remove.new.unwanted_headers(headers)
|
|
41
|
+
|
|
42
|
+
headers
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Helpers for dealing with source = class, usually an Active Record model
|
|
46
|
+
# Catalogs the supplied Klass and builds set of expected/valid Headers for Klass
|
|
47
|
+
#
|
|
48
|
+
def class_source_to_headers
|
|
49
|
+
|
|
50
|
+
raise SourceIsNotAClass, 'Cannot parse source for headers - source must be a Class' unless source.is_a?(Class)
|
|
51
|
+
|
|
52
|
+
# TODO: This collection can now be sorted
|
|
53
|
+
collection = ModelMethods::Manager.catalog_class(source)
|
|
54
|
+
|
|
55
|
+
configuration = DataShift::Configuration.call
|
|
56
|
+
|
|
57
|
+
collection.each do |mm|
|
|
58
|
+
next if(DataShift::Transformation::Remove.new.association?(mm))
|
|
59
|
+
|
|
60
|
+
if(mm.association_type?)
|
|
61
|
+
association_to_headers(mm)
|
|
62
|
+
else
|
|
63
|
+
add mm.operator
|
|
64
|
+
end if(configuration.op_type_in_scope?(mm))
|
|
65
|
+
end if collection
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def association_to_headers( model_method )
|
|
69
|
+
|
|
70
|
+
configuration = DataShift::Configuration.call
|
|
71
|
+
|
|
72
|
+
if(configuration.expand_associations)
|
|
73
|
+
model_method.association_columns.each do |c|
|
|
74
|
+
add "#{model_method.operator}::#{c.name}"
|
|
75
|
+
end
|
|
76
|
+
else
|
|
77
|
+
add model_method.operator
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def add(source)
|
|
82
|
+
@headers << Header.new(source: source)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def sources
|
|
86
|
+
@headers.collect(&:source)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def row_index
|
|
90
|
+
idx
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2016
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# License:: MIT
|
|
4
|
+
#
|
|
5
|
+
# Details:: The basic raw Header info from a client - column heading, column indexx
|
|
6
|
+
# Column contains additional data such as lookup fields, defaults etc
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
module DataShift
|
|
10
|
+
|
|
11
|
+
module InboundData
|
|
12
|
+
|
|
13
|
+
class Column
|
|
14
|
+
|
|
15
|
+
attr_accessor :header, :index, :lookup_list, :data
|
|
16
|
+
|
|
17
|
+
def initialize(source, index = -1)
|
|
18
|
+
|
|
19
|
+
@header = DataShift::Header.new(source: source)
|
|
20
|
+
|
|
21
|
+
@index = index
|
|
22
|
+
@lookup_list = []
|
|
23
|
+
@data = []
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
delegate :source, to: :header
|
|
27
|
+
|
|
28
|
+
alias lookups lookup_list
|
|
29
|
+
|
|
30
|
+
def add_lookup( klass, field, where_value )
|
|
31
|
+
@lookup_list.unshift( LookupSupport.new(klass, field, where_value) )
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def find_by_operator
|
|
35
|
+
lookup_list.first ? lookup_list.first.field : ''
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def find_by_value
|
|
39
|
+
lookup_list.first ? lookup_list.first.value : ''
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# Date :: Jan 2015
|
|
4
|
+
# License:: MIT
|
|
5
|
+
#
|
|
6
|
+
# Details:: Store details of the inbound data from Excel,CSV files etc
|
|
7
|
+
|
|
8
|
+
module DataShift
|
|
9
|
+
|
|
10
|
+
module InboundData
|
|
11
|
+
|
|
12
|
+
# Store data supplied from client to find an instance of an object (e.g find Associations)
|
|
13
|
+
|
|
14
|
+
# Klass.where( @field => @where_value)
|
|
15
|
+
|
|
16
|
+
class LookupSupport
|
|
17
|
+
|
|
18
|
+
attr_reader :klass, :field, :where_value
|
|
19
|
+
|
|
20
|
+
def initialize(klass, in_name, where_value)
|
|
21
|
+
@klass = klass
|
|
22
|
+
@field = in_name
|
|
23
|
+
@where_value = where_value
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def find
|
|
27
|
+
klass.where( field => where_value )
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2011
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# Date :: Jan 2015
|
|
4
|
+
# License:: MIT
|
|
5
|
+
#
|
|
6
|
+
# Details:: Bind incoming data to it's associated domain model
|
|
7
|
+
# Link headers to the details of individual population methods
|
|
8
|
+
#
|
|
9
|
+
# Enables 'loaders' to iterate over the incoming data set, and assign
|
|
10
|
+
# values to domain object, without knowing anything about that receiving object.
|
|
11
|
+
#
|
|
12
|
+
require 'set'
|
|
13
|
+
|
|
14
|
+
module DataShift
|
|
15
|
+
|
|
16
|
+
class MethodBinding
|
|
17
|
+
|
|
18
|
+
include DataShift::Logging
|
|
19
|
+
|
|
20
|
+
attr_reader :model_method
|
|
21
|
+
|
|
22
|
+
attr_reader :inbound_column
|
|
23
|
+
|
|
24
|
+
delegate :source, to: :inbound_column, allow_nil: true
|
|
25
|
+
|
|
26
|
+
# Is this method detail a valid mapping, aids identifying unmapped/unmappable columns
|
|
27
|
+
attr_accessor :valid
|
|
28
|
+
|
|
29
|
+
# Store the raw (client supplied) name against the active record klass(model).
|
|
30
|
+
# Operator is the associated method call on klass,
|
|
31
|
+
# i.e client supplies name 'Price' in a spreadsheet,
|
|
32
|
+
# but true operator to call on klass is price
|
|
33
|
+
#
|
|
34
|
+
# type determines the style of operator call; simple assignment, an association or a method call
|
|
35
|
+
#
|
|
36
|
+
# col_types can typically be derived from klass.columns - set of ActiveRecord::ConnectionAdapters::Column
|
|
37
|
+
|
|
38
|
+
def initialize(name, idx, model_method)
|
|
39
|
+
@inbound_column = InboundData::Column.new(name, idx)
|
|
40
|
+
|
|
41
|
+
@model_method = model_method
|
|
42
|
+
|
|
43
|
+
@valid = (name && model_method) ? true : false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# TODO: - use delegators
|
|
47
|
+
def operator
|
|
48
|
+
model_method ? model_method.operator : ''
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def operator?(name, case_sensitive = false)
|
|
52
|
+
model_method ? model_method.operator?(name, case_sensitive) : false
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def klass
|
|
56
|
+
model_method.klass
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def class_name
|
|
60
|
+
model_method.klass.name
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def inbound_name
|
|
64
|
+
inbound_column.source
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def inbound_index
|
|
68
|
+
inbound_column.index
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def add_column_data(data)
|
|
72
|
+
inbound_column.data << data
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Example :
|
|
76
|
+
# Project:name:My Best Project
|
|
77
|
+
# User (klass) has_one project lookup where name(field) == 'My Best Project' (value)
|
|
78
|
+
# User.project.where( :name => 'My Best Project')
|
|
79
|
+
|
|
80
|
+
def add_lookup( model_method, field, value)
|
|
81
|
+
|
|
82
|
+
# check the finder method name is a valid field on the actual association class
|
|
83
|
+
klass = model_method.klass
|
|
84
|
+
|
|
85
|
+
association = klass.reflect_on_association(model_method.operator)
|
|
86
|
+
|
|
87
|
+
# TODO: - this is instance methods .. what about class methods ?
|
|
88
|
+
if association && association.klass.new.respond_to?(field)
|
|
89
|
+
inbound_column.add_lookup(association.klass, field, value)
|
|
90
|
+
logger.info("Complex Lookup specified for [#{model_method.operator}] : on field [#{field}] (optional value [#{value}])")
|
|
91
|
+
else
|
|
92
|
+
logger.error("Check MethodBinding [#{inbound_name}](#{inbound_index}) - Association field names are case sensitive")
|
|
93
|
+
raise NoSuchOperator.new("Field [#{field}] Not Found on Association [#{model_method.operator}] within Class #{klass.name}")
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def valid?
|
|
98
|
+
(@valid == true)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def invalid?
|
|
102
|
+
!valid?
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def pp
|
|
106
|
+
"Binding: Column [#{inbound_index}] : Header [#{inbound_name}] : Operator [#{model_method.operator}]"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def spp
|
|
110
|
+
"Column [#{inbound_index}] : Header [#{inbound_name}]"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
class NoMethodBinding < MethodBinding
|
|
116
|
+
|
|
117
|
+
attr_accessor :reason
|
|
118
|
+
|
|
119
|
+
def initialize(client_name = '', client_idx = -1, options = {})
|
|
120
|
+
super(client_name, client_idx, nil)
|
|
121
|
+
|
|
122
|
+
@reason = options[:reason] || ''
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def invalid?
|
|
126
|
+
!valid?
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def valid?
|
|
130
|
+
false
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def pp
|
|
134
|
+
"No Binding Found : Row [#{inbound_index}] : Header [#{inbound_name}]"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
@@ -1,25 +1,50 @@
|
|
|
1
1
|
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
2
|
# Author :: Tom Statter
|
|
3
3
|
# Date :: March 2015
|
|
4
|
-
# License::
|
|
4
|
+
# License:: MI
|
|
5
5
|
#
|
|
6
6
|
# Details:: Manage the current loader object
|
|
7
7
|
#
|
|
8
|
-
|
|
9
|
-
require 'logging'
|
|
10
|
-
|
|
8
|
+
#
|
|
11
9
|
module DataShift
|
|
12
10
|
|
|
13
|
-
class LoadObject
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
class LoadObject < SimpleDelegator
|
|
12
|
+
|
|
13
|
+
attr_accessor :instance
|
|
14
|
+
|
|
15
|
+
def initialize(current_object)
|
|
16
|
+
super
|
|
17
|
+
@instance = current_object
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# delegate :errors, to: :instance
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
# This method usually called during processing to avoid errors with associations like
|
|
23
|
+
# <ActiveRecord::RecordNotSaved: You cannot call create unless the parent is saved>
|
|
24
|
+
# If the object is still invalid at this point probably indicates compulsory
|
|
25
|
+
# columns on model have not been processed before associations on that model
|
|
26
|
+
#
|
|
27
|
+
def save_if_new
|
|
28
|
+
return false unless instance && instance.new_record?
|
|
18
29
|
|
|
19
|
-
|
|
20
|
-
|
|
30
|
+
return instance.save if instance.valid?
|
|
31
|
+
|
|
32
|
+
raise SaveError, "Cannot Save #{instance.class} : #{instance.errors.full_messages.inspect}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
=begin
|
|
38
|
+
def method_missing(method, *args, &block)
|
|
39
|
+
raise "Cannot call [#{method}] on : #{instance.class.name}"
|
|
40
|
+
if instance.respond_to? method
|
|
41
|
+
instance.send(method, *args, &block)
|
|
42
|
+
else
|
|
43
|
+
raise "Cannot call [#{method}] on : #{instance.class.name}"
|
|
44
|
+
end
|
|
21
45
|
end
|
|
22
|
-
|
|
46
|
+
=end
|
|
47
|
+
|
|
23
48
|
end
|
|
24
|
-
|
|
49
|
+
|
|
25
50
|
end
|
data/lib/datashift/logging.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
2
|
# Author :: Tom Statter
|
|
3
3
|
# Date :: Aug 2012
|
|
4
4
|
# License:: Free, Open Source. MIT.
|
|
@@ -6,53 +6,80 @@
|
|
|
6
6
|
# Details:: Logging facilities for datashift.
|
|
7
7
|
#
|
|
8
8
|
require 'fileutils'
|
|
9
|
-
|
|
9
|
+
require 'singleton'
|
|
10
|
+
|
|
10
11
|
module DataShift
|
|
11
12
|
|
|
12
13
|
module Logging
|
|
13
|
-
|
|
14
|
+
|
|
14
15
|
class MultiIO
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
|
|
17
|
+
include Singleton
|
|
18
|
+
|
|
19
|
+
attr_reader :targets
|
|
20
|
+
|
|
21
|
+
def initialize
|
|
17
22
|
@targets = []
|
|
18
|
-
|
|
23
|
+
@names = []
|
|
19
24
|
end
|
|
20
25
|
|
|
21
|
-
def
|
|
22
|
-
@
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@targets.each {|t| t.send(method, *args, &block) }
|
|
26
|
+
def add_file(target)
|
|
27
|
+
unless @names.include?(target)
|
|
28
|
+
puts "Logging going to target [#{target}]"
|
|
29
|
+
add( File.open(target, 'a') )
|
|
30
|
+
@names << target
|
|
31
|
+
end
|
|
28
32
|
end
|
|
29
|
-
|
|
33
|
+
|
|
30
34
|
def verbose
|
|
31
35
|
add(STDOUT)
|
|
32
36
|
end
|
|
33
|
-
|
|
37
|
+
|
|
38
|
+
def method_missing(method, *args, &block)
|
|
39
|
+
@targets.each { |t| t.send(method, *args, &block) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def add(target)
|
|
45
|
+
@targets << Logger.new(target)
|
|
46
|
+
end
|
|
47
|
+
|
|
34
48
|
end
|
|
35
|
-
|
|
49
|
+
|
|
36
50
|
require 'logger'
|
|
37
|
-
|
|
51
|
+
|
|
52
|
+
def logdir=(x)
|
|
53
|
+
@logdir = x
|
|
54
|
+
end
|
|
55
|
+
|
|
38
56
|
def logdir
|
|
39
57
|
@logdir ||= 'log'
|
|
40
58
|
@logdir
|
|
41
59
|
end
|
|
42
|
-
|
|
60
|
+
|
|
43
61
|
def logger
|
|
44
|
-
@
|
|
45
|
-
@
|
|
62
|
+
@mutli_logger ||= open
|
|
63
|
+
@mutli_logger
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def verbose
|
|
67
|
+
@verbose_logger ||= logger.add(STDOUT)
|
|
46
68
|
end
|
|
47
|
-
|
|
69
|
+
|
|
48
70
|
private
|
|
49
|
-
|
|
71
|
+
|
|
50
72
|
def open( log = 'datashift.log')
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
73
|
+
FileUtils.mkdir(logdir) unless File.directory?(logdir)
|
|
74
|
+
|
|
75
|
+
MultiIO.instance.add_file(File.join(logdir, log))
|
|
76
|
+
|
|
77
|
+
ActiveRecord::Base.logger = MultiIO.instance if defined?(ActiveRecord) && ActiveRecord::Base.logger
|
|
78
|
+
|
|
79
|
+
verbose if(DataShift::Configuration.call.verbose)
|
|
80
|
+
|
|
81
|
+
MultiIO.instance
|
|
55
82
|
end
|
|
56
83
|
end
|
|
57
|
-
|
|
84
|
+
|
|
58
85
|
end
|