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,596 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Switchman
4
- describe Shard do
5
- include RSpecHelper
6
-
7
- describe ".activate" do
8
- it "should activate a hash of shard categories" do
9
- expect(Shard.current).to eq Shard.default
10
- expect(Shard.current(:other)).to eq Shard.default
11
- Shard.activate(:default => @shard1, :other => @shard2) do
12
- expect(Shard.current).to eq @shard1
13
- expect(Shard.current(:other)).to eq @shard2
14
- end
15
- expect(Shard.current).to eq Shard.default
16
- expect(Shard.current(:other)).to eq Shard.default
17
- end
18
-
19
- it "should not allow activating the unsharded category" do
20
- expect(Shard.current(:unsharded)).to eq Shard.default
21
- Shard.activate(:unsharded => @shard1) do
22
- expect(Shard.current(:unsharded)).to eq Shard.default
23
- end
24
- expect(Shard.current(:unsharded)).to eq Shard.default
25
- end
26
- end
27
-
28
- describe ".destroy" do
29
- it "works on created shards" do
30
- server = DatabaseServer.create(Shard.default.database_server.config)
31
- shard = server.create_new_shard
32
- expect{ shard.destroy }.to_not raise_error
33
- expect(Shard.where(id: shard.id)).to be_empty
34
- end
35
-
36
- it "fails on the default shard" do
37
- shard = Shard.default
38
- expect{ shard.destroy }.to raise_error("Cannot destroy the default shard")
39
- end
40
- end
41
-
42
- describe "#activate" do
43
- it "should activate the default category when no args are used" do
44
- expect(Shard.current).to eq Shard.default
45
- @shard1.activate do
46
- expect(Shard.current).to eq @shard1
47
- end
48
- expect(Shard.current).to eq Shard.default
49
- end
50
-
51
- it "should activate other categories" do
52
- expect(Shard.current(:other)).to eq Shard.default
53
- @shard1.activate(:other) do
54
- expect(Shard.current(:other)).to eq @shard1
55
- expect(Shard.current).to eq Shard.default
56
- end
57
- expect(Shard.current(:other)).to eq Shard.default
58
- end
59
-
60
- it "should activate multiple categories" do
61
- expect(Shard.current).to eq Shard.default
62
- expect(Shard.current(:other)).to eq Shard.default
63
- @shard1.activate(:default, :other) do
64
- expect(Shard.current).to eq @shard1
65
- expect(Shard.current(:other)).to eq @shard1
66
- end
67
- expect(Shard.current).to eq Shard.default
68
- expect(Shard.current(:other)).to eq Shard.default
69
- end
70
- end
71
-
72
- describe "#shard" do
73
- it "should return the default shard if the instance variable is not set" do
74
- # i.e. the instance var would not be set if we got this back from a cache
75
- # that was populated pre-sharding
76
- a = User.new
77
- expect(a.shard).to eq Shard.default
78
- a.instance_variable_set(:@shard, nil)
79
- expect(a.shard).to eq Shard.default
80
- end
81
- end
82
-
83
- describe "#drop_database" do
84
- it "should work" do
85
- # use a separate connection so we don't commit the transaction
86
- server = DatabaseServer.create(Shard.default.database_server.config)
87
- shard = server.create_new_shard
88
- shard.activate do
89
- User.create!
90
- expect(User.count).to eq 1
91
- end
92
- shard.drop_database
93
- shard.activate do
94
- expect { User.count }.to raise_error(::ActiveRecord::StatementInvalid)
95
- end
96
- end
97
-
98
- it "raises an exception if the shard is the default shard" do
99
- expect{ Shard.default.drop_database }.to raise_error("Cannot drop the database of the default shard")
100
- end
101
- end
102
-
103
- describe ".lookup" do
104
- it "should work with pseudo-ids" do
105
- expect(Shard.lookup('default')).to eq Shard.default
106
- expect(Shard.lookup('self')).to eq Shard.current
107
- @shard1.activate do
108
- expect(Shard.lookup('default')).to eq Shard.default
109
- expect(Shard.lookup('self')).to eq Shard.current
110
- end
111
- end
112
-
113
- it "should work with string ids" do
114
- expect(Shard.lookup(Shard.current.id.to_s)).to eq Shard.current
115
- expect(Shard.lookup(@shard1.id.to_s)).to eq @shard1
116
- end
117
-
118
- it "should raise an error for non-ids" do
119
- expect { Shard.lookup('jacob') }.to raise_error(ArgumentError)
120
- end
121
- end
122
-
123
- describe ".with_each_shard" do
124
- describe ":exception" do
125
- it "should default to :raise" do
126
- expect { Shard.with_each_shard { raise "error" } }.to raise_error("error")
127
- end
128
-
129
- it "should :ignore" do
130
- expect(Shard.with_each_shard(exception: :ignore) { raise "error" }).to eq []
131
- end
132
-
133
- it "should :defer" do
134
- counter = 0
135
- expect { Shard.with_each_shard(exception: :defer) { counter += 1; raise "error" } }.to raise_error("error")
136
- # called more than once
137
- expect(counter).to be > 1
138
- end
139
-
140
- it "should call a proc" do
141
- counter = 0
142
- expect(Shard.with_each_shard(exception: -> { counter += 1 }) { raise "error" }).to eq []
143
- # called more than once
144
- expect(counter).to be > 1
145
- end
146
- end
147
-
148
- it "orders explicit scopes without an explicit order" do
149
- scope = Shard.where(id: Shard.default)
150
- scope.expects(:order).once.returns(scope)
151
- Shard.with_each_shard(scope) {}
152
- end
153
-
154
- it "does not order explicit scopes that already have an order" do
155
- scope = Shard.order(:id)
156
- scope.expects(:order).never
157
- Shard.with_each_shard(scope) {}
158
- end
159
-
160
- context "non-transactional" do
161
- self.use_transactional_fixtures = false
162
-
163
- it "should disconnect when switching among different database servers" do
164
- User.connection
165
- expect(User.connected?).to eq true
166
- Shard.with_each_shard([Shard.default, @shard2]) {}
167
- expect(User.connected?).to eq false
168
- end
169
-
170
- it "should disconnect from other environments" do
171
- ::Shackles.activate(:slave) do
172
- Shard.with_each_shard([Shard.default, @shard2]) do
173
- ::Shackles.activate(:master) do
174
- User.connection
175
- expect(User.connected?).to eq true
176
- end
177
- end
178
- end
179
-
180
- ::Shackles.activate(:slave) { expect(User.connected?).to eq false }
181
- ::Shackles.activate(:master) { expect(User.connected?).to eq false }
182
- end
183
-
184
- it "should not disconnect when it's the current shard" do
185
- User.connection
186
- expect(User.connected?).to eq true
187
- Shard.with_each_shard([Shard.default]) {}
188
- expect(User.connected?).to eq true
189
- end
190
-
191
- it "should not disconnect for zero shards" do
192
- User.connection
193
- expect(User.connected?).to eq true
194
- Shard.with_each_shard([]) {}
195
- expect(User.connected?).to eq true
196
- end
197
- end
198
- end
199
-
200
- describe ".cached_shards" do
201
- it "is a hash rather than array" do
202
- Shard.instance_variable_set(:@cached_shards, nil)
203
- expect(Shard.send(:cached_shards)).to be_a(Hash)
204
- Shard.clear_cache
205
- expect(Shard.send(:cached_shards)).to be_a(Hash)
206
- end
207
- end
208
-
209
- describe ".partition_by_shard" do
210
- it "should work" do
211
- ids = [2, 48, Shard::IDS_PER_SHARD * @shard1.id + 6, Shard::IDS_PER_SHARD * @shard1.id + 8, 10, 12]
212
- results = Shard.partition_by_shard(ids) do |ids|
213
- expect(ids.length == 4 || ids.length == 2).to eq true
214
- ids.map { |id| id + 1}
215
- end
216
-
217
- # could have done either shard first, but we can't sort, because we want to see the shards grouped together
218
- expect(results == [3, 49, 11, 13, 7, 9] ||
219
- results == [7, 9, 3, 49, 11, 13]).to eq true
220
- end
221
-
222
- it "should work for a partition_proc that returns a shard" do
223
- array = [{:id => 1, :shard => @shard1}, {:id => 2, :shard => @shard2}]
224
- results = Shard.partition_by_shard(array, lambda { |a| a[:shard] }) do |objects|
225
- expect(objects.length).to eq 1
226
- expect(Shard.current).to eq objects.first[:shard]
227
- objects.first[:id]
228
- end
229
- expect(results.sort).to eq [1, 2]
230
- end
231
-
232
- it "should support shortened id syntax, and strings" do
233
- ids = [@shard1.global_id_for(1), "#{@shard2.id}~2"]
234
- result = Shard.partition_by_shard(ids) do |ids|
235
- expect(ids.length).to eq 1
236
- expect([@shard1, @shard2].include?(Shard.current)).to eq true
237
- expect(ids.first).to eq 1 if Shard.current == @shard1
238
- expect(ids.first).to eq 2 if Shard.current == @shard2
239
- ids.first
240
- end
241
- expect(result.sort).to eq [1, 2]
242
- end
243
-
244
- it "should partition unrecognized types unchanged into current shard" do
245
- expected_shard = Shard.current
246
- items = [:symbol, Object.new]
247
- result = Shard.partition_by_shard(items) do |shard_items|
248
- [Shard.current, shard_items]
249
- end
250
- expect(result).to eq [expected_shard, items]
251
- end
252
-
253
- it "should partition unrecognized strings unchanged into current shard" do
254
- expected_shard = Shard.current
255
- items = ["not an id", "something other than an id"]
256
- result = Shard.partition_by_shard(items) do |shard_items|
257
- [Shard.current, shard_items]
258
- end
259
- expect(result).to eq [expected_shard, items]
260
- end
261
-
262
- it "should partition recognized ids with an invalid shard unchanged into current shard" do
263
- expected_shard = Shard.current
264
- bad_shard_id = @shard2.id + 10000
265
- items = ["#{bad_shard_id}~1", Shard::IDS_PER_SHARD * bad_shard_id + 1]
266
- result = Shard.partition_by_shard(items) do |shard_items|
267
- [Shard.current, shard_items]
268
- end
269
- expect(result).to eq [expected_shard, items]
270
- end
271
- end
272
-
273
- describe "#name" do
274
- it "the default shard should not be marked as dirty after reading its name" do
275
- s = Shard.default
276
- expect(s).not_to be_new_record
277
- s.name
278
- expect(s).not_to be_changed
279
- end
280
-
281
- it "should fall back to shard_name in the config if nil" do
282
- db = DatabaseServer.new(nil, adapter: 'mysql', database: 'canvas', shard_name: 'yoyoyo')
283
- shard = Shard.new(database_server: db)
284
- expect(shard.name).to eq 'yoyoyo'
285
- end
286
-
287
- it "should fall back to the database_server if nil" do
288
- db = DatabaseServer.new(nil, adapter: 'mysql', database: 'canvas')
289
- shard = Shard.new(database_server: db)
290
- expect(shard.name).to eq 'canvas'
291
- end
292
-
293
- it "should get it from the postgres connection if not otherwise specified" do
294
- db = DatabaseServer.create(adapter: 'postgresql', database: 'notme')
295
- shard = Shard.new(database_server: db)
296
- shard.database_server = db
297
- connection = mock()
298
- connection.stubs(:open_transactions).returns(0)
299
- connection.expects(:current_schemas).returns(['canvas', 'public']).once
300
- connection.expects(:schema_search_path).returns('canvas,public').once
301
- connection.expects(:schema_search_path=).with(nil).once
302
- connection.stubs(:shard).returns(Shard.default)
303
- connection.expects(:shard=).with(shard)
304
- connection.stubs(:adapter_name).returns('PostgreSQL')
305
- connection.stubs(:run_callbacks).returns(nil)
306
- connection.stubs(:_run_checkin_callbacks).returns(nil)
307
- connection.stubs(:owner).returns(Thread.current)
308
- ::ActiveRecord::ConnectionAdapters::ConnectionPool.any_instance.stubs(:checkout).returns(connection)
309
- begin
310
- expect(shard.name).to eq 'canvas'
311
- ensure
312
- shard.activate { ::ActiveRecord::Base.connection_pool.current_pool.disconnect! }
313
- end
314
- end
315
- end
316
-
317
- describe ".shard_for" do
318
- it "should work" do
319
- expect(Shard.shard_for(1)).to eq Shard.default
320
- expect(Shard.shard_for(1, @shard1)).to eq @shard1
321
- expect(Shard.shard_for(@shard1.global_id_for(1))).to eq @shard1
322
- expect(Shard.shard_for(Shard.default.global_id_for(1))).to eq Shard.default
323
- expect(Shard.shard_for(@shard1.global_id_for(1), @shard1)).to eq @shard1
324
- expect(Shard.shard_for(Shard.default.global_id_for(1), @shard1)).to eq Shard.default
325
- end
326
- end
327
-
328
- describe ".local_id_for" do
329
- it "should recognize shortened string ids" do
330
- expected_id = 1
331
- expected_shard = @shard2
332
- id, shard = Shard.local_id_for("#{expected_shard.id}~#{expected_id}")
333
- expect(id).to eq expected_id
334
- expect(shard).to eq expected_shard
335
- end
336
-
337
- it "should recognize global ids" do
338
- expected_id = 1
339
- expected_shard = @shard2
340
- id, shard = Shard.local_id_for(Shard::IDS_PER_SHARD * expected_shard.id + expected_id)
341
- expect(id).to eq expected_id
342
- expect(shard).to eq expected_shard
343
- end
344
-
345
- it "should recognize local ids with no shard" do
346
- expected_id = 1
347
- id, shard = Shard.local_id_for(expected_id)
348
- expect(id).to eq expected_id
349
- expect(shard).to be_nil
350
- end
351
-
352
- it "should return nil for unrecognized input" do
353
- id, shard = Shard.local_id_for("not an id")
354
- expect(id).to be_nil
355
- expect(shard).to be_nil
356
- end
357
-
358
- it "should return nil for ids with bad shard values" do
359
- bad_shard_id = @shard2.id + 10000
360
- id, shard = Shard.local_id_for("#{bad_shard_id}~1")
361
- expect(id).to be_nil
362
- expect(shard).to be_nil
363
- end
364
- end
365
-
366
- context "id translation" do
367
- before do
368
- @local_id = 1
369
- @global_id = Shard::IDS_PER_SHARD * @shard1.id + @local_id
370
- end
371
-
372
- describe ".integral_id" do
373
- it "should return recognized ids" do
374
- expect(Shard.integral_id_for(@local_id)).to eq @local_id
375
- expect(Shard.integral_id_for(@local_id.to_s)).to eq @local_id
376
- expect(Shard.integral_id_for(@global_id)).to eq @global_id
377
- expect(Shard.integral_id_for(@global_id.to_s)).to eq @global_id
378
- expect(Shard.integral_id_for("#{@shard1.id}~#{@local_id}")).to eq @global_id
379
- end
380
-
381
- it "should work even for shards that don't exist" do
382
- shard = Shard.create!
383
- shard.destroy
384
- global_id = shard.global_id_for(1)
385
- expect(Shard.integral_id_for(global_id)).to eq global_id
386
- expect(Shard.integral_id_for(global_id.to_s)).to eq global_id
387
- expect(Shard.integral_id_for("#{shard.id}~1")).to eq global_id
388
- end
389
-
390
- it "should return nil for unrecognized ids" do
391
- expect(Shard.integral_id_for('not an id')).to eq nil
392
- end
393
- end
394
-
395
- describe ".local_id_for" do
396
- it "should return id without shard for local id" do
397
- expect(Shard.local_id_for(@local_id)).to eq [@local_id, nil]
398
- end
399
-
400
- it "should return id with shard for global id" do
401
- expect(Shard.local_id_for(@global_id)).to eq [@local_id, @shard1]
402
- end
403
-
404
- it "should return nil for shards that don't exist" do
405
- shard = Shard.create!
406
- shard.destroy
407
- expect(Shard.local_id_for(shard.global_id_for(1))).to eq [nil, nil]
408
- end
409
-
410
- it "should return nil for unrecognized ids" do
411
- expect(Shard.local_id_for('not an id')).to eq [nil, nil]
412
- end
413
- end
414
-
415
- describe ".relative_id_for" do
416
- it "should return recognized ids relative to the target shard" do
417
- expect(Shard.relative_id_for(@local_id, @shard1, @shard2)).to eq @global_id
418
- expect(Shard.relative_id_for(@local_id, @shard2, @shard2)).to eq @local_id
419
- expect(Shard.relative_id_for(@global_id, @shard1, @shard2)).to eq @global_id
420
- expect(Shard.relative_id_for(@global_id, @shard2, @shard2)).to eq @global_id
421
- end
422
-
423
- it "should return the original id for unrecognized ids" do
424
- expect(Shard.relative_id_for('not an id', @shard1, @shard2)).to eq 'not an id'
425
- end
426
- end
427
-
428
- describe ".short_id_for" do
429
- it "should return shorted strings for global ids" do
430
- expect(Shard.short_id_for(@local_id)).to eq @local_id
431
- expect(Shard.short_id_for("#{@local_id}")).to eq @local_id
432
- expect(Shard.short_id_for(@global_id)).to eq "#{@shard1.id}~#{@local_id}"
433
- end
434
-
435
- it "should return the original id for unrecognized ids" do
436
- expect(Shard.short_id_for('not an id')).to eq 'not an id'
437
- end
438
- end
439
-
440
- describe ".global_id_for" do
441
- it "should return the provided id if already global" do
442
- local_id = 5
443
- Shard.with_each_shard do
444
- global_id = Shard.current.global_id_for(local_id)
445
- expect(Shard.global_id_for(global_id)).to eq global_id
446
- end
447
- end
448
-
449
- it "should treat local ids as local to the current shard" do
450
- local_id = 5
451
- Shard.with_each_shard do
452
- next if Shard.current == Shard.default
453
- expect(Shard.shard_for(Shard.global_id_for(local_id))).to eq Shard.current
454
- end
455
- end
456
- end
457
- end
458
-
459
- describe ".default" do
460
-
461
- after(:each) do
462
- Shard.unstub(:where)
463
- Shard.default(reload: true)
464
- end
465
-
466
- it "returns the cached value if default is already set" do
467
- Shard.instance_variable_set(:@default, DefaultShard.instance)
468
- expect(Shard.default).to eq(DefaultShard.instance)
469
- end
470
-
471
- it "loads a default value if cached value is nil" do
472
- Shard.instance_variable_set(:@default, nil)
473
- expect(Shard.default).to be_a(Switchman::Shard)
474
- end
475
-
476
- it "reloads the default shard even when it's set when the reload arg present" do
477
- Shard.instance_variable_set(:@default, DefaultShard.instance)
478
- expect(Shard.default(true)).to be_a(Switchman::Shard)
479
- end
480
-
481
- context "when using reload with_fallback" do
482
- it "replaces DefaultShard instance if cached" do
483
- Shard.instance_variable_set(:@default, DefaultShard.instance)
484
- expect(Shard.default(reload: true, with_fallback: true)).to be_a(Switchman::Shard)
485
- end
486
-
487
- it "replaces a Shard instance if replacement query successful" do
488
- non_default = Shard.where(default: false).first
489
- actual_default = Shard.where(default:true).first
490
- expect(non_default).to_not be(nil)
491
- expect(actual_default).to_not be(nil)
492
- Shard.instance_variable_set(:@default, non_default)
493
- Shard.stubs(:where).with(default: true).returns([actual_default])
494
- new_default = Shard.default(reload: true, with_fallback: true)
495
- expect(new_default).to eq(actual_default)
496
- end
497
-
498
- it "uses the default shard instance when fallback is off" do
499
- non_default = Shard.where(default: false).first
500
- actual_default = Shard.where(default:true).first
501
- Shard.instance_variable_set(:@default, non_default)
502
- Shard.stubs(:where).with(default: true).raises(PG::UnableToSend)
503
- new_default = Shard.default(reload: true, with_fallback: false)
504
- expect(new_default).to eq(DefaultShard.instance)
505
- end
506
-
507
- it "falls back to existing default shard if replacement query fails" do
508
- non_default = Shard.where(default: false).first
509
- Shard.instance_variable_set(:@default, non_default)
510
- Shard.stubs(:where).with(default: true).raises(PG::UnableToSend)
511
- new_default = Shard.default(reload: true, with_fallback: true)
512
- expect(new_default).to eq(non_default)
513
- end
514
-
515
- it "respects a false reload even with fallback" do
516
- Shard.instance_variable_set(:@default, DefaultShard.instance)
517
- expect(Shard.default(reload: false, with_fallback: true)).to eq(DefaultShard.instance)
518
- end
519
-
520
- it "uses the original positional parameter if provided (will go away ultimately, remove this spec then)" do
521
- Shard.instance_variable_set(:@default, DefaultShard.instance)
522
- expect(Shard.default(true, reload: false, with_fallback: false)).to be_a(Switchman::Shard)
523
- end
524
- end
525
-
526
- end
527
-
528
- describe ".determine_max_procs" do
529
- context "with no info on cpu_count" do
530
- before(:each) do
531
- ::Switchman::Environment.stubs(:cpu_count).returns(nil)
532
- end
533
-
534
- it "returns the option if valid" do
535
- expect(Shard.determine_max_procs(5)).to eq(5)
536
- end
537
-
538
- it "makes the option an integer" do
539
- expect(Shard.determine_max_procs("8")).to eq(8)
540
- end
541
-
542
- it "returns nil if the option is nil" do
543
- expect(Shard.determine_max_procs(nil)).to be_nil
544
- end
545
-
546
- it "is nil if the option is 0" do
547
- expect(Shard.determine_max_procs("0")).to be_nil
548
- end
549
-
550
- it "is nil if the option is nonsense" do
551
- expect(Shard.determine_max_procs("asdf")).to be_nil
552
- end
553
-
554
- it "ignores parallel input if max procs specified" do
555
- expect(Shard.determine_max_procs("4", 3)).to eq(4)
556
- end
557
- end
558
-
559
- context "with a cpu_count" do
560
- before(:each) do
561
- ::Switchman::Environment.stubs(:cpu_count).returns(8)
562
- end
563
-
564
- it "returns the option if valid" do
565
- expect(Shard.determine_max_procs("4")).to eq(4)
566
- end
567
-
568
- it "returns 2x cores if the option is nil and no parallel input" do
569
- expect(Shard.determine_max_procs(nil)).to eq(16)
570
- end
571
-
572
- it "uses the parallel input as a multiplier if provided" do
573
- expect(Shard.determine_max_procs(nil, 3)).to eq(24)
574
- end
575
-
576
- it "maxes at 1 if parallel is 0" do
577
- expect(Shard.determine_max_procs(nil, 0)).to eq(1)
578
- end
579
-
580
- it "maxes at 1 if parallel is nil" do
581
- expect(Shard.determine_max_procs(nil, nil)).to eq(1)
582
- end
583
-
584
- it "is nil if the option is 0" do
585
- expect(Shard.determine_max_procs("0")).to eq(nil)
586
- end
587
-
588
- it "is nil if the cpu count is 0" do
589
- ::Switchman::Environment.stubs(:cpu_count).returns(0)
590
- expect(Shard.determine_max_procs(nil)).to eq(nil)
591
- end
592
- end
593
-
594
- end
595
- end
596
- end
data/spec/spec_helper.rb DELETED
@@ -1,66 +0,0 @@
1
- # This file is copied to spec/ when you run 'rails generate rspec:install'
2
- ENV["RAILS_ENV"] ||= 'test'
3
- require File.expand_path("../dummy/config/environment", __FILE__)
4
- require 'byebug'
5
- require 'rspec/rails'
6
-
7
- require 'switchman/r_spec_helper'
8
-
9
- # Requires supporting ruby files with custom matchers and macros, etc,
10
- # in spec/support/ and its subdirectories.
11
- Dir[Rails.root.join("../spec/support/**/*.rb")].each {|f| require f}
12
-
13
- RSpec.configure do |config|
14
- # ## Mock Framework
15
- config.mock_with :mocha
16
-
17
- config.infer_spec_type_from_file_location!
18
- config.raise_errors_for_deprecations!
19
-
20
- # If you're not using ActiveRecord, or you'd prefer not to run each of your
21
- # examples within a transaction, remove the following line or assign false
22
- # instead of true.
23
- config.use_transactional_fixtures = true
24
-
25
- # If true, the base class of anonymous controllers will be inferred
26
- # automatically. This will be the default behavior in future versions of
27
- # rspec-rails.
28
- config.infer_base_class_for_anonymous_controllers = false
29
-
30
- # Run specs in random order to surface order dependencies. If you find an
31
- # order dependency and want to debug it, you can fix the order by providing
32
- # the seed, which is printed after each run.
33
- # --seed 1234
34
- config.order = "random"
35
- end
36
-
37
- def where_value(value)
38
- if ::Rails.version >= "4.2"
39
- case value
40
- when ::Arel::Nodes::Casted
41
- value.val
42
- when Array
43
- value.map{|v| where_value(v)}
44
- else
45
- value
46
- end
47
- else
48
- value
49
- end
50
- end
51
-
52
- def predicates(relation)
53
- if ::Rails.version >= '5'
54
- relation.where_clause.send(:predicates)
55
- else
56
- relation.where_values
57
- end
58
- end
59
-
60
- def bind_values(relation)
61
- if ::Rails.version >= '5'
62
- relation.where_clause.binds.map(&:value)
63
- else
64
- relation.bind_values.map(&:last)
65
- end
66
- end