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/excel_base.rb
CHANGED
|
@@ -1,123 +1,135 @@
|
|
|
1
|
-
|
|
2
|
-
# and open the template in the editor.
|
|
1
|
+
module DataShift
|
|
3
2
|
|
|
4
|
-
module ExcelBase
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def sanitize_sheet_name( name )
|
|
9
|
-
name.gsub(/[\[\]:\*\/\\\?]/, '')
|
|
10
|
-
end
|
|
3
|
+
module ExcelBase
|
|
11
4
|
|
|
5
|
+
def self.max_columns
|
|
6
|
+
1024
|
|
7
|
+
end
|
|
12
8
|
|
|
13
|
-
|
|
14
|
-
# so you can call direct like excel.parse_headers(options[:header_row])
|
|
15
|
-
# rather than
|
|
16
|
-
# sheet = excel.worksheet( sheet_number )
|
|
17
|
-
# parse_headers(sheet, options[:header_row])
|
|
9
|
+
attr_accessor :excel, :sheet
|
|
18
10
|
|
|
19
|
-
|
|
11
|
+
# Create @excel and set @sheet
|
|
12
|
+
#
|
|
13
|
+
# Options :
|
|
14
|
+
#
|
|
15
|
+
# :sheet_name : Create a new worksheet assign to @sheet.
|
|
16
|
+
# Default is class.name
|
|
17
|
+
#
|
|
18
|
+
def start_excel(klass, options = {})
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
@excel = DataShift::Excel.new
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
name = options[:sheet_name] ? options[:sheet_name] : klass.name
|
|
24
23
|
|
|
25
|
-
|
|
24
|
+
@sheet = excel.create_worksheet( name: name )
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
unless sheet
|
|
27
|
+
logger.error("Excel failed to create WorkSheet called [#{name}]")
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
raise "Failed to create Excel WorkSheet called [#{name}]"
|
|
30
|
+
end
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
# There is no actual max columns in Excel .. you will run out of memory though at some point
|
|
33
|
-
(0..1024).each do |column|
|
|
34
|
-
cell = header_row[column]
|
|
35
|
-
break unless cell
|
|
36
|
-
header = "#{cell.to_s}".strip
|
|
37
|
-
break if header.empty?
|
|
38
|
-
@excel_headers << header
|
|
32
|
+
@excel
|
|
39
33
|
end
|
|
40
34
|
|
|
41
|
-
@
|
|
42
|
-
|
|
35
|
+
# Open excel file and assign to @excel and set @sheet
|
|
36
|
+
#
|
|
37
|
+
# Options :
|
|
38
|
+
#
|
|
39
|
+
# :sheet_name : Create a new worksheet assign to @sheet. Default is class.name
|
|
40
|
+
#
|
|
41
|
+
# :sheet_number : Select the sheet by index - sheet_name takes precedence
|
|
42
|
+
#
|
|
43
|
+
def open_excel( file_name, options = {})
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
# Specify array of operators/associations to include - possible values are :
|
|
46
|
-
# [:assignment, :belongs_to, :has_one, :has_many]
|
|
45
|
+
@excel = DataShift::Excel.new
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
return if( !records.first.is_a?(ActiveRecord::Base) || records.empty?)
|
|
47
|
+
@excel.open(file_name)
|
|
50
48
|
|
|
51
|
-
|
|
49
|
+
if options[:sheet_name]
|
|
52
50
|
|
|
53
|
-
|
|
51
|
+
@sheet = @excel.create_worksheet( name: options[:sheet_name] )
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
unless sheet
|
|
54
|
+
logger.error("Excel failed to create WorkSheet for #{name}")
|
|
57
55
|
|
|
58
|
-
|
|
56
|
+
raise "Failed to create Excel WorkSheet for #{name}"
|
|
57
|
+
end
|
|
59
58
|
|
|
60
|
-
|
|
59
|
+
elsif options[:sheet_number]
|
|
60
|
+
@sheet = @excel.worksheet( options[:sheet_number] )
|
|
61
|
+
else
|
|
62
|
+
@sheet = @excel.worksheets.first
|
|
63
|
+
end
|
|
61
64
|
|
|
62
|
-
|
|
65
|
+
@excel
|
|
66
|
+
end
|
|
63
67
|
|
|
64
|
-
|
|
68
|
+
def parse_headers( sheet, header_row_idx = 0 )
|
|
65
69
|
|
|
66
|
-
|
|
70
|
+
headers = DataShift::Headers.new(:excel, header_row_idx)
|
|
67
71
|
|
|
68
|
-
|
|
69
|
-
|
|
72
|
+
header_row = sheet.row(header_row_idx)
|
|
73
|
+
unless header_row
|
|
74
|
+
raise MissingHeadersError,
|
|
75
|
+
"No headers found - Check Sheet #{sheet} is complete and Row #{header_row_idx} contains headers"
|
|
76
|
+
end
|
|
70
77
|
|
|
71
|
-
|
|
78
|
+
# TODO: - make more robust - currently end on first empty column
|
|
79
|
+
# There is no actual max columns in Excel .. you will run out of memory though at some point
|
|
80
|
+
(0..ExcelBase.max_columns).each do |column|
|
|
81
|
+
cell = header_row[column]
|
|
82
|
+
break unless cell
|
|
83
|
+
header = cell.to_s.strip
|
|
84
|
+
break if header.empty?
|
|
85
|
+
headers << header
|
|
86
|
+
end
|
|
72
87
|
|
|
73
|
-
headers
|
|
88
|
+
headers
|
|
74
89
|
end
|
|
75
90
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
91
|
+
def sanitize_sheet_name( name )
|
|
92
|
+
name.gsub(/[\[\]:\*\/\\\?]/, '')
|
|
93
|
+
end
|
|
79
94
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
95
|
+
# Pass a set of AR records
|
|
96
|
+
def ar_to_xls(records, options = {})
|
|
97
|
+
return if !records.first.is_a?(ActiveRecord::Base) || records.empty?
|
|
83
98
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
0
|
|
87
|
-
else
|
|
88
|
-
ar_to_headers( records )
|
|
89
|
-
1
|
|
90
|
-
end
|
|
99
|
+
# assume headers present
|
|
100
|
+
row_index = (options[:start_row]) ? (options[:start_row]) : 1
|
|
91
101
|
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
records.each do |record|
|
|
103
|
+
ar_to_xls_row(row_index, 0, record)
|
|
94
104
|
|
|
95
|
-
|
|
105
|
+
row_index += 1
|
|
106
|
+
end
|
|
96
107
|
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
108
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
# Save data from an AR record to the current row, based on the record's columns [c1,c2,c3]
|
|
110
|
+
# Returns the number of the final column written to
|
|
111
|
+
def ar_to_xls_row(row, start_column, record)
|
|
112
|
+
return unless record.is_a?(ActiveRecord::Base)
|
|
113
|
+
|
|
114
|
+
column = start_column
|
|
115
|
+
record.class.columns.each do |connection_column|
|
|
116
|
+
ar_to_xls_cell(row, column, record, connection_column)
|
|
117
|
+
column += 1
|
|
118
|
+
end
|
|
119
|
+
column
|
|
109
120
|
end
|
|
110
|
-
column
|
|
111
|
-
end
|
|
112
121
|
|
|
113
|
-
|
|
114
|
-
|
|
122
|
+
def ar_to_xls_cell(row, column, record, connection_column)
|
|
123
|
+
|
|
115
124
|
datum = record.send(connection_column.name)
|
|
116
125
|
|
|
117
126
|
self[row, column] = datum
|
|
118
127
|
rescue => e
|
|
119
|
-
|
|
120
|
-
|
|
128
|
+
logger.error("Failed to export #{datum} from #{connection_column.inspect} to column #{column}")
|
|
129
|
+
logger.error( e.message )
|
|
130
|
+
logger.error(e.backtrace)
|
|
131
|
+
|
|
121
132
|
end
|
|
122
133
|
end
|
|
134
|
+
|
|
123
135
|
end
|
data/lib/datashift/exceptions.rb
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2014
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2014
|
|
2
2
|
# Author :: Tom Statter
|
|
3
3
|
# Date :: June 2014
|
|
4
4
|
# License:: Free, Open Source.
|
|
5
5
|
#
|
|
6
6
|
|
|
7
7
|
module DataShift
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
class DataShiftException < StandardError
|
|
10
10
|
|
|
11
11
|
include DataShift::Logging
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
def initialize( msg )
|
|
14
14
|
super
|
|
15
|
-
logger.error(
|
|
15
|
+
logger.error(msg)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
def self.generate
|
|
18
|
+
def self.generate(name)
|
|
19
19
|
new_class = Class.new(DataShiftException) do
|
|
20
20
|
def initialize( msg )
|
|
21
21
|
super( msg )
|
|
@@ -26,35 +26,37 @@ module DataShift
|
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
def initialize( msg )
|
|
31
|
-
super( msg )
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
class BadRuby < StandardError; end
|
|
36
|
-
|
|
37
|
-
class UnsupportedFileType < StandardError; end
|
|
38
|
-
class BadFile < StandardError; end
|
|
39
|
-
|
|
40
|
-
class MappingDefinitionError < StandardError; end
|
|
29
|
+
# Non self logging errors
|
|
41
30
|
|
|
31
|
+
class BadConfig < StandardError; end
|
|
32
|
+
class BadFile < StandardError; end
|
|
33
|
+
class BadRuby < StandardError; end
|
|
34
|
+
class BadUri < StandardError; end
|
|
42
35
|
|
|
36
|
+
class MappingDefinitionError < StandardError; end
|
|
43
37
|
class MissingHeadersError < StandardError; end
|
|
44
38
|
class MissingMandatoryError < StandardError; end
|
|
45
39
|
|
|
46
40
|
class PathError < StandardError; end
|
|
47
|
-
|
|
48
|
-
class BadUri < StandardError; end
|
|
49
41
|
|
|
42
|
+
class RuntimeError < StandardError; end
|
|
43
|
+
|
|
44
|
+
class UnsupportedFileType < StandardError; end
|
|
50
45
|
end
|
|
51
46
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
DataShift::DataShiftException.generate(
|
|
55
|
-
DataShift::DataShiftException.generate(
|
|
56
|
-
DataShift::DataShiftException.generate(
|
|
57
|
-
DataShift::DataShiftException.generate(
|
|
58
|
-
DataShift::DataShiftException.generate(
|
|
59
|
-
DataShift::DataShiftException.generate(
|
|
60
|
-
DataShift::DataShiftException.generate(
|
|
47
|
+
# Self logging errors
|
|
48
|
+
|
|
49
|
+
DataShift::DataShiftException.generate( 'BadOperatorType')
|
|
50
|
+
DataShift::DataShiftException.generate( 'ConnectionError')
|
|
51
|
+
DataShift::DataShiftException.generate( 'CouldNotAssignAssociation')
|
|
52
|
+
DataShift::DataShiftException.generate( 'CouldNotDeriveAssociationClass')
|
|
53
|
+
DataShift::DataShiftException.generate( 'CreateAttachmentFailed')
|
|
54
|
+
DataShift::DataShiftException.generate( 'DataProcessingError')
|
|
55
|
+
DataShift::DataShiftException.generate( 'FileNotFound')
|
|
56
|
+
DataShift::DataShiftException.generate( 'NilDataSuppliedError')
|
|
57
|
+
DataShift::DataShiftException.generate( 'NoSuchClassError')
|
|
58
|
+
DataShift::DataShiftException.generate( 'NoSuchOperator')
|
|
59
|
+
DataShift::DataShiftException.generate( 'MissingConfigOptionError')
|
|
60
|
+
DataShift::DataShiftException.generate( 'RecordNotFound')
|
|
61
|
+
DataShift::DataShiftException.generate( 'SaveError')
|
|
62
|
+
DataShift::DataShiftException.generate( 'SourceIsNotAClass')
|
|
@@ -59,10 +59,10 @@ module FileDefinitions
|
|
|
59
59
|
attr_accessor :current_line
|
|
60
60
|
|
|
61
61
|
# Set the delimiter to use when splitting a line - can be either a String, or a Regexp
|
|
62
|
-
attr_writer
|
|
62
|
+
attr_writer :field_delim
|
|
63
63
|
|
|
64
|
-
def initialize( line
|
|
65
|
-
@key
|
|
64
|
+
def initialize( line = nil )
|
|
65
|
+
@key = ''
|
|
66
66
|
parse(line) unless line.nil?
|
|
67
67
|
end
|
|
68
68
|
|
|
@@ -72,10 +72,9 @@ module FileDefinitions
|
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
def self.subclasses
|
|
75
|
-
@subclasses ||=[]
|
|
75
|
+
@subclasses ||= []
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
-
|
|
79
78
|
# Return the field delimiter used when splitting a line
|
|
80
79
|
def field_delim
|
|
81
80
|
@field_delim || ','
|
|
@@ -84,14 +83,14 @@ module FileDefinitions
|
|
|
84
83
|
# Parse each line of a file based on the field definition, yields self for each successive line
|
|
85
84
|
#
|
|
86
85
|
def each( file )
|
|
87
|
-
File
|
|
86
|
+
File.new(file).each_line do |line|
|
|
88
87
|
parse( line )
|
|
89
88
|
yield self
|
|
90
89
|
end
|
|
91
90
|
end
|
|
92
91
|
|
|
93
92
|
def fields
|
|
94
|
-
@fields = self.class.field_definition.collect {|f| instance_variable_get "@#{f}" }
|
|
93
|
+
@fields = self.class.field_definition.collect { |f| instance_variable_get "@#{f}" }
|
|
95
94
|
@fields
|
|
96
95
|
end
|
|
97
96
|
|
|
@@ -128,16 +127,18 @@ module FileDefinitions
|
|
|
128
127
|
def add_field(field, add_accessor = true)
|
|
129
128
|
@field_definition ||= []
|
|
130
129
|
@field_definition << field.to_s
|
|
131
|
-
attr_accessor field if
|
|
130
|
+
attr_accessor field if add_accessor
|
|
132
131
|
end
|
|
133
132
|
|
|
134
|
-
|
|
135
133
|
# Helper to generate methods that return the complete list of fixed width fields
|
|
136
134
|
# and associated ranges in this File definition, and parse a line.
|
|
137
135
|
# e.g create_field_definition %w{ trade_id drOrCr ccy costCentre postingDate amount }
|
|
138
136
|
#
|
|
139
137
|
def create_fixed_definition( field_range_map )
|
|
140
|
-
|
|
138
|
+
|
|
139
|
+
unless field_range_map.is_a?(Hash)
|
|
140
|
+
raise ArgumentError, 'Please supply hash to create_fixed_definition'
|
|
141
|
+
end
|
|
141
142
|
|
|
142
143
|
keys = field_range_map.keys.collect(&:to_s)
|
|
143
144
|
string_map = Hash[*keys.zip(field_range_map.values).flatten]
|
|
@@ -172,10 +173,9 @@ module FileDefinitions
|
|
|
172
173
|
|
|
173
174
|
# Create accessors for each field
|
|
174
175
|
def create_field_attr_accessors
|
|
175
|
-
|
|
176
|
+
field_definition.each { |f| attr_accessor f }
|
|
176
177
|
end
|
|
177
178
|
|
|
178
|
-
|
|
179
179
|
###############################
|
|
180
180
|
# PARSING + FILE MANIPULATION #
|
|
181
181
|
###############################
|
|
@@ -185,15 +185,13 @@ module FileDefinitions
|
|
|
185
185
|
limit = options[:limit]
|
|
186
186
|
count = 0
|
|
187
187
|
lines = []
|
|
188
|
-
File
|
|
188
|
+
File.new(file).each_line do |line|
|
|
189
189
|
break if limit && ((count += 1) > limit)
|
|
190
|
-
lines <<
|
|
190
|
+
lines << new( line )
|
|
191
191
|
end
|
|
192
192
|
lines
|
|
193
193
|
end
|
|
194
194
|
|
|
195
|
-
|
|
196
|
-
|
|
197
195
|
# Split a file, whose field definition is represented by self,
|
|
198
196
|
# into seperate streams, based on the values of one if it's fields.
|
|
199
197
|
#
|
|
@@ -216,9 +214,13 @@ module FileDefinitions
|
|
|
216
214
|
unless filtered.empty?
|
|
217
215
|
log :info, "Writing seperate streams to #{path}"
|
|
218
216
|
|
|
219
|
-
filtered.each
|
|
217
|
+
filtered.each do |strm, objects|
|
|
218
|
+
RecsBase.write( { "keys_#{field}_#{strm}.csv" => objects.collect(&:key).join("\n") }, path)
|
|
219
|
+
end if options.key?(:keys)
|
|
220
220
|
|
|
221
|
-
filtered.each
|
|
221
|
+
filtered.each do |strm, objects|
|
|
222
|
+
RecsBase.write( { "#{field}_#{strm}.csv" => objects.collect(&:current_line).join("\n") }, path)
|
|
223
|
+
end
|
|
222
224
|
end
|
|
223
225
|
end
|
|
224
226
|
|
|
@@ -247,19 +249,19 @@ module FileDefinitions
|
|
|
247
249
|
|
|
248
250
|
filtered = {}
|
|
249
251
|
|
|
250
|
-
if
|
|
252
|
+
if new.respond_to?(field)
|
|
251
253
|
|
|
252
254
|
log :info, "Splitting on #{field}"
|
|
253
255
|
|
|
254
256
|
File.open( file_name ) do |t|
|
|
255
257
|
t.each do |line|
|
|
256
|
-
next unless
|
|
257
|
-
x =
|
|
258
|
+
next unless line && line.chomp!
|
|
259
|
+
x = new(line)
|
|
258
260
|
|
|
259
|
-
value = x.send( field.to_sym )
|
|
261
|
+
value = x.send( field.to_sym ) # the actual field value from the specified field column
|
|
260
262
|
next if value.nil?
|
|
261
263
|
|
|
262
|
-
if
|
|
264
|
+
if regex.nil? || value.match(regex)
|
|
263
265
|
filtered[value] ? filtered[value] << x : filtered[value] = [x]
|
|
264
266
|
end
|
|
265
267
|
end
|
|
@@ -268,11 +270,11 @@ module FileDefinitions
|
|
|
268
270
|
log :warn, "Field [#{field}] nor defined for file definition #{self.class.name}"
|
|
269
271
|
end
|
|
270
272
|
|
|
271
|
-
if
|
|
273
|
+
if options[:sort]
|
|
272
274
|
filtered.values.each( &:sort )
|
|
273
275
|
return filtered
|
|
274
276
|
end
|
|
275
|
-
|
|
277
|
+
filtered
|
|
276
278
|
end
|
|
277
279
|
|
|
278
280
|
# Open and parse a file, replacing a value in the specfied field.
|
|
@@ -291,16 +293,17 @@ module FileDefinitions
|
|
|
291
293
|
#
|
|
292
294
|
def file_set_field_by_map( file_name, fields, value_map, regex = nil )
|
|
293
295
|
|
|
294
|
-
lines
|
|
296
|
+
lines = []
|
|
297
|
+
objects = []
|
|
295
298
|
|
|
296
|
-
if fields.is_a?(Array)
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
299
|
+
attribs = if fields.is_a?(Array)
|
|
300
|
+
fields
|
|
301
|
+
else
|
|
302
|
+
fields.to_s.split(',')
|
|
303
|
+
end
|
|
301
304
|
|
|
302
305
|
attribs.collect! do |attrib|
|
|
303
|
-
raise ArgumentError
|
|
306
|
+
raise ArgumentError, "Field: #{attrib} is not a field on #{self.class.name}" unless new.respond_to?(attrib)
|
|
304
307
|
end
|
|
305
308
|
|
|
306
309
|
log :info, "#{self.class.name} - updating field(s) #{fields} in #{file_name}"
|
|
@@ -309,14 +312,16 @@ module FileDefinitions
|
|
|
309
312
|
t.each do |line|
|
|
310
313
|
if line.chomp.empty?
|
|
311
314
|
lines << line
|
|
312
|
-
objects <<
|
|
315
|
+
objects << new
|
|
313
316
|
next
|
|
314
317
|
end
|
|
315
|
-
x =
|
|
318
|
+
x = new(line)
|
|
316
319
|
|
|
317
320
|
attribs.each do |a|
|
|
318
321
|
old_value = x.instance_variable_get( "@#{a}" )
|
|
319
|
-
|
|
322
|
+
if value_map[old_value] || (regex && old_value.keys.detect { |k| k.match(regx) })
|
|
323
|
+
x.instance_variable_set( "@#{a}", value_map[old_value] )
|
|
324
|
+
end
|
|
320
325
|
end
|
|
321
326
|
|
|
322
327
|
objects << x
|
|
@@ -324,9 +329,9 @@ module FileDefinitions
|
|
|
324
329
|
end
|
|
325
330
|
end
|
|
326
331
|
|
|
327
|
-
|
|
332
|
+
[lines, objects]
|
|
328
333
|
end
|
|
329
|
-
end
|
|
334
|
+
end # END class methods
|
|
330
335
|
|
|
331
336
|
# Open and parse a file, replacing a value in the specfied field.
|
|
332
337
|
# Does not update the file itself. Does not write a new output file.
|
|
@@ -345,9 +350,9 @@ module FileDefinitions
|
|
|
345
350
|
#
|
|
346
351
|
def file_set_field( file_name, field, old_value, new_value, regex = nil )
|
|
347
352
|
|
|
348
|
-
map = {old_value => new_value}
|
|
353
|
+
map = { old_value => new_value }
|
|
349
354
|
|
|
350
|
-
|
|
355
|
+
file_set_field_by_map(file_name, field, map, regex)
|
|
351
356
|
end
|
|
352
357
|
|
|
353
358
|
end
|