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.
Files changed (422) hide show
  1. checksums.yaml +4 -4
  2. data/{LICENSE.txt → LICENSE} +0 -0
  3. data/Rakefile +1 -20
  4. data/datashift.thor +125 -0
  5. data/lib/applications/apache_poi_extensions.rb +21 -52
  6. data/lib/applications/excel.rb +64 -57
  7. data/lib/applications/hssf_row_extensions.rb +66 -0
  8. data/lib/applications/jexcel_file.rb +99 -95
  9. data/lib/applications/jexcel_file_extensions.rb +76 -83
  10. data/lib/applications/jruby/word.rb +36 -36
  11. data/lib/applications/ruby_poi_translations.rb +34 -32
  12. data/lib/applications/spreadsheet_extensions.rb +21 -19
  13. data/lib/datashift.rb +49 -59
  14. data/lib/datashift/binder.rb +217 -0
  15. data/lib/datashift/column_packer.rb +21 -72
  16. data/lib/datashift/configuration.rb +317 -0
  17. data/lib/datashift/context_factory.rb +88 -0
  18. data/lib/datashift/core_ext/array.rb +15 -0
  19. data/lib/datashift/core_ext/csv_ext.rb +46 -0
  20. data/lib/datashift/core_ext/string.rb +49 -0
  21. data/lib/datashift/core_ext/to_b.rb +11 -0
  22. data/lib/datashift/delimiters.rb +55 -61
  23. data/lib/datashift/doc_context.rb +137 -0
  24. data/lib/datashift/excel_base.rb +93 -81
  25. data/lib/datashift/exceptions.rb +30 -28
  26. data/lib/datashift/file_definitions.rb +44 -39
  27. data/lib/datashift/guards.rb +5 -5
  28. data/lib/datashift/header.rb +25 -0
  29. data/lib/datashift/headers.rb +94 -0
  30. data/lib/datashift/inbound_data/column.rb +44 -0
  31. data/lib/datashift/inbound_data/lookup_support.rb +33 -0
  32. data/lib/datashift/inbound_data/method_binding.rb +139 -0
  33. data/lib/datashift/load_object.rb +37 -12
  34. data/lib/datashift/logging.rb +54 -27
  35. data/lib/datashift/mandatory.rb +39 -0
  36. data/lib/datashift/mapping/data_flow_schema.rb +198 -0
  37. data/lib/datashift/{model_mapper.rb → mapping/mapper_utils.rb} +30 -10
  38. data/lib/datashift/model_methods/catalogue.rb +183 -0
  39. data/lib/datashift/model_methods/collection.rb +140 -0
  40. data/lib/datashift/model_methods/model_method.rb +162 -0
  41. data/lib/datashift/model_methods/model_methods_manager.rb +76 -0
  42. data/lib/datashift/model_methods/operator.rb +62 -0
  43. data/lib/datashift/node_collection.rb +26 -0
  44. data/lib/datashift/node_context.rb +68 -0
  45. data/lib/datashift/populator.rb +308 -282
  46. data/lib/datashift/progress_monitor.rb +91 -0
  47. data/lib/datashift/querying.rb +110 -52
  48. data/lib/datashift/templates/import_export_config.erb +55 -0
  49. data/lib/datashift/transformation/factory.rb +219 -0
  50. data/lib/datashift/transformation/remove.rb +44 -0
  51. data/lib/datashift/version.rb +3 -0
  52. data/lib/exporters/configuration.rb +84 -0
  53. data/lib/exporters/csv_exporter.rb +54 -52
  54. data/lib/exporters/excel_exporter.rb +80 -61
  55. data/lib/exporters/exporter_base.rb +8 -8
  56. data/lib/generators/config_generator.rb +218 -0
  57. data/lib/generators/csv_generator.rb +13 -70
  58. data/lib/generators/excel_generator.rb +23 -111
  59. data/lib/generators/generator_base.rb +15 -70
  60. data/lib/loaders/configuration.rb +90 -0
  61. data/lib/loaders/csv_loader.rb +63 -101
  62. data/lib/loaders/excel_loader.rb +71 -156
  63. data/lib/loaders/failure_data.rb +40 -0
  64. data/lib/loaders/file_loader.rb +16 -0
  65. data/lib/loaders/loader_base.rb +82 -410
  66. data/lib/loaders/loader_factory.rb +42 -0
  67. data/lib/loaders/paperclip/attachment_loader.rb +157 -140
  68. data/lib/loaders/paperclip/datashift_paperclip.rb +18 -35
  69. data/lib/loaders/paperclip/image_loading.rb +40 -35
  70. data/lib/loaders/reporters/basic_stdout_reporter.rb +40 -0
  71. data/lib/loaders/reporters/reporter.rb +26 -0
  72. data/lib/tasks/config.thor +65 -0
  73. data/{tasks → lib/tasks}/config/seed_fu_product_template.erb +0 -0
  74. data/{tasks → lib/tasks}/config/tidy_config.txt +0 -0
  75. data/lib/tasks/export.thor +192 -0
  76. data/lib/tasks/generate.thor +190 -0
  77. data/lib/tasks/import.thor +142 -0
  78. data/lib/{thor → tasks}/paperclip.thor +69 -69
  79. data/{tasks → lib/tasks/to_convert_to_thor}/db_tasks.rake +20 -20
  80. data/lib/tasks/tools.thor +109 -0
  81. data/spec/MissingAttachmentRecords/DEMO_001_ror_bag.jpeg +0 -0
  82. data/spec/MissingAttachmentRecords/DEMO_002_Powerstation.jpeg +0 -0
  83. data/spec/MissingAttachmentRecords/DEMO_003_ror_mug.jpeg +0 -0
  84. data/spec/MissingAttachmentRecords/DEMO_004_ror_ringer.jpeg +0 -0
  85. data/spec/datashift/binder_spec.rb +266 -0
  86. data/spec/datashift/config_generator_spec.rb +186 -0
  87. data/spec/datashift/configuration.rb +66 -0
  88. data/spec/datashift/context_factory_spec.rb +63 -0
  89. data/spec/datashift/data_flow_schema_spec.rb +150 -0
  90. data/spec/datashift/datashift_spec.rb +52 -0
  91. data/spec/datashift/excel_base_spec.rb +57 -0
  92. data/spec/datashift/excel_spec.rb +188 -0
  93. data/spec/datashift/failure_data_spec.rb +27 -0
  94. data/spec/{file_definitions.rb → datashift/file_definitions.rb} +9 -10
  95. data/spec/datashift/headers_spec.rb +56 -0
  96. data/spec/datashift/inbound_data_spec.rb +47 -0
  97. data/spec/datashift/mapper_utils_spec.rb +38 -0
  98. data/spec/datashift/method_binding_spec.rb +60 -0
  99. data/spec/datashift/model_method_spec.rb +109 -0
  100. data/spec/datashift/model_methods_catalogue.rb +111 -0
  101. data/spec/datashift/model_methods_collection_spec.rb +138 -0
  102. data/spec/datashift/model_methods_manager_spec.rb +329 -0
  103. data/spec/datashift/populator_spec.rb +117 -0
  104. data/spec/datashift/thor_spec.rb +314 -0
  105. data/spec/datashift/transformation/factory_spec.rb +195 -0
  106. data/spec/datashift/transformation/transformer_remove_spec.rb +43 -0
  107. data/spec/dummy/Gemfile +53 -0
  108. data/spec/dummy/Gemfile.lock +197 -0
  109. data/spec/dummy/README.rdoc +28 -0
  110. data/spec/dummy/Rakefile +6 -0
  111. data/spec/dummy/app/assets/javascripts/application.js +16 -0
  112. data/spec/dummy/app/assets/javascripts/categories.js +2 -0
  113. data/spec/dummy/app/assets/javascripts/digitals.js +2 -0
  114. data/spec/dummy/app/assets/javascripts/empties.js +2 -0
  115. data/spec/dummy/app/assets/javascripts/loader_releases.js +2 -0
  116. data/spec/dummy/app/assets/javascripts/long_and_complex_table_linked_to_versions.js +2 -0
  117. data/spec/dummy/app/assets/javascripts/milestones.js +2 -0
  118. data/spec/dummy/app/assets/javascripts/owners.js +2 -0
  119. data/spec/dummy/app/assets/javascripts/projects.js +2 -0
  120. data/spec/dummy/app/assets/javascripts/users.js +2 -0
  121. data/spec/dummy/app/assets/javascripts/versions.js +2 -0
  122. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  123. data/spec/dummy/app/assets/stylesheets/categories.css +4 -0
  124. data/spec/dummy/app/assets/stylesheets/digitals.css +4 -0
  125. data/spec/dummy/app/assets/stylesheets/empties.css +4 -0
  126. data/spec/dummy/app/assets/stylesheets/loader_releases.css +4 -0
  127. data/spec/dummy/app/assets/stylesheets/long_and_complex_table_linked_to_versions.css +4 -0
  128. data/spec/dummy/app/assets/stylesheets/milestones.css +4 -0
  129. data/spec/dummy/app/assets/stylesheets/owners.css +4 -0
  130. data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
  131. data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
  132. data/spec/dummy/app/assets/stylesheets/users.css +4 -0
  133. data/spec/dummy/app/assets/stylesheets/versions.css +4 -0
  134. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  135. data/spec/dummy/app/controllers/categories_controller.rb +58 -0
  136. data/spec/dummy/app/controllers/digitals_controller.rb +58 -0
  137. data/spec/dummy/app/controllers/empties_controller.rb +58 -0
  138. data/spec/dummy/app/controllers/loader_releases_controller.rb +58 -0
  139. data/spec/dummy/app/controllers/long_and_complex_table_linked_to_versions_controller.rb +58 -0
  140. data/spec/dummy/app/controllers/milestones_controller.rb +58 -0
  141. data/spec/dummy/app/controllers/owners_controller.rb +58 -0
  142. data/spec/dummy/app/controllers/projects_controller.rb +58 -0
  143. data/spec/dummy/app/controllers/users_controller.rb +58 -0
  144. data/spec/dummy/app/controllers/versions_controller.rb +58 -0
  145. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  146. data/spec/dummy/app/helpers/categories_helper.rb +2 -0
  147. data/spec/dummy/app/helpers/digitals_helper.rb +2 -0
  148. data/spec/dummy/app/helpers/empties_helper.rb +2 -0
  149. data/spec/dummy/app/helpers/loader_releases_helper.rb +2 -0
  150. data/spec/dummy/app/helpers/long_and_complex_table_linked_to_versions_helper.rb +2 -0
  151. data/spec/dummy/app/helpers/milestones_helper.rb +2 -0
  152. data/spec/dummy/app/helpers/owners_helper.rb +2 -0
  153. data/spec/dummy/app/helpers/projects_helper.rb +2 -0
  154. data/spec/dummy/app/helpers/users_helper.rb +2 -0
  155. data/spec/dummy/app/helpers/versions_helper.rb +2 -0
  156. data/spec/dummy/app/models/category.rb +6 -0
  157. data/spec/dummy/app/models/digital.rb +22 -0
  158. data/spec/dummy/app/models/empty.rb +2 -0
  159. data/spec/dummy/app/models/loader_release.rb +10 -0
  160. data/spec/dummy/app/models/long_and_complex_table_linked_to_version.rb +6 -0
  161. data/spec/dummy/app/models/milestone.rb +15 -0
  162. data/spec/dummy/app/models/owner.rb +13 -0
  163. data/spec/dummy/app/models/project.rb +53 -0
  164. data/spec/dummy/app/models/user.rb +5 -0
  165. data/spec/dummy/app/models/version.rb +7 -0
  166. data/spec/dummy/app/views/categories/_form.html.erb +17 -0
  167. data/spec/dummy/app/views/categories/edit.html.erb +6 -0
  168. data/spec/dummy/app/views/categories/index.html.erb +25 -0
  169. data/spec/dummy/app/views/categories/new.html.erb +5 -0
  170. data/spec/dummy/app/views/categories/show.html.erb +4 -0
  171. data/spec/dummy/app/views/digitals/_form.html.erb +17 -0
  172. data/spec/dummy/app/views/digitals/edit.html.erb +6 -0
  173. data/spec/dummy/app/views/digitals/index.html.erb +25 -0
  174. data/spec/dummy/app/views/digitals/new.html.erb +5 -0
  175. data/spec/dummy/app/views/digitals/show.html.erb +4 -0
  176. data/spec/dummy/app/views/empties/_form.html.erb +17 -0
  177. data/spec/dummy/app/views/empties/edit.html.erb +6 -0
  178. data/spec/dummy/app/views/empties/index.html.erb +25 -0
  179. data/spec/dummy/app/views/empties/new.html.erb +5 -0
  180. data/spec/dummy/app/views/empties/show.html.erb +4 -0
  181. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  182. data/spec/dummy/app/views/loader_releases/_form.html.erb +17 -0
  183. data/spec/dummy/app/views/loader_releases/edit.html.erb +6 -0
  184. data/spec/dummy/app/views/loader_releases/index.html.erb +25 -0
  185. data/spec/dummy/app/views/loader_releases/new.html.erb +5 -0
  186. data/spec/dummy/app/views/loader_releases/show.html.erb +4 -0
  187. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/_form.html.erb +17 -0
  188. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/edit.html.erb +6 -0
  189. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/index.html.erb +25 -0
  190. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/new.html.erb +5 -0
  191. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/show.html.erb +4 -0
  192. data/spec/dummy/app/views/milestones/_form.html.erb +17 -0
  193. data/spec/dummy/app/views/milestones/edit.html.erb +6 -0
  194. data/spec/dummy/app/views/milestones/index.html.erb +25 -0
  195. data/spec/dummy/app/views/milestones/new.html.erb +5 -0
  196. data/spec/dummy/app/views/milestones/show.html.erb +4 -0
  197. data/spec/dummy/app/views/owners/_form.html.erb +17 -0
  198. data/spec/dummy/app/views/owners/edit.html.erb +6 -0
  199. data/spec/dummy/app/views/owners/index.html.erb +25 -0
  200. data/spec/dummy/app/views/owners/new.html.erb +5 -0
  201. data/spec/dummy/app/views/owners/show.html.erb +4 -0
  202. data/spec/dummy/app/views/projects/_form.html.erb +17 -0
  203. data/spec/dummy/app/views/projects/edit.html.erb +6 -0
  204. data/spec/dummy/app/views/projects/index.html.erb +25 -0
  205. data/spec/dummy/app/views/projects/new.html.erb +5 -0
  206. data/spec/dummy/app/views/projects/show.html.erb +4 -0
  207. data/spec/dummy/app/views/users/_form.html.erb +17 -0
  208. data/spec/dummy/app/views/users/edit.html.erb +6 -0
  209. data/spec/dummy/app/views/users/index.html.erb +25 -0
  210. data/spec/dummy/app/views/users/new.html.erb +5 -0
  211. data/spec/dummy/app/views/users/show.html.erb +4 -0
  212. data/spec/dummy/app/views/versions/_form.html.erb +17 -0
  213. data/spec/dummy/app/views/versions/edit.html.erb +6 -0
  214. data/spec/dummy/app/views/versions/index.html.erb +25 -0
  215. data/spec/dummy/app/views/versions/new.html.erb +5 -0
  216. data/spec/dummy/app/views/versions/show.html.erb +4 -0
  217. data/spec/dummy/bin/bundle +3 -0
  218. data/spec/dummy/bin/rails +9 -0
  219. data/spec/dummy/bin/rake +9 -0
  220. data/spec/dummy/bin/setup +29 -0
  221. data/spec/dummy/bin/spring +16 -0
  222. data/spec/dummy/config.ru +4 -0
  223. data/spec/dummy/config/application.rb +26 -0
  224. data/spec/dummy/config/boot.rb +3 -0
  225. data/spec/dummy/config/database.yml +25 -0
  226. data/spec/dummy/config/environment.rb +5 -0
  227. data/spec/dummy/config/environments/development.rb +41 -0
  228. data/spec/dummy/config/environments/production.rb +79 -0
  229. data/spec/dummy/config/environments/test.rb +42 -0
  230. data/spec/dummy/config/initializers/assets.rb +11 -0
  231. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  232. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  233. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  234. data/spec/dummy/config/initializers/inflections.rb +16 -0
  235. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  236. data/spec/dummy/config/initializers/session_store.rb +3 -0
  237. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  238. data/spec/dummy/config/locales/en.yml +23 -0
  239. data/spec/dummy/config/routes.rb +76 -0
  240. data/spec/dummy/config/secrets.yml +22 -0
  241. data/spec/dummy/db/development.sqlite3 +0 -0
  242. data/spec/dummy/db/migrate/20110803201325_create_test_bed.rb +98 -0
  243. data/spec/dummy/db/migrate/20121009161700_add_digitals.rb +24 -0
  244. data/spec/dummy/db/migrate/20161005123106_create_digitals.rb +8 -0
  245. data/spec/dummy/db/migrate/20161005123106_create_long_and_complex_table_linked_to_versions.rb +8 -0
  246. data/spec/dummy/db/migrate/20161005123107_create_loader_releases.rb +8 -0
  247. data/spec/dummy/db/migrate/20161005123108_create_owners.rb +8 -0
  248. data/spec/dummy/db/migrate/20161005123109_create_empties.rb +8 -0
  249. data/spec/dummy/db/migrate/20161005123110_create_projects.rb +8 -0
  250. data/spec/dummy/db/migrate/20161005123111_create_users.rb +8 -0
  251. data/spec/dummy/db/migrate/20161005123111_create_versions.rb +8 -0
  252. data/spec/dummy/db/migrate/20161005123112_create_milestones.rb +8 -0
  253. data/spec/dummy/db/migrate/20161005123113_create_categories.rb +8 -0
  254. data/spec/dummy/db/schema.rb +93 -0
  255. data/spec/dummy/db/seeds.rb +9 -0
  256. data/spec/dummy/db/test.sqlite3 +0 -0
  257. data/spec/dummy/log/test.log +69 -0
  258. data/spec/dummy/public/404.html +67 -0
  259. data/spec/dummy/public/422.html +67 -0
  260. data/spec/dummy/public/500.html +66 -0
  261. data/spec/dummy/public/favicon.ico +0 -0
  262. data/spec/dummy/public/robots.txt +5 -0
  263. data/spec/dummy/sandbox_example.thor +4 -0
  264. data/spec/dummy/test/controllers/categories_controller_test.rb +49 -0
  265. data/spec/dummy/test/controllers/digitals_controller_test.rb +49 -0
  266. data/spec/dummy/test/controllers/empties_controller_test.rb +49 -0
  267. data/spec/dummy/test/controllers/loader_releases_controller_test.rb +49 -0
  268. data/spec/dummy/test/controllers/long_and_complex_table_linked_to_versions_controller_test.rb +49 -0
  269. data/spec/dummy/test/controllers/milestones_controller_test.rb +49 -0
  270. data/spec/dummy/test/controllers/owners_controller_test.rb +49 -0
  271. data/spec/dummy/test/controllers/projects_controller_test.rb +49 -0
  272. data/spec/dummy/test/controllers/users_controller_test.rb +49 -0
  273. data/spec/dummy/test/controllers/versions_controller_test.rb +49 -0
  274. data/spec/dummy/test/factories/categories.rb +5 -0
  275. data/spec/dummy/test/factories/digitals.rb +5 -0
  276. data/spec/dummy/test/factories/empties.rb +5 -0
  277. data/spec/dummy/test/factories/loader_releases.rb +5 -0
  278. data/spec/dummy/test/factories/long_and_complex_table_linked_to_versions.rb +5 -0
  279. data/spec/dummy/test/factories/milestones.rb +5 -0
  280. data/spec/dummy/test/factories/owners.rb +5 -0
  281. data/spec/dummy/test/factories/projects.rb +5 -0
  282. data/spec/dummy/test/factories/users.rb +5 -0
  283. data/spec/dummy/test/factories/versions.rb +5 -0
  284. data/spec/dummy/test/models/category_test.rb +7 -0
  285. data/spec/dummy/test/models/digital_test.rb +7 -0
  286. data/spec/dummy/test/models/empty_test.rb +7 -0
  287. data/spec/dummy/test/models/loader_release_test.rb +7 -0
  288. data/spec/dummy/test/models/long_and_complex_table_linked_to_version_test.rb +7 -0
  289. data/spec/dummy/test/models/milestone_test.rb +7 -0
  290. data/spec/dummy/test/models/owner_test.rb +7 -0
  291. data/spec/dummy/test/models/project_test.rb +7 -0
  292. data/spec/dummy/test/models/user_test.rb +7 -0
  293. data/spec/dummy/test/models/version_test.rb +7 -0
  294. data/spec/dummy/test/test_helper.rb +10 -0
  295. data/spec/exporters/csv_exporter_spec.rb +240 -0
  296. data/spec/exporters/csv_generator_spec.rb +139 -0
  297. data/spec/exporters/excel_exporter_spec.rb +193 -0
  298. data/spec/exporters/excel_generator_spec.rb +181 -0
  299. data/spec/exporters/generator_base_spec.rb +45 -0
  300. data/spec/factories/categories.rb +7 -0
  301. data/spec/factories/factories.rb +18 -0
  302. data/spec/factories/milestone.rb +16 -0
  303. data/spec/factories/projects.rb +41 -0
  304. data/spec/fixtures/BadAssociationName.xls +0 -0
  305. data/spec/fixtures/DemoNegativeTesting.xls +0 -0
  306. data/spec/fixtures/ProjectConfiguration.yml +18 -0
  307. data/spec/fixtures/ProjectsMultiCategories.xls +0 -0
  308. data/spec/fixtures/ProjectsMultiCategoriesHeaderLookup.xls +0 -0
  309. data/spec/fixtures/ProjectsSingleCategories.xls +0 -0
  310. data/spec/fixtures/ProjectsSingleCategories.xlsx +0 -0
  311. data/spec/fixtures/SimpleProjects.xls +0 -0
  312. data/spec/fixtures/config/database.yml +28 -0
  313. data/spec/fixtures/csv/BadAssociationName.csv +6 -0
  314. data/spec/fixtures/csv/DemoNegativeTesting.csv +6 -0
  315. data/spec/fixtures/csv/ProjectsMultiCategories.csv +5 -0
  316. data/spec/fixtures/csv/ProjectsMultiCategoriesHeaderLookup.csv +5 -0
  317. data/spec/fixtures/csv/ProjectsSingleCategories.csv +5 -0
  318. data/spec/fixtures/csv/SimpleProjects.csv +4 -0
  319. data/spec/fixtures/db/migrate/20110803201325_create_test_bed.rb +98 -0
  320. data/spec/fixtures/db/migrate/20121009161700_add_digitals.rb +24 -0
  321. data/spec/fixtures/db/seeds.rb +9 -0
  322. data/spec/fixtures/images/DEMO_001_ror_bag.jpeg +0 -0
  323. data/spec/fixtures/images/DEMO_002_Powerstation.jpeg +0 -0
  324. data/spec/fixtures/images/DEMO_003_ror_mug.jpeg +0 -0
  325. data/spec/fixtures/images/DEMO_004_ror_ringer.jpeg +0 -0
  326. data/spec/fixtures/load_datashift.thor +3 -0
  327. data/spec/fixtures/models/category.rb +6 -0
  328. data/spec/fixtures/models/digital.rb +22 -0
  329. data/spec/fixtures/models/empty.rb +2 -0
  330. data/spec/fixtures/models/loader_release.rb +10 -0
  331. data/spec/fixtures/models/long_and_complex_table_linked_to_version.rb +6 -0
  332. data/spec/fixtures/models/milestone.rb +15 -0
  333. data/spec/fixtures/models/owner.rb +13 -0
  334. data/spec/fixtures/models/project.rb +53 -0
  335. data/spec/fixtures/models/user.rb +5 -0
  336. data/spec/fixtures/models/version.rb +7 -0
  337. data/spec/fixtures/results/exp_project_assoc_headers.xls +0 -0
  338. data/spec/fixtures/results/exp_project_collection_spec.csv +2 -0
  339. data/spec/fixtures/results/exp_project_export.xls +0 -0
  340. data/spec/fixtures/results/exp_project_first_export.xls +0 -0
  341. data/spec/fixtures/results/exp_project_plus_assoc.xls +0 -0
  342. data/spec/fixtures/results/exp_project_plus_assoc_export_spec.csv +9 -0
  343. data/spec/fixtures/results/gen_project_plus_assoc_template.xls +0 -0
  344. data/spec/fixtures/results/gen_project_plus_some_assoc_template.xls +0 -0
  345. data/spec/fixtures/results/gen_project_template.xls +0 -0
  346. data/spec/fixtures/results/project_and_assoc_in_hash_export.xls +0 -0
  347. data/spec/fixtures/results/project_and_assoc_in_json_export.csv +9 -0
  348. data/spec/fixtures/results/project_and_assoc_in_json_export.xls +0 -0
  349. data/spec/fixtures/results/project_export_spec_with_custom_delim_,.csv +2 -0
  350. data/spec/fixtures/results/project_export_spec_with_custom_delim_/302/243.csv +2 -0
  351. data/spec/fixtures/results/project_export_spec_with_custom_delim_/302/247.csv +2 -0
  352. data/spec/fixtures/results/project_plus_assoc_template.csv +1 -0
  353. data/spec/fixtures/results/project_plus_some_assoc_template.csv +1 -0
  354. data/spec/fixtures/results/project_remove_export_spec.csv +2 -0
  355. data/spec/fixtures/results/project_template.csv +1 -0
  356. data/spec/fixtures/results/project_with_methods_export_spec.csv +2 -0
  357. data/spec/fixtures/results/thor_spec_gen_project.csv +1 -0
  358. data/spec/fixtures/sandbox_example.thor +4 -0
  359. data/spec/fixtures/simple_export_spec.xls +0 -0
  360. data/spec/fixtures/simple_template_spec.xls +0 -0
  361. data/spec/fixtures/test_model_defs.rb +7 -0
  362. data/spec/loaders/csv_loader_spec.rb +206 -0
  363. data/spec/loaders/data_flow_excel_loader_spec.rb +290 -0
  364. data/spec/loaders/excel_loader_failures_spec.rb +67 -0
  365. data/spec/loaders/excel_loader_spec.rb +294 -0
  366. data/spec/loaders/loader_base_spec.rb +29 -0
  367. data/spec/loaders/paperclip_loader_spec.rb +106 -0
  368. data/spec/log/datashift.log +14930 -0
  369. data/spec/private/digitals/1/DEMO_003_ror_mug.jpeg +0 -0
  370. data/spec/private/digitals/2/DEMO_002_Powerstation.jpeg +0 -0
  371. data/spec/private/digitals/3/DEMO_004_ror_ringer.jpeg +0 -0
  372. data/spec/private/digitals/4/DEMO_001_ror_bag.jpeg +0 -0
  373. data/spec/spec_helper.rb +26 -230
  374. data/spec/support/clear_and_manage_contexts.rb +25 -0
  375. data/spec/support/database_cleaner.rb +32 -0
  376. data/spec/support/datashift_test_helpers.rb +153 -0
  377. data/spec/support/files_paths_helper.rb +13 -0
  378. data/spec/support/fixtures/results/mapping_template.yaml +15 -0
  379. data/spec/support/sandbox.rb +136 -0
  380. metadata +804 -85
  381. data/README.markdown +0 -274
  382. data/README.rdoc +0 -19
  383. data/VERSION +0 -1
  384. data/datashift.gemspec +0 -48
  385. data/lib/applications/jruby/old_pre_proxy_jexcel_file.rb +0 -437
  386. data/lib/datashift/data_transforms.rb +0 -83
  387. data/lib/datashift/mapping_file_definitions.rb +0 -88
  388. data/lib/datashift/mapping_service.rb +0 -91
  389. data/lib/datashift/method_detail.rb +0 -165
  390. data/lib/datashift/method_details_manager.rb +0 -95
  391. data/lib/datashift/method_dictionary.rb +0 -281
  392. data/lib/datashift/method_mapper.rb +0 -174
  393. data/lib/datashift/thor_base.rb +0 -38
  394. data/lib/generators/mapping_generator.rb +0 -112
  395. data/lib/helpers/core_ext/csv_file.rb +0 -33
  396. data/lib/helpers/core_ext/to_b.rb +0 -24
  397. data/lib/loaders/reporter.rb +0 -58
  398. data/lib/thor/export.thor +0 -175
  399. data/lib/thor/generate.thor +0 -191
  400. data/lib/thor/import.thor +0 -110
  401. data/lib/thor/mapping.thor +0 -65
  402. data/lib/thor/tools.thor +0 -84
  403. data/spec/Gemfile +0 -31
  404. data/spec/Gemfile.lock +0 -134
  405. data/spec/csv_exporter_spec.rb +0 -144
  406. data/spec/csv_generator_spec.rb +0 -159
  407. data/spec/csv_loader_spec.rb +0 -212
  408. data/spec/datashift_spec.rb +0 -55
  409. data/spec/excel_exporter_spec.rb +0 -199
  410. data/spec/excel_generator_spec.rb +0 -203
  411. data/spec/excel_loader_spec.rb +0 -237
  412. data/spec/excel_spec.rb +0 -203
  413. data/spec/loader_base_spec.rb +0 -166
  414. data/spec/mapping_spec.rb +0 -117
  415. data/spec/method_dictionary_spec.rb +0 -300
  416. data/spec/method_mapper_spec.rb +0 -100
  417. data/spec/model_mapper_spec.rb +0 -41
  418. data/spec/paperclip_loader_spec.rb +0 -92
  419. data/spec/populator_spec.rb +0 -128
  420. data/spec/thor_spec.rb +0 -90
  421. data/tasks/file_tasks.rake +0 -37
  422. data/tasks/word_to_seedfu.rake +0 -167
