uk_bin_collection 0.97.1__tar.gz → 0.98.1__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 (217) hide show
  1. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/input.json +36 -1
  4. uk_bin_collection-0.98.1/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +72 -0
  5. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +11 -2
  6. uk_bin_collection-0.98.1/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +147 -0
  7. uk_bin_collection-0.98.1/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +60 -0
  8. uk_bin_collection-0.98.1/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +56 -0
  9. uk_bin_collection-0.98.1/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +65 -0
  10. uk_bin_collection-0.98.1/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +64 -0
  11. uk_bin_collection-0.97.1/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -147
  12. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/LICENSE +0 -0
  13. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/README.md +0 -0
  14. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/README.rst +0 -0
  15. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  16. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/features/environment.py +0 -0
  17. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  18. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/output.schema +0 -0
  19. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  20. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  21. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/test_collect_data.py +0 -0
  22. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/test_common_functions.py +0 -0
  23. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/test_conftest.py +0 -0
  24. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/tests/test_get_data.py +0 -0
  25. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  26. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  27. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  28. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  29. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  30. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  31. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  32. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
  33. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  34. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  35. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  36. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  37. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
  38. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
  39. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  40. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  41. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  42. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  43. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  44. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  45. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  46. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  47. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
  48. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  49. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  50. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  51. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  52. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  53. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  54. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  55. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  56. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  57. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  58. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  59. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
  60. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  61. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
  62. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  63. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  64. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
  65. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  66. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  67. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  68. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  69. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  70. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  71. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
  72. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  73. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  74. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  75. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
  76. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  77. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  78. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  79. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
  80. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
  81. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  82. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  83. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  84. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
  85. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  86. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  87. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  88. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  89. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  90. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  91. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
  92. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  93. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  94. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  95. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  96. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  97. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
  98. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  99. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  100. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  101. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
  102. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  103. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  104. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  105. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  106. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  107. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  108. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  109. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
  110. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
  111. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  112. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
  113. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  114. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  115. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  116. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  117. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  118. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  119. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  120. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  121. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  122. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  123. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  124. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  125. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  126. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  127. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  128. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  129. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
  130. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  131. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  132. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  133. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  134. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  135. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  136. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  137. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  138. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  139. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  140. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  141. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  142. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  143. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  144. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  145. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  146. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  147. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  148. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  149. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  150. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  151. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  152. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
  153. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  154. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  155. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  156. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  157. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  158. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  159. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  160. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  161. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  162. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  163. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  164. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
  165. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  166. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  167. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  168. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  169. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  170. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  171. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
  172. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  173. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  174. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  175. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  176. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  177. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  178. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  179. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  180. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  181. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  182. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  183. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  184. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  185. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  186. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  187. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  188. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  189. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  190. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  191. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  192. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  193. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  194. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  195. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  196. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  197. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  198. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  199. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  200. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  201. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  202. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  203. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  204. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  205. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  206. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  207. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  208. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
  209. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  210. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
  211. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
  212. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
  213. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  214. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  215. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  216. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  217. {uk_bin_collection-0.97.1 → uk_bin_collection-0.98.1}/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.97.1
3
+ Version: 0.98.1
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.97.1"
3
+ version = "0.98.1"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -5,6 +5,13 @@
5
5
  "wiki_name": "Adur and Worthing Councils",
6
6
  "wiki_note": "Replace XXXXXXXX with UPRN. You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
7
7
  },
8
+ "ArmaghBanbridgeCraigavonCouncil": {
9
+ "url": "https://www.armaghbanbridgecraigavon.gov.uk/",
10
+ "wiki_command_url_override": "https://www.armaghbanbridgecraigavon.gov.uk/",
11
+ "uprn": "185625284",
12
+ "wiki_name": "Armagh Banbridge Craigavon Council",
13
+ "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
14
+ },
8
15
  "ArunCouncil": {
9
16
  "house_number": "1",
10
17
  "postcode": "BN16 4DA",
@@ -42,7 +49,7 @@
42
49
  "wiki_name": "Barnsley Metropolitan Borough Council",
43
50
  "wiki_note": "To get the UPRN, you will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search)."
44
51
  },
