uk_bin_collection 0.152.2__tar.gz → 0.152.3__tar.gz

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 (354) hide show
  1. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/input.json +3 -1
  4. uk_bin_collection-0.152.3/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +105 -0
  5. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +18 -0
  6. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +7 -2
  7. uk_bin_collection-0.152.3/uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py +287 -0
  8. uk_bin_collection-0.152.2/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -88
  9. uk_bin_collection-0.152.2/uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py +0 -93
  10. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/LICENSE +0 -0
  11. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/README.md +0 -0
  12. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/Local_Authority_Boundaries.geojson +0 -0
  13. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/README.rst +0 -0
  14. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/compare_lad_codes.py +0 -0
  15. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/map.html +0 -0
  16. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/check_selenium_url_in_input.json.py +0 -0
  17. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  18. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/features/environment.py +0 -0
  19. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  20. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/generate_map_test_results.py +0 -0
  21. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/output.schema +0 -0
  22. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  23. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  24. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/test_collect_data.py +0 -0
  25. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/test_common_functions.py +0 -0
  26. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/test_conftest.py +0 -0
  27. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/tests/test_get_data.py +0 -0
  28. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  29. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  30. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py +0 -0
  31. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
  32. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/AmberValleyBoroughCouncil.py +0 -0
  33. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/AngusCouncil.py +0 -0
  34. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py +0 -0
  35. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py +0 -0
  36. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py +0 -0
  37. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
  38. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  39. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py +0 -0
  40. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py +0 -0
  41. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  42. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  43. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py +0 -0
  44. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BarkingDagenham.py +0 -0
  45. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  46. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  47. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
  48. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  49. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  50. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  51. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  52. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
  53. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  54. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
  55. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py +0 -0
  56. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  57. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py +0 -0
  58. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BolsoverCouncil.py +0 -0
  59. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  60. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BostonBoroughCouncil.py +0 -0
  61. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  62. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py +0 -0
  63. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py +0 -0
  64. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py +0 -0
  65. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  66. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  67. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py +0 -0
  68. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  69. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py +0 -0
  70. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py +0 -0
  71. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  72. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
  73. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py +0 -0
  74. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  75. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  76. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CambridgeCityCouncil.py +0 -0
  77. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  78. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
  79. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  80. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py +0 -0
  81. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  82. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CeredigionCountyCouncil.py +0 -0
  83. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  84. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  85. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py +0 -0
  86. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CherwellDistrictCouncil.py +0 -0
  87. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  88. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  89. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py +0 -0
  90. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  91. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  92. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
  93. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  94. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CopelandBoroughCouncil.py +0 -0
  95. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
  96. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py +0 -0
  97. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +0 -0
  98. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  99. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  100. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CumberlandAllerdaleCouncil.py +0 -0
  101. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py +0 -0
  102. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
  103. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  104. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DenbighshireCouncil.py +0 -0
  105. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py +0 -0
  106. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  107. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  108. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  109. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  110. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
  111. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DundeeCityCouncil.py +0 -0
  112. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  113. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
  114. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py +0 -0
  115. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  116. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  117. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +0 -0
  118. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  119. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastLothianCouncil.py +0 -0
  120. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
  121. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  122. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastStaffordshireBoroughCouncil.py +0 -0
  123. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  124. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EastbourneBoroughCouncil.py +0 -0
  125. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EdinburghCityCouncil.py +0 -0
  126. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
  127. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
  128. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  129. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  130. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/EpsomandEwellBoroughCouncil.py +0 -0
  131. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  132. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ExeterCityCouncil.py +0 -0
  133. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
  134. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  135. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  136. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/FermanaghOmaghDistrictCouncil.py +0 -0
  137. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py +0 -0
  138. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py +0 -0
  139. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/FolkstoneandHytheDistrictCouncil.py +0 -0
  140. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  141. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/FyldeCouncil.py +0 -0
  142. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  143. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  144. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  145. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
  146. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GooglePublicCalendarCouncil.py +0 -0
  147. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py +0 -0
  148. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GreatYarmouthBoroughCouncil.py +0 -0
  149. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  150. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/GwyneddCouncil.py +0 -0
  151. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HackneyCouncil.py +0 -0
  152. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  153. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +0 -0
  154. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  155. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  156. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HartDistrictCouncil.py +0 -0
  157. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HartlepoolBoroughCouncil.py +0 -0
  158. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HastingsBoroughCouncil.py +0 -0
  159. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HerefordshireCouncil.py +0 -0
  160. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py +0 -0
  161. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  162. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
  163. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/Hillingdon.py +0 -0
  164. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py +0 -0
  165. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HorshamDistrictCouncil.py +0 -0
  166. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  167. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  168. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/HyndburnBoroughCouncil.py +0 -0
  169. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/IpswichBoroughCouncil.py +0 -0
  170. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
  171. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/KingsLynnandWestNorfolkBC.py +0 -0
  172. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  173. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  174. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  175. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  176. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  177. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LeicesterCityCouncil.py +0 -0
  178. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LewesDistrictCouncil.py +0 -0
  179. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
  180. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
  181. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  182. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  183. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
  184. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
  185. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHavering.py +0 -0
  186. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  187. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
  188. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLewisham.py +0 -0
  189. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughOfRichmondUponThames.py +0 -0
  190. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  191. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py +0 -0
  192. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
  193. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MaidstoneBoroughCouncil.py +0 -0
  194. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  195. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  196. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  197. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  198. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MedwayCouncil.py +0 -0
  199. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MeltonBoroughCouncil.py +0 -0
  200. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  201. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  202. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MidDevonCouncil.py +0 -0
  203. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MidSuffolkDistrictCouncil.py +0 -0
  204. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  205. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MidUlsterDistrictCouncil.py +0 -0
  206. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MiddlesbroughCouncil.py +0 -0
  207. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +0 -0
  208. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  209. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  210. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py +0 -0
  211. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/MorayCouncil.py +0 -0
  212. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  213. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  214. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  215. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  216. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NewcastleUnderLymeCouncil.py +0 -0
  217. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  218. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  219. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
  220. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthDevonCountyCouncil.py +0 -0
  221. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  222. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  223. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  224. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  225. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  226. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  227. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  228. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  229. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  230. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  231. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  232. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  233. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
  234. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  235. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py +0 -0
  236. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/OadbyAndWigstonBoroughCouncil.py +0 -0
  237. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  238. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/OxfordCityCouncil.py +0 -0
  239. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/PembrokeshireCountyCouncil.py +0 -0
  240. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
  241. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/PeterboroughCityCouncil.py +0 -0
  242. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
  243. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  244. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/PowysCouncil.py +0 -0
  245. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  246. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  247. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RedcarandClevelandCouncil.py +0 -0
  248. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RedditchBoroughCouncil.py +0 -0
  249. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  250. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  251. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  252. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  253. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  254. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py +0 -0
  255. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
  256. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py +0 -0
  257. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  258. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RunnymedeBoroughCouncil.py +0 -0
  259. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  260. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  261. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  262. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SandwellBoroughCouncil.py +0 -0
  263. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py +0 -0
  264. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  265. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  266. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  267. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SloughBoroughCouncil.py +0 -0
  268. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  269. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  270. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  271. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  272. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
  273. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  274. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthHamsDistrictCouncil.py +0 -0
  275. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthHollandDistrictCouncil.py +0 -0
  276. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  277. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  278. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  279. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  280. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
  281. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py +0 -0
  282. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  283. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthamptonCityCouncil.py +0 -0
  284. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
  285. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SpelthorneBoroughCouncil.py +0 -0
  286. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  287. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  288. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  289. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  290. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StevenageBoroughCouncil.py +0 -0
  291. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StirlingCouncil.py +0 -0
  292. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  293. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StocktonOnTeesCouncil.py +0 -0
  294. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  295. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  296. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  297. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  298. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SurreyHeathBoroughCouncil.py +0 -0
  299. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  300. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  301. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +0 -0
  302. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  303. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  304. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +0 -0
  305. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  306. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  307. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  308. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TewkesburyBoroughCouncil.py +0 -0
  309. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py +0 -0
  310. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  311. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ThurrockCouncil.py +0 -0
  312. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  313. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  314. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  315. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
  316. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  317. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  318. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  319. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  320. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
  321. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  322. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py +0 -0
  323. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py +0 -0
  324. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  325. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +0 -0
  326. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  327. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  328. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  329. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  330. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestDunbartonshireCouncil.py +0 -0
  331. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py +0 -0
  332. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  333. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  334. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
  335. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  336. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +0 -0
  337. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  338. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  339. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  340. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
  341. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  342. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
  343. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
  344. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
  345. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WolverhamptonCityCouncil.py +0 -0
  346. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WorcesterCityCouncil.py +0 -0
  347. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WrexhamCountyBoroughCouncil.py +0 -0
  348. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
  349. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  350. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/WyreForestDistrictCouncil.py +0 -0
  351. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  352. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  353. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  354. {uk_bin_collection-0.152.2 → uk_bin_collection-0.152.3}/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.152.2
