data_active 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/.gitignore +35 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +4 -0
  4. data/README.rdoc +275 -0
  5. data/Rakefile +2 -0
  6. data/data_active.gemspec +28 -0
  7. data/features/remove_records_missing_in_xml.feature +30 -0
  8. data/features/step_definitions/remove_records_missing_in_xml.rb +85 -0
  9. data/features/step_definitions/step_helper.rb +15 -0
  10. data/features/step_definitions/sync_books_with_xml.rb +224 -0
  11. data/features/step_definitions/update_database_with_xml.rb +158 -0
  12. data/features/step_definitions/web_steps.rb +211 -0
  13. data/features/support/env.rb +50 -0
  14. data/features/support/fixtures/fresh/book_prices.yml +6 -0
  15. data/features/support/fixtures/fresh/books.yml +7 -0
  16. data/features/support/fixtures/fresh/chapters.yml +35 -0
  17. data/features/support/fixtures/fresh/pages.yml +149 -0
  18. data/features/support/fixtures/no_matching_records/book_prices.yml +6 -0
  19. data/features/support/fixtures/no_matching_records/books.yml +7 -0
  20. data/features/support/fixtures/no_matching_records/chapters.yml +35 -0
  21. data/features/support/fixtures/no_matching_records/pages.yml +149 -0
  22. data/features/support/fixtures/without_chapters/books.yml +7 -0
  23. data/features/support/fixtures/without_one_to_one/books.yml +7 -0
  24. data/features/support/fixtures/without_one_to_one/chapters.yml +35 -0
  25. data/features/support/fixtures/without_one_to_one/pages.yml +149 -0
  26. data/features/support/fixtures/xml/books_changed.xml +173 -0
  27. data/features/support/fixtures/xml/books_fresh.xml +173 -0
  28. data/features/support/fixtures/xml/books_one_to_one_changed.xml +173 -0
  29. data/features/support/fixtures/xml/books_one_to_one_mismatch.xml +173 -0
  30. data/features/support/fixtures/xml/books_one_to_one_removed.xml +167 -0
  31. data/features/support/fixtures/xml/books_simple.xml +15 -0
  32. data/features/support/fixtures/xml/books_with_changed_chapters.xml +40 -0
  33. data/features/support/fixtures/xml/books_with_chapters.xml +45 -0
  34. data/features/support/fixtures/xml/books_with_many_one_to_one_records.xml +179 -0
  35. data/features/support/fixtures/xml/books_with_mismatched_chapters.xml +173 -0
  36. data/features/support/fixtures/xml/books_with_moved_chapters.xml +173 -0
  37. data/features/support/fixtures/xml/books_with_one_to_one.xml +167 -0
  38. data/features/support/fixtures/xml/books_with_removed_chapters.xml +113 -0
  39. data/features/support/fixtures/xml/books_without_chapters.xml +11 -0
  40. data/features/support/fixtures/xml/books_without_one_to_one.xml +167 -0
  41. data/features/support/fixtures/xml/ms_access/book.xml +201 -0
  42. data/features/support/fixtures/xml/ms_access/book.xsd +425 -0
  43. data/features/support/fixtures/xml/ms_access/books_changed.xml +158 -0
  44. data/features/support/fixtures/xml/ms_access/books_fresh.xml +173 -0
  45. data/features/support/fixtures/xml/ms_access/books_one_to_one_changed.xml +173 -0
  46. data/features/support/fixtures/xml/ms_access/books_one_to_one_mismatch.xml +173 -0
  47. data/features/support/fixtures/xml/ms_access/books_one_to_one_removed.xml +167 -0
  48. data/features/support/fixtures/xml/ms_access/books_simple.xml +15 -0
  49. data/features/support/fixtures/xml/ms_access/books_with_changed_chapters.xml +40 -0
  50. data/features/support/fixtures/xml/ms_access/books_with_chapters.xml +45 -0
  51. data/features/support/fixtures/xml/ms_access/books_with_many_one_to_one_records.xml +179 -0
  52. data/features/support/fixtures/xml/ms_access/books_with_mismatched_chapters.xml +173 -0
  53. data/features/support/fixtures/xml/ms_access/books_with_moved_chapters.xml +173 -0
  54. data/features/support/fixtures/xml/ms_access/books_with_one_to_one.xml +167 -0
  55. data/features/support/fixtures/xml/ms_access/books_with_removed_chapters.xml +113 -0
  56. data/features/support/fixtures/xml/ms_access/books_without_chapters.xml +11 -0
  57. data/features/support/fixtures/xml/ms_access/books_without_one_to_one.xml +167 -0
  58. data/features/support/paths.rb +33 -0
  59. data/features/support/selectors.rb +39 -0
  60. data/features/sync_database_with_xml.feature +34 -0
  61. data/features/sync_one_to_many.feature +34 -0
  62. data/features/sync_one_to_one.feature +33 -0
  63. data/features/update_database_with_xml.feature +30 -0
  64. data/lib/data_active.rb +309 -0
  65. data/lib/data_active/version.rb +3 -0
  66. data/test_apps/book_store_rails_31x/.gitignore +15 -0
  67. data/test_apps/book_store_rails_31x/.rvmrc +1 -0
  68. data/test_apps/book_store_rails_31x/Gemfile +53 -0
  69. data/test_apps/book_store_rails_31x/README +261 -0
  70. data/test_apps/book_store_rails_31x/Rakefile +7 -0
  71. data/test_apps/book_store_rails_31x/app/assets/images/rails.png +0 -0
  72. data/test_apps/book_store_rails_31x/app/assets/javascripts/application.js +9 -0
  73. data/test_apps/book_store_rails_31x/app/assets/stylesheets/application.css +7 -0
  74. data/test_apps/book_store_rails_31x/app/controllers/application_controller.rb +3 -0
  75. data/test_apps/book_store_rails_31x/app/helpers/application_helper.rb +2 -0
  76. data/test_apps/book_store_rails_31x/app/mailers/.gitkeep +0 -0
  77. data/test_apps/book_store_rails_31x/app/models/.gitkeep +0 -0
  78. data/test_apps/book_store_rails_31x/app/models/book.rb +4 -0
  79. data/test_apps/book_store_rails_31x/app/models/book_price.rb +3 -0
  80. data/test_apps/book_store_rails_31x/app/models/chapter.rb +4 -0
  81. data/test_apps/book_store_rails_31x/app/models/page.rb +3 -0
  82. data/test_apps/book_store_rails_31x/app/views/layouts/application.html.erb +14 -0
  83. data/test_apps/book_store_rails_31x/config.ru +4 -0
  84. data/test_apps/book_store_rails_31x/config/application.rb +48 -0
  85. data/test_apps/book_store_rails_31x/config/boot.rb +6 -0
  86. data/test_apps/book_store_rails_31x/config/database.yml +28 -0
  87. data/test_apps/book_store_rails_31x/config/environment.rb +5 -0
  88. data/test_apps/book_store_rails_31x/config/environments/development.rb +30 -0
  89. data/test_apps/book_store_rails_31x/config/environments/production.rb +60 -0
  90. data/test_apps/book_store_rails_31x/config/environments/test.rb +39 -0
  91. data/test_apps/book_store_rails_31x/config/initializers/backtrace_silencers.rb +7 -0
  92. data/test_apps/book_store_rails_31x/config/initializers/inflections.rb +10 -0
  93. data/test_apps/book_store_rails_31x/config/initializers/mime_types.rb +5 -0
  94. data/test_apps/book_store_rails_31x/config/initializers/secret_token.rb +7 -0
  95. data/test_apps/book_store_rails_31x/config/initializers/session_store.rb +8 -0
  96. data/test_apps/book_store_rails_31x/config/initializers/wrap_parameters.rb +14 -0
  97. data/test_apps/book_store_rails_31x/config/locales/en.yml +5 -0
  98. data/test_apps/book_store_rails_31x/config/routes.rb +58 -0
  99. data/test_apps/book_store_rails_31x/db/migrate/20120422053943_create_books.rb +9 -0
  100. data/test_apps/book_store_rails_31x/db/migrate/20120422054008_create_chapters.rb +11 -0
  101. data/test_apps/book_store_rails_31x/db/migrate/20120422054033_create_pages.rb +11 -0
  102. data/test_apps/book_store_rails_31x/db/migrate/20120422054123_create_book_prices.rb +12 -0
  103. data/test_apps/book_store_rails_31x/db/schema.rb +47 -0
  104. data/test_apps/book_store_rails_31x/db/seeds.rb +7 -0
  105. data/test_apps/book_store_rails_31x/lib/assets/.gitkeep +0 -0
  106. data/test_apps/book_store_rails_31x/lib/tasks/.gitkeep +0 -0
  107. data/test_apps/book_store_rails_31x/log/.gitkeep +0 -0
  108. data/test_apps/book_store_rails_31x/public/404.html +26 -0
  109. data/test_apps/book_store_rails_31x/public/422.html +26 -0
  110. data/test_apps/book_store_rails_31x/public/500.html +26 -0
  111. data/test_apps/book_store_rails_31x/public/favicon.ico +0 -0
  112. data/test_apps/book_store_rails_31x/public/index.html +241 -0
  113. data/test_apps/book_store_rails_31x/public/robots.txt +5 -0
  114. data/test_apps/book_store_rails_31x/script/rails +6 -0
  115. data/test_apps/book_store_rails_31x/test/fixtures/.gitkeep +0 -0
  116. data/test_apps/book_store_rails_31x/test/functional/.gitkeep +0 -0
  117. data/test_apps/book_store_rails_31x/test/integration/.gitkeep +0 -0
  118. data/test_apps/book_store_rails_31x/test/performance/browsing_test.rb +12 -0
  119. data/test_apps/book_store_rails_31x/test/test_helper.rb +13 -0
  120. data/test_apps/book_store_rails_31x/test/unit/.gitkeep +0 -0
  121. data/test_apps/book_store_rails_31x/vendor/assets/stylesheets/.gitkeep +0 -0
  122. data/test_apps/book_store_rails_31x/vendor/plugins/.gitkeep +0 -0
  123. data/test_apps/book_store_rails_32x/.gitignore +15 -0
  124. data/test_apps/book_store_rails_32x/.rvmrc +1 -0
  125. data/test_apps/book_store_rails_32x/Gemfile +47 -0
  126. data/test_apps/book_store_rails_32x/README.rdoc +261 -0
  127. data/test_apps/book_store_rails_32x/Rakefile +14 -0
  128. data/test_apps/book_store_rails_32x/app/assets/images/rails.png +0 -0
  129. data/test_apps/book_store_rails_32x/app/assets/javascripts/application.js +15 -0
  130. data/test_apps/book_store_rails_32x/app/assets/stylesheets/application.css +13 -0
  131. data/test_apps/book_store_rails_32x/app/controllers/application_controller.rb +3 -0
  132. data/test_apps/book_store_rails_32x/app/helpers/application_helper.rb +2 -0
  133. data/test_apps/book_store_rails_32x/app/mailers/.gitkeep +0 -0
  134. data/test_apps/book_store_rails_32x/app/models/.gitkeep +0 -0
  135. data/test_apps/book_store_rails_32x/app/models/book.rb +4 -0
  136. data/test_apps/book_store_rails_32x/app/models/book_price.rb +3 -0
  137. data/test_apps/book_store_rails_32x/app/models/chapter.rb +4 -0
  138. data/test_apps/book_store_rails_32x/app/models/page.rb +3 -0
  139. data/test_apps/book_store_rails_32x/app/views/layouts/application.html.erb +14 -0
  140. data/test_apps/book_store_rails_32x/config.ru +4 -0
  141. data/test_apps/book_store_rails_32x/config/application.rb +59 -0
  142. data/test_apps/book_store_rails_32x/config/boot.rb +6 -0
  143. data/test_apps/book_store_rails_32x/config/cucumber.yml +8 -0
  144. data/test_apps/book_store_rails_32x/config/database.yml +28 -0
  145. data/test_apps/book_store_rails_32x/config/environment.rb +5 -0
  146. data/test_apps/book_store_rails_32x/config/environments/development.rb +37 -0
  147. data/test_apps/book_store_rails_32x/config/environments/production.rb +67 -0
  148. data/test_apps/book_store_rails_32x/config/environments/test.rb +37 -0
  149. data/test_apps/book_store_rails_32x/config/initializers/backtrace_silencers.rb +7 -0
  150. data/test_apps/book_store_rails_32x/config/initializers/inflections.rb +15 -0
  151. data/test_apps/book_store_rails_32x/config/initializers/mime_types.rb +5 -0
  152. data/test_apps/book_store_rails_32x/config/initializers/secret_token.rb +7 -0
  153. data/test_apps/book_store_rails_32x/config/initializers/session_store.rb +8 -0
  154. data/test_apps/book_store_rails_32x/config/initializers/wrap_parameters.rb +14 -0
  155. data/test_apps/book_store_rails_32x/config/locales/en.yml +5 -0
  156. data/test_apps/book_store_rails_32x/config/routes.rb +58 -0
  157. data/test_apps/book_store_rails_32x/db/migrate/20120422043253_create_books.rb +9 -0
  158. data/test_apps/book_store_rails_32x/db/migrate/20120422043434_create_chapters.rb +11 -0
  159. data/test_apps/book_store_rails_32x/db/migrate/20120422043553_create_pages.rb +11 -0
  160. data/test_apps/book_store_rails_32x/db/migrate/20120422043700_create_book_prices.rb +12 -0
  161. data/test_apps/book_store_rails_32x/db/schema.rb +47 -0
  162. data/test_apps/book_store_rails_32x/db/seeds.rb +7 -0
  163. data/test_apps/book_store_rails_32x/lib/assets/.gitkeep +0 -0
  164. data/test_apps/book_store_rails_32x/lib/tasks/.gitkeep +0 -0
  165. data/test_apps/book_store_rails_32x/lib/tasks/cucumber.rake +65 -0
  166. data/test_apps/book_store_rails_32x/log/.gitkeep +0 -0
  167. data/test_apps/book_store_rails_32x/public/404.html +26 -0
  168. data/test_apps/book_store_rails_32x/public/422.html +26 -0
  169. data/test_apps/book_store_rails_32x/public/500.html +25 -0
  170. data/test_apps/book_store_rails_32x/public/favicon.ico +0 -0
  171. data/test_apps/book_store_rails_32x/public/index.html +241 -0
  172. data/test_apps/book_store_rails_32x/public/robots.txt +5 -0
  173. data/test_apps/book_store_rails_32x/script/cucumber +10 -0
  174. data/test_apps/book_store_rails_32x/script/rails +6 -0
  175. data/test_apps/book_store_rails_32x/test/fixtures/.gitkeep +0 -0
  176. data/test_apps/book_store_rails_32x/test/functional/.gitkeep +0 -0
  177. data/test_apps/book_store_rails_32x/test/integration/.gitkeep +0 -0
  178. data/test_apps/book_store_rails_32x/test/performance/browsing_test.rb +12 -0
  179. data/test_apps/book_store_rails_32x/test/test_helper.rb +13 -0
  180. data/test_apps/book_store_rails_32x/test/unit/.gitkeep +0 -0
  181. data/test_apps/book_store_rails_32x/vendor/assets/javascripts/.gitkeep +0 -0
  182. data/test_apps/book_store_rails_32x/vendor/assets/stylesheets/.gitkeep +0 -0
  183. data/test_apps/book_store_rails_32x/vendor/plugins/.gitkeep +0 -0
  184. metadata +452 -0
