uk_bin_collection 0.98.0__tar.gz → 0.98.2__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 (218) hide show
  1. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/PKG-INFO +1 -1
  2. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/pyproject.toml +1 -1
  3. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/input.json +1 -1
  4. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +11 -2
  5. uk_bin_collection-0.98.2/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +147 -0
  6. uk_bin_collection-0.98.2/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +118 -0
  7. uk_bin_collection-0.98.0/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -147
  8. uk_bin_collection-0.98.0/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -101
  9. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/LICENSE +0 -0
  10. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/README.md +0 -0
  11. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/README.rst +0 -0
  12. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  13. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/features/environment.py +0 -0
  14. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  15. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/output.schema +0 -0
  16. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  17. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
  18. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_collect_data.py +0 -0
  19. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_common_functions.py +0 -0
  20. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_conftest.py +0 -0
  21. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_get_data.py +0 -0
  22. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
  23. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/common.py +0 -0
  24. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  25. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
  26. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  27. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  28. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  29. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  30. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
  31. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  32. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  33. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  34. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  35. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
  36. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
  37. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  38. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  39. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  40. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  41. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  42. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  43. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
  44. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  45. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
  46. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  47. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  48. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  49. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  50. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  51. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  52. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  53. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  54. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  55. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  56. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  57. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
  58. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  59. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
  60. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  61. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  62. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
  63. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  64. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  65. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  66. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  67. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  68. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  69. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
  70. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  71. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  72. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  73. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
  74. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  75. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  76. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  77. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
  78. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
  79. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  80. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  81. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  82. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
  83. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  84. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  85. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  86. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  87. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  88. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  89. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
  90. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  91. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  92. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
  93. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  94. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  95. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
  96. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  97. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  98. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  99. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
  100. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  101. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  102. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  103. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  104. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  105. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
  106. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  107. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  108. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
  109. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
  110. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  111. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
  112. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  113. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  114. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  115. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  116. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  117. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  118. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  119. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
  120. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  121. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  122. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  123. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  124. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  125. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  126. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  127. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
  128. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  129. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  130. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  131. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  132. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  133. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  134. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  135. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  136. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  137. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  138. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  139. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  140. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  141. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  142. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  143. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  144. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  145. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  146. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  147. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  148. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  149. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  150. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
  151. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  152. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  153. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  154. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  155. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  156. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  157. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  158. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  159. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  160. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  161. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  162. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
  163. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  164. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  165. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  166. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  167. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  168. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  169. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
  170. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  171. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  172. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  173. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  174. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  175. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  176. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  177. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  178. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  179. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  180. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  181. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  182. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  183. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  184. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  185. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  186. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
  187. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  188. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  189. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  190. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  191. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  192. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  193. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  194. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
  195. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  196. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  197. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  198. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  199. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  200. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  201. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  202. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  203. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
  204. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  205. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  206. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  207. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  208. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
  209. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  210. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
  211. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
  212. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
  213. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
  214. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  215. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  216. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  217. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
  218. {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/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.98.0
3
+ Version: 0.98.2
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.98.0"
3
+ version = "0.98.2"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -49,7 +49,7 @@
49
49
  "wiki_name": "Barnsley Metropolitan Borough Council",
50
50
  "wiki_note": "To get the UPRN, you will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search)."
51
51
  },
