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
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
|
-
# Author :: Tom Statter
|
|
3
|
-
# Date :: March 2015
|
|
4
|
-
# License:: MIT
|
|
5
|
-
#
|
|
6
|
-
# Details:: Stores defaults, substitutions, over rides etc
|
|
7
|
-
# that can be applied to incoming data while being Populated
|
|
8
|
-
#
|
|
9
|
-
# WORK In PROGRESS
|
|
10
|
-
|
|
11
|
-
module DataShift
|
|
12
|
-
|
|
13
|
-
module Transformations
|
|
14
|
-
|
|
15
|
-
# Default values and over rides can be provided in Ruby/YAML ???? config file.
|
|
16
|
-
#
|
|
17
|
-
# Format :
|
|
18
|
-
#
|
|
19
|
-
# Load Class: (e.g Spree:Product)
|
|
20
|
-
# datashift_defaults:
|
|
21
|
-
# value_as_string: "Default Project Value"
|
|
22
|
-
# category: reference:category_002
|
|
23
|
-
#
|
|
24
|
-
# datashift_overrides:
|
|
25
|
-
# value_as_double: 99.23546
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
# datashift_substitutions:
|
|
29
|
-
#
|
|
30
|
-
#
|
|
31
|
-
|
|
32
|
-
class Base
|
|
33
|
-
|
|
34
|
-
include DataShift::Logging
|
|
35
|
-
|
|
36
|
-
# Map a Column to all relevant transforms
|
|
37
|
-
|
|
38
|
-
def configure_from(load_object_class, yaml_file)
|
|
39
|
-
|
|
40
|
-
data = YAML::load( ERB.new( IO.read(yaml_file) ).result )
|
|
41
|
-
|
|
42
|
-
if(data[load_object_class.name])
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Set a value to be used to populate Model.operator
|
|
47
|
-
# Generally over-rides will be used regardless of what value caller supplied.
|
|
48
|
-
def set( operator, value )
|
|
49
|
-
override_values[operator] = value
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def transforms
|
|
53
|
-
@transforms ||= {}
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def apply( operator, current_value )
|
|
57
|
-
if(transforms[operator])
|
|
58
|
-
perform_transformcurrent_value()
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def has_transform?( operator )
|
|
63
|
-
return override_values.has_key?(operator)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
class Substitution < Base
|
|
69
|
-
|
|
70
|
-
def type
|
|
71
|
-
:substitution
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
class Override < Base
|
|
76
|
-
|
|
77
|
-
def type
|
|
78
|
-
:override
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
end
|
|
83
|
-
end
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# This class provides a value map (hash) from a text mapping file
|
|
2
|
-
#
|
|
3
|
-
# The map file is a text file of delimeted key -> values pairs
|
|
4
|
-
#
|
|
5
|
-
# SUPPORTED FILE FORMATS:
|
|
6
|
-
#
|
|
7
|
-
# 2 column e.g. a,b
|
|
8
|
-
# creates a simple hash {a => b)
|
|
9
|
-
#
|
|
10
|
-
# 3 column e.g. a,b,c
|
|
11
|
-
# a,b becomes the key, c is the vaule
|
|
12
|
-
# creates a hash { [a,b] => c }
|
|
13
|
-
#
|
|
14
|
-
# 4 column e.g. a,b,c,d
|
|
15
|
-
# a,b becomes the key, c,d the value
|
|
16
|
-
# creates a hash { [a,b] => [c,d] }
|
|
17
|
-
#
|
|
18
|
-
# TODO allow mapping file to be an xml file
|
|
19
|
-
#
|
|
20
|
-
class ValueMapFromFile < Hash
|
|
21
|
-
|
|
22
|
-
def intialize(file_path, delim = ',')
|
|
23
|
-
@delegate_to = {}
|
|
24
|
-
@delim = delim
|
|
25
|
-
load_map(file_path)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def load_map(file_path = nil, delim = ',')
|
|
29
|
-
@file = file_path unless file_path.nil?
|
|
30
|
-
@delim = delim
|
|
31
|
-
|
|
32
|
-
raise ArgumentError.new("Can not read map file: #{@file}") unless File.readable?(@file)
|
|
33
|
-
|
|
34
|
-
File.open(@file).each_line do |line|
|
|
35
|
-
next unless(line && line.chomp!)
|
|
36
|
-
|
|
37
|
-
values = line.split(@delim)
|
|
38
|
-
|
|
39
|
-
case values.nitems
|
|
40
|
-
when 2 then self.store(values[0], values[1])
|
|
41
|
-
when 3 then self.store([values[0], values[1]], values[2])
|
|
42
|
-
when 4 then self.store([values[0], values[1]],[values[2], values[3]])
|
|
43
|
-
else
|
|
44
|
-
raise ArgumentError.new("Bad key,value row in #{@file}: #{values.nitems} number of columns not supported")
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
return self
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
# Expects file of format [TradeType,LDN_TradeId,HUB_TradeId,LDN_AssetId,HUB_AssetId,LDN_StrutureId,HUB_StructureId,LDN_ProductType,HUB_ProductType]
|
|
54
|
-
# Convets in to and araya containing rows [LDN_TradeId, LDN_AssetId, HUB_TradeId, HUB_AssetId]
|
|
55
|
-
class AssetMapFromFile < Array
|
|
56
|
-
|
|
57
|
-
def intialize(file_path, delim = ',')
|
|
58
|
-
@delegate_to = {}
|
|
59
|
-
@delim = delim
|
|
60
|
-
load_map(file_path)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def load_map(file_path = nil, delim = ',')
|
|
64
|
-
@file = file_path unless file_path.nil?
|
|
65
|
-
@delim = delim
|
|
66
|
-
|
|
67
|
-
raise ArgumentError.new("Can not read asset map file: #{@file}") unless File.readable?(@file)
|
|
68
|
-
|
|
69
|
-
File.open(@file).each_line do |line|
|
|
70
|
-
next unless(line && line.chomp!)
|
|
71
|
-
# skip the header row
|
|
72
|
-
next if line.include?('TradeType')
|
|
73
|
-
|
|
74
|
-
values = line.split(@delim)
|
|
75
|
-
|
|
76
|
-
self.push(Array[values[1], values[3], values[2], values[4]])
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
return self
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def write_map(file_path = nil, delim = ',')
|
|
83
|
-
mapfile = File.open( file_path, 'w')
|
|
84
|
-
|
|
85
|
-
self.each{|row| mapfile.write(row.join(delim)+"\n")}
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
end
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
|
-
# Author :: Tom Statter
|
|
3
|
-
# Date :: Aug 2015
|
|
4
|
-
# License:: MIT
|
|
5
|
-
#
|
|
6
|
-
# Details:: A cache type class that stores details of a source=>destination mapping
|
|
7
|
-
#
|
|
8
|
-
require 'erubis'
|
|
9
|
-
|
|
10
|
-
module DataShift
|
|
11
|
-
|
|
12
|
-
class MappingService
|
|
13
|
-
|
|
14
|
-
include DataShift::Logging
|
|
15
|
-
|
|
16
|
-
# N.B :all_config, :key_config are OpenStruct data structure
|
|
17
|
-
# that provides definition of config entries as attributes with their accompanying values.
|
|
18
|
-
# So if you had a top level config entries in the YAML called path & full_name, you can call
|
|
19
|
-
# config.path
|
|
20
|
-
# config.full_name etc
|
|
21
|
-
#
|
|
22
|
-
# For a more Hash like representation use config.yaml or config[:attribute]
|
|
23
|
-
|
|
24
|
-
attr_reader :mapped_class_name, :map_file_name
|
|
25
|
-
|
|
26
|
-
attr_reader :raw_data, :yaml_data, :mapping_entry
|
|
27
|
-
|
|
28
|
-
def initialize( klass )
|
|
29
|
-
@mapped_class_name = klass.name
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def read( file, key = nil )
|
|
33
|
-
|
|
34
|
-
@map_file_name = file
|
|
35
|
-
|
|
36
|
-
unless(map_file_name && File.exists?(map_file_name))
|
|
37
|
-
logger.error "Cannot open mapping file - #{map_file_name} - file does not exist."
|
|
38
|
-
raise FileNotFound.new("Cannot open mapping file - #{map_file_name}")
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
begin
|
|
42
|
-
# Load application configuration
|
|
43
|
-
set_mapping( map_file_name )
|
|
44
|
-
|
|
45
|
-
set_key_config!( key ) if key
|
|
46
|
-
rescue => e
|
|
47
|
-
puts e.inspect
|
|
48
|
-
logger.error "Failed to parse config file #{map_file_name} - bad YAML ?"
|
|
49
|
-
raise e
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# OpenStruct not a hash .. supports form ... config.path, config.full_name etc
|
|
54
|
-
def method_missing(method, *args, &block)
|
|
55
|
-
#logger :debug, "method_missing called with : #{method}"
|
|
56
|
-
@mapping_entry.send(method)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
private
|
|
60
|
-
|
|
61
|
-
def set_mapping( file )
|
|
62
|
-
|
|
63
|
-
@raw_data = File.read(file)
|
|
64
|
-
|
|
65
|
-
erb = begin
|
|
66
|
-
Erubis::Eruby.new(raw_data).result
|
|
67
|
-
rescue => e
|
|
68
|
-
puts "Failed to parse erb template #{file} error: #{e.inspect}"
|
|
69
|
-
|
|
70
|
-
logger.error "Config template error: #{e.inspect}"
|
|
71
|
-
|
|
72
|
-
raise e
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
begin
|
|
76
|
-
@yaml_data = YAML.load(erb)
|
|
77
|
-
|
|
78
|
-
logger.info "Loaded YAML config from [#{file}]"
|
|
79
|
-
|
|
80
|
-
rescue => e
|
|
81
|
-
puts "YAML parse error: #{e.inspect}"
|
|
82
|
-
logger.error "YAML parse error: #{e.inspect}"
|
|
83
|
-
raise e
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
@mapping_entry = OpenStruct.new(yaml_data)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
end
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
|
2
|
-
# Author :: Tom Statter
|
|
3
|
-
# Date :: Aug 2010
|
|
4
|
-
# License:: MIT
|
|
5
|
-
#
|
|
6
|
-
# Details:: This class provides info and access to the details of individual population methods
|
|
7
|
-
# on an AR model. Populated by, and coupled with MethodMapper,
|
|
8
|
-
# which does the model interrogation work and stores sets of MethodDetails.
|
|
9
|
-
#
|
|
10
|
-
# Enables 'loaders' to iterate over the MethodMapper results set,
|
|
11
|
-
# and assign values to AR object, without knowing anything about that receiving object.
|
|
12
|
-
#
|
|
13
|
-
require 'set'
|
|
14
|
-
|
|
15
|
-
module DataShift
|
|
16
|
-
|
|
17
|
-
class MethodDetail
|
|
18
|
-
|
|
19
|
-
include DataShift::Logging
|
|
20
|
-
|
|
21
|
-
def self.supported_types_enum
|
|
22
|
-
@type_enum ||= Set[:assignment, :belongs_to, :has_one, :has_many]
|
|
23
|
-
@type_enum
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def self.association_types_enum
|
|
27
|
-
@assoc_type_enum ||= Set[:belongs_to, :has_one, :has_many]
|
|
28
|
-
@assoc_type_enum
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def self.is_association_type? ( type )
|
|
33
|
-
association_types_enum.member?( type )
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
# Klass is the class of the 'parent' object i.e with the associations,
|
|
38
|
-
# For example Product which may have operator orders
|
|
39
|
-
attr_accessor :klass
|
|
40
|
-
|
|
41
|
-
# Name is the raw, client supplied name e.g Orders
|
|
42
|
-
attr_accessor :name
|
|
43
|
-
attr_accessor :column_index
|
|
44
|
-
|
|
45
|
-
# The rel col type from the DB
|
|
46
|
-
attr_reader :col_type
|
|
47
|
-
|
|
48
|
-
# The :operator that can be called to assign e.g orders or Products.new.orders << Order.new
|
|
49
|
-
#
|
|
50
|
-
# The type of operator e.g :assignment, :belongs_to, :has_one, :has_many etc
|
|
51
|
-
attr_reader :operator, :operator_type
|
|
52
|
-
|
|
53
|
-
# TODO make it a list/primary keys
|
|
54
|
-
# Additional helpers for where clauses
|
|
55
|
-
attr_accessor :find_by_operator, :find_by_value
|
|
56
|
-
|
|
57
|
-
# Store the raw (client supplied) name against the active record klass(model).
|
|
58
|
-
# Operator is the associated method call on klass,
|
|
59
|
-
# i.e client supplies name 'Price' in a spreadsheet,
|
|
60
|
-
# but true operator to call on klass is price
|
|
61
|
-
#
|
|
62
|
-
# col_types can typically be derived from klass.columns - set of ActiveRecord::ConnectionAdapters::Column
|
|
63
|
-
|
|
64
|
-
def initialize(client_name, klass, operator, type, col_types = {}, find_by_operator = nil, find_by_value = nil )
|
|
65
|
-
@klass, @name = klass, client_name
|
|
66
|
-
@find_by_operator = find_by_operator
|
|
67
|
-
@find_by_value = find_by_value
|
|
68
|
-
|
|
69
|
-
if( MethodDetail::supported_types_enum.member?(type.to_sym) )
|
|
70
|
-
@operator_type = type.to_sym
|
|
71
|
-
else
|
|
72
|
-
raise "Bad operator Type #{type} passed to Method Detail"
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
@operator = operator
|
|
76
|
-
|
|
77
|
-
# Note : Not all assignments will currently have a column type, for example
|
|
78
|
-
# those that are derived from a delegate_belongs_to
|
|
79
|
-
if(col_types.empty?)
|
|
80
|
-
@col_type = klass.columns.find{ |col| col.name == operator }
|
|
81
|
-
else
|
|
82
|
-
@col_type = col_types[operator]
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
@column_index = -1
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
# Return the actual operator's name for supplied method type
|
|
90
|
-
# where type one of :assignment, :has_one, :belongs_to, :has_many etc
|
|
91
|
-
def operator_for( type )
|
|
92
|
-
return operator if(@operator_type == type.to_sym)
|
|
93
|
-
nil
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def operator?(name, case_sensitive = false)
|
|
97
|
-
case_sensitive ? operator == name : operator.downcase == name.downcase
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# Return the operator's expected class name, if can be derived, else nil
|
|
101
|
-
def operator_class_name()
|
|
102
|
-
@operator_class_name ||=
|
|
103
|
-
if(operator_for(:has_many) || operator_for(:belongs_to) || operator_for(:has_one))
|
|
104
|
-
|
|
105
|
-
get_operator_class.name
|
|
106
|
-
|
|
107
|
-
elsif(@col_type)
|
|
108
|
-
@col_type.type.to_s.classify
|
|
109
|
-
else
|
|
110
|
-
""
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
@operator_class_name
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# Return the operator's expected class, if can be derived, else nil
|
|
117
|
-
def operator_class()
|
|
118
|
-
@operator_class ||= get_operator_class()
|
|
119
|
-
@operator_class
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def pp
|
|
123
|
-
"#{@name} => #{operator}"
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
private
|
|
127
|
-
|
|
128
|
-
# Return the operator's expected class, if can be derived, else nil
|
|
129
|
-
# TODO rspec- can reflect_on_association ever actually fail & do we ever need to try ourselves (badly)
|
|
130
|
-
def get_operator_class()
|
|
131
|
-
|
|
132
|
-
if(operator_for(:has_many) || operator_for(:belongs_to) || operator_for(:has_one))
|
|
133
|
-
|
|
134
|
-
result = klass.reflect_on_association(operator)
|
|
135
|
-
|
|
136
|
-
return result.klass if(result)
|
|
137
|
-
|
|
138
|
-
result = ModelMapper::class_from_string(operator.classify)
|
|
139
|
-
|
|
140
|
-
if(result.nil?)
|
|
141
|
-
begin
|
|
142
|
-
|
|
143
|
-
first = klass.to_s.split('::').first
|
|
144
|
-
logger.debug "Trying to find operator class with Parent Namespace #{first}"
|
|
145
|
-
|
|
146
|
-
result = ModelMapper::const_get_from_string("#{first}::#{operator.classify}")
|
|
147
|
-
rescue => e
|
|
148
|
-
logger.error("Failed to derive Class for #{operator} (#{@operator_type} - #{e.inspect}")
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
result
|
|
153
|
-
|
|
154
|
-
elsif(@col_type)
|
|
155
|
-
begin
|
|
156
|
-
Kernel.const_get(@col_type.type.to_s.classify)
|
|
157
|
-
rescue; nil; end
|
|
158
|
-
else
|
|
159
|
-
nil
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
end
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
|
2
|
-
# Author :: Tom Statter
|
|
3
|
-
# Date :: Aug 2010
|
|
4
|
-
# License:: MIT
|
|
5
|
-
#
|
|
6
|
-
# Details:: This class provides info and access to groups of accessor methods,
|
|
7
|
-
# grouped by AR model.
|
|
8
|
-
#
|
|
9
|
-
# Stores complete collection of MethodDetail instances per mapped class.
|
|
10
|
-
# Provides high level find facilites to find a MethodDetail and to list out
|
|
11
|
-
# operators per type (has_one, has_many, belongs_to, instance_method etc)
|
|
12
|
-
# and all possible operators,
|
|
13
|
-
|
|
14
|
-
require 'to_b'
|
|
15
|
-
|
|
16
|
-
module DataShift
|
|
17
|
-
|
|
18
|
-
# Stores MethodDetails for a class mapped by type
|
|
19
|
-
class MethodDetailsManager
|
|
20
|
-
|
|
21
|
-
attr_reader :method_details, :method_details_list
|
|
22
|
-
attr_reader :managed_class_name
|
|
23
|
-
|
|
24
|
-
def initialize( klass )
|
|
25
|
-
@managed_class_name = klass.name
|
|
26
|
-
@method_details = {}
|
|
27
|
-
@method_details_list = {}
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def add(method_details)
|
|
31
|
-
#puts "DEBUG: MGR - Add {#method_details.operator_type}\n#{method_details.inspect}"
|
|
32
|
-
@method_details[method_details.operator_type.to_sym] ||= {}
|
|
33
|
-
|
|
34
|
-
# Mapped by Type and MethodDetail name
|
|
35
|
-
@method_details[method_details.operator_type.to_sym][method_details.name] = method_details
|
|
36
|
-
|
|
37
|
-
# Helper list of all available by type
|
|
38
|
-
@method_details_list[method_details.operator_type.to_sym] ||= []
|
|
39
|
-
|
|
40
|
-
@method_details_list[method_details.operator_type.to_sym] << method_details
|
|
41
|
-
@method_details_list[method_details.operator_type.to_sym].uniq!
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def <<(method_details)
|
|
45
|
-
add(method_details)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def find(name, type)
|
|
49
|
-
method_details = get(type)
|
|
50
|
-
|
|
51
|
-
method_details ? method_details[name] : nil
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# type is expected to be one of MethodDetail::supported_types_enum
|
|
55
|
-
# Returns all MethodDetail(s) for supplied type
|
|
56
|
-
def get( type )
|
|
57
|
-
@method_details[type.to_sym]
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def get_list( type )
|
|
61
|
-
@method_details_list[type.to_sym] || []
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
alias_method(:get_list_of_method_details, :get_list)
|
|
65
|
-
|
|
66
|
-
# Get list of the inbound or externally supplied names
|
|
67
|
-
def get_names(type)
|
|
68
|
-
get_list(type).collect { |md| md.name }
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Get list of Rails model operators
|
|
72
|
-
def get_operators(type)
|
|
73
|
-
get_list(type).collect { |md| md.operator }
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
alias_method(:get_list_of_operators, :get_operators)
|
|
77
|
-
|
|
78
|
-
def available_operators
|
|
79
|
-
method_details_list.values.flatten.collect(&:operator)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# A reverse map showing all operators with their associated 'type'
|
|
83
|
-
def available_operators_with_type
|
|
84
|
-
h = {}
|
|
85
|
-
method_details_list.each { |t, mds| mds.each do |v| h[v.operator] = t end }
|
|
86
|
-
|
|
87
|
-
# this is meant to be more efficient that Hash[h.sort]
|
|
88
|
-
sh = {}
|
|
89
|
-
h.keys.sort.each do |k| sh[k] = h[k] end
|
|
90
|
-
sh
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
end
|