uk_bin_collection 0.80.0__tar.gz → 0.82.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/PKG-INFO +119 -1
  2. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/README.md +118 -0
  3. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/pyproject.toml +1 -1
  4. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/input.json +16 -7
  5. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/step_defs/test_validate_council.py +5 -5
  6. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/collect_data.py +29 -28
  7. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/common.py +7 -6
  8. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +26 -13
  9. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +6 -15
  10. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +8 -6
  11. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +13 -5
  12. uk_bin_collection-0.82.0/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +168 -0
  13. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +1 -1
  14. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +1 -1
  15. uk_bin_collection-0.82.0/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +156 -0
  16. uk_bin_collection-0.82.0/uk_bin_collection/uk_bin_collection/get_bin_data.py +146 -0
  17. uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -80
  18. uk_bin_collection-0.80.0/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -165
  19. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/LICENSE +0 -0
  20. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/README.rst +0 -0
  21. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
  22. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/features/environment.py +0 -0
  23. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
  24. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/output.schema +0 -0
  25. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
  26. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/test_collect_data.py +0 -0
  27. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/test_common_functions.py +0 -0
  28. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
  29. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
  30. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
  31. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
  32. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
  33. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
  34. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
  35. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
  36. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
  37. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
  38. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
  39. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
  40. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
  41. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
  42. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
  43. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
  44. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
  45. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
  46. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
  47. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
  48. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
  49. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
  50. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
  51. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
  52. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
  53. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
  54. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
  55. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
  56. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
  57. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
  58. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
  59. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
  60. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
  61. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
  62. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
  63. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
  64. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
  65. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
  66. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
  67. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
  68. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
  69. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
  70. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
  71. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
  72. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
  73. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
  74. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
  75. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
  76. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
  77. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
  78. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
  79. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
  80. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
  81. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
  82. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
  83. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
  84. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
  85. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
  86. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
  87. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
  88. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
  89. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
  90. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
  91. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
  92. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
  93. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
  94. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
  95. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
  96. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
  97. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
  98. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
  99. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
  100. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
  101. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
  102. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
  103. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
  104. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
  105. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
  106. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
  107. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
  108. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
  109. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
  110. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
  111. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
  112. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
  113. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
  114. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
  115. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
  116. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
  117. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
  118. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
  119. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
  120. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
  121. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
  122. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
  123. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
  124. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
  125. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
  126. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
  127. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
  128. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
  129. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
  130. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
  131. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
  132. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
  133. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
  134. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
  135. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
  136. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
  137. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
  138. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
  139. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
  140. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
  141. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
  142. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
  143. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
  144. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
  145. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
  146. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
  147. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
  148. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
  149. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
  150. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
  151. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
  152. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
  153. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
  154. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
  155. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
  156. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
  157. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
  158. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
  159. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
  160. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
  161. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
  162. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
  163. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
  164. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
  165. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
  166. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
  167. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
  168. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
  169. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
  170. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
  171. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
  172. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
  173. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
  174. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
  175. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
  176. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
  177. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
  178. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
  179. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
  180. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
  181. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
  182. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
  183. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
  184. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
  185. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
  186. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
  187. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
  188. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
  189. {uk_bin_collection-0.80.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uk_bin_collection
3
- Version: 0.80.0
3
+ Version: 0.82.0
4
4
  Summary: Python Lib to collect UK Bin Data
5
5
  Author: Robert Bradley
6
6
  Author-email: robbrad182@gmail.com
@@ -126,6 +126,124 @@ Install can be done via
126
126
  ## UPRN Finder
127
127
  Some councils make use of the UPRN (Unique property reference number) to identify your property. You can find yours [here](https://www.findmyaddress.co.uk/search) or [here](https://uprn.uk/).
128
128
 
129
+ ---
130
+ ## Selenium
131
+ Some councils need Selenium to run the scrape on behalf of Home Assistant. The easiest way to do this is run Selenium as in a Docker container. However you do this the Home Assistant server must be able to reach the Selenium server
132
+
133
+ ### Instructions for Windows, Linux, and Mac
134
+
135
+ #### Step 1: Install Docker
136
+
137
+ ##### Windows
138
+
139
+ 1. **Download Docker Desktop for Windows:**
140
+
141
+ * Go to the Docker website: Docker Desktop for Windows
142
+ * Download and install Docker Desktop.
143
+ 2. **Run Docker Desktop:**
144
+
145
+ * After installation, run Docker Desktop.
146
+ * Follow the on-screen instructions to complete the setup.
147
+ * Ensure Docker is running by checking the Docker icon in the system tray.
148
+
149
+ ##### Linux
150
+
151
+ 1. **Install Docker:**
152
+
153
+ * Open a terminal and run the following commands:
154
+
155
+ ```bash
156
+ sudo apt-get update
157
+ sudo apt-get install \
158
+ apt-transport-https \
159
+ ca-certificates \
160
+ curl \
161
+ gnupg \
162
+ lsb-release
163
+ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
164
+ echo \
165
+ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
166
+ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
167
+ sudo apt-get update
168
+ sudo apt-get install docker-ce docker-ce-cli containerd.io
169
+ ```
170
+
171
+ 2. **Start Docker:**
172
+
173
+ * Run the following command to start Docker:
174
+
175
+ ```bash
176
+ sudo systemctl start docker
177
+ ```
178
+
179
+ 3. **Enable Docker to start on boot:**
180
+
181
+ bash
182
+
183
+ Copy code
184
+
185
+ ```bash
186
+ sudo systemctl enable docker
187
+ ```
188
+
189
+
190
+ ##### Mac
191
+
192
+ 1. **Download Docker Desktop for Mac:**
193
+
194
+ * Go to the Docker website: Docker Desktop for Mac
195
+ * Download and install Docker Desktop.
196
+ 2. **Run Docker Desktop:**
197
+
198
+ * After installation, run Docker Desktop.
199
+ * Follow the on-screen instructions to complete the setup.
200
+ * Ensure Docker is running by checking the Docker icon in the menu bar.
201
+
202
+ #### Step 2: Pull and Run Selenium Standalone Chrome Docker Image
203
+
204
+ 1. **Open a terminal or command prompt:**
205
+
206
+ 2. **Pull the Selenium Standalone Chrome image:**
207
+
208
+ ```bash
209
+ docker pull selenium/standalone-chrome
210
+ ```
211
+
212
+ 4. **Run the Selenium Standalone Chrome container:**
213
+
214
+ ```bash
215
+ docker run -d -p 4444:4444 --name selenium-chrome selenium/standalone-chrome
216
+ ```
217
+
218
+
219
+ #### Step 3: Test the Selenium Server
220
+
221
+ 1. **Navigate to the Selenium server URL in your web browser:**
222
+ * Open a web browser and go to `http://localhost:4444`
223
+ * You should see the Selenium Grid console.
224
+
225
+ #### Step 4: Supply the Selenium Server URL to UKBinCollectionData
226
+
227
+ 1. **Find the `UKBinCollectionData` project:**
228
+
229
+ * Go to the GitHub repository: [UKBinCollectionData](https://github.com/robbrad/UKBinCollectionData)
230
+ 2. **Supply the Selenium Server URL:**
231
+
232
+ * Typically, the URL will be `http://localhost:4444/wd/hub`
233
+ * You might need to update a configuration file or environment variable in the project to use this URL. Check the project's documentation for specific instructions.
234
+
235
+ ### Summary of Commands
236
+
237
+ **Windows/Linux/Mac:**
238
+
239
+ ```bash
240
+ docker pull selenium/standalone-chrome docker run -d -p 4444:4444 --name selenium-chrome selenium/standalone-chrome
241
+ ```
242
+
243
+ **Selenium Server URL:**
244
+
245
+ * `http://localhost:4444/wd/hub`
246
+
129
247
  ---
130
248
 
131
249
  ## Requesting your council
@@ -103,6 +103,124 @@ Install can be done via
103
103
  ## UPRN Finder
104
104
  Some councils make use of the UPRN (Unique property reference number) to identify your property. You can find yours [here](https://www.findmyaddress.co.uk/search) or [here](https://uprn.uk/).
105
105
 
106
+ ---
107
+ ## Selenium
108
+ Some councils need Selenium to run the scrape on behalf of Home Assistant. The easiest way to do this is run Selenium as in a Docker container. However you do this the Home Assistant server must be able to reach the Selenium server
109
+
110
+ ### Instructions for Windows, Linux, and Mac
111
+
112
+ #### Step 1: Install Docker
113
+
114
+ ##### Windows
115
+
116
+ 1. **Download Docker Desktop for Windows:**
117
+
118
+ * Go to the Docker website: Docker Desktop for Windows
119
+ * Download and install Docker Desktop.
120
+ 2. **Run Docker Desktop:**
121
+
122
+ * After installation, run Docker Desktop.
123
+ * Follow the on-screen instructions to complete the setup.
124
+ * Ensure Docker is running by checking the Docker icon in the system tray.
125
+
126
+ ##### Linux
127
+
128
+ 1. **Install Docker:**
129
+
130
+ * Open a terminal and run the following commands:
131
+
132
+ ```bash
133
+ sudo apt-get update
134
+ sudo apt-get install \
135
+ apt-transport-https \
136
+ ca-certificates \
137
+ curl \
138
+ gnupg \
139
+ lsb-release
140
+ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
141
+ echo \
142
+ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
143
+ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
144
+ sudo apt-get update
145
+ sudo apt-get install docker-ce docker-ce-cli containerd.io
146
+ ```
147
+
148
+ 2. **Start Docker:**
149
+
150
+ * Run the following command to start Docker:
151
+
152
+ ```bash
153
+ sudo systemctl start docker
154
+ ```
155
+
156
+ 3. **Enable Docker to start on boot:**
157
+
158
+ bash
159
+
160
+ Copy code
161
+
162
+ ```bash
163
+ sudo systemctl enable docker
164
+ ```
165
+
166
+
167
+ ##### Mac
168
+
169
+ 1. **Download Docker Desktop for Mac:**
170
+
171
+ * Go to the Docker website: Docker Desktop for Mac
172
+ * Download and install Docker Desktop.
173
+ 2. **Run Docker Desktop:**
174
+
175
+ * After installation, run Docker Desktop.
176
+ * Follow the on-screen instructions to complete the setup.
177
+ * Ensure Docker is running by checking the Docker icon in the menu bar.
178
+
179
+ #### Step 2: Pull and Run Selenium Standalone Chrome Docker Image
180
+
181
+ 1. **Open a terminal or command prompt:**
182
+
183
+ 2. **Pull the Selenium Standalone Chrome image:**
184
+
185
+ ```bash
186
+ docker pull selenium/standalone-chrome
187
+ ```
188
+
189
+ 4. **Run the Selenium Standalone Chrome container:**
190
+
191
+ ```bash
192
+ docker run -d -p 4444:4444 --name selenium-chrome selenium/standalone-chrome
193
+ ```
194
+
195
+
196
+ #### Step 3: Test the Selenium Server
197
+
198
+ 1. **Navigate to the Selenium server URL in your web browser:**
199
+ * Open a web browser and go to `http://localhost:4444`
200
+ * You should see the Selenium Grid console.
201
+
202
+ #### Step 4: Supply the Selenium Server URL to UKBinCollectionData
203
+
204
+ 1. **Find the `UKBinCollectionData` project:**
205
+
206
+ * Go to the GitHub repository: [UKBinCollectionData](https://github.com/robbrad/UKBinCollectionData)
207
+ 2. **Supply the Selenium Server URL:**
208
+
209
+ * Typically, the URL will be `http://localhost:4444/wd/hub`
210
+ * You might need to update a configuration file or environment variable in the project to use this URL. Check the project's documentation for specific instructions.
211
+
212
+ ### Summary of Commands
213
+
214
+ **Windows/Linux/Mac:**
215
+
216
+ ```bash
217
+ docker pull selenium/standalone-chrome docker run -d -p 4444:4444 --name selenium-chrome selenium/standalone-chrome
218
+ ```
219
+
220
+ **Selenium Server URL:**
221
+
222
+ * `http://localhost:4444/wd/hub`
223
+
106
224
  ---
107
225
 
108
226
  ## Requesting your council
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "uk_bin_collection"
3
- version = "0.80.0"
3
+ version = "0.82.0"
4
4
  description = "Python Lib to collect UK Bin Data"
5
5
  readme = "README.md"
6
6
  authors = ["Robert Bradley <robbrad182@gmail.com>"]
@@ -573,12 +573,13 @@
573
573
  "wiki_note": "Pass the house name/number plus the name of the street with the postcode parameter, wrapped in double quotes. Check the address in the web site first. This version will only pick the first SHOW button returned by the search or if it is fully unique. The search is not very predictable (e.g. house number 4 returns 14,24,4,44 etc.)."
574
574
  },
575
575
  "MidSussexDistrictCouncil": {
576
- "house_number": "OAKLANDS",
576
+ "house_number": "OAKLANDS, OAKLANDS ROAD RH16 1SS",
577
577
  "postcode": "RH16 1SS",
578
578
  "skip_get_url": true,
579
579
  "url": "https://www.midsussex.gov.uk/waste-recycling/bin-collection/",
580
580
  "wiki_name": "Mid Sussex District Council",
581
- "wiki_note": "Pass the name of the street with the house number parameter, wrapped in double quotes"
581
+ "wiki_note": "Pass the name of the street with the house number parameter, wrapped in double quotes",
582
+ "web_driver": "http://selenium:4444"
582
583
  },
583
584
  "MiltonKeynesCityCouncil": {
584
585
  "uprn": "Fullers Slade",
@@ -1041,13 +1042,13 @@
1041
1042
  "wiki_name": "Torridge District Council"
1042
1043
  },
1043
1044
  "UttlesfordDistrictCouncil": {
1044
- "url": "https://bins.uttlesford.gov.uk/",
1045
- "wiki_name": "UttlesfordDistrictCouncil",
1046
- "skip_get_url": true,
1045
+ "house_number": "72, Birchanger Lane",
1047
1046
  "postcode": "CM23 5QF",
1047
+ "skip_get_url": true,
1048
1048
  "uprn": "100090643434",
1049
- "house_number": "72, Birchanger Lane",
1050
- "web_driver": "http://selenium:4444"
1049
+ "url": "https://bins.uttlesford.gov.uk/",
1050
+ "web_driver": "http://selenium:4444",
1051
+ "wiki_name": "UttlesfordDistrictCouncil"
1051
1052
  },
1052
1053
  "ValeofGlamorganCouncil": {
1053
1054
  "skip_get_url": true,
@@ -1175,6 +1176,14 @@
1175
1176
  "wiki_name": "Woking Borough Council/Joint Waste Solutions",
1176
1177
  "wiki_note": "Works with all collection areas that use Joint Waste Solutions. Just use the correct URL."
1177
1178
  },
1179
+ "WychavonDistrictCouncil": {
1180
+ "url": "https://selfservice.wychavon.gov.uk/wdcroundlookup/wdc_search.jsp",
1181
+ "wiki_name": "WychavonDistrictCouncil",
1182
+ "web_driver": "http://selenium:4444",
1183
+ "skip_get_url": true,
1184
+ "postcode": "WR3 7RU",
1185
+ "uprn": "100120716273"
1186
+ },
1178
1187
  "WyreCouncil": {
1179
1188
  "postcode": "FY6 8HG",
1180
1189
  "skip_get_url": true,
@@ -1,13 +1,13 @@
1
+ import json
1
2
  import logging
2
3
  import traceback
3
- from typing import Any, Generator, Callable
4
- import json
5
-
6
- import pytest
7
- from pytest_bdd import scenario, given, when, then, parsers
8
4
  from functools import wraps
5
+ from typing import Any, Callable, Generator
9
6
 
7
+ import pytest
8
+ from pytest_bdd import given, parsers, scenario, then, when
10
9
  from step_helpers import file_handler
10
+
11
11
  from uk_bin_collection.uk_bin_collection import collect_data
12
12
 
13
13
  logging.basicConfig(level=logging.INFO, format="%(levelname)s - %(message)s")
@@ -11,8 +11,8 @@ from uk_bin_collection.uk_bin_collection.get_bin_data import (
11
11
  _LOGGER = logging.getLogger(__name__)
12
12
 
13
13
 
14
- # Dynamically importing the council processor
15
14
  def import_council_module(module_name, src_path="councils"):
15
+ """Dynamically import the council processor module."""
16
16
  module_path = os.path.realpath(os.path.join(os.path.dirname(__file__), src_path))
17
17
  if module_path not in sys.path:
18
18
  sys.path.append(module_path)
@@ -25,6 +25,7 @@ class UKBinCollectionApp:
25
25
  self.parsed_args = None
26
26
 
27
27
  def setup_arg_parser(self):
28
+ """Setup the argument parser for the script."""
28
29
  self.parser = argparse.ArgumentParser(
29
30
  description="UK Bin Collection Data Parser"
30
31
  )
@@ -38,8 +39,7 @@ class UKBinCollectionApp:
38
39
  "-p",
39
40
  "--postcode",
40
41
  type=str,
41
- help="Postcode to parse - should include a space and be wrapped in "
42
- "double-quotes",
42
+ help="Postcode to parse - should include a space and be wrapped in double quotes",
43
43
  required=False,
44
44
  )
45
45
  self.parser.add_argument(
@@ -58,6 +58,7 @@ class UKBinCollectionApp:
58
58
  self.parser.add_argument(
59
59
  "-w",
60
60
  "--web_driver",
61
+ type=str,
61
62
  help="URL for remote Selenium web driver - should be wrapped in double quotes",
62
63
  required=False,
63
64
  )
@@ -74,7 +75,13 @@ class UKBinCollectionApp:
74
75
  help="Should Selenium be headless. Defaults to true. Can be set to false to debug council",
75
76
  )
76
77
  self.parser.set_defaults(headless=True)
77
-
78
+ self.parser.add_argument(
79
+ "--local_browser",
80
+ dest="local_browser",
81
+ action="store_true",
82
+ help="Should Selenium be run on a remote server or locally. Defaults to false.",
83
+ required=False,
84
+ )
78
85
  self.parser.add_argument(
79
86
  "-d",
80
87
  "--dev_mode",
@@ -85,43 +92,37 @@ class UKBinCollectionApp:
85
92
  self.parsed_args = None
86
93
 
87
94
  def set_args(self, args):
95
+ """Parse the arguments from the command line."""
88
96
  self.parsed_args = self.parser.parse_args(args)
89
97
 
90
98
  def run(self):
91
- council_module_str = self.parsed_args.module
92
- council_module = import_council_module(council_module_str)
93
- address_url = self.parsed_args.URL
94
- postcode = self.parsed_args.postcode
95
- paon = self.parsed_args.number
96
- uprn = self.parsed_args.uprn
97
- skip_get_url = self.parsed_args.skip_get_url
98
- web_driver = self.parsed_args.web_driver
99
- headless = self.parsed_args.headless
100
- dev_mode = self.parsed_args.dev_mode
101
-
99
+ """Run the application with the provided arguments."""
100
+ council_module = import_council_module(self.parsed_args.module)
102
101
  return self.client_code(
103
102
  council_module.CouncilClass(),
104
- address_url,
105
- postcode=postcode,
106
- paon=paon,
107
- uprn=uprn,
108
- skip_get_url=skip_get_url,
109
- web_driver=web_driver,
110
- headless=headless,
111
- dev_mode=dev_mode,
112
- council_module_str=council_module_str,
103
+ self.parsed_args.URL,
104
+ postcode=self.parsed_args.postcode,
105
+ paon=self.parsed_args.number,
106
+ uprn=self.parsed_args.uprn,
107
+ skip_get_url=self.parsed_args.skip_get_url,
108
+ web_driver=self.parsed_args.web_driver,
109
+ headless=self.parsed_args.headless,
110
+ local_browser=self.parsed_args.local_browser,
111
+ dev_mode=self.parsed_args.dev_mode,
112
+ council_module_str=self.parsed_args.module,
113
113
  )
114
114
 
115
- def client_code(self, get_bin_data_class, address_url, **kwargs) -> None:
115
+ def client_code(self, get_bin_data_class, address_url, **kwargs):
116
116
  """
117
- The client code calls the template method to execute the algorithm. Client
118
- code does not have to know the concrete class of an object it works with,
119
- as long as it works with objects through the interface of their base class.
117
+ Call the template method to execute the algorithm. Client code does not need
118
+ to know the concrete class of an object it works with, as long as it works with
119
+ objects through the interface of their base class.
120
120
  """
121
121
  return get_bin_data_class.template_method(address_url, **kwargs)
122
122
 
123
123
 
124
124
  def run():
125
+ """Set up logging and run the application."""
125
126
  global _LOGGER
126
127
  _LOGGER = setup_logging(LOGGING_CONFIG, None)
127
128
  app = UKBinCollectionApp()
@@ -1,18 +1,19 @@
1
1
  import calendar
2
- import holidays
3
2
  import json
4
3
  import os
5
- import pandas as pd
6
4
  import re
7
- import requests
8
5
  from datetime import datetime, timedelta
9
- from dateutil.parser import parse
10
6
  from enum import Enum
7
+
8
+ import holidays
9
+ import pandas as pd
10
+ import requests
11
+ from dateutil.parser import parse
11
12
  from selenium import webdriver
12
- from selenium.webdriver.chrome.service import Service as ChromeService
13
- from webdriver_manager.chrome import ChromeDriverManager
14
13
  from selenium.common.exceptions import WebDriverException
14
+ from selenium.webdriver.chrome.service import Service as ChromeService
15
15
  from urllib3.exceptions import MaxRetryError
16
+ from webdriver_manager.chrome import ChromeDriverManager
16
17
 
17
18
  date_format = "%d/%m/%Y"
18
19
  days_of_week = {
@@ -1,7 +1,14 @@
1
+ from typing import Dict, List, Any, Optional
1
2
  from bs4 import BeautifulSoup
2
3
  from dateutil.relativedelta import relativedelta
3
-
4
- from uk_bin_collection.uk_bin_collection.common import *
4
+ import requests
5
+ import logging
6
+ import re
7
+ from datetime import datetime
8
+ from uk_bin_collection.common import *
9
+ from dateutil.parser import parse
10
+
11
+ from uk_bin_collection.uk_bin_collection.common import check_uprn, check_postcode
5
12
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
6
13
 
7
14
 
@@ -24,7 +31,7 @@ class CouncilClass(AbstractGetBinDataClass):
24
31
  implementation.
25
32
  """
26
33
 
27
- def get_data(self, url) -> str:
34
+ def get_data(self, url: str) -> str:
28
35
  """This method makes the request to the council
29
36
 
30
37
  Keyword arguments:
@@ -45,21 +52,27 @@ class CouncilClass(AbstractGetBinDataClass):
45
52
  full_page = session.get(url)
46
53
  return full_page
47
54
  except requests.exceptions.HTTPError as errh:
48
- _LOGGER.error(f"Http Error: {errh}")
55
+ logging.error(f"Http Error: {errh}")
49
56
  raise
50
57
  except requests.exceptions.ConnectionError as errc:
51
- _LOGGER.error(f"Error Connecting: {errc}")
58
+ logging.error(f"Error Connecting: {errc}")
52
59
  raise
53
60
  except requests.exceptions.Timeout as errt:
54
- _LOGGER.error(f"Timeout Error: {errt}")
61
+ logging.error(f"Timeout Error: {errt}")
55
62
  raise
56
63
  except requests.exceptions.RequestException as err:
57
- _LOGGER.error(f"Oops: Something Else {err}")
64
+ logging.error(f"Oops: Something Else {err}")
58
65
  raise
59
66
 
60
- def parse_data(self, page: str, **kwargs) -> dict:
61
- uprn = kwargs.get("uprn")
62
- postcode = kwargs.get("postcode")
67
+ def parse_data(self, page: str, **kwargs: Any) -> Dict[str, List[Dict[str, str]]]:
68
+ uprn: Optional[str] = kwargs.get("uprn")
69
+ postcode: Optional[str] = kwargs.get("postcode")
70
+
71
+ if uprn is None:
72
+ raise ValueError("UPRN is required and must be a non-empty string.")
73
+ if postcode is None:
74
+ raise ValueError("Postcode is required and must be a non-empty string.")
75
+
63
76
  check_uprn(uprn)
64
77
  check_postcode(postcode)
65
78
 
@@ -85,7 +98,7 @@ class CouncilClass(AbstractGetBinDataClass):
85
98
  rows = soup.find("table").find_all("tr")
86
99
 
87
100
  # Form a JSON wrapper
88
- data = {"bins": []}
101
+ data: Dict[str, List[Dict[str, str]]] = {"bins": []}
89
102
 
90
103
  # Loops the Rows
91
104
  for row in rows:
@@ -94,13 +107,13 @@ class CouncilClass(AbstractGetBinDataClass):
94
107
  bin_type = cells[0].get_text(strip=True)
95
108
  collection_next = cells[1].get_text(strip=True)
96
109
 
97
- collection_date = re.findall("\(.*?\)", collection_next)
110
+ collection_date = re.findall(r"\(.*?\)", collection_next)
98
111
 
99
112
  if len(collection_date) != 1:
100
113
  continue
101
114
 
102
115
  collection_date_obj = parse(
103
- re.sub("[()]", "", collection_date[0])
116
+ re.sub(r"[()]", "", collection_date[0])
104
117
  ).date()
105
118
 
106
119
  # since we only have the next collection day, if the parsed date is in the past,
@@ -1,17 +1,14 @@
1
1
  # This script pulls (in one hit) the data from Bromley Council Bins Data
2
2
  import datetime
3
- import time
4
3
  from datetime import datetime
5
4
 
6
5
  from bs4 import BeautifulSoup
7
6
  from dateutil.relativedelta import relativedelta
8
7
  from selenium.webdriver.common.by import By
9
- from selenium.webdriver.common.keys import Keys
10
8
  from selenium.webdriver.support import expected_conditions as EC
11
- from selenium.webdriver.support.ui import Select
12
- from selenium.webdriver.support.wait import WebDriverWait
9
+ from selenium.webdriver.support.ui import WebDriverWait
13
10
 
14
- from uk_bin_collection.uk_bin_collection.common import *
11
+ from uk_bin_collection.uk_bin_collection.common import create_webdriver
15
12
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
16
13
 
17
14
 
@@ -28,7 +25,6 @@ class CouncilClass(AbstractGetBinDataClass):
28
25
  driver = None
29
26
  try:
30
27
  bin_data_dict = {"bins": []}
31
- collections = []
32
28
  web_driver = kwargs.get("web_driver")
33
29
  headless = kwargs.get("headless")
34
30
 
@@ -39,18 +35,14 @@ class CouncilClass(AbstractGetBinDataClass):
39
35
  driver.get(kwargs.get("url"))
40
36
 
41
37
  wait = WebDriverWait(driver, 30)
42
- results = wait.until(
38
+ wait.until(
43
39
  EC.presence_of_element_located((By.CLASS_NAME, "waste-service-image"))
44
40
  )
45
- # Search for the specific bins in the table using BS
46
- # Parse the HTML content
47
- # Find all elements with the class 'container-name' to extract bin types
41
+
48
42
  # Parse the HTML content
49
43
  soup = BeautifulSoup(driver.page_source, "html.parser")
50
- soup.prettify
51
44
 
52
45
  # Find all elements with class 'govuk-summary-list'
53
- bin_info = []
54
46
  waste_services = soup.find_all(
55
47
  "h3", class_="govuk-heading-m waste-service-name"
56
48
  )
@@ -58,7 +50,7 @@ class CouncilClass(AbstractGetBinDataClass):
58
50
  for service in waste_services:
59
51
  service_title = service.get_text(strip=True)
60
52
  next_collection = service.find_next_sibling().find(
61
- "dt", text="Next collection"
53
+ "dt", string="Next collection"
62
54
  )
63
55
 
64
56
  if next_collection:
@@ -69,8 +61,7 @@ class CouncilClass(AbstractGetBinDataClass):
69
61
  next_collection_date_parse = next_collection_date.split(",")[
70
62
  1
71
63
  ].strip()
72
- day = next_collection_date_parse.split()[0]
73
- month = next_collection_date_parse.split()[1]
64
+ day, month = next_collection_date_parse.split()[:2]
74
65
 
75
66
  # Remove the suffix (e.g., 'th', 'nd', 'rd', 'st') from the day
76
67
  if day.endswith(("th", "nd", "rd", "st")):
@@ -1,11 +1,11 @@
1
1
  import time
2
-
3
2
  import pandas as pd
4
3
  from selenium.webdriver.common.by import By
5
4
  from selenium.webdriver.common.keys import Keys
6
5
  from selenium.webdriver.support.ui import Select
6
+ from io import StringIO
7
7
 
8
- from uk_bin_collection.uk_bin_collection.common import *
8
+ from uk_bin_collection.uk_bin_collection.common import create_webdriver
9
9
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
10
10
 
11
11
 
@@ -16,7 +16,7 @@ class CouncilClass(AbstractGetBinDataClass):
16
16
  implementation.
17
17
  """
18
18
 
19
- def get_data(self, df) -> dict:
19
+ def get_data(self, df: pd.DataFrame) -> dict:
20
20
  # Create dictionary of data to be returned
21
21
  data = {"bins": []}
22
22
 
@@ -69,7 +69,7 @@ class CouncilClass(AbstractGetBinDataClass):
69
69
  time.sleep(4)
70
70
 
71
71
  # Submit address information and wait
72
- inputElement_bn = driver.find_element(
72
+ driver.find_element(
73
73
  By.ID, "COPYOFECHOCOLLECTIONDATES_ADDRESSSELECTION_NAV1_NEXT"
74
74
  ).click()
75
75
 
@@ -79,8 +79,10 @@ class CouncilClass(AbstractGetBinDataClass):
79
79
  table = driver.find_element(
80
80
  By.ID, "COPYOFECHOCOLLECTIONDATES_PAGE1_DATES2"
81
81
  ).get_attribute("outerHTML")
82
- df = pd.read_html(table, header=[1])
83
- df = df[0]
82
+
83
+ # Wrap the HTML table in a StringIO object to address the warning
84
+ table_io = StringIO(table)
85
+ df = pd.read_html(table_io, header=[1])[0]
84
86
 
85
87
  # Parse data into dict
86
88
  data = self.get_data(df)