@@ -0,0 +1,27 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
6
+
7
+ module DataShift
8
+
9
+ describe FailureData do
10
+
11
+ include_context 'ClearThenManageProject'
12
+
13
+ let(:load_object) { create(:project, title: 'my title') }
14
+
15
+ let(:model_method) { project_collection.search('value_as_string') }
16
+
17
+ let(:method_binding) { MethodBinding.new('value_as_string', 1, model_method) }
18
+
19
+ let(:node_context) { DataShift::NodeContext.new(self, method_binding, 1, "1,2,3") }
20
+
21
+ it 'should store details of load object and inbound context' do
22
+ failed = FailureData.new(load_object, node_context)
23
+ expect(failed).to be
24
+ end
25
+
26
+ end
27
+ end
@@ -1,8 +1,8 @@
1
1
  # To change this template, choose Tools | Templates
2
2
  # and open the template in the editor.
3
3
 
4
- $:.unshift File.join(File.dirname(__FILE__),'..','lib')
5
- $:.unshift File.join(File.dirname(__FILE__),'..','lib', 'engine')
4
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
5
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib', 'engine')
6
6
 
7
7
  require 'test/unit'
8
8
  require 'file_definitions'
@@ -27,12 +27,11 @@ class File_definitions < Test::Unit::TestCase
27
27
 