@@ -0,0 +1,113 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <books type="array">
3
+ <book>
4
+ <id type="integer">1</id>
5
+ <name>Book 1</name>
6
+ <chapters type="array">
7
+ <chapter>
8
+ <id type="integer">2</id>
9
+ <title>Chapter 2</title>
10
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
11
+ <pages type="array">
12
+ <page>
13
+ <id type="integer">5</id>
14
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
15
+ <number>1</number>
16
+ </page>
17
+ <page>
18
+ <id type="integer">6</id>
19
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
20
+ <number>2</number>
21
+ </page>
22
+ <page>
23
+ <id type="integer">7</id>
24
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
25
+ <number>3</number>
26
+ </page>
27
+ <page>
28
+ <id type="integer">8</id>
29
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
30
+ <number>4</number>
31
+ </page>
32
+ </pages>
33
+ </chapter>
34
+ <chapter>
35
+ <id type="integer">3</id>
36
+ <title>Chapter 3</title>
37
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
38
+ <pages type="array">
39
+ <page>
40
+ <id type="integer">9</id>
41
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
42
+ <number>1</number>
43
+ </page>
44
+ <page>
45
+ <id type="integer">10</id>
46
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
47
+ <number>2</number>
48
+ </page>
49
+ <page>
50
+ <id type="integer">11</id>
51
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
52
+ <number>3</number>
53
+ </page>
54
+ </pages>
55
+ </chapter>
56
+ </chapters>
57
+ </book>
58
+ <book>
59
+ <id type="integer">2</id>
60
+ <name>Book 1</name>
61
+ <chapters type="array">
62
+ <chapter>
63
+ <id type="integer">4</id>
64
+ <title>Chapter 1</title>
65
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
66
+ <pages type="array">
67
+ <page>
68
+ <id type="integer">12</id>
69
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
70
+ <number>1</number>
71
+ </page>
72
+ <page>
73
+ <id type="integer">13</id>
74
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
75
+ <number>2</number>
76
+ </page>
77
+ <page>
78
+ <id type="integer">14</id>
79
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
80
+ <number>3</number>
81
+ </page>
82
+ <page>
83
+ <id type="integer">15</id>
84
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
85
+ <number>4</number>
86
+ </page>
87
+ </pages>
88
+ </chapter>
89
+ <chapter>
90
+ <id type="integer">6</id>
91
+ <title>Chapter 3</title>
92
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
93
+ <pages type="array">
94
+ <page>
95
+ <id type="integer">20</id>
96
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
97
+ <number>1</number>
98
+ </page>
99
+ <page>
100
+ <id type="integer">21</id>
101
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
102
+ <number>2</number>
103
+ </page>
104
+ <page>
105
+ <id type="integer">22</id>
106
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
107
+ <number>3</number>
108
+ </page>
109
+ </pages>
110
+ </chapter>
111
+ </chapters>
112
+ </book>
113
+ </books>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <books type="array">
3
+ <book>
4
+ <id type="integer">1</id>
5
+ <name>Book 1</name>
6
+ </book>
7
+ <book>
8
+ <id type="integer">2</id>
9
+ <name>Book 2</name>
10
+ </book>
11
+ </books>
@@ -0,0 +1,167 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <books type="array">
3
+ <book>
4
+ <id type="integer">1</id>
5
+ <name>Book 1</name>
6
+ <chapters type="array">
7
+ <chapter>
8
+ <id type="integer">1</id>
9
+ <title>Chapter 1</title>
10
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
11
+ <pages type="array">
12
+ <page>
13
+ <id type="integer">1</id>
14
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
15
+ <number>1</number>
16
+ </page>
17
+ <page>
18
+ <id type="integer">2</id>
19
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
20
+ <number>2</number>
21
+ </page>
22
+ <page>
23
+ <id type="integer">3</id>
24
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
25
+ <number>3</number>
26
+ </page>
27
+ <page>
28
+ <id type="integer">4</id>
29
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
30
+ <number>4</number>
31
+ </page>
32
+ </pages>
33
+ </chapter>
34
+ <chapter>
35
+ <id type="integer">2</id>
36
+ <title>Chapter 2</title>
37
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
38
+ <pages type="array">
39
+ <page>
40
+ <id type="integer">5</id>
41
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
42
+ <number>1</number>
43
+ </page>
44
+ <page>
45
+ <id type="integer">6</id>
46
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
47
+ <number>2</number>
48
+ </page>
49
+ <page>
50
+ <id type="integer">7</id>
51
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
52
+ <number>3</number>
53
+ </page>
54
+ <page>
55
+ <id type="integer">8</id>
56
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
57
+ <number>4</number>
58
+ </page>
59
+ </pages>
60
+ </chapter>
61
+ <chapter>
62
+ <id type="integer">3</id>
63
+ <title>Chapter 3</title>
64
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
65
+ <pages type="array">
66
+ <page>
67
+ <id type="integer">9</id>
68
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
69
+ <number>1</number>
70
+ </page>
71
+ <page>
72
+ <id type="integer">10</id>
73
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
74
+ <number>2</number>
75
+ </page>
76
+ <page>
77
+ <id type="integer">11</id>
78
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
79
+ <number>3</number>
80
+ </page>
81
+ </pages>
82
+ </chapter>
83
+ </chapters>
84
+ </book>
85
+ <book>
86
+ <id type="integer">2</id>
87
+ <name>Book 1</name>
88
+ <chapters type="array">
89
+ <chapter>
90
+ <id type="integer">4</id>
91
+ <title>Chapter 1</title>
92
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
93
+ <pages type="array">
94
+ <page>
95
+ <id type="integer">12</id>
96
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
97
+ <number>1</number>
98
+ </page>
99
+ <page>
100
+ <id type="integer">13</id>
101
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
102
+ <number>2</number>
103
+ </page>
104
+ <page>
105
+ <id type="integer">14</id>
106
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
107
+ <number>3</number>
108
+ </page>
109
+ <page>
110
+ <id type="integer">15</id>
111
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
112
+ <number>4</number>
113
+ </page>
114
+ </pages>
115
+ </chapter>
116
+ <chapter>
117
+ <id type="integer">5</id>
118
+ <title>Chapter 2</title>
119
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
120
+ <pages type="array">
121
+ <page>
122
+ <id type="integer">16</id>
123
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
124
+ <number>1</number>
125
+ </page>
126
+ <page>
127
+ <id type="integer">17</id>
128
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
129
+ <number>2</number>
130
+ </page>
131
+ <page>
132
+ <id type="integer">18</id>
133
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
134
+ <number>3</number>
135
+ </page>
136
+ <page>
137
+ <id type="integer">19</id>
138
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
139
+ <number>4</number>
140
+ </page>
141
+ </pages>
142
+ </chapter>
143
+ <chapter>
144
+ <id type="integer">6</id>
145
+ <title>Chapter 3</title>
146
+ <introduction>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</introduction>
147
+ <pages type="array">
148
+ <page>
149
+ <id type="integer">20</id>
150
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
151
+ <number>1</number>
152
+ </page>
153
+ <page>
154
+ <id type="integer">21</id>
155
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
156
+ <number>2</number>
157
+ </page>
158
+ <page>
159
+ <id type="integer">22</id>
160
+ <content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus purus nulla, condimentum vitae hendrerit nec, blandit et felis. Suspendisse vulputate mollis suscipit. Vivamus non libero quis urna gravida euismod quis in nisi. Morbi turpis orci, posuere nec ultrices ut, egestas ac purus. Morbi id pretium erat. In ullamcorper, ligula id porta pellentesque, sem turpis ultricies libero, non elementum ipsum neque at dui. Donec auctor nulla id mi dapibus id faucibus felis mollis. Curabitur imperdiet tristique nisi, consectetur molestie purus accumsan id. Curabitur lacinia diam et nisl iaculis eleifend. Quisque turpis elit, volutpat eget dapibus sed, egestas nec leo. Mauris dignissim tellus non lorem fringilla pharetra.</content>
161
+ <number>3</number>
162
+ </page>
163
+ </pages>
164
+ </chapter>
165
+ </chapters>
166
+ </book>
167
+ </books>
@@ -0,0 +1,33 @@
1
+ module NavigationHelpers
2
+ # Maps a name to a path. Used by the
3
+ #
4
+ # When /^I go to (.+)$/ do |page_name|
5
+ #
6
+ # step definition in web_steps.rb
7
+ #
8
+ def path_to(page_name)
9
+ case page_name
10
+
11
+ when /^the home\s?page$/
12
+ '/'
13
+
14
+ # Add more mappings here.
15
+ # Here is an example that pulls values out of the Regexp:
16
+ #
17
+ # when /^(.*)'s profile page$/i
18
+ # user_profile_path(User.find_by_login($1))
19
+
20
+ else
21
+ begin
22
+ page_name =~ /^the (.*) page$/
23
+ path_components = $1.split(/\s+/)
24
+ self.send(path_components.push('path').join('_').to_sym)
25
+ rescue NoMethodError, ArgumentError
26
+ raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
27
+ "Now, go and add a mapping in #{__FILE__}"
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ World(NavigationHelpers)
@@ -0,0 +1,39 @@
1
+ module HtmlSelectorsHelpers
2
+ # Maps a name to a selector. Used primarily by the
3
+ #
4
+ # When /^(.+) within (.+)$/ do |step, scope|
5
+ #
6
+ # step definitions in web_steps.rb
7
+ #
8
+ def selector_for(locator)
9
+ case locator
10
+
11
+ when "the page"
12
+ "html > body"
13
+
14
+ # Add more mappings here.
15
+ # Here is an example that pulls values out of the Regexp:
16
+ #
17
+ # when /^the (notice|error|info) flash$/
18
+ # ".flash.#{$1}"
19
+
20
+ # You can also return an array to use a different selector
21
+ # type, like:
22
+ #
23
+ # when /the header/
24
+ # [:xpath, "//header"]
25
+
26
+ # This allows you to provide a quoted selector as the scope
27
+ # for "within" steps as was previously the default for the
28
+ # web steps:
29
+ when /^"(.+)"$/
30
+ $1
31
+
32
+ else
33
+ raise "Can't find mapping from \"#{locator}\" to a selector.\n" +
34
+ "Now, go and add a mapping in #{__FILE__}"
35
+ end
36
+ end
37
+ end
38
+
39
+ World(HtmlSelectorsHelpers)
@@ -0,0 +1,34 @@
1
+ Feature: Synchronise database with XML
2
+ As a Developer
3
+ I need to synchronise the my database with an XML document
4
+ So my database reflects the content that exists in the XML document
5
+
6
+ Scenario Outline: Synchronise when I have some matching records in the database
7
+ Given I have a fresh set of books
8
+ And I have the "<xml_file>" file
9
+ When I synchronise with "<xml_file>"
10
+ Then the books in the database will be identical to those in "<xml_file>"
11
+ And the book price will be identical to those in "<xml_file>"
12
+ And the chapters will be identical to those in "<xml_file>"
13
+ And the database will contain identical pages for the chapters as those in "<xml_file>"
14
+
15
+ Examples:
16
+ | xml_file |
17
+ | features/support/fixtures/xml/ms_access/books_changed.xml |
18
+ | features/support/fixtures/xml/books_changed.xml |
19
+
20
+
21
+ Scenario Outline: Synchronise when there are no records in the database
22
+ Given I have no books
23
+ And I have the "<xml_file>" file
24
+ When I synchronise with "<xml_file>"
25
+ Then the books in the database will be identical to those in "<xml_file>"
26
+ And the chapters will be identical to those in "<xml_file>"
27
+ And the database will contain identical pages for the chapters as those in "<xml_file>"
28
+
29
+ Examples:
30
+ | xml_file |
31
+ | features/support/fixtures/xml/books_changed.xml |
32
+ | features/support/fixtures/xml/ms_access/books_changed.xml |
33
+
34
+ Scenario: A one to one association exists on the current ActiveRecord class
@@ -0,0 +1,34 @@
1
+ Feature: Synchronise one to many relationships
2
+ As a Developer
3
+ I need to synchronise one to many relationships in my database with an XML document
4
+ So my database reflects the content that exists in the XML document
5
+
6
+ Scenario: Create records when none exist in the database
7
+ Given I have a fresh set of books without any chapters
8
+ And I have the "features/support/fixtures/xml/books_with_chapters.xml" file
9
+ When I synchronise with "features/support/fixtures/xml/books_with_chapters.xml"
10
+ Then the chapters will be identical to those in "features/support/fixtures/xml/books_with_chapters.xml"
11
+
12
+ Scenario: Update existing records in the database
13
+ Given I have a fresh set of books
14
+ And I have the "features/support/fixtures/xml/books_with_changed_chapters.xml" file
15
+ When I synchronise with "features/support/fixtures/xml/books_with_changed_chapters.xml"
16
+ Then the chapters will be identical to those in "features/support/fixtures/xml/books_with_changed_chapters.xml"
17
+
18
+ Scenario: Replace records in the database
19
+ Given I have a fresh set of books
20
+ And I have the "features/support/fixtures/xml/books_with_mismatched_chapters.xml" file
21
+ When I synchronise with "features/support/fixtures/xml/books_with_mismatched_chapters.xml"
22
+ Then the chapters will be identical to those in "features/support/fixtures/xml/books_with_mismatched_chapters.xml"
23
+
24
+ Scenario: Parent changes records in the database
25
+ Given I have a fresh set of books
26
+ And I have the "features/support/fixtures/xml/books_with_moved_chapters.xml" file
27
+ When I synchronise with "features/support/fixtures/xml/books_with_moved_chapters.xml"
28
+ Then the chapters will be identical to those in "features/support/fixtures/xml/books_with_moved_chapters.xml"
29
+
30
+ Scenario: Remove records in the database
31
+ Given I have a fresh set of books
32
+ And I have the "features/support/fixtures/xml/books_with_removed_chapters.xml" file
33
+ When I synchronise with "features/support/fixtures/xml/books_one_to_one_removed.xml"
34
+ Then the chapters will be identical to those in "features/support/fixtures/xml/books_one_to_one_removed.xml"
@@ -0,0 +1,33 @@
1
+ Feature: Synchronise one to one relationships
2
+ As a Developer
3
+ I need to synchronise one to one relationships in my database with an XML document
4
+ So my database reflects the content that exists in the XML document
5
+
6
+ Scenario: Create records when none exist in the database
7
+ Given I have a fresh set of books without the one to one record
8
+ And I have the "features/support/fixtures/xml/books_one_to_one_changed.xml" file
9
+ When I synchronise with "features/support/fixtures/xml/books_one_to_one_changed.xml"
10
+ Then the book price will be identical to those in "features/support/fixtures/xml/books_one_to_one_changed.xml"
11
+
12
+ Scenario: Update existing records in the database
13
+ Given I have a fresh set of books
14
+ And I have the "features/support/fixtures/xml/books_one_to_one_changed.xml" file
15
+ When I synchronise with "features/support/fixtures/xml/books_one_to_one_changed.xml"
16
+ Then the book price will be identical to those in "features/support/fixtures/xml/books_one_to_one_changed.xml"
17
+
18
+ Scenario: Replace records in the database
19
+ Given I have a fresh set of books
20
+ And I have the "features/support/fixtures/xml/books_one_to_one_mismatch.xml" file
21
+ When I synchronise with "features/support/fixtures/xml/books_one_to_one_mismatch.xml"
22
+ Then the book price will be identical to those in "features/support/fixtures/xml/books_one_to_one_mismatch.xml"
23
+
24
+ Scenario: Remove records in the database
25
+ Given I have a fresh set of books
26
+ And I have the "features/support/fixtures/xml/books_one_to_one_removed.xml" file
27
+ When I synchronise with "features/support/fixtures/xml/books_one_to_one_removed.xml"
28
+ Then the book price will be identical to those in "features/support/fixtures/xml/books_one_to_one_removed.xml"
29
+
30
+ Scenario: Duplicate records in the xml
31
+ Given I have a fresh set of books
32
+ And I have the "features/support/fixtures/xml/books_with_many_one_to_one_records.xml" file
33
+ When I synchronise with "features/support/fixtures/xml/books_with_many_one_to_one_records.xml" I should get an error