uk_bin_collection 0.80.0__tar.gz → 0.81.0__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 (187) hide show
  1. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/input.json +13 -5
  4. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +26 -13
  5. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +6 -15
  6. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +8 -6
  7. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +13 -5
  8. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +1 -1
  9. uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +156 -0
  10. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/LICENSE +0 -0
  11. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/README.md +0 -0
  12. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/README.rst +0 -0
  13. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  14. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/features/environment.py +0 -0
  15. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  16. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/output.schema +0 -0
  17. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  18. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  19. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/test_collect_data.py +0 -0
  20. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/test_common_functions.py +0 -0
  21. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  22. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  23. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  24. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  25. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  26. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  27. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  28. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  29. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  30. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  31. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  32. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  33. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  34. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  35. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  36. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  37. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  38. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  39. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  40. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  41. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  42. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  43. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  44. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  45. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  46. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  47. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  48. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  49. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  50. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  51. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  52. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  53. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  54. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  55. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  56. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  57. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  58. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  59. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  60. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  61. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  62. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  63. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  64. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  65. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  66. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  67. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  68. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  69. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  70. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  71. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  72. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  73. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  74. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  75. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  76. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  77. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  78. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  79. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  80. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  81. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  82. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  83. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  84. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  85. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  86. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  87. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  88. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  89. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  90. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  91. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  92. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  93. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  94. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  95. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  96. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  97. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  98. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  99. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  100. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  101. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  102. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  103. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  104. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  105. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  106. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  107. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  108. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  109. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  110. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  111. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  112. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  113. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  114. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  115. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  116. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  117. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  118. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  119. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  120. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  121. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  122. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  123. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  124. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  125. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  126. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  127. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  128. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  129. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  130. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  131. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  132. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  133. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  134. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  135. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  136. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  137. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  138. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  139. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  140. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  141. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  142. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  143. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  144. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  145. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  146. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  147. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  148. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  149. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  150. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  151. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  152. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  153. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  154. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  155. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  156. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  157. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  158. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  159. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  160. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  161. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  162. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  163. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  164. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  165. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  166. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  167. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  168. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  169. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  170. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  171. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  172. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  173. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  174. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  175. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  176. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  177. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  178. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  179. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  180. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  181. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  182. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  183. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  184. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  185. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  186. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  187. {uk_bin_collection-0.80.0 → uk_bin_collection-0.81.0}/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.80.0
3
+ Version: 0.81.0
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.80.0"
3
+ version = "0.81.0"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -1041,13 +1041,13 @@
1041
1041
  "wiki_name": "Torridge District Council"
1042
1042
  },
1043
1043
  "UttlesfordDistrictCouncil": {
1044
- "url": "https://bins.uttlesford.gov.uk/",
1045
- "wiki_name": "UttlesfordDistrictCouncil",
1046
- "skip_get_url": true,
1044
+ "house_number": "72, Birchanger Lane",
1047
1045
  "postcode": "CM23 5QF",
1046
+ "skip_get_url": true,
1048
1047
  "uprn": "100090643434",
1049
- "house_number": "72, Birchanger Lane",
1050
- "web_driver": "http://selenium:4444"
1048
+ "url": "https://bins.uttlesford.gov.uk/",
1049
+ "web_driver": "http://selenium:4444",
1050
+ "wiki_name": "UttlesfordDistrictCouncil"
1051
1051
  },
1052
1052
  "ValeofGlamorganCouncil": {
1053
1053
  "skip_get_url": true,
@@ -1175,6 +1175,14 @@
1175
1175
  "wiki_name": "Woking Borough Council/Joint Waste Solutions",
1176
1176
  "wiki_note": "Works with all collection areas that use Joint Waste Solutions. Just use the correct URL."
1177
1177
  },
