switchman 1.5.0 → 1.5.3

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 (667) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/switchman/shard.rb +11 -653
  3. data/app/models/switchman/shard_internal.rb +658 -0
  4. data/lib/switchman/active_record/connection_handler.rb +0 -1
  5. data/lib/switchman/engine.rb +7 -3
  6. data/lib/switchman/version.rb +1 -1
  7. metadata +19 -1323
  8. data/spec/dummy/Rakefile +0 -7
  9. data/spec/dummy/app/models/appendage.rb +0 -22
  10. data/spec/dummy/app/models/digit.rb +0 -7
  11. data/spec/dummy/app/models/face.rb +0 -3
  12. data/spec/dummy/app/models/feature.rb +0 -3
  13. data/spec/dummy/app/models/mirror_user.rb +0 -5
  14. data/spec/dummy/app/models/root.rb +0 -5
  15. data/spec/dummy/app/models/user.rb +0 -29
  16. data/spec/dummy/config/application.rb +0 -48
  17. data/spec/dummy/config/boot.rb +0 -10
  18. data/spec/dummy/config/database.yml +0 -21
  19. data/spec/dummy/config/database.yml.example +0 -25
  20. data/spec/dummy/config/database.yml.travis +0 -4
  21. data/spec/dummy/config/environment.rb +0 -5
  22. data/spec/dummy/config/environments/development.rb +0 -26
  23. data/spec/dummy/config/environments/production.rb +0 -66
  24. data/spec/dummy/config/environments/test.rb +0 -28
  25. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  26. data/spec/dummy/config/initializers/migrations_path.rb +0 -5
  27. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  28. data/spec/dummy/config/initializers/session_store.rb +0 -8
  29. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  30. data/spec/dummy/config/routes.rb +0 -8
  31. data/spec/dummy/config.ru +0 -4
  32. data/spec/dummy/db/development.sqlite3 +0 -0
  33. data/spec/dummy/db/migrate/20130403132607_create_users.rb +0 -10
  34. data/spec/dummy/db/migrate/20130411202442_create_appendages.rb +0 -10
  35. data/spec/dummy/db/migrate/20130411202551_create_mirror_users.rb +0 -9
  36. data/spec/dummy/db/migrate/20131022202028_create_digits.rb +0 -10
  37. data/spec/dummy/db/migrate/20131206172923_create_features.rb +0 -12
  38. data/spec/dummy/db/migrate/20140123154135_add_parent_id_to_users.rb +0 -5
  39. data/spec/dummy/db/migrate/20140219183820_create_roots.rb +0 -9
  40. data/spec/dummy/db/migrate/20150618035859_add_dummy_foreign_key.rb +0 -5
  41. data/spec/dummy/db/migrate/20160122150718_create_faces.rb +0 -9
  42. data/spec/dummy/db/schema.rb +0 -74
  43. data/spec/dummy/db/shard_1006.sqlite3 +0 -0
  44. data/spec/dummy/db/shard_101.sqlite3 +0 -0
  45. data/spec/dummy/db/shard_1020.sqlite3 +0 -0
  46. data/spec/dummy/db/shard_1038.sqlite3 +0 -0
  47. data/spec/dummy/db/shard_1051.sqlite3 +0 -0
  48. data/spec/dummy/db/shard_1067.sqlite3 +0 -0
  49. data/spec/dummy/db/shard_1083.sqlite3 +0 -0
  50. data/spec/dummy/db/shard_1088.sqlite3 +0 -0
  51. data/spec/dummy/db/shard_1093.sqlite3 +0 -0
  52. data/spec/dummy/db/shard_1119.sqlite3 +0 -0
  53. data/spec/dummy/db/shard_1124.sqlite3 +0 -0
  54. data/spec/dummy/db/shard_1126.sqlite3 +0 -0
  55. data/spec/dummy/db/shard_1147.sqlite3 +0 -0
  56. data/spec/dummy/db/shard_1156.sqlite3 +0 -0
  57. data/spec/dummy/db/shard_117.sqlite3 +0 -0
  58. data/spec/dummy/db/shard_1173.sqlite3 +0 -0
  59. data/spec/dummy/db/shard_1186.sqlite3 +0 -0
  60. data/spec/dummy/db/shard_120.sqlite3 +0 -0
  61. data/spec/dummy/db/shard_1206.sqlite3 +0 -0
  62. data/spec/dummy/db/shard_1220.sqlite3 +0 -0
  63. data/spec/dummy/db/shard_1248.sqlite3 +0 -0
  64. data/spec/dummy/db/shard_1259.sqlite3 +0 -0
  65. data/spec/dummy/db/shard_1276.sqlite3 +0 -0
  66. data/spec/dummy/db/shard_1286.sqlite3 +0 -0
  67. data/spec/dummy/db/shard_1297.sqlite3 +0 -0
  68. data/spec/dummy/db/shard_1309.sqlite3 +0 -0
  69. data/spec/dummy/db/shard_1330.sqlite3 +0 -0
  70. data/spec/dummy/db/shard_1345.sqlite3 +0 -0
  71. data/spec/dummy/db/shard_1361.sqlite3 +0 -0
  72. data/spec/dummy/db/shard_1377.sqlite3 +0 -0
  73. data/spec/dummy/db/shard_1384.sqlite3 +0 -0
  74. data/spec/dummy/db/shard_1392.sqlite3 +0 -0
  75. data/spec/dummy/db/shard_1422.sqlite3 +0 -0
  76. data/spec/dummy/db/shard_143.sqlite3 +0 -0
  77. data/spec/dummy/db/shard_1446.sqlite3 +0 -0
  78. data/spec/dummy/db/shard_1463.sqlite3 +0 -0
  79. data/spec/dummy/db/shard_1481.sqlite3 +0 -0
  80. data/spec/dummy/db/shard_1493.sqlite3 +0 -0
  81. data/spec/dummy/db/shard_1508.sqlite3 +0 -0
  82. data/spec/dummy/db/shard_1517.sqlite3 +0 -0
  83. data/spec/dummy/db/shard_1528.sqlite3 +0 -0
  84. data/spec/dummy/db/shard_1542.sqlite3 +0 -0
  85. data/spec/dummy/db/shard_1553.sqlite3 +0 -0
  86. data/spec/dummy/db/shard_156.sqlite3 +0 -0
  87. data/spec/dummy/db/shard_1588.sqlite3 +0 -0
  88. data/spec/dummy/db/shard_1596.sqlite3 +0 -0
  89. data/spec/dummy/db/shard_1609.sqlite3 +0 -0
  90. data/spec/dummy/db/shard_1630.sqlite3 +0 -0
  91. data/spec/dummy/db/shard_1643.sqlite3 +0 -0
  92. data/spec/dummy/db/shard_1652.sqlite3 +0 -0
  93. data/spec/dummy/db/shard_1658.sqlite3 +0 -0
  94. data/spec/dummy/db/shard_1679.sqlite3 +0 -0
  95. data/spec/dummy/db/shard_170.sqlite3 +0 -0
  96. data/spec/dummy/db/shard_1700.sqlite3 +0 -0
  97. data/spec/dummy/db/shard_1703.sqlite3 +0 -0
  98. data/spec/dummy/db/shard_1721.sqlite3 +0 -0
  99. data/spec/dummy/db/shard_1733.sqlite3 +0 -0
  100. data/spec/dummy/db/shard_1746.sqlite3 +0 -0
  101. data/spec/dummy/db/shard_1759.sqlite3 +0 -0
  102. data/spec/dummy/db/shard_1783.sqlite3 +0 -0
  103. data/spec/dummy/db/shard_1809.sqlite3 +0 -0
  104. data/spec/dummy/db/shard_1846.sqlite3 +0 -0
  105. data/spec/dummy/db/shard_1872.sqlite3 +0 -0
  106. data/spec/dummy/db/shard_1881.sqlite3 +0 -0
  107. data/spec/dummy/db/shard_19.sqlite3 +0 -0
  108. data/spec/dummy/db/shard_1906.sqlite3 +0 -0
  109. data/spec/dummy/db/shard_191.sqlite3 +0 -0
  110. data/spec/dummy/db/shard_193.sqlite3 +0 -0
  111. data/spec/dummy/db/shard_1934.sqlite3 +0 -0
  112. data/spec/dummy/db/shard_1981.sqlite3 +0 -0
  113. data/spec/dummy/db/shard_2.sqlite3 +0 -0
  114. data/spec/dummy/db/shard_2006.sqlite3 +0 -0
  115. data/spec/dummy/db/shard_2013.sqlite3 +0 -0
  116. data/spec/dummy/db/shard_2041.sqlite3 +0 -0
  117. data/spec/dummy/db/shard_206.sqlite3 +0 -0
  118. data/spec/dummy/db/shard_2086.sqlite3 +0 -0
  119. data/spec/dummy/db/shard_2097.sqlite3 +0 -0
  120. data/spec/dummy/db/shard_2132.sqlite3 +0 -0
  121. data/spec/dummy/db/shard_2158.sqlite3 +0 -0
  122. data/spec/dummy/db/shard_2193.sqlite3 +0 -0
  123. data/spec/dummy/db/shard_2203.sqlite3 +0 -0
  124. data/spec/dummy/db/shard_2256.sqlite3 +0 -0
  125. data/spec/dummy/db/shard_23.sqlite3 +0 -0
  126. data/spec/dummy/db/shard_2301.sqlite3 +0 -0
  127. data/spec/dummy/db/shard_2336.sqlite3 +0 -0
  128. data/spec/dummy/db/shard_234.sqlite3 +0 -0
  129. data/spec/dummy/db/shard_235.sqlite3 +0 -0
  130. data/spec/dummy/db/shard_2360.sqlite3 +0 -0
  131. data/spec/dummy/db/shard_2385.sqlite3 +0 -0
  132. data/spec/dummy/db/shard_2406.sqlite3 +0 -0
  133. data/spec/dummy/db/shard_2452.sqlite3 +0 -0
  134. data/spec/dummy/db/shard_2465.sqlite3 +0 -0
  135. data/spec/dummy/db/shard_248.sqlite3 +0 -0
  136. data/spec/dummy/db/shard_2507.sqlite3 +0 -0
  137. data/spec/dummy/db/shard_2515.sqlite3 +0 -0
  138. data/spec/dummy/db/shard_2557.sqlite3 +0 -0
  139. data/spec/dummy/db/shard_257.sqlite3 +0 -0
  140. data/spec/dummy/db/shard_2580.sqlite3 +0 -0
  141. data/spec/dummy/db/shard_2598.sqlite3 +0 -0
  142. data/spec/dummy/db/shard_2626.sqlite3 +0 -0
  143. data/spec/dummy/db/shard_2672.sqlite3 +0 -0
  144. data/spec/dummy/db/shard_2681.sqlite3 +0 -0
  145. data/spec/dummy/db/shard_270.sqlite3 +0 -0
  146. data/spec/dummy/db/shard_2754.sqlite3 +0 -0
  147. data/spec/dummy/db/shard_277.sqlite3 +0 -0
  148. data/spec/dummy/db/shard_2790.sqlite3 +0 -0
  149. data/spec/dummy/db/shard_2803.sqlite3 +0 -0
  150. data/spec/dummy/db/shard_2834.sqlite3 +0 -0
  151. data/spec/dummy/db/shard_2862.sqlite3 +0 -0
  152. data/spec/dummy/db/shard_2897.sqlite3 +0 -0
  153. data/spec/dummy/db/shard_2928.sqlite3 +0 -0
  154. data/spec/dummy/db/shard_2951.sqlite3 +0 -0
  155. data/spec/dummy/db/shard_2970.sqlite3 +0 -0
  156. data/spec/dummy/db/shard_3009.sqlite3 +0 -0
  157. data/spec/dummy/db/shard_304.sqlite3 +0 -0
  158. data/spec/dummy/db/shard_3046.sqlite3 +0 -0
  159. data/spec/dummy/db/shard_3071.sqlite3 +0 -0
  160. data/spec/dummy/db/shard_311.sqlite3 +0 -0
  161. data/spec/dummy/db/shard_3114.sqlite3 +0 -0
  162. data/spec/dummy/db/shard_3157.sqlite3 +0 -0
  163. data/spec/dummy/db/shard_3234.sqlite3 +0 -0
  164. data/spec/dummy/db/shard_324.sqlite3 +0 -0
  165. data/spec/dummy/db/shard_3288.sqlite3 +0 -0
  166. data/spec/dummy/db/shard_333.sqlite3 +0 -0
  167. data/spec/dummy/db/shard_3352.sqlite3 +0 -0
  168. data/spec/dummy/db/shard_3380.sqlite3 +0 -0
  169. data/spec/dummy/db/shard_342.sqlite3 +0 -0
  170. data/spec/dummy/db/shard_3424.sqlite3 +0 -0
  171. data/spec/dummy/db/shard_3442.sqlite3 +0 -0
  172. data/spec/dummy/db/shard_3460.sqlite3 +0 -0
  173. data/spec/dummy/db/shard_347.sqlite3 +0 -0
  174. data/spec/dummy/db/shard_3488.sqlite3 +0 -0
  175. data/spec/dummy/db/shard_3524.sqlite3 +0 -0
  176. data/spec/dummy/db/shard_3554.sqlite3 +0 -0
  177. data/spec/dummy/db/shard_3594.sqlite3 +0 -0
  178. data/spec/dummy/db/shard_3611.sqlite3 +0 -0
  179. data/spec/dummy/db/shard_3639.sqlite3 +0 -0
  180. data/spec/dummy/db/shard_3661.sqlite3 +0 -0
  181. data/spec/dummy/db/shard_3689.sqlite3 +0 -0
  182. data/spec/dummy/db/shard_3749.sqlite3 +0 -0
  183. data/spec/dummy/db/shard_375.sqlite3 +0 -0
  184. data/spec/dummy/db/shard_3792.sqlite3 +0 -0
  185. data/spec/dummy/db/shard_3819.sqlite3 +0 -0
  186. data/spec/dummy/db/shard_385.sqlite3 +0 -0
  187. data/spec/dummy/db/shard_3866.sqlite3 +0 -0
  188. data/spec/dummy/db/shard_389.sqlite3 +0 -0
  189. data/spec/dummy/db/shard_3897.sqlite3 +0 -0
  190. data/spec/dummy/db/shard_405.sqlite3 +0 -0
  191. data/spec/dummy/db/shard_427.sqlite3 +0 -0
  192. data/spec/dummy/db/shard_428.sqlite3 +0 -0
  193. data/spec/dummy/db/shard_441.sqlite3 +0 -0
  194. data/spec/dummy/db/shard_452.sqlite3 +0 -0
  195. data/spec/dummy/db/shard_462.sqlite3 +0 -0
  196. data/spec/dummy/db/shard_472.sqlite3 +0 -0
  197. data/spec/dummy/db/shard_483.sqlite3 +0 -0
  198. data/spec/dummy/db/shard_49.sqlite3 +0 -0
  199. data/spec/dummy/db/shard_505.sqlite3 +0 -0
  200. data/spec/dummy/db/shard_508.sqlite3 +0 -0
  201. data/spec/dummy/db/shard_531.sqlite3 +0 -0
  202. data/spec/dummy/db/shard_554.sqlite3 +0 -0
  203. data/spec/dummy/db/shard_577.sqlite3 +0 -0
  204. data/spec/dummy/db/shard_58.sqlite3 +0 -0
  205. data/spec/dummy/db/shard_600.sqlite3 +0 -0
  206. data/spec/dummy/db/shard_623.sqlite3 +0 -0
  207. data/spec/dummy/db/shard_646.sqlite3 +0 -0
  208. data/spec/dummy/db/shard_668.sqlite3 +0 -0
  209. data/spec/dummy/db/shard_680.sqlite3 +0 -0
  210. data/spec/dummy/db/shard_698.sqlite3 +0 -0
  211. data/spec/dummy/db/shard_708.sqlite3 +0 -0
  212. data/spec/dummy/db/shard_727.sqlite3 +0 -0
  213. data/spec/dummy/db/shard_735.sqlite3 +0 -0
  214. data/spec/dummy/db/shard_74.sqlite3 +0 -0
  215. data/spec/dummy/db/shard_753.sqlite3 +0 -0
  216. data/spec/dummy/db/shard_76.sqlite3 +0 -0
  217. data/spec/dummy/db/shard_766.sqlite3 +0 -0
  218. data/spec/dummy/db/shard_778.sqlite3 +0 -0
  219. data/spec/dummy/db/shard_802.sqlite3 +0 -0
  220. data/spec/dummy/db/shard_818.sqlite3 +0 -0
  221. data/spec/dummy/db/shard_827.sqlite3 +0 -0
  222. data/spec/dummy/db/shard_869.sqlite3 +0 -0
  223. data/spec/dummy/db/shard_887.sqlite3 +0 -0
  224. data/spec/dummy/db/shard_895.sqlite3 +0 -0
  225. data/spec/dummy/db/shard_923.sqlite3 +0 -0
  226. data/spec/dummy/db/shard_930.sqlite3 +0 -0
  227. data/spec/dummy/db/shard_948.sqlite3 +0 -0
  228. data/spec/dummy/db/shard_953.sqlite3 +0 -0
  229. data/spec/dummy/db/shard_955.sqlite3 +0 -0
  230. data/spec/dummy/db/shard_982.sqlite3 +0 -0
  231. data/spec/dummy/db/shard_988.sqlite3 +0 -0
  232. data/spec/dummy/db/shard_989.sqlite3 +0 -0
  233. data/spec/dummy/db/test.sqlite3 +0 -0
  234. data/spec/dummy/log/development.log +0 -153
  235. data/spec/dummy/log/test.log +0 -21720
  236. data/spec/dummy/script/rails +0 -6
  237. data/spec/dummy/tmp/cache/316/980/shard%2F15 +0 -1
  238. data/spec/dummy/tmp/cache/319/A10/shard%2F72 +0 -1
  239. data/spec/dummy/tmp/cache/31A/A30/shard%2F82 +0 -0
  240. data/spec/dummy/tmp/cache/31B/A40/shard%2F83 +0 -0
  241. data/spec/dummy/tmp/cache/31C/A10/shard%2F48 +0 -1
  242. data/spec/dummy/tmp/cache/31C/A50/shard%2F84 +0 -1
  243. data/spec/dummy/tmp/cache/344/D90/shard%2F121 +0 -1
  244. data/spec/dummy/tmp/cache/344/DB0/shard%2F220 +0 -0
  245. data/spec/dummy/tmp/cache/345/DC0/shard%2F221 +0 -0
  246. data/spec/dummy/tmp/cache/346/DE0/shard%2F231 +0 -1
  247. data/spec/dummy/tmp/cache/346/E10/shard%2F501 +0 -1
  248. data/spec/dummy/tmp/cache/347/DE0/shard%2F142 +0 -1
  249. data/spec/dummy/tmp/cache/347/DF0/shard%2F151 +0 -1
  250. data/spec/dummy/tmp/cache/348/E30/shard%2F422 +0 -1
  251. data/spec/dummy/tmp/cache/349/E20/shard%2F243 +0 -0
  252. data/spec/dummy/tmp/cache/349/E40/shard%2F423 +0 -1
  253. data/spec/dummy/tmp/cache/34A/E00/shard%2F217 +0 -1
  254. data/spec/dummy/tmp/cache/34A/E20/shard%2F316 +0 -1
  255. data/spec/dummy/tmp/cache/34A/E30/shard%2F244 +0 -0
  256. data/spec/dummy/tmp/cache/34A/E30/shard%2F325 +0 -1
  257. data/spec/dummy/tmp/cache/34A/E90/shard%2F460 +0 -0
  258. data/spec/dummy/tmp/cache/34A/EC0/shard%2F730 +0 -1
  259. data/spec/dummy/tmp/cache/34B/E40/shard%2F245 +0 -1
  260. data/spec/dummy/tmp/cache/34B/E60/shard%2F344 +0 -1
  261. data/spec/dummy/tmp/cache/34B/E60/shard%2F425 +0 -1
  262. data/spec/dummy/tmp/cache/34B/E70/shard%2F434 +0 -1
  263. data/spec/dummy/tmp/cache/34C/E40/shard%2F156 +0 -1
  264. data/spec/dummy/tmp/cache/34C/E80/shard%2F354 +0 -1
  265. data/spec/dummy/tmp/cache/34C/EA0/shard%2F453 +0 -1
  266. data/spec/dummy/tmp/cache/34C/EF0/shard%2F822 +0 -0
  267. data/spec/dummy/tmp/cache/34D/E60/shard%2F409 +0 -1
  268. data/spec/dummy/tmp/cache/34D/EC0/shard%2F382 +0 -1
  269. data/spec/dummy/tmp/cache/34D/EE0/shard%2F724 +0 -1
  270. data/spec/dummy/tmp/cache/34E/EA0/shard%2F437 +0 -1
  271. data/spec/dummy/tmp/cache/34E/EF0/shard%2F806 +0 -1
  272. data/spec/dummy/tmp/cache/34F/EB0/shard%2F438 +0 -1
  273. data/spec/dummy/tmp/cache/34F/EC0/shard%2F285 +0 -1
  274. data/spec/dummy/tmp/cache/34F/F20/shard%2F744 +0 -0
  275. data/spec/dummy/tmp/cache/350/EF0/shard%2F466 +0 -1
  276. data/spec/dummy/tmp/cache/350/F30/shard%2F907 +0 -1
  277. data/spec/dummy/tmp/cache/351/EC0/shard%2F188 +0 -1
  278. data/spec/dummy/tmp/cache/351/EE0/shard%2F368 +0 -1
  279. data/spec/dummy/tmp/cache/351/F50/shard%2F917 +0 -0
  280. data/spec/dummy/tmp/cache/351/F60/shard%2F926 +0 -0
  281. data/spec/dummy/tmp/cache/351/F70/shard%2F935 +0 -1
  282. data/spec/dummy/tmp/cache/351/FB0/shard%2F971 +0 -1
  283. data/spec/dummy/tmp/cache/352/EF0/shard%2F369 +0 -1
  284. data/spec/dummy/tmp/cache/352/F70/shard%2F927 +0 -0
  285. data/spec/dummy/tmp/cache/352/F80/shard%2F693 +0 -1
  286. data/spec/dummy/tmp/cache/352/F90/shard%2F864 +0 -1
  287. data/spec/dummy/tmp/cache/353/F70/shard%2F838 +0 -1
  288. data/spec/dummy/tmp/cache/354/FA0/shard%2F776 +0 -1
  289. data/spec/dummy/tmp/cache/354/FF0/shard%2F983 +0 -1
  290. data/spec/dummy/tmp/cache/355/F90/shard%2F759 +0 -1
  291. data/spec/dummy/tmp/cache/357/FF0/shard%2F878 +0 -1
  292. data/spec/dummy/tmp/cache/374/490/shard%2F1012 +0 -1
  293. data/spec/dummy/tmp/cache/374/4C0/shard%2F2011 +0 -1
  294. data/spec/dummy/tmp/cache/376/500/shard%2F1140 +0 -1
  295. data/spec/dummy/tmp/cache/376/510/shard%2F1230 +0 -0
  296. data/spec/dummy/tmp/cache/376/550/shard%2F3210 +0 -1
  297. data/spec/dummy/tmp/cache/377/510/shard%2F1222 +0 -0
  298. data/spec/dummy/tmp/cache/377/540/shard%2F2221 +0 -1
  299. data/spec/dummy/tmp/cache/377/560/shard%2F3211 +0 -1
  300. data/spec/dummy/tmp/cache/378/510/shard%2F2105 +0 -1
  301. data/spec/dummy/tmp/cache/378/570/shard%2F3050 +0 -1
  302. data/spec/dummy/tmp/cache/379/4F0/shard%2F1107 +0 -1
  303. data/spec/dummy/tmp/cache/379/540/shard%2F3015 +0 -1
  304. data/spec/dummy/tmp/cache/379/550/shard%2F3024 +0 -1
  305. data/spec/dummy/tmp/cache/379/560/shard%2F2061 +0 -1
  306. data/spec/dummy/tmp/cache/379/570/shard%2F1341 +0 -1
  307. data/spec/dummy/tmp/cache/379/580/shard%2F2160 +0 -1
  308. data/spec/dummy/tmp/cache/379/580/shard%2F2403 +0 -1
  309. data/spec/dummy/tmp/cache/379/590/shard%2F1602 +0 -0
  310. data/spec/dummy/tmp/cache/379/5C0/shard%2F1710 +0 -1
  311. data/spec/dummy/tmp/cache/37A/510/shard%2F1117 +0 -1
  312. data/spec/dummy/tmp/cache/37A/540/shard%2F1063 +0 -1
  313. data/spec/dummy/tmp/cache/37A/540/shard%2F2035 +0 -1
  314. data/spec/dummy/tmp/cache/37A/550/shard%2F1315 +0 -1
  315. data/spec/dummy/tmp/cache/37A/570/shard%2F1252 +0 -1
  316. data/spec/dummy/tmp/cache/37A/570/shard%2F1414 +0 -1
  317. data/spec/dummy/tmp/cache/37A/5A0/shard%2F1360 +0 -1
  318. data/spec/dummy/tmp/cache/37A/5A0/shard%2F1603 +0 -0
  319. data/spec/dummy/tmp/cache/37A/5B0/shard%2F3151 +0 -1
  320. data/spec/dummy/tmp/cache/37A/5C0/shard%2F3322 +0 -1
  321. data/spec/dummy/tmp/cache/37A/5E0/shard%2F2611 +0 -1
  322. data/spec/dummy/tmp/cache/37B/520/shard%2F1118 +0 -1
  323. data/spec/dummy/tmp/cache/37B/540/shard%2F1217 +0 -1
  324. data/spec/dummy/tmp/cache/37B/550/shard%2F1064 +0 -1
  325. data/spec/dummy/tmp/cache/37B/560/shard%2F1154 +0 -1
  326. data/spec/dummy/tmp/cache/37B/5A0/shard%2F2081 +0 -1
  327. data/spec/dummy/tmp/cache/37B/5A0/shard%2F2324 +0 -1
  328. data/spec/dummy/tmp/cache/37B/5B0/shard%2F1361 +0 -1
  329. data/spec/dummy/tmp/cache/37B/5B0/shard%2F3062 +0 -1
  330. data/spec/dummy/tmp/cache/37B/5C0/shard%2F3152 +0 -1
  331. data/spec/dummy/tmp/cache/37B/5D0/shard%2F3161 +0 -1
  332. data/spec/dummy/tmp/cache/37B/5D0/shard%2F3323 +0 -1
  333. data/spec/dummy/tmp/cache/37C/570/shard%2F2127 +0 -1
  334. data/spec/dummy/tmp/cache/37C/5C0/shard%2F1524 +0 -1
  335. data/spec/dummy/tmp/cache/37C/5D0/shard%2F2343 +0 -1
  336. data/spec/dummy/tmp/cache/37C/5E0/shard%2F2352 +0 -1
  337. data/spec/dummy/tmp/cache/37C/5E0/shard%2F3081 +0 -1
  338. data/spec/dummy/tmp/cache/37C/5F0/shard%2F3090 +0 -1
  339. data/spec/dummy/tmp/cache/37D/560/shard%2F1057 +0 -1
  340. data/spec/dummy/tmp/cache/37D/570/shard%2F2038 +0 -1
  341. data/spec/dummy/tmp/cache/37D/5C0/shard%2F1273 +0 -1
  342. data/spec/dummy/tmp/cache/37D/5D0/shard%2F2092 +0 -1
  343. data/spec/dummy/tmp/cache/37D/5D0/shard%2F3145 +0 -1
  344. data/spec/dummy/tmp/cache/37D/5D0/shard%2F3226 +0 -1
  345. data/spec/dummy/tmp/cache/37D/5E0/shard%2F2344 +0 -1
  346. data/spec/dummy/tmp/cache/37D/5F0/shard%2F1624 +0 -1
  347. data/spec/dummy/tmp/cache/37D/5F0/shard%2F3082 +0 -2
  348. data/spec/dummy/tmp/cache/37D/5F0/shard%2F3406 +0 -1
  349. data/spec/dummy/tmp/cache/37D/600/shard%2F3091 +0 -1
  350. data/spec/dummy/tmp/cache/37D/610/shard%2F1723 +0 -1
  351. data/spec/dummy/tmp/cache/37D/630/shard%2F1903 +0 -1
  352. data/spec/dummy/tmp/cache/37D/640/shard%2F1750 +0 -1
  353. data/spec/dummy/tmp/cache/37D/650/shard%2F2812 +0 -1
  354. data/spec/dummy/tmp/cache/37D/650/shard%2F3622 +0 -1
  355. data/spec/dummy/tmp/cache/37D/660/shard%2F2740 +0 -2
  356. data/spec/dummy/tmp/cache/37E/580/shard%2F2039 +0 -1
  357. data/spec/dummy/tmp/cache/37E/590/shard%2F1238 +0 -1
  358. data/spec/dummy/tmp/cache/37E/5B0/shard%2F1418 +0 -1
  359. data/spec/dummy/tmp/cache/37E/5B0/shard%2F3119 +0 -1
  360. data/spec/dummy/tmp/cache/37E/5D0/shard%2F1193 +0 -1
  361. data/spec/dummy/tmp/cache/37E/5E0/shard%2F3146 +0 -1
  362. data/spec/dummy/tmp/cache/37E/630/shard%2F1490 +0 -1
  363. data/spec/dummy/tmp/cache/37E/640/shard%2F1904 +0 -1
  364. data/spec/dummy/tmp/cache/37E/640/shard%2F2390 +0 -1
  365. data/spec/dummy/tmp/cache/37E/660/shard%2F1922 +0 -1
  366. data/spec/dummy/tmp/cache/37F/610/shard%2F3084 +0 -1
  367. data/spec/dummy/tmp/cache/37F/640/shard%2F1491 +0 -1
  368. data/spec/dummy/tmp/cache/37F/640/shard%2F1815 +0 -1
  369. data/spec/dummy/tmp/cache/37F/660/shard%2F2562 +0 -1
  370. data/spec/dummy/tmp/cache/37F/680/shard%2F2823 +0 -1
  371. data/spec/dummy/tmp/cache/37F/6A0/shard%2F3570 +0 -1
  372. data/spec/dummy/tmp/cache/37F/6A0/shard%2F3813 +0 -1
  373. data/spec/dummy/tmp/cache/37F/6B0/shard%2F2931 +0 -1
  374. data/spec/dummy/tmp/cache/380/5F0/shard%2F1357 +0 -1
  375. data/spec/dummy/tmp/cache/380/600/shard%2F3148 +0 -1
  376. data/spec/dummy/tmp/cache/380/620/shard%2F1384 +0 -1
  377. data/spec/dummy/tmp/cache/380/620/shard%2F3085 +0 -1
  378. data/spec/dummy/tmp/cache/380/630/shard%2F1636 +0 -1
  379. data/spec/dummy/tmp/cache/380/630/shard%2F2527 +0 -1
  380. data/spec/dummy/tmp/cache/380/640/shard%2F3508 +0 -1
  381. data/spec/dummy/tmp/cache/380/670/shard%2F2644 +0 -1
  382. data/spec/dummy/tmp/cache/380/670/shard%2F3292 +0 -1
  383. data/spec/dummy/tmp/cache/380/690/shard%2F2824 +0 -1
  384. data/spec/dummy/tmp/cache/380/6B0/shard%2F3571 +0 -1
  385. data/spec/dummy/tmp/cache/380/6B0/shard%2F3814 +0 -1
  386. data/spec/dummy/tmp/cache/380/6E0/shard%2F2950 +0 -1
  387. data/spec/dummy/tmp/cache/380/6E0/shard%2F3841 +0 -1
  388. data/spec/dummy/tmp/cache/380/6F0/shard%2F3850 +0 -2
  389. data/spec/dummy/tmp/cache/381/5C0/shard%2F1079 +0 -1
  390. data/spec/dummy/tmp/cache/381/610/shard%2F3149 +0 -1
  391. data/spec/dummy/tmp/cache/381/640/shard%2F3338 +0 -1
  392. data/spec/dummy/tmp/cache/381/660/shard%2F3437 +0 -1
  393. data/spec/dummy/tmp/cache/381/690/shard%2F3707 +0 -1
  394. data/spec/dummy/tmp/cache/382/630/shard%2F2187 +0 -1
  395. data/spec/dummy/tmp/cache/382/630/shard%2F3078 +0 -1
  396. data/spec/dummy/tmp/cache/382/640/shard%2F1629 +0 -1
  397. data/spec/dummy/tmp/cache/382/640/shard%2F2277 +0 -1
  398. data/spec/dummy/tmp/cache/382/640/shard%2F3087 +0 -1
  399. data/spec/dummy/tmp/cache/382/650/shard%2F1395 +0 -1
  400. data/spec/dummy/tmp/cache/382/650/shard%2F2448 +0 -1
  401. data/spec/dummy/tmp/cache/382/660/shard%2F2295 +0 -1
  402. data/spec/dummy/tmp/cache/382/670/shard%2F1656 +0 -1
  403. data/spec/dummy/tmp/cache/382/690/shard%2F1836 +0 -1
  404. data/spec/dummy/tmp/cache/382/6A0/shard%2F3384 +0 -1
  405. data/spec/dummy/tmp/cache/382/6B0/shard%2F3636 +0 -1
  406. data/spec/dummy/tmp/cache/382/6D0/shard%2F3654 +0 -1
  407. data/spec/dummy/tmp/cache/382/6F0/shard%2F2781 +0 -1
  408. data/spec/dummy/tmp/cache/382/700/shard%2F2871 +0 -1
  409. data/spec/dummy/tmp/cache/383/640/shard%2F1297 +0 -1
  410. data/spec/dummy/tmp/cache/383/640/shard%2F1459 +0 -1
  411. data/spec/dummy/tmp/cache/383/640/shard%2F3079 +0 -1
  412. data/spec/dummy/tmp/cache/383/650/shard%2F3088 +0 -1
  413. data/spec/dummy/tmp/cache/383/6B0/shard%2F2494 +0 -1
  414. data/spec/dummy/tmp/cache/383/6B0/shard%2F2575 +0 -2
  415. data/spec/dummy/tmp/cache/383/6E0/shard%2F1792 +0 -1
  416. data/spec/dummy/tmp/cache/383/6E0/shard%2F3574 +0 -1
  417. data/spec/dummy/tmp/cache/383/6F0/shard%2F2935 +0 -1
  418. data/spec/dummy/tmp/cache/383/6F0/shard%2F3745 +0 -1
  419. data/spec/dummy/tmp/cache/383/710/shard%2F3682 +0 -1
  420. data/spec/dummy/tmp/cache/384/6B0/shard%2F3458 +0 -1
  421. data/spec/dummy/tmp/cache/384/6B0/shard%2F3539 +0 -1
  422. data/spec/dummy/tmp/cache/384/6E0/shard%2F3566 +0 -1
  423. data/spec/dummy/tmp/cache/384/700/shard%2F2693 +0 -1
  424. data/spec/dummy/tmp/cache/384/700/shard%2F2936 +0 -1
  425. data/spec/dummy/tmp/cache/384/710/shard%2F3836 +0 -1
  426. data/spec/dummy/tmp/cache/384/720/shard%2F3683 +0 -1
  427. data/spec/dummy/tmp/cache/385/6C0/shard%2F1677 +0 -1
  428. data/spec/dummy/tmp/cache/385/6D0/shard%2F2739 +0 -2
  429. data/spec/dummy/tmp/cache/385/6E0/shard%2F1695 +0 -1
  430. data/spec/dummy/tmp/cache/385/6E0/shard%2F1938 +0 -1
  431. data/spec/dummy/tmp/cache/385/6E0/shard%2F2586 +0 -1
  432. data/spec/dummy/tmp/cache/385/760/shard%2F2982 +0 -1
  433. data/spec/dummy/tmp/cache/386/6C0/shard%2F2479 +0 -1
  434. data/spec/dummy/tmp/cache/386/6E0/shard%2F3469 +0 -1
  435. data/spec/dummy/tmp/cache/386/710/shard%2F2767 +0 -2
  436. data/spec/dummy/tmp/cache/386/710/shard%2F2848 +0 -1
  437. data/spec/dummy/tmp/cache/386/740/shard%2F3847 +0 -1
  438. data/spec/dummy/tmp/cache/387/700/shard%2F2669 +0 -1
  439. data/spec/dummy/tmp/cache/387/710/shard%2F2759 +0 -1
  440. data/spec/dummy/tmp/cache/387/770/shard%2F3785 +0 -1
  441. data/spec/dummy/tmp/cache/387/780/shard%2F3875 +0 -1
  442. data/spec/dummy/tmp/cache/388/720/shard%2F1869 +0 -1
  443. data/spec/dummy/tmp/cache/388/770/shard%2F2886 +0 -1
  444. data/spec/dummy/tmp/cache/389/750/shard%2F1969 +0 -1
  445. data/spec/dummy/tmp/cache/389/760/shard%2F3598 +0 -1
  446. data/spec/dummy/tmp/cache/389/760/shard%2F3679 +0 -1
  447. data/spec/dummy/tmp/cache/38A/770/shard%2F3599 +0 -1
  448. data/spec/dummy/tmp/cache/38A/780/shard%2F1988 +0 -1
  449. data/spec/dummy/tmp/cache/38B/780/shard%2F1899 +0 -1
  450. data/spec/dummy/tmp/cache/38B/7B0/shard%2F3789 +0 -1
  451. data/spec/dummy/tmp/cache/38C/7E0/shard%2F3889 +0 -1
  452. data/spec/dummy/tmp/cache/3A4/EA0/shard%2F10012 +0 -1
  453. data/spec/dummy/tmp/cache/3A4/EE0/shard%2F11101 +0 -1
  454. data/spec/dummy/tmp/cache/3A4/F20/shard%2F13000 +0 -1
  455. data/spec/dummy/tmp/cache/3A5/EA0/shard%2F10004 +0 -1
  456. data/spec/dummy/tmp/cache/3A6/F10/shard%2F10221 +0 -1
  457. data/spec/dummy/tmp/cache/3A6/F20/shard%2F12012 +0 -1
  458. data/spec/dummy/tmp/cache/3A6/F40/shard%2F10410 +0 -1
  459. data/spec/dummy/tmp/cache/3A6/F50/shard%2F12120 +0 -1
  460. data/spec/dummy/tmp/cache/3A6/F50/shard%2F12201 +0 -1
  461. data/spec/dummy/tmp/cache/3A7/EF0/shard%2F11005 +0 -1
  462. data/spec/dummy/tmp/cache/3A7/F20/shard%2F10060 +0 -1
  463. data/spec/dummy/tmp/cache/3A7/F20/shard%2F11032 +0 -1
  464. data/spec/dummy/tmp/cache/3A7/F30/shard%2F10231 +0 -1
  465. data/spec/dummy/tmp/cache/3A7/FA0/shard%2F12400 +0 -1
  466. data/spec/dummy/tmp/cache/3A8/EF0/shard%2F10106 +0 -1
  467. data/spec/dummy/tmp/cache/3A8/F50/shard%2F10322 +0 -1
  468. data/spec/dummy/tmp/cache/3A8/F70/shard%2F11312 +0 -1
  469. data/spec/dummy/tmp/cache/3A8/F90/shard%2F10520 +0 -1
  470. data/spec/dummy/tmp/cache/3A8/FB0/shard%2F13211 +0 -1
  471. data/spec/dummy/tmp/cache/3A9/F40/shard%2F10062 +0 -1
  472. data/spec/dummy/tmp/cache/3A9/F50/shard%2F10152 +0 -1
  473. data/spec/dummy/tmp/cache/3A9/F50/shard%2F11124 +0 -1
  474. data/spec/dummy/tmp/cache/3A9/F80/shard%2F10341 +0 -1
  475. data/spec/dummy/tmp/cache/3A9/F90/shard%2F13023 +0 -1
  476. data/spec/dummy/tmp/cache/3AA/F10/shard%2F10027 +0 -1
  477. data/spec/dummy/tmp/cache/3AA/F10/shard%2F10108 +0 -1
  478. data/spec/dummy/tmp/cache/3AA/F30/shard%2F10045 +0 -1
  479. data/spec/dummy/tmp/cache/3AA/F90/shard%2F10423 +0 -1
  480. data/spec/dummy/tmp/cache/3AA/FB0/shard%2F10441 +0 -1
  481. data/spec/dummy/tmp/cache/3AA/FB0/shard%2F11170 +0 -1
  482. data/spec/dummy/tmp/cache/3AA/FC0/shard%2F10612 +0 -1
  483. data/spec/dummy/tmp/cache/3AA/FC0/shard%2F11260 +0 -1
  484. data/spec/dummy/tmp/cache/3AA/FC0/shard%2F11503 +0 -1
  485. data/spec/dummy/tmp/cache/3AA/FC0/shard%2F12313 +0 -1
  486. data/spec/dummy/tmp/cache/3AA/FD0/shard%2F13051 +0 -1
  487. data/spec/dummy/tmp/cache/3AB/000/shard%2F11450 +0 -1
  488. data/spec/dummy/tmp/cache/3AB/010/shard%2F10730 +0 -1
  489. data/spec/dummy/tmp/cache/3AB/010/shard%2F12512 +0 -1
  490. data/spec/dummy/tmp/cache/3AB/010/shard%2F13403 +0 -1
  491. data/spec/dummy/tmp/cache/3AB/020/shard%2F10901 +0 -1
  492. data/spec/dummy/tmp/cache/3AB/020/shard%2F11630 +0 -1
  493. data/spec/dummy/tmp/cache/3AB/020/shard%2F11711 +0 -1
  494. data/spec/dummy/tmp/cache/3AB/F30/shard%2F11009 +0 -1
  495. data/spec/dummy/tmp/cache/3AB/F70/shard%2F10154 +0 -1
  496. data/spec/dummy/tmp/cache/3AB/F80/shard%2F10244 +0 -1
  497. data/spec/dummy/tmp/cache/3AB/FD0/shard%2F11342 +0 -1
  498. data/spec/dummy/tmp/cache/3AB/FF0/shard%2F11603 +0 -1
  499. data/spec/dummy/tmp/cache/3AC/000/shard%2F11280 +0 -1
  500. data/spec/dummy/tmp/cache/3AC/000/shard%2F11361 +0 -1
  501. data/spec/dummy/tmp/cache/3AC/010/shard%2F13152 +0 -1
  502. data/spec/dummy/tmp/cache/3AC/020/shard%2F10650 +0 -1
  503. data/spec/dummy/tmp/cache/3AC/050/shard%2F13431 +0 -1
  504. data/spec/dummy/tmp/cache/3AC/F60/shard%2F10137 +0 -1
  505. data/spec/dummy/tmp/cache/3AC/F70/shard%2F11037 +0 -1
  506. data/spec/dummy/tmp/cache/3AC/F70/shard%2F11118 +0 -1
  507. data/spec/dummy/tmp/cache/3AC/F90/shard%2F10083 +0 -1
  508. data/spec/dummy/tmp/cache/3AC/F90/shard%2F11055 +0 -1
  509. data/spec/dummy/tmp/cache/3AC/FA0/shard%2F11064 +0 -1
  510. data/spec/dummy/tmp/cache/3AC/FA0/shard%2F11145 +0 -1
  511. data/spec/dummy/tmp/cache/3AC/FA0/shard%2F11226 +0 -1
  512. data/spec/dummy/tmp/cache/3AC/FA0/shard%2F11307 +0 -1
  513. data/spec/dummy/tmp/cache/3AC/FC0/shard%2F10272 +0 -1
  514. data/spec/dummy/tmp/cache/3AC/FD0/shard%2F11091 +0 -1
  515. data/spec/dummy/tmp/cache/3AC/FD0/shard%2F11172 +0 -1
  516. data/spec/dummy/tmp/cache/3AC/FD0/shard%2F11253 +0 -1
  517. data/spec/dummy/tmp/cache/3AC/FD0/shard%2F11415 +0 -1
  518. data/spec/dummy/tmp/cache/3AC/FF0/shard%2F10461 +0 -1
  519. data/spec/dummy/tmp/cache/3AC/FF0/shard%2F11514 +0 -1
  520. data/spec/dummy/tmp/cache/3AD/000/shard%2F10543 +0 -1
  521. data/spec/dummy/tmp/cache/3AD/010/shard%2F12253 +0 -1
  522. data/spec/dummy/tmp/cache/3AD/060/shard%2F11650 +0 -1
  523. data/spec/dummy/tmp/cache/3AD/F50/shard%2F10039 +0 -1
  524. data/spec/dummy/tmp/cache/3AD/F90/shard%2F10318 +0 -1
  525. data/spec/dummy/tmp/cache/3AD/FA0/shard%2F10246 +0 -1
  526. data/spec/dummy/tmp/cache/3AD/FC0/shard%2F10345 +0 -1
  527. data/spec/dummy/tmp/cache/3AE/030/shard%2F12344 +0 -1
  528. data/spec/dummy/tmp/cache/3AE/050/shard%2F10823 +0 -1
  529. data/spec/dummy/tmp/cache/3AE/060/shard%2F10751 +0 -1
  530. data/spec/dummy/tmp/cache/3AE/060/shard%2F11480 +0 -1
  531. data/spec/dummy/tmp/cache/3AE/090/shard%2F10940 +0 -1
  532. data/spec/dummy/tmp/cache/3AE/0B0/shard%2F12740 +0 -1
  533. data/spec/dummy/tmp/cache/3AE/FC0/shard%2F10175 +0 -1
  534. data/spec/dummy/tmp/cache/3AE/FD0/shard%2F11237 +0 -1
  535. data/spec/dummy/tmp/cache/3AE/FF0/shard%2F10364 +0 -1
  536. data/spec/dummy/tmp/cache/3AF/000/shard%2F12066 +0 -1
  537. data/spec/dummy/tmp/cache/3AF/000/shard%2F12147 +0 -1
  538. data/spec/dummy/tmp/cache/3AF/010/shard%2F11427 +0 -1
  539. data/spec/dummy/tmp/cache/3AF/020/shard%2F11193 +0 -1
  540. data/spec/dummy/tmp/cache/3AF/030/shard%2F10392 +0 -1
  541. data/spec/dummy/tmp/cache/3AF/030/shard%2F10635 +0 -1
  542. data/spec/dummy/tmp/cache/3AF/030/shard%2F11283 +0 -1
  543. data/spec/dummy/tmp/cache/3AF/030/shard%2F11526 +0 -1
  544. data/spec/dummy/tmp/cache/3AF/030/shard%2F12093 +0 -1
  545. data/spec/dummy/tmp/cache/3AF/030/shard%2F12174 +0 -1
  546. data/spec/dummy/tmp/cache/3AF/070/shard%2F12372 +0 -1
  547. data/spec/dummy/tmp/cache/3AF/080/shard%2F12624 +0 -1
  548. data/spec/dummy/tmp/cache/3AF/080/shard%2F13515 +0 -1
  549. data/spec/dummy/tmp/cache/3AF/090/shard%2F11823 +0 -1
  550. data/spec/dummy/tmp/cache/3AF/090/shard%2F11904 +0 -1
  551. data/spec/dummy/tmp/cache/3AF/0C0/shard%2F11850 +0 -1
  552. data/spec/dummy/tmp/cache/3AF/0C0/shard%2F11931 +0 -1
  553. data/spec/dummy/tmp/cache/3AF/0C0/shard%2F13551 +0 -1
  554. data/spec/dummy/tmp/cache/3AF/0F0/shard%2F13740 +0 -1
  555. data/spec/dummy/tmp/cache/3AF/FD0/shard%2F12039 +0 -1
  556. data/spec/dummy/tmp/cache/3B0/000/shard%2F10438 +0 -1
  557. data/spec/dummy/tmp/cache/3B0/040/shard%2F11365 +0 -1
  558. data/spec/dummy/tmp/cache/3B0/060/shard%2F11626 +0 -1
  559. data/spec/dummy/tmp/cache/3B0/060/shard%2F12436 +0 -1
  560. data/spec/dummy/tmp/cache/3B0/090/shard%2F10681 +0 -1
  561. data/spec/dummy/tmp/cache/3B0/090/shard%2F11491 +0 -1
  562. data/spec/dummy/tmp/cache/3B0/090/shard%2F11572 +0 -1
  563. data/spec/dummy/tmp/cache/3B0/0A0/shard%2F10771 +0 -1
  564. data/spec/dummy/tmp/cache/3B0/0C0/shard%2F12652 +0 -1
  565. data/spec/dummy/tmp/cache/3B0/FE0/shard%2F10177 +0 -1
  566. data/spec/dummy/tmp/cache/3B0/FE0/shard%2F11149 +0 -1
  567. data/spec/dummy/tmp/cache/3B0/FF0/shard%2F10267 +0 -1
  568. data/spec/dummy/tmp/cache/3B1/000/shard%2F11078 +0 -1
  569. data/spec/dummy/tmp/cache/3B1/030/shard%2F10295 +0 -1
  570. data/spec/dummy/tmp/cache/3B1/040/shard%2F10466 +0 -1
  571. data/spec/dummy/tmp/cache/3B1/070/shard%2F13328 +0 -1
  572. data/spec/dummy/tmp/cache/3B1/080/shard%2F10745 +0 -1
  573. data/spec/dummy/tmp/cache/3B1/080/shard%2F13094 +0 -1
  574. data/spec/dummy/tmp/cache/3B1/090/shard%2F10673 +0 -1
  575. data/spec/dummy/tmp/cache/3B1/090/shard%2F12293 +0 -1
  576. data/spec/dummy/tmp/cache/3B1/0B0/shard%2F11744 +0 -1
  577. data/spec/dummy/tmp/cache/3B1/0E0/shard%2F12824 +0 -1
  578. data/spec/dummy/tmp/cache/3B1/100/shard%2F12680 +0 -1
  579. data/spec/dummy/tmp/cache/3B1/100/shard%2F13571 +0 -1
  580. data/spec/dummy/tmp/cache/3B1/100/shard%2F13814 +0 -1
  581. data/spec/dummy/tmp/cache/3B2/060/shard%2F10719 +0 -1
  582. data/spec/dummy/tmp/cache/3B2/070/shard%2F10566 +0 -1
  583. data/spec/dummy/tmp/cache/3B2/070/shard%2F11538 +0 -1
  584. data/spec/dummy/tmp/cache/3B2/0A0/shard%2F10917 +0 -1
  585. data/spec/dummy/tmp/cache/3B2/0A0/shard%2F12456 +0 -1
  586. data/spec/dummy/tmp/cache/3B2/0D0/shard%2F11673 +0 -1
  587. data/spec/dummy/tmp/cache/3B2/0E0/shard%2F10953 +0 -1
  588. data/spec/dummy/tmp/cache/3B2/120/shard%2F12852 +0 -1
  589. data/spec/dummy/tmp/cache/3B2/150/shard%2F13851 +0 -1
  590. data/spec/dummy/tmp/cache/3B3/030/shard%2F10198 +0 -1
  591. data/spec/dummy/tmp/cache/3B3/040/shard%2F10369 +0 -1
  592. data/spec/dummy/tmp/cache/3B3/060/shard%2F10387 +0 -1
  593. data/spec/dummy/tmp/cache/3B3/0A0/shard%2F11719 +0 -1
  594. data/spec/dummy/tmp/cache/3B3/0C0/shard%2F10927 +0 -1
  595. data/spec/dummy/tmp/cache/3B3/0E0/shard%2F12484 +0 -1
  596. data/spec/dummy/tmp/cache/3B3/0E0/shard%2F13375 +0 -1
  597. data/spec/dummy/tmp/cache/3B3/0F0/shard%2F13627 +0 -1
  598. data/spec/dummy/tmp/cache/3B3/100/shard%2F10963 +0 -1
  599. data/spec/dummy/tmp/cache/3B3/100/shard%2F11692 +0 -1
  600. data/spec/dummy/tmp/cache/3B3/160/shard%2F12880 +0 -1
  601. data/spec/dummy/tmp/cache/3B4/090/shard%2F10487 +0 -1
  602. data/spec/dummy/tmp/cache/3B4/0A0/shard%2F11468 +0 -1
  603. data/spec/dummy/tmp/cache/3B4/0A0/shard%2F11549 +0 -1
  604. data/spec/dummy/tmp/cache/3B4/0D0/shard%2F11657 +0 -1
  605. data/spec/dummy/tmp/cache/3B4/0D0/shard%2F11738 +0 -1
  606. data/spec/dummy/tmp/cache/3B4/0D0/shard%2F12548 +0 -1
  607. data/spec/dummy/tmp/cache/3B4/0E0/shard%2F13286 +0 -1
  608. data/spec/dummy/tmp/cache/3B4/110/shard%2F12908 +0 -1
  609. data/spec/dummy/tmp/cache/3B4/130/shard%2F13655 +0 -1
  610. data/spec/dummy/tmp/cache/3B5/070/shard%2F10299 +0 -1
  611. data/spec/dummy/tmp/cache/3B5/080/shard%2F11199 +0 -1
  612. data/spec/dummy/tmp/cache/3B5/0B0/shard%2F10497 +0 -1
  613. data/spec/dummy/tmp/cache/3B5/0B0/shard%2F11388 +0 -1
  614. data/spec/dummy/tmp/cache/3B5/100/shard%2F11595 +0 -1
  615. data/spec/dummy/tmp/cache/3B5/110/shard%2F10875 +0 -1
  616. data/spec/dummy/tmp/cache/3B5/110/shard%2F12576 +0 -1
  617. data/spec/dummy/tmp/cache/3B5/150/shard%2F12936 +0 -1
  618. data/spec/dummy/tmp/cache/3B5/170/shard%2F13683 +0 -1
  619. data/spec/dummy/tmp/cache/3B6/0F0/shard%2F10849 +0 -1
  620. data/spec/dummy/tmp/cache/3B6/100/shard%2F10696 +0 -1
  621. data/spec/dummy/tmp/cache/3B6/110/shard%2F13459 +0 -1
  622. data/spec/dummy/tmp/cache/3B6/190/shard%2F12964 +0 -1
  623. data/spec/dummy/tmp/cache/3B7/0E0/shard%2F10589 +0 -1
  624. data/spec/dummy/tmp/cache/3B7/140/shard%2F11696 +0 -1
  625. data/spec/dummy/tmp/cache/3B7/150/shard%2F12596 +0 -1
  626. data/spec/dummy/tmp/cache/3B7/150/shard%2F13487 +0 -1
  627. data/spec/dummy/tmp/cache/3B8/140/shard%2F10797 +0 -1
  628. data/spec/dummy/tmp/cache/3B8/140/shard%2F11769 +0 -1
  629. data/spec/dummy/tmp/cache/3B8/170/shard%2F10986 +0 -1
  630. data/spec/dummy/tmp/cache/3B8/170/shard%2F11796 +0 -1
  631. data/spec/dummy/tmp/cache/3B8/170/shard%2F11877 +0 -1
  632. data/spec/dummy/tmp/cache/3B8/170/shard%2F11958 +0 -1
  633. data/spec/dummy/tmp/cache/3B8/170/shard%2F12768 +0 -1
  634. data/spec/dummy/tmp/cache/3B9/1B0/shard%2F12796 +0 -1
  635. data/spec/dummy/tmp/cache/3B9/1D0/shard%2F13786 +0 -1
  636. data/spec/dummy/tmp/cache/3BA/160/shard%2F10799 +0 -1
  637. data/spec/dummy/tmp/cache/3BA/180/shard%2F10979 +0 -1
  638. data/spec/dummy/tmp/cache/3BA/1C0/shard%2F11987 +0 -1
  639. data/spec/dummy/tmp/cache/3BB/1C0/shard%2F13599 +0 -1
  640. data/spec/dummy/tmp/cache/3BB/210/shard%2F13887 +0 -1
  641. data/spec/lib/action_controller/caching_spec.rb +0 -49
  642. data/spec/lib/active_record/abstract_adapter_spec.rb +0 -16
  643. data/spec/lib/active_record/association_spec.rb +0 -444
  644. data/spec/lib/active_record/attribute_methods_spec.rb +0 -122
  645. data/spec/lib/active_record/base_spec.rb +0 -130
  646. data/spec/lib/active_record/calculations_spec.rb +0 -282
  647. data/spec/lib/active_record/connection_handler_spec.rb +0 -45
  648. data/spec/lib/active_record/connection_pool_spec.rb +0 -83
  649. data/spec/lib/active_record/finder_methods_spec.rb +0 -58
  650. data/spec/lib/active_record/model_schema_spec.rb +0 -25
  651. data/spec/lib/active_record/persistence_spec.rb +0 -34
  652. data/spec/lib/active_record/postgresql_adapter_spec.rb +0 -40
  653. data/spec/lib/active_record/query_cache_spec.rb +0 -346
  654. data/spec/lib/active_record/query_methods_spec.rb +0 -166
  655. data/spec/lib/active_record/relation_spec.rb +0 -56
  656. data/spec/lib/active_record/spawn_methods_spec.rb +0 -44
  657. data/spec/lib/connection_pool_proxy_spec.rb +0 -45
  658. data/spec/lib/database_server_spec.rb +0 -231
  659. data/spec/lib/default_shard_spec.rb +0 -18
  660. data/spec/lib/engine_spec.rb +0 -14
  661. data/spec/lib/environment_spec.rb +0 -25
  662. data/spec/lib/r_spec_helper_spec.rb +0 -77
  663. data/spec/lib/rails_spec.rb +0 -31
  664. data/spec/lib/rake_spec.rb +0 -100
  665. data/spec/lib/shackles_spec.rb +0 -210
  666. data/spec/models/shard_spec.rb +0 -596
  667. data/spec/spec_helper.rb +0 -66