28
28
  end
29
29
 
30
-
31
30
  def test_fields_symbols
32
31
  klass = Object.const_set('SymClass', Class.new)
33
32
  klass.module_eval do
34
33
  include FileDefinitions
35
- create_field_definition [:a_symbol, :b_symbol]
34
+ create_field_definition [:a_symbol, :b_symbol]
36
35
 
37
36
  create_field_attr_accessors
38
37
  end
@@ -45,16 +44,16 @@ class File_definitions < Test::Unit::TestCase
45
44
  klass = Object.const_set('A', Class.new)
46
45
  klass.module_eval do
47
46
  include FileDefinitions
48
- create_field_definition %w{abc def ghi jkl}
47
+ create_field_definition %w(abc def ghi jkl)
49
48
 
50
49
  create_field_attr_accessors
51
50
  end
52
51
 
53
52
  x = A.new
54
53
 
55
- assert_equal ["abc", "def", "ghi", "jkl"], A.field_definition.sort
54
+ assert_equal %w(abc def ghi jkl), A.field_definition.sort
56
55
 
57
- A::add_field( "xyz" )
56
+ A.add_field( 'xyz' )
58
57
 
59
58
  line = '1,2,3,4, 5'
60
59
  x = A.new(line)
@@ -101,9 +100,9 @@ class File_definitions < Test::Unit::TestCase
101
100
  assert_equal 3, AFixed.field_definition.size