45
- "BasildonCouncil": {
52
+ "BasildonCouncil": {
46
53
  "skip_get_url": true,
47
54
  "uprn": "10013350430",
48
55
  "url": "https://basildonportal.azurewebsites.net/api/getPropertyRefuseInformation",
@@ -606,6 +613,13 @@
606
613
  "web_driver": "http://selenium:4444",
607
614
  "wiki_name": "Leeds City Council"
608
615
  },
616
+ "LichfieldDistrictCouncil": {
617
+ "url": "https://www.lichfielddc.gov.uk",
618
+ "wiki_command_url_override": "https://www.lichfielddc.gov.uk",
619
+ "uprn": "100031694085",
620
+ "wiki_name": "Lichfield District Council",
621
+ "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
622
+ },
609
623
  "LisburnCastlereaghCityCouncil": {
610
624
  "house_number": "97",
611
625
  "postcode": "BT28 1JN",
@@ -1216,6 +1230,13 @@
1216
1230
  "wiki_name": "Wakefield City Council",
1217
1231
  "wiki_note": "Follow the instructions [here](https://www.wakefield.gov.uk/where-i-live/) until you get the page that includes a \"Bin Collections\" section then copy the URL and replace the URL in the command."
1218
1232
  },
1233
+ "WalsallCouncil": {
1234
+ "url": "https://cag.walsall.gov.uk/",
1235
+ "wiki_command_url_override": "https://cag.walsall.gov.uk/",
1236
+ "uprn": "100071080513",
1237
+ "wiki_name": "Walsall Council",
1238
+ "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
1239
+ },
1219
1240
  "WalthamForest": {
1220
1241
  "house_number": "17 Chingford Road, Walthamstow",
1221
1242
  "postcode": "E17 4PW",
@@ -1278,6 +1299,13 @@
1278
1299
  "wiki_name": "West Lothian Council",
1279
1300
  "wiki_note": "Pass the house name/number in the house number parameter, wrapped in double quotes"
1280
1301
  },
1302
+ "WestMorlandAndFurness": {
1303
+ "url": "https://www.westmorlandandfurness.gov.uk/",
1304
+ "wiki_command_url_override": "https://www.westmorlandandfurness.gov.uk/",
1305
+ "uprn": "100110353478",
1306
+ "wiki_name": "West Morland And Furness Council",
1307
+ "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
1308
+ },
1281
1309
  "WestNorthamptonshireCouncil": {
1282
1310
  "postcode": "NN3 2JB",
1283
1311
  "skip_get_url": true,
@@ -1322,6 +1350,13 @@
1322
1350
  "url": "https://forms.rbwm.gov.uk/bincollections?uprn=",
1323
1351
  "wiki_name": "Windsor and Maidenhead Council"
1324
1352
  },
1353
+ "WirralCouncil": {
1354
+ "url": "https://www.wirral.gov.uk",
1355
+ "wiki_command_url_override": "https://www.wirral.gov.uk",
1356
+ "uprn": "Vernon Avenue,Seacombe",
1357
+ "wiki_name": "Wirral Council",
1358
+ "wiki_note": "Please use the UPRN field to enter your street name and suburb separated by a comma, for example 'Vernon Avenue,Seacombe'"
1359
+ },
1325
1360
  "WokingBoroughCouncil": {
1326
1361
  "house_number": "2",
1327
1362
  "postcode": "GU214JY",
@@ -0,0 +1,72 @@
1
+ import requests
2
+ from bs4 import BeautifulSoup
3
+
4
+ from uk_bin_collection.uk_bin_collection.common import *
5
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
+
7
+
8
+ # import the wonderful Beautiful Soup and the URL grabber
9
+ class CouncilClass(AbstractGetBinDataClass):
10
+ """
11
+ Concrete classes have to implement all abstract operations of the
12
+ base class. They can also override some operations with a default
13
+ implementation.
14
+ """
15
+
16
+ def parse_data(self, page: str, **kwargs) -> dict:
17
+
18
+ user_uprn = kwargs.get("uprn")
19
+ check_uprn(user_uprn)
20
+ bindata = {"bins": []}
21
+
22
+ # Function to extract bin collection information
23
+ def extract_bin_schedule(soup, heading_class):
24
+ collections = []
25
+
26
+ # Find the relevant section based on the heading class
27
+ section_heading = soup.find("div", class_=heading_class)
28
+ if section_heading:
29
+ # Find all the bin collection dates in that section
30
+ collection_dates = section_heading.find_next(
31
+ "div", class_="col-sm-12 col-md-9"
32
+ ).find_all("h4")
33
+ for date in collection_dates:
34
+ # Clean and add the date to the list
35
+ collections.append(date.get_text(strip=True))
36
+
37
+ return collections
38
+
39
+ # URL for bin collection schedule
40
+ url = f"https://www.armaghbanbridgecraigavon.gov.uk/resident/binday-result/?address={user_uprn}"
41
+
42
+ # Send a GET request to fetch the page content
43
+ response = requests.get(url)
44
+
45
+ # Check if the request was successful
46
+ if response.status_code == 200:
47
+ # Parse the page content using BeautifulSoup
48
+ soup = BeautifulSoup(response.text, "html.parser")
49
+
50
+ # Extract bin collection schedules by their sections
51
+ domestic_collections = extract_bin_schedule(soup, "heading bg-black")
52
+ for collection in domestic_collections:
53
+ bindata["bins"].append(
54
+ {"collectionDate": collection, "type": "Domestic"}
55
+ )
56
+ recycling_collections = extract_bin_schedule(soup, "heading bg-green")
57
+ for collection in recycling_collections:
58
+ bindata["bins"].append(
59
+ {"collectionDate": collection, "type": "Recycling"}
60
+ )
61
+ garden_collections = extract_bin_schedule(soup, "heading bg-brown")
62
+ for collection in garden_collections:
63
+ bindata["bins"].append({"collectionDate": collection, "type": "Garden"})
64
+
65
+ else:
66
+ print(f"Failed to retrieve data. Status code: {response.status_code}")
67
+
68
+ bindata["bins"].sort(
69
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
70
+ )
71
+
72
+ return bindata
@@ -70,10 +70,19 @@ class CouncilClass(AbstractGetBinDataClass):
70
70
  headless = kwargs.get("headless")
71
71
  web_driver = kwargs.get("web_driver")
72
72
  driver = create_webdriver(web_driver, headless, None, __name__)
73
- page = "https://account.barnet.gov.uk/Forms/Home/Redirector/Index/?id=6a2ac067-3322-46e5-96e4-16c0c214454a&mod=OA&casetype=BAR&formname=BNTCOLDATE"
73
+ page = "https://www.barnet.gov.uk/recycling-and-waste/bin-collections/find-your-bin-collection-day"
74
+
74
75
  driver.get(page)
75
76
 
76
- time.sleep(5)
77
+ # Wait for the element to be clickable
78
+ find_your_collection_button = WebDriverWait(driver, 10).until(
79
+ EC.element_to_be_clickable(
80
+ (By.XPATH, '//a[contains(text(), "Find your household collection day")]')
81
+ )
82
+ )
83
+
84
+ # Click the element
85
+ find_your_collection_button.click()
77
86
 
78
87
  try:
79
88
  accept_cookies = WebDriverWait(driver, timeout=10).until(
@@ -0,0 +1,147 @@
1
+ import time
2
+ from datetime import datetime
3
+
4
+ from bs4 import BeautifulSoup
5
+ from selenium.webdriver.common.by import By
6
+ from selenium.webdriver.common.keys import Keys
7
+ from selenium.webdriver.support import expected_conditions as EC
8
+ from selenium.webdriver.support.ui import Select
9
+ from selenium.webdriver.support.wait import WebDriverWait
10
+
11
+ from uk_bin_collection.uk_bin_collection.common import *
12
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
13
+
14
+ # import the wonderful Beautiful Soup and the URL grabber
15
+
16
+
17
+ class CouncilClass(AbstractGetBinDataClass):
18
+ """
19
+ Concrete classes have to implement all abstract operations of the
20
+ base class. They can also override some operations with a default
21
+ implementation.
22
+ """
23
+
24
+ def parse_data(self, page: str, **kwargs) -> dict:
25
+ driver = None
26
+ try:
27
+ page = "https://waste.bexley.gov.uk/waste"
28
+
29
+ data = {"bins": []}
30
+
31
+ user_uprn = kwargs.get("uprn")
32
+ user_paon = kwargs.get("paon")
33
+ user_postcode = kwargs.get("postcode")
34
+ web_driver = kwargs.get("web_driver")
35
+ headless = kwargs.get("headless")
36
+
37
+ # Create Selenium webdriver
38
+ driver = create_webdriver(web_driver, headless, None, __name__)
39
+ driver.get(page)
40
+
41
+ wait = WebDriverWait(driver, 10)
42
+
43
+ inputElement_postcodesearch = wait.until(
44
+ EC.element_to_be_clickable((By.ID, "pc"))
45
+ )
46
+ inputElement_postcodesearch.send_keys(user_postcode)
47
+
48
+
49
+
50
+ find_address_btn = wait.until(
51
+ EC.element_to_be_clickable((By.XPATH, '//*[@id="sub"]'))
52
+ )
53
+ find_address_btn.click()
54
+
55
+ dropdown_options = wait.until(
56
+ EC.presence_of_element_located(
57
+ (By.XPATH, '//*[@id="address"]')
58
+ )
59
+ )
60
+ time.sleep(2)
61
+ dropdown_options.click()
62
+ time.sleep(1)
63
+
64
+ # Wait for the element to be clickable
65
+ address = WebDriverWait(driver, 10).until(
66
+ EC.element_to_be_clickable(
67
+ (By.XPATH, f'//li[contains(text(), "{user_paon}")]')
68
+ )
69
+ )
70
+
71
+ # Click the element
72
+ address.click()
73
+
74
+
75
+ submit_address = wait.until(
76
+ EC.presence_of_element_located(
77
+ (By.XPATH, '//*[@id="go"]')
78
+ )
79
+ )
80
+ time.sleep(2)
81
+ submit_address.click()
82
+
83
+ results_found = wait.until(
84
+ EC.element_to_be_clickable(
85
+ (By.XPATH, '//h1[contains(text(), "Your bin days")]')
86
+ )
87
+ )
88
+
89
+ final_page = wait.until(
90
+ EC.presence_of_element_located(
91
+ (By.CLASS_NAME, "waste__collections")
92
+ )
93
+ )
94
+
95
+ soup = BeautifulSoup(driver.page_source, features="html.parser")
96
+
97
+ # Find all waste services
98
+
99
+ # Initialize the data dictionary
100
+ data = {"bins": []}
101
+ bin_sections = soup.find_all("h3", class_="waste-service-name")
102
+
103
+ # Loop through each bin field
104
+ for bin_section in bin_sections:
105
+ # Extract the bin type (e.g., "Brown Caddy", "Green Wheelie Bin", etc.)
106
+ bin_type = bin_section.get_text(strip=True).split("\n")[0] # The first part is the bin type
107
+
108
+ # Find the next sibling <dl> tag that contains the next collection information
109
+ summary_list = bin_section.find_next("dl", class_="govuk-summary-list")
110
+
111
+ if summary_list:
112
+ # Now, instead of finding by class, we'll search by text within the dt element
113
+ next_collection_dt = summary_list.find("dt", string=lambda text: "Next collection" in text)
114
+
115
+ if next_collection_dt:
116
+ # Find the sibling <dd> tag for the collection date
117
+ next_collection = next_collection_dt.find_next_sibling("dd").get_text(strip=True)
118
+
119
+ if next_collection:
120
+ try:
121
+ # Parse the next collection date (assuming the format is like "Tuesday 15 October 2024")
122
+ parsed_date = datetime.strptime(next_collection, "%A %d %B %Y")
123
+
124
+ # Add the bin information to the data dictionary
125
+ data["bins"].append({
126
+ "type": bin_type,
127
+ "collectionDate": parsed_date.strftime(date_format),
128
+ })
129
+ except ValueError as e:
130
+ print(f"Error parsing date for {bin_type}: {e}")
131
+ else:
132
+ print(f"No next collection date found for {bin_type}")
133
+ else:
134
+ print(f"No 'Next collection' text found for {bin_type}")
135
+ else:
136
+ print(f"No summary list found for {bin_type}")
137
+
138
+ except Exception as e:
139
+ # Here you can log the exception if needed
140
+ print(f"An error occurred: {e}")
141
+ # Optionally, re-raise the exception if you want it to propagate
142
+ raise
143
+ finally:
144
+ # This block ensures that the driver is closed regardless of an exception
145
+ if driver:
146
+ driver.quit()
147
+ return data
@@ -0,0 +1,60 @@
1
+ import re
2
+
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
8
+
9
+
10
+ # import the wonderful Beautiful Soup and the URL grabber
11
+ class CouncilClass(AbstractGetBinDataClass):
12
+ """
13
+ Concrete classes have to implement all abstract operations of the
14
+ base class. They can also override some operations with a default
15
+ implementation.
16
+ """
17
+
18
+ def parse_data(self, page: str, **kwargs) -> dict:
19
+
20
+ user_uprn = kwargs.get("uprn")
21
+ check_uprn(user_uprn)
22
+ bindata = {"bins": []}
23
+
24
+ def solve(s):
25
+ return re.sub(r"(\d)(st|nd|rd|th)", r"\1", s)
26
+
27
+ URI = f"https://www.lichfielddc.gov.uk/homepage/6/bin-collection-dates?uprn={user_uprn}"
28
+
29
+ # Make the GET request
30
+ response = requests.get(URI)
31
+
32
+ soup = BeautifulSoup(response.text, "html.parser")
33
+
34
+ bins = soup.find_all("h3", class_="bin-collection-tasks__heading")
35
+ dates = soup.find_all("p", class_="bin-collection-tasks__date")
36
+
37
+ current_year = datetime.now().year
38
+ current_month = datetime.now().month
39
+
40
+ for i in range(len(dates)):
41
+ bint = " ".join(bins[i].text.split()[2:4])
42
+ date = dates[i].text
43
+
44
+ date = datetime.strptime(
45
+ solve(date),
46
+ "%d %B",
47
+ )
48
+
49
+ if (current_month > 10) and (date.month < 3):
50
+ date = date.replace(year=(current_year + 1))
51
+ else:
52
+ date = date.replace(year=current_year)
53
+
54
+ dict_data = {
55
+ "type": bint,
56
+ "collectionDate": date.strftime("%d/%m/%Y"),
57
+ }
58
+ bindata["bins"].append(dict_data)
59
+
60
+ return bindata
@@ -0,0 +1,56 @@
1
+ import requests
2
+ from bs4 import BeautifulSoup
3
+
4
+ from uk_bin_collection.uk_bin_collection.common import *
5
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
+
7
+
8
+ # import the wonderful Beautiful Soup and the URL grabber
9
+ class CouncilClass(AbstractGetBinDataClass):
10
+ """
11
+ Concrete classes have to implement all abstract operations of the
12
+ base class. They can also override some operations with a default
13
+ implementation.
14
+ """
15
+
16
+ def parse_data(self, page: str, **kwargs) -> dict:
17
+
18
+ user_uprn = kwargs.get("uprn")
19
+ check_uprn(user_uprn)
20
+ bindata = {"bins": []}
21
+
22
+ URI = f"https://cag.walsall.gov.uk/BinCollections/GetBins?uprn={user_uprn}"
23
+
24
+ headers = {
25
+ "user-agent": "Mozilla/5.0",
26
+ }
27
+
28
+ response = requests.get(URI, headers=headers)
29
+
30
+ soup = BeautifulSoup(response.text, "html.parser")
31
+ # Extract links to collection shedule pages and iterate through the pages
32
+ schedule_links = soup.findAll("a", {"class": "nav-link"}, href=True)
33
+ for item in schedule_links:
34
+ if "roundname" in item["href"]:
35
+ # get bin colour
36
+ bincolour = item["href"].split("=")[-1].split("%")[0].upper()
37
+ binURL = "https://cag.walsall.gov.uk" + item["href"]
38
+ r = requests.get(binURL, headers=headers)
39
+ soup = BeautifulSoup(r.text, "html.parser")
40
+ table = soup.findAll("tr")
41
+ for tr in table:
42
+ td = tr.findAll("td")
43
+ if td:
44
+ dict_data = {
45
+ "type": bincolour,
46
+ "collectionDate": datetime.strptime(
47
+ td[1].text.strip(), "%d/%m/%Y"
48
+ ).strftime("%d/%m/%Y"),
49
+ }
50
+ bindata["bins"].append(dict_data)
51
+
52
+ bindata["bins"].sort(
53
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
54
+ )
55
+
56
+ return bindata
@@ -0,0 +1,65 @@
1
+ import requests
2
+ from bs4 import BeautifulSoup
3
+
4
+ from uk_bin_collection.uk_bin_collection.common import *
5
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
+
7
+
8
+ # import the wonderful Beautiful Soup and the URL grabber
9
+ class CouncilClass(AbstractGetBinDataClass):
10
+ """
11
+ Concrete classes have to implement all abstract operations of the
12
+ base class. They can also override some operations with a default
13
+ implementation.
14
+ """
15
+
16
+ def parse_data(self, page: str, **kwargs) -> dict:
17
+
18
+ user_uprn = kwargs.get("uprn")
19
+ check_uprn(user_uprn)
20
+ bindata = {"bins": []}
21
+
22
+ URI = f"https://www.westmorlandandfurness.gov.uk/bins-recycling-and-street-cleaning/waste-collection-schedule/view/{user_uprn}"
23
+
24
+ headers = {
25
+ "user-agent": "Mozilla/5.0",
26
+ }
27
+
28
+ current_year = datetime.now().year
29
+ current_month = datetime.now().month
30
+
31
+ response = requests.get(URI)
32
+
33
+ soup = BeautifulSoup(response.text, "html.parser")
34
+ # Extract links to collection shedule pages and iterate through the pages
35
+ schedule = soup.findAll("div", {"class": "waste-collection__month"})
36
+ for month in schedule:
37
+ collectionmonth = datetime.strptime(month.find("h3").text, "%B")
38
+ collectionmonth = collectionmonth.month
39
+ collectiondays = month.findAll("li", {"class": "waste-collection__day"})
40
+ for collectionday in collectiondays:
41
+ day = collectionday.find(
42
+ "span", {"class": "waste-collection__day--day"}
43
+ ).text.strip()
44
+ collectiondate = datetime.strptime(day, "%d")
45
+ collectiondate = collectiondate.replace(month=collectionmonth)
46
+ bintype = collectionday.find(
47
+ "span", {"class": "waste-collection__day--colour"}
48
+ ).text
49
+
50
+ if (current_month > 9) and (collectiondate.month < 4):
51
+ collectiondate = collectiondate.replace(year=(current_year + 1))
52
+ else:
53
+ collectiondate = collectiondate.replace(year=current_year)
54
+
55
+ dict_data = {
56
+ "type": bintype,
57
+ "collectionDate": collectiondate.strftime("%d/%m/%Y"),
58
+ }
59
+ bindata["bins"].append(dict_data)
60
+
61
+ bindata["bins"].sort(
62
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
63
+ )
64
+
65
+ return bindata
@@ -0,0 +1,64 @@
1
+ import requests
2
+ from bs4 import BeautifulSoup
3
+
4
+ from uk_bin_collection.uk_bin_collection.common import *
5
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
+
7
+
8
+ # import the wonderful Beautiful Soup and the URL grabber
9
+ class CouncilClass(AbstractGetBinDataClass):
10
+ """
11
+ Concrete classes have to implement all abstract operations of the
12
+ base class. They can also override some operations with a default
13
+ implementation.
14
+ """
15
+
16
+ def parse_data(self, page: str, **kwargs) -> dict:
17
+
18
+ user_uprn = kwargs.get("uprn")
19
+ bindata = {"bins": []}
20
+
21
+ street = user_uprn.split(",")[0]
22
+ suburb = user_uprn.split(",")[1]
23
+
24
+ if not street:
25
+ print("Street name could not be parsed"),
26
+ return
27
+ if not suburb:
28
+ print("Street name could not be parsed"),
29
+ return
30
+
31
+ wastes = {
32
+ "Non recycleable (green bin)",
33
+ "Garden waste (brown bin)",
34
+ "Paper and packaging (grey bin)",
35
+ }
36
+ DATE_REGEX = "^([0-9]{1,2} [A-Za-z]+ [0-9]{4})"
37
+
38
+ s = requests.Session()
39
+ # Loop through waste types
40
+ for waste in wastes:
41
+ r = s.get(
42
+ f"https://ww3.wirral.gov.uk//recycling/detailContentDru7.asp?s={street}&t={suburb}&c={waste}"
43
+ )
44
+ # extract dates
45
+ soup = BeautifulSoup(r.text, "html.parser")
46
+ dates = soup.findAll("li")
47
+ if len(dates) != 0:
48
+ for item in dates:
49
+ match = re.match(DATE_REGEX, item.text)
50
+ if match:
51
+ dict_data = {
52
+ "type": waste,
53
+ "collectionDate": datetime.strptime(
54
+ match.group(1),
55
+ "%d %B %Y",
56
+ ).strftime("%d/%m/%Y"),
57
+ }
58
+ bindata["bins"].append(dict_data)
59
+
60
+ bindata["bins"].sort(
61
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
62
+ )
63
+
64
+ return bindata