uk_bin_collection 0.105.0__tar.gz → 0.105.1__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/input.json +5 -3
  4. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +41 -25
  5. uk_bin_collection-0.105.1/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +147 -0
  6. uk_bin_collection-0.105.0/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +0 -68
  7. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/LICENSE +0 -0
  8. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/README.md +0 -0
  9. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/README.rst +0 -0
  10. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  11. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/features/environment.py +0 -0
  12. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  13. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/output.schema +0 -0
  14. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  15. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  16. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_collect_data.py +0 -0
  17. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_common_functions.py +0 -0
  18. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_conftest.py +0 -0
  19. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_get_data.py +0 -0
  20. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  21. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  22. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
  23. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  24. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
  25. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  26. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  27. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  28. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  29. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
  30. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  31. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  32. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  33. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  34. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
  35. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  36. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
  37. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  38. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  39. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  40. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  41. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  42. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  43. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  44. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  45. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
  46. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  47. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  48. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  49. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
  50. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  51. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  52. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  53. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  54. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  55. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  56. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  57. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  58. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
  59. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  60. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
  61. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +0 -0
  62. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  63. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  64. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
  65. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  66. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  67. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  68. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  69. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  70. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
  71. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  72. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
  73. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  74. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  75. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  76. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
  77. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  78. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  79. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  80. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
  81. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
  82. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  83. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  84. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  85. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
  86. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  87. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  88. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  89. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  90. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  91. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  92. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
  93. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  94. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  95. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +0 -0
  96. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  97. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  98. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  99. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
  100. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  101. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  102. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  103. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
  104. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  105. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  106. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  107. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  108. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  109. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
  110. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
  111. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  112. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  113. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
  114. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
  115. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  116. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
  117. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  118. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
  119. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  120. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  121. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  122. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  123. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  124. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  125. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  126. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  127. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  128. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  129. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  130. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  131. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  132. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  133. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  134. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
  135. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  136. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  137. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  138. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  139. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  140. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  141. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  142. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  143. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  144. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  145. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  146. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  147. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
  148. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  149. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  150. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
  151. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
  152. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  153. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  154. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  155. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  156. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  157. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  158. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  159. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  160. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
  161. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  162. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  163. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  164. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  165. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  166. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  167. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  168. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  169. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  170. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  171. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  172. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
  173. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  174. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  175. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  176. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  177. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  178. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
  179. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  180. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
  181. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  182. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  183. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  184. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  185. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  186. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  187. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  188. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  189. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  190. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  191. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  192. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +0 -0
  193. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  194. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  195. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +0 -0
  196. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  197. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  198. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  199. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  200. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  201. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  202. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  203. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
  204. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  205. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  206. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  207. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  208. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
  209. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  210. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  211. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +0 -0
  212. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  213. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  214. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  215. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  216. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  217. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  218. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
  219. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  220. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +0 -0
  221. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  222. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  223. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  224. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
  225. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  226. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
  227. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
  228. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
  229. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
  230. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  231. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  232. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  233. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  234. {uk_bin_collection-0.105.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uk_bin_collection
3
- Version: 0.105.0
3
+ Version: 0.105.1
4
4
  Summary: Python Lib to collect UK Bin Data
5
5
  Author: Robert Bradley
6
6
  Author-email: robbrad182@gmail.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "uk_bin_collection"
3
- version = "0.105.0"
3
+ version = "0.105.1"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -754,10 +754,12 @@
754
754
  "wiki_note": "Pass the house name/number plus the name of the street with the postcode parameter, wrapped in double quotes. Check the address in the web site first. This version will only pick the first SHOW button returned by the search or if it is fully unique. The search is not very predictable (e.g. house number 4 returns 14,24,4,44 etc.)."
755
755
  },
756
756
  "MidlothianCouncil": {
757
- "url": "https://www.midlothian.gov.uk/directory_record/92594377/glenesk_bonnyrigg_eh19_3je",
758
- "wiki_command_url_override": "https://www.midlothian.gov.uk/directory_record/XXXXXX/XXXXXX",
757
+ "house_number": "52",
758
+ "postcode": "EH19 2EB",
759
+ "skip_get_url": true,
760
+ "url": "https://www.midlothian.gov.uk/info/1054/bins_and_recycling/343/bin_collection_days",
759
761
  "wiki_name": "Midlothian Council",
760
- "wiki_note": "Follow the instructions [here](https://www.midlothian.gov.uk/info/1054/bins_and_recycling/343/bin_collection_days) until you get the page that shows the weekly collections for your address then copy the URL and replace the URL in the command."
762
+ "wiki_note": "Pass the house name/number wrapped in double quotes along with the postcode parameter"
761
763
  },
