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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# License:: MIT
|
|
4
|
+
#
|
|
5
|
+
# Details:: Stores complete collection of ModelMethod instances per mapped class.
|
|
6
|
+
#
|
|
7
|
+
# Mapped to association types as defined by ModelMethod::supported_types_enum
|
|
8
|
+
|
|
9
|
+
# Provides high level find facilities to find a ModelMethod and to list out
|
|
10
|
+
# operators per type (has_one, has_many, belongs_to, instance_method etc)
|
|
11
|
+
# and all possible operators,
|
|
12
|
+
#
|
|
13
|
+
module DataShift
|
|
14
|
+
|
|
15
|
+
module ModelMethods
|
|
16
|
+
|
|
17
|
+
class Collection
|
|
18
|
+
|
|
19
|
+
include DataShift::Logging
|
|
20
|
+
extend DataShift::Logging
|
|
21
|
+
|
|
22
|
+
include Enumerable
|
|
23
|
+
|
|
24
|
+
attr_reader :managed_class
|
|
25
|
+
|
|
26
|
+
# Hash of all available methods by type
|
|
27
|
+
# [:assignment] => [:id, :name], [:belongs_to] => [:user, :address]
|
|
28
|
+
#
|
|
29
|
+
attr_accessor :by_optype
|
|
30
|
+
|
|
31
|
+
attr_accessor :model_method_list
|
|
32
|
+
|
|
33
|
+
extend Forwardable
|
|
34
|
+
|
|
35
|
+
def_delegators :@model_method_list, [], :sort, :sort!, :first, :last
|
|
36
|
+
|
|
37
|
+
def initialize( klass )
|
|
38
|
+
@managed_class = klass
|
|
39
|
+
@model_method_list = []
|
|
40
|
+
@by_optype = {}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def managed_class_name
|
|
44
|
+
@managed_class.name
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
alias klass managed_class_name
|
|
48
|
+
|
|
49
|
+
def insert(operator, type)
|
|
50
|
+
mm = ModelMethod.new(managed_class, operator, type)
|
|
51
|
+
add( mm )
|
|
52
|
+
mm
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def add(model_method)
|
|
56
|
+
model_method_list << model_method
|
|
57
|
+
|
|
58
|
+
maintain_by_optype_helper model_method
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def maintain_by_optype_helper( model_method )
|
|
62
|
+
# Helper list of all available by type [:belongs_to]
|
|
63
|
+
by_optype[model_method.operator_type.to_sym] ||= []
|
|
64
|
+
by_optype[model_method.operator_type.to_sym] << model_method
|
|
65
|
+
by_optype[model_method.operator_type.to_sym].uniq!
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def <<(model_method)
|
|
69
|
+
add(model_method)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def push(model_method)
|
|
73
|
+
add(model_method)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def unshift(model_method)
|
|
77
|
+
model_method_list.unshift model_method
|
|
78
|
+
maintain_by_optype_helper model_method
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def each
|
|
82
|
+
model_method_list.each { |mm| yield(mm) }
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Search for matching ModelMethod for given name across all types in supported_types_enum order
|
|
86
|
+
def search(name)
|
|
87
|
+
ModelMethod.supported_types_enum.each do |type|
|
|
88
|
+
model_method = find_by_name_and_type(name, type)
|
|
89
|
+
return model_method if model_method
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
nil
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Return matching ModelMethod for given name and specific type
|
|
96
|
+
def find_by_name_and_type(name, type)
|
|
97
|
+
by_optype = model_method_list.find_all { |mm| mm.operator_type? type }
|
|
98
|
+
|
|
99
|
+
by_optype.find { |mm| mm.operator? name }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Search for matching ModelMethod for given name across Association types
|
|
103
|
+
def find_association(name)
|
|
104
|
+
ModelMethod.association_types_enum.each do |type|
|
|
105
|
+
model_method = find_by_name_and_type(name, type)
|
|
106
|
+
return model_method if model_method
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
nil
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Returns all ModelMethod(s) for supplied type e.g :belongs_to
|
|
113
|
+
# type is expected to be one of ModelMethod::supported_types_enum
|
|
114
|
+
def for_type( type )
|
|
115
|
+
model_method_list.find_all { |mm| mm.operator_type? type }
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Get list of Rails model operators
|
|
119
|
+
def get_operators(type)
|
|
120
|
+
for_type(type).collect(&:operator)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def available_operators
|
|
124
|
+
model_method_list.collect(&:operator)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# A reverse map showing all operators with their associated 'type'
|
|
128
|
+
def available_operators_with_type
|
|
129
|
+
h = {}
|
|
130
|
+
by_optype.each { |t, mms| mms.each { |v| h[v.operator] = t } }
|
|
131
|
+
|
|
132
|
+
# this is meant to be more efficient that Hash[h.sort]
|
|
133
|
+
sh = {}
|
|
134
|
+
h.keys.sort.each { |k| sh[k] = h[k] }
|
|
135
|
+
sh
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# Date :: Feb 2015
|
|
4
|
+
# License:: MIT
|
|
5
|
+
#
|
|
6
|
+
# Details:: This class holds info on a single Method callable on a domain Model
|
|
7
|
+
# By holding information on the Type inbound data can be manipulated
|
|
8
|
+
# into the right format for the style of operator; simple assignment,
|
|
9
|
+
# appending to an association collection or a method call
|
|
10
|
+
#
|
|
11
|
+
require_relative 'operator'
|
|
12
|
+
|
|
13
|
+
module DataShift
|
|
14
|
+
|
|
15
|
+
class ModelMethod < Operator
|
|
16
|
+
|
|
17
|
+
include DataShift::Logging
|
|
18
|
+
|
|
19
|
+
def self.association_types_enum
|
|
20
|
+
@assoc_type_enum ||= [:belongs_to, :has_one, :has_many]
|
|
21
|
+
@assoc_type_enum
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.association_type?( type )
|
|
25
|
+
association_types_enum.member?( type )
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Klass is the class of the 'parent' object i.e with the associations,
|
|
29
|
+
# For example Product which may have operator orders
|
|
30
|
+
attr_accessor :klass
|
|
31
|
+
|
|
32
|
+
# The real column data from the DB - via ActiveRecord::ConnectionAdapters::Column when available
|
|
33
|
+
|
|
34
|
+
attr_reader :connection_adapter_column
|
|
35
|
+
|
|
36
|
+
# Operator is a population type method call on klass
|
|
37
|
+
#
|
|
38
|
+
# Type determines the style of operator call; simple assignment, an association or a method call
|
|
39
|
+
#
|
|
40
|
+
def initialize(klass, operator, type, connection_adapter_column = nil)
|
|
41
|
+
|
|
42
|
+
super(operator, type)
|
|
43
|
+
|
|
44
|
+
@klass = klass
|
|
45
|
+
|
|
46
|
+
# Note : Not all assignments will currently have a column type, for example
|
|
47
|
+
# those that are derived from a delegate_belongs_to
|
|
48
|
+
@connection_adapter_column = klass.columns.find { |col| col.name == operator } if connection_adapter_column.nil?
|
|
49
|
+
|
|
50
|
+
@connection_adapter_column = DataShift::ModelMethods::Catalogue.column_type_for(klass, operator) if connection_adapter_column.nil?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Return the operator's expected class name, if can be derived, else nil
|
|
54
|
+
def operator_class_name
|
|
55
|
+
@operator_class_name ||=
|
|
56
|
+
if operator_for(:has_many) || operator_for(:belongs_to) || operator_for(:has_one)
|
|
57
|
+
|
|
58
|
+
determine_operator_class.name
|
|
59
|
+
|
|
60
|
+
elsif connection_adapter_column
|
|
61
|
+
connection_adapter_column.type.to_s.classify
|
|
62
|
+
else
|
|
63
|
+
''
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
@operator_class_name
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Return the operator's expected class, if can be derived, else nil
|
|
70
|
+
def operator_class
|
|
71
|
+
@operator_class ||= determine_operator_class
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Returns true of MM is an association (rather than plain attribute or, enum or method)
|
|
75
|
+
def association_type?
|
|
76
|
+
ModelMethod.association_type?( operator_type )
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def association_columns
|
|
80
|
+
klass.reflect_on_association(operator).klass.columns
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def ==(other)
|
|
84
|
+
other.class == self.class && other.state == state
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
include Comparable
|
|
88
|
+
|
|
89
|
+
def <=>(other)
|
|
90
|
+
state <=> other.state
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
alias eql? ==
|
|
94
|
+
|
|
95
|
+
def hash
|
|
96
|
+
state.hash
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def pp
|
|
100
|
+
x = <<-EOS
|
|
101
|
+
Class [#{klass.name}]
|
|
102
|
+
Operator Type [#{operator_type}]
|
|
103
|
+
Operator [#{operator}]
|
|
104
|
+
EOS
|
|
105
|
+
|
|
106
|
+
if connection_adapter_column.respond_to?(:cast_type)
|
|
107
|
+
x += <<-EOS
|
|
108
|
+
Col/SqlType [#{connection_adapter_column.class} - #{connection_adapter_column.cast_type.class.name}]
|
|
109
|
+
EOS
|
|
110
|
+
end
|
|
111
|
+
x
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
protected
|
|
115
|
+
|
|
116
|
+
# Defines the precedence order.
|
|
117
|
+
# For example in import, generally you want to process attributes first so that by
|
|
118
|
+
# the time you get to associations you have a valid model instance with an ID
|
|
119
|
+
# hence operator_type before operator
|
|
120
|
+
#
|
|
121
|
+
def state
|
|
122
|
+
[klass.name, ModelMethod.supported_types_enum.index(operator_type), operator]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
private
|
|
126
|
+
|
|
127
|
+
# Return the operator's expected class, if can be derived, else nil
|
|
128
|
+
def determine_operator_class
|
|
129
|
+
|
|
130
|
+
if operator_for(:has_many) || operator_for(:belongs_to) || operator_for(:has_one)
|
|
131
|
+
|
|
132
|
+
result = klass.reflect_on_association(operator)
|
|
133
|
+
|
|
134
|
+
return result.klass if result
|
|
135
|
+
|
|
136
|
+
result = MapperUtils.class_from_string(operator.classify)
|
|
137
|
+
|
|
138
|
+
if result.nil?
|
|
139
|
+
begin
|
|
140
|
+
|
|
141
|
+
first = klass.to_s.split('::').first
|
|
142
|
+
logger.debug "Trying to find operator class with Parent Namespace #{first}"
|
|
143
|
+
|
|
144
|
+
result = MapperUtils.const_get_from_string("#{first}::#{operator.classify}")
|
|
145
|
+
rescue => e
|
|
146
|
+
logger.error("Failed to derive Class for #{operator} (#{@operator_type} - #{e.inspect}")
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
result
|
|
151
|
+
|
|
152
|
+
elsif connection_adapter_column
|
|
153
|
+
begin
|
|
154
|
+
Kernel.const_get(connection_adapter_column.type.to_s.classify)
|
|
155
|
+
rescue
|
|
156
|
+
nil
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2011
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# Date :: Feb 2015
|
|
4
|
+
# License:: MIT
|
|
5
|
+
#
|
|
6
|
+
# Details:: Just a high level helper to build Collections of model methods
|
|
7
|
+
# and enable quick access via Map of Class => Collection
|
|
8
|
+
#
|
|
9
|
+
module DataShift
|
|
10
|
+
|
|
11
|
+
module ModelMethods
|
|
12
|
+
|
|
13
|
+
class Manager
|
|
14
|
+
|
|
15
|
+
def self.collections
|
|
16
|
+
@collections ||= {}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.for(klass)
|
|
20
|
+
collections[klass]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.for?(klass)
|
|
24
|
+
(collections[klass] != nil)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Build a thorough and usable picture of the operators which can be
|
|
28
|
+
# used to import/export data to objects of type 'klass'
|
|
29
|
+
# Stored as a dictionary of ModelMethods objects
|
|
30
|
+
#
|
|
31
|
+
# Subsequent calls with same class will return existing mapping
|
|
32
|
+
# To over ride this behaviour, supply :reload
|
|
33
|
+
#
|
|
34
|
+
# Options: TODO - find we are passing through options to other calls alot - good pattern for this ?
|
|
35
|
+
|
|
36
|
+
# :reload => clear caches and re-perform lookup
|
|
37
|
+
# :instance_methods => if true include instance method type 'setters' as well as model's pure columns
|
|
38
|
+
#
|
|
39
|
+
def self.catalog_class( klass, options = {} )
|
|
40
|
+
|
|
41
|
+
return collections[klass] if collections[klass] && !options[:reload]
|
|
42
|
+
|
|
43
|
+
ModelMethods::Catalogue.populate(klass, options) unless ModelMethods::Catalogue.catalogued?(klass)
|
|
44
|
+
|
|
45
|
+
collection = ModelMethods::Collection.new( klass )
|
|
46
|
+
|
|
47
|
+
DataShift::ModelMethods::Catalogue.assignments_for(klass).each do |n|
|
|
48
|
+
collection << ModelMethod.new(klass, n, :assignment)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
DataShift::ModelMethods::Catalogue.has_one_for(klass).each do |n|
|
|
52
|
+
collection << ModelMethod.new(klass, n, :has_one)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
DataShift::ModelMethods::Catalogue.has_many_for(klass).each do |n|
|
|
56
|
+
collection << ModelMethod.new(klass, n, :has_many)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
DataShift::ModelMethods::Catalogue.belongs_to_for(klass).each do |n|
|
|
60
|
+
collection << ModelMethod.new(klass, n, :belongs_to)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
collections[klass] = collection
|
|
64
|
+
|
|
65
|
+
collection
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.clear
|
|
70
|
+
collections.clear
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2015
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# Date :: Feb 2015
|
|
4
|
+
# License:: MIT
|
|
5
|
+
#
|
|
6
|
+
# Details:: This class holds info on a single Method callable on a domain Model
|
|
7
|
+
# By holding information on the Type inbound data can be manipulated
|
|
8
|
+
# into the right format for the style of operator; simple assignment,
|
|
9
|
+
# appending to an association collection or a method call
|
|
10
|
+
#
|
|
11
|
+
module DataShift
|
|
12
|
+
|
|
13
|
+
class Operator
|
|
14
|
+
|
|
15
|
+
include DataShift::Logging
|
|
16
|
+
|
|
17
|
+
# List of supported operator types e.g :assignment, :belongs_to, :has_one, :has_many etc
|
|
18
|
+
# N.B these are in priority order ie. often prefer to process assignments first, then associations
|
|
19
|
+
#
|
|
20
|
+
def self.supported_types_enum
|
|
21
|
+
@type_enum ||= [:assignment, :enum, :belongs_to, :has_one, :has_many, :method]
|
|
22
|
+
@type_enum
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# The :operator that can be called to assign e.g orders or Products.new.orders << Order.new
|
|
26
|
+
attr_reader :operator
|
|
27
|
+
|
|
28
|
+
# The type of operator e.g normal method or Rails :assignment, :belongs_to, :has_one, :has_many etc
|
|
29
|
+
attr_reader :operator_type
|
|
30
|
+
|
|
31
|
+
# Operator is a population type method call
|
|
32
|
+
# Type determines the style of operator call; simple assignment, an association or a method call
|
|
33
|
+
#
|
|
34
|
+
def initialize(operator, type = :method)
|
|
35
|
+
|
|
36
|
+
if ModelMethod.supported_types_enum.include?(type.to_sym)
|
|
37
|
+
@operator_type = type.to_sym
|
|
38
|
+
else
|
|
39
|
+
raise BadOperatorType, "No such operator Type [#{type}] cannot instantiate ModelMethod for #{operator}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
@operator = operator
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Return the actual operator's name for supplied method type
|
|
46
|
+
# where type one of :assignment, :has_one, :belongs_to, :has_many etc
|
|
47
|
+
def operator_for( type )
|
|
48
|
+
return operator if @operator_type == type.to_sym
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def operator?(name, case_sensitive = false)
|
|
53
|
+
return false if(name.nil?)
|
|
54
|
+
case_sensitive ? operator == name : operator.casecmp(name.downcase).zero?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def operator_type?(type)
|
|
58
|
+
@operator_type == type.to_sym
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2016
|
|
2
|
+
# Author :: Tom Statter
|
|
3
|
+
# License:: MIT
|
|
4
|
+
#
|
|
5
|
+
# Details:: A collection of DataFlowNodes
|
|
6
|
+
|
|
7
|
+
require 'forwardable'
|
|
8
|
+
|
|
9
|
+
module DataShift
|
|
10
|
+
|
|
11
|
+
# Acts as an array of Node
|
|
12
|
+
|
|
13
|
+
class NodeCollection
|
|
14
|
+
|
|
15
|
+
extend Forwardable
|
|
16
|
+
|
|
17
|
+
attr_accessor :doc_context
|
|
18
|
+
|
|
19
|
+
def_delegators :@nodes, *Array.delegated_methods_for_fwdable
|
|
20
|
+
|
|
21
|
+
def initialize
|
|
22
|
+
@nodes = []
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|