uk_bin_collection 0.79.1__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.79.1 → uk_bin_collection-0.81.0}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/input.json +47 -1
  4. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/common.py +23 -1
  5. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +2 -1
  6. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +27 -13
  7. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +4 -4
  8. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +2 -1
  9. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +6 -15
  10. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +8 -6
  11. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +5 -4
  12. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +7 -9
  13. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +2 -1
  14. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +13 -5
  15. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +6 -4
  16. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +1 -0
  17. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +2 -1
  18. uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +146 -0
  19. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +1 -0
  20. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +2 -1
  21. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +1 -0
  22. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +1 -0
  23. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +2 -1
  24. uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +69 -0
  25. uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +70 -0
  26. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +1 -0
  27. uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +140 -0
  28. uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +117 -0
  29. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +2 -1
  30. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +2 -1
  31. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +2 -1
  32. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +4 -2
  33. uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +156 -0
  34. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/LICENSE +0 -0
  35. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/README.md +0 -0
  36. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/README.rst +0 -0
  37. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  38. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/features/environment.py +0 -0
  39. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  40. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/output.schema +0 -0
  41. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  42. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  43. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/test_collect_data.py +0 -0
  44. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/tests/test_common_functions.py +0 -0
  45. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  46. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  47. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  48. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  49. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  50. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  51. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  52. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  53. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  54. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  55. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  56. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  57. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  58. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  59. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  60. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  61. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  62. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  63. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  64. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  65. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  66. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  67. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  68. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  69. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  70. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  71. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  72. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  73. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  74. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  75. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  76. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  77. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  78. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  79. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  80. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  81. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  82. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  83. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  84. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  85. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  86. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  87. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  88. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  89. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  90. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  91. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  92. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  93. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  94. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  95. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  96. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  97. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  98. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  99. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  100. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  101. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  102. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  103. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  104. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  105. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  106. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  107. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  108. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  109. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  110. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  111. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  112. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  113. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  114. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  115. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  116. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  117. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  118. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  119. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  120. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  121. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  122. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  123. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  124. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  125. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  126. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  127. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  128. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  129. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  130. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  131. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  132. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  133. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  134. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  135. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  136. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  137. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  138. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  139. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  140. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  141. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  142. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  143. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  144. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  145. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  146. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  147. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  148. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  149. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  150. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  151. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  152. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  153. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  154. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  155. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  156. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  157. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  158. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  159. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  160. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  161. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  162. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  163. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  164. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  165. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  166. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  167. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  168. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  169. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  170. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  171. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  172. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  173. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  174. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  175. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  176. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  177. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  178. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  179. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  180. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  181. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  182. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  183. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  184. {uk_bin_collection-0.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  185. {uk_bin_collection-0.79.1 → 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.79.1 → uk_bin_collection-0.81.0}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  187. {uk_bin_collection-0.79.1 → 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.79.1
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.79.1"
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>"]
@@ -263,9 +263,9 @@
263
263
  "wiki_name": "Croydon Council"
264
264
  },
265
265
  "DartfordBoroughCouncil": {
266
+ "uprn": "010094157511",
266
267
  "url": "https://windmz.dartford.gov.uk/ufs/WS_CHECK_COLLECTIONS.eb?UPRN=010094157511",
267
268
  "wiki_name": "DartfordBoroughCouncil",
268
- "uprn": "010094157511",
269
269
  "wiki_note": "Use https://uprn.uk/ to find your UPRN "
270
270
  },
271
271
  "DerbyshireDalesDistrictCouncil": {
@@ -602,6 +602,14 @@
602
602
  "web_driver": "http://selenium:4444",
603
603
  "wiki_name": "Neath Port Talbot Council"
604
604
  },
605
+ "NewForestCouncil": {
606
+ "postcode": "SO41 0GJ",
607
+ "skip_get_url": true,
608
+ "uprn": "100060482345",
609
+ "url": "https://forms.newforest.gov.uk/id/FIND_MY_COLLECTION",
610
+ "web_driver": "http://selenium:4444",
611
+ "wiki_name": "New Forest Council"
612
+ },
605
613
  "NewarkAndSherwoodDC": {
606
614
  "url": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=200004258529",
607
615
  "wiki_command_url_override": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=XXXXXXXX",
@@ -909,6 +917,12 @@
909
917
  "url": "https://www.sthelens.gov.uk/",
910
918
  "wiki_name": "St Helens Borough Council"
911
919
  },
920
+ "StaffordBoroughCouncil": {
921
+ "uprn": "100032203010",
922
+ "url": "https://www.staffordbc.gov.uk/address/100032203010",
923
+ "wiki_name": "StaffordBoroughCouncil",
924
+ "wiki_note": "The URL needs to be https://www.staffordbc.gov.uk/address/<Your_UPRN>"
925
+ },
912
926
  "StaffordshireMoorlandsDistrictCouncil": {
913
927
  "postcode": "ST8 6HN",
914
928
  "skip_get_url": true,
@@ -959,6 +973,13 @@
959
973
  "url": "https://swale.gov.uk/bins-littering-and-the-environment/bins/collection-days",
960
974
  "wiki_name": "Swale Borough Council"
961
975
  },
976
+ "SwanseaCouncil": {
977
+ "postcode": "SA43PQ",
978
+ "skip_get_url": true,
979
+ "uprn": "100100324821",
980
+ "url": "https://www1.swansea.gov.uk/recyclingsearch/",
981
+ "wiki_name": "SwanseaCouncil"
982
+ },
962
983
  "TamesideMBCouncil": {
963
984
  "skip_get_url": true,
964
985
  "uprn": "100012835362",
@@ -992,6 +1013,14 @@
992
1013
  "url": "https://testvalley.gov.uk/wasteandrecycling/when-are-my-bins-collected",
993
1014
  "wiki_name": "Test Valley Borough Council"
994
1015
  },
1016
+ "ThreeRiversDistrictCouncil": {
1017
+ "postcode": "WD3 7AZ",
1018
+ "skip_get_url": true,
1019
+ "uprn": "100080913662",
1020
+ "url": "https://my.threerivers.gov.uk/en/AchieveForms/?mode=fill&consentMessage=yes&form_uri=sandbox-publish://AF-Process-52df96e3-992a-4b39-bba3-06cfaabcb42b/AF-Stage-01ee28aa-1584-442c-8d1f-119b6e27114a/definition.json&process=1&process_uri=sandbox-processes://AF-Process-52df96e3-992a-4b39-bba3-06cfaabcb42b&process_id=AF-Process-52df96e3-992a-4b39-bba3-06cfaabcb42b&noLoginPrompt=1",
1021
+ "web_driver": "http://selenium:4444",
1022
+ "wiki_name": "Three Rivers District Council"
1023
+ },
995
1024
  "TonbridgeAndMallingBC": {
996
1025
  "postcode": "ME19 4JS",
997
1026
  "skip_get_url": true,
@@ -1011,6 +1040,15 @@
1011
1040
  "url": "https://collections-torridge.azurewebsites.net/WebService2.asmx",
1012
1041
  "wiki_name": "Torridge District Council"
1013
1042
  },
1043
+ "UttlesfordDistrictCouncil": {
1044
+ "house_number": "72, Birchanger Lane",
1045
+ "postcode": "CM23 5QF",
1046
+ "skip_get_url": true,
1047
+ "uprn": "100090643434",
1048
+ "url": "https://bins.uttlesford.gov.uk/",
1049
+ "web_driver": "http://selenium:4444",
1050
+ "wiki_name": "UttlesfordDistrictCouncil"
1051
+ },
1014
1052
  "ValeofGlamorganCouncil": {
1015
1053
  "skip_get_url": true,
1016
1054
  "uprn": "64029020",
@@ -1137,6 +1175,14 @@
1137
1175
  "wiki_name": "Woking Borough Council/Joint Waste Solutions",
1138
1176
  "wiki_note": "Works with all collection areas that use Joint Waste Solutions. Just use the correct URL."
1139
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
+ },
1140
1186
  "WyreCouncil": {
1141
1187
  "postcode": "FY6 8HG",
1142
1188
  "skip_get_url": true,
@@ -5,7 +5,7 @@ import os
5
5
  import pandas as pd
6
6
  import re
7
7
  import requests
8
- from datetime import datetime
8
+ from datetime import datetime, timedelta
9
9
  from dateutil.parser import parse
10
10
  from enum import Enum
11
11
  from selenium import webdriver
@@ -242,6 +242,28 @@ def save_data(file_path, data):
242
242
  json.dump(data, file, sort_keys=True, indent=4)
243
243
 
244
244
 
245
+ def get_next_day_of_week(day_name):
246
+ days_of_week = [
247
+ "Monday",
248
+ "Tuesday",
249
+ "Wednesday",
250
+ "Thursday",
251
+ "Friday",
252
+ "Saturday",
253
+ "Sunday",
254
+ ]
255
+ today = datetime.now()
256
+ today_idx = today.weekday() # Monday is 0 and Sunday is 6
257
+ target_idx = days_of_week.index(day_name)
258
+
259
+ days_until_target = (target_idx - today_idx) % 7
260
+ if days_until_target == 0:
261
+ days_until_target = 7 # Ensure it's the next instance of the day, not today if today is that day
262
+
263
+ next_day = today + timedelta(days=days_until_target)
264
+ return next_day.strftime(date_format)
265
+
266
+
245
267
  def contains_date(string, fuzzy=False) -> bool:
246
268
  """
247
269
  Return whether the string can be interpreted as a date.
@@ -2,6 +2,7 @@ from datetime import datetime
2
2
 
3
3
  import requests
4
4
  from bs4 import BeautifulSoup
5
+
5
6
  from uk_bin_collection.uk_bin_collection.common import *
6
7
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
7
8
 
@@ -22,7 +23,7 @@ class CouncilClass(AbstractGetBinDataClass):
22
23
 
23
24
  # Start a new session to walk through the form
24
25
  requests.packages.urllib3.disable_warnings()
25
- s = requests.session()
26
+ s = requests.Session()
26
27
 
27
28
  headers = {
28
29
  "Origin": "https://www.centralbedfordshire.gov.uk",
@@ -1,6 +1,14 @@
1
- from dateutil.relativedelta import relativedelta
1
+ from typing import Dict, List, Any, Optional
2
2
  from bs4 import BeautifulSoup
3
- from uk_bin_collection.uk_bin_collection.common import *
3
+ from dateutil.relativedelta import relativedelta
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
4
12
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
5
13
 
6
14
 
@@ -23,7 +31,7 @@ class CouncilClass(AbstractGetBinDataClass):
23
31
  implementation.
24
32
  """
25
33
 
26
- def get_data(self, url) -> str:
34
+ def get_data(self, url: str) -> str:
27
35
  """This method makes the request to the council
28
36
 
29
37
  Keyword arguments:
@@ -44,21 +52,27 @@ class CouncilClass(AbstractGetBinDataClass):
44
52
  full_page = session.get(url)
45
53
  return full_page
46
54
  except requests.exceptions.HTTPError as errh:
47
- _LOGGER.error(f"Http Error: {errh}")
55
+ logging.error(f"Http Error: {errh}")
48
56
  raise
49
57
  except requests.exceptions.ConnectionError as errc:
50
- _LOGGER.error(f"Error Connecting: {errc}")
58
+ logging.error(f"Error Connecting: {errc}")
51
59
  raise
52
60
  except requests.exceptions.Timeout as errt:
53
- _LOGGER.error(f"Timeout Error: {errt}")
61
+ logging.error(f"Timeout Error: {errt}")
54
62
  raise
55
63
  except requests.exceptions.RequestException as err:
56
- _LOGGER.error(f"Oops: Something Else {err}")
64
+ logging.error(f"Oops: Something Else {err}")
57
65
  raise
58
66
 
59
- def parse_data(self, page: str, **kwargs) -> dict:
60
- uprn = kwargs.get("uprn")
61
- 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
+
62
76
  check_uprn(uprn)
63
77
  check_postcode(postcode)
64
78
 
@@ -84,7 +98,7 @@ class CouncilClass(AbstractGetBinDataClass):
84
98
  rows = soup.find("table").find_all("tr")
85
99
 
86
100
  # Form a JSON wrapper
87
- data = {"bins": []}
101
+ data: Dict[str, List[Dict[str, str]]] = {"bins": []}
88
102
 
89
103
  # Loops the Rows
90
104
  for row in rows:
@@ -93,13 +107,13 @@ class CouncilClass(AbstractGetBinDataClass):
93
107
  bin_type = cells[0].get_text(strip=True)
94
108
  collection_next = cells[1].get_text(strip=True)
95
109
 
96
- collection_date = re.findall("\(.*?\)", collection_next)
110
+ collection_date = re.findall(r"\(.*?\)", collection_next)
97
111
 
98
112
  if len(collection_date) != 1:
99
113
  continue
100
114
 
101
115
  collection_date_obj = parse(
102
- re.sub("[()]", "", collection_date[0])
116
+ re.sub(r"[()]", "", collection_date[0])
103
117
  ).date()
104
118
 
105
119
  # since we only have the next collection day, if the parsed date is in the past,
@@ -64,7 +64,7 @@ def get_csrf_token(s: requests.session, base_url: str) -> str:
64
64
  """
65
65
  Gets a CSRF token
66
66
  :rtype: str
67
- :param s: requests.session() to use
67
+ :param s: requests.Session() to use
68
68
  :param base_url: Base URL to use
69
69
  :return: CSRF token
70
70
  """
@@ -95,7 +95,7 @@ def get_address_id(
95
95
  """
96
96
  Gets the address ID
97
97
  :rtype: str
98
- :param s: requests.session() to use
98
+ :param s: requests.Session() to use
99
99
  :param base_url: Base URL to use
100
100
  :param csrf_token: CSRF token to use
101
101
  :param postcode: Postcode to use
@@ -156,7 +156,7 @@ def get_collection_data(
156
156
  """
157
157
  Gets the collection data
158
158
  :rtype: str
159
- :param s: requests.session() to use
159
+ :param s: requests.Session() to use
160
160
  :param base_url: Base URL to use
161
161
  :param csrf_token: CSRF token to use
162
162
  :param address_id: Address id to use
@@ -203,7 +203,7 @@ class CouncilClass(AbstractGetBinDataClass):
203
203
 
204
204
  def parse_data(self, page: str, **kwargs) -> dict:
205
205
  requests.packages.urllib3.disable_warnings()
206
- s = requests.session()
206
+ s = requests.Session()
207
207
  base_url = "https://selfservice.mybfc.bracknell-forest.gov.uk"
208
208
  paon = kwargs.get("paon")
209
209
  postcode = kwargs.get("postcode")
@@ -2,6 +2,7 @@ import ast
2
2
 
3
3
  import requests
4
4
  from bs4 import BeautifulSoup
5
+
5
6
  from uk_bin_collection.uk_bin_collection.common import *
6
7
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
7
8
 
@@ -19,7 +20,7 @@ class CouncilClass(AbstractGetBinDataClass):
19
20
  check_uprn(user_uprn)
20
21
 
21
22
  requests.packages.urllib3.disable_warnings()
22
- s = requests.session()
23
+ s = requests.Session()
23
24
 
24
25
  service_type_headers = {
25
26
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,"
@@ -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,7 @@
1
1
  import time
2
2
 
3
3
  from bs4 import BeautifulSoup
4
+
4
5
  from uk_bin_collection.uk_bin_collection.common import *
5
6
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
7
 
@@ -75,7 +76,7 @@ def get_csrf_token(s: requests.session, base_url: str) -> str:
75
76
  """
76
77
  Gets a CSRF token
77
78
  :rtype: str
78
- :param s: requests.session() to use
79
+ :param s: requests.Session() to use
79
80
  :param base_url: Base URL to use
80
81
  :return: CSRF token
81
82
  """
@@ -106,7 +107,7 @@ def get_address_id(
106
107
  """
107
108
  Gets the address ID
108
109
  :rtype: str
109
- :param s: requests.session() to use
110
+ :param s: requests.Session() to use
110
111
  :param base_url: Base URL to use
111
112
  :param csrf_token: CSRF token to use
112
113
  :param postcode: Postcode to use
@@ -171,7 +172,7 @@ def get_collection_data(
171
172
  """
172
173
  Gets the collection data
173
174
  :rtype: str
174
- :param s: requests.session() to use
175
+ :param s: requests.Session() to use
175
176
  :param base_url: Base URL to use
176
177
  :param csrf_token: CSRF token to use
177
178
  :param address_id: Address id to use
@@ -240,7 +241,7 @@ class CouncilClass(AbstractGetBinDataClass):
240
241
 
241
242
  def parse_data(self, page: str, **kwargs) -> dict:
242
243
  requests.packages.urllib3.disable_warnings()
243
- s = requests.session()
244
+ s = requests.Session()
244
245
  base_url = "https://service.croydon.gov.uk"
245
246
  paon = kwargs.get("paon")
246
247
  postcode = kwargs.get("postcode")
@@ -17,27 +17,25 @@ class CouncilClass(AbstractGetBinDataClass):
17
17
  soup.prettify()
18
18
 
19
19
  # Extract data
20
- bin_data = {
21
- "bins": []
22
- }
20
+ bin_data = {"bins": []}
23
21
 
24
22
  # Find the table containing the bin collection data
25
- table = soup.find('table', {'class': 'eb-EVDNdR1G-tableContent'})
23
+ table = soup.find("table", {"class": "eb-EVDNdR1G-tableContent"})
26
24
 
27
25
  if table:
28
- rows = table.find_all('tr', class_='eb-EVDNdR1G-tableRow')
29
-
26
+ rows = table.find_all("tr", class_="eb-EVDNdR1G-tableRow")
27
+
30
28
  for row in rows:
31
- columns = row.find_all('td')
29
+ columns = row.find_all("td")
32
30
  if len(columns) >= 4:
33
31
  collection_type = columns[1].get_text(strip=True)
34
32
  collection_date = columns[3].get_text(strip=True)
35
-
33
+
36
34
  # Validate collection_date format
37
35
  if re.match(r"\d{2}/\d{2}/\d{4}", collection_date):
38
36
  bin_entry = {
39
37
  "type": collection_type,
40
- "collectionDate": collection_date
38
+ "collectionDate": collection_date,
41
39
  }
42
40
  bin_data["bins"].append(bin_entry)
43
41
 
@@ -1,4 +1,5 @@
1
1
  from bs4 import BeautifulSoup
2
+
2
3
  from uk_bin_collection.uk_bin_collection.common import *
3
4
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
4
5
 
@@ -21,7 +22,7 @@ class CouncilClass(AbstractGetBinDataClass):
21
22
 
22
23
  # Make Request
23
24
  requests.packages.urllib3.disable_warnings()
24
- s = requests.session()
25
+ s = requests.Session()
25
26
  page = s.get(url)
26
27
 
27
28
  # Make a BS4 object
@@ -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 = {
@@ -1,8 +1,10 @@
1
- from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
2
- from uk_bin_collection.uk_bin_collection.common import *
3
- from bs4 import BeautifulSoup
4
1
  from datetime import datetime
2
+
5
3
  import requests
4
+ from bs4 import BeautifulSoup
5
+
6
+ from uk_bin_collection.uk_bin_collection.common import *
7
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
8
 
7
9
 
8
10
  class CouncilClass(AbstractGetBinDataClass):
@@ -19,7 +21,7 @@ class CouncilClass(AbstractGetBinDataClass):
19
21
  # start session
20
22
  # note: this ignores the given url
21
23
  base_url = "https://lcc-wrp.whitespacews.com"
22
- session = requests.session()
24
+ session = requests.Session()
23
25
  response = session.get(base_url + "/#!")
24
26
  links = [
25
27
  a["href"]
@@ -3,6 +3,7 @@ from datetime import date, datetime
3
3
 
4
4
  import requests
5
5
  from bs4 import BeautifulSoup
6
+
6
7
  from uk_bin_collection.uk_bin_collection.common import *
7
8
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
8
9
 
@@ -2,6 +2,7 @@ from datetime import datetime
2
2
 
3
3
  import requests
4
4
  from bs4 import BeautifulSoup
5
+
5
6
  from uk_bin_collection.uk_bin_collection.common import *
6
7
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
7
8
 
@@ -20,7 +21,7 @@ class CouncilClass(AbstractGetBinDataClass):
20
21
 
21
22
  # Start a new session to walk through the form
22
23
  requests.packages.urllib3.disable_warnings()
23
- s = requests.session()
24
+ s = requests.Session()
24
25
 
25
26
  # There's a cookie that makes the whole thing valid when you search for a postcode,
26
27
  # but postcode and UPRN is a hassle imo, so this makes a request for the session to get a cookie