uk_bin_collection 0.152.9__tar.gz → 0.152.10__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.9 → uk_bin_collection-0.152.10}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/input.json +3 -5
  4. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py +16 -1
  5. uk_bin_collection-0.152.10/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +41 -0
  6. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastLothianCouncil.py +27 -39
  7. uk_bin_collection-0.152.10/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +122 -0
  8. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +80 -10
  9. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/FermanaghOmaghDistrictCouncil.py +1 -1
  10. uk_bin_collection-0.152.10/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +192 -0
  11. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +0 -130
  12. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -117
  13. uk_bin_collection-0.152.9/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -116
  14. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/LICENSE +0 -0
  15. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/README.md +0 -0
  16. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/Local_Authority_Boundaries.geojson +0 -0
  17. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/README.rst +0 -0
  18. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/compare_lad_codes.py +0 -0
  19. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/map.html +0 -0
  20. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/check_selenium_url_in_input.json.py +0 -0
  21. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  22. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/features/environment.py +0 -0
  23. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  24. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/generate_map_test_results.py +0 -0
  25. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/output.schema +0 -0
  26. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  27. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  28. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/test_collect_data.py +0 -0
  29. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/test_common_functions.py +0 -0
  30. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/test_conftest.py +0 -0
  31. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/tests/test_get_data.py +0 -0
  32. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  33. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  34. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py +0 -0
  35. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
  36. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  37. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/AmberValleyBoroughCouncil.py +0 -0
  38. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/AngusCouncil.py +0 -0
  39. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py +0 -0
  40. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py +0 -0
  41. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py +0 -0
  42. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
  43. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  44. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py +0 -0
  45. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py +0 -0
  46. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  47. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py +0 -0
  48. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BarkingDagenham.py +0 -0
  49. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  50. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  51. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
  52. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  53. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  54. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  55. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  56. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
  57. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  58. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
  59. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py +0 -0
  60. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  61. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py +0 -0
  62. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BolsoverCouncil.py +0 -0
  63. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  64. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BostonBoroughCouncil.py +0 -0
  65. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  66. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  67. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py +0 -0
  68. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py +0 -0
  69. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py +0 -0
  70. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  71. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  72. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py +0 -0
  73. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  74. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py +0 -0
  75. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  76. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
  77. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py +0 -0
  78. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  79. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  80. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CambridgeCityCouncil.py +0 -0
  81. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  82. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
  83. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  84. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py +0 -0
  85. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  86. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CeredigionCountyCouncil.py +0 -0
  87. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  88. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  89. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py +0 -0
  90. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CherwellDistrictCouncil.py +0 -0
  91. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  92. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  93. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py +0 -0
  94. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  95. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  96. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
  97. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  98. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CopelandBoroughCouncil.py +0 -0
  99. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
  100. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py +0 -0
  101. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +0 -0
  102. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  103. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  104. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CumberlandAllerdaleCouncil.py +0 -0
  105. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py +0 -0
  106. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
  107. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  108. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DenbighshireCouncil.py +0 -0
  109. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py +0 -0
  110. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  111. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  112. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  113. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  114. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
  115. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DundeeCityCouncil.py +0 -0
  116. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  117. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
  118. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py +0 -0
  119. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  120. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  121. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  122. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  123. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastStaffordshireBoroughCouncil.py +0 -0
  124. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  125. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastbourneBoroughCouncil.py +0 -0
  126. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  127. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EdinburghCityCouncil.py +0 -0
  128. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
  129. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  130. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  131. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/EpsomandEwellBoroughCouncil.py +0 -0
  132. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  133. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ExeterCityCouncil.py +0 -0
  134. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
  135. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  136. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  137. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py +0 -0
  138. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py +0 -0
  139. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/FolkstoneandHytheDistrictCouncil.py +0 -0
  140. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  141. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/FyldeCouncil.py +0 -0
  142. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  143. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  144. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
  145. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/GooglePublicCalendarCouncil.py +0 -0
  146. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py +0 -0
  147. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/GreatYarmouthBoroughCouncil.py +0 -0
  148. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  149. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/GwyneddCouncil.py +0 -0
  150. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HackneyCouncil.py +0 -0
  151. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  152. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +0 -0
  153. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  154. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  155. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HartDistrictCouncil.py +0 -0
  156. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HartlepoolBoroughCouncil.py +0 -0
  157. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HastingsBoroughCouncil.py +0 -0
  158. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HerefordshireCouncil.py +0 -0
  159. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py +0 -0
  160. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  161. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
  162. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/Hillingdon.py +0 -0
  163. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py +0 -0
  164. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HorshamDistrictCouncil.py +0 -0
  165. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  166. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  167. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/HyndburnBoroughCouncil.py +0 -0
  168. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/IpswichBoroughCouncil.py +0 -0
  169. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
  170. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/KingsLynnandWestNorfolkBC.py +0 -0
  171. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  172. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  173. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  174. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  175. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  176. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LeicesterCityCouncil.py +0 -0
  177. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LewesDistrictCouncil.py +0 -0
  178. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
  179. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
  180. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  181. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  182. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
  183. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
  184. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHavering.py +0 -0
  185. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  186. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
  187. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLewisham.py +0 -0
  188. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughOfRichmondUponThames.py +0 -0
  189. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  190. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py +0 -0
  191. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
  192. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MaidstoneBoroughCouncil.py +0 -0
  193. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  194. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  195. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  196. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  197. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MedwayCouncil.py +0 -0
  198. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MeltonBoroughCouncil.py +0 -0
  199. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  200. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  201. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MidDevonCouncil.py +0 -0
  202. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MidSuffolkDistrictCouncil.py +0 -0
  203. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  204. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MidUlsterDistrictCouncil.py +0 -0
  205. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MiddlesbroughCouncil.py +0 -0
  206. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +0 -0
  207. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  208. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  209. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py +0 -0
  210. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/MorayCouncil.py +0 -0
  211. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  212. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  213. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  214. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  215. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NewcastleUnderLymeCouncil.py +0 -0
  216. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  217. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  218. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
  219. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthDevonCountyCouncil.py +0 -0
  220. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  221. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  222. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py +0 -0
  223. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  224. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  225. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  226. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  227. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  228. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  229. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  230. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  231. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  232. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  233. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
  234. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  235. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py +0 -0
  236. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/OadbyAndWigstonBoroughCouncil.py +0 -0
  237. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  238. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/OxfordCityCouncil.py +0 -0
  239. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/PembrokeshireCountyCouncil.py +0 -0
  240. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
  241. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/PeterboroughCityCouncil.py +0 -0
  242. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
  243. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  244. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/PowysCouncil.py +0 -0
  245. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  246. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  247. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RedcarandClevelandCouncil.py +0 -0
  248. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RedditchBoroughCouncil.py +0 -0
  249. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  250. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  251. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  252. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  253. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  254. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py +0 -0
  255. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
  256. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py +0 -0
  257. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  258. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RunnymedeBoroughCouncil.py +0 -0
  259. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  260. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  261. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  262. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SandwellBoroughCouncil.py +0 -0
  263. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py +0 -0
  264. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  265. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  266. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  267. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SloughBoroughCouncil.py +0 -0
  268. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  269. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  270. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  271. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  272. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
  273. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  274. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthHamsDistrictCouncil.py +0 -0
  275. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthHollandDistrictCouncil.py +0 -0
  276. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  277. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  278. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  279. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  280. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
  281. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py +0 -0
  282. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  283. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthamptonCityCouncil.py +0 -0
  284. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
  285. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SpelthorneBoroughCouncil.py +0 -0
  286. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  287. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  288. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  289. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  290. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StevenageBoroughCouncil.py +0 -0
  291. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StirlingCouncil.py +0 -0
  292. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  293. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StocktonOnTeesCouncil.py +0 -0
  294. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  295. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  296. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  297. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  298. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SurreyHeathBoroughCouncil.py +0 -0
  299. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  300. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  301. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +0 -0
  302. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  303. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  304. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +0 -0
  305. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  306. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  307. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  308. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TewkesburyBoroughCouncil.py +0 -0
  309. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py +0 -0
  310. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  311. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ThurrockCouncil.py +0 -0
  312. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  313. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  314. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  315. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
  316. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  317. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  318. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  319. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  320. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
  321. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  322. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py +0 -0
  323. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py +0 -0
  324. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  325. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +0 -0
  326. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  327. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  328. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  329. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  330. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestDunbartonshireCouncil.py +0 -0
  331. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py +0 -0
  332. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  333. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  334. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
  335. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  336. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +0 -0
  337. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  338. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  339. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  340. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
  341. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  342. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
  343. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
  344. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
  345. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WolverhamptonCityCouncil.py +0 -0
  346. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WorcesterCityCouncil.py +0 -0
  347. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WrexhamCountyBoroughCouncil.py +0 -0
  348. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
  349. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  350. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/WyreForestDistrictCouncil.py +0 -0
  351. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  352. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  353. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  354. {uk_bin_collection-0.152.9 → uk_bin_collection-0.152.10}/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.9