762
764
  "MidSussexDistrictCouncil": {
763
765
  "house_number": "OAKLANDS, OAKLANDS ROAD RH16 1SS",
@@ -1,4 +1,4 @@
1
- from typing import Dict, Any
1
+ from typing import Dict, List, Any
2
2
  from bs4 import BeautifulSoup
3
3
  from dateutil.relativedelta import relativedelta
4
4
  import requests
@@ -11,6 +11,30 @@ from uk_bin_collection.uk_bin_collection.common import (
11
11
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
12
12
 
13
13
 
14
+ def parse_bin_text(bin_type_str: str, bin_date_str: str) -> List[Dict[str, str]]:
15
+ """
16
+ Takes a raw bin and date string, parses the bin(s) and date, then returns
17
+ a list of bins with their date.
18
+ """
19
+
20
+ bins = []
21
+
22
+ if bin_date_str == "Today":
23
+ bin_date = datetime.today()
24
+ elif bin_date_str == "Tomorrow":
25
+ bin_date = datetime.today() + relativedelta(days=1)
26
+ else:
27
+ bin_date = datetime.strptime(bin_date_str, "%A, %B %d, %Y")
28
+
29
+ for bin_type in bin_type_str.split(", "):
30
+ bins.append({
31
+ "type": bin_type.strip() + " bin",
32
+ "collectionDate": bin_date.strftime(date_format)
33
+ })
34
+
35
+ return bins
36
+
37
+
14
38
  class CouncilClass(AbstractGetBinDataClass):
15
39
  """
16
40
  Concrete classes have to implement all abstract operations of the
@@ -73,37 +97,29 @@ class CouncilClass(AbstractGetBinDataClass):
73
97
  bin_date_str = highlight_content.find(
74
98
  "em", {"class": "ui-bin-next-date"}
75
99
  ).text.strip()
76
- bin_type = (
77
- highlight_content.find("p", {"class": "ui-bin-next-type"}).text.strip()
78
- + " bin"
79
- )
100
+ bin_type_str = highlight_content.find(
101
+ "p", {"class": "ui-bin-next-type"}
102
+ ).text.strip()
80
103
 
81
- if bin_date_str == "Today":
82
- bin_date = datetime.today()
83
- elif bin_date_str == "Tomorrow":
84
- bin_date = datetime.today() + relativedelta(days=1)
85
- else:
86
- bin_date = datetime.strptime(bin_date_str, "%A, %B %d, %Y")
104
+ data["bins"].extend(parse_bin_text(bin_type_str, bin_date_str))
87
105
 
88
- dict_data = {
89
- "type": bin_type,
90
- "collectionDate": bin_date.strftime(date_format),
91
- }
92
- data["bins"].append(dict_data)
106
+ # Hold bins we already got from next collection, to avoid re-adding
107
+ # from upcoming collections.
108
+ used_bins = set(bin["type"] for bin in data["bins"])
93
109
 
94
110
  # Upcoming collections
95
111
  upcoming_collections = results[1].find("tbody").find_all("tr")
96
112
  for row in upcoming_collections:
97
113
  columns = row.find_all("td")
98
114
  bin_date_str = columns[0].text.strip()
99
- bin_types = columns[1].text.strip().split(", ")
100
-
101
- for bin_type in bin_types:
102
- bin_date = datetime.strptime(bin_date_str, "%A, %B %d, %Y")
103
- dict_data = {
104
- "type": bin_type.strip() + " bin",
105
- "collectionDate": bin_date.strftime(date_format),
106
- }
107
- data["bins"].append(dict_data)
115
+ bin_type_str = columns[1].text.strip()
116
+
117
+ # Only add to bin list if not already present.
118
+ for bin in parse_bin_text(bin_type_str, bin_date_str):
119
+ if bin["type"] not in used_bins:
120
+ data["bins"].append(bin)
121
+
122
+ # Add to used bins, so future collections are not re-added.
123
+ used_bins.add(bin["type"])
108
124
 
109
125
  return data
@@ -0,0 +1,147 @@
1
+ from urllib.parse import quote, urljoin
2
+
3
+ from bs4 import BeautifulSoup
4
+
5
+ from uk_bin_collection.uk_bin_collection.common import *
6
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
7
+
8
+
9
+ # import the wonderful Beautiful Soup and the URL grabber
10
+ class CouncilClass(AbstractGetBinDataClass):
11
+ """
12
+ Concrete classes have to implement all abstract operations of the
13
+ base class. They can also override some operations with a default
14
+ implementation.
15
+ """
16
+
17
+ BASE_URL = "https://www.midlothian.gov.uk"
18
+ DIRECTORY_URL = f"{BASE_URL}/site/scripts/directory_search.php?directoryID=35&keywords={{}}&search=Search"
19
+ BIN_TYPES = {
20
+ "Next recycling collection": "Recycling",
21
+ "Next grey bin collection": "Grey Bin",
22
+ "Next brown bin collection": "Brown Bin",
23
+ "Next food bin collection": "Food Bin",
24
+ }
25
+
26
+ def parse_data(self, page: str, **kwargs) -> dict:
27
+
28
+ house_identifier = kwargs.get(
29
+ "paon", ""
30
+ ).strip() # Could be house number or name
31
+ postcode = kwargs.get("postcode")
32
+
33
+ # Check if both house identifier and postcode are provided
34
+ if not house_identifier:
35
+ print("Error: House identifier (number or name) must be provided.")
36
+ return {"bins": []}
37
+
38
+ if not postcode:
39
+ print("Error: Postcode must be provided.")
40
+ return {"bins": []}
41
+
42
+ check_postcode(postcode)
43
+ check_paon(house_identifier)
44
+
45
+ data = {"bins": []}
46
+ search_url = self.DIRECTORY_URL.format(quote(postcode))
47
+
48
+ try:
49
+ search_results_html = requests.get(search_url)
50
+ search_results_html.raise_for_status()
51
+
52
+ soup = BeautifulSoup(search_results_html.text, "html.parser")
53
+ address_link = self._get_result_by_identifier(soup, house_identifier)
54
+
55
+ if address_link:
56
+ collections_url = urljoin(search_url, address_link["href"])
57
+ bin_collection_data = self._fetch_bin_collection_data(collections_url)
58
+
59
+ if bin_collection_data:
60
+ data["bins"].extend(bin_collection_data)
61
+
62
+ except requests.RequestException as e:
63
+ print(f"Warning: Failed to fetch data from {search_url}. Error: {e}")
64
+
65
+ return data
66
+
67
+ def _get_result_by_identifier(self, soup, identifier: str) -> list:
68
+ """Extract the result link that matches the given house number or house name."""
69
+ try:
70
+ results_list = (
71
+ soup.find("article", class_="container")
72
+ .find("h2", text="Search results")
73
+ .find_next("ul", class_="item-list item-list__rich")
74
+ )
75
+
76
+ pattern = re.compile(re.escape(identifier.lower()) + r"[ ,]")
77
+
78
+ for item in results_list.find_all("li"):
79
+ address_link = item.find("a")
80
+ if address_link:
81
+ link_text = address_link.text.strip().lower()
82
+ if pattern.match(link_text):
83
+ return address_link
84
+
85
+ print(f"Warning: No results found for identifier '{identifier}'.")
86
+ return None # Return None if no match is found
87
+
88
+ except AttributeError as e:
89
+ print(f"Warning: Could not find the search results. Error: {e}")
90
+ return None # Return None if no result found
91
+
92
+ def _fetch_bin_collection_data(self, url: str) -> list:
93
+ """Fetch and parse bin collection data from the given URL."""
94
+ try:
95
+ bin_collection_html = requests.get(url)
96
+ bin_collection_html.raise_for_status()
97
+
98
+ soup = BeautifulSoup(bin_collection_html.text, "html.parser")
99
+ bin_collections = soup.find("ul", class_="data-table")
100
+
101
+ if bin_collections:
102
+ return self._parse_bin_collection_items(
103
+ bin_collections.find_all("li")[2:] # Skip the first two items
104
+ )
105
+
106
+ except requests.RequestException as e:
107
+ print(
108
+ f"Warning: Failed to fetch bin collection data from {url}. Error: {e}"
109
+ )
110
+
111
+ return [] # Return an empty list on error
112
+
113
+ def _parse_bin_collection_items(self, bin_items: list) -> list:
114
+ """Parse bin collection items into a structured format."""
115
+ parsed_bins = []
116
+
117
+ for bin_item in bin_items:
118
+ bin_type = None
119
+ try:
120
+ if bin_item.h2 and bin_item.h2.text.strip() in self.BIN_TYPES:
121
+ bin_type = self.BIN_TYPES[bin_item.h2.text.strip()]
122
+
123
+ bin_collection_date = None
124
+ if bin_item.div and bin_item.div.text.strip():
125
+ try:
126
+ bin_collection_date = datetime.strptime(
127
+ bin_item.div.text.strip(), "%A %d/%m/%Y"
128
+ ).strftime(date_format)
129
+ except ValueError:
130
+ print(
131
+ f"Warning: Date parsing failed for {bin_item.div.text.strip()}."
132
+ )
133
+
134
+ if bin_type and bin_collection_date:
135
+ parsed_bins.append(
136
+ {
137
+ "type": bin_type,
138
+ "collectionDate": bin_collection_date,
139
+ }
140
+ )
141
+ else:
142
+ print(f"Warning: Missing data for bin item: {bin_item}")
143
+
144
+ except Exception as e:
145
+ print(f"Warning: An error occurred while parsing bin item. Error: {e}")
146
+
147
+ return parsed_bins
@@ -1,68 +0,0 @@
1
- from bs4 import BeautifulSoup
2
-
3
- from uk_bin_collection.uk_bin_collection.common import *
4
- from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
5
-
6
-
7
- # import the wonderful Beautiful Soup and the URL grabber
8
- class CouncilClass(AbstractGetBinDataClass):
9
- """
10
- Concrete classes have to implement all abstract operations of the
11
- base class. They can also override some operations with a default
12
- implementation.
13
- """
14
-
15
- def parse_data(self, page: str, **kwargs) -> dict:
16
- # Parse the HTML content using BeautifulSoup
17
- soup = BeautifulSoup(page.text, features="html.parser")
18
-
19
- # Initialize a dictionary to store the parsed bin data
20
- data = {"bins": []}
21
-
22
- # Define a mapping of bin collection labels to their corresponding types
23
- bin_types = {
24
- "Next recycling collection": "Recycling",
25
- "Next grey bin collection": "Grey Bin",
26
- "Next brown bin collection": "Brown Bin",
27
- "Next food bin collection": "Food Bin",
28
- }
29
-
30
- # Locate the <ul> element with the class "data-table"
31
- bin_collections = soup.find("ul", {"class": "data-table"})
32
-
33
- # Proceed only if the <ul> element is found
34
- if bin_collections:
35
- # Retrieve all <li> elements within the <ul>, skipping the first two (not relevant)
36
- bin_items = bin_collections.find_all("li")[2:]
37
-
38
- # Iterate through each bin item
39
- for bin in bin_items:
40
- bin_type = None
41
- # Retrieve the bin type from the header if it exists
42
- if bin.h2 and bin.h2.text.strip() in bin_types:
43
- bin_type = bin_types[bin.h2.text.strip()]
44
-
45
- bin_collection_date = None
46
- # Retrieve the bin collection date from the div if it exists
47
- if bin.div and bin.div.text.strip():
48
- try:
49
- # Parse the collection date from the div text and format it
50
- bin_collection_date = datetime.strptime(
51
- bin.div.text.strip(),
52
- "%A %d/%m/%Y",
53
- ).strftime(date_format)
54
- except ValueError:
55
- # If date parsing fails, keep bin_collection_date as None
56
- pass
57
-
58
- # If both bin type and collection date are identified, add to the data
59
- if bin_type and bin_collection_date:
60
- data["bins"].append(
61
- {
62
- "type": bin_type,
63
- "collectionDate": bin_collection_date,
64
- }
65
- )
66
-
67
- # Return the parsed data, which may be empty if no bins were found
68
- return data