52
- "BasildonCouncil": {
52
+ "BasildonCouncil": {
53
53
  "skip_get_url": true,
54
54
  "uprn": "10013350430",
55
55
  "url": "https://basildonportal.azurewebsites.net/api/getPropertyRefuseInformation",
@@ -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,118 @@
1
+ import re
2
+ from datetime import datetime
3
+
4
+ import requests
5
+ from bs4 import BeautifulSoup
6
+
7
+ from uk_bin_collection.uk_bin_collection.common import *
8
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
9
+
10
+ class CouncilClass(AbstractGetBinDataClass):
11
+ def parse_data(self, page: str, **kwargs) -> dict:
12
+
13
+ user_postcode = kwargs.get("postcode")
14
+ check_postcode(user_postcode)
15
+
16
+ # Fetch the page content
17
+ root_url = "https://myproperty.molevalley.gov.uk/molevalley/api/live_addresses/{}?format=json".format(user_postcode)
18
+ response = requests.get(root_url, verify=False)
19
+
20
+ if not response.ok:
21
+ raise ValueError("Invalid server response code retrieving data.")
22
+
23
+ jsonData = response.json()
24
+
25
+ if len(jsonData["results"]["features"]) == 0:
26
+ raise ValueError("No collection data found for postcode provided.")
27
+
28
+ properties_found = jsonData["results"]["features"]
29
+
30
+ html_data = None
31
+ uprn = kwargs.get("uprn")
32
+ if uprn:
33
+ check_uprn(uprn)
34
+ for item in properties_found:
35
+ if uprn == str(int(item["properties"]["blpu_uprn"])):
36
+ html_data = item["properties"]["three_column_layout_html"]
37
+ break
38
+ if html_data is None:
39
+ raise ValueError("No collection data found for UPRN provided.")
40
+ else:
41
+ html_data = properties_found[0]["properties"]["three_column_layout_html"]
42
+
43
+ # Conditionally replace the commented-out sections (<!-- ... -->)
44
+ if "<!--" in html_data and "-->" in html_data:
45
+ print("Commented-out section found, replacing comments...")
46
+ html_data = html_data.replace("<!--", "").replace("-->", "")
47
+ else:
48
+ print("No commented-out section found, processing as is.")
49
+
50
+ # Process the updated HTML data with BeautifulSoup
51
+ soup = BeautifulSoup(html_data, "html.parser")
52
+
53
+ data = {"bins": []}
54
+ all_collection_dates = []
55
+ regex_date = re.compile(r"(\d{2}/\d{2}/\d{4})") # Adjusted date regex
56
+ regex_additional_collection = re.compile(r"We also collect (.*) on (.*) -")
57
+
58
+ # Debugging to verify the HTML content is parsed correctly
59
+ print("HTML content parsed successfully.")
60
+
61
+ # Search for the 'Bins and Recycling' panel
62
+ bins_panel = soup.find("h2", string="Bins and Recycling")
63
+ if bins_panel:
64
+ panel = bins_panel.find_parent("div", class_="panel")
65
+ print("Found 'Bins and Recycling' panel.")
66
+
67
+ # Extract bin collection info from the un-commented HTML
68
+ for strong_tag in panel.find_all("strong"):
69
+ bin_type = strong_tag.text.strip()
70
+ collection_string = strong_tag.find_next("p").text.strip()
71
+
72
+ # Debugging output
73
+ print(f"Processing bin type: {bin_type}")
74
+ print(f"Collection string: {collection_string}")
75
+
76
+ match = regex_date.search(collection_string)
77
+ if match:
78
+ collection_date = datetime.strptime(match.group(1), "%d/%m/%Y").date()
79
+ data["bins"].append({
80
+ "type": bin_type,
81
+ "collectionDate": collection_date.strftime("%d/%m/%Y"),
82
+ })
83
+ all_collection_dates.append(collection_date)
84
+ else:
85
+ # Add a debug line to show which collections are missing dates
86
+ print(f"No valid date found for bin type: {bin_type}")
87
+
88
+ # Search for additional collections like electrical and textiles
89
+ for p in panel.find_all("p"):
90
+ additional_match = regex_additional_collection.match(p.text.strip())
91
+
92
+ # Debugging output for additional collections
93
+ if additional_match:
94
+ bin_type = additional_match.group(1)
95
+ print(f"Found additional collection: {bin_type}")
96
+ if "each collection day" in additional_match.group(2):
97
+ if all_collection_dates:
98
+ collection_date = min(all_collection_dates)
99
+ data["bins"].append({
100
+ "type": bin_type,
101
+ "collectionDate": collection_date.strftime("%d/%m/%Y"),
102
+ })
103
+ else:
104
+ print("No collection dates available for additional collection.")
105
+ raise ValueError("No valid bin collection dates found.")
106
+ else:
107
+ print(f"No additional collection found in paragraph: {p.text.strip()}")
108
+ else:
109
+ raise ValueError("Unable to find 'Bins and Recycling' panel in the HTML data.")
110
+
111
+ # Debugging to check collected data
112
+ print(f"Collected bin data: {data}")
113
+
114
+ # Handle the case where no collection dates were found
115
+ if not all_collection_dates:
116
+ raise ValueError("No valid collection dates were found in the data.")
117
+
118
+ return data
@@ -1,147 +0,0 @@
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://mybexley.bexley.gov.uk/service/When_is_my_collection_day"
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
- # If you bang in the house number (or property name) and postcode in the box it should find your property
42
-
43
- iframe_presense = WebDriverWait(driver, 30).until(
44
- EC.presence_of_element_located((By.ID, "fillform-frame-1"))
45
- )
46
-
47
- driver.switch_to.frame(iframe_presense)
48
- wait = WebDriverWait(driver, 60)
49
- start_btn = wait.until(
50
- EC.element_to_be_clickable(
51
- (By.XPATH, "//button/span[contains(text(), 'Next')]")
52
- )
53
- )
54
-
55
- start_btn.click()
56
-
57
- inputElement_postcodesearch = wait.until(
58
- EC.element_to_be_clickable((By.ID, "postcode_search"))
59
- )
60
- inputElement_postcodesearch.send_keys(user_postcode)
61
-
62
- find_address_btn = wait.until(
63
- EC.element_to_be_clickable((By.XPATH, '//*[@id="search"]'))
64
- )
65
- find_address_btn.click()
66
-
67
- dropdown_options = wait.until(
68
- EC.presence_of_element_located(
69
- (By.XPATH, '//*[@id="select2-chosen-1"]')
70
- )
71
- )
72
- time.sleep(2)
73
- dropdown_options.click()
74
- time.sleep(1)
75
- dropdown_input = wait.until(
76
- EC.presence_of_element_located(
77
- (By.XPATH, '//*[@id="s2id_autogen1_search"]')
78
- )
79
- )
80
- time.sleep(1)
81
- dropdown_input.send_keys(user_paon)
82
- dropdown_input.send_keys(Keys.ENTER)
83
-
84
- results_found = wait.until(
85
- EC.presence_of_element_located((By.CLASS_NAME, "found-content"))
86
- )
87
- finish_btn = wait.until(
88
- EC.element_to_be_clickable(
89
- (By.XPATH, "//button/span[contains(text(), 'Next')]")
90
- )
91
- )
92
- finish_btn.click()
93
- final_page = wait.until(
94
- EC.presence_of_element_located(
95
- (By.CLASS_NAME, "waste-header-container")
96
- )
97
- )
98
-
99
- soup = BeautifulSoup(driver.page_source, features="html.parser")
100
-
101
- bin_fields = soup.find_all("div", class_="waste-panel-container")
102
- # Define your XPath
103
-
104
- for bin in bin_fields:
105
- # Extract h3 text from the current element
106
- h3_text = (
107
- bin.find("h3", class_="container-name").get_text(strip=True)
108
- if bin.find("h3", class_="container-name")
109
- else None
110
- )
111
-
112
- date_text = (
113
- bin.find("p", class_="container-status").get_text(strip=True)
114
- if bin.find("p", class_="container-status")
115
- else None
116
- )
117
-
118
- if h3_text and date_text:
119
- # Parse the date using the appropriate format
120
- parsed_date = datetime.strptime(date_text, "%A %d %B")
121
-
122
- # Assuming the current year is used for the collection date
123
- current_year = datetime.now().year
124
-
125
- # If the parsed date is in the past, assume it's for the next year
126
- if parsed_date < datetime.now():
127
- current_year += 1
128
-
129
- data["bins"].append(
130
- {
131
- "type": h3_text,
132
- "collectionDate": parsed_date.replace(
133
- year=current_year
134
- ).strftime("%d/%m/%Y"),
135
- }
136
- )
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
@@ -1,101 +0,0 @@
1
- import re
2
- from datetime import datetime
3
-
4
- import requests
5
- from bs4 import BeautifulSoup
6
-
7
- from uk_bin_collection.uk_bin_collection.common import *
8
- from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
9
-
10
-
11
- # import the wonderful Beautiful Soup and the URL grabber
12
- class CouncilClass(AbstractGetBinDataClass):
13
- """
14
- Concrete classes have to implement all abstract operations of the
15
- base class. They can also override some operations with a default
16
- implementation.
17
- """
18
-
19
- def parse_data(self, page: str, **kwargs) -> dict:
20
-
21
- user_postcode = kwargs.get("postcode")
22
- check_postcode(user_postcode)
23
-
24
- root_url = "https://myproperty.molevalley.gov.uk/molevalley/api/live_addresses/{}?format=json".format(
25
- user_postcode
26
- )
27
- requests.packages.urllib3.disable_warnings()
28
- response = requests.get(root_url, verify=False)
29
-
30
- if not response.ok:
31
- raise ValueError("Invalid server response code retreiving data.")
32
-
33
- jsonData = response.json()
34
-
35
- if len(jsonData["results"]["features"]) == 0:
36
- raise ValueError("No collection data found for postcode provided.")
37
-
38
- properties_found = jsonData["results"]["features"]
39
-
40
- # If UPRN is provided, we can check a specific address.
41
- html_data = None
42
- uprn = kwargs.get("uprn")
43
- if uprn:
44
- check_uprn(uprn)
45
- for item in properties_found:
46
- if uprn == str(int(item["properties"]["blpu_uprn"])):
47
- html_data = item["properties"]["three_column_layout_html"]
48
- break
49
- if html_data is None:
50
- raise ValueError("No collection data found for UPRN provided.")
51
- else:
52
- # If UPRN not provided, just use the first result
53
- html_data = properties_found[0]["properties"]["three_column_layout_html"]
54
-
55
- soup = BeautifulSoup(html_data, features="html.parser")
56
- soup.prettify()
57
-
58
- data = {"bins": []}
59
- all_collection_dates = []
60
- regex_date = re.compile(r".* ([\d]+\/[\d]+\/[\d]+)")
61
- regex_additional_collection = re.compile(r"We also collect (.*) on (.*) -")
62
-
63
- # Search for the 'Bins and Recycling' panel
64
- for panel in soup.select('div[class*="panel"]'):
65
- if panel.h2.text.strip() == "Bins and Recycling":
66
-
67
- # Gather the bin types and dates
68
- for collection in panel.select("div > strong"):
69
- bin_type = collection.text.strip()
70
- collection_string = collection.find_next("p").text.strip()
71
- m = regex_date.match(collection_string)
72
- if m:
73
- collection_date = datetime.strptime(
74
- m.group(1), "%d/%m/%Y"
75
- ).date()
76
- data["bins"].append(
77
- {
78
- "type": bin_type,
79
- "collectionDate": collection_date.strftime("%d/%m/%Y"),
80
- }
81
- )
82
- all_collection_dates.append(collection_date)
83
-
84
- # Search for additional collections
85
- for p in panel.select("p"):
86
- m2 = regex_additional_collection.match(p.text.strip())
87
- if m2:
88
- bin_type = m2.group(1)
89
- if "each collection day" in m2.group(2):
90
- collection_date = min(all_collection_dates)
91
- data["bins"].append(
92
- {
93
- "type": bin_type,
94
- "collectionDate": collection_date.strftime(
95
- "%d/%m/%Y"
96
- ),
97
- }
98
- )
99
- break
100
-
101
- return data