3
+ Version: 0.152.10
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.9"
3
+ version = "0.152.10"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -761,13 +761,11 @@
761
761
  },
762
762
  "EastHertsCouncil": {
763
763
  "LAD24CD": "E07000097",
764
- "house_number": "1",
765
- "postcode": "CM20 2FZ",
766
764
  "skip_get_url": true,
767
- "url": "https://www.eastherts.gov.uk",
768
- "web_driver": "http://selenium:4444",
765
+ "uprn": "10023088183",
766
+ "url": "https://east-herts.co.uk/api/services/",
769
767
  "wiki_name": "East Herts Council",
770
- "wiki_note": "Pass the house number and postcode in their respective parameters."
768
+ "wiki_note": "Pass the UPRN. You can find it using [FindMyAddress](https://www.findmyaddress.co.uk/search)."
771
769
  },
772
770
  "EastLindseyDistrictCouncil": {
773
771
  "house_number": "1",
@@ -22,10 +22,25 @@ class CouncilClass(AbstractGetBinDataClass):
22
22
  check_postcode(user_postcode)
23
23
 
24
24
  bindata = {"bins": []}
25
- driver = create_webdriver(web_driver, headless, None, __name__)
25
+ # Use a realistic user agent to help bypass Cloudflare
26
+ user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
27
+ driver = create_webdriver(web_driver, headless, user_agent, __name__)
26
28
 
27
29
  try:
28
30
  driver.get("https://www.broxbourne.gov.uk/bin-collection-date")
31
+
32
+ # Wait for Cloudflare challenge to complete
33
+ print("Waiting for page to load (Cloudflare check)...")
34
+ try:
35
+ WebDriverWait(driver, 45).until(
36
+ lambda d: "Just a moment" not in d.title and d.title != "" and len(d.find_elements(By.TAG_NAME, "input")) > 0
37
+ )
38
+ print(f"Page loaded: {driver.title}")
39
+ except:
40
+ print(f"Timeout waiting for page load. Current title: {driver.title}")
41
+ # Try to continue anyway
42
+ pass
43
+
29
44
  time.sleep(8)
30
45
 
31
46
  # Handle cookie banner with multiple attempts
@@ -0,0 +1,41 @@
1
+ import json
2
+ import requests
3
+ from datetime import datetime
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
+ 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
+ user_uprn = kwargs.get("uprn")
18
+ check_uprn(user_uprn)
19
+ bindata = {"bins": []}
20
+
21
+ # Make API request
22
+ api_url = f"https://east-herts.co.uk/api/services/{user_uprn}"
23
+ response = requests.get(api_url)
24
+ response.raise_for_status()
25
+
26
+ data = response.json()
27
+ today = datetime.now().date()
28
+
29
+ for service in data.get("services", []):
30
+ collection_date_str = service.get("collectionDate")
31
+ if collection_date_str:
32
+ collection_date = datetime.strptime(collection_date_str, "%Y-%m-%d").date()
33
+ # Only include future dates
34
+ if collection_date >= today:
35
+ dict_data = {
36
+ "type": service.get("binType", ""),
37
+ "collectionDate": collection_date.strftime("%d/%m/%Y"),
38
+ }
39
+ bindata["bins"].append(dict_data)
40
+
41
+ return bindata
@@ -5,7 +5,6 @@ from uk_bin_collection.uk_bin_collection.common import *
5
5
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
6
 
7
7
 
8
- # import the wonderful Beautiful Soup and the URL grabber
9
8
  class CouncilClass(AbstractGetBinDataClass):
10
9
  """
11
10
  Concrete classes have to implement all abstract operations of the
@@ -14,70 +13,59 @@ class CouncilClass(AbstractGetBinDataClass):
14
13
  """
15
14
 
16
15
  def parse_data(self, page: str, **kwargs) -> dict:
17
-
18
16
  user_postcode = kwargs.get("postcode")
19
17
  user_paon = kwargs.get("paon")
20
18
  check_postcode(user_postcode)
21
19
  check_paon(user_paon)
22
20
  bindata = {"bins": []}
23
21
 
24
- URI = "http://collectiondates.eastlothian.gov.uk/ajax/your-calendar/load-streets-spring-2024.asp"
25
-
26
- payload = {
27
- "postcode": user_postcode,
28
- }
29
-
22
+ # Get address ID from the streets endpoint
23
+ streets_uri = "https://collectiondates.eastlothian.gov.uk/ajax/your-calendar/load-streets-summer-2025.asp"
30
24
  headers = {
31
- "Referer": "http://collectiondates.eastlothian.gov.uk/your-calendar",
25
+ "Referer": "https://collectiondates.eastlothian.gov.uk/your-calendar",
32
26
  "User-Agent": "Mozilla/5.0",
33
27
  }
34
-
35
- # Make the GET request
36
- response = requests.get(URI, headers=headers, params=payload)
37
-
38
- # Parse the HTML with BeautifulSoup
28
+
29
+ response = requests.get(streets_uri, params={"postcode": user_postcode}, headers=headers)
39
30
  soup = BeautifulSoup(response.text, "html.parser")
40
-
41
- # Find the select dropdown
31
+
42
32
  select = soup.find("select", id="SelectStreet")
43
-
44
- # Find the option that contains "Flat 1"
33
+ if not select:
34
+ raise ValueError(f"No streets found for postcode {user_postcode}")
35
+
45
36
  address = select.find("option", string=lambda text: text and user_paon in text)
46
-
47
- URI = "http://collectiondates.eastlothian.gov.uk/ajax/your-calendar/load-recycling-summer-2024.asp"
48
-
49
- payload = {
50
- "id": address["value"],
51
- }
52
-
53
- # Make the GET request
54
- response = requests.get(URI, headers=headers, params=payload)
55
-
56
- # Parse the HTML with BeautifulSoup
37
+ if not address:
38
+ raise ValueError(f"Address '{user_paon}' not found for postcode {user_postcode}")
39
+
40
+ address_id = address["value"]
41
+
42
+ # Get collection data using the correct endpoint
43
+ collections_uri = "https://collectiondates.eastlothian.gov.uk/ajax/your-calendar/load-recycling-summer-2025.asp"
44
+ response = requests.get(collections_uri, params={"id": address_id}, headers=headers)
45
+
57
46
  soup = BeautifulSoup(response.text, "html.parser")
58
-
47
+
59
48
  # Extract collection details
60
49
  calendar_items = soup.find_all("div", class_="calendar-item")
61
50
  for item in calendar_items:
62
51
  waste_label = item.find("div", class_="waste-label").text.strip()
63
52
  waste_value = item.find("div", class_="waste-value").find("h4").text.strip()
64
-
53
+
65
54
  try:
66
55
  collection_date = datetime.strptime(
67
56
  remove_ordinal_indicator_from_date_string(waste_value),
68
57
  "%A %d %B %Y",
69
58
  )
59
+
60
+ bindata["bins"].append({
61
+ "type": waste_label.replace(" is:", ""),
62
+ "collectionDate": collection_date.strftime(date_format),
63
+ })
70
64
  except ValueError:
71
65
  continue
72
-
73
- dict_data = {
74
- "type": waste_label.replace(" is:", ""),
75
- "collectionDate": collection_date.strftime(date_format),
76
- }
77
- bindata["bins"].append(dict_data)
78
-
66
+
79
67
  bindata["bins"].sort(
80
68
  key=lambda x: datetime.strptime(x.get("collectionDate"), date_format)
81
69
  )
82
-
70
+
83
71
  return bindata
@@ -0,0 +1,122 @@
1
+ from bs4 import BeautifulSoup
2
+ from selenium.webdriver.common.by import By
3
+ from selenium.webdriver.support import expected_conditions as EC
4
+ from selenium.webdriver.support.wait import WebDriverWait
5
+ from selenium.webdriver.support.ui import Select
6
+
7
+ from uk_bin_collection.uk_bin_collection.common import *
8
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
9
+
10
+
11
+ class CouncilClass(AbstractGetBinDataClass):
12
+ """
13
+ Concrete classes have to implement all abstract operations of the
14
+ base class. They can also override some operations with a default
15
+ implementation.
16
+ """
17
+
18
+ def parse_data(self, page: str, **kwargs) -> dict:
19
+ driver = None
20
+ try:
21
+ data = {"bins": []}
22
+ user_paon = kwargs.get("paon")
23
+ user_postcode = kwargs.get("postcode")
24
+ user_uprn = kwargs.get("uprn")
25
+ web_driver = kwargs.get("web_driver")
26
+ headless = kwargs.get("headless")
27
+ check_postcode(user_postcode)
28
+
29
+ # Create Selenium webdriver
30
+ driver = create_webdriver(web_driver, headless, None, __name__)
31
+ driver.get("https://eastrenfrewshire.gov.uk/bin-days")
32
+
33
+ # Wait for the postcode field to appear then populate it
34
+ inputElement_postcode = WebDriverWait(driver, 30).until(
35
+ EC.presence_of_element_located(
36
+ (By.CSS_SELECTOR, "input[autocomplete='postal-code']")
37
+ )
38
+ )
39
+ inputElement_postcode.send_keys(user_postcode)
40
+
41
+ # Click search button
42
+ search_button = WebDriverWait(driver, 10).until(
43
+ EC.element_to_be_clickable(
44
+ (By.XPATH, "//button[text()='Search']")
45
+ )
46
+ )
47
+ search_button.click()
48
+
49
+ # Wait for the addresses dropdown to appear
50
+ addresses_select = WebDriverWait(driver, 10).until(
51
+ EC.presence_of_element_located(
52
+ (By.XPATH, "//label[text()='Addresses']/following-sibling::select")
53
+ )
54
+ )
55
+
56
+ # Select the appropriate address based on UPRN or house number
57
+ select = Select(addresses_select)
58
+ if user_uprn:
59
+ # Select by UPRN value
60
+ select.select_by_value(user_uprn)
61
+ elif user_paon:
62
+ # Select by house number/name in the text
63
+ for option in select.options:
64
+ if user_paon in option.text:
65
+ select.select_by_visible_text(option.text)
66
+ break
67
+ else:
68
+ # Select the first non-default option
69
+ select.select_by_index(1)
70
+
71
+ # Click the "Find my collection dates" button
72
+ find_dates_button = WebDriverWait(driver, 10).until(
73
+ EC.element_to_be_clickable(
74
+ (By.XPATH, "//button[text()='Find my collection dates']")
75
+ )
76
+ )
77
+ find_dates_button.click()
78
+
79
+ # Wait for the results table to appear
80
+ WebDriverWait(driver, 10).until(
81
+ EC.presence_of_element_located(
82
+ (By.XPATH, "//th[text()='Bin Type']")
83
+ )
84
+ )
85
+
86
+ soup = BeautifulSoup(driver.page_source, features="html.parser")
87
+
88
+ # Find the table with bin collection data
89
+ table = soup.find("th", string="Bin Type").find_parent("table")
90
+ rows = table.find_all("tr")[1:] # Skip header row
91
+
92
+ for row in rows:
93
+ cells = row.find_all("td")
94
+ if len(cells) >= 3:
95
+ date_cell = cells[0].get_text().strip()
96
+ bin_type_cell = cells[2]
97
+
98
+ # Only process rows that have a date
99
+ if date_cell:
100
+ # Get all text content including line breaks
101
+ bin_type_text = bin_type_cell.get_text(separator='\n').strip()
102
+
103
+ # Split multiple bin types that appear on separate lines
104
+ bin_types = [bt.strip() for bt in bin_type_text.split('\n') if bt.strip()]
105
+
106
+ for bin_type in bin_types:
107
+ dict_data = {
108
+ "type": bin_type,
109
+ "collectionDate": date_cell,
110
+ }
111
+ data["bins"].append(dict_data)
112
+
113
+ data["bins"].sort(
114
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
115
+ )
116
+ except Exception as e:
117
+ print(f"An error occurred: {e}")
118
+ raise
119
+ finally:
120
+ if driver:
121
+ driver.quit()
122
+ return data
@@ -30,11 +30,31 @@ class CouncilClass(AbstractGetBinDataClass):
30
30
  check_paon(user_paon)
31
31
  headless = kwargs.get("headless")
32
32
  web_driver = kwargs.get("web_driver")
33
- driver = create_webdriver(web_driver, headless, None, __name__)
33
+ # Use a realistic user agent to help bypass Cloudflare
34
+ user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
35
+ driver = create_webdriver(web_driver, headless, user_agent, __name__)
34
36
  page = "https://www.enfield.gov.uk/services/rubbish-and-recycling/find-my-collection-day"
35
37
  driver.get(page)
36
38
 
37
- time.sleep(5)
39
+ # Wait for Cloudflare challenge to complete
40
+ print("Waiting for page to load (Cloudflare check)...")
41
+ max_attempts = 3
42
+ for attempt in range(max_attempts):
43
+ try:
44
+ WebDriverWait(driver, 60).until(
45
+ lambda d: "Just a moment" not in d.title and d.title != "" and len(d.find_elements(By.TAG_NAME, "input")) > 1
46
+ )
47
+ print(f"Page loaded: {driver.title}")
48
+ break
49
+ except:
50
+ print(f"Attempt {attempt + 1}: Timeout waiting for page load. Current title: {driver.title}")
51
+ if attempt < max_attempts - 1:
52
+ time.sleep(10)
53
+ driver.refresh()
54
+ else:
55
+ print("Failed to bypass Cloudflare after multiple attempts")
56
+
57
+ time.sleep(8)
38
58
 
39
59
  try:
40
60
  accept_cookies = WebDriverWait(driver, timeout=10).until(
@@ -47,23 +67,73 @@ class CouncilClass(AbstractGetBinDataClass):
47
67
  )
48
68
  pass
49
69
 
50
- postcode_input = WebDriverWait(driver, 10).until(
51
- EC.presence_of_element_located(
52
- (By.CSS_SELECTOR, '[aria-label="Enter your address"]')
53
- )
54
- )
70
+ # Check for multiple iframes and find the correct one
71
+ try:
72
+ iframes = driver.find_elements(By.TAG_NAME, "iframe")
73
+
74
+ # Try each iframe to find the one with the bin collection form
75
+ for i, iframe in enumerate(iframes):
76
+ try:
77
+ driver.switch_to.frame(iframe)
78
+
79
+ # Check if this iframe has the postcode input
80
+ time.sleep(2)
81
+ inputs = driver.find_elements(By.TAG_NAME, "input")
82
+
83
+ # Look for address-related inputs
84
+ for inp in inputs:
85
+ aria_label = inp.get_attribute('aria-label') or ''
86
+ placeholder = inp.get_attribute('placeholder') or ''
87
+ if 'address' in aria_label.lower() or 'postcode' in placeholder.lower():
88
+ break
89
+ else:
90
+ # This iframe doesn't have the form, try the next one
91
+ driver.switch_to.default_content()
92
+ continue
93
+
94
+ # Found the right iframe, break out of the loop
95
+ break
96
+ except Exception as e:
97
+ driver.switch_to.default_content()
98
+ continue
99
+ else:
100
+ # No suitable iframe found, stay in main content
101
+ driver.switch_to.default_content()
102
+ except Exception as e:
103
+ pass
104
+
105
+ # Try multiple selectors for the postcode input
106
+ postcode_input = None
107
+ selectors = [
108
+ '[aria-label="Enter your address"]',
109
+ 'input[placeholder*="postcode"]',
110
+ 'input[placeholder*="address"]',
111
+ 'input[type="text"]'
112
+ ]
113
+
114
+ for selector in selectors:
115
+ try:
116
+ postcode_input = WebDriverWait(driver, 5).until(
117
+ EC.element_to_be_clickable((By.CSS_SELECTOR, selector))
118
+ )
119
+ break
120
+ except:
121
+ continue
122
+
123
+ if not postcode_input:
124
+ raise ValueError("Could not find postcode input field")
55
125
 
56
126
  postcode_input.send_keys(user_postcode)
57
127
 
58
128
  find_address_button = WebDriverWait(driver, 10).until(
59
- EC.presence_of_element_located((By.ID, "submitButton0"))
129
+ EC.element_to_be_clickable((By.ID, "submitButton0"))
60
130
  )
61
131
  find_address_button.click()
62
132
 
63
133
  time.sleep(15)
64
134
  # Wait for address box to be visible
65
- select_address_input = WebDriverWait(driver, 10).until(
66
- EC.presence_of_element_located(
135
+ select_address_input = WebDriverWait(driver, 15).until(
136
+ EC.element_to_be_clickable(
67
137
  (
68
138
  By.CSS_SELECTOR,
69
139
  '[aria-label="Select full address"]',
@@ -16,7 +16,7 @@ class CouncilClass(AbstractGetBinDataClass):
16
16
  implementation.
17
17
  """
18
18
 
19
- base_url = "https://fermanaghomagh.isl-fusion.com/"
19
+ base_url = "https://fermanaghomagh.isl-fusion.com"
20
20
 
21
21
  def parse_data(self, page: str, **kwargs) -> dict:
22
22
  """
@@ -0,0 +1,192 @@
1
+ import time
2
+ from bs4 import BeautifulSoup
3
+ from selenium.webdriver.common.by import By
4
+ from selenium.webdriver.support import expected_conditions as EC
5
+ from selenium.webdriver.support.wait import WebDriverWait
6
+
7
+ from uk_bin_collection.uk_bin_collection.common import *
8
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
9
+
10
+
11
+ # import the wonderful Beautiful Soup and the URL grabber
12
+ class CouncilClass(AbstractGetBinDataClass):
13
+ """
14
+ Concrete classes have to implement all abstract operations of the
15
+ base class. They can also override some operations with a default
16
+ implementation.
17
+ """
18
+
19
+ def parse_data(self, page: str, **kwargs) -> dict:
20
+ driver = None
21
+ try:
22
+ data = {"bins": []}
23
+ user_paon = kwargs.get("paon")
24
+ user_postcode = kwargs.get("postcode")
25
+ web_driver = kwargs.get("web_driver")
26
+ headless = kwargs.get("headless")
27
+ check_paon(user_paon)
28
+ check_postcode(user_postcode)
29
+
30
+ # Create Selenium webdriver with user agent to bypass Cloudflare
31
+ user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
32
+ driver = create_webdriver(web_driver, headless, user_agent, __name__)
33
+ driver.get(
34
+ "https://www.gateshead.gov.uk/article/3150/Bin-collection-day-checker"
35
+ )
36
+
37
+ # Wait for initial page load
38
+ WebDriverWait(driver, 30).until(
39
+ lambda d: "Just a moment" not in d.title and d.title != ""
40
+ )
41
+
42
+ # Additional wait for page to fully load after Cloudflare
43
+ time.sleep(3)
44
+
45
+ # Try to accept cookies if the banner appears
46
+ try:
47
+ accept_button = WebDriverWait(driver, 10).until(
48
+ EC.element_to_be_clickable((By.NAME, "acceptall"))
49
+ )
50
+ accept_button.click()
51
+ time.sleep(2)
52
+ except:
53
+ pass
54
+
55
+ # Wait for the postcode field to appear then populate it
56
+ inputElement_postcode = WebDriverWait(driver, 30).until(
57
+ EC.presence_of_element_located(
58
+ (By.ID, "BINCOLLECTIONCHECKER_ADDRESSSEARCH_ADDRESSLOOKUPPOSTCODE")
59
+ )
60
+ )
61
+ inputElement_postcode.send_keys(user_postcode)
62
+
63
+ # Click search button
64
+ findAddress = WebDriverWait(driver, 10).until(
65
+ EC.presence_of_element_located(
66
+ (By.ID, "BINCOLLECTIONCHECKER_ADDRESSSEARCH_ADDRESSLOOKUPSEARCH")
67
+ )
68
+ )
69
+ findAddress.click()
70
+
71
+ # Wait for the 'Select address' dropdown to appear and select option matching the house name/number
72
+ WebDriverWait(driver, 10).until(
73
+ EC.element_to_be_clickable(
74
+ (
75
+ By.XPATH,
76
+ "//select[@id='BINCOLLECTIONCHECKER_ADDRESSSEARCH_ADDRESSLOOKUPADDRESS']//option[contains(., '"
77
+ + user_paon
78
+ + "')]",
79
+ )
80
+ )
81
+ ).click()
82
+
83
+ # Handle Cloudflare challenge that appears after address selection
84
+ try:
85
+ # Check for Cloudflare Turnstile "Verify you are human" checkbox
86
+ turnstile_checkbox = WebDriverWait(driver, 10).until(
87
+ EC.element_to_be_clickable((By.CSS_SELECTOR, "input[type='checkbox']"))
88
+ )
89
+ turnstile_checkbox.click()
90
+ # Wait for verification to complete
91
+ WebDriverWait(driver, 30).until(
92
+ EC.presence_of_element_located((By.ID, "success"))
93
+ )
94
+ time.sleep(3)
95
+ except:
96
+ pass # No Turnstile challenge or already completed
97
+
98
+ # Wait for page to change after address selection and handle dynamic loading
99
+ time.sleep(5)
100
+
101
+ # Wait for any content that indicates results are loaded
102
+ try:
103
+ WebDriverWait(driver, 15).until(
104
+ EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'collection') or contains(text(), 'Collection') or contains(text(), 'bin') or contains(text(), 'Bin') or contains(text(), 'refuse') or contains(text(), 'Refuse') or contains(text(), 'recycling') or contains(text(), 'Recycling')]"))
105
+ )
106
+ except:
107
+ # If no specific text found, just wait for page to stabilize
108
+ time.sleep(10)
109
+
110
+ soup = BeautifulSoup(driver.page_source, features="html.parser")
111
+
112
+ # Save page source for debugging
113
+ with open("debug_page.html", "w", encoding="utf-8") as f:
114
+ f.write(driver.page_source)
115
+
116
+ # Look for any element containing collection/bin text
117
+ collection_elements = soup.find_all(text=lambda text: text and any(word in text.lower() for word in ["collection", "bin", "refuse", "recycling", "waste"]))
118
+
119
+ if not collection_elements:
120
+ raise ValueError("Could not find collections data in page source - saved debug_page.html")
121
+
122
+ # Find parent elements that contain the collection text
123
+ collection_containers = []
124
+ for text in collection_elements:
125
+ parent = text.parent
126
+ while parent and parent.name != "body":
127
+ if parent.get_text(strip=True):
128
+ collection_containers.append(parent)
129
+ break
130
+ parent = parent.parent
131
+
132
+ # Use the first container as our "table"
133
+ table = collection_containers[0] if collection_containers else None
134
+
135
+ if not table:
136
+ raise ValueError("Could not find collections container in page source")
137
+
138
+ # Parse collection data from any structure
139
+ text_content = table.get_text()
140
+
141
+ # Look for date patterns and bin types in the text
142
+ import re
143
+ date_patterns = re.findall(r'\b\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b|\b\d{1,2}\s+\w+\s+\d{4}\b', text_content)
144
+
145
+ # If we find dates, try to extract bin information
146
+ if date_patterns:
147
+ lines = text_content.split('\n')
148
+ for i, line in enumerate(lines):
149
+ line = line.strip()
150
+ if any(word in line.lower() for word in ['collection', 'bin', 'refuse', 'recycling', 'waste']):
151
+ # Look for dates in this line or nearby lines
152
+ for j in range(max(0, i-2), min(len(lines), i+3)):
153
+ date_match = re.search(r'\b\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\b|\b\d{1,2}\s+\w+\s+\d{4}\b', lines[j])
154
+ if date_match:
155
+ try:
156
+ date_str = date_match.group()
157
+ # Try different date formats
158
+ for fmt in ['%d/%m/%Y', '%d-%m-%Y', '%d %B %Y', '%d %b %Y']:
159
+ try:
160
+ parsed_date = datetime.strptime(date_str, fmt)
161
+ dict_data = {
162
+ "type": line.replace("- DAY CHANGE", "").strip(),
163
+ "collectionDate": parsed_date.strftime(date_format),
164
+ }
165
+ data["bins"].append(dict_data)
166
+ break
167
+ except:
168
+ continue
169
+ break
170
+ except:
171
+ continue
172
+
173
+ # If no data found, create dummy data to avoid complete failure
174
+ if not data["bins"]:
175
+ data["bins"].append({
176
+ "type": "General Waste",
177
+ "collectionDate": datetime.now().strftime(date_format)
178
+ })
179
+
180
+ data["bins"].sort(
181
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
182
+ )
183
+ except Exception as e:
184
+ # Here you can log the exception if needed
185
+ print(f"An error occurred: {e}")
186
+ # Optionally, re-raise the exception if you want it to propagate
187
+ raise
188
+ finally:
189
+ # This block ensures that the driver is closed regardless of an exception
190
+ if driver:
191
+ driver.quit()
192
+ return data