uk_bin_collection 0.79.1__tar.gz → 0.80.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 (186) hide show
  1. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/input.json +39 -1
  4. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/common.py +23 -1
  5. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +2 -1
  6. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +2 -1
  7. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +4 -4
  8. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +2 -1
  9. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +5 -4
  10. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +7 -9
  11. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +2 -1
  12. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +6 -4
  13. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +1 -0
  14. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +2 -1
  15. uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +146 -0
  16. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +1 -0
  17. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +2 -1
  18. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +1 -0
  19. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +1 -0
  20. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +2 -1
  21. uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +69 -0
  22. uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +70 -0
  23. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +1 -0
  24. uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +140 -0
  25. uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +117 -0
  26. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +2 -1
  27. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +2 -1
  28. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +2 -1
  29. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +3 -1
  30. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/LICENSE +0 -0
  31. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/README.md +0 -0
  32. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/README.rst +0 -0
  33. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  34. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/features/environment.py +0 -0
  35. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  36. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/output.schema +0 -0
  37. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  38. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  39. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/test_collect_data.py +0 -0
  40. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/tests/test_common_functions.py +0 -0
  41. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  42. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  43. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  44. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  45. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  46. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  47. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  48. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  49. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  50. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  51. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  52. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  53. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  54. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  55. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  56. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  57. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  58. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
  59. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  60. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  61. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  62. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  63. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  64. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  65. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  66. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  67. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  68. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  69. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  70. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  71. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  72. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  73. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  74. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  75. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  76. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  77. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  78. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  79. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  80. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  81. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  82. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  83. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  84. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  85. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  86. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  87. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  88. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  89. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  90. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  91. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  92. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  93. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  94. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  95. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  96. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  97. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  98. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  99. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  100. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  101. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  102. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  103. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  104. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  105. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  106. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  107. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  108. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  109. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  110. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  111. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  112. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  113. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  114. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  115. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  116. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  117. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  118. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  119. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  120. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  121. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  122. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  123. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  124. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  125. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  126. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  127. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  128. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  129. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  130. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  131. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  132. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  133. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  134. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  135. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  136. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  137. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  138. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  139. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  140. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  141. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  142. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  143. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  144. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  145. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  146. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  147. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  148. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  149. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  150. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  151. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  152. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  153. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  154. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  155. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  156. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  157. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  158. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  159. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  160. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  161. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  162. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  163. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  164. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  165. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  166. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  167. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  168. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  169. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  170. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  171. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  172. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  173. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  174. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  175. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  176. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  177. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  178. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  179. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  180. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  181. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  182. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  183. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  184. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  185. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.0}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  186. {uk_bin_collection-0.79.1 → uk_bin_collection-0.80.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.80.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.80.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
+ "url": "https://bins.uttlesford.gov.uk/",
1045
+ "wiki_name": "UttlesfordDistrictCouncil",
1046
+ "skip_get_url": true,
1047
+ "postcode": "CM23 5QF",
1048
+ "uprn": "100090643434",
1049
+ "house_number": "72, Birchanger Lane",
1050
+ "web_driver": "http://selenium:4444"
1051
+ },
1014
1052
  "ValeofGlamorganCouncil": {
1015
1053
  "skip_get_url": true,
1016
1054
  "uprn": "64029020",
@@ -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,5 +1,6 @@
1
- from dateutil.relativedelta import relativedelta
2
1
  from bs4 import BeautifulSoup
2
+ from dateutil.relativedelta import relativedelta
3
+
3
4
  from uk_bin_collection.uk_bin_collection.common import *
4
5
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
5
6
 
@@ -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,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,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
@@ -0,0 +1,146 @@
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://forms.newforest.gov.uk/ufs/FIND_MY_COLLECTION.eb"
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
+ driver.refresh() # important otherwise it results in too many redirects
50
+
51
+ wait = WebDriverWait(driver, 60)
52
+
53
+ logging.info("Entering postcode")
54
+ input_element_postcode = wait.until(
55
+ EC.presence_of_element_located((By.XPATH, '//input[@id="CTID-1-_-A"]'))
56
+ )
57
+
58
+ input_element_postcode.send_keys(user_postcode)
59
+
60
+ logging.info("Searching for postcode")
61
+ input_element_postcode_btn = wait.until(
62
+ EC.element_to_be_clickable((By.XPATH, '//input[@type="submit"]'))
63
+ )
64
+
65
+ input_element_postcode_btn.click()
66
+
67
+ logging.info("Waiting for address dropdown")
68
+ input_element_postcode_dropdown = wait.until(
69
+ EC.presence_of_element_located((By.XPATH, '//select[@id="CTID-6-_-A"]'))
70
+ )
71
+
72
+ logging.info("Selecting address")
73
+ drop_down_values = Select(input_element_postcode_dropdown)
74
+ option_element = wait.until(
75
+ EC.presence_of_element_located(
76
+ (By.CSS_SELECTOR, f'option[value="{str(user_uprn)}"]')
77
+ )
78
+ )
79
+
80
+ driver.execute_script("arguments[0].scrollIntoView();", option_element)
81
+ drop_down_values.select_by_value(str(user_uprn))
82
+
83
+ input_element_address_btn = wait.until(
84
+ EC.element_to_be_clickable((By.XPATH, '//input[@value="Submit"]'))
85
+ )
86
+
87
+ input_element_address_btn.click()
88
+
89
+ logging.info("Waiting for bin collection page")
90
+ h4_element = wait.until(
91
+ EC.presence_of_element_located(
92
+ (By.XPATH, "//h1[contains(text(), 'Collections days for')]")
93
+ )
94
+ )
95
+
96
+ logging.info("Extracting bin collection data")
97
+ soup = BeautifulSoup(driver.page_source, features="html.parser")
98
+ bins = []
99
+
100
+ # Rubbish and recycling
101
+ rubbish_recycling = soup.find(
102
+ "span", class_="CTID-77-_ eb-77-Override-textControl"
103
+ )
104
+ if rubbish_recycling:
105
+ match = re.search(r"collected weekly on (\w+)", rubbish_recycling.text)
106
+ if match:
107
+ day_name = match.group(1)
108
+ next_collection = get_next_day_of_week(day_name)
109
+ bins.append(
110
+ {
111
+ "type": "Rubbish and recycling",
112
+ "collectionDate": next_collection,
113
+ }
114
+ )
115
+
116
+ # Glass collection
117
+ glass_collection = soup.find("span", class_="CTID-78-_ eb-78-textControl")
118
+ if glass_collection:
119
+ match = re.search(
120
+ r"next collection is\s+(\d{2}/\d{2}/\d{4})", glass_collection.text
121
+ )
122
+ if match:
123
+ bins.append(
124
+ {"type": "Glass collection", "collectionDate": match.group(1)}
125
+ )
126
+
127
+ # Garden waste
128
+ garden_waste = soup.find("span", class_="CTID-17-_ eb-17-textControl")
129
+ if garden_waste:
130
+ match = re.search(
131
+ r"next collection is\s+(\d{2}/\d{2}/\d{4})", garden_waste.text
132
+ )
133
+ if match:
134
+ bins.append(
135
+ {"type": "Garden waste", "collectionDate": match.group(1)}
136
+ )
137
+
138
+ return {"bins": bins}
139
+
140
+ except Exception as e:
141
+ logging.error(f"An error occurred: {e}")
142
+ raise
143
+
144
+ finally:
145
+ if driver:
146
+ driver.quit()
@@ -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
 
@@ -3,6 +3,7 @@ from datetime import *
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
 
@@ -24,7 +25,7 @@ class CouncilClass(AbstractGetBinDataClass):
24
25
  check_postcode(user_postcode)
25
26
 
26
27
  # Get form data
27
- s = requests.session()
28
+ s = requests.Session()
28
29
  cookies = {
29
30
  "ntc-cookie-policy": "1",
30
31
  "SSESS6ec6d5d2d471c0357053d5993a839bce": "qBdR7XhmSMd5_PDBIqG0It2R0Fq67igrejRY-WOcskE",
@@ -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
 
@@ -1,5 +1,6 @@
1
1
  import requests
2
2
  from bs4 import BeautifulSoup
3
+
3
4
  from uk_bin_collection.uk_bin_collection.common import *
4
5
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
5
6
 
@@ -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
@@ -0,0 +1,69 @@
1
+ from bs4 import BeautifulSoup
2
+ from uk_bin_collection.uk_bin_collection.common import *
3
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
4
+
5
+
6
+ # import the wonderful Beautiful Soup and the URL grabber
7
+ class CouncilClass(AbstractGetBinDataClass):
8
+ """
9
+ Concrete classes have to implement all abstract operations of the
10
+ base class. They can also override some operations with a default
11
+ implementation.
12
+ """
13
+
14
+ def parse_date(self, date_str):
15
+ months = {
16
+ "Jan": "01",
17
+ "Feb": "02",
18
+ "Mar": "03",
19
+ "Apr": "04",
20
+ "May": "05",
21
+ "Jun": "06",
22
+ "Jul": "07",
23
+ "Aug": "08",
24
+ "Sep": "09",
25
+ "Oct": "10",
26
+ "Nov": "11",
27
+ "Dec": "12",
28
+ }
29
+ day, date, month_abbr, year = date_str.split()
30
+ month = months[month_abbr]
31
+ return f"{date}/{month}/{year}"
32
+
33
+ def parse_data(self, page: str, **kwargs) -> dict:
34
+ # Make a BS4 object
35
+ soup = BeautifulSoup(page.text, features="html.parser")
36
+ soup.prettify()
37
+
38
+ # Initialize the bin data structure
39
+ bin_data = {"bins": []}
40
+
41
+ # Find the table with collection dates
42
+ table = soup.find("table", class_="my-area")
43
+
44
+ # Extract the rows containing the bin collection information
45
+ rows = table.find_all("tr")
46
+
47
+ # Loop through the rows and extract bin data
48
+ for row in rows:
49
+ cells = row.find_all("td")
50
+ if len(cells) == 2:
51
+ bin_type = cells[0].get_text(strip=True)
52
+ collection_date = cells[1].get_text(strip=True)
53
+
54
+ if "Next refuse" in bin_type:
55
+ bin_data["bins"].append(
56
+ {
57
+ "type": "refuse",
58
+ "collectionDate": self.parse_date(collection_date),
59
+ }
60
+ )
61
+ elif "Next recycling" in bin_type:
62
+ bin_data["bins"].append(
63
+ {
64
+ "type": "recycling",
65
+ "collectionDate": self.parse_date(collection_date),
66
+ }
67
+ )
68
+
69
+ return bin_data