asana2flowdock 1.0.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 (1601) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +58 -0
  4. data/README.md +85 -0
  5. data/Rakefile +394 -0
  6. data/a.rb +336 -0
  7. data/a.yml +6 -0
  8. data/asana2flowdock.gemspec +1878 -0
  9. data/bin/amalgalite-pack +16 -0
  10. data/bin/asana2flowdock +274 -0
  11. data/bin/asana2flowdock-daemon +16 -0
  12. data/bin/coderay +16 -0
  13. data/bin/httparty +16 -0
  14. data/bin/pry +16 -0
  15. data/bin/sekrets +16 -0
  16. data/bin/sequel +16 -0
  17. data/config/asana2flowdock.yml.enc +2 -0
  18. data/lib/asana2flowdock.rb +98 -0
  19. data/lib/asana2flowdock/asana.rb +225 -0
  20. data/vendor/bundle/ruby/1.9.1/bin/amalgalite-pack +23 -0
  21. data/vendor/bundle/ruby/1.9.1/bin/asana2flowdock +23 -0
  22. data/vendor/bundle/ruby/1.9.1/bin/asana2flowdock-daemon +23 -0
  23. data/vendor/bundle/ruby/1.9.1/bin/coderay +23 -0
  24. data/vendor/bundle/ruby/1.9.1/bin/httparty +23 -0
  25. data/vendor/bundle/ruby/1.9.1/bin/pry +23 -0
  26. data/vendor/bundle/ruby/1.9.1/bin/sekrets +23 -0
  27. data/vendor/bundle/ruby/1.9.1/bin/sequel +23 -0
  28. data/vendor/bundle/ruby/1.9.1/build_info/amalgalite-1.3.0.info +1 -0
  29. data/vendor/bundle/ruby/1.9.1/build_info/arrayfields-4.7.4.info +1 -0
  30. data/vendor/bundle/ruby/1.9.1/build_info/chronic-0.10.2.info +1 -0
  31. data/vendor/bundle/ruby/1.9.1/build_info/coderay-1.1.0.info +1 -0
  32. data/vendor/bundle/ruby/1.9.1/build_info/coerce-0.0.6.info +1 -0
  33. data/vendor/bundle/ruby/1.9.1/build_info/daemons-1.1.9.info +1 -0
  34. data/vendor/bundle/ruby/1.9.1/build_info/fastercsv-1.5.5.info +1 -0
  35. data/vendor/bundle/ruby/1.9.1/build_info/fattr-2.2.2.info +1 -0
  36. data/vendor/bundle/ruby/1.9.1/build_info/flowdock-0.5.0.info +1 -0
  37. data/vendor/bundle/ruby/1.9.1/build_info/highline-1.6.21.info +1 -0
  38. data/vendor/bundle/ruby/1.9.1/build_info/httparty-0.13.1.info +1 -0
  39. data/vendor/bundle/ruby/1.9.1/build_info/json-1.8.1.info +1 -0
  40. data/vendor/bundle/ruby/1.9.1/build_info/main-6.0.0.info +1 -0
  41. data/vendor/bundle/ruby/1.9.1/build_info/main-6.1.0.info +1 -0
  42. data/vendor/bundle/ruby/1.9.1/build_info/map-6.5.5.info +1 -0
  43. data/vendor/bundle/ruby/1.9.1/build_info/method_source-0.8.2.info +1 -0
  44. data/vendor/bundle/ruby/1.9.1/build_info/multi_json-1.10.1.info +1 -0
  45. data/vendor/bundle/ruby/1.9.1/build_info/multi_xml-0.5.5.info +1 -0
  46. data/vendor/bundle/ruby/1.9.1/build_info/pry-0.9.12.6.info +1 -0
  47. data/vendor/bundle/ruby/1.9.1/build_info/sekrets-1.7.0.info +1 -0
  48. data/vendor/bundle/ruby/1.9.1/build_info/sequel-4.15.0.info +1 -0
  49. data/vendor/bundle/ruby/1.9.1/build_info/slop-3.5.0.info +1 -0
  50. data/vendor/bundle/ruby/1.9.1/build_info/threadify-1.3.0.info +1 -0
  51. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/CONTRIBUTING.md +49 -0
  52. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/HISTORY.md +315 -0
  53. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/LICENSE +29 -0
  54. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/Manifest.txt +104 -0
  55. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/README.md +73 -0
  56. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/Rakefile +25 -0
  57. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/TODO.md +50 -0
  58. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/bin/amalgalite-pack +147 -0
  59. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/a.rb +9 -0
  60. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/blob.rb +88 -0
  61. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/bootstrap.rb +36 -0
  62. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/define_aggregate.rb +75 -0
  63. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/define_function.rb +104 -0
  64. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/fts3.rb +144 -0
  65. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/gem-db.rb +94 -0
  66. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/require_me.rb +11 -0
  67. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/requires.rb +42 -0
  68. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/examples/schema-info.rb +34 -0
  69. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/Makefile +220 -0
  70. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite.bundle +0 -0
  71. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite.c +329 -0
  72. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite.h +151 -0
  73. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite.o +0 -0
  74. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_blob.c +240 -0
  75. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_blob.o +0 -0
  76. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_constants.c +378 -0
  77. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_constants.o +0 -0
  78. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_database.c +1177 -0
  79. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_database.o +0 -0
  80. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_requires_bootstrap.c +282 -0
  81. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_requires_bootstrap.o +0 -0
  82. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_statement.c +649 -0
  83. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/amalgalite_statement.o +0 -0
  84. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/extconf.rb +36 -0
  85. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/gen_constants.rb +193 -0
  86. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/notes.txt +134 -0
  87. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/sqlite3.c +137414 -0
  88. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/sqlite3.h +7160 -0
  89. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/sqlite3.o +0 -0
  90. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/sqlite3_options.h +4 -0
  91. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/ext/amalgalite/c/sqlite3ext.h +447 -0
  92. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite.rb +51 -0
  93. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/1.9/amalgalite.bundle +0 -0
  94. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/aggregate.rb +67 -0
  95. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/blob.rb +186 -0
  96. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/boolean.rb +42 -0
  97. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/busy_timeout.rb +47 -0
  98. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/column.rb +99 -0
  99. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/core_ext/kernel/require.rb +21 -0
  100. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/csv_table_importer.rb +74 -0
  101. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/database.rb +984 -0
  102. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/function.rb +61 -0
  103. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/index.rb +43 -0
  104. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/memory_database.rb +15 -0
  105. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/packer.rb +231 -0
  106. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/paths.rb +80 -0
  107. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/profile_tap.rb +131 -0
  108. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/progress_handler.rb +21 -0
  109. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/requires.rb +151 -0
  110. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/schema.rb +225 -0
  111. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/sqlite3.rb +6 -0
  112. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/sqlite3/constants.rb +95 -0
  113. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/sqlite3/database/function.rb +48 -0
  114. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/sqlite3/database/status.rb +68 -0
  115. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/sqlite3/status.rb +60 -0
  116. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/sqlite3/version.rb +55 -0
  117. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/statement.rb +418 -0
  118. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/table.rb +91 -0
  119. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/taps.rb +2 -0
  120. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/taps/console.rb +27 -0
  121. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/taps/io.rb +71 -0
  122. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/trace_tap.rb +35 -0
  123. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/type_map.rb +63 -0
  124. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/type_maps/default_map.rb +166 -0
  125. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/type_maps/storage_map.rb +38 -0
  126. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/type_maps/text_map.rb +21 -0
  127. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/version.rb +8 -0
  128. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/lib/amalgalite/view.rb +26 -0
  129. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/aggregate_spec.rb +150 -0
  130. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/amalgalite_spec.rb +4 -0
  131. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/blob_spec.rb +78 -0
  132. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/boolean_spec.rb +24 -0
  133. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/busy_handler.rb +157 -0
  134. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/data/iso-3166-country.txt +242 -0
  135. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/data/iso-3166-schema.sql +22 -0
  136. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/data/iso-3166-subcountry.txt +3995 -0
  137. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/data/make-iso-db.sh +12 -0
  138. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/database_spec.rb +510 -0
  139. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/default_map_spec.rb +92 -0
  140. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/function_spec.rb +78 -0
  141. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/integeration_spec.rb +97 -0
  142. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/iso_3166_database.rb +58 -0
  143. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/packer_spec.rb +60 -0
  144. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/paths_spec.rb +28 -0
  145. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/progress_handler_spec.rb +91 -0
  146. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/requires_spec.rb +54 -0
  147. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/rtree_spec.rb +66 -0
  148. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/schema_spec.rb +131 -0
  149. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/spec_helper.rb +43 -0
  150. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/sqlite3/constants_spec.rb +108 -0
  151. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/sqlite3/database_status_spec.rb +36 -0
  152. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/sqlite3/status_spec.rb +22 -0
  153. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/sqlite3/version_spec.rb +22 -0
  154. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/sqlite3_spec.rb +53 -0
  155. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/statement_spec.rb +168 -0
  156. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/storage_map_spec.rb +38 -0
  157. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/tap_spec.rb +57 -0
  158. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/text_map_spec.rb +20 -0
  159. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/type_map_spec.rb +14 -0
  160. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/spec/version_spec.rb +8 -0
  161. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/tasks/custom.rake +99 -0
  162. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/tasks/default.rake +277 -0
  163. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/tasks/extension.rake +38 -0
  164. data/vendor/bundle/ruby/1.9.1/gems/amalgalite-1.3.0/tasks/this.rb +209 -0
  165. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/README +378 -0
  166. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/arrayfields.gemspec +26 -0
  167. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/gemspec.rb +62 -0
  168. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/install.rb +206 -0
  169. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/lib/arrayfields.rb +443 -0
  170. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/readme.rb +248 -0
  171. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/sample/a.rb +40 -0
  172. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/sample/b.rb +16 -0
  173. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/sample/c.rb +9 -0
  174. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/sample/d.rb +25 -0
  175. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/sample/e.rb +15 -0
  176. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/test/arrayfields.rb +324 -0
  177. data/vendor/bundle/ruby/1.9.1/gems/arrayfields-4.7.4/test/memtest.rb +41 -0
  178. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/HISTORY.md +243 -0
  179. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/LICENSE +21 -0
  180. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/README.md +182 -0
  181. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/Rakefile +66 -0
  182. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/chronic.gemspec +23 -0
  183. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic.rb +150 -0
  184. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/date.rb +82 -0
  185. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/grabber.rb +33 -0
  186. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/handler.rb +97 -0
  187. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/handlers.rb +647 -0
  188. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/mini_date.rb +38 -0
  189. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/numerizer.rb +130 -0
  190. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/ordinal.rb +49 -0
  191. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/parser.rb +268 -0
  192. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/pointer.rb +32 -0
  193. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeater.rb +145 -0
  194. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_day.rb +54 -0
  195. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_day_name.rb +53 -0
  196. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_day_portion.rb +109 -0
  197. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_fortnight.rb +72 -0
  198. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_hour.rb +59 -0
  199. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_minute.rb +59 -0
  200. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_month.rb +80 -0
  201. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_month_name.rb +95 -0
  202. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_season.rb +111 -0
  203. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_season_name.rb +43 -0
  204. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_second.rb +43 -0
  205. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_time.rb +138 -0
  206. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_week.rb +75 -0
  207. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_weekday.rb +86 -0
  208. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_weekend.rb +67 -0
  209. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/repeaters/repeater_year.rb +78 -0
  210. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/scalar.rb +81 -0
  211. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/season.rb +26 -0
  212. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/separator.rb +207 -0
  213. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/sign.rb +49 -0
  214. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/span.rb +31 -0
  215. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/tag.rb +37 -0
  216. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/time.rb +40 -0
  217. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/time_zone.rb +32 -0
  218. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/lib/chronic/token.rb +51 -0
  219. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/helper.rb +12 -0
  220. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_chronic.rb +183 -0
  221. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_daylight_savings.rb +118 -0
  222. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_handler.rb +128 -0
  223. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_mini_date.rb +32 -0
  224. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_numerizer.rb +86 -0
  225. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_parsing.rb +1235 -0
  226. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_day_name.rb +51 -0
  227. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_day_portion.rb +254 -0
  228. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_fortnight.rb +62 -0
  229. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_hour.rb +68 -0
  230. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_minute.rb +34 -0
  231. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_month.rb +50 -0
  232. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_month_name.rb +56 -0
  233. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_season.rb +40 -0
  234. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_time.rb +88 -0
  235. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_week.rb +62 -0
  236. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_weekday.rb +55 -0
  237. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_weekend.rb +74 -0
  238. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_repeater_year.rb +69 -0
  239. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_span.rb +23 -0
  240. data/vendor/bundle/ruby/1.9.1/gems/chronic-0.10.2/test/test_token.rb +25 -0
  241. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/README_INDEX.rdoc +123 -0
  242. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/Rakefile +37 -0
  243. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/bin/coderay +215 -0
  244. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay.rb +284 -0
  245. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/duo.rb +81 -0
  246. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoder.rb +201 -0
  247. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/_map.rb +17 -0
  248. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/comment_filter.rb +25 -0
  249. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/count.rb +39 -0
  250. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/debug.rb +49 -0
  251. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/debug_lint.rb +63 -0
  252. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/div.rb +23 -0
  253. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/filter.rb +58 -0
  254. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/html.rb +332 -0
  255. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/html/css.rb +65 -0
  256. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/html/numbering.rb +108 -0
  257. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/html/output.rb +166 -0
  258. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/json.rb +83 -0
  259. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/lines_of_code.rb +45 -0
  260. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/lint.rb +59 -0
  261. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/null.rb +18 -0
  262. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/page.rb +24 -0
  263. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/span.rb +23 -0
  264. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/statistic.rb +95 -0
  265. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/terminal.rb +195 -0
  266. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/text.rb +46 -0
  267. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/token_kind_filter.rb +111 -0
  268. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/xml.rb +72 -0
  269. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/encoders/yaml.rb +50 -0
  270. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/for_redcloth.rb +95 -0
  271. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/helpers/file_type.rb +151 -0
  272. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/helpers/plugin.rb +274 -0
  273. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/helpers/word_list.rb +72 -0
  274. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanner.rb +355 -0
  275. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/_map.rb +24 -0
  276. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/c.rb +189 -0
  277. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/clojure.rb +217 -0
  278. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/cpp.rb +215 -0
  279. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/css.rb +196 -0
  280. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/debug.rb +75 -0
  281. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/delphi.rb +144 -0
  282. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/diff.rb +221 -0
  283. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/erb.rb +81 -0
  284. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/go.rb +208 -0
  285. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/groovy.rb +268 -0
  286. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/haml.rb +168 -0
  287. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/html.rb +275 -0
  288. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/java.rb +174 -0
  289. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/java/builtin_types.rb +421 -0
  290. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/java_script.rb +237 -0
  291. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/json.rb +98 -0
  292. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/lua.rb +280 -0
  293. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/php.rb +527 -0
  294. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/python.rb +287 -0
  295. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/raydebug.rb +75 -0
  296. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/ruby.rb +470 -0
  297. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/ruby/patterns.rb +178 -0
  298. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/ruby/string_state.rb +71 -0
  299. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/sass.rb +232 -0
  300. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/sql.rb +177 -0
  301. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/taskpaper.rb +36 -0
  302. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/text.rb +26 -0
  303. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/xml.rb +17 -0
  304. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/scanners/yaml.rb +140 -0
  305. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/style.rb +23 -0
  306. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/styles/_map.rb +7 -0
  307. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/styles/alpha.rb +152 -0
  308. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/token_kinds.rb +85 -0
  309. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/tokens.rb +161 -0
  310. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/tokens_proxy.rb +55 -0
  311. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/lib/coderay/version.rb +3 -0
  312. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/test/functional/basic.rb +318 -0
  313. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/test/functional/examples.rb +129 -0
  314. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/test/functional/for_redcloth.rb +78 -0
  315. data/vendor/bundle/ruby/1.9.1/gems/coderay-1.1.0/test/functional/suite.rb +15 -0
  316. data/vendor/bundle/ruby/1.9.1/gems/coerce-0.0.6/README +28 -0
  317. data/vendor/bundle/ruby/1.9.1/gems/coerce-0.0.6/Rakefile +392 -0
  318. data/vendor/bundle/ruby/1.9.1/gems/coerce-0.0.6/coerce.gemspec +31 -0
  319. data/vendor/bundle/ruby/1.9.1/gems/coerce-0.0.6/lib/coerce.rb +210 -0
  320. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/LICENSE +22 -0
  321. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/README +214 -0
  322. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/Rakefile +90 -0
  323. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/Releases +195 -0
  324. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/TODO +2 -0
  325. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/call/call.rb +57 -0
  326. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/call/call_monitor.rb +55 -0
  327. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/daemonize/daemonize.rb +27 -0
  328. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_crash.rb +17 -0
  329. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_exec.rb +16 -0
  330. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_exit.rb +15 -0
  331. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_hanging.rb +19 -0
  332. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_keep_pid_files.rb +17 -0
  333. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_monitor.rb +16 -0
  334. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_multiple.rb +16 -0
  335. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_normal.rb +11 -0
  336. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_ontop.rb +16 -0
  337. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_optionparser.rb +43 -0
  338. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_proc.rb +25 -0
  339. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_proc_multiple.rb +22 -0
  340. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_proc_rand.rb +23 -0
  341. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_proc_simple.rb +17 -0
  342. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/ctrl_slowstop.rb +16 -0
  343. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/myserver.rb +12 -0
  344. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/myserver_crashing.rb +14 -0
  345. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/myserver_exiting.rb +8 -0
  346. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/myserver_hanging.rb +21 -0
  347. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/examples/run/myserver_slowstop.rb +21 -0
  348. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons.rb +315 -0
  349. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/application.rb +477 -0
  350. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/application_group.rb +194 -0
  351. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/change_privilege.rb +19 -0
  352. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/cmdline.rb +121 -0
  353. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/controller.rb +140 -0
  354. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/daemonize.rb +169 -0
  355. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/etc_extension.rb +12 -0
  356. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/exceptions.rb +28 -0
  357. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/monitor.rb +138 -0
  358. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/pid.rb +108 -0
  359. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/pidfile.rb +116 -0
  360. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/lib/daemons/pidmem.rb +19 -0
  361. data/vendor/bundle/ruby/1.9.1/gems/daemons-1.1.9/setup.rb +1360 -0
  362. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/AUTHORS +1 -0
  363. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/CHANGELOG +182 -0
  364. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/COPYING +340 -0
  365. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/INSTALL +33 -0
  366. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/LICENSE +9 -0
  367. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/README +71 -0
  368. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/Rakefile +94 -0
  369. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/TODO +6 -0
  370. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/examples/csv_converters.rb +28 -0
  371. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/examples/csv_filter.rb +23 -0
  372. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/examples/csv_reading.rb +57 -0
  373. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/examples/csv_table.rb +56 -0
  374. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/examples/csv_writing.rb +67 -0
  375. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/examples/purchase.csv +3 -0
  376. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/examples/shortcut_interface.rb +36 -0
  377. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/lib/faster_csv.rb +2025 -0
  378. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/lib/fastercsv.rb +10 -0
  379. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/line_endings.gz +0 -0
  380. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_csv_parsing.rb +191 -0
  381. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_csv_writing.rb +96 -0
  382. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_data_converters.rb +260 -0
  383. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_encodings.rb +23 -0
  384. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_features.rb +212 -0
  385. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_headers.rb +277 -0
  386. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_interface.rb +376 -0
  387. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_row.rb +305 -0
  388. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_serialization.rb +154 -0
  389. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_speed.rb +65 -0
  390. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/tc_table.rb +408 -0
  391. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/test_data.csv +1000 -0
  392. data/vendor/bundle/ruby/1.9.1/gems/fastercsv-1.5.5/test/ts_all.rb +20 -0
  393. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/LICENSE +1 -0
  394. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/README +347 -0
  395. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/README.erb +82 -0
  396. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/Rakefile +376 -0
  397. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/lib/fattr.rb +206 -0
  398. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/samples/a.rb +21 -0
  399. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/samples/b.rb +22 -0
  400. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/samples/c.rb +12 -0
  401. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/samples/d.rb +34 -0
  402. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/samples/e.rb +17 -0
  403. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/samples/f.rb +21 -0
  404. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/samples/g.rb +15 -0
  405. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/samples/h.rb +29 -0
  406. data/vendor/bundle/ruby/1.9.1/gems/fattr-2.2.2/test/fattr_test.rb +173 -0
  407. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/Gemfile +16 -0
  408. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/LICENSE +20 -0
  409. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/README.md +145 -0
  410. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/Rakefile +43 -0
  411. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/VERSION +1 -0
  412. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/flowdock.gemspec +73 -0
  413. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/lib/flowdock.rb +181 -0
  414. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/lib/flowdock/capistrano.rb +1 -0
  415. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/spec/flowdock_spec.rb +435 -0
  416. data/vendor/bundle/ruby/1.9.1/gems/flowdock-0.5.0/spec/spec_helper.rb +14 -0
  417. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/AUTHORS +3 -0
  418. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/CHANGELOG +357 -0
  419. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/COPYING +340 -0
  420. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/INSTALL +55 -0
  421. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/LICENSE +7 -0
  422. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/README.rdoc +67 -0
  423. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/Rakefile +50 -0
  424. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/TODO +6 -0
  425. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/ansi_colors.rb +38 -0
  426. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/asking_for_arrays.rb +18 -0
  427. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/basic_usage.rb +75 -0
  428. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/color_scheme.rb +32 -0
  429. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/get_character.rb +12 -0
  430. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/limit.rb +12 -0
  431. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/menus.rb +65 -0
  432. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/overwrite.rb +19 -0
  433. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/page_and_wrap.rb +322 -0
  434. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/password.rb +7 -0
  435. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/repeat_entry.rb +21 -0
  436. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/trapping_eof.rb +22 -0
  437. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/examples/using_readline.rb +17 -0
  438. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/highline.gemspec +37 -0
  439. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline.rb +1034 -0
  440. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/color_scheme.rb +134 -0
  441. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/compatibility.rb +16 -0
  442. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/import.rb +41 -0
  443. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/menu.rb +381 -0
  444. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/question.rb +481 -0
  445. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/simulate.rb +48 -0
  446. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/string_extensions.rb +111 -0
  447. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/style.rb +181 -0
  448. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/lib/highline/system_extensions.rb +242 -0
  449. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/setup.rb +1360 -0
  450. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/site/highline.css +65 -0
  451. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/site/images/logo.png +0 -0
  452. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/site/index.html +58 -0
  453. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/string_methods.rb +32 -0
  454. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/tc_color_scheme.rb +96 -0
  455. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/tc_highline.rb +1134 -0
  456. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/tc_import.rb +52 -0
  457. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/tc_menu.rb +439 -0
  458. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/tc_string_extension.rb +20 -0
  459. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/tc_string_highline.rb +38 -0
  460. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/tc_style.rb +567 -0
  461. data/vendor/bundle/ruby/1.9.1/gems/highline-1.6.21/test/ts_all.rb +16 -0
  462. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/Gemfile +14 -0
  463. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/Guardfile +16 -0
  464. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/History +303 -0
  465. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/MIT-LICENSE +20 -0
  466. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/README.md +74 -0
  467. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/Rakefile +12 -0
  468. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/bin/httparty +117 -0
  469. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/cucumber.yml +1 -0
  470. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/aaws.rb +32 -0
  471. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/basic.rb +28 -0
  472. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/crack.rb +19 -0
  473. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/custom_parsers.rb +67 -0
  474. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/delicious.rb +37 -0
  475. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/google.rb +16 -0
  476. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/headers_and_user_agents.rb +6 -0
  477. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/nokogiri_html_parser.rb +22 -0
  478. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/rubyurl.rb +14 -0
  479. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/stackexchange.rb +24 -0
  480. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/tripit_sign_in.rb +33 -0
  481. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/twitter.rb +31 -0
  482. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/examples/whoismyrep.rb +10 -0
  483. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/basic_authentication.feature +20 -0
  484. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/command_line.feature +7 -0
  485. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/deals_with_http_error_codes.feature +26 -0
  486. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/digest_authentication.feature +20 -0
  487. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/handles_compressed_responses.feature +27 -0
  488. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/handles_multiple_formats.feature +57 -0
  489. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/steps/env.rb +22 -0
  490. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/steps/httparty_response_steps.rb +52 -0
  491. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/steps/httparty_steps.rb +43 -0
  492. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/steps/mongrel_helper.rb +94 -0
  493. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/steps/remote_service_steps.rb +74 -0
  494. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/supports_read_timeout_option.feature +13 -0
  495. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/supports_redirection.feature +22 -0
  496. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/features/supports_timeout_option.feature +13 -0
  497. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/httparty.gemspec +26 -0
  498. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty.rb +600 -0
  499. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/connection_adapter.rb +187 -0
  500. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/cookie_hash.rb +22 -0
  501. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/core_extensions.rb +32 -0
  502. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/exceptions.rb +29 -0
  503. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/hash_conversions.rb +51 -0
  504. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/logger/apache_logger.rb +22 -0
  505. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/logger/curl_logger.rb +48 -0
  506. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/logger/logger.rb +18 -0
  507. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/module_inheritable_attributes.rb +56 -0
  508. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/net_digest_auth.rb +84 -0
  509. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/parser.rb +141 -0
  510. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/request.rb +331 -0
  511. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/response.rb +72 -0
  512. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/response/headers.rb +31 -0
  513. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/lib/httparty/version.rb +3 -0
  514. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/script/release +42 -0
  515. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/delicious.xml +23 -0
  516. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/empty.xml +0 -0
  517. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/google.html +3 -0
  518. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/generate.sh +29 -0
  519. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/generated/1fe462c2.0 +16 -0
  520. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/generated/bogushost.crt +13 -0
  521. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/generated/ca.crt +16 -0
  522. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/generated/ca.key +15 -0
  523. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/generated/selfsigned.crt +14 -0
  524. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/generated/server.crt +13 -0
  525. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/generated/server.key +15 -0
  526. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/ssl/openssl-exts.cnf +9 -0
  527. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/twitter.csv +2 -0
  528. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/twitter.json +1 -0
  529. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/twitter.xml +403 -0
  530. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/fixtures/undefined_method_add_node_for_nil.xml +2 -0
  531. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/connection_adapter_spec.rb +354 -0
  532. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/cookie_hash_spec.rb +83 -0
  533. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/exception_spec.rb +23 -0
  534. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/logger/apache_logger_spec.rb +26 -0
  535. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/logger/curl_logger_spec.rb +18 -0
  536. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/logger/logger_spec.rb +22 -0
  537. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/net_digest_auth_spec.rb +152 -0
  538. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/parser_spec.rb +165 -0
  539. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/request_spec.rb +638 -0
  540. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/response_spec.rb +221 -0
  541. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty/ssl_spec.rb +74 -0
  542. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/httparty_spec.rb +764 -0
  543. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/spec.opts +2 -0
  544. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/spec_helper.rb +37 -0
  545. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/support/ssl_test_helper.rb +47 -0
  546. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/support/ssl_test_server.rb +80 -0
  547. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/spec/support/stub_response.rb +43 -0
  548. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/website/css/common.css +47 -0
  549. data/vendor/bundle/ruby/1.9.1/gems/httparty-0.13.1/website/index.html +73 -0
  550. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/CHANGES +284 -0
  551. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/COPYING +58 -0
  552. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/COPYING-json-jruby +57 -0
  553. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/GPL +340 -0
  554. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/Gemfile +11 -0
  555. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/README-json-jruby.markdown +33 -0
  556. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/README.rdoc +358 -0
  557. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/Rakefile +412 -0
  558. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/TODO +1 -0
  559. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/VERSION +1 -0
  560. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/data/example.json +1 -0
  561. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/data/index.html +38 -0
  562. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/data/prototype.js +4184 -0
  563. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/fbuffer/fbuffer.h +181 -0
  564. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/generator/Makefile +221 -0
  565. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/generator/depend +1 -0
  566. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/generator/extconf.rb +14 -0
  567. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/generator/generator.bundle +0 -0
  568. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/generator/generator.c +1435 -0
  569. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/generator/generator.h +148 -0
  570. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/generator/generator.o +0 -0
  571. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/parser/Makefile +221 -0
  572. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/parser/depend +1 -0
  573. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/parser/extconf.rb +13 -0
  574. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/parser/parser.bundle +0 -0
  575. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/parser/parser.c +2204 -0
  576. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/parser/parser.h +77 -0
  577. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/parser/parser.o +0 -0
  578. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/ext/json/ext/parser/parser.rl +927 -0
  579. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/install.rb +23 -0
  580. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/ByteListTranscoder.java +167 -0
  581. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/Generator.java +444 -0
  582. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/GeneratorMethods.java +232 -0
  583. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/GeneratorService.java +43 -0
  584. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/GeneratorState.java +543 -0
  585. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/OptionsReader.java +114 -0
  586. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/Parser.java +2644 -0
  587. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/Parser.rl +968 -0
  588. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/ParserService.java +35 -0
  589. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/RuntimeInfo.java +121 -0
  590. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/StringDecoder.java +167 -0
  591. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/StringEncoder.java +106 -0
  592. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/java/src/json/ext/Utils.java +89 -0
  593. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/json-java.gemspec +23 -0
  594. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/json.gemspec +38 -0
  595. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/json_pure.gemspec +40 -0
  596. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json.rb +62 -0
  597. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/bigdecimal.rb +28 -0
  598. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/complex.rb +22 -0
  599. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/core.rb +11 -0
  600. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/date.rb +34 -0
  601. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/date_time.rb +50 -0
  602. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/exception.rb +31 -0
  603. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/ostruct.rb +31 -0
  604. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/range.rb +29 -0
  605. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/rational.rb +22 -0
  606. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/regexp.rb +30 -0
  607. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/struct.rb +30 -0
  608. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/symbol.rb +25 -0
  609. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/add/time.rb +38 -0
  610. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/common.rb +484 -0
  611. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/ext.rb +21 -0
  612. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/ext/generator.bundle +0 -0
  613. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/ext/parser.bundle +0 -0
  614. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/generic_object.rb +70 -0
  615. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/pure.rb +21 -0
  616. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/pure/generator.rb +522 -0
  617. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/pure/parser.rb +359 -0
  618. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/lib/json/version.rb +8 -0
  619. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail1.json +1 -0
  620. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail10.json +1 -0
  621. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail11.json +1 -0
  622. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail12.json +1 -0
  623. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail13.json +1 -0
  624. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail14.json +1 -0
  625. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail18.json +1 -0
  626. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail19.json +1 -0
  627. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail2.json +1 -0
  628. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail20.json +1 -0
  629. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail21.json +1 -0
  630. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail22.json +1 -0
  631. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail23.json +1 -0
  632. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail24.json +1 -0
  633. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail25.json +1 -0
  634. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail27.json +2 -0
  635. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail28.json +2 -0
  636. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail3.json +1 -0
  637. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail4.json +1 -0
  638. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail5.json +1 -0
  639. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail6.json +1 -0
  640. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail7.json +1 -0
  641. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail8.json +1 -0
  642. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/fail9.json +1 -0
  643. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/pass1.json +56 -0
  644. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/pass15.json +1 -0
  645. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/pass16.json +1 -0
  646. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/pass17.json +1 -0
  647. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/pass2.json +1 -0
  648. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/pass26.json +1 -0
  649. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/fixtures/pass3.json +6 -0
  650. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/setup_variant.rb +11 -0
  651. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/test_json.rb +545 -0
  652. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/test_json_addition.rb +196 -0
  653. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/test_json_encoding.rb +65 -0
  654. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/test_json_fixtures.rb +35 -0
  655. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/test_json_generate.rb +322 -0
  656. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/test_json_generic_object.rb +75 -0
  657. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/test_json_string_matching.rb +39 -0
  658. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tests/test_json_unicode.rb +72 -0
  659. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tools/fuzz.rb +139 -0
  660. data/vendor/bundle/ruby/1.9.1/gems/json-1.8.1/tools/server.rb +62 -0
  661. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/LICENSE +1 -0
  662. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/README +1177 -0
  663. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/README.erb +881 -0
  664. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/Rakefile +394 -0
  665. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/TODO +23 -0
  666. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/a.rb +3 -0
  667. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main.rb +93 -0
  668. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/cast.rb +163 -0
  669. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/dsl.rb +77 -0
  670. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/factories.rb +28 -0
  671. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/getoptlong.rb +470 -0
  672. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/logger.rb +51 -0
  673. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/mode.rb +46 -0
  674. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/parameter.rb +735 -0
  675. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/program.rb +6 -0
  676. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/program/class_methods.rb +381 -0
  677. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/program/instance_methods.rb +303 -0
  678. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/softspoken.rb +12 -0
  679. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/stdext.rb +36 -0
  680. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/test.rb +89 -0
  681. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/usage.rb +212 -0
  682. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/lib/main/util.rb +109 -0
  683. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/main.gemspec +74 -0
  684. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/a.rb +17 -0
  685. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/b.rb +17 -0
  686. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/c.rb +21 -0
  687. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/d.rb +26 -0
  688. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/e.rb +27 -0
  689. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/f.rb +29 -0
  690. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/g.rb +10 -0
  691. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/h.rb +36 -0
  692. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/samples/j.rb +31 -0
  693. data/vendor/bundle/ruby/1.9.1/gems/main-6.0.0/test/main_test.rb +954 -0
  694. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/LICENSE +1 -0
  695. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/README +1177 -0
  696. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/README.erb +881 -0
  697. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/Rakefile +394 -0
  698. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/TODO +23 -0
  699. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/a.rb +28 -0
  700. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main.rb +94 -0
  701. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/cast.rb +163 -0
  702. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/daemon.rb +525 -0
  703. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/dsl.rb +77 -0
  704. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/factories.rb +28 -0
  705. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/getoptlong.rb +470 -0
  706. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/logger.rb +51 -0
  707. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/mode.rb +46 -0
  708. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/parameter.rb +735 -0
  709. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/program.rb +6 -0
  710. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/program/class_methods.rb +392 -0
  711. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/program/instance_methods.rb +308 -0
  712. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/softspoken.rb +12 -0
  713. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/stdext.rb +36 -0
  714. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/test.rb +89 -0
  715. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/usage.rb +212 -0
  716. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/lib/main/util.rb +109 -0
  717. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/main.gemspec +75 -0
  718. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/a.rb +17 -0
  719. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/b.rb +17 -0
  720. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/c.rb +21 -0
  721. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/d.rb +26 -0
  722. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/e.rb +27 -0
  723. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/f.rb +29 -0
  724. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/g.rb +10 -0
  725. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/h.rb +36 -0
  726. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/samples/j.rb +31 -0
  727. data/vendor/bundle/ruby/1.9.1/gems/main-6.1.0/test/main_test.rb +954 -0
  728. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/LICENSE +1 -0
  729. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/README +145 -0
  730. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/Rakefile +394 -0
  731. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/a.rb +22 -0
  732. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/lib/map.rb +1190 -0
  733. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/lib/map/integrations/active_record.rb +140 -0
  734. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/lib/map/options.rb +188 -0
  735. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/lib/map/params.rb +79 -0
  736. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/lib/map/struct.rb +52 -0
  737. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/map.gemspec +46 -0
  738. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/test/leak.rb +61 -0
  739. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/test/lib/testing.rb +74 -0
  740. data/vendor/bundle/ruby/1.9.1/gems/map-6.5.5/test/map_test.rb +802 -0
  741. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/Gemfile +2 -0
  742. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/LICENSE +25 -0
  743. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/README.markdown +91 -0
  744. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/Rakefile +79 -0
  745. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/lib/method_source.rb +141 -0
  746. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/lib/method_source/code_helpers.rb +154 -0
  747. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/lib/method_source/source_location.rb +138 -0
  748. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/lib/method_source/version.rb +3 -0
  749. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/method_source.gemspec +33 -0
  750. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/test/test.rb +138 -0
  751. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/test/test_code_helpers.rb +41 -0
  752. data/vendor/bundle/ruby/1.9.1/gems/method_source-0.8.2/test/test_helper.rb +98 -0
  753. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/CHANGELOG.md +220 -0
  754. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/CONTRIBUTING.md +46 -0
  755. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/Gemfile +29 -0
  756. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/LICENSE.md +20 -0
  757. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/README.md +119 -0
  758. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/Rakefile +25 -0
  759. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json.rb +158 -0
  760. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapter.rb +37 -0
  761. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapter_error.rb +15 -0
  762. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/gson.rb +21 -0
  763. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/jr_jackson.rb +19 -0
  764. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/json_common.rb +25 -0
  765. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/json_gem.rb +11 -0
  766. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/json_pure.rb +11 -0
  767. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/nsjsonserialization.rb +34 -0
  768. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/oj.rb +25 -0
  769. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/ok_json.rb +24 -0
  770. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/adapters/yajl.rb +19 -0
  771. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/convertible_hash_keys.rb +43 -0
  772. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/options.rb +38 -0
  773. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/parse_error.rb +17 -0
  774. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/vendor/okjson.rb +606 -0
  775. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/lib/multi_json/version.rb +20 -0
  776. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/multi_json.gemspec +22 -0
  777. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/gson_adapter_spec.rb +10 -0
  778. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/jr_jackson_adapter_spec.rb +10 -0
  779. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/json_gem_adapter_spec.rb +9 -0
  780. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/json_pure_adapter_spec.rb +9 -0
  781. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/multi_json_spec.rb +200 -0
  782. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/nsjsonserialization_adapter_spec.rb +10 -0
  783. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/oj_adapter_spec.rb +20 -0
  784. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/ok_json_adapter_spec.rb +7 -0
  785. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/shared/adapter.rb +236 -0
  786. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/shared/json_common_adapter.rb +30 -0
  787. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/shared/options.rb +119 -0
  788. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/spec_helper.rb +77 -0
  789. data/vendor/bundle/ruby/1.9.1/gems/multi_json-1.10.1/spec/yajl_adapter_spec.rb +10 -0
  790. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/CHANGELOG.md +93 -0
  791. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/CONTRIBUTING.md +49 -0
  792. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/LICENSE.md +20 -0
  793. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/README.md +97 -0
  794. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/Rakefile +21 -0
  795. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/lib/multi_xml.rb +296 -0
  796. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/lib/multi_xml/parsers/libxml.rb +30 -0
  797. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/lib/multi_xml/parsers/libxml2_parser.rb +74 -0
  798. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/lib/multi_xml/parsers/nokogiri.rb +32 -0
  799. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/lib/multi_xml/parsers/ox.rb +97 -0
  800. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/lib/multi_xml/parsers/rexml.rb +113 -0
  801. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/lib/multi_xml/version.rb +3 -0
  802. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/multi_xml.gemspec +24 -0
  803. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/spec/helper.rb +17 -0
  804. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/spec/multi_xml_spec.rb +43 -0
  805. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/spec/parser_shared_example.rb +694 -0
  806. data/vendor/bundle/ruby/1.9.1/gems/multi_xml-0.5.5/spec/speed.rb +63 -0
  807. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/CHANGELOG +534 -0
  808. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/CONTRIBUTORS +55 -0
  809. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/Gemfile +12 -0
  810. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/LICENSE +25 -0
  811. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/README.markdown +400 -0
  812. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/Rakefile +140 -0
  813. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/TODO +117 -0
  814. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/bin/pry +16 -0
  815. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry.rb +274 -0
  816. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/cli.rb +202 -0
  817. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/code.rb +385 -0
  818. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/code/code_range.rb +70 -0
  819. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/code/loc.rb +92 -0
  820. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/code_object.rb +153 -0
  821. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/command.rb +689 -0
  822. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/command_set.rb +400 -0
  823. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands.rb +6 -0
  824. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/amend_line.rb +99 -0
  825. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/bang.rb +20 -0
  826. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/bang_pry.rb +17 -0
  827. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/cat.rb +53 -0
  828. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/cat/abstract_formatter.rb +27 -0
  829. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/cat/exception_formatter.rb +78 -0
  830. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/cat/file_formatter.rb +84 -0
  831. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/cat/input_expression_formatter.rb +43 -0
  832. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/cd.rb +30 -0
  833. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/code_collector.rb +165 -0
  834. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/disable_pry.rb +27 -0
  835. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/disabled_commands.rb +2 -0
  836. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/easter_eggs.rb +112 -0
  837. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/edit.rb +207 -0
  838. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/edit/exception_patcher.rb +25 -0
  839. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/edit/file_and_line_locator.rb +38 -0
  840. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/edit/method_patcher.rb +122 -0
  841. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/exit.rb +42 -0
  842. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/exit_all.rb +29 -0
  843. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/exit_program.rb +24 -0
  844. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/find_method.rb +199 -0
  845. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/fix_indent.rb +19 -0
  846. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/gem_cd.rb +26 -0
  847. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/gem_install.rb +29 -0
  848. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/gem_list.rb +33 -0
  849. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/gem_open.rb +29 -0
  850. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/gist.rb +102 -0
  851. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/help.rb +164 -0
  852. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/hist.rb +161 -0
  853. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/import_set.rb +22 -0
  854. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/install_command.rb +51 -0
  855. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/jump_to.rb +29 -0
  856. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/ls.rb +338 -0
  857. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/nesting.rb +25 -0
  858. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/play.rb +69 -0
  859. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/pry_backtrace.rb +26 -0
  860. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/pry_version.rb +17 -0
  861. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/raise_up.rb +32 -0
  862. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/reload_code.rb +65 -0
  863. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/reset.rb +18 -0
  864. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/ri.rb +56 -0
  865. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/save_file.rb +61 -0
  866. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/shell_command.rb +43 -0
  867. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/shell_mode.rb +27 -0
  868. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/show_doc.rb +78 -0
  869. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/show_info.rb +200 -0
  870. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/show_input.rb +17 -0
  871. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/show_source.rb +38 -0
  872. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/simple_prompt.rb +22 -0
  873. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/stat.rb +40 -0
  874. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/switch_to.rb +23 -0
  875. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/toggle_color.rb +20 -0
  876. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/whereami.rb +182 -0
  877. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/commands/wtf.rb +57 -0
  878. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/completion.rb +321 -0
  879. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/config.rb +258 -0
  880. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/core_extensions.rb +121 -0
  881. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/custom_completions.rb +6 -0
  882. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/editor.rb +129 -0
  883. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/helpers.rb +5 -0
  884. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/helpers/base_helpers.rb +200 -0
  885. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/helpers/command_helpers.rb +154 -0
  886. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/helpers/documentation_helpers.rb +76 -0
  887. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/helpers/options_helpers.rb +27 -0
  888. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/helpers/table.rb +109 -0
  889. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/helpers/text.rb +108 -0
  890. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/history.rb +124 -0
  891. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/history_array.rb +116 -0
  892. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/hooks.rb +250 -0
  893. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/indent.rb +406 -0
  894. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/method.rb +551 -0
  895. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/method/disowned.rb +53 -0
  896. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/method/weird_method_locator.rb +186 -0
  897. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/module_candidate.rb +146 -0
  898. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/pager.rb +90 -0
  899. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/plugins.rb +103 -0
  900. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/pry_class.rb +456 -0
  901. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/pry_instance.rb +765 -0
  902. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/rbx_method.rb +13 -0
  903. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/rbx_path.rb +22 -0
  904. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/repl_file_loader.rb +80 -0
  905. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/rubygem.rb +74 -0
  906. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/terminal.rb +78 -0
  907. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/test/helper.rb +185 -0
  908. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/version.rb +3 -0
  909. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/lib/pry/wrapped_module.rb +387 -0
  910. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/man/pry.1 +195 -0
  911. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/man/pry.1.html +204 -0
  912. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/man/pry.1.ronn +141 -0
  913. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/pry.gemspec +29 -0
  914. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/Procfile +3 -0
  915. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/cli_spec.rb +78 -0
  916. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/code_object_spec.rb +277 -0
  917. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/code_spec.rb +219 -0
  918. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/command_helpers_spec.rb +29 -0
  919. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/command_integration_spec.rb +644 -0
  920. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/command_set_spec.rb +627 -0
  921. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/command_spec.rb +821 -0
  922. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/amend_line_spec.rb +247 -0
  923. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/bang_spec.rb +19 -0
  924. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/cat_spec.rb +164 -0
  925. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/cd_spec.rb +250 -0
  926. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/disable_pry_spec.rb +25 -0
  927. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/edit_spec.rb +727 -0
  928. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/exit_all_spec.rb +34 -0
  929. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/exit_program_spec.rb +19 -0
  930. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/exit_spec.rb +34 -0
  931. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/find_method_spec.rb +70 -0
  932. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/gem_list_spec.rb +26 -0
  933. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/gist_spec.rb +79 -0
  934. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/help_spec.rb +56 -0
  935. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/hist_spec.rb +181 -0
  936. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/jump_to_spec.rb +15 -0
  937. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/ls_spec.rb +181 -0
  938. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/play_spec.rb +140 -0
  939. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/raise_up_spec.rb +56 -0
  940. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/save_file_spec.rb +177 -0
  941. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/show_doc_spec.rb +510 -0
  942. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/show_input_spec.rb +17 -0
  943. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/show_source_spec.rb +782 -0
  944. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/commands/whereami_spec.rb +203 -0
  945. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/completion_spec.rb +241 -0
  946. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/control_d_handler_spec.rb +58 -0
  947. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/documentation_helper_spec.rb +73 -0
  948. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/editor_spec.rb +79 -0
  949. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/exception_whitelist_spec.rb +21 -0
  950. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/fixtures/candidate_helper1.rb +11 -0
  951. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/fixtures/candidate_helper2.rb +8 -0
  952. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/fixtures/example.erb +5 -0
  953. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/fixtures/example_nesting.rb +33 -0
  954. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/fixtures/show_source_doc_examples.rb +15 -0
  955. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/fixtures/testrc +2 -0
  956. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/fixtures/testrcbad +2 -0
  957. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/fixtures/whereami_helper.rb +6 -0
  958. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/helper.rb +34 -0
  959. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/helpers/bacon.rb +86 -0
  960. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/helpers/mock_pry.rb +43 -0
  961. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/helpers/table_spec.rb +105 -0
  962. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/history_array_spec.rb +67 -0
  963. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/hooks_spec.rb +522 -0
  964. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/indent_spec.rb +301 -0
  965. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/input_stack_spec.rb +90 -0
  966. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/method_spec.rb +482 -0
  967. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/prompt_spec.rb +60 -0
  968. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/pry_defaults_spec.rb +419 -0
  969. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/pry_history_spec.rb +99 -0
  970. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/pry_output_spec.rb +95 -0
  971. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/pry_spec.rb +515 -0
  972. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/run_command_spec.rb +25 -0
  973. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/sticky_locals_spec.rb +157 -0
  974. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/syntax_checking_spec.rb +81 -0
  975. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/spec/wrapped_module_spec.rb +261 -0
  976. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/wiki/Customizing-pry.md +397 -0
  977. data/vendor/bundle/ruby/1.9.1/gems/pry-0.9.12.6/wiki/Home.md +4 -0
  978. data/vendor/bundle/ruby/1.9.1/gems/sekrets-1.7.0/README +144 -0
  979. data/vendor/bundle/ruby/1.9.1/gems/sekrets-1.7.0/Rakefile +390 -0
  980. data/vendor/bundle/ruby/1.9.1/gems/sekrets-1.7.0/bin/sekrets +372 -0
  981. data/vendor/bundle/ruby/1.9.1/gems/sekrets-1.7.0/lib/sekrets.rb +511 -0
  982. data/vendor/bundle/ruby/1.9.1/gems/sekrets-1.7.0/lib/sekrets/capistrano.rb +37 -0
  983. data/vendor/bundle/ruby/1.9.1/gems/sekrets-1.7.0/sekrets.gemspec +50 -0
  984. data/vendor/bundle/ruby/1.9.1/gems/sekrets-1.7.0/test/lib/testing.rb +75 -0
  985. data/vendor/bundle/ruby/1.9.1/gems/sekrets-1.7.0/test/sekrets_test.rb +167 -0
  986. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/CHANGELOG +5790 -0
  987. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/MIT-LICENSE +19 -0
  988. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/README.rdoc +815 -0
  989. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/Rakefile +186 -0
  990. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/bin/sequel +244 -0
  991. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/active_record.rdoc +912 -0
  992. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/advanced_associations.rdoc +818 -0
  993. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/association_basics.rdoc +1763 -0
  994. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/bin_sequel.rdoc +144 -0
  995. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/cheat_sheet.rdoc +220 -0
  996. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/code_order.rdoc +96 -0
  997. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/core_extensions.rdoc +364 -0
  998. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/dataset_basics.rdoc +105 -0
  999. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/dataset_filtering.rdoc +191 -0
  1000. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/extensions.rdoc +84 -0
  1001. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/mass_assignment.rdoc +55 -0
  1002. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/migration.rdoc +611 -0
  1003. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/model_hooks.rdoc +262 -0
  1004. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/model_plugins.rdoc +270 -0
  1005. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/mssql_stored_procedures.rdoc +43 -0
  1006. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/object_model.rdoc +573 -0
  1007. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/opening_databases.rdoc +489 -0
  1008. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/postgresql.rdoc +326 -0
  1009. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/prepared_statements.rdoc +139 -0
  1010. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/querying.rdoc +1017 -0
  1011. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/reflection.rdoc +121 -0
  1012. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/1.0.txt +38 -0
  1013. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/1.1.txt +143 -0
  1014. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/1.3.txt +101 -0
  1015. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/1.4.0.txt +53 -0
  1016. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/1.5.0.txt +155 -0
  1017. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.0.0.txt +298 -0
  1018. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.1.0.txt +271 -0
  1019. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.10.0.txt +328 -0
  1020. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.11.0.txt +215 -0
  1021. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.12.0.txt +534 -0
  1022. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.2.0.txt +253 -0
  1023. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.3.0.txt +88 -0
  1024. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.4.0.txt +106 -0
  1025. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.5.0.txt +137 -0
  1026. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.6.0.txt +157 -0
  1027. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.7.0.txt +166 -0
  1028. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.8.0.txt +171 -0
  1029. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/2.9.0.txt +97 -0
  1030. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.0.0.txt +221 -0
  1031. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.1.0.txt +406 -0
  1032. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.10.0.txt +286 -0
  1033. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.11.0.txt +254 -0
  1034. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.12.0.txt +304 -0
  1035. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.13.0.txt +210 -0
  1036. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.14.0.txt +118 -0
  1037. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.15.0.txt +78 -0
  1038. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.16.0.txt +45 -0
  1039. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.17.0.txt +58 -0
  1040. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.18.0.txt +120 -0
  1041. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.19.0.txt +67 -0
  1042. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.2.0.txt +268 -0
  1043. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.20.0.txt +41 -0
  1044. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.21.0.txt +87 -0
  1045. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.22.0.txt +39 -0
  1046. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.23.0.txt +172 -0
  1047. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.24.0.txt +420 -0
  1048. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.25.0.txt +88 -0
  1049. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.26.0.txt +88 -0
  1050. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.27.0.txt +82 -0
  1051. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.28.0.txt +304 -0
  1052. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.29.0.txt +459 -0
  1053. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.3.0.txt +192 -0
  1054. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.30.0.txt +135 -0
  1055. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.31.0.txt +146 -0
  1056. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.32.0.txt +202 -0
  1057. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.33.0.txt +157 -0
  1058. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.34.0.txt +671 -0
  1059. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.35.0.txt +144 -0
  1060. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.36.0.txt +245 -0
  1061. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.37.0.txt +338 -0
  1062. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.38.0.txt +234 -0
  1063. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.39.0.txt +237 -0
  1064. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.4.0.txt +325 -0
  1065. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.40.0.txt +73 -0
  1066. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.41.0.txt +155 -0
  1067. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.42.0.txt +74 -0
  1068. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.43.0.txt +105 -0
  1069. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.44.0.txt +152 -0
  1070. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.45.0.txt +179 -0
  1071. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.46.0.txt +122 -0
  1072. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.47.0.txt +270 -0
  1073. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.48.0.txt +477 -0
  1074. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.5.0.txt +510 -0
  1075. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.6.0.txt +366 -0
  1076. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.7.0.txt +179 -0
  1077. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.8.0.txt +151 -0
  1078. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/3.9.0.txt +233 -0
  1079. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.0.0.txt +262 -0
  1080. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.1.0.txt +85 -0
  1081. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.10.0.txt +226 -0
  1082. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.11.0.txt +147 -0
  1083. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.12.0.txt +105 -0
  1084. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.13.0.txt +169 -0
  1085. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.14.0.txt +68 -0
  1086. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.15.0.txt +56 -0
  1087. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.2.0.txt +129 -0
  1088. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.3.0.txt +40 -0
  1089. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.4.0.txt +92 -0
  1090. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.5.0.txt +34 -0
  1091. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.6.0.txt +30 -0
  1092. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.7.0.txt +103 -0
  1093. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.8.0.txt +175 -0
  1094. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/release_notes/4.9.0.txt +190 -0
  1095. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/schema_modification.rdoc +654 -0
  1096. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/security.rdoc +370 -0
  1097. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/sharding.rdoc +245 -0
  1098. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/sql.rdoc +589 -0
  1099. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/testing.rdoc +176 -0
  1100. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/thread_safety.rdoc +17 -0
  1101. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/transactions.rdoc +168 -0
  1102. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/validations.rdoc +540 -0
  1103. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/doc/virtual_rows.rdoc +272 -0
  1104. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel.rb +1 -0
  1105. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/ado.rb +151 -0
  1106. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/ado/access.rb +335 -0
  1107. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/ado/mssql.rb +69 -0
  1108. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/amalgalite.rb +179 -0
  1109. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/cubrid.rb +143 -0
  1110. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/db2.rb +229 -0
  1111. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/dbi.rb +101 -0
  1112. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/do.rb +156 -0
  1113. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/do/mysql.rb +64 -0
  1114. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/do/postgres.rb +42 -0
  1115. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/do/sqlite3.rb +40 -0
  1116. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/fdbsql.rb +285 -0
  1117. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/firebird.rb +104 -0
  1118. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/ibmdb.rb +476 -0
  1119. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/informix.rb +67 -0
  1120. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc.rb +794 -0
  1121. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/as400.rb +82 -0
  1122. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/cubrid.rb +62 -0
  1123. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/db2.rb +91 -0
  1124. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/derby.rb +312 -0
  1125. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/fdbsql.rb +65 -0
  1126. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/firebirdsql.rb +34 -0
  1127. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/h2.rb +227 -0
  1128. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/hsqldb.rb +231 -0
  1129. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/informix-sqli.rb +31 -0
  1130. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/jdbcprogress.rb +31 -0
  1131. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/jtds.rb +45 -0
  1132. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/mssql.rb +47 -0
  1133. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/mysql.rb +90 -0
  1134. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/oracle.rb +140 -0
  1135. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/postgresql.rb +215 -0
  1136. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/sqlanywhere.rb +82 -0
  1137. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/sqlite.rb +82 -0
  1138. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/sqlserver.rb +61 -0
  1139. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/jdbc/transactions.rb +109 -0
  1140. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/mock.rb +391 -0
  1141. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/mysql.rb +372 -0
  1142. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/mysql2.rb +200 -0
  1143. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/odbc.rb +149 -0
  1144. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/odbc/db2.rb +9 -0
  1145. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/odbc/mssql.rb +61 -0
  1146. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/odbc/progress.rb +8 -0
  1147. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/openbase.rb +53 -0
  1148. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/oracle.rb +459 -0
  1149. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/postgres.rb +877 -0
  1150. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/access.rb +299 -0
  1151. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/cubrid.rb +243 -0
  1152. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/db2.rb +403 -0
  1153. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/fdbsql.rb +550 -0
  1154. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/firebird.rb +245 -0
  1155. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/informix.rb +52 -0
  1156. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/mssql.rb +1037 -0
  1157. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/mysql.rb +984 -0
  1158. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/mysql_prepared_statements.rb +182 -0
  1159. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/oracle.rb +522 -0
  1160. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/postgres.rb +1617 -0
  1161. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/progress.rb +38 -0
  1162. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/sqlanywhere.rb +470 -0
  1163. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/shared/sqlite.rb +729 -0
  1164. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/sqlanywhere.rb +177 -0
  1165. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/sqlite.rb +413 -0
  1166. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/swift.rb +150 -0
  1167. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/swift/mysql.rb +47 -0
  1168. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/swift/postgres.rb +45 -0
  1169. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/swift/sqlite.rb +35 -0
  1170. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/tinytds.rb +282 -0
  1171. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +75 -0
  1172. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +62 -0
  1173. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/utils/pg_types.rb +68 -0
  1174. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/utils/replace.rb +36 -0
  1175. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/utils/split_alter_table.rb +44 -0
  1176. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/adapters/utils/stored_procedures.rb +74 -0
  1177. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/ast_transformer.rb +200 -0
  1178. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/connection_pool.rb +110 -0
  1179. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/connection_pool/sharded_single.rb +98 -0
  1180. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/connection_pool/sharded_threaded.rb +265 -0
  1181. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/connection_pool/single.rb +38 -0
  1182. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/connection_pool/threaded.rb +198 -0
  1183. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/core.rb +394 -0
  1184. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database.rb +20 -0
  1185. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/connecting.rb +318 -0
  1186. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/dataset.rb +69 -0
  1187. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/dataset_defaults.rb +175 -0
  1188. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/features.rb +134 -0
  1189. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/logging.rb +73 -0
  1190. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/misc.rb +534 -0
  1191. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/query.rb +329 -0
  1192. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/schema_generator.rb +525 -0
  1193. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/schema_methods.rb +964 -0
  1194. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/database/transactions.rb +353 -0
  1195. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset.rb +40 -0
  1196. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/actions.rb +1045 -0
  1197. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/features.rb +203 -0
  1198. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/graph.rb +272 -0
  1199. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/misc.rb +279 -0
  1200. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/mutation.rb +109 -0
  1201. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/placeholder_literalizer.rb +179 -0
  1202. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/prepared_statements.rb +283 -0
  1203. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/query.rb +1136 -0
  1204. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/dataset/sql.rb +1555 -0
  1205. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/deprecated.rb +58 -0
  1206. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/exceptions.rb +77 -0
  1207. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/_pretty_table.rb +84 -0
  1208. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/arbitrary_servers.rb +110 -0
  1209. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/blank.rb +47 -0
  1210. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/columns_introspection.rb +83 -0
  1211. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/connection_validator.rb +110 -0
  1212. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/constraint_validations.rb +455 -0
  1213. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/core_extensions.rb +230 -0
  1214. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/core_refinements.rb +221 -0
  1215. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/current_datetime_timestamp.rb +58 -0
  1216. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/dataset_source_alias.rb +91 -0
  1217. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/date_arithmetic.rb +192 -0
  1218. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/empty_array_ignore_nulls.rb +34 -0
  1219. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/error_sql.rb +72 -0
  1220. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/eval_inspect.rb +182 -0
  1221. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/filter_having.rb +59 -0
  1222. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/from_block.rb +32 -0
  1223. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/graph_each.rb +75 -0
  1224. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/hash_aliases.rb +45 -0
  1225. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/inflector.rb +246 -0
  1226. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/looser_typecasting.rb +44 -0
  1227. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/meta_def.rb +31 -0
  1228. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/migration.rb +736 -0
  1229. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +80 -0
  1230. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/named_timezones.rb +99 -0
  1231. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/null_dataset.rb +105 -0
  1232. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pagination.rb +121 -0
  1233. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_array.rb +606 -0
  1234. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_array_ops.rb +324 -0
  1235. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_enum.rb +136 -0
  1236. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_hstore.rb +357 -0
  1237. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_hstore_ops.rb +349 -0
  1238. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_inet.rb +118 -0
  1239. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_interval.rb +198 -0
  1240. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_json.rb +365 -0
  1241. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_json_ops.rb +434 -0
  1242. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_loose_count.rb +33 -0
  1243. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_range.rb +546 -0
  1244. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_range_ops.rb +162 -0
  1245. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_row.rb +615 -0
  1246. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_row_ops.rb +194 -0
  1247. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pg_static_cache_updater.rb +140 -0
  1248. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/pretty_table.rb +36 -0
  1249. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/query.rb +78 -0
  1250. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/query_literals.rb +80 -0
  1251. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/round_timestamps.rb +52 -0
  1252. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/ruby18_symbol_extensions.rb +22 -0
  1253. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/schema_caching.rb +75 -0
  1254. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/schema_dumper.rb +476 -0
  1255. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/select_remove.rb +48 -0
  1256. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/sequel_3_dataset_methods.rb +118 -0
  1257. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/server_block.rb +149 -0
  1258. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/set_overrides.rb +72 -0
  1259. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/split_array_nil.rb +66 -0
  1260. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/sql_expr.rb +20 -0
  1261. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/string_date_time.rb +50 -0
  1262. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/thread_local_timezones.rb +55 -0
  1263. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/extensions/to_dot.rb +154 -0
  1264. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model.rb +175 -0
  1265. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model/associations.rb +3171 -0
  1266. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model/base.rb +2306 -0
  1267. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model/dataset_module.rb +30 -0
  1268. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model/default_inflections.rb +45 -0
  1269. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model/errors.rb +58 -0
  1270. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model/exceptions.rb +46 -0
  1271. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model/inflections.rb +162 -0
  1272. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/model/plugins.rb +49 -0
  1273. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/no_core_ext.rb +1 -0
  1274. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/active_model.rb +99 -0
  1275. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/after_initialize.rb +37 -0
  1276. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/association_autoreloading.rb +7 -0
  1277. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/association_dependencies.rb +97 -0
  1278. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/association_pks.rb +167 -0
  1279. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/association_proxies.rb +105 -0
  1280. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/auto_validations.rb +161 -0
  1281. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/blacklist_security.rb +93 -0
  1282. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/boolean_readers.rb +56 -0
  1283. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/caching.rb +153 -0
  1284. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/class_table_inheritance.rb +292 -0
  1285. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/column_select.rb +57 -0
  1286. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/composition.rb +187 -0
  1287. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/constraint_validations.rb +229 -0
  1288. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/dataset_associations.rb +107 -0
  1289. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/defaults_setter.rb +69 -0
  1290. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/dirty.rb +231 -0
  1291. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/eager_each.rb +64 -0
  1292. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/error_splitter.rb +54 -0
  1293. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/force_encoding.rb +81 -0
  1294. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/hook_class_methods.rb +125 -0
  1295. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/input_transformer.rb +79 -0
  1296. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/insert_returning_select.rb +70 -0
  1297. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/instance_filters.rb +131 -0
  1298. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/instance_hooks.rb +96 -0
  1299. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/json_serializer.rb +352 -0
  1300. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/lazy_attributes.rb +117 -0
  1301. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/list.rb +189 -0
  1302. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/many_through_many.rb +317 -0
  1303. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/many_to_one_pk_lookup.rb +7 -0
  1304. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/modification_detection.rb +90 -0
  1305. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/mssql_optimistic_locking.rb +92 -0
  1306. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/nested_attributes.rb +323 -0
  1307. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/optimistic_locking.rb +83 -0
  1308. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/pg_array_associations.rb +528 -0
  1309. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/pg_row.rb +123 -0
  1310. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/pg_typecast_on_load.rb +78 -0
  1311. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/prepared_statements.rb +205 -0
  1312. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/prepared_statements_associations.rb +116 -0
  1313. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/prepared_statements_safe.rb +73 -0
  1314. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  1315. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/rcte_tree.rb +343 -0
  1316. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/schema.rb +80 -0
  1317. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/scissors.rb +33 -0
  1318. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/serialization.rb +235 -0
  1319. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/serialization_modification_detection.rb +84 -0
  1320. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/sharding.rb +117 -0
  1321. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/single_table_inheritance.rb +230 -0
  1322. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/skip_create_refresh.rb +35 -0
  1323. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/split_values.rb +64 -0
  1324. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/static_cache.rb +215 -0
  1325. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/string_stripper.rb +57 -0
  1326. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/subclasses.rb +61 -0
  1327. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/table_select.rb +41 -0
  1328. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/tactical_eager_loading.rb +85 -0
  1329. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/timestamps.rb +95 -0
  1330. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/touch.rb +140 -0
  1331. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/tree.rb +156 -0
  1332. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/typecast_on_load.rb +80 -0
  1333. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/unlimited_update.rb +31 -0
  1334. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/update_or_create.rb +60 -0
  1335. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/update_primary_key.rb +70 -0
  1336. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/validation_class_methods.rb +439 -0
  1337. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/validation_helpers.rb +291 -0
  1338. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/plugins/xml_serializer.rb +410 -0
  1339. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/sql.rb +1865 -0
  1340. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/timezones.rb +221 -0
  1341. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/lib/sequel/version.rb +18 -0
  1342. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/db2_spec.rb +148 -0
  1343. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/fdbsql_spec.rb +429 -0
  1344. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/firebird_spec.rb +417 -0
  1345. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/informix_spec.rb +100 -0
  1346. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/mssql_spec.rb +722 -0
  1347. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/mysql_spec.rb +1304 -0
  1348. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/oracle_spec.rb +315 -0
  1349. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/postgres_spec.rb +3537 -0
  1350. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/spec_helper.rb +76 -0
  1351. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/sqlanywhere_spec.rb +170 -0
  1352. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/adapters/sqlite_spec.rb +650 -0
  1353. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/bin_spec.rb +256 -0
  1354. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/connection_pool_spec.rb +982 -0
  1355. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/database_spec.rb +2487 -0
  1356. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/dataset_spec.rb +4970 -0
  1357. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/deprecated_spec.rb +70 -0
  1358. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/expression_filters_spec.rb +1197 -0
  1359. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/mock_adapter_spec.rb +462 -0
  1360. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/object_graph_spec.rb +303 -0
  1361. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/placeholder_literalizer_spec.rb +163 -0
  1362. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/schema_generator_spec.rb +179 -0
  1363. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/schema_spec.rb +1610 -0
  1364. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/spec_helper.rb +49 -0
  1365. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core/version_spec.rb +7 -0
  1366. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/core_extensions_spec.rb +695 -0
  1367. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/active_model_spec.rb +123 -0
  1368. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/after_initialize_spec.rb +24 -0
  1369. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/arbitrary_servers_spec.rb +109 -0
  1370. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/association_dependencies_spec.rb +117 -0
  1371. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/association_pks_spec.rb +281 -0
  1372. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/association_proxies_spec.rb +86 -0
  1373. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/auto_validations_spec.rb +158 -0
  1374. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/blacklist_security_spec.rb +87 -0
  1375. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/blank_spec.rb +69 -0
  1376. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/boolean_readers_spec.rb +93 -0
  1377. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/caching_spec.rb +270 -0
  1378. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/class_table_inheritance_spec.rb +274 -0
  1379. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/column_select_spec.rb +108 -0
  1380. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/columns_introspection_spec.rb +91 -0
  1381. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/composition_spec.rb +242 -0
  1382. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/connection_validator_spec.rb +118 -0
  1383. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/constraint_validations_plugin_spec.rb +274 -0
  1384. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/constraint_validations_spec.rb +325 -0
  1385. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/core_refinements_spec.rb +519 -0
  1386. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/current_datetime_timestamp_spec.rb +27 -0
  1387. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/dataset_associations_spec.rb +311 -0
  1388. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/dataset_source_alias_spec.rb +51 -0
  1389. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/date_arithmetic_spec.rb +157 -0
  1390. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/defaults_setter_spec.rb +101 -0
  1391. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/dirty_spec.rb +180 -0
  1392. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/eager_each_spec.rb +42 -0
  1393. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/empty_array_ignore_nulls_spec.rb +24 -0
  1394. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/error_splitter_spec.rb +18 -0
  1395. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/error_sql_spec.rb +20 -0
  1396. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/eval_inspect_spec.rb +73 -0
  1397. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/filter_having_spec.rb +40 -0
  1398. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/force_encoding_spec.rb +114 -0
  1399. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/from_block_spec.rb +21 -0
  1400. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/graph_each_spec.rb +109 -0
  1401. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/hash_aliases_spec.rb +24 -0
  1402. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/hook_class_methods_spec.rb +416 -0
  1403. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/inflector_spec.rb +183 -0
  1404. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/input_transformer_spec.rb +54 -0
  1405. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/insert_returning_select_spec.rb +46 -0
  1406. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/instance_filters_spec.rb +79 -0
  1407. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/instance_hooks_spec.rb +276 -0
  1408. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/json_serializer_spec.rb +267 -0
  1409. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/lazy_attributes_spec.rb +170 -0
  1410. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/list_spec.rb +265 -0
  1411. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/looser_typecasting_spec.rb +43 -0
  1412. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/many_through_many_spec.rb +2159 -0
  1413. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/meta_def_spec.rb +21 -0
  1414. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/migration_spec.rb +709 -0
  1415. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/modification_detection_spec.rb +80 -0
  1416. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/mssql_optimistic_locking_spec.rb +91 -0
  1417. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/named_timezones_spec.rb +108 -0
  1418. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/nested_attributes_spec.rb +697 -0
  1419. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/null_dataset_spec.rb +85 -0
  1420. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/optimistic_locking_spec.rb +128 -0
  1421. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pagination_spec.rb +118 -0
  1422. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_array_associations_spec.rb +736 -0
  1423. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_array_ops_spec.rb +143 -0
  1424. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_array_spec.rb +390 -0
  1425. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_enum_spec.rb +64 -0
  1426. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_hstore_ops_spec.rb +236 -0
  1427. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_hstore_spec.rb +206 -0
  1428. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_inet_spec.rb +52 -0
  1429. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_interval_spec.rb +76 -0
  1430. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_json_ops_spec.rb +226 -0
  1431. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_json_spec.rb +218 -0
  1432. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_loose_count_spec.rb +17 -0
  1433. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_range_ops_spec.rb +58 -0
  1434. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_range_spec.rb +404 -0
  1435. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_row_ops_spec.rb +60 -0
  1436. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_row_plugin_spec.rb +62 -0
  1437. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_row_spec.rb +360 -0
  1438. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_static_cache_updater_spec.rb +92 -0
  1439. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pg_typecast_on_load_spec.rb +63 -0
  1440. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/prepared_statements_associations_spec.rb +151 -0
  1441. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  1442. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/prepared_statements_spec.rb +103 -0
  1443. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  1444. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/pretty_table_spec.rb +92 -0
  1445. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/query_literals_spec.rb +167 -0
  1446. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/query_spec.rb +102 -0
  1447. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/rcte_tree_spec.rb +387 -0
  1448. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/round_timestamps_spec.rb +43 -0
  1449. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/schema_caching_spec.rb +41 -0
  1450. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/schema_dumper_spec.rb +788 -0
  1451. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/schema_spec.rb +113 -0
  1452. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/scissors_spec.rb +26 -0
  1453. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/select_remove_spec.rb +38 -0
  1454. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/sequel_3_dataset_methods_spec.rb +101 -0
  1455. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/serialization_modification_detection_spec.rb +98 -0
  1456. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/serialization_spec.rb +340 -0
  1457. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/server_block_spec.rb +90 -0
  1458. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/set_overrides_spec.rb +61 -0
  1459. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/sharding_spec.rb +198 -0
  1460. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/shared_caching_spec.rb +175 -0
  1461. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/single_table_inheritance_spec.rb +276 -0
  1462. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/skip_create_refresh_spec.rb +17 -0
  1463. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/spec_helper.rb +96 -0
  1464. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/split_array_nil_spec.rb +24 -0
  1465. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/split_values_spec.rb +22 -0
  1466. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/sql_expr_spec.rb +60 -0
  1467. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/static_cache_spec.rb +355 -0
  1468. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/string_date_time_spec.rb +95 -0
  1469. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/string_stripper_spec.rb +68 -0
  1470. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/subclasses_spec.rb +66 -0
  1471. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/table_select_spec.rb +71 -0
  1472. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/tactical_eager_loading_spec.rb +82 -0
  1473. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/thread_local_timezones_spec.rb +67 -0
  1474. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/timestamps_spec.rb +175 -0
  1475. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/to_dot_spec.rb +154 -0
  1476. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/touch_spec.rb +203 -0
  1477. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/tree_spec.rb +270 -0
  1478. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/typecast_on_load_spec.rb +80 -0
  1479. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/unlimited_update_spec.rb +20 -0
  1480. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/update_or_create_spec.rb +81 -0
  1481. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/update_primary_key_spec.rb +100 -0
  1482. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/validation_class_methods_spec.rb +1030 -0
  1483. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/validation_helpers_spec.rb +520 -0
  1484. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/extensions/xml_serializer_spec.rb +207 -0
  1485. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/bad_down_migration/001_create_alt_basic.rb +4 -0
  1486. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/bad_down_migration/002_create_alt_advanced.rb +4 -0
  1487. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  1488. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +9 -0
  1489. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +3 -0
  1490. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/bad_up_migration/001_create_alt_basic.rb +4 -0
  1491. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/bad_up_migration/002_create_alt_advanced.rb +3 -0
  1492. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +9 -0
  1493. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +9 -0
  1494. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +4 -0
  1495. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +9 -0
  1496. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +9 -0
  1497. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +4 -0
  1498. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +4 -0
  1499. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  1500. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +9 -0
  1501. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +4 -0
  1502. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/integer_migrations/001_create_sessions.rb +9 -0
  1503. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/integer_migrations/002_create_nodes.rb +9 -0
  1504. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/integer_migrations/003_3_create_users.rb +4 -0
  1505. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  1506. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +9 -0
  1507. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +9 -0
  1508. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +9 -0
  1509. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +4 -0
  1510. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/missing_integer_migrations/001_create_alt_basic.rb +4 -0
  1511. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +4 -0
  1512. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  1513. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +4 -0
  1514. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/reversible_migrations/001_reversible.rb +5 -0
  1515. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/reversible_migrations/002_reversible.rb +5 -0
  1516. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/reversible_migrations/003_reversible.rb +5 -0
  1517. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/reversible_migrations/004_reversible.rb +5 -0
  1518. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/reversible_migrations/005_reversible.rb +10 -0
  1519. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/timestamped_migrations/1273253849_create_sessions.rb +9 -0
  1520. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/timestamped_migrations/1273253851_create_nodes.rb +9 -0
  1521. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/timestamped_migrations/1273253853_3_create_users.rb +4 -0
  1522. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  1523. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  1524. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  1525. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  1526. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +9 -0
  1527. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +9 -0
  1528. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +4 -0
  1529. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/associations_test.rb +2453 -0
  1530. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/database_test.rb +113 -0
  1531. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/dataset_test.rb +1798 -0
  1532. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/eager_loader_test.rb +687 -0
  1533. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/migrator_test.rb +240 -0
  1534. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/model_test.rb +226 -0
  1535. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/plugin_test.rb +2162 -0
  1536. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/prepared_statement_test.rb +426 -0
  1537. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/schema_test.rb +801 -0
  1538. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/spec_helper.rb +111 -0
  1539. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/timezone_test.rb +86 -0
  1540. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/transaction_test.rb +374 -0
  1541. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/integration/type_test.rb +133 -0
  1542. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/association_reflection_spec.rb +500 -0
  1543. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/associations_spec.rb +4316 -0
  1544. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/base_spec.rb +746 -0
  1545. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/class_dataset_methods_spec.rb +145 -0
  1546. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/dataset_methods_spec.rb +149 -0
  1547. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/eager_loading_spec.rb +2080 -0
  1548. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/hooks_spec.rb +536 -0
  1549. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/inflector_spec.rb +26 -0
  1550. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/model_spec.rb +992 -0
  1551. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/plugins_spec.rb +299 -0
  1552. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/record_spec.rb +2053 -0
  1553. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/spec_helper.rb +64 -0
  1554. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/model/validations_spec.rb +191 -0
  1555. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/rspec_helper.rb +22 -0
  1556. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/sequel_coverage.rb +15 -0
  1557. data/vendor/bundle/ruby/1.9.1/gems/sequel-4.15.0/spec/spec_config.rb +2 -0
  1558. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/CHANGES.md +303 -0
  1559. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/Gemfile +3 -0
  1560. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/LICENSE +20 -0
  1561. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/README.md +182 -0
  1562. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/Rakefile +29 -0
  1563. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/lib/slop.rb +687 -0
  1564. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/lib/slop/commands.rb +196 -0
  1565. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/lib/slop/option.rb +209 -0
  1566. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/slop.gemspec +17 -0
  1567. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/test/commands_test.rb +26 -0
  1568. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/test/helper.rb +12 -0
  1569. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/test/option_test.rb +138 -0
  1570. data/vendor/bundle/ruby/1.9.1/gems/slop-3.5.0/test/slop_test.rb +518 -0
  1571. data/vendor/bundle/ruby/1.9.1/gems/threadify-1.3.0/README +151 -0
  1572. data/vendor/bundle/ruby/1.9.1/gems/threadify-1.3.0/README.erb +43 -0
  1573. data/vendor/bundle/ruby/1.9.1/gems/threadify-1.3.0/lib/threadify.rb +176 -0
  1574. data/vendor/bundle/ruby/1.9.1/gems/threadify-1.3.0/rakefile +222 -0
  1575. data/vendor/bundle/ruby/1.9.1/gems/threadify-1.3.0/sample/a.rb +37 -0
  1576. data/vendor/bundle/ruby/1.9.1/gems/threadify-1.3.0/sample/b.rb +41 -0
  1577. data/vendor/bundle/ruby/1.9.1/gems/threadify-1.3.0/threadify.gemspec +26 -0
  1578. data/vendor/bundle/ruby/1.9.1/specifications/amalgalite-1.3.0.gemspec +52 -0
  1579. data/vendor/bundle/ruby/1.9.1/specifications/arrayfields-4.7.4.gemspec +16 -0
  1580. data/vendor/bundle/ruby/1.9.1/specifications/chronic-0.10.2.gemspec +42 -0
  1581. data/vendor/bundle/ruby/1.9.1/specifications/coderay-1.1.0.gemspec +23 -0
  1582. data/vendor/bundle/ruby/1.9.1/specifications/coerce-0.0.6.gemspec +30 -0
  1583. data/vendor/bundle/ruby/1.9.1/specifications/daemons-1.1.9.gemspec +19 -0
  1584. data/vendor/bundle/ruby/1.9.1/specifications/fastercsv-1.5.5.gemspec +20 -0
  1585. data/vendor/bundle/ruby/1.9.1/specifications/fattr-2.2.2.gemspec +18 -0
  1586. data/vendor/bundle/ruby/1.9.1/specifications/flowdock-0.5.0.gemspec +51 -0
  1587. data/vendor/bundle/ruby/1.9.1/specifications/highline-1.6.21.gemspec +21 -0
  1588. data/vendor/bundle/ruby/1.9.1/specifications/httparty-0.13.1.gemspec +35 -0
  1589. data/vendor/bundle/ruby/1.9.1/specifications/json-1.8.1.gemspec +36 -0
  1590. data/vendor/bundle/ruby/1.9.1/specifications/main-6.0.0.gemspec +39 -0
  1591. data/vendor/bundle/ruby/1.9.1/specifications/main-6.1.0.gemspec +39 -0
  1592. data/vendor/bundle/ruby/1.9.1/specifications/map-6.5.5.gemspec +18 -0
  1593. data/vendor/bundle/ruby/1.9.1/specifications/method_source-0.8.2.gemspec +31 -0
  1594. data/vendor/bundle/ruby/1.9.1/specifications/multi_json-1.10.1.gemspec +30 -0
  1595. data/vendor/bundle/ruby/1.9.1/specifications/multi_xml-0.5.5.gemspec +30 -0
  1596. data/vendor/bundle/ruby/1.9.1/specifications/pry-0.9.12.6.gemspec +51 -0
  1597. data/vendor/bundle/ruby/1.9.1/specifications/sekrets-1.7.0.gemspec +43 -0
  1598. data/vendor/bundle/ruby/1.9.1/specifications/sequel-4.15.0.gemspec +22 -0
  1599. data/vendor/bundle/ruby/1.9.1/specifications/slop-3.5.0.gemspec +33 -0
  1600. data/vendor/bundle/ruby/1.9.1/specifications/threadify-1.3.0.gemspec +16 -0
  1601. metadata +1804 -0