3
+ Version: 0.152.3
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.152.2"
3
+ version = "0.152.3"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -1693,9 +1693,10 @@
1693
1693
  "LAD24CD": "E06000012"
1694
1694
  },
1695
1695
  "NorthHertfordshireDistrictCouncil": {
1696
- "house_number": "2",
1696
+ "house_number": "22",
1697
1697
  "postcode": "SG6 4BJ",
1698
1698
  "url": "https://www.north-herts.gov.uk",
1699
+ "web_driver": "http://selenium:4444",
1699
1700
  "wiki_name": "North Hertfordshire",
1700
1701
  "wiki_note": "Pass the house number and postcode in their respective parameters.",
1701
1702
  "LAD24CD": "E07000099"
@@ -2180,6 +2181,7 @@
2180
2181
  },
2181
2182
  "SouthRibbleCouncil": {
2182
2183
  "uprn": "010013246384",
2184
+ "postcode": "PR5 6DT",
2183
2185
  "url": "https://www.southribble.gov.uk",
2184
2186
  "wiki_command_url_override": "https://www.southribble.gov.uk",
2185
2187
  "wiki_name": "South Ribble",
@@ -0,0 +1,105 @@
1
+ from datetime import datetime
2
+
3
+ from bs4 import BeautifulSoup
4
+
5
+ from uk_bin_collection.uk_bin_collection.common import (
6
+ date_format,
7
+ get_date_with_ordinal,
8
+ )
9
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
10
+
11
+
12
+ class CouncilClass(AbstractGetBinDataClass):
13
+ def parse_data(self, page: str, **kwargs) -> dict:
14
+ # Handle both string and Response objects
15
+ page_content = page.text if hasattr(page, "text") else page
16
+
17
+ soup = BeautifulSoup(page_content, features="html.parser")
18
+
19
+ data = {"bins": []}
20
+ collections = []
21
+
22
+ # Find all bin collection rows
23
+ bin_rows = soup.find_all("div", class_="bin-collection-listing-row")
24
+
25
+ if not bin_rows:
26
+ raise ValueError("No bin collection rows found in HTML")
27
+
28
+ for bin_row in bin_rows:
29
+ try:
30
+ # Get bin type from h2
31
+ bin_type_elem = bin_row.find("h2")
32
+ if not bin_type_elem:
33
+ continue
34
+ bin_type = bin_type_elem.text.strip()
35
+
36
+ # Find next collection date - look for all <p> tags
37
+ paragraphs = bin_row.find_all("p")
38
+
39
+ for p in paragraphs:
40
+ # Check for both singular and plural "Next collection(s):"
41
+ if p.get_text() and (
42
+ "Next collection:" in p.get_text()
43
+ or "Next collections:" in p.get_text()
44
+ ):
45
+ # Extract collection dates
46
+ date_text = (
47
+ p.get_text()
48
+ .replace("Next collection:", "")
49
+ .replace("Next collections:", "")
50
+ .strip()
51
+ )
52
+
53
+ # Split multiple dates if comma-separated
54
+ date_strings = [date.strip() for date in date_text.split(",")]
55
+
56
+ for date_str in date_strings:
57
+ try:
58
+ # Extract day number from date string (e.g. "2" from "Tuesday 27th May")
59
+ day_number = int("".join(filter(str.isdigit, date_str)))
60
+ # Replace ordinal in date string with plain number
61
+ date_str = date_str.replace(
62
+ get_date_with_ordinal(day_number), str(day_number)
63
+ )
64
+
65
+ # Parse date with full format
66
+ bin_date = datetime.strptime(date_str, "%A %d %B")
67
+
68
+ # Add current year since it's not in the date string
69
+ current_year = datetime.now().year
70
+ bin_date = bin_date.replace(year=current_year)
71
+
72
+ # If the date is in the past, it's probably for next year
73
+ if bin_date < datetime.now():
74
+ bin_date = bin_date.replace(year=current_year + 1)
75
+
76
+ collections.append((bin_type, bin_date))
77
+ print(
78
+ f"Successfully parsed date for {bin_type}: {bin_date}"
79
+ )
80
+
81
+ except ValueError as e:
82
+ print(
83
+ f"Failed to parse date '{date_str}' for {bin_type}: {e}"
84
+ )
85
+ continue
86
+
87
+ # Found and processed the collection dates, so break the loop
88
+ break
89
+
90
+ except Exception as e:
91
+ print(f"Error processing bin row: {e}")
92
+ continue
93
+
94
+ if not collections:
95
+ raise ValueError("No valid collection dates found")
96
+
97
+ ordered_data = sorted(collections, key=lambda x: x[1])
98
+ for item in ordered_data:
99
+ dict_data = {
100
+ "type": item[0],
101
+ "collectionDate": item[1].strftime(date_format),
102
+ }
103
+ data["bins"].append(dict_data)
104
+
105
+ return data
@@ -130,4 +130,22 @@ class CouncilClass(AbstractGetBinDataClass):
130
130
  key=lambda x: datetime.strptime(x.get("collectionDate"), date_format)
131
131
  )