102
101
  assert_equal 3, AFixed.fixed_definition.keys.size
103
102
 
104
- assert_equal ["ccy", "date", "value"], AFixed.field_definition.sort
103
+ assert_equal %w(ccy date value), AFixed.field_definition.sort
105
104
 
106
- assert_equal AFixed.field_definition.sort, AFixed.fixed_definition.keys.sort
105
+ assert_equal AFixed.field_definition.sort, AFixed.fixed_definition.keys.sort
107
106
 
108
107
  assert_instance_of Range, AFixed.fixed_definition.values[0]
109
108
 
@@ -133,7 +132,7 @@ class File_definitions < Test::Unit::TestCase
133
132
 
134
133
  create_field_attr_accessors
135
134
  end
136
- flunk # We should never get here
135
+ flunk # We should never get here
137
136
  rescue => e
138
137
  assert e
139
138
  end
@@ -0,0 +1,56 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2011
2
+ # Author :: Tom Statter
3
+ # Date :: Aug 2011
4
+ # License:: MIT
5
+ #
6
+ # Details:: Specs for base class Loader
7
+ #
8
+ require File.dirname(__FILE__) + '/../spec_helper'
9
+
10
+ describe 'Headers' do
11
+ before(:each) do
12
+ end
13
+
14
+ context 'No Initial Headers' do
15
+ it 'should be able to populate empty' do
16
+ expect(DataShift::Headers.new( :csv, 0 )).to be
17
+ end
18
+
19
+ it 'should be able to identify the source and index' do
20
+ h = DataShift::Headers.new( :csv, 2 )
21
+ expect(h.source).to eq :csv
22
+ expect(h.idx).to eq 2
23
+ end
24
+
25
+ it 'should act like an Array' do
26
+ h = DataShift::Headers.new( :csv, 0 )
27
+
28
+ expect(h.respond_to?(:each)).to eq true
29
+ end
30
+
31
+ it 'should be able to add headers as if using an Array' do
32
+ h = DataShift::Headers.new( :csv, 0 )
33
+
34
+ expect(h.size).to eq 0
35
+ expect(h.empty?).to eq true
36
+
37
+ h << 'sku'
38
+
39
+ expect(h.size).to eq 1
40
+ expect(h.empty?).to eq false
41
+ end
42
+
43
+ it 'should be able to read headers as if using an Array' do
44
+ h = DataShift::Headers.new( :csv, 0 )
45
+
46
+ expect(h.size).to eq 0
47
+ expect(h.empty?).to eq true
48
+
49
+ h << 'sku'
50
+
51
+ expect(h.size).to eq 1
52
+ expect(h.empty?).to eq false
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,47 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
6
+
7
+ module DataShift
8
+
9
+ module InboundData
10
+
11
+ describe 'Inbound Data' do
12
+ it 'should store details of inbound lookup' do
13
+ ls = LookupSupport.new( Project, :title, 'my title')
14
+ expect(ls).to be
15
+ end
16
+
17
+ it 'should store details of inbound column' do
18
+ c = Column.new( 'Value As A String')
19
+ expect(c).to be
20
+ end
21
+
22
+ it 'should store details of inbound column with its column number' do
23
+ c = Column.new( 'Value As A String', 0)
24
+ expect(c).to be
25
+ end
26
+
27
+ context 'lookups' do
28
+ let(:create_project) { create(:project, title: 'my title') }
29
+
30
+ let(:lookup) { LookupSupport.new( Project, :title, 'my title') }
31
+
32
+ it 'should enable lookup of a domain object' do
33
+ create_project
34
+ result = lookup.klass.where( lookup.field => lookup.where_value ).first
35
+ expect(result).to be_a Project
36
+ end
37
+
38
+ it 'should provide shortcut to return active record relation', fail: true do
39
+ id = create_project.id
40
+ result = lookup.find
41
+ expect(result).to be_a ActiveRecord::Relation
42
+ expect(result.first.id).to eq id
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Aug 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: Specs for Mapping aspects
7
+ # Provides automatic mapping between different system's column headings
8
+ #
9
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
10
+
11
+ describe 'MapperUtils' do
12
+
13
+ it 'should identify the class from a string' do
14
+ # Similar to const_get_from_string except this version
15
+ # returns nil if no such class found
16
+ # Support modules e.g "Spree::Property"
17
+ #
18
+ expect(DataShift::MapperUtils.class_from_string( Project)).to be_a Class
19
+ end
20
+
21
+ it 'should identify the class from a string containing modules' do
22
+ # Similar to const_get_from_string except this version
23
+ # returns nil if no such class found
24
+ # Support modules e.g "Spree::Property"
25
+ #
26
+ expect(DataShift::MapperUtils.class_from_string( DataShift::AClassInAModule )).to be_a Class
27
+ end
28
+
29
+ it 'should ensure a valid class is returned whether a class or string passed in' do
30
+ expect(DataShift::MapperUtils.ensure_class("Project")).to be_a Class
31
+ expect(DataShift::MapperUtils.ensure_class(Project)).to be_a Class
32
+ end
33
+
34
+ it 'should throw when invalid class supplied' do
35
+ expect { DataShift::MapperUtils.ensure_class("Proj") }.to raise_error
36
+ end
37
+
38
+ end
@@ -0,0 +1,60 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Jan 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: Specs for MethodBinding aspect of Active Record Loader
7
+ # MethodBinding holds details of a method call on an AR object
8
+ # linked to the incoming column header/index
9
+ #
10
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
11
+
12
+ module DataShift
13
+
14
+ describe 'Method Binding' do
15
+ include_context 'ClearThenManageProject'
16
+
17
+ let( :model_method) { project_collection.search('value_as_string') }
18
+
19
+ it 'should bind details of inbound header to domain model' do
20
+ binding = MethodBinding.new('value_as_string', 1, model_method)
21
+ expect(binding).to be
22
+ end
23
+
24
+ context ('Bound to Header') do
25
+ let(:binding) { MethodBinding.new('value_as_string', 1, model_method) }
26
+
27
+ let(:valid_column_on_project) { 'value_as_string' }
28
+
29
+ it 'should provide access to inbound column (header)' do
30
+ expect(binding.inbound_column).to be_a InboundData::Column
31
+ end
32
+
33
+ it 'should provide access to domain model method' do
34
+ expect(binding.model_method).to eq model_method
35
+ end
36
+
37
+ it 'should enable an index to be set for index style processors' do
38
+ binding = MethodBinding.new(valid_column_on_project, 2, model_method)
39
+ expect(binding.inbound_column.index).to eq 2
40
+
41
+ binding = MethodBinding.new(valid_column_on_project, 99999, model_method)
42
+ expect(binding.inbound_column.index).to eq 99999
43
+ end
44
+
45
+ it 'should be valid when both name and model method provided' do
46
+ binding = MethodBinding.new(valid_column_on_project, 2, model_method)
47
+ expect(binding.valid?).to eq true
48
+ end
49
+
50
+ it 'should be invalid when either name or model method nil' do
51
+ binding = MethodBinding.new(nil, 3, model_method)
52
+ expect(binding.valid?).to eq false
53
+
54
+ binding = MethodBinding.new(valid_column_on_project, 3, nil)
55
+ expect(binding.valid?).to eq false
56
+ end
57
+ end
58
+ end
59
+
60
+ end
@@ -0,0 +1,109 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Jan 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: Specs for ModelMethod aspect of
7
+ #
8
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
9
+
10
+
11
+ module DataShift
12
+
13
+ describe 'Model Method' do
14
+ include_context 'ClearAllCatalogues'
15
+
16
+ it 'should hold details of assignment method on a class' do
17
+ model_method = DataShift::ModelMethod.new(Project, :value_as_string, :assignment )
18
+
19
+ expect(model_method).to be
20
+ end
21
+
22
+ it 'should hold details of belongs_to method on a class' do
23
+ model_method = DataShift::ModelMethod.new(Project, 'user', :belongs_to )
24
+
25
+ expect(model_method).to be
26
+ end
27
+
28
+ it 'should hold details of has_one method on a class' do
29
+ model_method = DataShift::ModelMethod.new(Project, 'owner', :has_one )
30
+
31
+ expect(model_method).to be
32
+ end
33
+
34
+ it 'should hold details of has_many method on a class' do
35
+ model_method = DataShift::ModelMethod.new(Project, 'milestones', :has_many )
36
+
37
+ expect(model_method).to be
38
+ end
39
+
40
+ it 'should hold details of a callable method on a class' do
41
+ model_method = DataShift::ModelMethod.new(Project, 'my_funky_method', :method )
42
+
43
+ expect(model_method).to be
44
+
45
+ expect(model_method.operator).to eq 'my_funky_method'
46
+ expect(model_method.operator_type).to eq :method
47
+ end
48
+
49
+ it 'should hold details of operator type as a symbol' do
50
+ model_method = DataShift::ModelMethod.new(Project, 'my_funky_method', 'method' )
51
+ expect(model_method.operator_type).to eq :method
52
+
53
+ model_method = DataShift::ModelMethod.new(Owner, 'milestones', 'has_many' )
54
+ expect(model_method.operator_type).to eq :has_many
55
+ end
56
+
57
+ it 'should raise when unknown type' do
58
+ expect { DataShift::ModelMethod.new(Project, 'milestones', :junk ) }.to raise_error BadOperatorType
59
+ end
60
+
61
+ it 'should be comparable based on class' do
62
+
63
+ a = DataShift::ModelMethod.new(Owner, 'owner', :has_one)
64
+ b = DataShift::ModelMethod.new(Project, 'owner', :has_one)
65
+
66
+ expect(a == b).to eq false
67
+
68
+ expect(a).to be < b
69
+ expect(b).to be > a
70
+ end
71
+
72
+ it 'should be comparable based on operator_type and operator' do
73
+
74
+ a = DataShift::ModelMethod.new(Project, 'value_as_text', :assignment )
75
+ b = DataShift::ModelMethod.new(Project, 'title', :assignment )
76
+ a_again = DataShift::ModelMethod.new(Project, 'value_as_text', :assignment )
77
+ a_diff_type = DataShift::ModelMethod.new(Project, 'value_as_text', :has_one )
78
+
79
+ c = DataShift::ModelMethod.new(Project, 'owner', :has_one )
80
+
81
+ d = DataShift::ModelMethod.new(Project, 'owner', :has_many )
82
+ d_again = DataShift::ModelMethod.new(Project, 'owner', :has_many )
83
+
84
+ expect(a == b).to eq false
85
+ expect(a == a).to eq true
86
+ expect(a == a_again).to eq true
87
+ expect(a == a_diff_type).to eq false
88
+ expect(c == d).to eq false
89
+ expect(d == d_again).to eq true
90
+
91
+ expect(a).to be > b
92
+
93
+ # i.e assignment comes before has_one
94
+ expect(a).to be < a_diff_type
95
+
96
+ expect(c).to be < a_diff_type
97
+ expect(c).to be < d
98
+ expect(d).to be > c
99
+ expect(d).to be >= d_again
100
+
101
+ clist = [a, d_again, b, d, c]
102
+
103
+ clist.sort!
104
+
105
+ expect(clist).to eq [b, a,c ,d, d_again]
106
+ end
107
+ end
108
+
109
+ end
@@ -0,0 +1,111 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2011
2
+ # Author :: Tom Statter
3
+ # Date :: Mar 2015
4
+ # License:: MIT
5
+ #
6
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
7
+
8
+ module DataShift
9
+
10
+ module ModelMethods
11
+
12
+ describe 'Model Methods' do
13
+ include_context 'ClearAllCatalogues'
14
+
15
+ context 'Catalogue a Class' do
16
+ it 'should enable checking a model catalogued' do
17
+ expect(Catalogue.catalogued?(Milestone) ).to eq false
18
+ end
19
+
20
+ it 'should report how many classes catalogued' do
21
+ expect(Catalogue.size ).to eq 0
22
+ end
23
+
24
+ it 'should catalogue model methods on a domain model' do
25
+ Catalogue.populate( Milestone )
26
+
27
+ expect(Catalogue.size ).to eq 1
28
+ expect(Catalogue.catalogued?(Milestone) ).to eq true
29
+ end
30
+
31
+ it 'should catalogue model methods on a domain model once' do
32
+ Catalogue.populate( Milestone )
33
+ Catalogue.populate( Milestone )
34
+
35
+ expect(Catalogue.size ).to eq 1
36
+ expect(Catalogue.catalogued?(Milestone) ).to eq true
37
+ end
38
+
39
+ it 'should catalogue multiple domain models' do
40
+ Catalogue.populate( Milestone )
41
+ Catalogue.populate( Project )
42
+ expect(Catalogue.size ).to eq 2
43
+
44
+ expect(Catalogue.catalogued?(Project)).to eq true
45
+ expect(Catalogue.catalogued?(Owner)).to eq false
46
+ end
47
+ end
48
+
49
+ context 'interrogate a Class' do
50
+ before(:each) do
51
+ Catalogue.populate( Project )
52
+ Catalogue.populate( Milestone )
53
+ end
54
+
55
+ it 'should interrogate a domain model to build has_many associations' do
56
+ expect(Catalogue.has_many).to_not be_empty
57
+
58
+ expect(Catalogue.has_many[Project]).to include('milestones')
59
+ end
60
+
61
+ it 'should interrogate a domain model to build set of model methods' do
62
+ expect(Catalogue.assignments).to_not be_empty
63
+ expect(Catalogue.assignments[Project]).to include('id')
64
+ expect( Catalogue.assignments[Project]).to include('value_as_string')
65
+ expect(Catalogue.assignments[Project]).to include('value_as_text')
66
+
67
+ expect( Catalogue.belongs_to).to_not be_empty
68
+ expect(Catalogue.belongs_to[Project]).to include 'user'
69
+
70
+ expect(Catalogue.column_types).to be_is_a(Hash)
71
+ expect(Catalogue.column_types).to_not be_empty
72
+ expect(Catalogue.column_types[Project].size).to eq Project.columns.size
73
+ end
74
+
75
+ it 'should return a list of assignment members' do
76
+ expect(Catalogue.assignments_for(Project)).to be_a Array
77
+ end
78
+
79
+ it 'should populate assignment members without the equivalent association names' do
80
+ # we should remove has-many & belongs_to from basic assignment set as they require a DB lookup
81
+ # or a Model.create call, not a simple assignment
82
+ expect(Catalogue.assignments_for(Project)).to_not include Catalogue.belongs_to_for(Project)
83
+ expect(Catalogue.assignments_for(Project)).to_not include Catalogue.has_many_for(Project)
84
+ end
85
+
86
+ it 'has the operator names in the array' do
87
+ name = Catalogue.assignments_for(Project).first
88
+
89
+ expect(name).to be_a String
90
+ expect(name.size).to be > 0
91
+ end
92
+
93
+ it 'can include instance methods' do
94
+ Catalogue.populate( Owner, instance_methods: true )
95
+
96
+ expect( Catalogue.assignments_for(Owner)).to include 'after_add_for_digitals'
97
+ end
98
+
99
+ it 'can force a reload' do
100
+ Catalogue.populate( Owner )
101
+
102
+ count = Catalogue.assignments_for(Owner).size
103
+
104
+ Catalogue.populate( Owner, reload: true, instance_methods: true )
105
+
106
+ expect(Catalogue.assignments_for(Owner).size).to be > count
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end