@@ -0,0 +1,145 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe Sequel::Model, "class dataset methods" do
4
+ before do
5
+ @db = Sequel.mock
6
+ @c = Class.new(Sequel::Model(@db[:items]))
7
+ @d = @c.dataset
8
+ def @d.supports_cte?(*) true end
9
+ @d._fetch = {:id=>1}
10
+ @d.autoid = 1
11
+ @d.numrows = 0
12
+ @db.sqls
13
+ end
14
+
15
+ it "should call the dataset method of the same name with the same args" do
16
+ @c.<<({}).should == @d
17
+ @db.sqls.should == ["INSERT INTO items DEFAULT VALUES"]
18
+ @c.all.should == [@c.load(:id=>1)]
19
+ @db.sqls.should == ["SELECT * FROM items"]
20
+ @c.avg(:id).should == 1
21
+ @db.sqls.should == ["SELECT avg(id) AS avg FROM items LIMIT 1"]
22
+ @c.count.should == 1
23
+ @db.sqls.should == ["SELECT count(*) AS count FROM items LIMIT 1"]
24
+ @c.cross_join(@c).sql.should == "SELECT * FROM items CROSS JOIN items"
25
+ @c.distinct.sql.should == "SELECT DISTINCT * FROM items"
26
+ @c.each{|r| r.should == @c.load(:id=>1)}.should == @d
27
+ @db.sqls.should == ["SELECT * FROM items"]
28
+ @c.each_server{|r| r.opts[:server].should == :default}
29
+ @c.empty?.should == false
30
+ @db.sqls.should == ["SELECT 1 AS one FROM items LIMIT 1"]
31
+ @c.except(@d, :from_self=>false).sql.should == "SELECT * FROM items EXCEPT SELECT * FROM items"
32
+ @c.exclude(:a).sql.should == "SELECT * FROM items WHERE NOT a"
33
+ @c.exclude_having(:a).sql.should == "SELECT * FROM items HAVING NOT a"
34
+ @c.exclude_where(:a).sql.should == "SELECT * FROM items WHERE NOT a"
35
+ @c.fetch_rows("S"){|r| r.should == {:id=>1}}
36
+ @db.sqls.should == ["S"]
37
+ @c.filter(:a).sql.should == "SELECT * FROM items WHERE a"
38
+ @c.first.should == @c.load(:id=>1)
39
+ @db.sqls.should == ["SELECT * FROM items LIMIT 1"]
40
+ @c.first!.should == @c.load(:id=>1)
41
+ @db.sqls.should == ["SELECT * FROM items LIMIT 1"]
42
+ @c.for_update.sql.should == "SELECT * FROM items FOR UPDATE"
43
+ @c.from.sql.should == "SELECT *"
44
+ @c.from_self.sql.should == "SELECT * FROM (SELECT * FROM items) AS t1"
45
+ @c.full_join(@c).sql.should == "SELECT * FROM items FULL JOIN items"
46
+ @c.full_outer_join(@c).sql.should == "SELECT * FROM items FULL OUTER JOIN items"
47
+ @c.get(:a).should == 1
48
+ @db.sqls.should == ["SELECT a FROM items LIMIT 1"]
49
+ @c.graph(@c, nil, :table_alias=>:a).sql.should == "SELECT * FROM items LEFT OUTER JOIN items AS a"
50
+ @db.sqls
51
+ @c.grep(:id, 'a%').sql.should == "SELECT * FROM items WHERE ((id LIKE 'a%' ESCAPE '\\'))"
52
+ @c.group(:a).sql.should == "SELECT * FROM items GROUP BY a"
53
+ @c.group_and_count(:a).sql.should == "SELECT a, count(*) AS count FROM items GROUP BY a"
54
+ @c.group_by(:a).sql.should == "SELECT * FROM items GROUP BY a"
55
+ @c.having(:a).sql.should == "SELECT * FROM items HAVING a"
56
+ @c.import([:id], [[1]])
57
+ @db.sqls.should == ["BEGIN", "INSERT INTO items (id) VALUES (1)", "COMMIT"]
58
+ @c.inner_join(@c).sql.should == "SELECT * FROM items INNER JOIN items"
59
+ @c.insert.should == 2
60
+ @db.sqls.should == ["INSERT INTO items DEFAULT VALUES"]
61
+ @c.intersect(@d, :from_self=>false).sql.should == "SELECT * FROM items INTERSECT SELECT * FROM items"
62
+ @c.interval(:id).should == 1
63
+ @db.sqls.should == ["SELECT (max(id) - min(id)) AS interval FROM items LIMIT 1"]
64
+ @c.join(@c).sql.should == "SELECT * FROM items INNER JOIN items"
65
+ @c.join_table(:inner, @c).sql.should == "SELECT * FROM items INNER JOIN items"
66
+ @c.last.should == @c.load(:id=>1)
67
+ @db.sqls.should == ["SELECT * FROM items ORDER BY id DESC LIMIT 1"]
68
+ @c.left_join(@c).sql.should == "SELECT * FROM items LEFT JOIN items"
69
+ @c.left_outer_join(@c).sql.should == "SELECT * FROM items LEFT OUTER JOIN items"
70
+ @c.limit(2).sql.should == "SELECT * FROM items LIMIT 2"
71
+ @c.lock_style(:update).sql.should == "SELECT * FROM items FOR UPDATE"
72
+ @c.map(:id).should == [1]
73
+ @db.sqls.should == ["SELECT * FROM items"]
74
+ @c.max(:id).should == 1
75
+ @db.sqls.should == ["SELECT max(id) AS max FROM items LIMIT 1"]
76
+ @c.min(:id).should == 1
77
+ @db.sqls.should == ["SELECT min(id) AS min FROM items LIMIT 1"]
78
+ @c.multi_insert([{:id=>1}])
79
+ @db.sqls.should == ["BEGIN", "INSERT INTO items (id) VALUES (1)", "COMMIT"]
80
+ @c.naked.row_proc.should == nil
81
+ @c.natural_full_join(@c).sql.should == "SELECT * FROM items NATURAL FULL JOIN items"
82
+ @c.natural_join(@c).sql.should == "SELECT * FROM items NATURAL JOIN items"
83
+ @c.natural_left_join(@c).sql.should == "SELECT * FROM items NATURAL LEFT JOIN items"
84
+ @c.natural_right_join(@c).sql.should == "SELECT * FROM items NATURAL RIGHT JOIN items"
85
+ @c.offset(2).sql.should == "SELECT * FROM items OFFSET 2"
86
+ @c.order(:a).sql.should == "SELECT * FROM items ORDER BY a"
87
+ @c.order_append(:a).sql.should == "SELECT * FROM items ORDER BY a"
88
+ @c.order_by(:a).sql.should == "SELECT * FROM items ORDER BY a"
89
+ @c.order_more(:a).sql.should == "SELECT * FROM items ORDER BY a"
90
+ @c.order_prepend(:a).sql.should == "SELECT * FROM items ORDER BY a"
91
+ @c.paged_each{|r| r.should == @c.load(:id=>1)}
92
+ @db.sqls.should == ["BEGIN", "SELECT * FROM items ORDER BY id LIMIT 1000 OFFSET 0", "COMMIT"]
93
+ @c.qualify.sql.should == 'SELECT items.* FROM items'
94
+ @c.right_join(@c).sql.should == "SELECT * FROM items RIGHT JOIN items"
95
+ @c.right_outer_join(@c).sql.should == "SELECT * FROM items RIGHT OUTER JOIN items"
96
+ @c.select(:a).sql.should == "SELECT a FROM items"
97
+ @c.select_all(:items).sql.should == "SELECT items.* FROM items"
98
+ @c.select_append(:a).sql.should == "SELECT *, a FROM items"
99
+ @c.select_group(:a).sql.should == "SELECT a FROM items GROUP BY a"
100
+ @c.select_hash(:id, :id).should == {1=>1}
101
+ @db.sqls.should == ["SELECT id, id FROM items"]
102
+ @c.select_hash_groups(:id, :id).should == {1=>[1]}
103
+ @db.sqls.should == ["SELECT id, id FROM items"]
104
+ @c.select_map(:id).should == [1]
105
+ @db.sqls.should == ["SELECT id FROM items"]
106
+ @c.select_order_map(:id).should == [1]
107
+ @db.sqls.should == ["SELECT id FROM items ORDER BY id"]
108
+ @c.server(:a).opts[:server].should == :a
109
+ @c.set_graph_aliases(:a=>:b).opts[:graph_aliases].should == {:a=>[:b, :a]}
110
+ @c.single_record.should == @c.load(:id=>1)
111
+ @db.sqls.should == ["SELECT * FROM items LIMIT 1"]
112
+ @c.single_value.should == 1
113
+ @db.sqls.should == ["SELECT * FROM items LIMIT 1"]
114
+ @c.sum(:id).should == 1
115
+ @db.sqls.should == ["SELECT sum(id) AS sum FROM items LIMIT 1"]
116
+ @c.to_hash(:id, :id).should == {1=>1}
117
+ @db.sqls.should == ["SELECT * FROM items"]
118
+ @c.to_hash_groups(:id, :id).should == {1=>[1]}
119
+ @db.sqls.should == ["SELECT * FROM items"]
120
+ @c.truncate
121
+ @db.sqls.should == ["TRUNCATE TABLE items"]
122
+ @c.union(@d, :from_self=>false).sql.should == "SELECT * FROM items UNION SELECT * FROM items"
123
+ @c.where(:a).sql.should == "SELECT * FROM items WHERE a"
124
+ @c.with(:a, @d).sql.should == "WITH a AS (SELECT * FROM items) SELECT * FROM items"
125
+ @c.with_recursive(:a, @d, @d).sql.should == "WITH a AS (SELECT * FROM items UNION ALL SELECT * FROM items) SELECT * FROM items"
126
+ @c.with_sql('S').sql.should == "S"
127
+
128
+ sc = Class.new(@c)
129
+ sc.set_dataset(@d.where(:a).order(:a).select(:a).group(:a).limit(2))
130
+ @db.sqls
131
+ sc.invert.sql.should == 'SELECT a FROM items WHERE NOT a GROUP BY a ORDER BY a LIMIT 2'
132
+ sc.dataset._fetch = {:v1=>1, :v2=>2}
133
+ sc.range(:a).should == (1..2)
134
+ @db.sqls.should == ["SELECT min(a) AS v1, max(a) AS v2 FROM (SELECT a FROM items WHERE a GROUP BY a ORDER BY a LIMIT 2) AS t1 LIMIT 1"]
135
+ sc.reverse.sql.should == 'SELECT a FROM items WHERE a GROUP BY a ORDER BY a DESC LIMIT 2'
136
+ sc.reverse_order.sql.should == 'SELECT a FROM items WHERE a GROUP BY a ORDER BY a DESC LIMIT 2'
137
+ sc.select_more(:a).sql.should == 'SELECT a, a FROM items WHERE a GROUP BY a ORDER BY a LIMIT 2'
138
+ sc.unfiltered.sql.should == 'SELECT a FROM items GROUP BY a ORDER BY a LIMIT 2'
139
+ sc.ungrouped.sql.should == 'SELECT a FROM items WHERE a ORDER BY a LIMIT 2'
140
+ sc.unordered.sql.should == 'SELECT a FROM items WHERE a GROUP BY a LIMIT 2'
141
+ sc.unlimited.sql.should == 'SELECT a FROM items WHERE a GROUP BY a ORDER BY a'
142
+ sc.dataset.graph!(:a)
143
+ sc.dataset.ungraphed.opts[:graph].should == nil
144
+ end
145
+ end
@@ -0,0 +1,149 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe Sequel::Model::DatasetMethods, "#destroy" do
4
+ before do
5
+ @c = Class.new(Sequel::Model(:items)) do
6
+ self::Destroyed = []
7
+ def destroy
8
+ model::Destroyed << self
9
+ end
10
+ end
11
+ @d = @c.dataset
12
+ @d._fetch = [{:id=>1}, {:id=>2}]
13
+ DB.reset
14
+ end
15
+
16
+ it "should instantiate objects in the dataset and call destroy on each" do
17
+ @d.destroy
18
+ @c::Destroyed.collect{|x| x.values}.should == [{:id=>1}, {:id=>2}]
19
+ end
20
+
21
+ it "should return the number of records destroyed" do
22
+ @d.destroy.should == 2
23
+ @d._fetch = [[{:i=>1}], []]
24
+ @d.destroy.should == 1
25
+ @d.destroy.should == 0
26
+ end
27
+
28
+ it "should use a transaction if use_transactions is true for the model" do
29
+ @c.use_transactions = true
30
+ @d.destroy
31
+ DB.sqls.should == ["BEGIN", "SELECT * FROM items", "COMMIT"]
32
+ end
33
+
34
+ it "should not use a transaction if use_transactions is false for the model" do
35
+ @c.use_transactions = false
36
+ @d.destroy
37
+ DB.sqls.should == ["SELECT * FROM items"]
38
+ end
39
+ end
40
+
41
+ describe Sequel::Model::DatasetMethods, "#to_hash" do
42
+ before do
43
+ @c = Class.new(Sequel::Model(:items)) do
44
+ set_primary_key :name
45
+ end
46
+ @d = @c.dataset
47
+ end
48
+
49
+ it "should result in a hash with primary key value keys and model object values" do
50
+ @d._fetch = [{:name=>1}, {:name=>2}]
51
+ h = @d.to_hash
52
+ h.should be_a_kind_of(Hash)
53
+ a = h.to_a
54
+ a.collect{|x| x[1].class}.should == [@c, @c]
55
+ a.sort_by{|x| x[0]}.collect{|x| [x[0], x[1].values]}.should == [[1, {:name=>1}], [2, {:name=>2}]]
56
+ end
57
+
58
+ it "should result in a hash with given value keys and model object values" do
59
+ @d._fetch = [{:name=>1, :number=>3}, {:name=>2, :number=>4}]
60
+ h = @d.to_hash(:number)
61
+ h.should be_a_kind_of(Hash)
62
+ a = h.to_a
63
+ a.collect{|x| x[1].class}.should == [@c, @c]
64
+ a.sort_by{|x| x[0]}.collect{|x| [x[0], x[1].values]}.should == [[3, {:name=>1, :number=>3}], [4, {:name=>2, :number=>4}]]
65
+ end
66
+
67
+ it "should raise an error if the class doesn't have a primary key" do
68
+ @c.no_primary_key
69
+ proc{@d.to_hash}.should raise_error(Sequel::Error)
70
+ end
71
+ end
72
+
73
+ describe Sequel::Model::DatasetMethods do
74
+ before do
75
+ @c = Class.new(Sequel::Model(:items))
76
+ @c.columns :id
77
+ @c.db.reset
78
+ end
79
+
80
+ specify "#join_table should allow use to use a model class when joining" do
81
+ @c.join(Class.new(Sequel::Model(:categories)), :item_id => :id).sql.should == 'SELECT * FROM items INNER JOIN categories ON (categories.item_id = items.id)'
82
+ end
83
+
84
+ specify "#join_table should handle model classes that aren't simple selects using a subselect" do
85
+ @c.join(Class.new(Sequel::Model(DB[:categories].where(:foo=>1))), :item_id => :id).sql.should == 'SELECT * FROM items INNER JOIN (SELECT * FROM categories WHERE (foo = 1)) AS t1 ON (t1.item_id = items.id)'
86
+ end
87
+
88
+ specify "#graph should allow use to use a model class when joining" do
89
+ c = Class.new(Sequel::Model(:categories))
90
+ c.columns :id
91
+ @c.graph(c, :item_id => :id).sql.should == 'SELECT items.id, categories.id AS categories_id FROM items LEFT OUTER JOIN categories ON (categories.item_id = items.id)'
92
+ end
93
+
94
+ specify "#insert_sql should handle a single model instance as an argument" do
95
+ @c.dataset.insert_sql(@c.load(:id=>1)).should == 'INSERT INTO items (id) VALUES (1)'
96
+ end
97
+
98
+ specify "#first should handle no primary key" do
99
+ @c.no_primary_key
100
+ @c.first.should be_a_kind_of(@c)
101
+ @c.db.sqls.should == ['SELECT * FROM items LIMIT 1']
102
+ end
103
+
104
+ specify "#last should reverse order by primary key if not already ordered" do
105
+ @c.last.should be_a_kind_of(@c)
106
+ @c.db.sqls.should == ['SELECT * FROM items ORDER BY id DESC LIMIT 1']
107
+ @c.where(:id=>2).last(:foo=>2){{bar=>3}}.should be_a_kind_of(@c)
108
+ @c.db.sqls.should == ['SELECT * FROM items WHERE ((id = 2) AND (bar = 3) AND (foo = 2)) ORDER BY id DESC LIMIT 1']
109
+ end
110
+
111
+ specify "#last should use existing order if there is one" do
112
+ @c.order(:foo).last.should be_a_kind_of(@c)
113
+ @c.db.sqls.should == ['SELECT * FROM items ORDER BY foo DESC LIMIT 1']
114
+ end
115
+
116
+ specify "#last should handle a composite primary key" do
117
+ @c.set_primary_key [:id1, :id2]
118
+ @c.last.should be_a_kind_of(@c)
119
+ @c.db.sqls.should == ['SELECT * FROM items ORDER BY id1 DESC, id2 DESC LIMIT 1']
120
+ end
121
+
122
+ specify "#last should raise an error if no primary key" do
123
+ @c.no_primary_key
124
+ proc{@c.last}.should raise_error(Sequel::Error)
125
+ end
126
+
127
+ specify "#paged_each should order by primary key if not already ordered" do
128
+ @c.paged_each{|r| r.should be_a_kind_of(@c)}
129
+ @c.db.sqls.should == ['BEGIN', 'SELECT * FROM items ORDER BY id LIMIT 1000 OFFSET 0', 'COMMIT']
130
+ @c.paged_each(:rows_per_fetch=>5){|r|}
131
+ @c.db.sqls.should == ['BEGIN', 'SELECT * FROM items ORDER BY id LIMIT 5 OFFSET 0', 'COMMIT']
132
+ end
133
+
134
+ specify "#paged_each should use existing order if there is one" do
135
+ @c.order(:foo).paged_each{|r| r.should be_a_kind_of(@c)}
136
+ @c.db.sqls.should == ['BEGIN', 'SELECT * FROM items ORDER BY foo LIMIT 1000 OFFSET 0', 'COMMIT']
137
+ end
138
+
139
+ specify "#paged_each should handle a composite primary key" do
140
+ @c.set_primary_key [:id1, :id2]
141
+ @c.paged_each{|r| r.should be_a_kind_of(@c)}
142
+ @c.db.sqls.should == ['BEGIN', 'SELECT * FROM items ORDER BY id1, id2 LIMIT 1000 OFFSET 0', 'COMMIT']
143
+ end
144
+
145
+ specify "#paged_each should raise an error if no primary key" do
146
+ @c.no_primary_key
147
+ proc{@c.paged_each{|r| }}.should raise_error(Sequel::Error)
148
+ end
149
+ end
@@ -0,0 +1,2080 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe Sequel::Model, "#eager" do
4
+ before do
5
+ class ::EagerAlbum < Sequel::Model(:albums)
6
+ columns :id, :band_id
7
+ many_to_one :band, :class=>'EagerBand', :key=>:band_id
8
+ one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id
9
+ many_to_many :genres, :class=>'EagerGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag
10
+ one_through_one :genre, :clone=>:genres
11
+ one_to_many :good_tracks, :class=>'EagerTrack', :reciprocal=>nil, :key=>:album_id do |ds|
12
+ ds.filter(:name=>'Good')
13
+ end
14
+ many_to_one :band_name, :class=>'EagerBand', :key=>:band_id, :select=>[:id, :name]
15
+ one_to_many :track_names, :class=>'EagerTrack', :key=>:album_id, :select=>[:id, :name]
16
+ many_to_many :genre_names, :class=>'EagerGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :select=>[:id]
17
+
18
+ def band_id3
19
+ band_id*3
20
+ end
21
+ end
22
+
23
+ class ::EagerBand < Sequel::Model(:bands)
24
+ columns :id, :p_k
25
+ one_to_many :albums, :class=>'EagerAlbum', :key=>:band_id, :eager=>:tracks, :reciprocal=>:band
26
+ one_to_many :graph_albums, :class=>'EagerAlbum', :key=>:band_id, :eager_graph=>:tracks, :reciprocal=>nil
27
+ many_to_many :members, :class=>'EagerBandMember', :left_key=>:band_id, :right_key=>:member_id, :join_table=>:bm
28
+ many_to_many :graph_members, :clone=>:members, :eager_graph=>:bands
29
+ one_to_many :good_albums, :class=>'EagerAlbum', :key=>:band_id, :reciprocal=>nil, :eager_block=>proc{|ds| ds.filter(:name=>'good')} do |ds|
30
+ ds.filter(:name=>'Good')
31
+ end
32
+ one_to_many :self_titled_albums, :class=>'EagerAlbum', :key=>:band_id, :allow_eager=>false do |ds|
33
+ ds.filter(:name=>name)
34
+ end
35
+ one_to_many :albums_by_name, :class=>'EagerAlbum', :key=>:band_id, :order=>:name, :allow_eager=>false
36
+ one_to_many :top_10_albums, :class=>'EagerAlbum', :key=>:band_id, :limit=>10
37
+
38
+ def id3
39
+ id/3
40
+ end
41
+ end
42
+
43
+ class ::EagerTrack < Sequel::Model(:tracks)
44
+ columns :id, :album_id
45
+ many_to_one :album, :class=>'EagerAlbum', :key=>:album_id
46
+ end
47
+
48
+ class ::EagerGenre < Sequel::Model(:genres)
49
+ columns :id, :xxx
50
+ many_to_many :albums, :class=>'EagerAlbum', :left_key=>:genre_id, :right_key=>:album_id, :join_table=>:ag
51
+ end
52
+
53
+ class ::EagerBandMember < Sequel::Model(:members)
54
+ columns :id
55
+ many_to_many :bands, :class=>'EagerBand', :left_key=>:member_id, :right_key=>:band_id, :join_table=>:bm, :order =>:id
56
+ end
57
+
58
+ EagerAlbum.dataset.columns(:id, :band_id)
59
+ EagerAlbum.dataset._fetch = proc do |sql|
60
+ h = if sql =~ /101/
61
+ {:id => 101, :band_id=> 101}
62
+ else
63
+ {:id => 1, :band_id=> 2}
64
+ end
65
+ h[:x_foreign_key_x] = 4 if sql =~ /ag\.genre_id/
66
+ h
67
+ end
68
+
69
+ EagerBand.dataset._fetch = proc do |sql|
70
+ case sql
71
+ when /id IN (101)/
72
+ # nothing
73
+ when /id > 100/
74
+ [{:id => 101}, {:id => 102}]
75
+ else
76
+ h = {:id => 2}
77
+ h[:x_foreign_key_x] = 5 if sql =~ /bm\.member_id/
78
+ h
79
+ end
80
+ end
81
+
82
+ EagerTrack.dataset._fetch = {:id => 3, :album_id => 1}
83
+
84
+ EagerGenre.dataset._fetch = proc do |sql|
85
+ h = {:id => 4}
86
+ h[:x_foreign_key_x] = 1 if sql =~ /ag\.album_id/
87
+ h
88
+ end
89
+
90
+ EagerBandMember.dataset._fetch = proc do |sql|
91
+ h = {:id => 5}
92
+ h[:x_foreign_key_x] = 2 if sql =~ /bm\.band_id/
93
+ h
94
+ end
95
+
96
+ DB.reset
97
+ end
98
+ after do
99
+ [:EagerAlbum, :EagerBand, :EagerTrack, :EagerGenre, :EagerBandMember].each{|x| Object.send(:remove_const, x)}
100
+ end
101
+
102
+ it "should populate :key_hash and :id_map option correctly for custom eager loaders" do
103
+ khs = {}
104
+ pr = proc{|a, m| proc{|h| khs[a] = h[:key_hash][m]; h[:id_map].should == h[:key_hash][m]}}
105
+ EagerAlbum.many_to_one :sband, :clone=>:band, :eager_loader=>pr.call(:sband, :band_id)
106
+ EagerAlbum.one_to_many :stracks, :clone=>:tracks, :eager_loader=>pr.call(:stracks, :id)
107
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :eager_loader=>pr.call(:sgenres, :id)
108
+ EagerAlbum.eager(:sband, :stracks, :sgenres).all
109
+ khs.should == {:sband=>{2=>[EagerAlbum.load(:band_id=>2, :id=>1)]}, :stracks=>{1=>[EagerAlbum.load(:band_id=>2, :id=>1)]}, :sgenres=>{1=>[EagerAlbum.load(:band_id=>2, :id=>1)]}}
110
+ end
111
+
112
+ it "should populate :key_hash using the method symbol" do
113
+ khs = {}
114
+ pr = proc{|a, m| proc{|h| khs[a] = h[:key_hash][m]}}
115
+ EagerAlbum.many_to_one :sband, :clone=>:band, :eager_loader=>pr.call(:sband, :band_id), :key=>:band_id, :key_column=>:b_id
116
+ EagerAlbum.one_to_many :stracks, :clone=>:tracks, :eager_loader=>pr.call(:stracks, :id), :primary_key=>:id, :primary_key_column=>:i
117
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :eager_loader=>pr.call(:sgenres, :id), :left_primary_key=>:id, :left_primary_key_column=>:i
118
+ EagerAlbum.eager(:sband, :stracks, :sgenres).all
119
+ khs.should == {:sband=>{2=>[EagerAlbum.load(:band_id=>2, :id=>1)]}, :stracks=>{1=>[EagerAlbum.load(:band_id=>2, :id=>1)]}, :sgenres=>{1=>[EagerAlbum.load(:band_id=>2, :id=>1)]}}
120
+ end
121
+
122
+ it "should raise an error if called without a symbol or hash" do
123
+ proc{EagerAlbum.eager(Object.new)}.should raise_error(Sequel::Error)
124
+ end
125
+
126
+ it "should eagerly load a single many_to_one association" do
127
+ a = EagerAlbum.eager(:band).all
128
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM bands WHERE (bands.id IN (2))']
129
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
130
+ a.first.band.should == EagerBand.load(:id=>2)
131
+ DB.sqls.should == []
132
+ end
133
+
134
+ it "should eagerly load a single many_to_one association with the same name as the column" do
135
+ EagerAlbum.def_column_alias(:band_id_id, :band_id)
136
+ EagerAlbum.many_to_one :band_id, :key_column=>:band_id, :class=>EagerBand
137
+ a = EagerAlbum.eager(:band_id).all
138
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM bands WHERE (bands.id IN (2))']
139
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
140
+ a.first.band_id.should == EagerBand.load(:id=>2)
141
+ DB.sqls.should == []
142
+ end
143
+
144
+ it "should eagerly load a single one_to_one association" do
145
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id
146
+ a = EagerAlbum.eager(:track).all
147
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
148
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))']
149
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
150
+ DB.sqls.should == []
151
+ end
152
+
153
+ it "should not break if the dataset does not have a row proc" do
154
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id
155
+ a = EagerAlbum.eager(:track).naked.all
156
+ a.should == [{:id => 1, :band_id => 2}]
157
+ DB.sqls.should == ['SELECT * FROM albums']
158
+ end
159
+
160
+ it "should eagerly load a single one_to_one association without an order" do
161
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id
162
+ EagerTrack.dataset._fetch = [{:id => 3, :album_id=>1}, {:id => 4, :album_id=>1}]
163
+ a = EagerAlbum.eager(:track).all
164
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
165
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))']
166
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
167
+ DB.sqls.should == []
168
+ end
169
+
170
+ it "should eagerly load a single one_to_one association with an order" do
171
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :order=>:a
172
+ a = EagerAlbum.eager(:track).all
173
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
174
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) ORDER BY a LIMIT 1) AS t1']
175
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
176
+ DB.sqls.should == []
177
+ end
178
+
179
+ it "should eagerly load a single one_to_one association using the :distinct_on strategy" do
180
+ def (EagerTrack.dataset).supports_distinct_on?() true end
181
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :order=>:a, :eager_limit_strategy=>:distinct_on
182
+ a = EagerAlbum.eager(:track).all
183
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
184
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT DISTINCT ON (tracks.album_id) * FROM tracks WHERE (tracks.album_id IN (1)) ORDER BY tracks.album_id, a']
185
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
186
+ DB.sqls.should == []
187
+ end
188
+
189
+ it "should eagerly load a single one_to_one association using the :window_function strategy" do
190
+ def (EagerTrack.dataset).supports_window_functions?() true end
191
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :eager_limit_strategy=>:window_function
192
+ a = EagerAlbum.eager(:track).all
193
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
194
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY tracks.album_id ORDER BY name) AS x_sequel_row_number_x FROM tracks WHERE (tracks.album_id IN (1))) AS t1 WHERE (x_sequel_row_number_x = 1)']
195
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
196
+ DB.sqls.should == []
197
+ end
198
+
199
+ it "should automatically use an eager limit stategy if the association has an offset" do
200
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :limit=>[1,1]
201
+ EagerTrack.dataset._fetch = [{:id => 4, :album_id=>1}]
202
+ a = EagerAlbum.eager(:track).all
203
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
204
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1']
205
+ a.first.track.should == EagerTrack.load(:id => 4, :album_id=>1)
206
+ DB.sqls.should == []
207
+ end
208
+
209
+ it "should handle offsets when using the :ruby eager limit stategy" do
210
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :limit=>[1,1], :eager_limit_strategy=>:ruby
211
+ EagerTrack.dataset._fetch = [{:id => 3, :album_id=>1}, {:id => 4, :album_id=>1}]
212
+ a = EagerAlbum.eager(:track).all
213
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
214
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))']
215
+ a.first.track.should == EagerTrack.load(:id => 4, :album_id=>1)
216
+ DB.sqls.should == []
217
+ end
218
+
219
+ it "should support a :subqueries_per_union option for the number of subqueries in a union" do
220
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :limit=>[1,1], :subqueries_per_union=>1
221
+ EagerAlbum.dataset._fetch = [{:id => 1, :band_id => 2}, {:id => 2, :band_id => 3}, {:id => 3, :band_id => 4}]
222
+ EagerTrack.dataset._fetch = [[{:id => 4, :album_id=>1}], [{:id=>5, :album_id=>2}], [{:id=>6, :album_id=>3}]]
223
+ a = EagerAlbum.eager(:track).all
224
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2), EagerAlbum.load(:id => 2, :band_id => 3), EagerAlbum.load(:id => 3, :band_id => 4)]
225
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1', 'SELECT * FROM (SELECT * FROM tracks WHERE (2 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1', 'SELECT * FROM (SELECT * FROM tracks WHERE (3 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1']
226
+ a.first.track.should == EagerTrack.load(:id => 4, :album_id=>1)
227
+ DB.sqls.should == []
228
+
229
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :limit=>[1,1], :subqueries_per_union=>2
230
+ EagerTrack.dataset._fetch = [[{:id => 4, :album_id=>1}, {:id=>5, :album_id=>2}], [{:id=>6, :album_id=>3}]]
231
+ a = EagerAlbum.eager(:track).all
232
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2), EagerAlbum.load(:id => 2, :band_id => 3), EagerAlbum.load(:id => 3, :band_id => 4)]
233
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1 UNION ALL SELECT * FROM (SELECT * FROM tracks WHERE (2 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1', 'SELECT * FROM (SELECT * FROM tracks WHERE (3 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1']
234
+ a.first.track.should == EagerTrack.load(:id => 4, :album_id=>1)
235
+ DB.sqls.should == []
236
+
237
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :limit=>[1,1], :subqueries_per_union=>3
238
+ EagerTrack.dataset._fetch = [[{:id => 4, :album_id=>1}, {:id=>5, :album_id=>2}, {:id=>6, :album_id=>3}]]
239
+ a = EagerAlbum.eager(:track).all
240
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2), EagerAlbum.load(:id => 2, :band_id => 3), EagerAlbum.load(:id => 3, :band_id => 4)]
241
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1 UNION ALL SELECT * FROM (SELECT * FROM tracks WHERE (2 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1 UNION ALL SELECT * FROM (SELECT * FROM tracks WHERE (3 = tracks.album_id) LIMIT 1 OFFSET 1) AS t1']
242
+ a.first.track.should == EagerTrack.load(:id => 4, :album_id=>1)
243
+ DB.sqls.should == []
244
+ end
245
+
246
+ it "should eagerly load a single one_to_many association" do
247
+ a = EagerAlbum.eager(:tracks).all
248
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
249
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))']
250
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
251
+ DB.sqls.should == []
252
+ end
253
+
254
+ it "should eagerly load a single one_through_one association" do
255
+ a = EagerAlbum.eager(:genre).all
256
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
257
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
258
+ a.first.genre.should == EagerGenre.load(:id=>4)
259
+ DB.sqls.should == []
260
+ end
261
+
262
+ it "should use first matching entry when eager loading one_through_one association" do
263
+ EagerGenre.dataset._fetch = [{:id => 3, :x_foreign_key_x=>1}, {:id => 4, :x_foreign_key_x=>1}]
264
+ a = EagerAlbum.eager(:genre).all
265
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
266
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
267
+ a.first.genre.should == EagerGenre.load(:id=>3)
268
+ DB.sqls.should == []
269
+ end
270
+
271
+ it "should eagerly load a single one_through_one association" do
272
+ EagerAlbum.one_through_one :genre, :clone=>:genre, :order=>:a
273
+ a = EagerAlbum.eager(:genre).all
274
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
275
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (1 = ag.album_id) ORDER BY a LIMIT 1) AS t1"]
276
+ a.first.genre.should == EagerGenre.load(:id=>4)
277
+ DB.sqls.should == []
278
+ end
279
+
280
+ it "should eagerly load a single one_through_one association using the :distinct_on strategy" do
281
+ def (EagerGenre.dataset).supports_distinct_on?() true end
282
+ EagerAlbum.one_through_one :genre, :clone=>:genre, :order=>:a, :eager_limit_strategy=>:distinct_on
283
+ a = EagerAlbum.eager(:genre).all
284
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
285
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT DISTINCT ON (ag.album_id) genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1)) ORDER BY ag.album_id, a"]
286
+ a.first.genre.should == EagerGenre.load(:id=>4)
287
+ DB.sqls.should == []
288
+ end
289
+
290
+ it "should eagerly load a single one_through_one association using the :window_function strategy" do
291
+ def (EagerGenre.dataset).supports_window_functions?() true end
292
+ EagerAlbum.one_through_one :genre, :clone=>:genre, :eager_limit_strategy=>:window_function
293
+ a = EagerAlbum.eager(:genre).all
294
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
295
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x, row_number() OVER (PARTITION BY ag.album_id) AS x_sequel_row_number_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))) AS t1 WHERE (x_sequel_row_number_x = 1)"]
296
+ a.first.genre.should == EagerGenre.load(:id=>4)
297
+ DB.sqls.should == []
298
+ end
299
+
300
+ it "should automatically use an eager limit stategy if the association has an offset" do
301
+ EagerGenre.dataset._fetch = [{:id => 3, :x_foreign_key_x=>1}, {:id => 4, :x_foreign_key_x=>1}]
302
+ a = EagerAlbum.eager(:genre).all
303
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
304
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
305
+ a.first.genre.should == EagerGenre.load(:id=>3)
306
+ DB.sqls.should == []
307
+ end
308
+
309
+ it "should eagerly load a single many_to_many association" do
310
+ a = EagerAlbum.eager(:genres).all
311
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
312
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
313
+ a.first.genres.should == [EagerGenre.load(:id=>4)]
314
+ DB.sqls.should == []
315
+ end
316
+
317
+ it "should support using a custom :key option when eager loading many_to_one associations" do
318
+ EagerAlbum.many_to_one :sband, :clone=>:band, :key=>:band_id3
319
+ EagerBand.dataset._fetch = {:id=>6}
320
+ a = EagerAlbum.eager(:sband).all
321
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM bands WHERE (bands.id IN (6))']
322
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
323
+ a.first.sband.should == EagerBand.load(:id=>6)
324
+ DB.sqls.should == []
325
+ end
326
+
327
+ it "should support using a custom :primary_key option when eager loading one_to_many associations" do
328
+ EagerBand.one_to_many :salbums, :clone=>:albums, :primary_key=>:id3, :eager=>nil, :reciprocal=>nil
329
+ EagerBand.dataset._fetch = {:id=>6}
330
+ a = EagerBand.eager(:salbums).all
331
+ DB.sqls.should == ['SELECT * FROM bands', 'SELECT * FROM albums WHERE (albums.band_id IN (2))']
332
+ a.should == [EagerBand.load(:id => 6)]
333
+ a.first.salbums.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
334
+ DB.sqls.should == []
335
+ end
336
+
337
+ it "should support using a custom :left_primary_key option when eager loading many_to_many associations" do
338
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :left_primary_key=>:band_id3
339
+ EagerGenre.dataset._fetch = {:id=>4, :x_foreign_key_x=>6}
340
+ a = EagerAlbum.eager(:sgenres).all
341
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
342
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (6))"]
343
+ a.first.sgenres.should == [EagerGenre.load(:id=>4)]
344
+ DB.sqls.should == []
345
+ end
346
+
347
+ it "should support using a custom :left_primary_key option when eager loading one_through_one associations" do
348
+ EagerAlbum.one_through_one :sgenre, :clone=>:genre, :left_primary_key=>:band_id3
349
+ EagerGenre.dataset._fetch = {:id=>4, :x_foreign_key_x=>6}
350
+ a = EagerAlbum.eager(:sgenre).all
351
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
352
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (6))"]
353
+ a.first.sgenre.should == EagerGenre.load(:id=>4)
354
+ DB.sqls.should == []
355
+ end
356
+
357
+ it "should handle a :eager_loading_predicate_key option to change the SQL used in the lookup, for many_to_one associations" do
358
+ EagerAlbum.many_to_one :sband, :clone=>:band, :eager_loading_predicate_key=>Sequel./(:bands__id, 3), :primary_key_method=>:id3
359
+ EagerBand.dataset._fetch = {:id=>6}
360
+ a = EagerAlbum.eager(:sband).all
361
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM bands WHERE ((bands.id / 3) IN (2))']
362
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
363
+ a.first.sband.should == EagerBand.load(:id=>6)
364
+ DB.sqls.should == []
365
+ end
366
+
367
+ it "should handle a :eager_loading_predicate_key option to change the SQL used in the lookup, for one_to_many associations" do
368
+ EagerBand.one_to_many :salbums, :clone=>:albums, :eager_loading_predicate_key=>Sequel.*(:albums__band_id, 3), :key_method=>:band_id3, :eager=>nil, :reciprocal=>nil
369
+ EagerBand.dataset._fetch = {:id=>6}
370
+ a = EagerBand.eager(:salbums).all
371
+ DB.sqls.should == ['SELECT * FROM bands', 'SELECT * FROM albums WHERE ((albums.band_id * 3) IN (6))']
372
+ a.should == [EagerBand.load(:id => 6)]
373
+ a.first.salbums.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
374
+ DB.sqls.should == []
375
+ end
376
+
377
+ it "should handle a :eager_loading_predicate_key option to change the SQL used in the lookup, for many_to_many associations" do
378
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :eager_loading_predicate_key=>Sequel.*(:ag__album_id, 1)
379
+ a = EagerAlbum.eager(:sgenres).all
380
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
381
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, (ag.album_id * 1) AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE ((ag.album_id * 1) IN (1))"]
382
+ a.first.sgenres.should == [EagerGenre.load(:id=>4)]
383
+ DB.sqls.should == []
384
+ end
385
+
386
+ it "should handle a :eager_loading_predicate_key option to change the SQL used in the lookup, for one_through_one associations" do
387
+ EagerAlbum.one_through_one :sgenre, :clone=>:genre, :eager_loading_predicate_key=>Sequel.*(:ag__album_id, 1)
388
+ a = EagerAlbum.eager(:sgenre).all
389
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
390
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, (ag.album_id * 1) AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE ((ag.album_id * 1) IN (1))"]
391
+ a.first.sgenre.should == EagerGenre.load(:id=>4)
392
+ DB.sqls.should == []
393
+ end
394
+
395
+ it "should raise an error for an unhandled :eager_loader_key option" do
396
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :eager_loader_key=>1
397
+ ds = EagerAlbum.eager(:sgenres)
398
+ proc{ds.all}.should raise_error(Sequel::Error)
399
+ end
400
+
401
+ it "should not add entry to key_hash for :eager_loader_key=>nil option" do
402
+ eo = nil
403
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :eager_loader_key=>nil, :eager_loader=>proc{|o| eo = o}
404
+ ds = EagerAlbum.eager(:sgenres)
405
+ ds.all
406
+ eo[:key_hash].should == {}
407
+ eo[:id_map].should == nil
408
+ end
409
+
410
+ it "should correctly handle a :select=>[] option to many_to_many" do
411
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :select=>[]
412
+ EagerAlbum.eager(:sgenres).all
413
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT *, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
414
+ end
415
+
416
+ it "should correctly handle a :select=>[] option to one_through_one" do
417
+ EagerAlbum.one_through_one :sgenre, :clone=>:genre, :select=>[]
418
+ EagerAlbum.eager(:sgenre).all
419
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT *, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
420
+ end
421
+
422
+ it "should correctly handle an aliased join table in many_to_many" do
423
+ EagerAlbum.many_to_many :sgenres, :clone=>:genres, :join_table=>:ag___ga
424
+ EagerAlbum.eager(:sgenres).all
425
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ga.album_id AS x_foreign_key_x FROM genres INNER JOIN ag AS ga ON (ga.genre_id = genres.id) WHERE (ga.album_id IN (1))"]
426
+ end
427
+
428
+ it "should correctly handle an aliased join table in one_through_one" do
429
+ EagerAlbum.one_through_one :sgenre, :clone=>:genre, :join_table=>:ag___ga
430
+ EagerAlbum.eager(:sgenre).all
431
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ga.album_id AS x_foreign_key_x FROM genres INNER JOIN ag AS ga ON (ga.genre_id = genres.id) WHERE (ga.album_id IN (1))"]
432
+ end
433
+
434
+ it "should eagerly load multiple associations in a single call" do
435
+ a = EagerAlbum.eager(:genres, :tracks, :band).all
436
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
437
+ sqls = DB.sqls
438
+ sqls.shift.should == 'SELECT * FROM albums'
439
+ sqls.sort.should == ['SELECT * FROM bands WHERE (bands.id IN (2))',
440
+ 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))',
441
+ 'SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))']
442
+ a = a.first
443
+ a.band.should == EagerBand.load(:id=>2)
444
+ a.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
445
+ a.genres.should == [EagerGenre.load(:id => 4)]
446
+ DB.sqls.should == []
447
+ end
448
+
449
+ it "should eagerly load multiple associations in separate calls" do
450
+ a = EagerAlbum.eager(:genres).eager(:tracks).eager(:band).all
451
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
452
+ sqls = DB.sqls
453
+ sqls.shift.should == 'SELECT * FROM albums'
454
+ sqls.sort.should == ['SELECT * FROM bands WHERE (bands.id IN (2))',
455
+ 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))',
456
+ 'SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))']
457
+ a = a.first
458
+ a.band.should == EagerBand.load(:id=>2)
459
+ a.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
460
+ a.genres.should == [EagerGenre.load(:id => 4)]
461
+ DB.sqls.should == []
462
+ end
463
+
464
+ it "should allow cascading of eager loading for associations of associated models" do
465
+ a = EagerTrack.eager(:album=>{:band=>:members}).all
466
+ a.should == [EagerTrack.load(:id => 3, :album_id => 1)]
467
+ DB.sqls.should == ['SELECT * FROM tracks',
468
+ 'SELECT * FROM albums WHERE (albums.id IN (1))',
469
+ 'SELECT * FROM bands WHERE (bands.id IN (2))',
470
+ "SELECT members.*, bm.band_id AS x_foreign_key_x FROM members INNER JOIN bm ON (bm.member_id = members.id) WHERE (bm.band_id IN (2))"]
471
+ a = a.first
472
+ a.album.should == EagerAlbum.load(:id => 1, :band_id => 2)
473
+ a.album.band.should == EagerBand.load(:id => 2)
474
+ a.album.band.members.should == [EagerBandMember.load(:id => 5)]
475
+ DB.sqls.should == []
476
+ end
477
+
478
+ it "should cascade eager loading when using a UNION strategy for eager loading limited associations" do
479
+ EagerTrack.many_to_one :album2, :clone=>:album
480
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :order=>:a
481
+ a = EagerAlbum.eager(:track=>:album2).all
482
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
483
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) ORDER BY a LIMIT 1) AS t1', 'SELECT * FROM albums WHERE (albums.id IN (1))']
484
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
485
+ a.first.track.album2.should == EagerAlbum.load(:id => 1, :band_id => 2)
486
+ DB.sqls.should == []
487
+
488
+ a = EagerAlbum.eager(:track=>[:album2]).all
489
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
490
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) ORDER BY a LIMIT 1) AS t1', 'SELECT * FROM albums WHERE (albums.id IN (1))']
491
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
492
+ a.first.track.album2.should == EagerAlbum.load(:id => 1, :band_id => 2)
493
+ DB.sqls.should == []
494
+
495
+ a = EagerAlbum.eager(:track=>{:album2=>:track}).all
496
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
497
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) ORDER BY a LIMIT 1) AS t1', 'SELECT * FROM albums WHERE (albums.id IN (1))', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) ORDER BY a LIMIT 1) AS t1']
498
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
499
+ a.first.track.album2.should == EagerAlbum.load(:id => 1, :band_id => 2)
500
+ a.first.track.album2.track.should == EagerTrack.load(:id => 3, :album_id=>1)
501
+ DB.sqls.should == []
502
+ end
503
+
504
+ it "should call post_load when eager loading limited associations" do
505
+ EagerTrack.many_to_one :album2, :clone=>:album
506
+ a = []
507
+ m = Module.new do
508
+ define_method(:post_load) do |objs|
509
+ a << 1
510
+ super(objs)
511
+ end
512
+ end
513
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id, :order=>:a, :extend=>m
514
+ EagerAlbum.eager(:track).all
515
+ a.should == [1]
516
+ end
517
+
518
+ it "should cascade eagerly loading when the :eager association option is used" do
519
+ a = EagerBand.eager(:albums).all
520
+ a.should == [EagerBand.load(:id=>2)]
521
+ DB.sqls.should == ['SELECT * FROM bands',
522
+ 'SELECT * FROM albums WHERE (albums.band_id IN (2))',
523
+ 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))']
524
+ a.first.albums.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
525
+ a.first.albums.first.tracks.should == [EagerTrack.load(:id => 3, :album_id => 1)]
526
+ DB.sqls.should == []
527
+ end
528
+
529
+ it "should respect :eager when lazily loading an association" do
530
+ a = EagerBand.all
531
+ a.should == [EagerBand.load(:id=>2)]
532
+ DB.sqls.should == ['SELECT * FROM bands']
533
+ a = a.first.albums
534
+ DB.sqls.should == ['SELECT * FROM albums WHERE (albums.band_id = 2)',
535
+ 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))']
536
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
537
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id => 1)]
538
+ DB.sqls.should == []
539
+ end
540
+
541
+ it "should cascade eagerly loading when the :eager_graph association option is used" do
542
+ EagerAlbum.dataset._fetch = {:id=>1, :band_id=>2, :tracks_id=>3, :album_id=>1}
543
+ a = EagerBand.eager(:graph_albums).all
544
+ a.should == [EagerBand.load(:id=>2)]
545
+ DB.sqls.should == ['SELECT * FROM bands',
546
+ 'SELECT albums.id, albums.band_id, tracks.id AS tracks_id, tracks.album_id FROM albums LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id) WHERE (albums.band_id IN (2))']
547
+ a.first.graph_albums.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
548
+ a.first.graph_albums.first.tracks.should == [EagerTrack.load(:id => 3, :album_id => 1)]
549
+ DB.sqls.should == []
550
+ end
551
+
552
+ it "should raise an Error when eager loading a many_to_many association with the :eager_graph option" do
553
+ proc{EagerBand.eager(:graph_members).all}.should raise_error(Sequel::Error)
554
+ end
555
+
556
+ it "should respect :eager_graph when lazily loading an association" do
557
+ a = EagerBand.all
558
+ a.should == [EagerBand.load(:id=>2)]
559
+ DB.sqls.should == ['SELECT * FROM bands']
560
+ a = a.first
561
+ EagerAlbum.dataset._fetch = {:id=>1, :band_id=>2, :tracks_id=>3, :album_id=>1}
562
+ a.graph_albums
563
+ DB.sqls.should == ['SELECT albums.id, albums.band_id, tracks.id AS tracks_id, tracks.album_id FROM albums LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id) WHERE (albums.band_id = 2)']
564
+ a.graph_albums.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
565
+ a.graph_albums.first.tracks.should == [EagerTrack.load(:id => 3, :album_id => 1)]
566
+ DB.sqls.should == []
567
+ end
568
+
569
+ it "should respect :eager_graph when lazily loading a many_to_many association" do
570
+ ds = EagerBandMember.dataset
571
+ def ds.columns() [:id] end
572
+ ds._fetch = [{:id=>5, :bands_id=>2, :p_k=>6}, {:id=>5, :bands_id=>3, :p_k=>6}]
573
+ a = EagerBand.load(:id=>2)
574
+ a.graph_members.should == [EagerBandMember.load(:id=>5)]
575
+ DB.sqls.should == ['SELECT members.id, bands.id AS bands_id, bands.p_k FROM (SELECT members.* FROM members INNER JOIN bm ON (bm.member_id = members.id) WHERE (bm.band_id = 2)) AS members LEFT OUTER JOIN bm AS bm_0 ON (bm_0.member_id = members.id) LEFT OUTER JOIN bands ON (bands.id = bm_0.band_id) ORDER BY bands.id']
576
+ a.graph_members.first.bands.should == [EagerBand.load(:id=>2, :p_k=>6), EagerBand.load(:id=>3, :p_k=>6)]
577
+ DB.sqls.should == []
578
+ end
579
+
580
+ it "should respect :conditions when eagerly loading" do
581
+ EagerBandMember.many_to_many :good_bands, :clone=>:bands, :conditions=>{:a=>32}
582
+ a = EagerBandMember.eager(:good_bands).all
583
+ a.should == [EagerBandMember.load(:id => 5)]
584
+ DB.sqls.should == ['SELECT * FROM members', 'SELECT bands.*, bm.member_id AS x_foreign_key_x FROM bands INNER JOIN bm ON (bm.band_id = bands.id) WHERE ((a = 32) AND (bm.member_id IN (5))) ORDER BY id']
585
+ a.first.good_bands.should == [EagerBand.load(:id => 2)]
586
+ DB.sqls.should == []
587
+
588
+ EagerBandMember.many_to_many :good_bands, :clone=>:bands, :conditions=>"x = 1"
589
+ a = EagerBandMember.eager(:good_bands).all
590
+ DB.sqls.should == ['SELECT * FROM members', 'SELECT bands.*, bm.member_id AS x_foreign_key_x FROM bands INNER JOIN bm ON (bm.band_id = bands.id) WHERE ((x = 1) AND (bm.member_id IN (5))) ORDER BY id']
591
+ end
592
+
593
+ it "should respect :order when eagerly loading" do
594
+ a = EagerBandMember.eager(:bands).all
595
+ a.should == [EagerBandMember.load(:id => 5)]
596
+ DB.sqls.should == ['SELECT * FROM members', 'SELECT bands.*, bm.member_id AS x_foreign_key_x FROM bands INNER JOIN bm ON (bm.band_id = bands.id) WHERE (bm.member_id IN (5)) ORDER BY id']
597
+ a.first.bands.should == [EagerBand.load(:id => 2)]
598
+ DB.sqls.should == []
599
+ end
600
+
601
+ it "should populate the reciprocal many_to_one association when eagerly loading the one_to_many association" do
602
+ a = EagerAlbum.eager(:tracks).all
603
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
604
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM tracks WHERE (tracks.album_id IN (1))']
605
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
606
+ a.first.tracks.first.album.should == a.first
607
+ DB.sqls.should == []
608
+ end
609
+
610
+ it "should cache the negative lookup when eagerly loading a many_to_one association" do
611
+ a = EagerAlbum.eager(:band).filter(:id=>101).all
612
+ a.should == [EagerAlbum.load(:id => 101, :band_id => 101)]
613
+ DB.sqls.should == ['SELECT * FROM albums WHERE (id = 101)', 'SELECT * FROM bands WHERE (bands.id IN (101))']
614
+ a.first.associations.fetch(:band, 2).should be_nil
615
+ a.first.band.should be_nil
616
+ DB.sqls.should == []
617
+ end
618
+
619
+ it "should cache the negative lookup when eagerly loading a *_to_many associations" do
620
+ a = EagerBand.eager(:albums).filter('id > 100').all
621
+ a.should == [EagerBand.load(:id => 101), EagerBand.load(:id =>102)]
622
+ sqls = DB.sqls
623
+ ['SELECT * FROM albums WHERE (albums.band_id IN (101, 102))', 'SELECT * FROM albums WHERE (albums.band_id IN (102, 101))'].should include(sqls.delete_at(1))
624
+ sqls.should == ['SELECT * FROM bands WHERE (id > 100)', "SELECT * FROM tracks WHERE (tracks.album_id IN (101))"]
625
+ a.map{|b| b.associations[:albums]}.should == [[EagerAlbum.load({:band_id=>101, :id=>101})], []]
626
+ DB.sqls.should == []
627
+ end
628
+
629
+ it "should use the association's block when eager loading by default" do
630
+ EagerAlbum.eager(:good_tracks).all
631
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM tracks WHERE ((name = 'Good') AND (tracks.album_id IN (1)))"]
632
+ end
633
+
634
+ it "should use the eager_block option when eager loading if given" do
635
+ EagerBand.eager(:good_albums).all
636
+ DB.sqls.should == ['SELECT * FROM bands', "SELECT * FROM albums WHERE ((name = 'good') AND (albums.band_id IN (2)))"]
637
+ EagerBand.eager(:good_albums=>:good_tracks).all
638
+ DB.sqls.should == ['SELECT * FROM bands', "SELECT * FROM albums WHERE ((name = 'good') AND (albums.band_id IN (2)))", "SELECT * FROM tracks WHERE ((name = 'Good') AND (tracks.album_id IN (1)))"]
639
+ end
640
+
641
+ it "should raise an error when attempting to eagerly load an association with the :allow_eager option set to false" do
642
+ proc{EagerBand.eager(:self_titled_albums).all}.should raise_error(Sequel::Error)
643
+ proc{EagerBand.eager(:albums_by_name).all}.should raise_error(Sequel::Error)
644
+ end
645
+
646
+ it "should respect the association's :select option" do
647
+ EagerAlbum.eager(:band_name).all
648
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT id, name FROM bands WHERE (bands.id IN (2))"]
649
+ EagerAlbum.eager(:track_names).all
650
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT id, name FROM tracks WHERE (tracks.album_id IN (1))"]
651
+ EagerAlbum.eager(:genre_names).all
652
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT id, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
653
+ end
654
+
655
+ it "should respect many_to_one association's :qualify option" do
656
+ EagerAlbum.many_to_one :special_band, :class=>:EagerBand, :qualify=>false, :key=>:band_id
657
+ EagerBand.dataset._fetch = {:id=>2}
658
+ as = EagerAlbum.eager(:special_band).all
659
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM bands WHERE (id IN (2))"]
660
+ as.map{|a| a.special_band}.should == [EagerBand.load(:id=>2)]
661
+ DB.sqls.should == []
662
+ end
663
+
664
+ it "should respect the association's :primary_key option" do
665
+ EagerAlbum.many_to_one :special_band, :class=>:EagerBand, :primary_key=>:p_k, :key=>:band_id
666
+ EagerBand.dataset._fetch = {:p_k=>2, :id=>1}
667
+ as = EagerAlbum.eager(:special_band).all
668
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM bands WHERE (bands.p_k IN (2))"]
669
+ as.length.should == 1
670
+ as.first.special_band.should == EagerBand.load(:p_k=>2, :id=>1)
671
+
672
+ EagerAlbum.one_to_many :special_tracks, :class=>:EagerTrack, :primary_key=>:band_id, :key=>:album_id, :reciprocal=>nil
673
+ EagerTrack.dataset._fetch = {:album_id=>2, :id=>1}
674
+ as = EagerAlbum.eager(:special_tracks).all
675
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM tracks WHERE (tracks.album_id IN (2))"]
676
+ as.length.should == 1
677
+ as.first.special_tracks.should == [EagerTrack.load(:album_id=>2, :id=>1)]
678
+ end
679
+
680
+ it "should respect the many_to_one association's composite keys" do
681
+ EagerAlbum.many_to_one :special_band, :class=>:EagerBand, :primary_key=>[:id, :p_k], :key=>[:band_id, :id]
682
+ EagerBand.dataset._fetch = {:p_k=>1, :id=>2}
683
+ as = EagerAlbum.eager(:special_band).all
684
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM bands WHERE ((bands.id, bands.p_k) IN ((2, 1)))"]
685
+ as.length.should == 1
686
+ as.first.special_band.should == EagerBand.load(:p_k=>1, :id=>2)
687
+ end
688
+
689
+ it "should respect the one_to_many association's composite keys" do
690
+ EagerAlbum.one_to_many :special_tracks, :class=>:EagerTrack, :primary_key=>[:band_id, :id], :key=>[:id, :album_id]
691
+ EagerTrack.dataset._fetch = {:album_id=>1, :id=>2}
692
+ as = EagerAlbum.eager(:special_tracks).all
693
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM tracks WHERE ((tracks.id, tracks.album_id) IN ((2, 1)))"]
694
+ as.length.should == 1
695
+ as.first.special_tracks.should == [EagerTrack.load(:album_id=>1, :id=>2)]
696
+ end
697
+
698
+ it "should respect many_to_many association's composite keys" do
699
+ EagerAlbum.many_to_many :special_genres, :class=>:EagerGenre, :left_primary_key=>[:band_id, :id], :left_key=>[:l1, :l2], :right_primary_key=>[:xxx, :id], :right_key=>[:r1, :r2], :join_table=>:ag
700
+ EagerGenre.dataset._fetch = [{:x_foreign_key_0_x=>2, :x_foreign_key_1_x=>1, :id=>5}, {:x_foreign_key_0_x=>2, :x_foreign_key_1_x=>1, :id=>6}]
701
+ as = EagerAlbum.eager(:special_genres).all
702
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.l1 AS x_foreign_key_0_x, ag.l2 AS x_foreign_key_1_x FROM genres INNER JOIN ag ON ((ag.r1 = genres.xxx) AND (ag.r2 = genres.id)) WHERE ((ag.l1, ag.l2) IN ((2, 1)))"]
703
+ as.length.should == 1
704
+ as.first.special_genres.should == [EagerGenre.load(:id=>5), EagerGenre.load(:id=>6)]
705
+ end
706
+
707
+ it "should respect one_through_one association's composite keys" do
708
+ EagerAlbum.one_through_one :special_genre, :class=>:EagerGenre, :left_primary_key=>[:band_id, :id], :left_key=>[:l1, :l2], :right_primary_key=>[:xxx, :id], :right_key=>[:r1, :r2], :join_table=>:ag
709
+ EagerGenre.dataset._fetch = [{:x_foreign_key_0_x=>2, :x_foreign_key_1_x=>1, :id=>5}]
710
+ as = EagerAlbum.eager(:special_genre).all
711
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.l1 AS x_foreign_key_0_x, ag.l2 AS x_foreign_key_1_x FROM genres INNER JOIN ag ON ((ag.r1 = genres.xxx) AND (ag.r2 = genres.id)) WHERE ((ag.l1, ag.l2) IN ((2, 1)))"]
712
+ as.length.should == 1
713
+ as.first.special_genre.should == EagerGenre.load(:id=>5)
714
+ end
715
+
716
+ it "should respect many_to_many association's :left_primary_key and :right_primary_key options" do
717
+ EagerAlbum.many_to_many :special_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_primary_key=>:xxx, :right_key=>:genre_id, :join_table=>:ag
718
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}]
719
+ as = EagerAlbum.eager(:special_genres).all
720
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.xxx) WHERE (ag.album_id IN (2))"]
721
+ as.length.should == 1
722
+ as.first.special_genres.should == [EagerGenre.load(:id=>5), EagerGenre.load(:id=>6)]
723
+ end
724
+
725
+ it "should respect one_through_one association's :left_primary_key and :right_primary_key options" do
726
+ EagerAlbum.one_through_one :special_genre, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_primary_key=>:xxx, :right_key=>:genre_id, :join_table=>:ag
727
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}]
728
+ as = EagerAlbum.eager(:special_genre).all
729
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.xxx) WHERE (ag.album_id IN (2))"]
730
+ as.length.should == 1
731
+ as.first.special_genre.should == EagerGenre.load(:id=>5)
732
+ end
733
+
734
+ it "should respect the :limit option on a one_to_many association using the :ruby strategy" do
735
+ EagerAlbum.one_to_many :first_two_tracks, :class=>:EagerTrack, :key=>:album_id, :limit=>2, :eager_limit_strategy=>:ruby
736
+ EagerTrack.dataset._fetch = [{:album_id=>1, :id=>2}, {:album_id=>1, :id=>3}, {:album_id=>1, :id=>4}]
737
+ as = EagerAlbum.eager(:first_two_tracks).all
738
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM tracks WHERE (tracks.album_id IN (1))"]
739
+ as.length.should == 1
740
+ as.first.first_two_tracks.should == [EagerTrack.load(:album_id=>1, :id=>2), EagerTrack.load(:album_id=>1, :id=>3)]
741
+
742
+ DB.reset
743
+ EagerAlbum.one_to_many :first_two_tracks, :class=>:EagerTrack, :key=>:album_id, :limit=>[1,1], :eager_limit_strategy=>:ruby
744
+ as = EagerAlbum.eager(:first_two_tracks).all
745
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM tracks WHERE (tracks.album_id IN (1))"]
746
+ as.length.should == 1
747
+ as.first.first_two_tracks.should == [EagerTrack.load(:album_id=>1, :id=>3)]
748
+
749
+ DB.reset
750
+ EagerAlbum.one_to_many :first_two_tracks, :class=>:EagerTrack, :key=>:album_id, :limit=>[nil,1], :eager_limit_strategy=>:ruby
751
+ as = EagerAlbum.eager(:first_two_tracks).all
752
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM tracks WHERE (tracks.album_id IN (1))"]
753
+ as.length.should == 1
754
+ as.first.first_two_tracks.should == [EagerTrack.load(:album_id=>1, :id=>3), EagerTrack.load(:album_id=>1, :id=>4)]
755
+ end
756
+
757
+ it "should respect the :limit option on a one_to_many association" do
758
+ EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>2
759
+ a = EagerAlbum.eager(:tracks).all
760
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
761
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) ORDER BY name LIMIT 2) AS t1']
762
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
763
+ DB.sqls.should == []
764
+
765
+ EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>[2, 1]
766
+ a = EagerAlbum.eager(:tracks).all
767
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
768
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) ORDER BY name LIMIT 2 OFFSET 1) AS t1']
769
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
770
+ DB.sqls.should == []
771
+
772
+ EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>[nil, 1]
773
+ a = EagerAlbum.eager(:tracks).all
774
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
775
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE (1 = tracks.album_id) ORDER BY name OFFSET 1) AS t1']
776
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
777
+ DB.sqls.should == []
778
+ end
779
+
780
+ it "should respect the :limit option on a one_to_many association with an association block" do
781
+ EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>2 do |ds| ds.where(:a=>1) end
782
+ a = EagerAlbum.eager(:tracks).all
783
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
784
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE ((a = 1) AND (1 = tracks.album_id)) ORDER BY name LIMIT 2) AS t1']
785
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
786
+ DB.sqls.should == []
787
+ end
788
+
789
+ it "should respect the :limit option on a one_to_many association using the :window_function strategy" do
790
+ def (EagerTrack.dataset).supports_window_functions?() true end
791
+ EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>2, :eager_limit_strategy=>:window_function
792
+ a = EagerAlbum.eager(:tracks).all
793
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
794
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY tracks.album_id ORDER BY name) AS x_sequel_row_number_x FROM tracks WHERE (tracks.album_id IN (1))) AS t1 WHERE (x_sequel_row_number_x <= 2)']
795
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
796
+ DB.sqls.should == []
797
+
798
+ EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>[2, 1], :eager_limit_strategy=>:window_function
799
+ a = EagerAlbum.eager(:tracks).all
800
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
801
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY tracks.album_id ORDER BY name) AS x_sequel_row_number_x FROM tracks WHERE (tracks.album_id IN (1))) AS t1 WHERE ((x_sequel_row_number_x >= 2) AND (x_sequel_row_number_x < 4))']
802
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
803
+ DB.sqls.should == []
804
+
805
+ EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>[nil, 1], :eager_limit_strategy=>:window_function
806
+ a = EagerAlbum.eager(:tracks).all
807
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
808
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY tracks.album_id ORDER BY name) AS x_sequel_row_number_x FROM tracks WHERE (tracks.album_id IN (1))) AS t1 WHERE (x_sequel_row_number_x >= 2)']
809
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
810
+ DB.sqls.should == []
811
+ end
812
+
813
+ it "should use a ruby strategy for limit if :eager_graph option is used" do
814
+ EagerTrack.many_to_one :album2, :clone=>:album
815
+ EagerAlbum.one_to_many :first_two_tracks, :class=>:EagerTrack, :key=>:album_id, :limit=>2, :eager_graph=>:album2
816
+ EagerTrack.dataset._fetch = [{:album_id=>1, :id=>2, :album2_id=>1, :band_id=>5}, {:album_id=>1, :id=>3, :album2_id=>1, :band_id=>5}, {:album_id=>1, :id=>4, :album2_id=>1, :band_id=>5}]
817
+ as = EagerAlbum.eager(:first_two_tracks).all
818
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT tracks.id, tracks.album_id, album2.id AS album2_id, album2.band_id FROM tracks LEFT OUTER JOIN albums AS album2 ON (album2.id = tracks.album_id) WHERE (tracks.album_id IN (1))"]
819
+ as.length.should == 1
820
+ tracks = as.first.first_two_tracks
821
+ tracks.should == [EagerTrack.load(:album_id=>1, :id=>2), EagerTrack.load(:album_id=>1, :id=>3)]
822
+ tracks.first.album2.should == EagerAlbum.load(:id=>1, :band_id=>5)
823
+ tracks.last.album2.should == EagerAlbum.load(:id=>1, :band_id=>5)
824
+ end
825
+
826
+ it "should not use a union strategy for limit by default if providing a per-eager load callback" do
827
+ def (EagerTrack.dataset).supports_window_functions?() true end
828
+ EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>2
829
+ a = EagerAlbum.eager(:tracks=>proc{|ds| ds.where(:id=>3)}).all
830
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
831
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY tracks.album_id ORDER BY name) AS x_sequel_row_number_x FROM tracks WHERE ((tracks.album_id IN (1)) AND (id = 3))) AS t1 WHERE (x_sequel_row_number_x <= 2)']
832
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
833
+ DB.sqls.should == []
834
+ end
835
+
836
+ it "should respect the limit option on a many_to_many association using the :ruby strategy" do
837
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>2, :eager_limit_strategy=>:ruby
838
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}, {:x_foreign_key_x=>2, :id=>7}]
839
+ as = EagerAlbum.eager(:first_two_genres).all
840
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (2))"]
841
+ as.length.should == 1
842
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>5), EagerGenre.load(:id=>6)]
843
+
844
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}, {:x_foreign_key_x=>2, :id=>7}]
845
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>[1, 1], :eager_limit_strategy=>:ruby
846
+ as = EagerAlbum.eager(:first_two_genres).all
847
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (2))"]
848
+ as.length.should == 1
849
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>6)]
850
+
851
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}, {:x_foreign_key_x=>2, :id=>7}]
852
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>[nil, 1], :eager_limit_strategy=>:ruby
853
+ as = EagerAlbum.eager(:first_two_genres).all
854
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (2))"]
855
+ as.length.should == 1
856
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>6), EagerGenre.load(:id=>7)]
857
+ end
858
+
859
+ it "should respect the limit option on a many_to_many association" do
860
+ def (EagerGenre.dataset).supports_window_functions?() true end
861
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>2, :order=>:name
862
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}]
863
+ as = EagerAlbum.eager(:first_two_genres).all
864
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (2 = ag.album_id) ORDER BY name LIMIT 2) AS t1"]
865
+ as.length.should == 1
866
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>5), EagerGenre.load(:id=>6)]
867
+
868
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}]
869
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>[1, 1], :order=>:name
870
+ as = EagerAlbum.eager(:first_two_genres).all
871
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (2 = ag.album_id) ORDER BY name LIMIT 1 OFFSET 1) AS t1"]
872
+ as.length.should == 1
873
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>5)]
874
+
875
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}]
876
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>[nil, 1], :order=>:name
877
+ as = EagerAlbum.eager(:first_two_genres).all
878
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (2 = ag.album_id) ORDER BY name OFFSET 1) AS t1"]
879
+ as.length.should == 1
880
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>5), EagerGenre.load(:id=>6)]
881
+ end
882
+
883
+ it "should respect the limit option on a many_to_many association using the :window_function strategy" do
884
+ def (EagerGenre.dataset).supports_window_functions?() true end
885
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>2, :order=>:name, :eager_limit_strategy=>:window_function
886
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}]
887
+ as = EagerAlbum.eager(:first_two_genres).all
888
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x, row_number() OVER (PARTITION BY ag.album_id ORDER BY name) AS x_sequel_row_number_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (2))) AS t1 WHERE (x_sequel_row_number_x <= 2)"]
889
+ as.length.should == 1
890
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>5), EagerGenre.load(:id=>6)]
891
+
892
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}]
893
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>[1, 1], :order=>:name, :eager_limit_strategy=>:window_function
894
+ as = EagerAlbum.eager(:first_two_genres).all
895
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x, row_number() OVER (PARTITION BY ag.album_id ORDER BY name) AS x_sequel_row_number_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (2))) AS t1 WHERE ((x_sequel_row_number_x >= 2) AND (x_sequel_row_number_x < 3))"]
896
+ as.length.should == 1
897
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>5)]
898
+
899
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>2, :id=>5}, {:x_foreign_key_x=>2, :id=>6}]
900
+ EagerAlbum.many_to_many :first_two_genres, :class=>:EagerGenre, :left_primary_key=>:band_id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>[nil, 1], :order=>:name, :eager_limit_strategy=>:window_function
901
+ as = EagerAlbum.eager(:first_two_genres).all
902
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT * FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x, row_number() OVER (PARTITION BY ag.album_id ORDER BY name) AS x_sequel_row_number_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (2))) AS t1 WHERE (x_sequel_row_number_x >= 2)"]
903
+ as.length.should == 1
904
+ as.first.first_two_genres.should == [EagerGenre.load(:id=>5), EagerGenre.load(:id=>6)]
905
+ end
906
+
907
+ it "should use the :eager_loader association option when eager loading" do
908
+ EagerAlbum.many_to_one :special_band, :key=>:band_id, :eager_loader=>(proc do |eo|
909
+ item = EagerBand.filter(:album_id=>eo[:rows].collect{|r| [r.pk, r.pk*2]}.flatten).order(:name).first
910
+ eo[:rows].each{|r| r.associations[:special_band] = item}
911
+ end)
912
+ EagerAlbum.one_to_many :special_tracks, :eager_loader=>(proc do |eo|
913
+ items = EagerTrack.filter(:album_id=>eo[:rows].collect{|r| [r.pk, r.pk*2]}.flatten).all
914
+ eo[:rows].each{|r| r.associations[:special_tracks] = items}
915
+ end)
916
+ EagerAlbum.many_to_many :special_genres, :class=>:EagerGenre, :eager_loader=>(proc do |eo|
917
+ items = EagerGenre.inner_join(:ag, [:genre_id]).filter(:album_id=>eo[:rows].collect{|r| r.pk}).all
918
+ eo[:rows].each{|r| r.associations[:special_genres] = items}
919
+ end)
920
+ a = EagerAlbum.eager(:special_genres, :special_tracks, :special_band).all
921
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
922
+ sqls = DB.sqls
923
+ sqls.shift.should == 'SELECT * FROM albums'
924
+ sqls.sort.should == ['SELECT * FROM bands WHERE (album_id IN (1, 2)) ORDER BY name LIMIT 1',
925
+ 'SELECT * FROM genres INNER JOIN ag USING (genre_id) WHERE (album_id IN (1))',
926
+ 'SELECT * FROM tracks WHERE (album_id IN (1, 2))']
927
+ a = a.first
928
+ a.special_band.should == EagerBand.load(:id => 2)
929
+ a.special_tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
930
+ a.special_genres.should == [EagerGenre.load(:id => 4)]
931
+ DB.sqls.should == []
932
+ end
933
+
934
+ it "should respect :after_load callbacks on associations when eager loading" do
935
+ EagerAlbum.many_to_one :al_band, :class=>'EagerBand', :key=>:band_id, :after_load=>proc{|o, a| a.id *=2}
936
+ EagerAlbum.one_to_many :al_tracks, :class=>'EagerTrack', :key=>:album_id, :after_load=>proc{|o, os| os.each{|a| a.id *=2}}
937
+ EagerAlbum.many_to_many :al_genres, :class=>'EagerGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :after_load=>proc{|o, os| os.each{|a| a.id *=2}}
938
+ a = EagerAlbum.eager(:al_band, :al_tracks, :al_genres).all.first
939
+ a.should == EagerAlbum.load(:id => 1, :band_id => 2)
940
+ a.al_band.should == EagerBand.load(:id=>4)
941
+ a.al_tracks.should == [EagerTrack.load(:id=>6, :album_id=>1)]
942
+ a.al_genres.should == [EagerGenre.load(:id=>8)]
943
+ end
944
+
945
+ it "should respect :uniq option when eagerly loading many_to_many associations" do
946
+ EagerAlbum.many_to_many :al_genres, :class=>'EagerGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :uniq=>true
947
+ EagerGenre.dataset._fetch = [{:x_foreign_key_x=>1, :id=>8}, {:x_foreign_key_x=>1, :id=>8}]
948
+ a = EagerAlbum.eager(:al_genres).all.first
949
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
950
+ a.should == EagerAlbum.load(:id => 1, :band_id => 2)
951
+ a.al_genres.should == [EagerGenre.load(:id=>8)]
952
+ end
953
+
954
+ it "should respect :distinct option when eagerly loading many_to_many associations" do
955
+ EagerAlbum.many_to_many :al_genres, :class=>'EagerGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :distinct=>true
956
+ a = EagerAlbum.eager(:al_genres).all.first
957
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT DISTINCT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
958
+ a.should == EagerAlbum.load(:id => 1, :band_id => 2)
959
+ a.al_genres.should == [EagerGenre.load(:id=>4)]
960
+ end
961
+
962
+ it "should eagerly load a many_to_one association with custom eager block" do
963
+ a = EagerAlbum.eager(:band => proc {|ds| ds.select(:id, :name)}).all
964
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
965
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT id, name FROM bands WHERE (bands.id IN (2))']
966
+ a.first.band.should == EagerBand.load(:id => 2)
967
+ DB.sqls.should == []
968
+ end
969
+
970
+ it "should eagerly load a one_to_one association with custom eager block" do
971
+ EagerAlbum.one_to_one :track, :class=>'EagerTrack', :key=>:album_id
972
+ a = EagerAlbum.eager(:track => proc {|ds| ds.select(:id)}).all
973
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
974
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT id FROM tracks WHERE (tracks.album_id IN (1))']
975
+ a.first.track.should == EagerTrack.load(:id => 3, :album_id=>1)
976
+ DB.sqls.should == []
977
+ end
978
+
979
+ it "should eagerly load a one_to_many association with custom eager block" do
980
+ a = EagerAlbum.eager(:tracks => proc {|ds| ds.select(:id)}).all
981
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
982
+ DB.sqls.should == ['SELECT * FROM albums', 'SELECT id FROM tracks WHERE (tracks.album_id IN (1))']
983
+ a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
984
+ DB.sqls.should == []
985
+ end
986
+
987
+ it "should eagerly load a many_to_many association with custom eager block" do
988
+ a = EagerAlbum.eager(:genres => proc {|ds| ds.select(:name)}).all
989
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
990
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT name, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
991
+ a.first.genres.should == [EagerGenre.load(:id => 4)]
992
+ DB.sqls.should == []
993
+ end
994
+
995
+ it "should eagerly load a one_through_one association with custom eager block" do
996
+ a = EagerAlbum.eager(:genre => proc {|ds| ds.select(:name)}).all
997
+ a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
998
+ DB.sqls.should == ['SELECT * FROM albums', "SELECT name, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
999
+ a.first.genre.should == EagerGenre.load(:id => 4)
1000
+ DB.sqls.should == []
1001
+ end
1002
+
1003
+ it "should allow cascading of eager loading within a custom eager block" do
1004
+ a = EagerTrack.eager(:album => proc {|ds| ds.eager(:band => :members)}).all
1005
+ a.should == [EagerTrack.load(:id => 3, :album_id => 1)]
1006
+ DB.sqls.should == ['SELECT * FROM tracks',
1007
+ 'SELECT * FROM albums WHERE (albums.id IN (1))',
1008
+ 'SELECT * FROM bands WHERE (bands.id IN (2))',
1009
+ "SELECT members.*, bm.band_id AS x_foreign_key_x FROM members INNER JOIN bm ON (bm.member_id = members.id) WHERE (bm.band_id IN (2))"]
1010
+ a = a.first
1011
+ a.album.should == EagerAlbum.load(:id => 1, :band_id => 2)
1012
+ a.album.band.should == EagerBand.load(:id => 2)
1013
+ a.album.band.members.should == [EagerBandMember.load(:id => 5)]
1014
+ DB.sqls.should == []
1015
+ end
1016
+
1017
+ it "should allow cascading of eager loading with custom callback with hash value" do
1018
+ a = EagerTrack.eager(:album=>{proc{|ds| ds.select(:id, :band_id)}=>{:band => :members}}).all
1019
+ a.should == [EagerTrack.load(:id => 3, :album_id => 1)]
1020
+ DB.sqls.should == ['SELECT * FROM tracks',
1021
+ 'SELECT id, band_id FROM albums WHERE (albums.id IN (1))',
1022
+ 'SELECT * FROM bands WHERE (bands.id IN (2))',
1023
+ "SELECT members.*, bm.band_id AS x_foreign_key_x FROM members INNER JOIN bm ON (bm.member_id = members.id) WHERE (bm.band_id IN (2))"]
1024
+ a = a.first
1025
+ a.album.should == EagerAlbum.load(:id => 1, :band_id => 2)
1026
+ a.album.band.should == EagerBand.load(:id => 2)
1027
+ a.album.band.members.should == [EagerBandMember.load(:id => 5)]
1028
+ DB.sqls.should == []
1029
+ end
1030
+
1031
+ it "should allow cascading of eager loading with custom callback with symbol value" do
1032
+ a = EagerTrack.eager(:album=>{proc{|ds| ds.select(:id, :band_id)}=>:band}).all
1033
+ a.should == [EagerTrack.load(:id => 3, :album_id => 1)]
1034
+ DB.sqls.should == ['SELECT * FROM tracks',
1035
+ 'SELECT id, band_id FROM albums WHERE (albums.id IN (1))',
1036
+ 'SELECT * FROM bands WHERE (bands.id IN (2))']
1037
+ a = a.first
1038
+ a.album.should == EagerAlbum.load(:id => 1, :band_id => 2)
1039
+ a.album.band.should == EagerBand.load(:id => 2)
1040
+ DB.sqls.should == []
1041
+ end
1042
+
1043
+ it "should allow cascading of eager loading with custom callback with array value" do
1044
+ a = EagerTrack.eager(:album=>{proc{|ds| ds.select(:id, :band_id)}=>[:band, :band_name]}).all
1045
+ a.should == [EagerTrack.load(:id => 3, :album_id => 1)]
1046
+ sqls = DB.sqls
1047
+ sqls.slice!(0..1).should == ['SELECT * FROM tracks',
1048
+ 'SELECT id, band_id FROM albums WHERE (albums.id IN (1))']
1049
+ sqls.sort.should == ['SELECT * FROM bands WHERE (bands.id IN (2))',
1050
+ 'SELECT id, name FROM bands WHERE (bands.id IN (2))']
1051
+ a = a.first
1052
+ a.album.should == EagerAlbum.load(:id => 1, :band_id => 2)
1053
+ a.album.band.should == EagerBand.load(:id => 2)
1054
+ a.album.band_name.should == EagerBand.load(:id => 2)
1055
+ DB.sqls.should == []
1056
+ end
1057
+
1058
+ it "should call both association and custom eager blocks" do
1059
+ EagerBand.eager(:good_albums => proc {|ds| ds.select(:name)}).all
1060
+ DB.sqls.should == ['SELECT * FROM bands', "SELECT name FROM albums WHERE ((name = 'good') AND (albums.band_id IN (2)))"]
1061
+ end
1062
+ end
1063
+
1064
+ describe Sequel::Model, "#eager_graph" do
1065
+ before(:all) do
1066
+ class ::GraphAlbum < Sequel::Model(:albums)
1067
+ dataset.opts[:from] = [:albums]
1068
+ columns :id, :band_id
1069
+ many_to_one :band, :class=>'GraphBand', :key=>:band_id
1070
+ one_to_many :tracks, :class=>'GraphTrack', :key=>:album_id
1071
+ one_to_one :track, :class=>'GraphTrack', :key=>:album_id
1072
+ many_to_many :genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag
1073
+ one_through_one :genre, :clone=>:genres
1074
+ many_to_one :previous_album, :class=>'GraphAlbum'
1075
+ end
1076
+
1077
+ class ::GraphBand < Sequel::Model(:bands)
1078
+ dataset.opts[:from] = [:bands]
1079
+ columns :id, :vocalist_id
1080
+ many_to_one :vocalist, :class=>'GraphBandMember', :key=>:vocalist_id
1081
+ one_to_many :albums, :class=>'GraphAlbum', :key=>:band_id
1082
+ many_to_many :members, :class=>'GraphBandMember', :left_key=>:band_id, :right_key=>:member_id, :join_table=>:bm
1083
+ many_to_many :genres, :class=>'GraphGenre', :left_key=>:band_id, :right_key=>:genre_id, :join_table=>:bg
1084
+ end
1085
+
1086
+ class ::GraphTrack < Sequel::Model(:tracks)
1087
+ dataset.opts[:from] = [:tracks]
1088
+ columns :id, :album_id
1089
+ many_to_one :album, :class=>'GraphAlbum', :key=>:album_id
1090
+ end
1091
+
1092
+ class ::GraphGenre < Sequel::Model(:genres)
1093
+ dataset.opts[:from] = [:genres]
1094
+ columns :id
1095
+ many_to_many :albums, :class=>'GraphAlbum', :left_key=>:genre_id, :right_key=>:album_id, :join_table=>:ag
1096
+ end
1097
+
1098
+ class ::GraphBandMember < Sequel::Model(:members)
1099
+ dataset.opts[:from] = [:members]
1100
+ columns :id
1101
+ many_to_many :bands, :class=>'GraphBand', :left_key=>:member_id, :right_key=>:band_id, :join_table=>:bm
1102
+ end
1103
+ end
1104
+ after(:all) do
1105
+ [:GraphAlbum, :GraphBand, :GraphTrack, :GraphGenre, :GraphBandMember].each{|x| Object.send(:remove_const, x)}
1106
+ end
1107
+
1108
+ it "should raise an error if called without a symbol or hash" do
1109
+ proc{GraphAlbum.eager_graph(Object.new)}.should raise_error(Sequel::Error)
1110
+ end
1111
+
1112
+ it "should work correctly with select_map" do
1113
+ ds = GraphAlbum.eager_graph(:band)
1114
+ ds._fetch = [{:id=>1}, {:id=>2}]
1115
+ ds.select_map(:albums__id).should == [1, 2]
1116
+ DB.sqls.should == ['SELECT albums.id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)']
1117
+ ds._fetch = [{:id=>1}, {:id=>2}]
1118
+ ds.select_map([:albums__id, :albums__id]).should == [[1, 1], [2, 2]]
1119
+ DB.sqls.should == ['SELECT albums.id, albums.id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)']
1120
+ end
1121
+
1122
+ it "should work correctly with single_value" do
1123
+ ds = GraphAlbum.eager_graph(:band).select(:albums__id)
1124
+ ds._fetch = [{:id=>1}]
1125
+ ds.single_value.should == 1
1126
+ DB.sqls.should == ['SELECT albums.id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) LIMIT 1']
1127
+ end
1128
+
1129
+ it "should not split results and assign associations if ungraphed is called" do
1130
+ ds = GraphAlbum.eager_graph(:band).ungraphed
1131
+ ds.sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)'
1132
+ ds._fetch = {:id=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>3}
1133
+ ds.all.should == [GraphAlbum.load(:id=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>3)]
1134
+ end
1135
+
1136
+ it "should not modify existing dataset" do
1137
+ ds1 = GraphAlbum.dataset
1138
+ ds2 = ds1.eager_graph(:band)
1139
+ proc{ds1.eager_graph(:band)}.should_not raise_error
1140
+ proc{ds2.eager_graph(:tracks)}.should_not raise_error
1141
+ proc{ds2.eager_graph(:tracks)}.should_not raise_error
1142
+ end
1143
+
1144
+ it "should allow manually selecting the alias base per call via an AliasedExpression" do
1145
+ ds = GraphAlbum.eager_graph(Sequel.as(:band, :b))
1146
+ ds.sql.should == 'SELECT albums.id, albums.band_id, b.id AS b_id, b.vocalist_id FROM albums LEFT OUTER JOIN bands AS b ON (b.id = albums.band_id)'
1147
+ ds._fetch = {:id=>1, :band_id=>2, :b_id=>2, :vocalist_id=>3}
1148
+ a = ds.all
1149
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1150
+ a.first.band.should == GraphBand.load(:id => 2, :vocalist_id=>3)
1151
+ end
1152
+
1153
+ it "should handle multiple associations using the same alias base" do
1154
+ ds = GraphAlbum.eager_graph(Sequel.as(:genres, :b), Sequel.as(:tracks, :b), Sequel.as(:band, :b))
1155
+ ds.sql.should == 'SELECT albums.id, albums.band_id, b.id AS b_id, b_0.id AS b_0_id, b_0.album_id, b_1.id AS b_1_id, b_1.vocalist_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS b ON (b.id = ag.genre_id) LEFT OUTER JOIN tracks AS b_0 ON (b_0.album_id = albums.id) LEFT OUTER JOIN bands AS b_1 ON (b_1.id = albums.band_id)'
1156
+ ds._fetch = {:id=>1, :band_id=>2, :b_id=>4, :b_0_id=>3, :album_id=>1, :b_1_id=>2, :vocalist_id=>6}
1157
+ a = ds.all
1158
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1159
+ a = a.first
1160
+ a.band.should == GraphBand.load(:id => 2, :vocalist_id=>6)
1161
+ a.tracks.should == [GraphTrack.load({:id => 3, :album_id=>1})]
1162
+ a.genres.should == [GraphGenre.load(:id => 4)]
1163
+
1164
+ ds = GraphTrack.eager_graph(Sequel.as(:album, :b)=>{Sequel.as(:band, :b)=>Sequel.as(:members, :b)})
1165
+ ds.sql.should == 'SELECT tracks.id, tracks.album_id, b.id AS b_id, b.band_id, b_0.id AS b_0_id, b_0.vocalist_id, b_1.id AS b_1_id FROM tracks LEFT OUTER JOIN albums AS b ON (b.id = tracks.album_id) LEFT OUTER JOIN bands AS b_0 ON (b_0.id = b.band_id) LEFT OUTER JOIN bm ON (bm.band_id = b_0.id) LEFT OUTER JOIN members AS b_1 ON (b_1.id = bm.member_id)'
1166
+ ds._fetch = {:id=>3, :album_id=>1, :b_id=>1, :band_id=>2, :b_1_id=>5, :b_0_id=>2, :vocalist_id=>6}
1167
+ a = ds.all
1168
+ a.should == [GraphTrack.load(:id => 3, :album_id => 1)]
1169
+ a = a.first
1170
+ a.album.should == GraphAlbum.load(:id => 1, :band_id => 2)
1171
+ a.album.band.should == GraphBand.load(:id => 2, :vocalist_id=>6)
1172
+ a.album.band.members.should == [GraphBandMember.load(:id => 5)]
1173
+ end
1174
+
1175
+ it "should set up correct inner joins when using association_join" do
1176
+ GraphAlbum.association_join(:band).sql.should == 'SELECT * FROM albums INNER JOIN bands AS band ON (band.id = albums.band_id)'
1177
+ GraphAlbum.association_join(:track).sql.should == 'SELECT * FROM albums INNER JOIN tracks AS track ON (track.album_id = albums.id)'
1178
+ GraphAlbum.association_join(:tracks).sql.should == 'SELECT * FROM albums INNER JOIN tracks ON (tracks.album_id = albums.id)'
1179
+ GraphAlbum.association_join(:genres).sql.should == 'SELECT * FROM albums INNER JOIN ag ON (ag.album_id = albums.id) INNER JOIN genres ON (genres.id = ag.genre_id)'
1180
+ GraphAlbum.association_join(:genre).sql.should == 'SELECT * FROM albums INNER JOIN ag ON (ag.album_id = albums.id) INNER JOIN genres AS genre ON (genre.id = ag.genre_id)'
1181
+ end
1182
+
1183
+ it "should handle custom selects when using association_join" do
1184
+ GraphAlbum.select{a(b)}.association_join(:band).sql.should == 'SELECT a(b) FROM albums INNER JOIN bands AS band ON (band.id = albums.band_id)'
1185
+ GraphAlbum.select{a(b)}.association_join(:track).sql.should == 'SELECT a(b) FROM albums INNER JOIN tracks AS track ON (track.album_id = albums.id)'
1186
+ GraphAlbum.select{a(b)}.association_join(:tracks).sql.should == 'SELECT a(b) FROM albums INNER JOIN tracks ON (tracks.album_id = albums.id)'
1187
+ GraphAlbum.select{a(b)}.association_join(:genres).sql.should == 'SELECT a(b) FROM albums INNER JOIN ag ON (ag.album_id = albums.id) INNER JOIN genres ON (genres.id = ag.genre_id)'
1188
+ GraphAlbum.select{a(b)}.association_join(:genre).sql.should == 'SELECT a(b) FROM albums INNER JOIN ag ON (ag.album_id = albums.id) INNER JOIN genres AS genre ON (genre.id = ag.genre_id)'
1189
+ end
1190
+
1191
+ it "should set up correct join types when using association_*_join" do
1192
+ GraphAlbum.association_inner_join(:band).sql.should == 'SELECT * FROM albums INNER JOIN bands AS band ON (band.id = albums.band_id)'
1193
+ GraphAlbum.association_left_join(:track).sql.should == 'SELECT * FROM albums LEFT JOIN tracks AS track ON (track.album_id = albums.id)'
1194
+ GraphAlbum.association_right_join(:tracks).sql.should == 'SELECT * FROM albums RIGHT JOIN tracks ON (tracks.album_id = albums.id)'
1195
+ GraphAlbum.association_full_join(:genres).sql.should == 'SELECT * FROM albums FULL JOIN ag ON (ag.album_id = albums.id) FULL JOIN genres ON (genres.id = ag.genre_id)'
1196
+ end
1197
+
1198
+ it "should eagerly load a single many_to_one association" do
1199
+ ds = GraphAlbum.eager_graph(:band)
1200
+ ds.sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)'
1201
+ ds._fetch = {:id=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>3}
1202
+ a = ds.all
1203
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1204
+ a.first.band.should == GraphBand.load(:id => 2, :vocalist_id=>3)
1205
+ end
1206
+
1207
+ it "should eagerly load a single many_to_one association with the same name as a column" do
1208
+ GraphAlbum.def_column_alias(:band_id_id, :band_id)
1209
+ GraphAlbum.many_to_one :band_id, :key_column=>:band_id, :class=>GraphBand
1210
+ ds = GraphAlbum.eager_graph(:band_id)
1211
+ ds.sql.should == 'SELECT albums.id, albums.band_id, band_id.id AS band_id_id, band_id.vocalist_id FROM albums LEFT OUTER JOIN bands AS band_id ON (band_id.id = albums.band_id)'
1212
+ ds._fetch = {:id=>1, :band_id=>2, :band_id_id=>2, :vocalist_id=>3}
1213
+ a = ds.all
1214
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1215
+ a.first.band_id.should == GraphBand.load(:id => 2, :vocalist_id=>3)
1216
+ end
1217
+
1218
+ it "should support :join_type eager_graph option one_to_one association" do
1219
+ ds = GraphAlbum.eager_graph_with_options(:track, :join_type=>:inner)
1220
+ ds.sql.should == 'SELECT albums.id, albums.band_id, track.id AS track_id, track.album_id FROM albums INNER JOIN tracks AS track ON (track.album_id = albums.id)'
1221
+ ds._fetch = {:id=>1, :band_id=>2, :track_id=>3, :album_id=>1}
1222
+ a = ds.all
1223
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1224
+ a.first.track.should == GraphTrack.load(:id => 3, :album_id=>1)
1225
+ end
1226
+
1227
+ it "should eagerly load a single one_to_one association" do
1228
+ ds = GraphAlbum.eager_graph(:track)
1229
+ ds.sql.should == 'SELECT albums.id, albums.band_id, track.id AS track_id, track.album_id FROM albums LEFT OUTER JOIN tracks AS track ON (track.album_id = albums.id)'
1230
+ ds._fetch = {:id=>1, :band_id=>2, :track_id=>3, :album_id=>1}
1231
+ a = ds.all
1232
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1233
+ a.first.track.should == GraphTrack.load(:id => 3, :album_id=>1)
1234
+ end
1235
+
1236
+ it "should eagerly graph a single one_to_one association using the :distinct_on strategy" do
1237
+ sub = Class.new(GraphTrack)
1238
+ def (sub.dataset).supports_distinct_on?() true end
1239
+ def (sub.dataset).columns() [:id, :album_id] end
1240
+ GraphAlbum.one_to_one :ltrack, :clone=>:track, :class=>sub
1241
+ ds = GraphAlbum.eager_graph_with_options(:ltrack, :limit_strategy=>true)
1242
+ ds.sql.should == 'SELECT albums.id, albums.band_id, ltrack.id AS ltrack_id, ltrack.album_id FROM albums LEFT OUTER JOIN (SELECT DISTINCT ON (tracks.album_id) * FROM tracks ORDER BY tracks.album_id) AS ltrack ON (ltrack.album_id = albums.id)'
1243
+ ds._fetch = {:id=>1, :band_id=>2, :ltrack_id=>3, :album_id=>1}
1244
+ a = ds.all
1245
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1246
+ a.first.ltrack.should == sub.load(:id => 3, :album_id=>1)
1247
+ end
1248
+
1249
+ it "should eagerly graph a single one_to_one association using the :window_function strategy" do
1250
+ sub = Class.new(GraphTrack)
1251
+ def (sub.dataset).supports_window_functions?() true end
1252
+ def (sub.dataset).columns() [:id, :album_id] end
1253
+ GraphAlbum.one_to_one :ltrack, :clone=>:track, :class=>sub
1254
+ ds = GraphAlbum.eager_graph_with_options(:ltrack, :limit_strategy=>true)
1255
+ ds.sql.should == 'SELECT albums.id, albums.band_id, ltrack.id AS ltrack_id, ltrack.album_id FROM albums LEFT OUTER JOIN (SELECT id, album_id FROM (SELECT *, row_number() OVER (PARTITION BY tracks.album_id) AS x_sequel_row_number_x FROM tracks) AS t1 WHERE (x_sequel_row_number_x = 1)) AS ltrack ON (ltrack.album_id = albums.id)'
1256
+ ds._fetch = {:id=>1, :band_id=>2, :ltrack_id=>3, :album_id=>1}
1257
+ a = ds.all
1258
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1259
+ a.first.ltrack.should == sub.load(:id => 3, :album_id=>1)
1260
+ end
1261
+
1262
+ it "should eagerly graph a single one_to_one association using the :correlated_subquery strategy" do
1263
+ sub = Class.new(GraphTrack)
1264
+ def (sub.dataset).supports_window_functions?() true end
1265
+ def (sub.dataset).columns() [:id, :album_id] end
1266
+ GraphAlbum.one_to_one :ltrack, :clone=>:track, :class=>sub
1267
+ ds = GraphAlbum.eager_graph_with_options(:ltrack, :limit_strategy=>:correlated_subquery)
1268
+ ds.sql.should == 'SELECT albums.id, albums.band_id, ltrack.id AS ltrack_id, ltrack.album_id FROM albums LEFT OUTER JOIN (SELECT * FROM tracks WHERE (tracks.id IN (SELECT t1.id FROM tracks AS t1 WHERE (t1.album_id = tracks.album_id) LIMIT 1))) AS ltrack ON (ltrack.album_id = albums.id)'
1269
+ ds._fetch = {:id=>1, :band_id=>2, :ltrack_id=>3, :album_id=>1}
1270
+ a = ds.all
1271
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1272
+ a.first.ltrack.should == sub.load(:id => 3, :album_id=>1)
1273
+ end
1274
+
1275
+ it "should eagerly load a single one_to_many association" do
1276
+ ds = GraphAlbum.eager_graph(:tracks)
1277
+ ds.sql.should == 'SELECT albums.id, albums.band_id, tracks.id AS tracks_id, tracks.album_id FROM albums LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)'
1278
+ ds._fetch = {:id=>1, :band_id=>2, :tracks_id=>3, :album_id=>1}
1279
+ a = ds.all
1280
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1281
+ a.first.tracks.should == [GraphTrack.load(:id => 3, :album_id=>1)]
1282
+ end
1283
+
1284
+ it "should eagerly graph a single one_to_many association using the :window_function strategy" do
1285
+ sub = Class.new(GraphTrack)
1286
+ def (sub.dataset).supports_window_functions?() true end
1287
+ def (sub.dataset).columns() [:id, :album_id] end
1288
+ GraphAlbum.one_to_many :ltracks, :clone=>:tracks, :limit=>2, :class=>sub
1289
+ ds = GraphAlbum.eager_graph_with_options(:ltracks, :limit_strategy=>true)
1290
+ ds.sql.should == 'SELECT albums.id, albums.band_id, ltracks.id AS ltracks_id, ltracks.album_id FROM albums LEFT OUTER JOIN (SELECT id, album_id FROM (SELECT *, row_number() OVER (PARTITION BY tracks.album_id) AS x_sequel_row_number_x FROM tracks) AS t1 WHERE (x_sequel_row_number_x <= 2)) AS ltracks ON (ltracks.album_id = albums.id)'
1291
+ ds._fetch = {:id=>1, :band_id=>2, :ltracks_id=>3, :album_id=>1}
1292
+ a = ds.all
1293
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1294
+ a.first.ltracks.should == [sub.load(:id => 3, :album_id=>1)]
1295
+ end
1296
+
1297
+ it "should eagerly load a single many_to_many association" do
1298
+ ds = GraphAlbum.eager_graph(:genres)
1299
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres ON (genres.id = ag.genre_id)'
1300
+ ds._fetch = {:id=>1, :band_id=>2, :genres_id=>4}
1301
+ a = ds.all
1302
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1303
+ a.first.genres.should == [GraphGenre.load(:id => 4)]
1304
+ end
1305
+
1306
+ it "should eagerly graph a single many_to_many association using the :window_function strategy" do
1307
+ sub = Class.new(GraphGenre)
1308
+ def (sub.dataset).supports_window_functions?() true end
1309
+ def (sub.dataset).columns() literal(opts[:select]) =~ /x_foreign_key_x/ ? [:id, :x_foreign_key_x] : [:id] end
1310
+ GraphAlbum.many_to_many :lgenres, :clone=>:genres, :class=>sub, :limit=>2
1311
+ ds = GraphAlbum.eager_graph_with_options(:lgenres, :limit_strategy=>true)
1312
+ ds.sql.should == 'SELECT albums.id, albums.band_id, lgenres.id AS lgenres_id FROM albums LEFT OUTER JOIN (SELECT id, x_foreign_key_x FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x, row_number() OVER (PARTITION BY ag.album_id) AS x_sequel_row_number_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id)) AS t1 WHERE (x_sequel_row_number_x <= 2)) AS lgenres ON (lgenres.x_foreign_key_x = albums.id)'
1313
+ ds._fetch = {:id=>1, :band_id=>2, :lgenres_id=>4}
1314
+ a = ds.all
1315
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1316
+ a.first.lgenres.should == [sub.load(:id => 4)]
1317
+ end
1318
+
1319
+ it "should eagerly load a single one_through_one association" do
1320
+ ds = GraphAlbum.eager_graph(:genre)
1321
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genre.id AS genre_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genre ON (genre.id = ag.genre_id)'
1322
+ ds._fetch = {:id=>1, :band_id=>2, :genre_id=>4}
1323
+ a = ds.all
1324
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1325
+ a.first.genre.should == GraphGenre.load(:id => 4)
1326
+ end
1327
+
1328
+ it "should eagerly graph a single one_through_one association using the :distinct_on strategy" do
1329
+ sub = Class.new(GraphGenre)
1330
+ def (sub.dataset).supports_distinct_on?() true end
1331
+ def (sub.dataset).columns() [:id] end
1332
+ GraphAlbum.one_through_one :lgenre, :clone=>:genre, :class=>sub
1333
+ ds = GraphAlbum.eager_graph_with_options(:lgenre, :limit_strategy=>true)
1334
+ ds.sql.should == 'SELECT albums.id, albums.band_id, lgenre.id AS lgenre_id FROM albums LEFT OUTER JOIN (SELECT DISTINCT ON (ag.album_id) genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) ORDER BY ag.album_id) AS lgenre ON (lgenre.x_foreign_key_x = albums.id)'
1335
+ ds._fetch = {:id=>1, :band_id=>2, :lgenre_id=>4}
1336
+ a = ds.all
1337
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1338
+ a.first.lgenre.should == sub.load(:id => 4)
1339
+ end
1340
+
1341
+ it "should eagerly graph a single one_through_one association using the :window_function strategy" do
1342
+ sub = Class.new(GraphGenre)
1343
+ def (sub.dataset).supports_window_functions?() true end
1344
+ def (sub.dataset).columns() literal(opts[:select]) =~ /x_foreign_key_x/ ? [:id, :x_foreign_key_x] : [:id] end
1345
+ GraphAlbum.one_through_one :lgenre, :clone=>:genre, :class=>sub
1346
+ ds = GraphAlbum.eager_graph_with_options(:lgenre, :limit_strategy=>true)
1347
+ ds.sql.should == 'SELECT albums.id, albums.band_id, lgenre.id AS lgenre_id FROM albums LEFT OUTER JOIN (SELECT id, x_foreign_key_x FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x, row_number() OVER (PARTITION BY ag.album_id) AS x_sequel_row_number_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id)) AS t1 WHERE (x_sequel_row_number_x = 1)) AS lgenre ON (lgenre.x_foreign_key_x = albums.id)'
1348
+ ds._fetch = {:id=>1, :band_id=>2, :lgenre_id=>4}
1349
+ a = ds.all
1350
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1351
+ a.first.lgenre.should == sub.load(:id => 4)
1352
+ end
1353
+
1354
+ it "should correctly handle an aliased join table in many_to_many and one_through_one" do
1355
+ c = Class.new(GraphAlbum)
1356
+ c.many_to_many :genres, :clone=>:genres, :join_table=>:ag___ga
1357
+ c.eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id FROM albums LEFT OUTER JOIN ag AS ga ON (ga.album_id = albums.id) LEFT OUTER JOIN genres ON (genres.id = ga.genre_id)'
1358
+
1359
+ c.many_to_many :genre, :clone=>:genre, :join_table=>:ag___ga
1360
+ c.eager_graph(:genre).sql.should == 'SELECT albums.id, albums.band_id, genre.id AS genre_id FROM albums LEFT OUTER JOIN ag AS ga ON (ga.album_id = albums.id) LEFT OUTER JOIN genres AS genre ON (genre.id = ga.genre_id)'
1361
+
1362
+ c.many_to_many :genres, :clone=>:genres, :join_table=>:ag___albums
1363
+ c.eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id FROM albums LEFT OUTER JOIN ag AS albums_0 ON (albums_0.album_id = albums.id) LEFT OUTER JOIN genres ON (genres.id = albums_0.genre_id)'
1364
+
1365
+ c.many_to_many :genres, :clone=>:genres, :join_table=>:ag___genres
1366
+ c.eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id FROM albums LEFT OUTER JOIN ag AS genres_0 ON (genres_0.album_id = albums.id) LEFT OUTER JOIN genres ON (genres.id = genres_0.genre_id)'
1367
+ end
1368
+
1369
+ it "should handle multiple associations in a single call to association_join" do
1370
+ GraphAlbum.association_join(:genres, :tracks, :band).sql.should == 'SELECT * FROM albums INNER JOIN ag ON (ag.album_id = albums.id) INNER JOIN genres ON (genres.id = ag.genre_id) INNER JOIN tracks ON (tracks.album_id = albums.id) INNER JOIN bands AS band ON (band.id = albums.band_id)'
1371
+ end
1372
+
1373
+ it "should eagerly load multiple associations in a single call" do
1374
+ ds = GraphAlbum.eager_graph(:genres, :tracks, :band)
1375
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id, tracks.id AS tracks_id, tracks.album_id, band.id AS band_id_0, band.vocalist_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres ON (genres.id = ag.genre_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id) LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)'
1376
+ ds._fetch = {:id=>1, :band_id=>2, :genres_id=>4, :tracks_id=>3, :album_id=>1, :band_id_0=>2, :vocalist_id=>6}
1377
+ a = ds.all
1378
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1379
+ a = a.first
1380
+ a.band.should == GraphBand.load(:id => 2, :vocalist_id=>6)
1381
+ a.tracks.should == [GraphTrack.load({:id => 3, :album_id=>1})]
1382
+ a.genres.should == [GraphGenre.load(:id => 4)]
1383
+ end
1384
+
1385
+ it "should eagerly load multiple associations with different limit strategies in a single call" do
1386
+ subg = Class.new(GraphGenre)
1387
+ def (subg.dataset).supports_distinct_on?() true end
1388
+ def (subg.dataset).supports_window_functions?() true end
1389
+ def (subg.dataset).columns() literal(opts[:select]) =~ /x_foreign_key_x/ ? [:id, :x_foreign_key_x] : [:id] end
1390
+ GraphAlbum.one_through_one :lgenre, :clone=>:genre, :class=>subg
1391
+ GraphAlbum.many_to_many :lgenres, :clone=>:genres, :class=>subg, :limit=>2
1392
+
1393
+ ds = GraphAlbum.eager_graph_with_options([:lgenre, :lgenres], :limit_strategy=>{:lgenre=>:distinct_on, :lgenres=>:window_function})
1394
+ ds.sql.should == 'SELECT albums.id, albums.band_id, lgenre.id AS lgenre_id, lgenres.id AS lgenres_id FROM albums LEFT OUTER JOIN (SELECT DISTINCT ON (ag.album_id) genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) ORDER BY ag.album_id) AS lgenre ON (lgenre.x_foreign_key_x = albums.id) LEFT OUTER JOIN (SELECT id, x_foreign_key_x FROM (SELECT genres.*, ag.album_id AS x_foreign_key_x, row_number() OVER (PARTITION BY ag.album_id) AS x_sequel_row_number_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id)) AS t1 WHERE (x_sequel_row_number_x <= 2)) AS lgenres ON (lgenres.x_foreign_key_x = albums.id)'
1395
+ ds._fetch = {:id=>1, :band_id=>2, :lgenres_id=>4, :lgenre_id=>3}
1396
+ a = ds.all
1397
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1398
+ a = a.first
1399
+ a.lgenre.should == subg.load(:id => 3)
1400
+ a.lgenres.should == [subg.load(:id => 4)]
1401
+ end
1402
+
1403
+ it "should handle multiple associations in separate calls to association_join" do
1404
+ GraphAlbum.association_join(:genres).association_join(:tracks).association_join(:band).sql.should == 'SELECT * FROM albums INNER JOIN ag ON (ag.album_id = albums.id) INNER JOIN genres ON (genres.id = ag.genre_id) INNER JOIN tracks ON (tracks.album_id = albums.id) INNER JOIN bands AS band ON (band.id = albums.band_id)'
1405
+ end
1406
+
1407
+ it "should eagerly load multiple associations in separate calls" do
1408
+ ds = GraphAlbum.eager_graph(:genres).eager_graph(:tracks).eager_graph(:band)
1409
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id, tracks.id AS tracks_id, tracks.album_id, band.id AS band_id_0, band.vocalist_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres ON (genres.id = ag.genre_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id) LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)'
1410
+ ds._fetch = {:id=>1, :band_id=>2, :genres_id=>4, :tracks_id=>3, :album_id=>1, :band_id_0=>2, :vocalist_id=>6}
1411
+ a = ds.all
1412
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1413
+ a = a.first
1414
+ a.band.should == GraphBand.load(:id => 2, :vocalist_id=>6)
1415
+ a.tracks.should == [GraphTrack.load({:id => 3, :album_id=>1})]
1416
+ a.genres.should == [GraphGenre.load(:id => 4)]
1417
+ end
1418
+
1419
+ it "should handle cascading associations in a single call to association_join" do
1420
+ GraphTrack.association_join(:album=>{:band=>:members}).sql.should == 'SELECT * FROM tracks INNER JOIN albums AS album ON (album.id = tracks.album_id) INNER JOIN bands AS band ON (band.id = album.band_id) INNER JOIN bm ON (bm.band_id = band.id) INNER JOIN members ON (members.id = bm.member_id)'
1421
+ GraphBand.association_join({:albums=>:tracks}, :members).sql.should == 'SELECT * FROM bands INNER JOIN albums ON (albums.band_id = bands.id) INNER JOIN tracks ON (tracks.album_id = albums.id) INNER JOIN bm ON (bm.band_id = bands.id) INNER JOIN members ON (members.id = bm.member_id)'
1422
+ end
1423
+
1424
+ it "should handle matching association names for different models when using association_join" do
1425
+ GraphAlbum.association_join(:genres).association_join(:band=>:genres).sql.should == 'SELECT * FROM albums INNER JOIN ag ON (ag.album_id = albums.id) INNER JOIN genres ON (genres.id = ag.genre_id) INNER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN bg ON (bg.band_id = band.id) INNER JOIN genres AS genres_0 ON (genres_0.id = bg.genre_id)'
1426
+ end
1427
+
1428
+ it "should allow cascading of eager loading for associations of associated models" do
1429
+ ds = GraphTrack.eager_graph(:album=>{:band=>:members})
1430
+ ds.sql.should == 'SELECT tracks.id, tracks.album_id, album.id AS album_id_0, album.band_id, band.id AS band_id_0, band.vocalist_id, members.id AS members_id FROM tracks LEFT OUTER JOIN albums AS album ON (album.id = tracks.album_id) LEFT OUTER JOIN bands AS band ON (band.id = album.band_id) LEFT OUTER JOIN bm ON (bm.band_id = band.id) LEFT OUTER JOIN members ON (members.id = bm.member_id)'
1431
+ ds._fetch = {:id=>3, :album_id=>1, :album_id_0=>1, :band_id=>2, :members_id=>5, :band_id_0=>2, :vocalist_id=>6}
1432
+ a = ds.all
1433
+ a.should == [GraphTrack.load(:id => 3, :album_id => 1)]
1434
+ a = a.first
1435
+ a.album.should == GraphAlbum.load(:id => 1, :band_id => 2)
1436
+ a.album.band.should == GraphBand.load(:id => 2, :vocalist_id=>6)
1437
+ a.album.band.members.should == [GraphBandMember.load(:id => 5)]
1438
+ end
1439
+
1440
+ it "should allow cascading of eager loading for multiple *_to_many associations, eliminating duplicates caused by cartesian products" do
1441
+ ds = GraphBand.eager_graph({:albums=>:tracks}, :members)
1442
+ ds.sql.should == 'SELECT bands.id, bands.vocalist_id, albums.id AS albums_id, albums.band_id, tracks.id AS tracks_id, tracks.album_id, members.id AS members_id FROM bands LEFT OUTER JOIN albums ON (albums.band_id = bands.id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id) LEFT OUTER JOIN bm ON (bm.band_id = bands.id) LEFT OUTER JOIN members ON (members.id = bm.member_id)'
1443
+ ds._fetch = [{:id=>1, :vocalist_id=>2, :albums_id=>3, :band_id=>1, :tracks_id=>4, :album_id=>3, :members_id=>5},
1444
+ {:id=>1, :vocalist_id=>2, :albums_id=>3, :band_id=>1, :tracks_id=>4, :album_id=>3, :members_id=>6},
1445
+ {:id=>1, :vocalist_id=>2, :albums_id=>3, :band_id=>1, :tracks_id=>5, :album_id=>3, :members_id=>5},
1446
+ {:id=>1, :vocalist_id=>2, :albums_id=>3, :band_id=>1, :tracks_id=>5, :album_id=>3, :members_id=>6},
1447
+ {:id=>1, :vocalist_id=>2, :albums_id=>4, :band_id=>1, :tracks_id=>6, :album_id=>4, :members_id=>5},
1448
+ {:id=>1, :vocalist_id=>2, :albums_id=>4, :band_id=>1, :tracks_id=>6, :album_id=>4, :members_id=>6},
1449
+ {:id=>1, :vocalist_id=>2, :albums_id=>4, :band_id=>1, :tracks_id=>7, :album_id=>4, :members_id=>5},
1450
+ {:id=>1, :vocalist_id=>2, :albums_id=>4, :band_id=>1, :tracks_id=>7, :album_id=>4, :members_id=>6},
1451
+ {:id=>2, :vocalist_id=>2, :albums_id=>5, :band_id=>2, :tracks_id=>8, :album_id=>5, :members_id=>5},
1452
+ {:id=>2, :vocalist_id=>2, :albums_id=>5, :band_id=>2, :tracks_id=>8, :album_id=>5, :members_id=>6},
1453
+ {:id=>2, :vocalist_id=>2, :albums_id=>5, :band_id=>2, :tracks_id=>9, :album_id=>5, :members_id=>5},
1454
+ {:id=>2, :vocalist_id=>2, :albums_id=>5, :band_id=>2, :tracks_id=>9, :album_id=>5, :members_id=>6},
1455
+ {:id=>2, :vocalist_id=>2, :albums_id=>6, :band_id=>2, :tracks_id=>1, :album_id=>6, :members_id=>5},
1456
+ {:id=>2, :vocalist_id=>2, :albums_id=>6, :band_id=>2, :tracks_id=>1, :album_id=>6, :members_id=>6},
1457
+ {:id=>2, :vocalist_id=>2, :albums_id=>6, :band_id=>2, :tracks_id=>2, :album_id=>6, :members_id=>5},
1458
+ {:id=>2, :vocalist_id=>2, :albums_id=>6, :band_id=>2, :tracks_id=>2, :album_id=>6, :members_id=>6}]
1459
+ a = ds.all
1460
+ a.should == [GraphBand.load(:id=>1, :vocalist_id=>2), GraphBand.load(:id=>2, :vocalist_id=>2)]
1461
+ members = a.map{|x| x.members}
1462
+ members.should == [[GraphBandMember.load(:id=>5), GraphBandMember.load(:id=>6)], [GraphBandMember.load(:id=>5), GraphBandMember.load(:id=>6)]]
1463
+ albums = a.map{|x| x.albums}
1464
+ albums.should == [[GraphAlbum.load(:id=>3, :band_id=>1), GraphAlbum.load(:id=>4, :band_id=>1)], [GraphAlbum.load(:id=>5, :band_id=>2), GraphAlbum.load(:id=>6, :band_id=>2)]]
1465
+ tracks = albums.map{|x| x.map{|y| y.tracks}}
1466
+ tracks.should == [[[GraphTrack.load(:id=>4, :album_id=>3), GraphTrack.load(:id=>5, :album_id=>3)], [GraphTrack.load(:id=>6, :album_id=>4), GraphTrack.load(:id=>7, :album_id=>4)]], [[GraphTrack.load(:id=>8, :album_id=>5), GraphTrack.load(:id=>9, :album_id=>5)], [GraphTrack.load(:id=>1, :album_id=>6), GraphTrack.load(:id=>2, :album_id=>6)]]]
1467
+ end
1468
+
1469
+ it "should populate the reciprocal many_to_one association when eagerly loading the one_to_many association" do
1470
+ DB.reset
1471
+ ds = GraphAlbum.eager_graph(:tracks)
1472
+ ds.sql.should == 'SELECT albums.id, albums.band_id, tracks.id AS tracks_id, tracks.album_id FROM albums LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)'
1473
+ ds._fetch = {:id=>1, :band_id=>2, :tracks_id=>3, :album_id=>1}
1474
+ a = ds.all
1475
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1476
+ a = a.first
1477
+ a.tracks.should == [GraphTrack.load(:id => 3, :album_id=>1)]
1478
+ a.tracks.first.album.should == a
1479
+ DB.sqls.should == ['SELECT albums.id, albums.band_id, tracks.id AS tracks_id, tracks.album_id FROM albums LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)']
1480
+ end
1481
+
1482
+ it "should eager load multiple associations from the same table" do
1483
+ ds = GraphBand.eager_graph(:vocalist, :members)
1484
+ ds.sql.should == 'SELECT bands.id, bands.vocalist_id, vocalist.id AS vocalist_id_0, members.id AS members_id FROM bands LEFT OUTER JOIN members AS vocalist ON (vocalist.id = bands.vocalist_id) LEFT OUTER JOIN bm ON (bm.band_id = bands.id) LEFT OUTER JOIN members ON (members.id = bm.member_id)'
1485
+ ds._fetch = {:id=>2, :vocalist_id=>6, :vocalist_id_0=>6, :members_id=>5}
1486
+ a = ds.all
1487
+ a.should == [GraphBand.load(:id => 2, :vocalist_id => 6)]
1488
+ a = a.first
1489
+ a.vocalist.should == GraphBandMember.load(:id => 6)
1490
+ a.members.should == [GraphBandMember.load(:id => 5)]
1491
+ end
1492
+
1493
+ it "should give you a plain hash when called without .all" do
1494
+ ds = GraphAlbum.eager_graph(:band)
1495
+ ds.sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)'
1496
+ ds._fetch = {:id=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>3}
1497
+ ds.first.should == {:id=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>3}
1498
+ end
1499
+
1500
+ it "should not drop any associated objects if the graph could not be a cartesian product" do
1501
+ ds = GraphBand.eager_graph(:members, :vocalist)
1502
+ ds.sql.should == 'SELECT bands.id, bands.vocalist_id, members.id AS members_id, vocalist.id AS vocalist_id_0 FROM bands LEFT OUTER JOIN bm ON (bm.band_id = bands.id) LEFT OUTER JOIN members ON (members.id = bm.member_id) LEFT OUTER JOIN members AS vocalist ON (vocalist.id = bands.vocalist_id)'
1503
+ ds._fetch = [{:id=>2, :vocalist_id=>6, :members_id=>5, :vocalist_id_0=>6}, {:id=>2, :vocalist_id=>6, :members_id=>5, :vocalist_id_0=>6}]
1504
+ a = ds.all
1505
+ a.should == [GraphBand.load(:id => 2, :vocalist_id => 6)]
1506
+ a = a.first
1507
+ a.vocalist.should == GraphBandMember.load(:id => 6)
1508
+ a.members.should == [GraphBandMember.load(:id => 5), GraphBandMember.load(:id => 5)]
1509
+ end
1510
+
1511
+ it "should respect the :cartesian_product_number option" do
1512
+ GraphBand.many_to_one :other_vocalist, :class=>'GraphBandMember', :key=>:vocalist_id, :cartesian_product_number=>1
1513
+ ds = GraphBand.eager_graph(:members, :other_vocalist)
1514
+ ds.sql.should == 'SELECT bands.id, bands.vocalist_id, members.id AS members_id, other_vocalist.id AS other_vocalist_id FROM bands LEFT OUTER JOIN bm ON (bm.band_id = bands.id) LEFT OUTER JOIN members ON (members.id = bm.member_id) LEFT OUTER JOIN members AS other_vocalist ON (other_vocalist.id = bands.vocalist_id)'
1515
+ ds._fetch = [{:id=>2, :vocalist_id=>6, :members_id=>5, :other_vocalist_id=>6}, {:id=>2, :vocalist_id=>6, :members_id=>5, :other_vocalist_id=>6}]
1516
+ a = ds.all
1517
+ a.should == [GraphBand.load(:id=>2, :vocalist_id => 6)]
1518
+ a.first.other_vocalist.should == GraphBandMember.load(:id=>6)
1519
+ a.first.members.should == [GraphBandMember.load(:id=>5)]
1520
+ end
1521
+
1522
+ it "should drop duplicate items that occur in sequence if the graph could be a cartesian product" do
1523
+ ds = GraphBand.eager_graph(:members, :genres)
1524
+ ds.sql.should == 'SELECT bands.id, bands.vocalist_id, members.id AS members_id, genres.id AS genres_id FROM bands LEFT OUTER JOIN bm ON (bm.band_id = bands.id) LEFT OUTER JOIN members ON (members.id = bm.member_id) LEFT OUTER JOIN bg ON (bg.band_id = bands.id) LEFT OUTER JOIN genres ON (genres.id = bg.genre_id)'
1525
+ ds._fetch = [{:id=>2, :vocalist_id=>6, :members_id=>5, :genres_id=>7},
1526
+ {:id=>2, :vocalist_id=>6, :members_id=>5, :genres_id=>8},
1527
+ {:id=>2, :vocalist_id=>6, :members_id=>6, :genres_id=>7},
1528
+ {:id=>2, :vocalist_id=>6, :members_id=>6, :genres_id=>8}]
1529
+ a = ds.all
1530
+ a.should == [GraphBand.load(:id => 2, :vocalist_id => 6)]
1531
+ a = a.first
1532
+ a.members.should == [GraphBandMember.load(:id => 5), GraphBandMember.load(:id => 6)]
1533
+ a.genres.should == [GraphGenre.load(:id => 7), GraphGenre.load(:id => 8)]
1534
+ end
1535
+
1536
+ it "should be able to be used in combination with #eager" do
1537
+ DB.reset
1538
+ ds = GraphAlbum.eager_graph(:tracks).eager(:genres)
1539
+ ds._fetch = {:id=>1, :band_id=>2, :tracks_id=>3, :album_id=>1}
1540
+ ds2 = GraphGenre.dataset
1541
+ ds2._fetch = {:id=>6, :x_foreign_key_x=>1}
1542
+ a = ds.all
1543
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1544
+ a = a.first
1545
+ a.tracks.should == [GraphTrack.load(:id=>3, :album_id=>1)]
1546
+ a.genres.should == [GraphGenre.load(:id => 6)]
1547
+ DB.sqls.should == ['SELECT albums.id, albums.band_id, tracks.id AS tracks_id, tracks.album_id FROM albums LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)',
1548
+ "SELECT genres.*, ag.album_id AS x_foreign_key_x FROM genres INNER JOIN ag ON (ag.genre_id = genres.id) WHERE (ag.album_id IN (1))"]
1549
+ end
1550
+
1551
+ it "should handle no associated records for a single many_to_one association" do
1552
+ ds = GraphAlbum.eager_graph(:band)
1553
+ ds.sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)'
1554
+ ds._fetch = {:id=>1, :band_id=>2, :band_id_0=>nil, :vocalist_id=>nil}
1555
+ a = ds.all
1556
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1557
+ a.first.band.should == nil
1558
+ end
1559
+
1560
+ it "should handle no associated records for a single one_to_one association" do
1561
+ ds = GraphAlbum.eager_graph(:track)
1562
+ ds.sql.should == 'SELECT albums.id, albums.band_id, track.id AS track_id, track.album_id FROM albums LEFT OUTER JOIN tracks AS track ON (track.album_id = albums.id)'
1563
+ ds._fetch = {:id=>1, :band_id=>2, :track_id=>nil, :album_id=>nil}
1564
+ a = ds.all
1565
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1566
+ a.first.track.should == nil
1567
+ end
1568
+
1569
+ it "should handle no associated records for a single one_to_many association" do
1570
+ ds = GraphAlbum.eager_graph(:tracks)
1571
+ ds.sql.should == 'SELECT albums.id, albums.band_id, tracks.id AS tracks_id, tracks.album_id FROM albums LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id)'
1572
+ ds._fetch = {:id=>1, :band_id=>2, :tracks_id=>nil, :album_id=>nil}
1573
+ a = ds.all
1574
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1575
+ a.first.tracks.should == []
1576
+ end
1577
+
1578
+ it "should handle no associated records for a single one_through_one association" do
1579
+ ds = GraphAlbum.eager_graph(:genre)
1580
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genre.id AS genre_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genre ON (genre.id = ag.genre_id)'
1581
+ ds._fetch = {:id=>1, :band_id=>2, :genres_id=>nil}
1582
+ a = ds.all
1583
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1584
+ a.first.genre.should == nil
1585
+ end
1586
+
1587
+ it "should handle no associated records for a single many_to_many association" do
1588
+ ds = GraphAlbum.eager_graph(:genres)
1589
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres ON (genres.id = ag.genre_id)'
1590
+ ds._fetch = {:id=>1, :band_id=>2, :genres_id=>nil}
1591
+ a = ds.all
1592
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1593
+ a.first.genres.should == []
1594
+ end
1595
+
1596
+ it "should handle missing associated records when loading multiple associations" do
1597
+ ds = GraphAlbum.eager_graph(:genres, :tracks, :band)
1598
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id, tracks.id AS tracks_id, tracks.album_id, band.id AS band_id_0, band.vocalist_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres ON (genres.id = ag.genre_id) LEFT OUTER JOIN tracks ON (tracks.album_id = albums.id) LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id)'
1599
+ ds._fetch = [{:id=>1, :band_id=>2, :genres_id=>nil, :tracks_id=>3, :album_id=>1, :band_id_0=>nil, :vocalist_id=>nil},
1600
+ {:id=>1, :band_id=>2, :genres_id=>nil, :tracks_id=>4, :album_id=>1, :band_id_0=>nil, :vocalist_id=>nil},
1601
+ {:id=>1, :band_id=>2, :genres_id=>nil, :tracks_id=>5, :album_id=>1, :band_id_0=>nil, :vocalist_id=>nil},
1602
+ {:id=>1, :band_id=>2, :genres_id=>nil, :tracks_id=>6, :album_id=>1, :band_id_0=>nil, :vocalist_id=>nil}]
1603
+ a = ds.all
1604
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1605
+ a = a.first
1606
+ a.tracks.should == [GraphTrack.load(:id => 3, :album_id => 1), GraphTrack.load(:id => 4, :album_id => 1), GraphTrack.load(:id => 5, :album_id => 1), GraphTrack.load(:id => 6, :album_id => 1)]
1607
+ a.band.should == nil
1608
+ a.genres.should == []
1609
+ end
1610
+
1611
+ it "should handle missing associated records when cascading eager loading for associations of associated models" do
1612
+ ds = GraphTrack.eager_graph(:album=>{:band=>:members})
1613
+ ds.sql.should == 'SELECT tracks.id, tracks.album_id, album.id AS album_id_0, album.band_id, band.id AS band_id_0, band.vocalist_id, members.id AS members_id FROM tracks LEFT OUTER JOIN albums AS album ON (album.id = tracks.album_id) LEFT OUTER JOIN bands AS band ON (band.id = album.band_id) LEFT OUTER JOIN bm ON (bm.band_id = band.id) LEFT OUTER JOIN members ON (members.id = bm.member_id)'
1614
+ ds._fetch = [{:id=>2, :album_id=>2, :album_id_0=>nil, :band_id=>nil, :members_id=>nil, :band_id_0=>nil, :vocalist_id=>nil},
1615
+ {:id=>3, :album_id=>3, :album_id_0=>3, :band_id=>3, :members_id=>nil, :band_id_0=>nil, :vocalist_id=>nil},
1616
+ {:id=>4, :album_id=>4, :album_id_0=>4, :band_id=>2, :members_id=>nil, :band_id_0=>2, :vocalist_id=>6},
1617
+ {:id=>5, :album_id=>1, :album_id_0=>1, :band_id=>4, :members_id=>5, :band_id_0=>4, :vocalist_id=>8},
1618
+ {:id=>5, :album_id=>1, :album_id_0=>1, :band_id=>4, :members_id=>6, :band_id_0=>4, :vocalist_id=>8}]
1619
+ a = ds.all
1620
+ a.should == [GraphTrack.load(:id => 2, :album_id => 2), GraphTrack.load(:id => 3, :album_id => 3), GraphTrack.load(:id => 4, :album_id => 4), GraphTrack.load(:id => 5, :album_id => 1)]
1621
+ a.map{|x| x.album}.should == [nil, GraphAlbum.load(:id => 3, :band_id => 3), GraphAlbum.load(:id => 4, :band_id => 2), GraphAlbum.load(:id => 1, :band_id => 4)]
1622
+ a.map{|x| x.album.band if x.album}.should == [nil, nil, GraphBand.load(:id => 2, :vocalist_id=>6), GraphBand.load(:id => 4, :vocalist_id=>8)]
1623
+ a.map{|x| x.album.band.members if x.album && x.album.band}.should == [nil, nil, [], [GraphBandMember.load(:id => 5), GraphBandMember.load(:id => 6)]]
1624
+ end
1625
+
1626
+ it "should respect the association's :primary_key option" do
1627
+ GraphAlbum.many_to_one :inner_band, :class=>'GraphBand', :key=>:band_id, :primary_key=>:vocalist_id
1628
+ ds = GraphAlbum.eager_graph(:inner_band)
1629
+ ds.sql.should == 'SELECT albums.id, albums.band_id, inner_band.id AS inner_band_id, inner_band.vocalist_id FROM albums LEFT OUTER JOIN bands AS inner_band ON (inner_band.vocalist_id = albums.band_id)'
1630
+ ds._fetch = {:id=>3, :band_id=>2, :inner_band_id=>5, :vocalist_id=>2}
1631
+ as = ds.all
1632
+ as.should == [GraphAlbum.load(:id=>3, :band_id=>2)]
1633
+ as.first.inner_band.should == GraphBand.load(:id=>5, :vocalist_id=>2)
1634
+
1635
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :primary_key=>:band_id, :reciprocal=>nil
1636
+ ds = GraphAlbum.eager_graph(:right_tracks)
1637
+ ds.sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.band_id)'
1638
+ ds._fetch = [{:id=>3, :band_id=>2, :right_tracks_id=>5, :album_id=>2}, {:id=>3, :band_id=>2, :right_tracks_id=>6, :album_id=>2}]
1639
+ as = ds.all
1640
+ as.should == [GraphAlbum.load(:id=>3, :band_id=>2)]
1641
+ as.first.right_tracks.should == [GraphTrack.load(:id=>5, :album_id=>2), GraphTrack.load(:id=>6, :album_id=>2)]
1642
+ end
1643
+
1644
+ it "should respect many_to_one association's composite keys" do
1645
+ GraphAlbum.many_to_one :inner_band, :class=>'GraphBand', :key=>[:band_id, :id], :primary_key=>[:vocalist_id, :id]
1646
+ ds = GraphAlbum.eager_graph(:inner_band)
1647
+ ds.sql.should == 'SELECT albums.id, albums.band_id, inner_band.id AS inner_band_id, inner_band.vocalist_id FROM albums LEFT OUTER JOIN bands AS inner_band ON ((inner_band.vocalist_id = albums.band_id) AND (inner_band.id = albums.id))'
1648
+ ds._fetch = {:id=>3, :band_id=>2, :inner_band_id=>3, :vocalist_id=>2}
1649
+ as = ds.all
1650
+ as.should == [GraphAlbum.load(:id=>3, :band_id=>2)]
1651
+ as.first.inner_band.should == GraphBand.load(:id=>3, :vocalist_id=>2)
1652
+ end
1653
+
1654
+ it "should respect one_to_many association's composite keys" do
1655
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>[:album_id, :id], :primary_key=>[:band_id, :id]
1656
+ ds = GraphAlbum.eager_graph(:right_tracks)
1657
+ ds.sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON ((right_tracks.album_id = albums.band_id) AND (right_tracks.id = albums.id))'
1658
+ ds._fetch = {:id=>3, :band_id=>2, :right_tracks_id=>3, :album_id=>2}
1659
+ as = ds.all
1660
+ as.should == [GraphAlbum.load(:id=>3, :band_id=>2)]
1661
+ as.first.right_tracks.should == [GraphTrack.load(:id=>3, :album_id=>2)]
1662
+ end
1663
+
1664
+ it "should respect many_to_many association's composite keys" do
1665
+ GraphAlbum.many_to_many :sbands, :class=>'GraphBand', :left_key=>[:l1, :l2], :left_primary_key=>[:band_id, :id], :right_key=>[:r1, :r2], :right_primary_key=>[:vocalist_id, :id], :join_table=>:b
1666
+ ds = GraphAlbum.eager_graph(:sbands)
1667
+ ds.sql.should == 'SELECT albums.id, albums.band_id, sbands.id AS sbands_id, sbands.vocalist_id FROM albums LEFT OUTER JOIN b ON ((b.l1 = albums.band_id) AND (b.l2 = albums.id)) LEFT OUTER JOIN bands AS sbands ON ((sbands.vocalist_id = b.r1) AND (sbands.id = b.r2))'
1668
+ ds._fetch = [{:id=>3, :band_id=>2, :sbands_id=>5, :vocalist_id=>6}, {:id=>3, :band_id=>2, :sbands_id=>6, :vocalist_id=>22}]
1669
+ as = ds.all
1670
+ as.should == [GraphAlbum.load(:id=>3, :band_id=>2)]
1671
+ as.first.sbands.should == [GraphBand.load(:id=>5, :vocalist_id=>6), GraphBand.load(:id=>6, :vocalist_id=>22)]
1672
+ end
1673
+
1674
+ it "should respect many_to_many association's :left_primary_key and :right_primary_key options" do
1675
+ GraphAlbum.many_to_many :inner_genres, :class=>'GraphGenre', :left_key=>:album_id, :left_primary_key=>:band_id, :right_key=>:genre_id, :right_primary_key=>:xxx, :join_table=>:ag
1676
+ ds = GraphAlbum.eager_graph(:inner_genres)
1677
+ ds.sql.should == 'SELECT albums.id, albums.band_id, inner_genres.id AS inner_genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.band_id) LEFT OUTER JOIN genres AS inner_genres ON (inner_genres.xxx = ag.genre_id)'
1678
+ ds._fetch = [{:id=>3, :band_id=>2, :inner_genres_id=>5, :xxx=>12}, {:id=>3, :band_id=>2, :inner_genres_id=>6, :xxx=>22}]
1679
+ as = ds.all
1680
+ as.should == [GraphAlbum.load(:id=>3, :band_id=>2)]
1681
+ as.first.inner_genres.should == [GraphGenre.load(:id=>5), GraphGenre.load(:id=>6)]
1682
+ end
1683
+
1684
+ it "should respect composite primary keys for classes when eager loading" do
1685
+ c1 = Class.new(GraphAlbum)
1686
+ c2 = Class.new(GraphBand)
1687
+ c1.set_primary_key [:band_id, :id]
1688
+ c2.set_primary_key [:vocalist_id, :id]
1689
+ c1.many_to_many :sbands, :class=>c2, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :join_table=>:b
1690
+ c2.one_to_many :salbums, :class=>c1, :key=>[:band_id, :id]
1691
+ ds = c1.eager_graph(:sbands=>:salbums)
1692
+ ds.sql.should == 'SELECT albums.id, albums.band_id, sbands.id AS sbands_id, sbands.vocalist_id, salbums.id AS salbums_id, salbums.band_id AS salbums_band_id FROM albums LEFT OUTER JOIN b ON ((b.l1 = albums.band_id) AND (b.l2 = albums.id)) LEFT OUTER JOIN bands AS sbands ON ((sbands.vocalist_id = b.r1) AND (sbands.id = b.r2)) LEFT OUTER JOIN albums AS salbums ON ((salbums.band_id = sbands.vocalist_id) AND (salbums.id = sbands.id))'
1693
+ ds._fetch = [{:id=>3, :band_id=>2, :sbands_id=>5, :vocalist_id=>6, :salbums_id=>7, :salbums_band_id=>8},
1694
+ {:id=>3, :band_id=>2, :sbands_id=>5, :vocalist_id=>6, :salbums_id=>9, :salbums_band_id=>10},
1695
+ {:id=>3, :band_id=>2, :sbands_id=>6, :vocalist_id=>22, :salbums_id=>nil, :salbums_band_id=>nil},
1696
+ {:id=>7, :band_id=>8, :sbands_id=>nil, :vocalist_id=>nil, :salbums_id=>nil, :salbums_band_id=>nil}]
1697
+ as = ds.all
1698
+ as.should == [c1.load(:id=>3, :band_id=>2), c1.load(:id=>7, :band_id=>8)]
1699
+ as.map{|x| x.sbands}.should == [[c2.load(:id=>5, :vocalist_id=>6), c2.load(:id=>6, :vocalist_id=>22)], []]
1700
+ as.map{|x| x.sbands.map{|y| y.salbums}}.should == [[[c1.load(:id=>7, :band_id=>8), c1.load(:id=>9, :band_id=>10)], []], []]
1701
+ end
1702
+
1703
+ it "should respect the association's :graph_select option" do
1704
+ GraphAlbum.many_to_one :inner_band, :class=>'GraphBand', :key=>:band_id, :graph_select=>:vocalist_id
1705
+ GraphAlbum.eager_graph(:inner_band).sql.should == 'SELECT albums.id, albums.band_id, inner_band.vocalist_id FROM albums LEFT OUTER JOIN bands AS inner_band ON (inner_band.id = albums.band_id)'
1706
+
1707
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_select=>[:album_id]
1708
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.id)'
1709
+
1710
+ GraphAlbum.many_to_many :inner_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_select=>[]
1711
+ GraphAlbum.eager_graph(:inner_genres).sql.should == 'SELECT albums.id, albums.band_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS inner_genres ON (inner_genres.id = ag.genre_id)'
1712
+ end
1713
+
1714
+ it "should respect the association's :graph_alias_base option" do
1715
+ GraphAlbum.many_to_one :inner_band, :class=>'GraphBand', :key=>:band_id, :graph_alias_base=>:foo
1716
+ ds = GraphAlbum.eager_graph(:inner_band)
1717
+ ds.sql.should == 'SELECT albums.id, albums.band_id, foo.id AS foo_id, foo.vocalist_id FROM albums LEFT OUTER JOIN bands AS foo ON (foo.id = albums.band_id)'
1718
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_alias_base=>:foo
1719
+ ds.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, foo.id AS foo_id, foo.vocalist_id, foo_0.id AS foo_0_id, foo_0.album_id FROM albums LEFT OUTER JOIN bands AS foo ON (foo.id = albums.band_id) LEFT OUTER JOIN tracks AS foo_0 ON (foo_0.album_id = albums.id)'
1720
+ end
1721
+
1722
+ it "should respect the association's :graph_join_type option" do
1723
+ GraphAlbum.many_to_one :inner_band, :class=>'GraphBand', :key=>:band_id, :graph_join_type=>:inner
1724
+ GraphAlbum.eager_graph(:inner_band).sql.should == 'SELECT albums.id, albums.band_id, inner_band.id AS inner_band_id, inner_band.vocalist_id FROM albums INNER JOIN bands AS inner_band ON (inner_band.id = albums.band_id)'
1725
+
1726
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_join_type=>:right_outer
1727
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums RIGHT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.id)'
1728
+
1729
+ GraphAlbum.many_to_many :inner_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_type=>:inner
1730
+ GraphAlbum.eager_graph(:inner_genres).sql.should == 'SELECT albums.id, albums.band_id, inner_genres.id AS inner_genres_id FROM albums INNER JOIN ag ON (ag.album_id = albums.id) INNER JOIN genres AS inner_genres ON (inner_genres.id = ag.genre_id)'
1731
+ end
1732
+
1733
+ it "should respect the association's :graph_join_table_join_type option" do
1734
+ GraphAlbum.many_to_many :inner_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_table_join_type=>:inner
1735
+ GraphAlbum.eager_graph(:inner_genres).sql.should == 'SELECT albums.id, albums.band_id, inner_genres.id AS inner_genres_id FROM albums INNER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS inner_genres ON (inner_genres.id = ag.genre_id)'
1736
+
1737
+ GraphAlbum.many_to_many :inner_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_table_join_type=>:inner, :graph_join_type=>:right_outer
1738
+ GraphAlbum.eager_graph(:inner_genres).sql.should == 'SELECT albums.id, albums.band_id, inner_genres.id AS inner_genres_id FROM albums INNER JOIN ag ON (ag.album_id = albums.id) RIGHT OUTER JOIN genres AS inner_genres ON (inner_genres.id = ag.genre_id)'
1739
+ end
1740
+
1741
+ it "should respect the association's :conditions option" do
1742
+ GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :conditions=>{:active=>true}
1743
+ GraphAlbum.eager_graph(:active_band).sql.should == "SELECT albums.id, albums.band_id, active_band.id AS active_band_id, active_band.vocalist_id FROM albums LEFT OUTER JOIN bands AS active_band ON ((active_band.id = albums.band_id) AND (active_band.active IS TRUE))"
1744
+
1745
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :conditions=>{:id=>(0..100)}, :reciprocal=>nil
1746
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON ((right_tracks.album_id = albums.id) AND (right_tracks.id >= 0) AND (right_tracks.id <= 100))'
1747
+
1748
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :conditions=>{true=>:active}
1749
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS active_genres ON ((active_genres.id = ag.genre_id) AND ('t' = ag.active))"
1750
+ end
1751
+
1752
+ it "should respect the association's :graph_conditions option" do
1753
+ GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :graph_conditions=>{:active=>true}
1754
+ GraphAlbum.eager_graph(:active_band).sql.should == "SELECT albums.id, albums.band_id, active_band.id AS active_band_id, active_band.vocalist_id FROM albums LEFT OUTER JOIN bands AS active_band ON ((active_band.id = albums.band_id) AND (active_band.active IS TRUE))"
1755
+
1756
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_conditions=>{:id=>(0..100)}
1757
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON ((right_tracks.album_id = albums.id) AND (right_tracks.id >= 0) AND (right_tracks.id <= 100))'
1758
+
1759
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_conditions=>{true=>:active}
1760
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS active_genres ON ((active_genres.id = ag.genre_id) AND ('t' = ag.active))"
1761
+ end
1762
+
1763
+ it "should respect the association's :graph_join_table_conditions option" do
1764
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_table_conditions=>{:active=>true}
1765
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON ((ag.album_id = albums.id) AND (ag.active IS TRUE)) LEFT OUTER JOIN genres AS active_genres ON (active_genres.id = ag.genre_id)"
1766
+
1767
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_conditions=>{true=>:active}, :graph_join_table_conditions=>{true=>:active}
1768
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON ((ag.album_id = albums.id) AND ('t' = albums.active)) LEFT OUTER JOIN genres AS active_genres ON ((active_genres.id = ag.genre_id) AND ('t' = ag.active))"
1769
+ end
1770
+
1771
+ it "should respect the association's :graph_block option" do
1772
+ GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :graph_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :active)=>true}}
1773
+ GraphAlbum.eager_graph(:active_band).sql.should == "SELECT albums.id, albums.band_id, active_band.id AS active_band_id, active_band.vocalist_id FROM albums LEFT OUTER JOIN bands AS active_band ON ((active_band.id = albums.band_id) AND (active_band.active IS TRUE))"
1774
+
1775
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :id)=>(0..100)}}
1776
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON ((right_tracks.album_id = albums.id) AND (right_tracks.id >= 0) AND (right_tracks.id <= 100))'
1777
+
1778
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_block=>proc{|ja,lja,js| {true=>Sequel.qualify(lja, :active)}}
1779
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS active_genres ON ((active_genres.id = ag.genre_id) AND ('t' = ag.active))"
1780
+ end
1781
+
1782
+ it "should respect the association's :graph_join_table_block option" do
1783
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_table_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :active)=>true}}
1784
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON ((ag.album_id = albums.id) AND (ag.active IS TRUE)) LEFT OUTER JOIN genres AS active_genres ON (active_genres.id = ag.genre_id)"
1785
+
1786
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_block=>proc{|ja,lja,js| {true=>Sequel.qualify(lja, :active)}}, :graph_join_table_block=>proc{|ja,lja,js| {true=>Sequel.qualify(lja, :active)}}
1787
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON ((ag.album_id = albums.id) AND ('t' = albums.active)) LEFT OUTER JOIN genres AS active_genres ON ((active_genres.id = ag.genre_id) AND ('t' = ag.active))"
1788
+ end
1789
+
1790
+ it "should respect the association's :eager_grapher option" do
1791
+ GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :eager_grapher=>proc{|eo| eo[:self].graph(GraphBand, {:active=>true}, :table_alias=>eo[:table_alias], :join_type=>:inner)}
1792
+ GraphAlbum.eager_graph(:active_band).sql.should == "SELECT albums.id, albums.band_id, active_band.id AS active_band_id, active_band.vocalist_id FROM albums INNER JOIN bands AS active_band ON (active_band.active IS TRUE)"
1793
+
1794
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :eager_grapher=>proc{|eo| eo[:self].graph(GraphTrack, nil, :join_type=>:natural, :table_alias=>eo[:table_alias])}
1795
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums NATURAL JOIN tracks AS right_tracks'
1796
+
1797
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :eager_grapher=>proc{|eo| eo[:self].graph(:ag, {:album_id=>:id}, :table_alias=>:a123, :implicit_qualifier=>eo[:implicit_qualifier]).graph(GraphGenre, [:album_id], :table_alias=>eo[:table_alias])}
1798
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag AS a123 ON (a123.album_id = albums.id) LEFT OUTER JOIN genres AS active_genres USING (album_id)"
1799
+ end
1800
+
1801
+ it "should respect the association's :graph_only_conditions option" do
1802
+ GraphAlbum.many_to_one :active_band, :class=>'GraphBand', :key=>:band_id, :graph_only_conditions=>{:active=>true}
1803
+ GraphAlbum.eager_graph(:active_band).sql.should == "SELECT albums.id, albums.band_id, active_band.id AS active_band_id, active_band.vocalist_id FROM albums LEFT OUTER JOIN bands AS active_band ON (active_band.active IS TRUE)"
1804
+
1805
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_only_conditions=>nil, :graph_join_type=>:natural
1806
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums NATURAL JOIN tracks AS right_tracks'
1807
+
1808
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_only_conditions=>[:album_id]
1809
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS active_genres USING (album_id)"
1810
+ end
1811
+
1812
+ it "should respect the association's :graph_join_table_only_conditions option" do
1813
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_join_table_only_conditions=>{:active=>true}
1814
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON (ag.active IS TRUE) LEFT OUTER JOIN genres AS active_genres ON (active_genres.id = ag.genre_id)"
1815
+
1816
+ GraphAlbum.many_to_many :active_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :graph_only_conditions=>(Sequel.expr(:price) + 2 > 100), :graph_join_table_only_conditions=>"active"
1817
+ GraphAlbum.eager_graph(:active_genres).sql.should == "SELECT albums.id, albums.band_id, active_genres.id AS active_genres_id FROM albums LEFT OUTER JOIN ag ON (active) LEFT OUTER JOIN genres AS active_genres ON ((price + 2) > 100)"
1818
+ end
1819
+
1820
+ it "should create unique table aliases for all associations" do
1821
+ GraphAlbum.eager_graph(:previous_album=>{:previous_album=>:previous_album}).sql.should == "SELECT albums.id, albums.band_id, previous_album.id AS previous_album_id, previous_album.band_id AS previous_album_band_id, previous_album_0.id AS previous_album_0_id, previous_album_0.band_id AS previous_album_0_band_id, previous_album_1.id AS previous_album_1_id, previous_album_1.band_id AS previous_album_1_band_id FROM albums LEFT OUTER JOIN albums AS previous_album ON (previous_album.id = albums.previous_album_id) LEFT OUTER JOIN albums AS previous_album_0 ON (previous_album_0.id = previous_album.previous_album_id) LEFT OUTER JOIN albums AS previous_album_1 ON (previous_album_1.id = previous_album_0.previous_album_id)"
1822
+ end
1823
+
1824
+ it "should respect the association's :order" do
1825
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[:id, :album_id]
1826
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.id) ORDER BY right_tracks.id, right_tracks.album_id'
1827
+ end
1828
+
1829
+ it "should only qualify unqualified symbols, identifiers, or ordered versions in association's :order" do
1830
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[Sequel.identifier(:blah__id), Sequel.identifier(:blah__id).desc, Sequel.desc(:blah__id), :blah__id, :album_id, Sequel.desc(:album_id), 1, Sequel.lit('RANDOM()'), Sequel.qualify(:b, :a)]
1831
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.id) ORDER BY right_tracks.blah__id, right_tracks.blah__id DESC, blah.id DESC, blah.id, right_tracks.album_id, right_tracks.album_id DESC, 1, RANDOM(), b.a'
1832
+ end
1833
+
1834
+ it "should not respect the association's :order if :order_eager_graph is false" do
1835
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[:id, :album_id], :order_eager_graph=>false
1836
+ GraphAlbum.eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.id)'
1837
+ end
1838
+
1839
+ it "should add the association's :order to the existing order" do
1840
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[:id, :album_id]
1841
+ GraphAlbum.order(:band_id).eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.id) ORDER BY band_id, right_tracks.id, right_tracks.album_id'
1842
+ end
1843
+
1844
+ it "should use the association's :graph_order in preference or order" do
1845
+ GraphAlbum.one_to_many :right_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[:tracks__id, :tracks__album_id], :graph_order=>[:id, :album_id]
1846
+ GraphAlbum.order(:band_id).eager_graph(:right_tracks).sql.should == 'SELECT albums.id, albums.band_id, right_tracks.id AS right_tracks_id, right_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS right_tracks ON (right_tracks.album_id = albums.id) ORDER BY band_id, right_tracks.id, right_tracks.album_id'
1847
+ end
1848
+
1849
+ it "should add the association's :order for cascading associations" do
1850
+ GraphBand.one_to_many :a_albums, :class=>'GraphAlbum', :key=>:band_id, :order=>:name, :reciprocal=>nil
1851
+ GraphAlbum.one_to_many :b_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[:id, :album_id]
1852
+ GraphBand.eager_graph(:a_albums=>:b_tracks).sql.should == 'SELECT bands.id, bands.vocalist_id, a_albums.id AS a_albums_id, a_albums.band_id, b_tracks.id AS b_tracks_id, b_tracks.album_id FROM bands LEFT OUTER JOIN albums AS a_albums ON (a_albums.band_id = bands.id) LEFT OUTER JOIN tracks AS b_tracks ON (b_tracks.album_id = a_albums.id) ORDER BY a_albums.name, b_tracks.id, b_tracks.album_id'
1853
+ GraphAlbum.one_to_many :albums, :class=>'GraphAlbum', :key=>:band_id, :order=>[:band_id, :id]
1854
+ GraphAlbum.eager_graph(:albums=>{:albums=>:albums}).sql.should == 'SELECT albums.id, albums.band_id, albums_0.id AS albums_0_id, albums_0.band_id AS albums_0_band_id, albums_1.id AS albums_1_id, albums_1.band_id AS albums_1_band_id, albums_2.id AS albums_2_id, albums_2.band_id AS albums_2_band_id FROM albums LEFT OUTER JOIN albums AS albums_0 ON (albums_0.band_id = albums.id) LEFT OUTER JOIN albums AS albums_1 ON (albums_1.band_id = albums_0.id) LEFT OUTER JOIN albums AS albums_2 ON (albums_2.band_id = albums_1.id) ORDER BY albums_0.band_id, albums_0.id, albums_1.band_id, albums_1.id, albums_2.band_id, albums_2.id'
1855
+ end
1856
+
1857
+ it "should add the associations :order for multiple associations" do
1858
+ GraphAlbum.many_to_many :a_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :order=>:id
1859
+ GraphAlbum.one_to_many :b_tracks, :class=>'GraphTrack', :key=>:album_id, :order=>[:id, :album_id]
1860
+ GraphAlbum.eager_graph(:a_genres, :b_tracks).sql.should == 'SELECT albums.id, albums.band_id, a_genres.id AS a_genres_id, b_tracks.id AS b_tracks_id, b_tracks.album_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS a_genres ON (a_genres.id = ag.genre_id) LEFT OUTER JOIN tracks AS b_tracks ON (b_tracks.album_id = albums.id) ORDER BY a_genres.id, b_tracks.id, b_tracks.album_id'
1861
+ end
1862
+
1863
+ it "should use the correct qualifier when graphing multiple tables with extra conditions" do
1864
+ GraphAlbum.many_to_many :a_genres, :class=>'GraphGenre', :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag
1865
+ GraphAlbum.one_to_many :b_tracks, :class=>'GraphTrack', :key=>:album_id, :graph_conditions=>{:a=>:b}
1866
+ GraphAlbum.eager_graph(:a_genres, :b_tracks).sql.should == 'SELECT albums.id, albums.band_id, a_genres.id AS a_genres_id, b_tracks.id AS b_tracks_id, b_tracks.album_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS a_genres ON (a_genres.id = ag.genre_id) LEFT OUTER JOIN tracks AS b_tracks ON ((b_tracks.album_id = albums.id) AND (b_tracks.a = albums.b))'
1867
+ end
1868
+
1869
+ it "should eagerly load associated records for classes that do not have a primary key" do
1870
+ GraphAlbum.no_primary_key
1871
+ GraphGenre.no_primary_key
1872
+ GraphAlbum.many_to_many :inner_genres, :class=>'GraphGenre', :left_key=>:album_id, :left_primary_key=>:band_id, :right_key=>:genre_id, :right_primary_key=>:xxx, :join_table=>:ag
1873
+ ds = GraphAlbum.eager_graph(:inner_genres)
1874
+ ds.sql.should == 'SELECT albums.id, albums.band_id, inner_genres.id AS inner_genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.band_id) LEFT OUTER JOIN genres AS inner_genres ON (inner_genres.xxx = ag.genre_id)'
1875
+ ds._fetch = [{:id=>3, :band_id=>2, :inner_genres_id=>5, :xxx=>12}, {:id=>3, :band_id=>2, :inner_genres_id=>6, :xxx=>22}]
1876
+ as = ds.all
1877
+ as.should == [GraphAlbum.load(:id=>3, :band_id=>2)]
1878
+ as.first.inner_genres.should == [GraphGenre.load(:id=>5), GraphGenre.load(:id=>6)]
1879
+ GraphAlbum.set_primary_key :id
1880
+ GraphGenre.set_primary_key :id
1881
+ end
1882
+
1883
+ it "should handle eager loading with schemas and aliases of different types" do
1884
+ GraphAlbum.eager_graph(:band).join(:s__genres, [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1885
+ GraphAlbum.eager_graph(:band).join(Sequel.qualify(:s, :genres), [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1886
+ GraphAlbum.eager_graph(:band).join(Sequel.expr(:s__b).as('genres'), [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.b AS genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1887
+ GraphAlbum.eager_graph(:band).join(:s__b, [:b_id], :table_alias=>Sequel.identifier(:genres)).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN s.b AS genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1888
+ GraphAlbum.eager_graph(:band).join(Sequel.identifier(:genres), [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1889
+ GraphAlbum.eager_graph(:band).join('genres', [:b_id]).eager_graph(:genres).sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0, band.vocalist_id, genres_0.id AS genres_0_id FROM albums LEFT OUTER JOIN bands AS band ON (band.id = albums.band_id) INNER JOIN genres USING (b_id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS genres_0 ON (genres_0.id = ag.genre_id)'
1890
+ end
1891
+
1892
+ it "should raise errors if invalid aliases or table styles are used" do
1893
+ proc{GraphAlbum.from_self(:alias=>Sequel.qualify(:s, :bands)).eager_graph(:band)}.should raise_error(Sequel::Error)
1894
+ proc{GraphAlbum.from(Sequel.lit('?', :bands)).eager_graph(:band)}.should raise_error(Sequel::Error)
1895
+ end
1896
+
1897
+ it "should eagerly load schema qualified tables correctly with joins" do
1898
+ c1 = Class.new(GraphAlbum)
1899
+ c2 = Class.new(GraphGenre)
1900
+ ds = c1.dataset = c1.dataset.from(:s__a)
1901
+ def ds.columns() [:id] end
1902
+ c2.dataset = c2.dataset.from(:s__g)
1903
+ c1.many_to_many :a_genres, :class=>c2, :left_primary_key=>:id, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:s__ag
1904
+ ds = c1.join(:s__t, [:b_id]).eager_graph(:a_genres)
1905
+ ds.sql.should == 'SELECT a.id, a_genres.id AS a_genres_id FROM (SELECT * FROM s.a INNER JOIN s.t USING (b_id)) AS a LEFT OUTER JOIN s.ag AS ag ON (ag.album_id = a.id) LEFT OUTER JOIN s.g AS a_genres ON (a_genres.id = ag.genre_id)'
1906
+ ds = c1.eager_graph(:a_genres)
1907
+ ds.sql.should == 'SELECT s.a.id, a_genres.id AS a_genres_id FROM s.a LEFT OUTER JOIN s.ag AS ag ON (ag.album_id = s.a.id) LEFT OUTER JOIN s.g AS a_genres ON (a_genres.id = ag.genre_id)'
1908
+ end
1909
+
1910
+ it "should respect :after_load callbacks on associations when eager graphing" do
1911
+ GraphAlbum.many_to_one :al_band, :class=>GraphBand, :key=>:band_id, :after_load=>proc{|o, a| a.id *=2}
1912
+ GraphAlbum.one_to_many :al_tracks, :class=>GraphTrack, :key=>:album_id, :after_load=>proc{|o, os| os.each{|a| a.id *=2}}
1913
+ GraphAlbum.many_to_many :al_genres, :class=>GraphGenre, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :after_load=>proc{|o, os| os.each{|a| a.id *=2}}
1914
+ ds = GraphAlbum.eager_graph(:al_band, :al_tracks, :al_genres)
1915
+ ds.sql.should == "SELECT albums.id, albums.band_id, al_band.id AS al_band_id, al_band.vocalist_id, al_tracks.id AS al_tracks_id, al_tracks.album_id, al_genres.id AS al_genres_id FROM albums LEFT OUTER JOIN bands AS al_band ON (al_band.id = albums.band_id) LEFT OUTER JOIN tracks AS al_tracks ON (al_tracks.album_id = albums.id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS al_genres ON (al_genres.id = ag.genre_id)"
1916
+ ds._fetch = {:id=>1, :band_id=>2, :al_band_id=>3, :vocalist_id=>4, :al_tracks_id=>5, :album_id=>6, :al_genres_id=>7}
1917
+ a = ds.all.first
1918
+ a.should == GraphAlbum.load(:id => 1, :band_id => 2)
1919
+ a.al_band.should == GraphBand.load(:id=>6, :vocalist_id=>4)
1920
+ a.al_tracks.should == [GraphTrack.load(:id=>10, :album_id=>6)]
1921
+ a.al_genres.should == [GraphGenre.load(:id=>14)]
1922
+ end
1923
+
1924
+ it "should respect limits on associations when eager graphing" do
1925
+ GraphAlbum.many_to_one :al_band, :class=>GraphBand, :key=>:band_id
1926
+ GraphAlbum.one_to_many :al_tracks, :class=>GraphTrack, :key=>:album_id, :limit=>2
1927
+ GraphAlbum.many_to_many :al_genres, :class=>GraphGenre, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>2
1928
+ ds = GraphAlbum.eager_graph(:al_band, :al_tracks, :al_genres)
1929
+ ds.sql.should == "SELECT albums.id, albums.band_id, al_band.id AS al_band_id, al_band.vocalist_id, al_tracks.id AS al_tracks_id, al_tracks.album_id, al_genres.id AS al_genres_id FROM albums LEFT OUTER JOIN bands AS al_band ON (al_band.id = albums.band_id) LEFT OUTER JOIN tracks AS al_tracks ON (al_tracks.album_id = albums.id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS al_genres ON (al_genres.id = ag.genre_id)"
1930
+ ds._fetch = [{:id=>1, :band_id=>2, :al_band_id=>3, :vocalist_id=>4, :al_tracks_id=>5, :album_id=>6, :al_genres_id=>7},
1931
+ {:id=>1, :band_id=>2, :al_band_id=>8, :vocalist_id=>9, :al_tracks_id=>10, :album_id=>11, :al_genres_id=>12},
1932
+ {:id=>1, :band_id=>2, :al_band_id=>13, :vocalist_id=>14, :al_tracks_id=>15, :album_id=>16, :al_genres_id=>17}]
1933
+ a = ds.all.first
1934
+ a.should == GraphAlbum.load(:id => 1, :band_id => 2)
1935
+ a.al_band.should == GraphBand.load(:id=>3, :vocalist_id=>4)
1936
+ a.al_tracks.should == [GraphTrack.load(:id=>5, :album_id=>6), GraphTrack.load(:id=>10, :album_id=>11)]
1937
+ a.al_genres.should == [GraphGenre.load(:id=>7), GraphGenre.load(:id=>12)]
1938
+ end
1939
+
1940
+ it "should handle offsets on associations with no results when eager graphing" do
1941
+ GraphAlbum.one_to_many :al_tracks, :class=>GraphTrack, :key=>:album_id, :limit=>[2, 1]
1942
+ ds = GraphAlbum.eager_graph(:al_tracks)
1943
+ ds.sql.should == "SELECT albums.id, albums.band_id, al_tracks.id AS al_tracks_id, al_tracks.album_id FROM albums LEFT OUTER JOIN tracks AS al_tracks ON (al_tracks.album_id = albums.id)"
1944
+ ds._fetch = [{:id=>1, :band_id=>2, :al_tracks_id=>nil, :album_id=>nil}]
1945
+ a = ds.all.first
1946
+ a.should == GraphAlbum.load(:id => 1, :band_id => 2)
1947
+ a.al_tracks.should == []
1948
+ end
1949
+
1950
+ it "should respect offsets on associations when eager graphing" do
1951
+ GraphAlbum.many_to_one :al_band, :class=>GraphBand, :key=>:band_id
1952
+ GraphAlbum.one_to_many :al_tracks, :class=>GraphTrack, :key=>:album_id, :limit=>[1, 1]
1953
+ GraphAlbum.many_to_many :al_genres, :class=>GraphGenre, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>[1,1]
1954
+ ds = GraphAlbum.eager_graph(:al_band, :al_tracks, :al_genres)
1955
+ ds.sql.should == "SELECT albums.id, albums.band_id, al_band.id AS al_band_id, al_band.vocalist_id, al_tracks.id AS al_tracks_id, al_tracks.album_id, al_genres.id AS al_genres_id FROM albums LEFT OUTER JOIN bands AS al_band ON (al_band.id = albums.band_id) LEFT OUTER JOIN tracks AS al_tracks ON (al_tracks.album_id = albums.id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS al_genres ON (al_genres.id = ag.genre_id)"
1956
+ ds._fetch = [{:id=>1, :band_id=>2, :al_band_id=>3, :vocalist_id=>4, :al_tracks_id=>5, :album_id=>6, :al_genres_id=>7},
1957
+ {:id=>1, :band_id=>2, :al_band_id=>8, :vocalist_id=>9, :al_tracks_id=>10, :album_id=>11, :al_genres_id=>12},
1958
+ {:id=>1, :band_id=>2, :al_band_id=>13, :vocalist_id=>14, :al_tracks_id=>15, :album_id=>16, :al_genres_id=>17}]
1959
+ a = ds.all.first
1960
+ a.should == GraphAlbum.load(:id => 1, :band_id => 2)
1961
+ a.al_band.should == GraphBand.load(:id=>3, :vocalist_id=>4)
1962
+ a.al_tracks.should == [GraphTrack.load(:id=>10, :album_id=>11)]
1963
+ a.al_genres.should == [GraphGenre.load(:id=>12)]
1964
+ end
1965
+
1966
+ it "should respect offsets on associations when eager graphing one_to_one and one_through_one associations" do
1967
+ GraphAlbum.many_to_one :al_band, :class=>GraphBand, :key=>:band_id
1968
+ GraphAlbum.one_to_one :al_track, :class=>GraphTrack, :key=>:album_id, :limit=>[nil, 1]
1969
+ GraphAlbum.one_through_one :al_genre, :class=>GraphGenre, :left_key=>:album_id, :right_key=>:genre_id, :join_table=>:ag, :limit=>[nil,1]
1970
+ ds = GraphAlbum.eager_graph(:al_band, :al_track, :al_genre)
1971
+ ds.sql.should == "SELECT albums.id, albums.band_id, al_band.id AS al_band_id, al_band.vocalist_id, al_track.id AS al_track_id, al_track.album_id, al_genre.id AS al_genre_id FROM albums LEFT OUTER JOIN bands AS al_band ON (al_band.id = albums.band_id) LEFT OUTER JOIN tracks AS al_track ON (al_track.album_id = albums.id) LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN genres AS al_genre ON (al_genre.id = ag.genre_id)"
1972
+ ds._fetch = [{:id=>1, :band_id=>2, :al_band_id=>3, :vocalist_id=>4, :al_track_id=>5, :album_id=>6, :al_genre_id=>7},
1973
+ {:id=>1, :band_id=>2, :al_band_id=>8, :vocalist_id=>9, :al_track_id=>10, :album_id=>11, :al_genre_id=>12},
1974
+ {:id=>1, :band_id=>2, :al_band_id=>13, :vocalist_id=>14, :al_track_id=>15, :album_id=>16, :al_genre_id=>17}]
1975
+ a = ds.all.first
1976
+ a.should == GraphAlbum.load(:id => 1, :band_id => 2)
1977
+ a.al_band.should == GraphBand.load(:id=>3, :vocalist_id=>4)
1978
+ a.al_track.should == GraphTrack.load(:id=>10, :album_id=>11)
1979
+ a.al_genre.should == GraphGenre.load(:id=>12)
1980
+ end
1981
+
1982
+ it "should eagerly load a many_to_one association with a custom callback" do
1983
+ ds = GraphAlbum.eager_graph(:band => proc {|ds1| ds1.select(:id).columns(:id)})
1984
+ ds.sql.should == 'SELECT albums.id, albums.band_id, band.id AS band_id_0 FROM albums LEFT OUTER JOIN (SELECT id FROM bands) AS band ON (band.id = albums.band_id)'
1985
+ ds._fetch = {:id=>1, :band_id=>2, :band_id_0=>2}
1986
+ a = ds.all
1987
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1988
+ a.first.band.should == GraphBand.load(:id => 2)
1989
+ end
1990
+
1991
+ it "should eagerly load a one_to_one association with a custom callback" do
1992
+ ds = GraphAlbum.eager_graph(:track => proc {|ds1| ds1.select(:album_id).columns(:album_id)})
1993
+ ds.sql.should == 'SELECT albums.id, albums.band_id, track.album_id FROM albums LEFT OUTER JOIN (SELECT album_id FROM tracks) AS track ON (track.album_id = albums.id)'
1994
+ ds._fetch = {:id=>1, :band_id=>2, :album_id=>1}
1995
+ a = ds.all
1996
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
1997
+ a.first.track.should == GraphTrack.load(:album_id=>1)
1998
+ end
1999
+
2000
+ it "should eagerly load a one_to_many association with a custom callback" do
2001
+ ds = GraphAlbum.eager_graph(:tracks => proc {|ds1| ds1.select(:album_id).columns(:album_id)})
2002
+ ds.sql.should == 'SELECT albums.id, albums.band_id, tracks.album_id FROM albums LEFT OUTER JOIN (SELECT album_id FROM tracks) AS tracks ON (tracks.album_id = albums.id)'
2003
+ ds._fetch = {:id=>1, :band_id=>2, :album_id=>1}
2004
+ a = ds.all
2005
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
2006
+ a.first.tracks.should == [GraphTrack.load(:album_id=>1)]
2007
+ end
2008
+
2009
+ it "should eagerly load a one_through_one association with a custom callback" do
2010
+ ds = GraphAlbum.eager_graph(:genre => proc {|ds1| ds1.select(:id).columns(:id)})
2011
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genre.id AS genre_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN (SELECT id FROM genres) AS genre ON (genre.id = ag.genre_id)'
2012
+ ds._fetch = {:id=>1, :band_id=>2, :genre_id=>4}
2013
+ a = ds.all
2014
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
2015
+ a.first.genre.should == GraphGenre.load(:id => 4)
2016
+ end
2017
+
2018
+ it "should eagerly load a many_to_many association with a custom callback" do
2019
+ ds = GraphAlbum.eager_graph(:genres => proc {|ds1| ds1.select(:id).columns(:id)})
2020
+ ds.sql.should == 'SELECT albums.id, albums.band_id, genres.id AS genres_id FROM albums LEFT OUTER JOIN ag ON (ag.album_id = albums.id) LEFT OUTER JOIN (SELECT id FROM genres) AS genres ON (genres.id = ag.genre_id)'
2021
+ ds._fetch = {:id=>1, :band_id=>2, :genres_id=>4}
2022
+ a = ds.all
2023
+ a.should == [GraphAlbum.load(:id => 1, :band_id => 2)]
2024
+ a.first.genres.should == [GraphGenre.load(:id => 4)]
2025
+ end
2026
+
2027
+ it "should allow cascading of eager loading with a custom callback with hash value" do
2028
+ ds = GraphTrack.eager_graph(:album=>{proc{|ds1| ds1.select(:id, :band_id).columns(:id, :band_id)}=>{:band=>:members}})
2029
+ ds.sql.should == 'SELECT tracks.id, tracks.album_id, album.id AS album_id_0, album.band_id, band.id AS band_id_0, band.vocalist_id, members.id AS members_id FROM tracks LEFT OUTER JOIN (SELECT id, band_id FROM albums) AS album ON (album.id = tracks.album_id) LEFT OUTER JOIN bands AS band ON (band.id = album.band_id) LEFT OUTER JOIN bm ON (bm.band_id = band.id) LEFT OUTER JOIN members ON (members.id = bm.member_id)'
2030
+ ds._fetch = {:id=>3, :album_id=>1, :album_id_0=>1, :band_id=>2, :members_id=>5, :band_id_0=>2, :vocalist_id=>6}
2031
+ a = ds.all
2032
+ a.should == [GraphTrack.load(:id => 3, :album_id => 1)]
2033
+ a = a.first
2034
+ a.album.should == GraphAlbum.load(:id => 1, :band_id => 2)
2035
+ a.album.band.should == GraphBand.load(:id => 2, :vocalist_id=>6)
2036
+ a.album.band.members.should == [GraphBandMember.load(:id => 5)]
2037
+ end
2038
+
2039
+ it "should allow cascading of eager loading with a custom callback with array value" do
2040
+ ds = GraphTrack.eager_graph(:album=>{proc{|ds1| ds1.select(:id, :band_id).columns(:id, :band_id)}=>[:band, :tracks]})
2041
+ ds.sql.should == 'SELECT tracks.id, tracks.album_id, album.id AS album_id_0, album.band_id, band.id AS band_id_0, band.vocalist_id, tracks_0.id AS tracks_0_id, tracks_0.album_id AS tracks_0_album_id FROM tracks LEFT OUTER JOIN (SELECT id, band_id FROM albums) AS album ON (album.id = tracks.album_id) LEFT OUTER JOIN bands AS band ON (band.id = album.band_id) LEFT OUTER JOIN tracks AS tracks_0 ON (tracks_0.album_id = album.id)'
2042
+ ds._fetch = {:id=>3, :album_id=>1, :album_id_0=>1, :band_id=>2, :band_id_0=>2, :vocalist_id=>6, :tracks_0_id=>3, :tracks_0_album_id=>1}
2043
+ a = ds.all
2044
+ a.should == [GraphTrack.load(:id => 3, :album_id => 1)]
2045
+ a = a.first
2046
+ a.album.should == GraphAlbum.load(:id => 1, :band_id => 2)
2047
+ a.album.band.should == GraphBand.load(:id => 2, :vocalist_id=>6)
2048
+ a.album.tracks.should == [GraphTrack.load(:id => 3, :album_id => 1)]
2049
+ end
2050
+ end
2051
+
2052
+ describe "Sequel::Models with double underscores in table names" do
2053
+ before do
2054
+ @db = Sequel.mock(:fetch=>{:id=>1, :foo_id=>2})
2055
+ @Foo = Class.new(Sequel::Model(@db[Sequel.identifier(:fo__os)]))
2056
+ @Foo.columns :id, :foo_id
2057
+ @Foo.one_to_many :foos, :class=>@Foo
2058
+ @db.sqls
2059
+ end
2060
+
2061
+ it "should have working eager_graph implementations" do
2062
+ @db.fetch = {:id=>1, :foo_id=>1, :foos_id=>1, :foos_foo_id=>1}
2063
+ foos = @Foo.eager_graph(:foos).all
2064
+ @db.sqls.should == ["SELECT fo__os.id, fo__os.foo_id, foos.id AS foos_id, foos.foo_id AS foos_foo_id FROM fo__os LEFT OUTER JOIN (SELECT * FROM fo__os) AS foos ON (foos._id = fo__os.id)"]
2065
+ foos.should == [@Foo.load(:id=>1, :foo_id=>1)]
2066
+ foos.first.foos.should == [@Foo.load(:id=>1, :foo_id=>1)]
2067
+ end
2068
+
2069
+ it "should have working eager_graph implementations when qualified" do
2070
+ @Foo.dataset = Sequel.identifier(:fo__os).qualify(:s)
2071
+ @Foo.columns :id, :foo_id
2072
+ @db.sqls
2073
+ @db.fetch = {:id=>1, :foo_id=>1, :foos_id=>1, :foos_foo_id=>1}
2074
+ foos = @Foo.eager_graph(:foos).all
2075
+ @db.sqls.should == ["SELECT s.fo__os.id, s.fo__os.foo_id, foos.id AS foos_id, foos.foo_id AS foos_foo_id FROM s.fo__os LEFT OUTER JOIN (SELECT * FROM s.fo__os) AS foos ON (foos._id = s.fo__os.id)"]
2076
+ foos.should == [@Foo.load(:id=>1, :foo_id=>1)]
2077
+ foos.first.foos.should == [@Foo.load(:id=>1, :foo_id=>1)]
2078
+ end
2079
+ end
2080
+