1178
+ "WychavonDistrictCouncil": {
1179
+ "url": "https://selfservice.wychavon.gov.uk/wdcroundlookup/wdc_search.jsp",
1180
+ "wiki_name": "WychavonDistrictCouncil",
1181
+ "web_driver": "http://selenium:4444",
1182
+ "skip_get_url": true,
1183
+ "postcode": "WR3 7RU",
1184
+ "uprn": "100120716273"
1185
+ },
1178
1186
  "WyreCouncil": {
1179
1187
  "postcode": "FY6 8HG",
1180
1188
  "skip_get_url": true,
@@ -1,7 +1,14 @@
1
+ from typing import Dict, List, Any, Optional
1
2
  from bs4 import BeautifulSoup
2
3
  from dateutil.relativedelta import relativedelta
3
-
4
- from uk_bin_collection.uk_bin_collection.common import *
4
+ import requests
5
+ import logging
6
+ import re
7
+ from datetime import datetime
8
+ from uk_bin_collection.common import *
9
+ from dateutil.parser import parse
10
+
11
+ from uk_bin_collection.uk_bin_collection.common import check_uprn, check_postcode
5
12
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
13
 
7
14
 
@@ -24,7 +31,7 @@ class CouncilClass(AbstractGetBinDataClass):
24
31
  implementation.
25
32
  """
26
33
 
27
- def get_data(self, url) -> str:
34
+ def get_data(self, url: str) -> str:
28
35
  """This method makes the request to the council
29
36
 
30
37
  Keyword arguments:
@@ -45,21 +52,27 @@ class CouncilClass(AbstractGetBinDataClass):
45
52
  full_page = session.get(url)
46
53
  return full_page
47
54
  except requests.exceptions.HTTPError as errh:
48
- _LOGGER.error(f"Http Error: {errh}")
55
+ logging.error(f"Http Error: {errh}")
49
56
  raise
50
57
  except requests.exceptions.ConnectionError as errc:
51
- _LOGGER.error(f"Error Connecting: {errc}")
58
+ logging.error(f"Error Connecting: {errc}")
52
59
  raise
53
60
  except requests.exceptions.Timeout as errt:
54
- _LOGGER.error(f"Timeout Error: {errt}")
61
+ logging.error(f"Timeout Error: {errt}")
55
62
  raise
56
63
  except requests.exceptions.RequestException as err:
57
- _LOGGER.error(f"Oops: Something Else {err}")
64
+ logging.error(f"Oops: Something Else {err}")
58
65
  raise
59
66
 
60
- def parse_data(self, page: str, **kwargs) -> dict:
61
- uprn = kwargs.get("uprn")
62
- postcode = kwargs.get("postcode")
67
+ def parse_data(self, page: str, **kwargs: Any) -> Dict[str, List[Dict[str, str]]]:
68
+ uprn: Optional[str] = kwargs.get("uprn")
69
+ postcode: Optional[str] = kwargs.get("postcode")
70
+
71
+ if uprn is None:
72
+ raise ValueError("UPRN is required and must be a non-empty string.")
73
+ if postcode is None:
74
+ raise ValueError("Postcode is required and must be a non-empty string.")
75
+
63
76
  check_uprn(uprn)
64
77
  check_postcode(postcode)
65
78
 
@@ -85,7 +98,7 @@ class CouncilClass(AbstractGetBinDataClass):
85
98
  rows = soup.find("table").find_all("tr")
86
99
 
87
100
  # Form a JSON wrapper
88
- data = {"bins": []}
101
+ data: Dict[str, List[Dict[str, str]]] = {"bins": []}
89
102
 
90
103
  # Loops the Rows
91
104
  for row in rows:
@@ -94,13 +107,13 @@ class CouncilClass(AbstractGetBinDataClass):
94
107
  bin_type = cells[0].get_text(strip=True)
95
108
  collection_next = cells[1].get_text(strip=True)
96
109
 
97
- collection_date = re.findall("\(.*?\)", collection_next)
110
+ collection_date = re.findall(r"\(.*?\)", collection_next)
98
111
 
99
112
  if len(collection_date) != 1:
100
113
  continue
101
114
 
102
115
  collection_date_obj = parse(
103
- re.sub("[()]", "", collection_date[0])
116
+ re.sub(r"[()]", "", collection_date[0])
104
117
  ).date()
105
118
 
106
119
  # since we only have the next collection day, if the parsed date is in the past,
@@ -1,17 +1,14 @@
1
1
  # This script pulls (in one hit) the data from Bromley Council Bins Data
2
2
  import datetime
3
- import time
4
3
  from datetime import datetime
5
4
 
6
5
  from bs4 import BeautifulSoup
7
6
  from dateutil.relativedelta import relativedelta
8
7
  from selenium.webdriver.common.by import By
9
- from selenium.webdriver.common.keys import Keys
10
8
  from selenium.webdriver.support import expected_conditions as EC
11
- from selenium.webdriver.support.ui import Select
12
- from selenium.webdriver.support.wait import WebDriverWait
9
+ from selenium.webdriver.support.ui import WebDriverWait
13
10
 
14
- from uk_bin_collection.uk_bin_collection.common import *
11
+ from uk_bin_collection.uk_bin_collection.common import create_webdriver
15
12
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
16
13
 
17
14
 
@@ -28,7 +25,6 @@ class CouncilClass(AbstractGetBinDataClass):
28
25
  driver = None
29
26
  try:
30
27
  bin_data_dict = {"bins": []}
31
- collections = []
32
28
  web_driver = kwargs.get("web_driver")
33
29
  headless = kwargs.get("headless")
34
30
 
@@ -39,18 +35,14 @@ class CouncilClass(AbstractGetBinDataClass):
39
35
  driver.get(kwargs.get("url"))
40
36
 
41
37
  wait = WebDriverWait(driver, 30)
42
- results = wait.until(
38
+ wait.until(
43
39
  EC.presence_of_element_located((By.CLASS_NAME, "waste-service-image"))
44
40
  )
45
- # Search for the specific bins in the table using BS
46
- # Parse the HTML content
47
- # Find all elements with the class 'container-name' to extract bin types
41
+
48
42
  # Parse the HTML content
49
43
  soup = BeautifulSoup(driver.page_source, "html.parser")
50
- soup.prettify
51
44
 
52
45
  # Find all elements with class 'govuk-summary-list'
53
- bin_info = []
54
46
  waste_services = soup.find_all(
55
47
  "h3", class_="govuk-heading-m waste-service-name"
56
48
  )
@@ -58,7 +50,7 @@ class CouncilClass(AbstractGetBinDataClass):
58
50
  for service in waste_services:
59
51
  service_title = service.get_text(strip=True)
60
52
  next_collection = service.find_next_sibling().find(
61
- "dt", text="Next collection"
53
+ "dt", string="Next collection"
62
54
  )
63
55
 
64
56
  if next_collection:
@@ -69,8 +61,7 @@ class CouncilClass(AbstractGetBinDataClass):
69
61
  next_collection_date_parse = next_collection_date.split(",")[
70
62
  1
71
63
  ].strip()
72
- day = next_collection_date_parse.split()[0]
73
- month = next_collection_date_parse.split()[1]
64
+ day, month = next_collection_date_parse.split()[:2]
74
65
 
75
66
  # Remove the suffix (e.g., 'th', 'nd', 'rd', 'st') from the day
76
67
  if day.endswith(("th", "nd", "rd", "st")):
@@ -1,11 +1,11 @@
1
1
  import time
2
-
3
2
  import pandas as pd
4
3
  from selenium.webdriver.common.by import By
5
4
  from selenium.webdriver.common.keys import Keys
6
5
  from selenium.webdriver.support.ui import Select
6
+ from io import StringIO
7
7
 
8
- from uk_bin_collection.uk_bin_collection.common import *
8
+ from uk_bin_collection.uk_bin_collection.common import create_webdriver
9
9
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
10
10
 
11
11
 
@@ -16,7 +16,7 @@ class CouncilClass(AbstractGetBinDataClass):
16
16
  implementation.
17
17
  """
18
18
 
19
- def get_data(self, df) -> dict:
19
+ def get_data(self, df: pd.DataFrame) -> dict:
20
20
  # Create dictionary of data to be returned
21
21
  data = {"bins": []}
22
22
 
@@ -69,7 +69,7 @@ class CouncilClass(AbstractGetBinDataClass):
69
69
  time.sleep(4)
70
70
 
71
71
  # Submit address information and wait
72
- inputElement_bn = driver.find_element(
72
+ driver.find_element(
73
73
  By.ID, "COPYOFECHOCOLLECTIONDATES_ADDRESSSELECTION_NAV1_NEXT"
74
74
  ).click()
75
75
 
@@ -79,8 +79,10 @@ class CouncilClass(AbstractGetBinDataClass):
79
79
  table = driver.find_element(
80
80
  By.ID, "COPYOFECHOCOLLECTIONDATES_PAGE1_DATES2"
81
81
  ).get_attribute("outerHTML")
82
- df = pd.read_html(table, header=[1])
83
- df = df[0]
82
+
83
+ # Wrap the HTML table in a StringIO object to address the warning
84
+ table_io = StringIO(table)
85
+ df = pd.read_html(table_io, header=[1])[0]
84
86
 
85
87
  # Parse data into dict
86
88
  data = self.get_data(df)
@@ -1,6 +1,10 @@
1
1
  from bs4 import BeautifulSoup
2
+ import requests
3
+ import logging
4
+ import re
5
+ from typing import Dict, List, Any, Optional
2
6
 
3
- from uk_bin_collection.uk_bin_collection.common import *
7
+ from uk_bin_collection.uk_bin_collection.common import check_uprn
4
8
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
5
9
 
6
10
 
@@ -11,10 +15,14 @@ class CouncilClass(AbstractGetBinDataClass):
11
15
  implementation.
12
16
  """
13
17
 
14
- def parse_data(self, page: str, **kwargs) -> dict:
15
- data = {"bins": []}
18
+ def parse_data(self, page: str, **kwargs: Any) -> Dict[str, List[Dict[str, str]]]:
19
+ data: Dict[str, List[Dict[str, str]]] = {"bins": []}
20
+
21
+ uprn: Optional[str] = kwargs.get("uprn")
22
+
23
+ if uprn is None:
24
+ raise ValueError("UPRN is required and must be a non-empty string.")
16
25
 
17
- uprn = kwargs.get("uprn")
18
26
  check_uprn(uprn) # Assuming check_uprn() raises an exception if UPRN is invalid
19
27
 
20
28
  try:
@@ -42,7 +50,7 @@ class CouncilClass(AbstractGetBinDataClass):
42
50
 
43
51
  if service_name_element and next_service_element:
44
52
  service = service_name_element.text
45
- next_collection = next_service_element.find(text=date_regex)
53
+ next_collection = next_service_element.find(string=date_regex)
46
54
 
47
55
  if next_collection:
48
56
  dict_data = {
@@ -29,7 +29,7 @@ class CouncilClass(AbstractGetBinDataClass):
29
29
  start = BeautifulSoup(req.text, features="html.parser")
30
30
  start.prettify()
31
31
  base_link = start.select(
32
- "#menu-content > div > div:nth-child(1) > p.govuk-body.govuk-\!-margin-bottom-0.colorblue.lineheight15 > a"
32
+ "#menu-content > div > div:nth-child(1) > p.govuk-body.govuk-\\!-margin-bottom-0.colorblue.lineheight15 > a"
33
33
  )[0].attrs.get("href")
34
34
 
35
35
  # We need to reorder the query parts from the unique URL, so split them up to make it easier
@@ -0,0 +1,156 @@
1
+ import logging
2
+ import pickle
3
+ import time
4
+
5
+ import requests
6
+ from bs4 import BeautifulSoup
7
+ from selenium import webdriver
8
+ from selenium.webdriver.common.by import By
9
+ from selenium.webdriver.common.keys import Keys
10
+ from selenium.webdriver.support import expected_conditions as EC
11
+ from selenium.webdriver.support.ui import Select
12
+ from selenium.webdriver.support.wait import WebDriverWait
13
+ from uk_bin_collection.uk_bin_collection.common import *
14
+
15
+ from uk_bin_collection.uk_bin_collection.common import *
16
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
17
+
18
+ # Set up logging
19
+ logging.basicConfig(
20
+ level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
21
+ )
22
+
23
+
24
+ class CouncilClass(AbstractGetBinDataClass):
25
+
26
+ def parse_data(self, page: str, **kwargs) -> dict:
27
+ driver = None
28
+ try:
29
+ data = {"bins": []}
30
+ collections = []
31
+ user_uprn = kwargs.get("uprn")
32
+ user_postcode = kwargs.get("postcode")
33
+ web_driver = kwargs.get("web_driver")
34
+ headless = kwargs.get("headless")
35
+ check_postcode(user_postcode)
36
+ url = "https://selfservice.wychavon.gov.uk/wdcroundlookup/wdc_search.jsp"
37
+
38
+ # Get session cookies using requests
39
+
40
+ user_agent = """general.useragent.override", "userAgent=Mozilla/5.0
41
+ (iPhone; CPU iPhone OS 15_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like
42
+ Gecko) CriOS/101.0.4951.44 Mobile/15E148 Safari/604.1"""
43
+
44
+ # Create Selenium webdriver
45
+ driver = create_webdriver(web_driver, headless, user_agent, __name__)
46
+
47
+ # Navigate to the page first
48
+ driver.get(url)
49
+
50
+ wait = WebDriverWait(driver, 60)
51
+
52
+ logging.info("Accepting cookies")
53
+
54
+ try:
55
+ logging.info("Cookies")
56
+ cookie_window = wait.until(
57
+ EC.presence_of_element_located(
58
+ (By.XPATH, '//div[@id="ccc-content"]')
59
+ )
60
+ )
61
+ time.sleep(2)
62
+ accept_cookies = WebDriverWait(driver, timeout=10).until(
63
+ EC.presence_of_element_located(
64
+ (By.XPATH, '//button[@id="ccc-recommended-settings"]')
65
+ )
66
+ )
67
+ accept_cookies.send_keys(Keys.ENTER)
68
+ accept_cookies.click()
69
+ accept_cookies_close = WebDriverWait(driver, timeout=10).until(
70
+ EC.presence_of_element_located(
71
+ (By.XPATH, '//button[@id="ccc-close"]')
72
+ )
73
+ )
74
+ accept_cookies_close.send_keys(Keys.ENTER)
75
+ accept_cookies_close.click()
76
+ except:
77
+ print(
78
+ "Accept cookies banner not found or clickable within the specified time."
79
+ )
80
+ pass
81
+
82
+ logging.info("Entering postcode")
83
+ input_element_postcode = wait.until(
84
+ EC.presence_of_element_located((By.XPATH, '//input[@id="alAddrtxt"]'))
85
+ )
86
+
87
+ input_element_postcode.send_keys(user_postcode)
88
+
89
+ logging.info("Searching for postcode")
90
+ input_element_postcode_btn = wait.until(
91
+ EC.element_to_be_clickable((By.XPATH, '//button[@id="alAddrbtn"]'))
92
+ )
93
+
94
+ input_element_postcode_btn.click()
95
+
96
+ logging.info("Waiting for address dropdown")
97
+ input_element_postcode_dropdown = wait.until(
98
+ EC.presence_of_element_located((By.XPATH, '//select[@id="alAddrsel"]'))
99
+ )
100
+
101
+ logging.info("Selecting address")
102
+ drop_down_values = Select(input_element_postcode_dropdown)
103
+ option_element = wait.until(
104
+ EC.presence_of_element_located(
105
+ (By.CSS_SELECTOR, f'option[value="{str(user_uprn)}"]')
106
+ )
107
+ )
108
+
109
+ driver.execute_script("arguments[0].scrollIntoView();", option_element)
110
+ drop_down_values.select_by_value(str(user_uprn))
111
+
112
+ input_element_address_btn = wait.until(
113
+ EC.element_to_be_clickable((By.XPATH, '//input[@id="btnSubmit"]'))
114
+ )
115
+
116
+ input_element_address_btn.click()
117
+
118
+ logging.info("Waiting for bin collection page")
119
+ strong_element = wait.until(
120
+ EC.presence_of_element_located(
121
+ (By.XPATH, "//strong[contains(text(), 'Upcoming collections')]")
122
+ )
123
+ )
124
+
125
+ logging.info("Extracting bin collection data")
126
+ soup = BeautifulSoup(driver.page_source, features="html.parser")
127
+ bins = []
128
+
129
+ rows = soup.select("table tbody tr")
130
+ for row in rows:
131
+ bin_type = row.select_one("td:nth-of-type(2)").contents[0].strip()
132
+ date_elements = row.select("td:nth-of-type(3) strong")
133
+ if date_elements:
134
+ dates = [date.get_text(strip=True) for date in date_elements]
135
+ else:
136
+ dates = ["Not applicable"]
137
+
138
+ for date in dates:
139
+ if date != "Not applicable":
140
+ # Format the date to dd/mm/yyyy
141
+ formatted_date = re.search(r"\d{2}/\d{2}/\d{4}", date).group(0)
142
+ bins.append(
143
+ {"type": bin_type, "collectionDate": formatted_date}
144
+ )
145
+
146
+ bin_data = {"bins": bins}
147
+
148
+ return bin_data
149
+
150
+ except Exception as e:
151
+ logging.error(f"An error occurred: {e}")
152
+ raise
153
+
154
+ finally:
155
+ if driver:
156
+ driver.quit()