@@ -1,444 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Switchman
4
- module ActiveRecord
5
- describe Association do
6
- include RSpecHelper
7
-
8
- before do
9
- @shard1.activate do
10
- @user1 = User.create!
11
- end
12
- @shard2.activate do
13
- @user2 = User.create!
14
- end
15
- end
16
-
17
- it "should associate built objects with parent shard" do
18
- a1 = @user1.appendages.build
19
- expect(a1.shard).to eq @shard1
20
- end
21
-
22
- it "should associate created objects with parent shard" do
23
- a1 = @user1.appendages.create!
24
- expect(a1.shard).to eq @shard1
25
- end
26
-
27
- it "should set shard value to parent for association scope" do
28
- scope = @user1.appendages.scope
29
- expect(scope.shard_value).to eq @user1
30
- expect(scope.shard_source_value).to eq :association
31
- end
32
-
33
- it "should find by id through association" do
34
- a1 = @user1.appendages.create!
35
-
36
- expect(@user1.appendages.find(a1.id)).to eq a1
37
- expect { @user2.appendages.find(a1.id) }.to raise_exception(::ActiveRecord::RecordNotFound)
38
- end
39
-
40
- it "should transpose ids correctly when using AR objects as query params" do
41
- a1 = @user1.appendages.create!
42
-
43
- expect(Appendage.where(:id => a1.id, :user_id => @user1).first).to eq a1
44
- expect(Appendage.where(:id => a1.id, :user => @user1).first).to eq a1
45
- end
46
-
47
- describe "transaction" do
48
- it "should activate the owner's shard and start the transaction on that shard" do
49
- base_value = @user1.shard.activate { User.connection.open_transactions }
50
- @user1.appendages.transaction(:requires_new => true) do
51
- expect(Shard.current).to eq @shard1
52
- expect(User.connection.open_transactions).to eq base_value + 1
53
- end
54
- end
55
- end
56
-
57
- it "should get the record size" do
58
- a1 = @user1.appendages.create!
59
- a2 = @user1.appendages.build
60
- expect(@user1.appendages.size).to eq 2
61
- @user1.reload
62
- expect(@user1.appendages.size).to eq 1
63
- end
64
-
65
- it "should reverse the association" do
66
- a1 = @user1.appendages.create!
67
- a1.reload
68
- expect(a1.user.shard).to eq @shard1
69
- expect(a1.user).to eq @user1
70
- end
71
-
72
- it "should work with has_many through associations" do
73
- a1 = @user1.appendages.create!
74
- d1 = a1.digits.create!
75
- expect(d1.shard).to eq @shard1
76
-
77
- expect(@user1.digits.scope.shard_value).to eq @user1
78
- expect(@user1.digits.find(d1.id)).to eq d1
79
- end
80
-
81
- it "should work with has_many through associations with shadow objects" do
82
- @appendage = @user1.appendages.create!
83
-
84
- @real_digit = @shard2.activate { Digit.create! }
85
- shadow_digit = @shard1.activate do
86
- digit = Digit.new
87
- digit.id = @real_digit.global_id
88
- digit.appendage_id = @appendage.id
89
- digit.save!
90
- digit
91
- end
92
-
93
- expect(shadow_digit.shard).to eq @shard1
94
-
95
- expect(@user1.digits.scope.shard_value).to eq @user1
96
- expect(@user1.digits.find(shadow_digit.id)).to eq shadow_digit
97
- end
98
-
99
- it "should resolve include? correctly for a has_many :through" do
100
- @shard1.activate do
101
- child = @user1.children.create!
102
- @grandchild = child.children.create!
103
- @user1.reload
104
- expect(@user1.grandchildren.loaded?).to eq false
105
- expect(@user1.grandchildren.include?(@grandchild)).to eq true
106
- end
107
- @shard2.activate do
108
- fake = User.create!(id: @grandchild.local_id)
109
- @user1.reload
110
- expect(@user1.grandchildren.loaded?).to eq false
111
- expect(@user1.grandchildren.include?(fake)).to eq false
112
- end
113
- end
114
-
115
- it "shard should be changeable, and change conditions when it is changed" do
116
- a1 = @user1.appendages.create!
117
- relation = @user1.appendages.where(:id => a1).shard(@shard1)
118
- expect(relation.shard_value).to eq @shard1
119
- expect(relation.shard_source_value).to eq :explicit
120
- expect(where_value(predicates(relation).detect{|v| v.left.name == "id"}.right)).to eq a1.local_id
121
-
122
- relation = @user1.appendages.where(:id => a1).shard(@shard2)
123
- expect(relation.shard_value).to eq @shard2
124
- expect(relation.shard_source_value).to eq :explicit
125
- expect(where_value(predicates(relation).detect{|v| v.left.name == "id"}.right)).to eq a1.global_id
126
- end
127
-
128
- it "should transpose predicates correctly" do
129
- a1 = @user1.appendages.create!
130
- a2 = @user2.appendages.create!
131
-
132
- relation = @user1.appendages.where(:id => a2)
133
- expect(relation.shard_value).to eq @user1
134
- expect(where_value(predicates(relation).detect{|v| v.left.name == "id"}.right)).to eq a2.global_id
135
-
136
- relation = @user1.appendages.where(:id => [a1, a2])
137
- expect(relation.shard_value).to eq @user1
138
- expect(where_value(predicates(relation).detect{|v| v.left.name == "id"}.right)).to eq [a1.local_id, a2.global_id]
139
- end
140
-
141
- it "should properly set up a cross-shard-category query" do
142
- @shard1.activate(:mirror_universe) do
143
- mirror_user = MirrorUser.create!
144
- relation = mirror_user.association(:user).scope
145
- expect(relation.shard_value).to eq Shard.default
146
- expect(predicates(relation).first.right).to be_a(::Arel::Nodes::BindParam)
147
- expect(bind_values(relation)).to eq [mirror_user.global_id]
148
- end
149
- end
150
-
151
- it "should load singular associations from the correct shard" do
152
- @shard1.activate do
153
- @a = Appendage.create!(:user_id => @user1, :value => 1)
154
- end
155
-
156
- @shard2.activate do
157
- @d = Digit.create!(:appendage_id => @a.global_id)
158
- end
159
-
160
- expect(@d.appendage).to eq @a
161
- end
162
-
163
- it "should load collection associations from the correct shard" do
164
- @shard1.activate do
165
- @a = Appendage.create!(:user_id => @user1, :value => 1)
166
- @d = Digit.create!(:appendage_id => @a.id)
167
- end
168
-
169
- expect(@a.digits.to_a.map(&:id)).to eq [@d.id]
170
- end
171
-
172
- describe "multishard associations" do
173
- it "should group has_many associations over associated_shards" do
174
- @shard1.activate{ Appendage.create!(:user_id => @user1, :value => 1) }
175
- @shard2.activate{ Appendage.create!(:user => @user1, :value => 2) }
176
-
177
- expect(@user1.appendages.to_a.map(&:value)).to eq [1]
178
-
179
- @user1.reload
180
- @user1.associated_shards = [@shard1, @shard2]
181
- expect(@user1.appendages.to_a.map(&:value).sort).to eq [1, 2]
182
- end
183
-
184
- it "follow shards for has_many :through" do
185
- @shard1.activate{ a1 = Appendage.create!(:user_id => @user1); a1.digits.create!(:value => 1) }
186
- @shard2.activate{ a2 = Appendage.create!(:user_id => @user1); a2.digits.create!(:value => 2) }
187
-
188
- expect(@user1.digits.to_a.map(&:value)).to eq [1]
189
-
190
- @user1.reload
191
- @user1.associated_shards = [@shard1, @shard2]
192
- expect(@user1.digits.to_a.map(&:value).sort).to eq [1, 2]
193
- end
194
-
195
- it "should include the shard in scopes created by associations" do
196
- @user1.associated_shards = [@shard1, @shard2]
197
-
198
- @shard1.activate{ Appendage.create!(:user_id => @user1, :value => 1) }
199
- @shard2.activate{ Appendage.create!(:user => @user1) }
200
-
201
- expect(@user1.appendages.has_no_value.to_a.count).to eq 1
202
-
203
- @user1.reload
204
- @shard2.activate {expect(@user1.appendages.has_no_value.to_a.count).to eq 1}
205
- end
206
-
207
- it "should include the shard in scopes created by has_many :through associations" do
208
- @user1.associated_shards = [@shard1, @shard2]
209
-
210
- @shard1.activate{ a1 = Appendage.create!(:user_id => @user1); a1.digits.create! }
211
- @shard2.activate{ a2 = Appendage.create!(:user_id => @user1); a2.digits.create!(:value => 2) }
212
-
213
- expect(@user1.digits.has_no_value.count).to eq 1
214
-
215
- @user1.reload
216
- @shard2.activate {expect(@user1.digits.has_no_value.to_a.count).to eq 1}
217
- end
218
-
219
- it "should work with calculations in scopes created by associations" do
220
- @user1.associated_shards = [@shard1, @shard2]
221
-
222
- @shard1.activate{ Appendage.create!(:user_id => @user1, :value => 1) }
223
- @shard2.activate{ Appendage.create!(:user => @user1); @user1.appendages.create!(:value => 2) }
224
-
225
- @user1.reload
226
- expect(@user1.appendages.has_value.sum(:value)).to eq 3
227
-
228
- @user1.reload
229
- @shard2.activate {expect(@user1.appendages.has_value.sum(:value)).to eq 3}
230
- end
231
-
232
- it "should work with calculations in scopes created by has_many :through associations" do
233
- @user1.associated_shards = [@shard1, @shard2]
234
- @shard1.activate{ a1 = Appendage.create!(:user_id => @user1); a1.digits.create!; a1.digits.create!(:value => 1) }
235
- @shard2.activate{ a2 = Appendage.create!(:user_id => @user1); a2.digits.create!(:value => 2) }
236
-
237
- expect(@user1.digits.has_value.sum(:value)).to eq 3
238
- @user1.reload
239
- @shard2.activate {expect(@user1.digits.has_value.sum(:value)).to eq 3}
240
- end
241
-
242
- it "should be able to explicitly set the shard and still work with named scopes" do
243
- @user1.associated_shards = [@shard1, @shard2]
244
-
245
- @shard1.activate{ a1 = Appendage.create!(:user_id => @user1); a1.digits.create! }
246
- @shard2.activate{ a2 = Appendage.create!(:user_id => @user1); a2.digits.create!(:value => 2) }
247
-
248
- expect(@user1.digits.shard(@shard1).has_no_value.to_a.count).to eq 1
249
- expect(@user1.digits.shard(@shard2).has_no_value.to_a.count).to eq 0
250
-
251
- @user1.reload
252
-
253
- expect(@user1.digits.has_no_value.shard(@shard1).to_a.count).to eq 1
254
- expect(@user1.digits.has_no_value.shard(@shard2).to_a.count).to eq 0
255
- end
256
-
257
- describe "unsharded associations" do
258
- it "should be able to create an unsharded new record through a collection" do
259
- root = @user2.roots.create!
260
- root.reload
261
- expect(root.shard).to eq Shard.default
262
- expect(root.user_id).to eq @user2.global_id
263
- expect(root.user).to eq @user2
264
- end
265
- end
266
-
267
- describe "belongs_to associations" do
268
- it "should identify an implied shard value based on the foreign id" do
269
- @shard1.activate do
270
- @appendage = Appendage.create!(:user_id => @user2.global_id)
271
- expect(@appendage.reload.user).to eq @user2
272
- end
273
- end
274
-
275
- it "should translate foreign keys when replacing the record" do
276
- a = @shard2.activate { Appendage.create! }
277
- copy = a.dup
278
- @shard1.activate do
279
- copy.user = @user1
280
- copy.shard = @user1.shard
281
- copy.save!
282
- copy.reload
283
- expect(copy.user.shard).to eq @shard1
284
- expect(copy.user).to eq @user1
285
- end
286
- end
287
- end
288
-
289
- describe "preloading" do
290
- it "should preload belongs_to associations across shards" do
291
- a1 = Appendage.create!(:user => @user1)
292
- a2 = Appendage.create!(:user => @user2)
293
- user3 = User.create!
294
- user3.appendages.create!
295
-
296
- appendages = Appendage.includes(:user).to_a
297
- @user1.delete
298
-
299
- expect(appendages.map(&:user).sort).to eq [@user1, @user2, user3].sort
300
- end
301
-
302
- it "should preload nested associations" do
303
- u = User.create!
304
- a = Appendage.create!(:user => u)
305
- d = Digit.create!(:appendage => a)
306
-
307
- u2 = User.where(:id => u).preload(:appendages => :digits).first
308
- expect(u2.association(:appendages)).to be_loaded
309
- expect(u2.appendages.first.association(:digits)).to be_loaded
310
- end
311
-
312
- it "should preload belongs_to :through associations across shards" do
313
- a1 = Appendage.create!(:user => @user1)
314
- d1 = a1.digits.create!
315
-
316
- a2 = @shard1.activate {Appendage.create!(:user => @user2) }
317
- d2 = Digit.create!(:appendage => a2)
318
-
319
- digits = Digit.includes(:user).to_a
320
- @user1.delete
321
-
322
- expect(digits.map(&:user).sort).to eq [@user1, @user2].sort
323
- end
324
-
325
- it "should preload has_many associations across associated shards" do
326
- a1 = @user1.appendages.create!
327
- a2 = @shard2.activate { Appendage.create!(:user_id => @user1) } # a2 will be in @user1's associated shards
328
- a3 = @shard1.activate { Appendage.create!(:user_id => @user2) } # a3 is not on @user2's associated shard
329
-
330
- User.associated_shards_map = { @user1.global_id => [@shard1, @shard2] }
331
-
332
- begin
333
- users = User.where(:id => [@user1, @user2]).includes(:appendages).to_a
334
- users.each {|u| expect(u.appendages.loaded?).to eq true}
335
-
336
- u1 = users.detect {|u| u.id == @user1.id}
337
- u2 = users.detect {|u| u.id == @user2.id}
338
-
339
- a1.delete
340
- expect(u1.appendages.sort).to eq [a1, a2].sort
341
- expect(u2.appendages).to be_empty
342
- ensure
343
- User.associated_shards_map = nil
344
- end
345
- end
346
-
347
- it "should not find non-multishard records even if an object is associated with that shard" do
348
- a = Appendage.create!
349
- d1 = a.digits.create!
350
- d2 = @shard1.activate { Digit.create!(:appendage_id => a) } # d2 is in associated shards, but not a's shard
351
-
352
- Appendage.associated_shards_map = { a.global_id => [Shard.default, @shard1]}
353
- begin
354
- appendage = Appendage.where(:id => a).includes(:digits).first
355
- expect(appendage.digits.loaded?).to be true
356
- expect(appendage.digits).to eq [d1]
357
- ensure
358
- Appendage.associated_shards_map = nil
359
- end
360
- end
361
-
362
- it "should preload has_many :through associations across associated shards" do
363
- a1 = @user1.appendages.create!
364
- a2 = @shard2.activate { Appendage.create!(:user_id => @user1) }
365
- a3 = @shard2.activate { Appendage.create!(:user_id => @user1) }
366
-
367
- d1 = a1.digits.create!
368
- d2 = a2.digits.create! # a2 will be in @user1's associated shards
369
- d3 = @shard1.activate { Digit.create!(:appendage_id => a2) } # d3 will be in a2's associated shards, but that doesn't matter
370
- d4 = @shard1.activate { Digit.create!(:appendage_id => a3) } # d4 is not on a3's shard
371
-
372
- a4 = @shard1.activate { Appendage.create!(:user_id => @user2) }
373
- a5 = @user2.appendages.create!
374
- a6 = @user2.appendages.create!
375
-
376
- d5 = @shard2.activate { Digit.create!(:appendage_id => a4) } # d5 is on @user2's shard but a4 is not
377
- d6 = @shard1.activate { Digit.create!(:appendage_id => a5) } # a5 is on @user2's shard but d6 is not
378
- d7 = @shard2.activate { Digit.create!(:appendage_id => a6) } # d7 will be in a6's associated shards
379
-
380
- User.associated_shards_map = { @user1.global_id => [@shard1, @shard2] }
381
- Appendage.associated_shards_map = { a2.global_id => [@shard1, @shard2], a6.global_id => [@shard1] }
382
-
383
- begin
384
- users = User.where(:id => [@user1, @user2]).includes(:digits).to_a
385
- users.each {|u| expect(u.digits.loaded?).to eq true}
386
-
387
- u1 = users.detect {|u| u.id == @user1.id}
388
- u2 = users.detect {|u| u.id == @user2.id}
389
-
390
- d1.delete
391
-
392
- expect(u1.digits.sort).to eq [d1, d2].sort
393
- expect(u2.digits).to eq [d7]
394
- ensure
395
- User.associated_shards_map = nil
396
- Appendage.associated_shards_map = nil
397
- end
398
- end
399
- end
400
-
401
- describe "polymorphic associations" do
402
- it "should work normally" do
403
- appendage = Appendage.create!
404
- feature = Feature.create!(:owner => appendage)
405
-
406
- feature.reload
407
- expect(feature.owner).to eq appendage
408
- expect(feature.owner_id).to eq appendage.id
409
- expect(feature.owner_type).to eq "Appendage"
410
-
411
- feature.owner = @user1
412
- feature.save!
413
-
414
- feature.reload
415
- expect(feature.owner_id).to eq @user1.global_id
416
- expect(feature.owner_type).to eq "User"
417
- end
418
-
419
- it "should work with multi-shard associations" do
420
- @shard1.activate{ Feature.create!(:owner => @user1, :value => 1) }
421
- @shard2.activate{ Feature.create!(:owner => @user1, :value => 2) }
422
-
423
- expect(@user1.features.to_a.map(&:value)).to eq [1]
424
-
425
- @user1.reload
426
- @user1.associated_shards = [@shard1, @shard2]
427
- expect(@user1.features.to_a.map(&:value).sort).to eq [1, 2]
428
- end
429
- end
430
- end
431
-
432
- it "shouldn't break cross-shard has_one associations when autosaving" do
433
- face = Face.new
434
- face.user = @user1
435
- face.save!
436
- expect(face.user_id).to eq @user1.id # global id
437
-
438
- @user1.save!
439
- face.reload
440
- expect(face.user_id).to eq @user1.id # shouldn't change face's id to be @user1's local id in rails 4.2
441
- end
442
- end
443
- end
444
- end
@@ -1,122 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Switchman
4
- module ActiveRecord
5
- describe AttributeMethods do
6
- include RSpecHelper
7
-
8
- describe "ids" do
9
- it "should return id relative to the current shard" do
10
- user = User.create!
11
- expect(user.id).to be < Shard::IDS_PER_SHARD
12
- expect(user.local_id).to be < Shard::IDS_PER_SHARD
13
- expect(user.global_id).to be > Shard::IDS_PER_SHARD
14
-
15
- @shard1.activate do
16
- expect(user.id).to be > Shard::IDS_PER_SHARD
17
- expect(user.local_id).to be < Shard::IDS_PER_SHARD
18
- expect(user.global_id).to be > Shard::IDS_PER_SHARD
19
- end
20
- end
21
-
22
- it "should return foreign keys relative to the current shard" do
23
- appendage = Appendage.create!
24
-
25
- # bypass the setter; we're going to test it in just a minute
26
-
27
- # local id, should stay local
28
- appendage.original_user_id = 6
29
- expect(appendage.user_id).to eq 6
30
-
31
- # (incorrect) self referencing global id; should come out as local
32
- appendage.original_user_id = Shard.current.global_id_for(6)
33
- expect(appendage.user_id).to eq 6
34
-
35
- # global id referencing another shard; should come out unscathed
36
- appendage.original_user_id = @shard1.global_id_for(6)
37
- expect(appendage.user_id).to eq @shard1.global_id_for(6)
38
-
39
- @shard1.activate do
40
- # local id in another shard, should be global in this shard
41
- appendage.original_user_id = 6
42
- expect(appendage.user_id).to eq Shard.default.global_id_for(6)
43
-
44
- # (incorrect) self referencing global id; should come out as global in this shard
45
- appendage.original_user_id = Shard.default.global_id_for(6)
46
- expect(appendage.user_id).to eq Shard.default.global_id_for(6)
47
-
48
- # global id referencing this shard; should come out as a local id in this shard
49
- appendage.original_user_id = @shard1.global_id_for(6)
50
- expect(appendage.user_id).to eq 6
51
-
52
- # global id from an unrelated shard; should stay global
53
- appendage.original_user_id = @shard2.global_id_for(6)
54
- expect(appendage.user_id).to eq @shard2.global_id_for(6)
55
- end
56
-
57
- # now that we trust the getters, try the setters
58
-
59
- # local stays local
60
- appendage.user_id = 6
61
- expect(appendage.original_user_id).to eq 6
62
- appendage.user_id = '6'
63
- expect(appendage.original_user_id).to eq 6
64
-
65
- # (incorrect) global id to this shard, should become local
66
- appendage.user_id = Shard.current.global_id_for(6)
67
- expect(appendage.original_user_id).to eq 6
68
- appendage.user_id = Shard.current.global_id_for(6).to_s
69
- expect(appendage.original_user_id).to eq 6
70
-
71
- # global id from another shard, should stay global
72
- appendage.user_id = @shard1.global_id_for(6)
73
- expect(appendage.original_user_id).to eq @shard1.global_id_for(6)
74
- expect(appendage.local_user_id).to eq 6
75
- appendage.user_id = @shard1.global_id_for(6).to_s
76
- expect(appendage.original_user_id).to eq @shard1.global_id_for(6)
77
- expect(appendage.local_user_id).to eq 6
78
-
79
- @shard1.activate do
80
- # local to this shard becomes global
81
- appendage.user_id = 6
82
- expect(appendage.original_user_id).to eq @shard1.global_id_for(6)
83
- appendage.user_id = '6'
84
- expect(appendage.original_user_id).to eq @shard1.global_id_for(6)
85
-
86
- # global id from original shard, should become local
87
- appendage.user_id = Shard.default.global_id_for(6)
88
- expect(appendage.original_user_id).to eq 6
89
- appendage.user_id = Shard.default.global_id_for(6).to_s
90
- expect(appendage.original_user_id).to eq 6
91
-
92
- # global id from this shard, should stay global
93
- appendage.user_id = Shard.current.global_id_for(6)
94
- expect(appendage.original_user_id).to eq @shard1.global_id_for(6)
95
- appendage.user_id = Shard.current.global_id_for(6).to_s
96
- expect(appendage.original_user_id).to eq @shard1.global_id_for(6)
97
-
98
- # global id from unrelated shard, should stay global
99
- appendage.user_id = @shard2.global_id_for(6)
100
- expect(appendage.original_user_id).to eq @shard2.global_id_for(6)
101
- appendage.user_id = @shard2.global_id_for(6).to_s
102
- expect(appendage.original_user_id).to eq @shard2.global_id_for(6)
103
- end
104
- end
105
-
106
- it "should not choke on polymorphic associations that are missing their type" do
107
- f = Feature.create!(owner: User.create!)
108
- f = Feature.select(:owner_id).where(id: f).first
109
- f.owner_id
110
- end
111
-
112
- it "gives a useful error if the association doesn't exist" do
113
- u = User.new
114
- expect { u.global_broken_id }.to raise_error do |error|
115
- expect(error).to be_a(NoMethodError)
116
- expect(error.to_s).to eq "undefined method `global_broken_id'; are you missing an association?"
117
- end
118
- end
119
- end
120
- end
121
- end
122
- end
@@ -1,130 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Switchman
4
- module ActiveRecord
5
- describe Base do
6
- include RSpecHelper
7
-
8
- describe "hash" do
9
- it "should work with unsharded models" do
10
- root = Root.create!
11
- expect(root.hash).to eq root.id.hash
12
- end
13
- end
14
-
15
- describe "to_param" do
16
- it "should return nil if no id" do
17
- user = User.new
18
- expect(user.to_param).to be_nil
19
- end
20
-
21
- it "should return the id even if not persisted" do
22
- user = User.new
23
- user.id = 1
24
- expect(user.to_param).to eq '1'
25
- end
26
-
27
- it "should return local id if in the current shard" do
28
- user = User.create!
29
- expect(user.to_param).to eq user.local_id.to_s
30
- @shard1.activate do
31
- user2 = User.create!
32
- expect(user2.to_param).to eq user2.local_id.to_s
33
- end
34
- end
35
-
36
- it "should return a short form global id if not in the current shard" do
37
- user = nil
38
- @shard1.activate do
39
- user = User.create!
40
- end
41
- @shard2.activate do
42
- expect(user.to_param).to eq "#{@shard1.id}~#{user.local_id}"
43
- end
44
- end
45
-
46
- it "should use to_param in url helpers" do
47
- helpers = ::Rails.application.routes.url_helpers
48
- user = nil
49
- appendage = nil
50
-
51
- @shard1.activate do
52
- user = User.create!
53
- appendage = Appendage.create!
54
-
55
- expect(helpers.user_path(user)).to eq "/users/#{user.local_id}"
56
- expect(helpers.user_appendages_path(user)).to eq "/users/#{user.local_id}/appendages"
57
- expect(helpers.user_appendage_path(user, appendage)).to eq "/users/#{user.local_id}/appendages/#{appendage.local_id}"
58
- expect(helpers.user_test1_path(user)).to eq "/users/#{user.local_id}"
59
- expect(helpers.user_test2_path(user)).to eq "/users/#{user.local_id}/test2"
60
- end
61
-
62
- @shard2.activate do
63
- user_short_id = "#{@shard1.id}~#{user.local_id}"
64
- appendage_short_id = "#{@shard1.id}~#{appendage.local_id}"
65
-
66
- expect(helpers.user_path(user)).to eq "/users/#{user_short_id}"
67
- expect(helpers.user_appendages_path(user)).to eq "/users/#{user_short_id}/appendages"
68
- expect(helpers.user_appendage_path(user, appendage)).to eq "/users/#{user_short_id}/appendages/#{appendage_short_id}"
69
- expect(helpers.user_test1_path(user)).to eq "/users/#{user_short_id}"
70
- expect(helpers.user_test2_path(user)).to eq "/users/#{user_short_id}/test2"
71
-
72
- appendage2 = Appendage.create!
73
- expect(helpers.user_appendage_path(user, appendage2)).to eq "/users/#{user_short_id}/appendages/#{appendage2.local_id}"
74
- end
75
- end
76
- end
77
-
78
- describe "shard=" do
79
- it "should adjust foreign ids when shard is changed" do
80
- user = User.create!
81
- appendage = Appendage.new
82
- appendage.user_id = user.id
83
- appendage.shard = @shard1
84
- expect(appendage.attributes["user_id"]).to eq user.global_id
85
- end
86
- end
87
-
88
- describe ".shard_category=" do
89
- it "should set up connection pools correctly for a model on a different db in the default shard" do
90
- skip "remove_connection working properly"
91
- ::Rails.env.stubs(:test?).returns(false)
92
- begin
93
- config = { :adapter => 'sqlite3', :database => ':memory:', :something_unique_in_the_spec => true }
94
- MirrorUser.establish_connection(config)
95
-
96
- expect(MirrorUser.connection).not_to eq ::ActiveRecord::Base.connection
97
- ::Shackles.activate(:slave) do
98
- expect(MirrorUser.connection).not_to eq ::ActiveRecord::Base.connection
99
- end
100
- ensure
101
- MirrorUser.remove_connection
102
- end
103
- end
104
- end
105
-
106
- describe ".unscoped" do
107
- it "doesn't capture the shard permanently (block form)" do
108
- @shard1.activate do
109
- User.unscoped do
110
- Shard.default.activate do
111
- expect(User.all.shard_value).to eq Shard.default
112
- end
113
- end
114
- end
115
- end
116
-
117
- it "doesn't capture the shard permanently" do
118
- @shard1.activate do
119
- scope = User.unscoped
120
- scope.scoping do
121
- Shard.default.activate do
122
- expect(User.all.shard_value).to eq Shard.default
123
- end
124
- end
125
- end
126
- end
127
- end
128
- end
129
- end
130
- end