132
132
 
133
+ data["bins"].sort(
134
+ key=lambda x: datetime.strptime(x.get("collectionDate"), date_format)
135
+ )
136
+
137
+ # Deduplicate the bins based on type and collection date
138
+ # Feels a bit hacky, but fixes
139
+ # https://github.com/robbrad/UKBinCollectionData/issues/1436
140
+ unique_bins = []
141
+ seen = set()
142
+ for bin_item in data["bins"]:
143
+ # Create a unique identifier for each bin entry
144
+ bin_key = (bin_item["type"], bin_item["collectionDate"])
145
+ if bin_key not in seen:
146
+ seen.add(bin_key)
147
+ unique_bins.append(bin_item)
148
+
149
+ data["bins"] = unique_bins
150
+
133
151
  return data
@@ -77,8 +77,13 @@ class CouncilClass(AbstractGetBinDataClass):
77
77
  return data
78
78
 
79
79
  except Exception as e:
80
- print(f"Error fetching/parsing data: {str(e)}")
81
- return {"bins": [{"type": "Error", "collectionDate": "2024-01-01"}]}
80
+ import traceback
81
+
82
+ error_message = f"Error fetching/parsing data for Eastleigh: {str(e)}\n{traceback.format_exc()}"
83
+ print(error_message)
84
+ # Use the correct date format for the error fallback
85
+ today = datetime.now().strftime("%d/%m/%Y")
86
+ return {"bins": [{"type": "Error", "collectionDate": today}]}
82
87
  finally:
