sapor 0.3.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 (332) hide show
  1. checksums.yaml +7 -0
  2. data/Area Class Diagram.dia +0 -0
  3. data/Area Class Diagram.png +0 -0
  4. data/Class Diagram.dia +0 -0
  5. data/Class Diagram.png +0 -0
  6. data/Example-Catalonia.md +361 -0
  7. data/Example-Flanders.md +486 -0
  8. data/Example-Greece.md +25 -0
  9. data/Example-Oslo.md +678 -0
  10. data/Example-UnitedKingdom-Referendum.md +132 -0
  11. data/Examples.md +15 -0
  12. data/LICENSE +674 -0
  13. data/README.md +103 -0
  14. data/Rakefile +18 -0
  15. data/Technical Documentation.md +14 -0
  16. data/bin/create_installation_package.sh +49 -0
  17. data/bin/install.sh +45 -0
  18. data/bin/sapor.rb +24 -0
  19. data/bin/sapor.sh +106 -0
  20. data/data/hu/hungary-2014.txt +1680 -0
  21. data/data/hu/hungary_2014_screen_scraper.rb +48 -0
  22. data/data/hu/hungary_2014_to_psv.rb +80 -0
  23. data/data/hu/index-2014.txt +106 -0
  24. data/data/pl/2015-gl-lis-okr.csv +42 -0
  25. data/data/pl/poland_2015_to_psv.rb +79 -0
  26. data/data/pl/poland_2015_to_psv_with_ko_and_rsw.rb +94 -0
  27. data/data/pl/poland_2015_to_psv_with_ko_konf_kp_l_and_zp.rb +100 -0
  28. data/data/pl/poland_2015_to_psv_with_ko_sld_and_wi.rb +92 -0
  29. data/data/pl/poland_2015_to_psv_with_sld.rb +84 -0
  30. data/data/pl/poland_2015_to_psv_with_sld_and_wi.rb +85 -0
  31. data/data/uk/inject_ukip_2015_as_brexit_2019_in_2017.rb +54 -0
  32. data/data/uk/united_kingdom_2015.txt +651 -0
  33. data/data/uk/united_kingdom_2015_to_psv.rb +104 -0
  34. data/data/uk/united_kingdom_2017.txt +651 -0
  35. data/data/uk/united_kingdom_2017_to_psv.rb +104 -0
  36. data/data/uk/united_kingdom_2017_to_psv_with_brexit_and_chuk.rb +113 -0
  37. data/data/uk/united_kingdom_2017_to_psv_with_tig.rb +111 -0
  38. data/lib/sapor.rb +150 -0
  39. data/lib/sapor/binomials_cache.rb +45 -0
  40. data/lib/sapor/combinations_distribution.rb +222 -0
  41. data/lib/sapor/denominators.rb +67 -0
  42. data/lib/sapor/dichotomies.rb +138 -0
  43. data/lib/sapor/dichotomy.rb +164 -0
  44. data/lib/sapor/first_past_the_post.rb +82 -0
  45. data/lib/sapor/largest_remainder.rb +118 -0
  46. data/lib/sapor/log4r_logger.rb +49 -0
  47. data/lib/sapor/log_facade.rb +40 -0
  48. data/lib/sapor/multi_district_leveled_proportional.rb +64 -0
  49. data/lib/sapor/multi_district_proportional.rb +123 -0
  50. data/lib/sapor/multi_district_variable_threshold_proportional.rb +128 -0
  51. data/lib/sapor/number_formatter.rb +45 -0
  52. data/lib/sapor/options.rb +73 -0
  53. data/lib/sapor/poll.rb +286 -0
  54. data/lib/sapor/polychotomy.rb +200 -0
  55. data/lib/sapor/pseudorandom_multirange_enumerator.rb +87 -0
  56. data/lib/sapor/referendum_polychotomy.rb +165 -0
  57. data/lib/sapor/regional_data/area.rb +82 -0
  58. data/lib/sapor/regional_data/austria.rb +84 -0
  59. data/lib/sapor/regional_data/belgium-brussels-2014.psv +46 -0
  60. data/lib/sapor/regional_data/belgium-brussels-20190526.psv +33 -0
  61. data/lib/sapor/regional_data/belgium-flanders-2014.psv +80 -0
  62. data/lib/sapor/regional_data/belgium-flanders-20190526.psv +74 -0
  63. data/lib/sapor/regional_data/belgium-wallonia-2014.psv +114 -0
  64. data/lib/sapor/regional_data/belgium-wallonia-20190526.psv +93 -0
  65. data/lib/sapor/regional_data/belgium.rb +97 -0
  66. data/lib/sapor/regional_data/belgium_brussels.rb +62 -0
  67. data/lib/sapor/regional_data/belgium_flanders.rb +64 -0
  68. data/lib/sapor/regional_data/belgium_wallonia.rb +63 -0
  69. data/lib/sapor/regional_data/catalonia-2012-2015.psv +100 -0
  70. data/lib/sapor/regional_data/catalonia-2012.psv +87 -0
  71. data/lib/sapor/regional_data/catalonia-2015-jxcat.psv +68 -0
  72. data/lib/sapor/regional_data/catalonia-2015-no-jxsi.psv +68 -0
  73. data/lib/sapor/regional_data/catalonia-2015.psv +63 -0
  74. data/lib/sapor/regional_data/catalonia-jxcat.rb +109 -0
  75. data/lib/sapor/regional_data/catalonia-no-jxsi.rb +96 -0
  76. data/lib/sapor/regional_data/catalonia.rb +96 -0
  77. data/lib/sapor/regional_data/denmark-20150618-with-e-and-p.psv +164 -0
  78. data/lib/sapor/regional_data/denmark-20150618-with-e.psv +153 -0
  79. data/lib/sapor/regional_data/denmark-20150618-with-p.psv +153 -0
  80. data/lib/sapor/regional_data/denmark-20150618.psv +142 -0
  81. data/lib/sapor/regional_data/denmark.rb +128 -0
  82. data/lib/sapor/regional_data/denmark_with_e.rb +128 -0
  83. data/lib/sapor/regional_data/denmark_with_e_and_p.rb +128 -0
  84. data/lib/sapor/regional_data/denmark_with_p.rb +128 -0
  85. data/lib/sapor/regional_data/estonia.rb +88 -0
  86. data/lib/sapor/regional_data/european-union-great-britain-20140522-brexit-chuk.psv +172 -0
  87. data/lib/sapor/regional_data/european-union-great-britain-20140522.psv +146 -0
  88. data/lib/sapor/regional_data/european-union-great-britain-20190523.psv +141 -0
  89. data/lib/sapor/regional_data/european-union-ireland-2014-ia-ri-sd.psv +64 -0
  90. data/lib/sapor/regional_data/european-union-ireland-2014-ia-sd.psv +60 -0
  91. data/lib/sapor/regional_data/european-union-ireland-2014-ia.psv +56 -0
  92. data/lib/sapor/regional_data/european-union-ireland-2014-sd.psv +56 -0
  93. data/lib/sapor/regional_data/european-union-ireland-2014.psv +50 -0
  94. data/lib/sapor/regional_data/european-union-ireland-20190524-ia.psv +58 -0
  95. data/lib/sapor/regional_data/european-union-ireland-20190524.psv +52 -0
  96. data/lib/sapor/regional_data/european_union_27_austria.rb +76 -0
  97. data/lib/sapor/regional_data/european_union_27_croatia.rb +81 -0
  98. data/lib/sapor/regional_data/european_union_27_denmark.rb +77 -0
  99. data/lib/sapor/regional_data/european_union_27_estonia.rb +74 -0
  100. data/lib/sapor/regional_data/european_union_27_finland.rb +74 -0
  101. data/lib/sapor/regional_data/european_union_27_ireland.rb +96 -0
  102. data/lib/sapor/regional_data/european_union_27_ireland_with_ia.rb +97 -0
  103. data/lib/sapor/regional_data/european_union_27_italy.rb +84 -0
  104. data/lib/sapor/regional_data/european_union_27_netherlands.rb +81 -0
  105. data/lib/sapor/regional_data/european_union_27_poland.rb +84 -0
  106. data/lib/sapor/regional_data/european_union_27_romania.rb +78 -0
  107. data/lib/sapor/regional_data/european_union_27_slovakia.rb +80 -0
  108. data/lib/sapor/regional_data/european_union_27_spain.rb +82 -0
  109. data/lib/sapor/regional_data/european_union_27_sweden.rb +76 -0
  110. data/lib/sapor/regional_data/european_union_austria.rb +76 -0
  111. data/lib/sapor/regional_data/european_union_bulgaria.rb +81 -0
  112. data/lib/sapor/regional_data/european_union_croatia.rb +81 -0
  113. data/lib/sapor/regional_data/european_union_cyprus.rb +72 -0
  114. data/lib/sapor/regional_data/european_union_czech_republic.rb +82 -0
  115. data/lib/sapor/regional_data/european_union_denmark.rb +77 -0
  116. data/lib/sapor/regional_data/european_union_estonia.rb +74 -0
  117. data/lib/sapor/regional_data/european_union_finland.rb +74 -0
  118. data/lib/sapor/regional_data/european_union_flanders.rb +74 -0
  119. data/lib/sapor/regional_data/european_union_france.rb +84 -0
  120. data/lib/sapor/regional_data/european_union_france_2019.rb +84 -0
  121. data/lib/sapor/regional_data/european_union_french_community_of_belgium.rb +73 -0
  122. data/lib/sapor/regional_data/european_union_germany.rb +86 -0
  123. data/lib/sapor/regional_data/european_union_great_britain.rb +98 -0
  124. data/lib/sapor/regional_data/european_union_greece.rb +77 -0
  125. data/lib/sapor/regional_data/european_union_hungary.rb +76 -0
  126. data/lib/sapor/regional_data/european_union_ireland.rb +96 -0
  127. data/lib/sapor/regional_data/european_union_ireland_with_ia.rb +97 -0
  128. data/lib/sapor/regional_data/european_union_italy.rb +84 -0
  129. data/lib/sapor/regional_data/european_union_latvia.rb +81 -0
  130. data/lib/sapor/regional_data/european_union_lithuania.rb +80 -0
  131. data/lib/sapor/regional_data/european_union_luxembourg.rb +75 -0
  132. data/lib/sapor/regional_data/european_union_malta.rb +71 -0
  133. data/lib/sapor/regional_data/european_union_netherlands.rb +81 -0
  134. data/lib/sapor/regional_data/european_union_northern_ireland.rb +75 -0
  135. data/lib/sapor/regional_data/european_union_poland.rb +84 -0
  136. data/lib/sapor/regional_data/european_union_portugal.rb +75 -0
  137. data/lib/sapor/regional_data/european_union_romania.rb +78 -0
  138. data/lib/sapor/regional_data/european_union_slovakia.rb +81 -0
  139. data/lib/sapor/regional_data/european_union_slovenia.rb +85 -0
  140. data/lib/sapor/regional_data/european_union_spain.rb +82 -0
  141. data/lib/sapor/regional_data/european_union_sweden.rb +76 -0
  142. data/lib/sapor/regional_data/finland-20150419-with-sin.psv +224 -0
  143. data/lib/sapor/regional_data/finland-20150419.psv +212 -0
  144. data/lib/sapor/regional_data/finland.rb +107 -0
  145. data/lib/sapor/regional_data/finland_with_sin.rb +107 -0
  146. data/lib/sapor/regional_data/flanders-2014.psv +96 -0
  147. data/lib/sapor/regional_data/flanders-20190526.psv +87 -0
  148. data/lib/sapor/regional_data/flanders.rb +115 -0
  149. data/lib/sapor/regional_data/france.rb +38 -0
  150. data/lib/sapor/regional_data/greece.rb +92 -0
  151. data/lib/sapor/regional_data/hungary-2014.psv +2104 -0
  152. data/lib/sapor/regional_data/hungary.rb +116 -0
  153. data/lib/sapor/regional_data/iceland-20161029-midflokkurinn.psv +94 -0
  154. data/lib/sapor/regional_data/iceland-20161029.psv +88 -0
  155. data/lib/sapor/regional_data/iceland-20171028.psv +85 -0
  156. data/lib/sapor/regional_data/iceland.rb +133 -0
  157. data/lib/sapor/regional_data/latvia-20141004-kpv-p-par.psv +109 -0
  158. data/lib/sapor/regional_data/latvia-20141004-kpv-par.psv +103 -0
  159. data/lib/sapor/regional_data/latvia-20141004-kpv.psv +97 -0
  160. data/lib/sapor/regional_data/latvia-20141004.psv +89 -0
  161. data/lib/sapor/regional_data/latvia.rb +112 -0
  162. data/lib/sapor/regional_data/latvia_kpv.rb +112 -0
  163. data/lib/sapor/regional_data/latvia_kpv_p_par.rb +112 -0
  164. data/lib/sapor/regional_data/latvia_kpv_par.rb +112 -0
  165. data/lib/sapor/regional_data/luxembourg-20131020.psv +76 -0
  166. data/lib/sapor/regional_data/luxembourg.rb +82 -0
  167. data/lib/sapor/regional_data/netherlands.rb +108 -0
  168. data/lib/sapor/regional_data/norway.rb +425 -0
  169. data/lib/sapor/regional_data/norwegian_municipality.rb +68 -0
  170. data/lib/sapor/regional_data/poland-20151025-with-ko-and-l-without-n-po-r-and-zl.psv +321 -0
  171. data/lib/sapor/regional_data/poland-20151025-with-ko-konf-kp-l-and-zp-without-k-k15-n-pis-po-psl-r-and-zl.psv +280 -0
  172. data/lib/sapor/regional_data/poland-20151025-with-ko-sld-and-wi-without-n-po-and-zl.psv +403 -0
  173. data/lib/sapor/regional_data/poland-20151025-with-sld-and-wi-without-zl.psv +444 -0
  174. data/lib/sapor/regional_data/poland-20151025-with-sld-without-zl.psv +403 -0
  175. data/lib/sapor/regional_data/poland-20151025.psv +403 -0
  176. data/lib/sapor/regional_data/poland.rb +125 -0
  177. data/lib/sapor/regional_data/poland_with_ko_and_l_without_n_po_r_and_zl.rb +122 -0
  178. data/lib/sapor/regional_data/poland_with_ko_konf_kp_l_and_zp_without_k_k15_n_pis_po_psl_r_and_zl.rb +123 -0
  179. data/lib/sapor/regional_data/poland_with_ko_sld_and_wi_without_n_po_and_zl.rb +125 -0
  180. data/lib/sapor/regional_data/poland_with_sld_and_wi_without_zl.rb +126 -0
  181. data/lib/sapor/regional_data/poland_with_sld_without_zl.rb +126 -0
  182. data/lib/sapor/regional_data/portugal-20151004-with-a-and-ch-without-paf.psv +438 -0
  183. data/lib/sapor/regional_data/portugal-20151004-with-a-and-il-without-paf.psv +438 -0
  184. data/lib/sapor/regional_data/portugal-20151004-with-a-ch-and-il-without-paf.psv +461 -0
  185. data/lib/sapor/regional_data/portugal-20151004-with-a-without-paf.psv +415 -0
  186. data/lib/sapor/regional_data/portugal-20151004-with-ch-and-il-without-paf.psv +438 -0
  187. data/lib/sapor/regional_data/portugal-20151004-without-paf.psv +392 -0
  188. data/lib/sapor/regional_data/portugal-20151004.psv +370 -0
  189. data/lib/sapor/regional_data/portugal.rb +101 -0
  190. data/lib/sapor/regional_data/portugal_with_a_and_ch_without_paf.rb +92 -0
  191. data/lib/sapor/regional_data/portugal_with_a_and_il_without_paf.rb +92 -0
  192. data/lib/sapor/regional_data/portugal_with_a_ch_and_il_without_paf.rb +92 -0
  193. data/lib/sapor/regional_data/portugal_with_a_without_paf.rb +92 -0
  194. data/lib/sapor/regional_data/portugal_with_ch_and_il_without_paf.rb +92 -0
  195. data/lib/sapor/regional_data/portugal_without_paf.rb +92 -0
  196. data/lib/sapor/regional_data/slovakia.rb +81 -0
  197. data/lib/sapor/regional_data/slovenia.rb +114 -0
  198. data/lib/sapor/regional_data/spain-20160626.psv +619 -0
  199. data/lib/sapor/regional_data/spain.rb +136 -0
  200. data/lib/sapor/regional_data/sweden.rb +92 -0
  201. data/lib/sapor/regional_data/sweden_20140914.rb +89 -0
  202. data/lib/sapor/regional_data/united_kingdom-2015.psv +4358 -0
  203. data/lib/sapor/regional_data/united_kingdom-20170608-brexit-chuk.psv +5154 -0
  204. data/lib/sapor/regional_data/united_kingdom-20170608-brexit.psv +4521 -0
  205. data/lib/sapor/regional_data/united_kingdom-20170608-tig.psv +4529 -0
  206. data/lib/sapor/regional_data/united_kingdom-20170608.psv +3894 -0
  207. data/lib/sapor/regional_data/united_kingdom.rb +94 -0
  208. data/lib/sapor/regional_data/united_kingdom_with_brexit.rb +110 -0
  209. data/lib/sapor/regional_data/united_kingdom_with_brexit_and_chuk.rb +111 -0
  210. data/lib/sapor/regional_data/united_kingdom_with_tig.rb +111 -0
  211. data/lib/sapor/regional_data/utopia.rb +66 -0
  212. data/lib/sapor/regional_data/wallonia-2014.psv +101 -0
  213. data/lib/sapor/regional_data/wallonia-20190526.psv +88 -0
  214. data/lib/sapor/regional_data/wallonia.rb +112 -0
  215. data/lib/sapor/representatives_polychotomy.rb +338 -0
  216. data/lib/sapor/single_district_proportional.rb +75 -0
  217. data/sapor.gemspec +35 -0
  218. data/spec/integration/area_spec.rb +28 -0
  219. data/spec/integration/poll_spec.rb +112 -0
  220. data/spec/integration/sample.poll +8 -0
  221. data/spec/spec_helper.rb +31 -0
  222. data/spec/unit/area_spec.rb +115 -0
  223. data/spec/unit/austria_spec.rb +76 -0
  224. data/spec/unit/belgium_brussels_spec.rb +58 -0
  225. data/spec/unit/belgium_flanders_spec.rb +62 -0
  226. data/spec/unit/belgium_spec.rb +26 -0
  227. data/spec/unit/belgium_wallonia_spec.rb +65 -0
  228. data/spec/unit/binomials_cache_spec.rb +34 -0
  229. data/spec/unit/catalonia_spec.rb +74 -0
  230. data/spec/unit/combinations_distribution_spec.rb +241 -0
  231. data/spec/unit/denmark_spec.rb +56 -0
  232. data/spec/unit/denmark_with_e_and_p_spec.rb +58 -0
  233. data/spec/unit/denmark_with_e_spec.rb +57 -0
  234. data/spec/unit/denmark_with_p_spec.rb +57 -0
  235. data/spec/unit/denominators_spec.rb +40 -0
  236. data/spec/unit/dichotomies_spec.rb +154 -0
  237. data/spec/unit/dichotomy_spec.rb +320 -0
  238. data/spec/unit/estonia_spec.rb +65 -0
  239. data/spec/unit/european_union_27_austria_spec.rb +61 -0
  240. data/spec/unit/european_union_27_croatia_spec.rb +60 -0
  241. data/spec/unit/european_union_27_denmark_spec.rb +62 -0
  242. data/spec/unit/european_union_27_estonia_spec.rb +94 -0
  243. data/spec/unit/european_union_27_finland_spec.rb +75 -0
  244. data/spec/unit/european_union_27_ireland_spec.rb +72 -0
  245. data/spec/unit/european_union_27_ireland_with_ia_spec.rb +74 -0
  246. data/spec/unit/european_union_27_italy_spec.rb +69 -0
  247. data/spec/unit/european_union_27_netherlands_spec.rb +81 -0
  248. data/spec/unit/european_union_27_poland_spec.rb +69 -0
  249. data/spec/unit/european_union_27_romania_spec.rb +67 -0
  250. data/spec/unit/european_union_27_slovakia_spec.rb +111 -0
  251. data/spec/unit/european_union_27_spain_spec.rb +130 -0
  252. data/spec/unit/european_union_27_sweden_spec.rb +89 -0
  253. data/spec/unit/european_union_austria_spec.rb +61 -0
  254. data/spec/unit/european_union_bulgaria_spec.rb +97 -0
  255. data/spec/unit/european_union_croatia_spec.rb +59 -0
  256. data/spec/unit/european_union_cyprus_spec.rb +65 -0
  257. data/spec/unit/european_union_czech_republic_spec.rb +125 -0
  258. data/spec/unit/european_union_denmark_spec.rb +61 -0
  259. data/spec/unit/european_union_estonia_spec.rb +93 -0
  260. data/spec/unit/european_union_finland_spec.rb +75 -0
  261. data/spec/unit/european_union_flanders_spec.rb +56 -0
  262. data/spec/unit/european_union_france_2019_spec.rb +73 -0
  263. data/spec/unit/european_union_france_spec.rb +73 -0
  264. data/spec/unit/european_union_french_community_of_belgium_spec.rb +61 -0
  265. data/spec/unit/european_union_germany_spec.rb +90 -0
  266. data/spec/unit/european_union_great_britain_spec.rb +87 -0
  267. data/spec/unit/european_union_greece_spec.rb +148 -0
  268. data/spec/unit/european_union_hungary_spec.rb +57 -0
  269. data/spec/unit/european_union_ireland_spec.rb +72 -0
  270. data/spec/unit/european_union_ireland_with_ia_spec.rb +74 -0
  271. data/spec/unit/european_union_italy_spec.rb +69 -0
  272. data/spec/unit/european_union_latvia_spec.rb +76 -0
  273. data/spec/unit/european_union_lithuania_spec.rb +68 -0
  274. data/spec/unit/european_union_luxembourg_spec.rb +63 -0
  275. data/spec/unit/european_union_malta_spec.rb +60 -0
  276. data/spec/unit/european_union_netherlands_spec.rb +81 -0
  277. data/spec/unit/european_union_northern_ireland_spec.rb +66 -0
  278. data/spec/unit/european_union_poland_spec.rb +69 -0
  279. data/spec/unit/european_union_portugal_spec.rb +77 -0
  280. data/spec/unit/european_union_romania_spec.rb +67 -0
  281. data/spec/unit/european_union_slovakia_spec.rb +111 -0
  282. data/spec/unit/european_union_slovenia_spec.rb +77 -0
  283. data/spec/unit/european_union_spain_spec.rb +129 -0
  284. data/spec/unit/european_union_sweden_spec.rb +89 -0
  285. data/spec/unit/finland_spec.rb +65 -0
  286. data/spec/unit/finland_with_sin_spec.rb +67 -0
  287. data/spec/unit/first_past_the_post_spec.rb +54 -0
  288. data/spec/unit/flanders_spec.rb +70 -0
  289. data/spec/unit/france_spec.rb +32 -0
  290. data/spec/unit/greece_spec.rb +118 -0
  291. data/spec/unit/hungary_spec.rb +132 -0
  292. data/spec/unit/iceland_spec.rb +57 -0
  293. data/spec/unit/largest_remainder_spec.rb +79 -0
  294. data/spec/unit/latvia_kpv_p_par_spec.rb +38 -0
  295. data/spec/unit/latvia_kpv_par_spec.rb +38 -0
  296. data/spec/unit/latvia_kpv_spec.rb +38 -0
  297. data/spec/unit/latvia_spec.rb +60 -0
  298. data/spec/unit/luxembourg_spec.rb +54 -0
  299. data/spec/unit/multi_district_leveled_proportional_spec.rb +49 -0
  300. data/spec/unit/multi_district_proportional_spec.rb +81 -0
  301. data/spec/unit/netherlands_spec.rb +107 -0
  302. data/spec/unit/norway_spec.rb +64 -0
  303. data/spec/unit/norwegian_municipality_spec.rb +89 -0
  304. data/spec/unit/number_formatter_spec.rb +173 -0
  305. data/spec/unit/poland_spec.rb +62 -0
  306. data/spec/unit/poland_with_ko_and_l_without_n_po_r_and_zl_spec.rb +60 -0
  307. data/spec/unit/poland_with_ko_konf_kp_l_and_zp_without_k_k15_n_pis_po_psl_r_and_zl_spec.rb +59 -0
  308. data/spec/unit/poland_with_ko_sld_and_wi_without_n_po_and_zl_spec.rb +62 -0
  309. data/spec/unit/poland_with_sld_and_wi_without_zl_spec.rb +63 -0
  310. data/spec/unit/poland_with_sld_without_zl_spec.rb +62 -0
  311. data/spec/unit/poll_spec.rb +110 -0
  312. data/spec/unit/portugal_spec.rb +66 -0
  313. data/spec/unit/portugal_with_a_and_ch_without_paf_spec.rb +68 -0
  314. data/spec/unit/portugal_with_a_and_il_without_paf_spec.rb +68 -0
  315. data/spec/unit/portugal_with_a_ch_and_il_without_paf_spec.rb +69 -0
  316. data/spec/unit/portugal_with_a_without_paf_spec.rb +67 -0
  317. data/spec/unit/portugal_with_ch_and_il_without_paf_spec.rb +68 -0
  318. data/spec/unit/portugal_without_paf_spec.rb +66 -0
  319. data/spec/unit/pseudorandom_multirange_enumerator_spec.rb +82 -0
  320. data/spec/unit/referendum_polychotomy_spec.rb +289 -0
  321. data/spec/unit/representatives_polychotomy_spec.rb +332 -0
  322. data/spec/unit/slovakia_spec.rb +99 -0
  323. data/spec/unit/slovenia_spec.rb +80 -0
  324. data/spec/unit/spain_spec.rb +101 -0
  325. data/spec/unit/sweden_20140914_spec.rb +112 -0
  326. data/spec/unit/sweden_spec.rb +113 -0
  327. data/spec/unit/united_kingdom_spec.rb +65 -0
  328. data/spec/unit/united_kingdom_with_brexit_and_chuk_spec.rb +67 -0
  329. data/spec/unit/united_kingdom_with_brexit_spec.rb +66 -0
  330. data/spec/unit/united_kingdom_with_tig_spec.rb +66 -0
  331. data/spec/unit/wallonia_spec.rb +70 -0
  332. metadata +490 -0
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ describe Sapor::Norway, '#area_code' do
23
+ it 'returns NO as the area code' do
24
+ expect(Sapor::Norway.instance.area_code).to eq('NO')
25
+ end
26
+ end
27
+
28
+ describe Sapor::Norway, '#no_of_seats' do
29
+ it 'returns 169 as the number of seats' do
30
+ expect(Sapor::Norway.instance.no_of_seats).to eq(169)
31
+ end
32
+ end
33
+
34
+ describe Sapor::Norway, '#population_size' do
35
+ it 'returns a population size of 2,836,029' do
36
+ expect(Sapor::Norway.instance.population_size).to eq(2_836_029)
37
+ end
38
+ end
39
+
40
+ describe Sapor::Norway, '#seats' do
41
+ it 'calculates the number of seats for the election of 2015 correctly' do
42
+ norway = Sapor::Norway.instance
43
+ results = norway.overall_election_results_of_2015
44
+ seats = norway.seats(results)
45
+ expect(seats['Arbeiderpartiet']).to eq(55)
46
+ expect(seats['Høyre']).to eq(48)
47
+ expect(seats['Fremskrittspartiet']).to eq(29)
48
+ expect(seats['Kristelig Folkeparti']).to eq(10)
49
+ expect(seats['Senterpartiet']).to eq(10)
50
+ expect(seats['Venstre']).to eq(9)
51
+ expect(seats['Sosialistisk Venstreparti']).to eq(7)
52
+ expect(seats['Miljøpartiet de Grønne']).to eq(1)
53
+ expect(seats['Rødt']).to eq(0)
54
+ expect(seats['De Kristne']).to eq(0)
55
+ expect(seats['Pensjonistpartiet']).to eq(0)
56
+ expect(seats['Piratpartiet']).to eq(0)
57
+ expect(seats['Kystpartiet']).to eq(0)
58
+ expect(seats['Demokratene i Norge']).to eq(0)
59
+ expect(seats['Kristent Samlingsparti']).to eq(0)
60
+ expect(seats['Det Liberale Folkepartiet']).to eq(0)
61
+ expect(seats['Norges Kommunistiske Parti']).to eq(0)
62
+ expect(seats['Samfunnspartiet']).to eq(0)
63
+ end
64
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ describe Sapor::NorwegianMunicipality, '#area_code' do
23
+ it 'returns NO-0301 as the area code' do
24
+ expect(Sapor::NorwegianMunicipality::OSLO.area_code).to eq('NO-0301')
25
+ end
26
+ end
27
+
28
+ describe Sapor::NorwegianMunicipality, '#coalitions' do
29
+ it 'returns H+KrF+V, H+Frp, Frp+H+KrF+V, Ap+Sp+SV and Ap+Sp+SV+MDG+R as' \
30
+ ' the coalitions to track' do
31
+ expect(Sapor::NorwegianMunicipality::OSLO.coalitions).to \
32
+ include(['Høyre', 'Kristelig Folkeparti', 'Venstre'])
33
+ expect(Sapor::NorwegianMunicipality::OSLO.coalitions).to \
34
+ include(%w(Fremskrittspartiet Høyre))
35
+ expect(Sapor::NorwegianMunicipality::OSLO.coalitions).to \
36
+ include(['Fremskrittspartiet', 'Høyre', 'Kristelig Folkeparti',
37
+ 'Venstre'])
38
+ expect(Sapor::NorwegianMunicipality::OSLO.coalitions).to \
39
+ include(['Arbeiderpartiet', 'Senterpartiet', 'Sosialistisk Venstreparti'])
40
+ expect(Sapor::NorwegianMunicipality::OSLO.coalitions).to \
41
+ include(['Arbeiderpartiet', 'Miljøpartiet de Grønne', 'Rødt',
42
+ 'Senterpartiet', 'Sosialistisk Venstreparti'])
43
+ expect(Sapor::NorwegianMunicipality::OSLO.coalitions).to \
44
+ include(['Kristelig Folkeparti', 'Senterpartiet', 'Venstre'])
45
+ end
46
+ end
47
+
48
+ describe Sapor::NorwegianMunicipality, '#no_of_seats' do
49
+ it 'returns 59 as the number of seats' do
50
+ expect(Sapor::NorwegianMunicipality::OSLO.no_of_seats).to eq(59)
51
+ end
52
+ end
53
+
54
+ describe Sapor::NorwegianMunicipality, '#population_size' do
55
+ it 'returns a population size of 511,400' do
56
+ expect(Sapor::NorwegianMunicipality::OSLO.population_size).to eq(511_400)
57
+ end
58
+ end
59
+
60
+ describe Sapor::NorwegianMunicipality, '#seats' do
61
+ it 'calculates the number of seats for the election of 2011 correctly' do
62
+ oslo = Sapor::NorwegianMunicipality::OSLO
63
+ results = { 'Høyre' => 103_426, 'Arbeiderpartiet' => 95_262,
64
+ 'Venstre' => 22_879, 'Fremskrittspartiet' => 20_672,
65
+ 'Sosialistisk Venstreparti' => 17_772, 'Rødt' => 10_236,
66
+ 'Kristelig Folkeparti' => 7_094,
67
+ 'Miljøpartiet de Grønne' => 6_706, 'Senterpartiet' => 1_482,
68
+ 'Pensjonistpartiet' => 989, 'Kristent Samlingsparti' => 220,
69
+ 'Det Liberale Folkepartiet' => 217,
70
+ 'Norges Kommunistiske Parti' => 192, 'Demokratene' => 187,
71
+ 'Kystpartiet' => 119 }
72
+ seats = oslo.seats(results)
73
+ expect(seats['Høyre']).to eq(22)
74
+ expect(seats['Arbeiderpartiet']).to eq(20)
75
+ expect(seats['Venstre']).to eq(5)
76
+ expect(seats['Fremskrittspartiet']).to eq(4)
77
+ expect(seats['Sosialistisk Venstreparti']).to eq(4)
78
+ expect(seats['Rødt']).to eq(2)
79
+ expect(seats['Kristelig Folkeparti']).to eq(1)
80
+ expect(seats['Miljøpartiet de Grønne']).to eq(1)
81
+ expect(seats['Senterpartiet']).to eq(0)
82
+ expect(seats['Pensjonistpartiet']).to eq(0)
83
+ expect(seats['Kristent Samlingsparti']).to eq(0)
84
+ expect(seats['Det Liberale Folkepartiet']).to eq(0)
85
+ expect(seats['Norges Kommunistiske Parti']).to eq(0)
86
+ expect(seats['Demokratene']).to eq(0)
87
+ expect(seats['Kystpartiet']).to eq(0)
88
+ end
89
+ end
@@ -0,0 +1,173 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ #
23
+ # Test class that mixes in the PercentageFormatter.
24
+ #
25
+ class Formatter
26
+ include Sapor::NumberFormatter
27
+ end
28
+
29
+ describe Sapor::NumberFormatter, '#three_digits_percentage' do
30
+ it 'formats 10 as 1000%' do
31
+ output = Formatter.new.three_digits_percentage(10)
32
+ expect(output).to eq('1000%')
33
+ end
34
+
35
+ it 'formats 1 as 100%' do
36
+ output = Formatter.new.three_digits_percentage(1)
37
+ expect(output).to eq('100%')
38
+ end
39
+
40
+ it 'formats 0.9995 as 100%' do
41
+ output = Formatter.new.three_digits_percentage(0.9995)
42
+ expect(output).to eq('100%')
43
+ end
44
+
45
+ it 'formats 0.99949 as 99.9%' do
46
+ output = Formatter.new.three_digits_percentage(0.99949)
47
+ expect(output).to eq('99.9%')
48
+ end
49
+
50
+ it 'formats 0.09995 as 10.0%' do
51
+ output = Formatter.new.three_digits_percentage(0.09995)
52
+ expect(output).to eq('10.0%')
53
+ end
54
+
55
+ it 'formats 0.099949 as 9.99%' do
56
+ output = Formatter.new.three_digits_percentage(0.099949)
57
+ expect(output).to eq('9.99%')
58
+ end
59
+
60
+ it 'formats 0.009995 as 1.00%' do
61
+ output = Formatter.new.three_digits_percentage(0.009995)
62
+ expect(output).to eq('1.00%')
63
+ end
64
+
65
+ it 'formats 0.0099949 as 0.999%' do
66
+ output = Formatter.new.three_digits_percentage(0.0099949)
67
+ expect(output).to eq('0.999%')
68
+ end
69
+
70
+ it 'formats 0.000005 as 0.001%' do
71
+ output = Formatter.new.three_digits_percentage(0.000005)
72
+ expect(output).to eq('0.001%')
73
+ end
74
+
75
+ it 'formats 0.0000049 as 0%' do
76
+ output = Formatter.new.three_digits_percentage(0.0000049)
77
+ expect(output).to eq('0%')
78
+ end
79
+
80
+ it 'formats 0 as 0%' do
81
+ output = Formatter.new.three_digits_percentage(0)
82
+ expect(output).to eq('0%')
83
+ end
84
+ end
85
+
86
+ describe Sapor::NumberFormatter, '#six_char_percentage' do
87
+ it 'formats 1 as 100.0%' do
88
+ output = Formatter.new.six_char_percentage(1)
89
+ expect(output).to eq('100.0%')
90
+ end
91
+
92
+ it 'formats 0.9995 as 100.0%' do
93
+ output = Formatter.new.six_char_percentage(0.9995)
94
+ expect(output).to eq('100.0%')
95
+ end
96
+
97
+ it 'formats 0.99949 as 99.9%' do
98
+ output = Formatter.new.six_char_percentage(0.99949)
99
+ expect(output).to eq(' 99.9%')
100
+ end
101
+
102
+ it 'formats 0.0995 as 10.0%' do
103
+ output = Formatter.new.six_char_percentage(0.0995)
104
+ expect(output).to eq(' 10.0%')
105
+ end
106
+
107
+ it 'formats 0.09949 as 9.9%' do
108
+ output = Formatter.new.six_char_percentage(0.09949)
109
+ expect(output).to eq(' 9.9%')
110
+ end
111
+
112
+ it 'formats 0.00951 as 1.0%' do
113
+ output = Formatter.new.six_char_percentage(0.00951)
114
+ expect(output).to eq(' 1.0%')
115
+ end
116
+
117
+ it 'formats 0.00949 as 0.9%' do
118
+ output = Formatter.new.six_char_percentage(0.00949)
119
+ expect(output).to eq(' 0.9%')
120
+ end
121
+
122
+ it 'formats 0.0005 as 0.1%' do
123
+ output = Formatter.new.six_char_percentage(0.0005)
124
+ expect(output).to eq(' 0.1%')
125
+ end
126
+
127
+ it 'formats 0.00049 as 0.0%' do
128
+ output = Formatter.new.six_char_percentage(0.00049)
129
+ expect(output).to eq(' 0.0%')
130
+ end
131
+
132
+ it 'formats 0 as 0.0%' do
133
+ output = Formatter.new.six_char_percentage(0)
134
+ expect(output).to eq(' 0.0%')
135
+ end
136
+ end
137
+
138
+ describe Sapor::NumberFormatter, '#with_thousands_separator' do
139
+ it 'formats 0 as 0' do
140
+ output = Formatter.new.with_thousands_separator(0)
141
+ expect(output).to eq('0')
142
+ end
143
+
144
+ it 'formats 1 as 1' do
145
+ output = Formatter.new.with_thousands_separator(1)
146
+ expect(output).to eq('1')
147
+ end
148
+
149
+ it 'formats 999 as 999' do
150
+ output = Formatter.new.with_thousands_separator(999)
151
+ expect(output).to eq('999')
152
+ end
153
+
154
+ it 'formats 1_000 as 1,000' do
155
+ output = Formatter.new.with_thousands_separator(1_000)
156
+ expect(output).to eq('1,000')
157
+ end
158
+
159
+ it 'formats 999_999 as 999,999' do
160
+ output = Formatter.new.with_thousands_separator(999_999)
161
+ expect(output).to eq('999,999')
162
+ end
163
+
164
+ it 'formats 1_000_000 as 1,000,000' do
165
+ output = Formatter.new.with_thousands_separator(1_000_000)
166
+ expect(output).to eq('1,000,000')
167
+ end
168
+
169
+ it 'formats 999_999_999 as 999,999,999' do
170
+ output = Formatter.new.with_thousands_separator(999_999_999)
171
+ expect(output).to eq('999,999,999')
172
+ end
173
+ end
@@ -0,0 +1,62 @@
1
+ #
2
+ # Statistical Analysis of Polling Results (SAPoR)
3
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
4
+ #
5
+ # This file is part of SAPoR.
6
+ #
7
+ # SAPoR is free software: you can redistribute it and/or modify it under the
8
+ # terms of the GNU General Public License as published by the Free Software
9
+ # Foundation, either version 3 of the License, or (at your option) any later
10
+ # version.
11
+ #
12
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
13
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15
+ #
16
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Sapor::Poland, '#area_code' do
22
+ it 'returns PL as the area code' do
23
+ expect(Sapor::Poland.instance.area_code).to eq('PL')
24
+ end
25
+ end
26
+
27
+ describe Sapor::Poland, '#no_of_seats' do
28
+ it 'returns 460 as the number of seats' do
29
+ expect(Sapor::Poland.instance.no_of_seats).to eq(460)
30
+ end
31
+ end
32
+
33
+ describe Sapor::Poland, '#population_size' do
34
+ it 'returns a population size of 15,200,671' do
35
+ expect(Sapor::Poland.instance.population_size).to eq(15_200_671)
36
+ end
37
+ end
38
+
39
+ describe Sapor::Poland, '#seats' do
40
+ it 'calculates the number of seats for the election of 2015 correctly' do
41
+ Poland = Sapor::Poland.instance
42
+ results = Poland.overall_election_results_of_2015
43
+ seats = Poland.seats(results)
44
+ expect(seats['Prawo i Sprawiedliwość']).to eq(235)
45
+ expect(seats['Platforma Obywatelska']).to eq(138)
46
+ expect(seats['Kukiz’15']).to eq(42)
47
+ expect(seats['.Nowoczesna']).to eq(28)
48
+ expect(seats['Polskie Stronnictwo Ludowe']).to eq(16)
49
+ expect(seats['Mniejszość Niemiecka']).to eq(1)
50
+ expect(seats['Zjednoczona Lewica']).to eq(0)
51
+ expect(seats['Lewica Razem']).to eq(0)
52
+ expect(seats['KORWiN']).to eq(0)
53
+ expect(seats['JOW Bezpartyjni']).to eq(0)
54
+ expect(seats['Stonoga Partia Polska']).to eq(0)
55
+ expect(seats['Ruch Społeczny Rzeczypospolitej Polskiej']).to eq(0)
56
+ expect(seats['Zjednoczeni dla Śląska']).to eq(0)
57
+ expect(seats['Samoobrona']).to eq(0)
58
+ expect(seats['Grzegorz Braun „Szczęść Boże!”']).to eq(0)
59
+ expect(seats['Kongres Nowej Prawicy']).to eq(0)
60
+ expect(seats['Obywatele do Parlamentu']).to eq(0)
61
+ end
62
+ end
@@ -0,0 +1,60 @@
1
+ #
2
+ # Statistical Analysis of Polling Results (SAPoR)
3
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
4
+ #
5
+ # This file is part of SAPoR.
6
+ #
7
+ # SAPoR is free software: you can redistribute it and/or modify it under the
8
+ # terms of the GNU General Public License as published by the Free Software
9
+ # Foundation, either version 3 of the License, or (at your option) any later
10
+ # version.
11
+ #
12
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
13
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15
+ #
16
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Sapor::PolandWithKoAndLWithoutNPoRAndZl, '#area_code' do
22
+ it 'returns PL∪{KO,L}\{N,PO,R,ZL} as the area code' do
23
+ expect(Sapor::PolandWithKoAndLWithoutNPoRAndZl.instance.area_code).to eq('PL∪{KO,L}\{N,PO,R,ZL}')
24
+ end
25
+ end
26
+
27
+ describe Sapor::PolandWithKoAndLWithoutNPoRAndZl, '#no_of_seats' do
28
+ it 'returns 460 as the number of seats' do
29
+ expect(Sapor::PolandWithKoAndLWithoutNPoRAndZl.instance.no_of_seats).to eq(460)
30
+ end
31
+ end
32
+
33
+ describe Sapor::PolandWithKoAndLWithoutNPoRAndZl, '#population_size' do
34
+ it 'returns a population size of 15,200,671' do
35
+ expect(Sapor::PolandWithKoAndLWithoutNPoRAndZl.instance.population_size).to eq(15_200_671)
36
+ end
37
+ end
38
+
39
+ describe Sapor::PolandWithKoAndLWithoutNPoRAndZl, '#seats' do
40
+ it 'calculates the number of seats for the election of 2015 correctly' do
41
+ PolandWithKoAndLWithoutNPoRAndZl = Sapor::PolandWithKoAndLWithoutNPoRAndZl.instance
42
+ results = PolandWithKoAndLWithoutNPoRAndZl.overall_election_results_of_2015
43
+ seats = PolandWithKoAndLWithoutNPoRAndZl.seats(results)
44
+ expect(seats['Prawo i Sprawiedliwość']).to eq(235 - 30)
45
+ expect(seats['Koalicja Obywatelska']).to eq(138 + 24)
46
+ expect(seats['Kukiz’15']).to eq(42 - 7)
47
+ expect(seats['Polskie Stronnictwo Ludowe']).to eq(16 - 4)
48
+ expect(seats['Mniejszość Niemiecka']).to eq(1)
49
+ expect(seats['Lewica']).to eq(0 + 45)
50
+ expect(seats['KORWiN']).to eq(0)
51
+ expect(seats['JOW Bezpartyjni']).to eq(0)
52
+ expect(seats['Stonoga Partia Polska']).to eq(0)
53
+ expect(seats['Ruch Społeczny Rzeczypospolitej Polskiej']).to eq(0)
54
+ expect(seats['Zjednoczeni dla Śląska']).to eq(0)
55
+ expect(seats['Samoobrona']).to eq(0)
56
+ expect(seats['Grzegorz Braun „Szczęść Boże!”']).to eq(0)
57
+ expect(seats['Kongres Nowej Prawicy']).to eq(0)
58
+ expect(seats['Obywatele do Parlamentu']).to eq(0)
59
+ end
60
+ end