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,48 @@
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
+ INDEX = 'index-2014.txt'.freeze
21
+ TARGET = 'hungary-2014.txt'.freeze
22
+
23
+ BASE_URL = 'http://valasztas.hu/dyn/pv14/szavossz/en/'.freeze
24
+
25
+ DISTRICT_MATCHER = %r{<h2>Result of the single-member constituencies\s+(.*)\.\s*\(.*</h2>}m
26
+ RESULT_ROW_MATCHER = %r{<tr>\s*((<td[^>]*>[^<]*</td>\s*)+)}m
27
+ SEQUENCE_CELL_MATCHER = %r{<td[^>]*>&nbsp;(\d+)&nbsp;</td>}m
28
+ CELL_MATCHER = %r{<td[^>]*>([^<]*)</td>}m
29
+
30
+ File.open(TARGET, 'w') do |output|
31
+ File.open(INDEX).each do |line|
32
+ url = BASE_URL + line.chomp
33
+ puts url
34
+ content = `curl -s #{url}`.encode('utf-8', 'iso-8859-2')
35
+ district = content.scan(DISTRICT_MATCHER).first.first.gsub(/&ndash;/, '–')
36
+ puts district
37
+ content.scan(RESULT_ROW_MATCHER) do |match|
38
+ row = match.first
39
+ unless row.scan(SEQUENCE_CELL_MATCHER).first.nil?
40
+ cells = row.scan(CELL_MATCHER)
41
+ party = cells[2].first
42
+ result = cells[3].first.gsub(/&nbsp;/, '')
43
+ output.puts "#{district} | #{party} | #{result}"
44
+ end
45
+ end
46
+ output.puts
47
+ end
48
+ end
@@ -0,0 +1,80 @@
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
+ SOURCE = 'hungary-2014.txt'.freeze
21
+ TARGET = '../../lib/sapor/regional_data/hungary-2014.psv'.freeze
22
+
23
+ File.open(TARGET, 'w') do |output|
24
+ output.puts '# Statistical Analysis of Polling Results (SAPoR)'
25
+ output.puts '# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>'
26
+ output.puts '#'
27
+ output.puts '# This file is part of SAPoR.'
28
+ output.puts '#'
29
+ output.puts '# SAPoR is free software: you can redistribute it and/or' \
30
+ ' modify it under the'
31
+ output.puts '# terms of the GNU General Public License as published by the' \
32
+ ' Free Software'
33
+ output.puts '# Foundation, either version 3 of the License, or (at your' \
34
+ ' option) any later'
35
+ output.puts '# version.'
36
+ output.puts '#'
37
+ output.puts '# SAPoR is distributed in the hope that it will be useful, but' \
38
+ ' WITHOUT ANY'
39
+ output.puts '# WARRANTY; without even the implied warranty of' \
40
+ ' MERCHANTABILITY or FITNESS FOR'
41
+ output.puts '# A PARTICULAR PURPOSE. See the GNU General Public License' \
42
+ ' for more details.'
43
+ output.puts '#'
44
+ output.puts '# You can find a copy of the GNU General Public License in' \
45
+ ' /doc/gpl.txt'
46
+ output.puts '#'
47
+ File.open(SOURCE).each do |line|
48
+ next if line.chomp.start_with?('#')
49
+ if line.chomp.empty?
50
+ output.puts
51
+ else
52
+ elements = line.chomp.split('|').map(&:strip)
53
+ party = elements[1]
54
+ if party == 'FIDESZ-KDNP'
55
+ elements[1] = 'Fidesz–KDNP'
56
+ output.puts(elements.join(' | '))
57
+ elsif party == 'JOBBIK'
58
+ elements[1] = 'Jobbik'
59
+ output.puts(elements.join(' | '))
60
+ elsif party == 'MSZP-EGYÜTT-DK-PM-MLP'
61
+ elements[2] = (elements[2].to_i / 5).to_s
62
+ elements[1] = 'DK'
63
+ output.puts(elements.join(' | '))
64
+ elements[1] = 'Együtt'
65
+ output.puts(elements.join(' | '))
66
+ elements[1] = 'MLP'
67
+ output.puts(elements.join(' | '))
68
+ elements[1] = 'MSZP'
69
+ output.puts(elements.join(' | '))
70
+ elements[1] = 'PM'
71
+ output.puts(elements.join(' | '))
72
+ elsif party == 'SZOCIÁLDEMOKRATÁK'
73
+ elements[1] = 'Szociáldemokraták'
74
+ output.puts(elements.join(' | '))
75
+ else
76
+ output.puts line
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,106 @@
1
+ M01/E01/evkjkv_e.html
2
+ M01/E02/evkjkv_e.html
3
+ M01/E03/evkjkv_e.html
4
+ M01/E04/evkjkv_e.html
5
+ M01/E05/evkjkv_e.html
6
+ M01/E06/evkjkv_e.html
7
+ M01/E07/evkjkv_e.html
8
+ M01/E08/evkjkv_e.html
9
+ M01/E09/evkjkv_e.html
10
+ M01/E10/evkjkv_e.html
11
+ M01/E11/evkjkv_e.html
12
+ M01/E12/evkjkv_e.html
13
+ M01/E13/evkjkv_e.html
14
+ M01/E14/evkjkv_e.html
15
+ M01/E15/evkjkv_e.html
16
+ M01/E16/evkjkv_e.html
17
+ M01/E17/evkjkv_e.html
18
+ M01/E18/evkjkv_e.html
19
+ M02/E01/evkjkv_e.html
20
+ M02/E02/evkjkv_e.html
21
+ M02/E03/evkjkv_e.html
22
+ M02/E04/evkjkv_e.html
23
+ M03/E01/evkjkv_e.html
24
+ M03/E02/evkjkv_e.html
25
+ M03/E03/evkjkv_e.html
26
+ M03/E04/evkjkv_e.html
27
+ M03/E05/evkjkv_e.html
28
+ M03/E06/evkjkv_e.html
29
+ M04/E01/evkjkv_e.html
30
+ M04/E02/evkjkv_e.html
31
+ M04/E03/evkjkv_e.html
32
+ M04/E04/evkjkv_e.html
33
+ M05/E01/evkjkv_e.html
34
+ M05/E02/evkjkv_e.html
35
+ M05/E03/evkjkv_e.html
36
+ M05/E04/evkjkv_e.html
37
+ M05/E05/evkjkv_e.html
38
+ M05/E06/evkjkv_e.html
39
+ M05/E07/evkjkv_e.html
40
+ M06/E01/evkjkv_e.html
41
+ M06/E02/evkjkv_e.html
42
+ M06/E03/evkjkv_e.html
43
+ M06/E04/evkjkv_e.html
44
+ M07/E01/evkjkv_e.html
45
+ M07/E02/evkjkv_e.html
46
+ M07/E03/evkjkv_e.html
47
+ M07/E04/evkjkv_e.html
48
+ M07/E05/evkjkv_e.html
49
+ M08/E01/evkjkv_e.html
50
+ M08/E02/evkjkv_e.html
51
+ M08/E03/evkjkv_e.html
52
+ M08/E04/evkjkv_e.html
53
+ M08/E05/evkjkv_e.html
54
+ M09/E01/evkjkv_e.html
55
+ M09/E02/evkjkv_e.html
56
+ M09/E03/evkjkv_e.html
57
+ M09/E04/evkjkv_e.html
58
+ M09/E05/evkjkv_e.html
59
+ M09/E06/evkjkv_e.html
60
+ M10/E01/evkjkv_e.html
61
+ M10/E02/evkjkv_e.html
62
+ M10/E03/evkjkv_e.html
63
+ M11/E01/evkjkv_e.html
64
+ M11/E02/evkjkv_e.html
65
+ M11/E03/evkjkv_e.html
66
+ M11/E04/evkjkv_e.html
67
+ M12/E01/evkjkv_e.html
68
+ M12/E02/evkjkv_e.html
69
+ M12/E03/evkjkv_e.html
70
+ M13/E01/evkjkv_e.html
71
+ M13/E02/evkjkv_e.html
72
+ M14/E01/evkjkv_e.html
73
+ M14/E02/evkjkv_e.html
74
+ M14/E03/evkjkv_e.html
75
+ M14/E04/evkjkv_e.html
76
+ M14/E05/evkjkv_e.html
77
+ M14/E06/evkjkv_e.html
78
+ M14/E07/evkjkv_e.html
79
+ M14/E08/evkjkv_e.html
80
+ M14/E09/evkjkv_e.html
81
+ M14/E10/evkjkv_e.html
82
+ M14/E11/evkjkv_e.html
83
+ M14/E12/evkjkv_e.html
84
+ M15/E01/evkjkv_e.html
85
+ M15/E02/evkjkv_e.html
86
+ M15/E03/evkjkv_e.html
87
+ M15/E04/evkjkv_e.html
88
+ M16/E01/evkjkv_e.html
89
+ M16/E02/evkjkv_e.html
90
+ M16/E03/evkjkv_e.html
91
+ M16/E04/evkjkv_e.html
92
+ M16/E05/evkjkv_e.html
93
+ M16/E06/evkjkv_e.html
94
+ M17/E01/evkjkv_e.html
95
+ M17/E02/evkjkv_e.html
96
+ M17/E03/evkjkv_e.html
97
+ M18/E01/evkjkv_e.html
98
+ M18/E02/evkjkv_e.html
99
+ M18/E03/evkjkv_e.html
100
+ M19/E01/evkjkv_e.html
101
+ M19/E02/evkjkv_e.html
102
+ M19/E03/evkjkv_e.html
103
+ M19/E04/evkjkv_e.html
104
+ M20/E01/evkjkv_e.html
105
+ M20/E02/evkjkv_e.html
106
+ M20/E03/evkjkv_e.html
@@ -0,0 +1,42 @@
1
+ Siedziba OKW,1 - Komitet Wyborczy Prawo i Sprawiedliwość,2 - Komitet Wyborczy Platforma Obywatelska RP,3 - Komitet Wyborczy Partia Razem,4 - Komitet Wyborczy KORWiN,5 - Komitet Wyborczy Polskie Stronnictwo Ludowe,6 - Koalicyjny Komitet Wyborczy Zjednoczona Lewica SLD+TR+PPS+UP+Zieloni,7 - Komitet Wyborczy Wyborców „Kukiz'15”,8 - Komitet Wyborczy Nowoczesna Ryszarda Petru,9 - Komitet Wyborczy Wyborców JOW Bezpartyjni,10 - Komitet Wyborczy Wyborców Zbigniewa Stonogi,11 - Komitet Wyborczy Wyborców Ruch Społeczny Rzeczypospolitej Polskiej,12 - Komitet Wyborczy Wyborców Zjednoczeni dla Śląska,13 - Komitet Wyborczy Samoobrona,14 - Komitet Wyborczy Wyborców Grzegorza Brauna „Szczęść Boże!”,15 - Komitet Wyborczy Kongres Nowej Prawicy,16 - Komitet Wyborczy Wyborców Mniejszość Niemiecka,16 - Komitet Wyborczy Wyborców Obywatele do Parlamentu
2
+ Legnica,127.370,90.060,13.003,15.427,13.886,37.298,34.229,25.506,,,,,,,,,
3
+ Wałbrzych,72.929,76.424,7.984,10.075,7.448,20.517,20.634,15.544,2.540,,,,,,,,
4
+ Wrocław,163.323,159.582,22.059,27.341,13.604,31.932,45.726,55.756,,2.779,,,,1.269,,,
5
+ Bydgoszcz,113.024,110.948,14.062,17.002,22.701,37.583,29.080,27.334,,2.543,,,,,,,
6
+ Toruń,121.703,93.432,13.227,14.134,24.476,39.003,30.159,23.563,,2.041,,,772,,,,
7
+ Lublin,232.014,80.892,13.395,24.376,37.733,29.172,45.448,22.158,,,599,,580,1.353,,,
8
+ Chełm,163.122,41.823,8.116,14.835,38.689,24.161,35.567,12.745,,,,,628,,,,
9
+ Zielona Góra,97.877,97.676,13.825,17.274,17.743,34.695,30.284,34.586,,2.258,,,,,,,
10
+ Łódź,107.350,112.333,16.627,17.163,9.710,37.615,25.992,32.274,,,,,,,,,
11
+ Piotrków Trybunalski,134.134,44.173,8.747,11.160,21.364,21.352,28.808,15.983,,,,,,,,,
12
+ Sieradz,147.623,78.314,13.077,15.171,29.044,30.256,32.973,19.681,,1.905,,,712,989,,,
13
+ Kraków I (południe),133.213,55.454,8.840,12.089,8.226,14.473,23.551,15.731,,,,,,,,,
14
+ Kraków II (północ),209.607,133.558,21.053,34.446,14.644,34.643,39.379,52.822,,,,,,1.372,1.244,,
15
+ Nowy Sącz,188.010,43.309,6.627,13.379,12.929,7.924,24.318,11.468,,1.606,,,,,891,,
16
+ Tarnów,151.623,42.887,7.082,13.766,23.552,9.933,28.005,13.233,,,,,,906,654,,
17
+ Płock,131.431,49.353,10.062,12.214,31.994,24.440,25.257,15.451,,,,,,,,,
18
+ Radom,130.758,48.332,7.203,10.770,25.933,13.258,23.149,13.233,,2.050,,,,,656,,
19
+ Siedlce,191.733,50.858,9.964,16.332,38.396,16.327,31.378,17.386,1.045,,582,,,1.239,,,
20
+ Warszawa I (miasto),327.342,301.672,60.663,67.700,7.882,93.666,84.937,146.629,,,2.760,,,,,,1.964
21
+ Warszawa II (okręg),190.355,123.227,18.895,23.586,18.666,27.774,35.418,49.098,,3.597,,,,,,,
22
+ Opole,93.926,88.731,10.202,13.346,12.464,22.841,42.533,24.152,1.772,,,,,751,,27.530,
23
+ Krosno,174.900,44.971,7.595,13.984,23.805,14.893,29.919,12.981,2.289,1.528,,,,,,,
24
+ Rzeszów,284.642,66.516,11.623,25.163,23.667,22.409,47.071,21.106,,2.919,,,,1.363,778,,
25
+ Białystok,197.575,72.894,11.258,20.297,35.116,32.015,39.509,23.361,,2.088,,,626,,629,,
26
+ Gdańsk,126.466,148.305,16.992,21.366,12.904,28.168,30.536,39.184,,3.210,,,,,,,
27
+ Gdynia,145.698,156.147,18.918,20.677,15.064,30.973,37.410,38.344,,3.477,,,,,,,
28
+ Bielsko-Biała,136.330,79.506,12.557,15.788,11.533,22.122,31.570,27.882,,,,,,,,,
29
+ Częstochowa,84.773,49.580,8.625,10.111,11.799,26.305,27.521,15.942,,1.378,,,,600,,,
30
+ Gliwice,89.584,85.130,12.181,14.949,7.342,21.163,35.793,26.122,,,,,,1.403,,,
31
+ Rybnik,114.799,70.188,9.669,13.136,5.197,17.201,32.794,18.341,,,,7.928,,710,,,
32
+ Katowice,135.367,116.658,16.786,22.803,4.064,27.837,41.344,35.591,,,,10.740,,,,,
33
+ Sosnowiec,84.410,72.755,12.652,13.682,6.687,39.774,29.161,25.522,,,,,,,,,
34
+ Kielce,200.652,80.866,13.106,19.395,44.574,36.880,44.115,23.360,2.344,1.792,,,448,1.158,,,
35
+ Elbląg,63.236,60.359,7.608,9.480,13.411,15.407,16.514,11.668,1.426,1.253,,,,,,,
36
+ Olsztyn,80.970,72.055,9.948,13.584,22.458,23.312,23.888,18.141,,1.810,,,,,,,
37
+ Kalisz,115.668,89.668,11.497,15.422,39.874,32.047,28.996,25.557,1.973,1.982,,,500,,,,
38
+ Konin,103.781,56.111,11.032,11.061,19.027,32.649,24.486,19.237,,,,,,,,,
39
+ Piła,73.665,83.845,10.591,11.004,20.712,24.723,24.359,18.859,,2.515,,,,,,,
40
+ Poznań,97.975,146.141,18.854,19.548,7.809,33.080,24.825,59.387,2.267,,,,,,,,
41
+ Koszalin,62.032,65.262,8.466,9.672,8.972,24.697,20.428,17.488,,,,,,,,,
42
+ Szczecin,110.697,121.479,15.678,20.291,14.776,32.584,32.030,32.964,,,,,,,,,
@@ -0,0 +1,79 @@
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
+ SOURCE = '2015-gl-lis-okr.csv'.freeze
21
+ TARGET = '../../lib/sapor/regional_data/poland-20151025.psv'.freeze
22
+ PARTIES = ['Prawo i Sprawiedliwość',
23
+ 'Platforma Obywatelska',
24
+ 'Lewica Razem',
25
+ 'KORWiN',
26
+ 'Polskie Stronnictwo Ludowe',
27
+ 'Zjednoczona Lewica',
28
+ 'Kukiz’15',
29
+ '.Nowoczesna',
30
+ 'JOW Bezpartyjni',
31
+ 'Stonoga Partia Polska',
32
+ 'Ruch Społeczny Rzeczypospolitej Polskiej',
33
+ 'Zjednoczeni dla Śląska',
34
+ 'Samoobrona',
35
+ 'Grzegorz Braun „Szczęść Boże!”',
36
+ 'Kongres Nowej Prawicy',
37
+ 'Mniejszość Niemiecka',
38
+ 'Obywatele do Parlamentu']
39
+
40
+ File.open(TARGET, 'w') do |output|
41
+ output.puts '# Statistical Analysis of Polling Results (SAPoR)'
42
+ output.puts '# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>'
43
+ output.puts '#'
44
+ output.puts '# This file is part of SAPoR.'
45
+ output.puts '#'
46
+ output.puts '# SAPoR is free software: you can redistribute it and/or' \
47
+ ' modify it under the'
48
+ output.puts '# terms of the GNU General Public License as published by the' \
49
+ ' Free Software'
50
+ output.puts '# Foundation, either version 3 of the License, or (at your' \
51
+ ' option) any later'
52
+ output.puts '# version.'
53
+ output.puts '#'
54
+ output.puts '# SAPoR is distributed in the hope that it will be useful, but' \
55
+ ' WITHOUT ANY'
56
+ output.puts '# WARRANTY; without even the implied warranty of' \
57
+ ' MERCHANTABILITY or FITNESS FOR'
58
+ output.puts '# A PARTICULAR PURPOSE. See the GNU General Public License' \
59
+ ' for more details.'
60
+ output.puts '#'
61
+ output.puts '# You can find a copy of the GNU General Public License in' \
62
+ ' /doc/gpl.txt'
63
+ output.puts '#'
64
+ File.open(SOURCE).each do |line|
65
+ next if line.chomp.start_with?('Siedziba OKW')
66
+ if line.chomp.empty?
67
+ output.puts
68
+ else
69
+ elements = line.chomp.split(',').map(&:strip)
70
+ district = elements[0]
71
+ PARTIES.each_with_index do |p, i|
72
+ unless elements[i+1].nil? || elements[i+1].empty?
73
+ votes = elements[i+1].delete('.')
74
+ output.puts "#{district} | #{p} | #{votes}"
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,94 @@
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
+ SOURCE = '2015-gl-lis-okr.csv'.freeze
21
+ TARGET = '../../lib/sapor/regional_data/poland-20151025-with-ko-and-rsw-without-n-po-r-and-zl.psv'.freeze
22
+
23
+ N_PARTY = '.Nowoczesna'.freeze
24
+ PO_PARTY = 'Platforma Obywatelska'.freeze
25
+ R_PARTY = 'Lewica Razem'.freeze
26
+ ZL_PARTY = 'Zjednoczona Lewica'.freeze
27
+ PARTIES = ['Prawo i Sprawiedliwość',
28
+ PO_PARTY,
29
+ R_PARTY,
30
+ 'KORWiN',
31
+ 'Polskie Stronnictwo Ludowe',
32
+ ZL_PARTY,
33
+ 'Kukiz’15',
34
+ N_PARTY,
35
+ 'JOW Bezpartyjni',
36
+ 'Stonoga Partia Polska',
37
+ 'Ruch Społeczny Rzeczypospolitej Polskiej',
38
+ 'Zjednoczeni dla Śląska',
39
+ 'Samoobrona',
40
+ 'Grzegorz Braun „Szczęść Boże!”',
41
+ 'Kongres Nowej Prawicy',
42
+ 'Mniejszość Niemiecka',
43
+ 'Obywatele do Parlamentu']
44
+
45
+ File.open(TARGET, 'w') do |output|
46
+ output.puts '# Statistical Analysis of Polling Results (SAPoR)'
47
+ output.puts '# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>'
48
+ output.puts '#'
49
+ output.puts '# This file is part of SAPoR.'
50
+ output.puts '#'
51
+ output.puts '# SAPoR is free software: you can redistribute it and/or' \
52
+ ' modify it under the'
53
+ output.puts '# terms of the GNU General Public License as published by the' \
54
+ ' Free Software'
55
+ output.puts '# Foundation, either version 3 of the License, or (at your' \
56
+ ' option) any later'
57
+ output.puts '# version.'
58
+ output.puts '#'
59
+ output.puts '# SAPoR is distributed in the hope that it will be useful, but' \
60
+ ' WITHOUT ANY'
61
+ output.puts '# WARRANTY; without even the implied warranty of' \
62
+ ' MERCHANTABILITY or FITNESS FOR'
63
+ output.puts '# A PARTICULAR PURPOSE. See the GNU General Public License' \
64
+ ' for more details.'
65
+ output.puts '#'
66
+ output.puts '# You can find a copy of the GNU General Public License in' \
67
+ ' /doc/gpl.txt'
68
+ output.puts '#'
69
+ File.open(SOURCE).each do |line|
70
+ next if line.chomp.start_with?('Siedziba OKW')
71
+ if line.chomp.empty?
72
+ output.puts
73
+ else
74
+ elements = line.chomp.split(',').map(&:strip)
75
+ district = elements[0]
76
+ ko_no = 0
77
+ rsw_no = 0
78
+ PARTIES.each_with_index do |p, i|
79
+ unless elements[i+1].nil? || elements[i+1].empty?
80
+ votes = elements[i+1].delete('.')
81
+ if p == R_PARTY || p == ZL_PARTY
82
+ rsw_no += votes.to_i
83
+ elsif p == PO_PARTY || p == N_PARTY
84
+ ko_no += votes.to_i
85
+ else
86
+ output.puts "#{district} | #{p} | #{votes}"
87
+ end
88
+ end
89
+ end
90
+ output.puts "#{district} | Koalicja Obywatelska | #{ko_no}"
91
+ output.puts "#{district} | Lewica Razem–Sojusz Lewicy Demokratycznej–Wiosna | #{rsw_no}"
92
+ end
93
+ end
94
+ end