83
88
  if "driver" in locals():
84
89
  driver.quit()
@@ -0,0 +1,287 @@
1
+ # direct URL works, but includes a token, so I'm using Selenium
2
+ # https://waste.nc.north-herts.gov.uk/w/webpage/find-bin-collection-day-show-details?webpage_token=c7c7c3cbc2f0478735fc746ca985b8f4221dea31c24dde99e39fb1c556b07788&auth=YTc5YTAwZmUyMGQ3&id=1421457
3
+
4
+ import re
5
+ import time
6
+ from datetime import datetime
7
+
8
+ from bs4 import BeautifulSoup
9
+ from dateutil.parser import parse
10
+ from selenium.common.exceptions import NoSuchElementException, TimeoutException
11
+ from selenium.webdriver.common.by import By
12
+ from selenium.webdriver.common.keys import Keys
13
+ from selenium.webdriver.support import expected_conditions as EC
14
+ from selenium.webdriver.support.ui import Select
15
+ from selenium.webdriver.support.wait import WebDriverWait
16
+
17
+ from uk_bin_collection.uk_bin_collection.common import *
18
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
19
+
20
+
21
+ class CouncilClass(AbstractGetBinDataClass):
22
+
23
+ def parse_data(self, page: str, **kwargs) -> dict:
24
+ driver = None
25
+ try:
26
+ data = {"bins": []}
27
+
28
+ user_paon = kwargs.get("paon")
29
+ postcode = kwargs.get("postcode")
30
+ web_driver = kwargs.get("web_driver")
31
+ headless = kwargs.get("headless")
32
+ url = "https://waste.nc.north-herts.gov.uk/w/webpage/find-bin-collection-day-input-address"
33
+
34
+ driver = create_webdriver(web_driver, headless, None, __name__)
35
+ driver.get(url)
36
+
37
+ WebDriverWait(driver, 10).until(
38
+ lambda d: d.execute_script("return document.readyState") == "complete"
39
+ )
40
+
41
+ # Define the wait variable
42
+ wait = WebDriverWait(
43
+ driver, 20
44
+ ) # Create the wait object with a 20-second timeout
45
+
46
+ # Enter postcode - try different approaches for reliability
47
+ # print("Looking for postcode input...")
48
+
49
+ postcode_input = wait.until(
50
+ EC.element_to_be_clickable(
51
+ (
52
+ By.CSS_SELECTOR,
53
+ "input.relation_path_type_ahead_search.form-control",
54
+ )
55
+ ),
56
+ message="Postcode input not found by class",
57
+ )
58
+ postcode_input.clear()
59
+ postcode_input.send_keys(postcode)
60
+ # print(f"Entered postcode: {postcode}")
61
+
62
+ # Wait for the dropdown to load
63
+ # print("Waiting for address list to populate...")
64
+ try:
65
+ # Wait for the results to appear
66
+ wait.until(
67
+ EC.presence_of_element_located(
68
+ (By.CSS_SELECTOR, ".relation_path_type_ahead_results_holder")
69
+ ),
70
+ message="Address results container not found",
71
+ )
72
+
73
+ # Wait for list items to appear
74
+ wait.until(
75
+ EC.presence_of_all_elements_located(
76
+ (By.CSS_SELECTOR, ".relation_path_type_ahead_results_holder li")
77
+ ),
78
+ message="No address items found in the list",
79
+ )
80
+ # print("Address list populated successfully")
81
+
82
+ # Search for user_paon in the address list using aria-label attribute
83
+ try:
84
+ # Use XPath to look for aria-label containing user_paon
85
+ address_xpath = (
86
+ f"//li[@aria-label and contains(@aria-label, '{user_paon}')]"
87
+ )
88
+ matching_address = wait.until(
89
+ EC.element_to_be_clickable((By.XPATH, address_xpath)),
90
+ message=f"No address containing '{user_paon}' found in aria-label attributes",
91
+ )
92
+ # print(f"Found matching address: {matching_address.get_attribute('aria-label')}")
93
+ matching_address.click()
94
+ # print("Clicked on matching address")
95
+
96
+ # Allow time for the selection to take effect
97
+ time.sleep(2)
98
+
99
+ # Find and click the "Select address and continue" button
100
+ continue_button = wait.until(
101
+ EC.element_to_be_clickable(
102
+ (
103
+ By.CSS_SELECTOR,
104
+ "input.btn.bg-green[value='Select address and continue']",
105
+ )
106
+ ),
107
+ message="Could not find 'Select address and continue' button",
108
+ )
109
+ # print("Found 'Select address and continue' button, clicking it...")
110
+ continue_button.click()
111
+ # print("Clicked on 'Select address and continue' button")
112
+
113
+ # Allow time for the page to load after clicking the button
114
+ time.sleep(3)
115
+ except TimeoutException as e:
116
+ # print(f"Error finding address: {e}")
117
+ raise
118
+ except TimeoutException as e:
119
+ # print(f"Error loading address list: {e}")
120
+ raise
121
+
122
+ # After pressing Next button and waiting for page to load
123
+ # print("Looking for schedule list...")
124
+
125
+ # Wait for the page to load - giving it extra time
126
+ time.sleep(5)
127
+
128
+ # Use only the selector that we know works
129
+ # print("Looking for bin type elements...")
130
+ try:
131
+ bin_type_selector = (
132
+ By.CSS_SELECTOR,
133
+ "div.formatting_bold.formatting_size_bigger.formatting span.value-as-text",
134
+ )
135
+ WebDriverWait(driver, 15).until(
136
+ EC.presence_of_element_located(bin_type_selector)
137
+ )
138
+ # print(f"Found bin type elements with selector: {bin_type_selector}")
139
+ except TimeoutException:
140
+ # print("Could not find bin type elements. Taking screenshot for debugging...")
141
+ screenshot_path = f"bin_type_error_{int(time.time())}.png"
142
+ driver.save_screenshot(screenshot_path)
143
+ # print(f"Screenshot saved to {screenshot_path}")
144
+
145
+ # Create BS4 object from driver's page source
146
+ # print("Parsing page with BeautifulSoup...")
147
+ soup = BeautifulSoup(driver.page_source, features="html.parser")
148
+
149
+ # Initialize data dictionary
150
+ data = {"bins": []}
151
+
152
+ # Looking for bin types in the exact HTML structure
153
+ bin_type_elements = soup.select(
154
+ "div.formatting_bold.formatting_size_bigger.formatting span.value-as-text"
155
+ )
156
+ # print(f"Found {len(bin_type_elements)} bin type elements")
157
+
158
+ # Look specifically for date elements with the exact structure
159
+ date_elements = soup.select("div.col-sm-12.font-xs-3xl span.value-as-text")
160
+ hidden_dates = soup.select(
161
+ "div.col-sm-12.font-xs-3xl input[type='hidden'][value*='/']"
162
+ )
163
+
164
+ # print(f"Found {len(bin_type_elements)} bin types and {len(date_elements)} date elements")
165
+
166
+ # We need a smarter way to match bin types with their dates
167
+ bin_count = 0
168
+
169
+ # Map of bin types to their collection dates
170
+ bin_date_map = {}
171
+
172
+ # Extract all date strings that look like actual dates
173
+ date_texts = []
174
+ date_pattern = re.compile(
175
+ r"(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\s+\d+(?:st|nd|rd|th)?\s+\w+\s+\d{4}",
176
+ re.IGNORECASE,
177
+ )
178
+
179
+ for element in date_elements:
180
+ text = element.get_text(strip=True)
181
+ if date_pattern.search(text):
182
+ date_texts.append(text)
183
+ # print(f"Found valid date text: {text}")
184
+
185
+ # Find hidden date inputs with values in DD/MM/YYYY format
186
+ hidden_date_values = []
187
+ for hidden in hidden_dates:
188
+ value = hidden.get("value", "")
189
+ if re.match(r"\d{1,2}/\d{1,2}/\d{4}", value):
190
+ hidden_date_values.append(value)
191
+ # print(f"Found hidden date value: {value}")
192
+
193
+ # When filtering date elements
194
+ date_elements = soup.select("div.col-sm-12.font-xs-3xl span.value-as-text")
195
+ valid_date_elements = []
196
+
197
+ for element in date_elements:
198
+ text = element.get_text(strip=True)
199
+ if contains_date(text):
200
+ valid_date_elements.append(element)
201
+ # print(f"Found valid date element: {text}")
202
+ else:
203
+ pass
204
+ # print(f"Skipping non-date element: {text}")
205
+
206
+ # print(f"Found {len(bin_type_elements)} bin types and {len(valid_date_elements)} valid date elements")
207
+
208
+ # When processing each bin type
209
+ for i, bin_type_elem in enumerate(bin_type_elements):
210
+ bin_type = bin_type_elem.get_text(strip=True)
211
+
212
+ # Try to find a date for this bin type
213
+ date_text = None
214
+
215
+ # Look for a valid date element
216
+ if i < len(valid_date_elements):
217
+ date_elem = valid_date_elements[i]
218
+ date_text = date_elem.get_text(strip=True)
219
+
220
+ # If we don't have a valid date yet, try using the hidden input
221
+ if not date_text or not contains_date(date_text):
222
+ if i < len(hidden_dates):
223
+ date_value = hidden_dates[i].get("value")
224
+ if contains_date(date_value):
225
+ date_text = date_value
226
+
227
+ # Skip if we don't have a valid date
228
+ if not date_text or not contains_date(date_text):
229
+ # print(f"No valid date found for bin type: {bin_type}")
230
+ continue
231
+
232
+ # print(f"Found bin type: {bin_type} with date: {date_text}")
233
+
234
+ try:
235
+ # Clean up the date text
236
+ date_text = remove_ordinal_indicator_from_date_string(date_text)
237
+
238
+ # Try to parse the date
239
+ try:
240
+ collection_date = datetime.strptime(
241
+ date_text, "%A %d %B %Y"
242
+ ).date()
243
+ except ValueError:
244
+ try:
245
+ collection_date = datetime.strptime(
246
+ date_text, "%d/%m/%Y"
247
+ ).date()
248
+ except ValueError:
249
+ # Last resort
250
+ collection_date = parse(date_text).date()
251
+
252
+ # Create bin entry
253
+ bin_entry = {
254
+ "type": bin_type,
255
+ "collectionDate": collection_date.strftime(date_format),
256
+ }
257
+
258
+ # Add to data
259
+ data["bins"].append(bin_entry)
260
+ bin_count += 1
261
+ # print(f"Added bin entry: {bin_entry}")
262
+
263
+ except Exception as e:
264
+ pass
265
+ # print(f"Error parsing date '{date_text}': {str(e)}")
266
+
267
+ # print(f"Successfully parsed {bin_count} bin collections")
268
+
269
+ if not data["bins"]:
270
+ # print("No bin data found. Saving page for debugging...")
271
+ with open(f"debug_page_{int(time.time())}.html", "w") as f:
272
+ f.write(driver.page_source)
273
+ driver.save_screenshot(f"final_error_screenshot_{int(time.time())}.png")
274
+ raise ValueError(
275
+ "No bin collection data could be extracted from the page"
276
+ )
277
+
278
+ # Sort the bin collections by date
279
+ data["bins"].sort(
280
+ key=lambda x: datetime.strptime(x.get("collectionDate"), date_format)
281
+ )
282
+
283
+ return data
284
+
285
+ except Exception as e:
286
+ # print(f"Error parsing bin collection data: {e}")
287
+ raise
@@ -1,88 +0,0 @@
1
- from datetime import datetime
2
-
3
- from bs4 import BeautifulSoup
4
-
5
- from uk_bin_collection.uk_bin_collection.common import (
6
- date_format,
7
- get_date_with_ordinal,
8
- )
9
- from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
10
-
11
-
12
- class CouncilClass(AbstractGetBinDataClass):
13
- def parse_data(self, page: str, **kwargs) -> dict:
14
- # Handle both string and Response objects
15
- page_content = page.text if hasattr(page, "text") else page
16
-
17
- soup = BeautifulSoup(page_content, features="html.parser")
18
-
19
- data = {"bins": []}
20
- collections = []
21
-
22
- # Find all bin collection rows
23
- bin_rows = soup.find_all("div", class_="bin-collection-listing-row")
24
-
25
- if not bin_rows:
26
- raise ValueError("No bin collection rows found in HTML")
27
-
28
- for bin_row in bin_rows:
29
- try:
30
- # Get bin type from h2
31
- bin_type_elem = bin_row.find("h2")
32
- if not bin_type_elem:
33
- continue
34
- bin_type = bin_type_elem.text.strip()
35
-
36
- # Find next collection date - look for all <p> tags
37
- paragraphs = bin_row.find_all("p")
38
-
39
- for p in paragraphs:
40
- if p.get_text() and "Next collection:" in p.get_text():
41
- date_str = p.get_text().replace("Next collection:", "").strip()
42
- # Extract day number from date string (e.g. "2" from "Friday 2nd May")
43
- day_number = int("".join(filter(str.isdigit, date_str)))
44
- # Replace ordinal in date string with plain number
45
- date_str = date_str.replace(
46
- get_date_with_ordinal(day_number), str(day_number)
47
- )
48
-
49
- try:
50
- # Parse date with full format
51
- bin_date = datetime.strptime(date_str, "%A %d %B")
52
-
53
- # Add current year since it's not in the date string
54
- current_year = datetime.now().year
55
- bin_date = bin_date.replace(year=current_year)
56
-
57
- # If the date is in the past, it's probably for next year
58
- if bin_date < datetime.now():
59
- bin_date = bin_date.replace(year=current_year + 1)
60
-
61
- collections.append((bin_type, bin_date))
62
- print(
63
- f"Successfully parsed date for {bin_type}: {bin_date}"
64
- )
65
- break
66
-
67
- except ValueError as e:
68
- print(
69
- f"Failed to parse date '{date_str}' for {bin_type}: {e}"
70
- )
71
- continue
72
-
73
- except Exception as e:
74
- print(f"Error processing bin row: {e}")
75
- continue
76
-
77
- if not collections:
78
- raise ValueError("No valid collection dates found")
79
-
80
- ordered_data = sorted(collections, key=lambda x: x[1])
81
- for item in ordered_data:
82
- dict_data = {
83
- "type": item[0],
84
- "collectionDate": item[1].strftime(date_format),
85
- }
86
- data["bins"].append(dict_data)
87
-
88
- return data
@@ -1,93 +0,0 @@
1
- import requests
2
- from bs4 import BeautifulSoup
3
-
4
- from uk_bin_collection.uk_bin_collection.common import *
5
- from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
-
7
-
8
- # import the wonderful Beautiful Soup and the URL grabber
9
- class CouncilClass(AbstractGetBinDataClass):
10
- """
11
- Concrete classes have to implement all abstract operations of the
12
- base class. They can also override some operations with a default
13
- implementation.
14
- """
15
-
16
- def parse_data(self, page: str, **kwargs) -> dict:
17
-
18
- user_postcode = kwargs.get("postcode")
19
- user_paon = kwargs.get("paon")
20
- check_postcode(user_postcode)
21
- check_paon(user_paon)
22
- bindata = {"bins": []}
23
-
24
- URI = "https://uhtn-wrp.whitespacews.com/"
25
-
26
- session = requests.Session()
27
-
28
- # get link from first page as has some kind of unique hash
29
- r = session.get(
30
- URI,
31
- )
32
- r.raise_for_status()
33
- soup = BeautifulSoup(r.text, features="html.parser")
34
-
35
- alink = soup.find("a", text="Find my bin collection day")
36
-
37
- if alink is None:
38
- raise Exception("Initial page did not load correctly")
39
-
40
- # greplace 'seq' query string to skip next step
41
- nextpageurl = alink["href"].replace("seq=1", "seq=2")
42
-
43
- data = {
44
- "address_name_number": user_paon,
45
- "address_postcode": user_postcode,
46
- }
47
-
48
- # get list of addresses
49
- r = session.post(nextpageurl, data)
50
- r.raise_for_status()
51
-
52
- soup = BeautifulSoup(r.text, features="html.parser")
53
-
54
- # get first address (if you don't enter enough argument values this won't find the right address)
55
- alink = soup.find("div", id="property_list").find("a")
56
-
57
- if alink is None:
58
- raise Exception("Address not found")
59
-
60
- nextpageurl = URI + alink["href"]
61
-
62
- # get collection page
63
- r = session.get(
64
- nextpageurl,
65
- )
66
- r.raise_for_status()
67
- soup = BeautifulSoup(r.text, features="html.parser")
68
-
69
- if soup.find("span", id="waste-hint"):
70
- raise Exception("No scheduled services at this address")
71
-
72
- u1s = soup.find("section", id="scheduled-collections").find_all("u1")
73
-
74
- for u1 in u1s:
75
- lis = u1.find_all("li", recursive=False)
76
-
77
- date = lis[1].text.replace("\n", "")
78
- bin_type = lis[2].text.replace("\n", "")
79
-
80
- dict_data = {
81
- "type": bin_type,
82
- "collectionDate": datetime.strptime(
83
- date,
84
- "%d/%m/%Y",
85
- ).strftime(date_format),
86
- }
87
- bindata["bins"].append(dict_data)
88
-
89
- bindata["bins"].sort(
90
- key=lambda x: datetime.strptime(x.get("collectionDate"), date_format)
91
- )
92
-
93
- return bindata