uk_bin_collection 0.81.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.
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/PKG-INFO +119 -1
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/README.md +118 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/pyproject.toml +1 -1
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/input.json +3 -2
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/step_defs/test_validate_council.py +5 -5
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/collect_data.py +29 -28
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/common.py +7 -6
- uk_bin_collection-0.82.0/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +168 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +1 -1
- uk_bin_collection-0.82.0/uk_bin_collection/uk_bin_collection/get_bin_data.py +146 -0
- uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -80
- uk_bin_collection-0.81.0/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -165
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/LICENSE +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/README.rst +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/features/environment.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/output.schema +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/test_collect_data.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/tests/test_common_functions.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
- {uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
- {uk_bin_collection-0.81.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.
|
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
|
@@ -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",
|
@@ -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
|
-
|
92
|
-
council_module = import_council_module(
|
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
|
-
|
105
|
-
postcode=postcode,
|
106
|
-
paon=
|
107
|
-
uprn=uprn,
|
108
|
-
skip_get_url=skip_get_url,
|
109
|
-
web_driver=web_driver,
|
110
|
-
headless=headless,
|
111
|
-
|
112
|
-
|
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)
|
115
|
+
def client_code(self, get_bin_data_class, address_url, **kwargs):
|
116
116
|
"""
|
117
|
-
|
118
|
-
|
119
|
-
|
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()
|
{uk_bin_collection-0.81.0 → uk_bin_collection-0.82.0}/uk_bin_collection/uk_bin_collection/common.py
RENAMED
@@ -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 = {
|
uk_bin_collection-0.82.0/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
import logging
|
2
|
+
import time
|
3
|
+
|
4
|
+
from bs4 import BeautifulSoup
|
5
|
+
from selenium.webdriver.common.by import By
|
6
|
+
from selenium.webdriver.support import expected_conditions as EC
|
7
|
+
from selenium.webdriver.support.ui import Select
|
8
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
9
|
+
from selenium.webdriver.common.keys import Keys
|
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
|
+
# Set up logging
|
15
|
+
logging.basicConfig(
|
16
|
+
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
|
17
|
+
)
|
18
|
+
|
19
|
+
|
20
|
+
class CouncilClass(AbstractGetBinDataClass):
|
21
|
+
"""
|
22
|
+
Concrete class for Mid-Sussex District Council implementing AbstractGetBinDataClass.
|
23
|
+
"""
|
24
|
+
|
25
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
26
|
+
driver = None
|
27
|
+
try:
|
28
|
+
data = {"bins": []}
|
29
|
+
collections = []
|
30
|
+
user_paon = kwargs.get("paon")
|
31
|
+
user_postcode = kwargs.get("postcode")
|
32
|
+
web_driver = kwargs.get("web_driver")
|
33
|
+
headless = kwargs.get("headless")
|
34
|
+
check_postcode(user_postcode)
|
35
|
+
|
36
|
+
# Create Selenium webdriver
|
37
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
38
|
+
|
39
|
+
driver.get("https://www.midsussex.gov.uk/waste-recycling/bin-collection/")
|
40
|
+
wait = WebDriverWait(driver, 60)
|
41
|
+
|
42
|
+
try:
|
43
|
+
logging.info("Cookies")
|
44
|
+
cookie_window = wait.until(
|
45
|
+
EC.presence_of_element_located(
|
46
|
+
(By.XPATH, '//div[@id="ccc-content"]')
|
47
|
+
)
|
48
|
+
)
|
49
|
+
time.sleep(2)
|
50
|
+
accept_cookies = WebDriverWait(driver, timeout=10).until(
|
51
|
+
EC.presence_of_element_located(
|
52
|
+
(By.XPATH, '//button[@id="ccc-recommended-settings"]')
|
53
|
+
)
|
54
|
+
)
|
55
|
+
accept_cookies.send_keys(Keys.ENTER)
|
56
|
+
accept_cookies.click()
|
57
|
+
accept_cookies_close = WebDriverWait(driver, timeout=10).until(
|
58
|
+
EC.presence_of_element_located(
|
59
|
+
(By.XPATH, '//button[@id="ccc-close"]')
|
60
|
+
)
|
61
|
+
)
|
62
|
+
accept_cookies_close.send_keys(Keys.ENTER)
|
63
|
+
accept_cookies_close.click()
|
64
|
+
except:
|
65
|
+
print(
|
66
|
+
"Accept cookies banner not found or clickable within the specified time."
|
67
|
+
)
|
68
|
+
pass
|
69
|
+
|
70
|
+
def click_element(by, value):
|
71
|
+
element = wait.until(EC.element_to_be_clickable((by, value)))
|
72
|
+
driver.execute_script("arguments[0].scrollIntoView();", element)
|
73
|
+
element.click()
|
74
|
+
|
75
|
+
logging.info("Entering postcode")
|
76
|
+
input_element_postcode = wait.until(
|
77
|
+
EC.presence_of_element_located(
|
78
|
+
(By.XPATH, '//input[@id="PostCodeStep_strAddressSearch"]')
|
79
|
+
)
|
80
|
+
)
|
81
|
+
|
82
|
+
input_element_postcode.send_keys(user_postcode)
|
83
|
+
|
84
|
+
logging.info("Entering postcode")
|
85
|
+
|
86
|
+
click_element(By.XPATH, "//button[contains(text(), 'Search')]")
|
87
|
+
|
88
|
+
logging.info("Selecting address")
|
89
|
+
dropdown = wait.until(
|
90
|
+
EC.element_to_be_clickable((By.ID, "StrAddressSelect"))
|
91
|
+
)
|
92
|
+
|
93
|
+
dropdown_options = wait.until(
|
94
|
+
EC.presence_of_element_located(
|
95
|
+
(By.XPATH, "//select[@id='StrAddressSelect']/option")
|
96
|
+
)
|
97
|
+
)
|
98
|
+
dropdownSelect = Select(dropdown)
|
99
|
+
dropdownSelect.select_by_visible_text(str(user_paon))
|
100
|
+
|
101
|
+
click_element(By.XPATH, "//button[contains(text(), 'Select')]")
|
102
|
+
|
103
|
+
logging.info("Waiting for bin schedule")
|
104
|
+
bin_results = wait.until(
|
105
|
+
EC.presence_of_element_located(
|
106
|
+
(By.XPATH, f"//strong[contains(text(), '{user_paon}')]")
|
107
|
+
)
|
108
|
+
)
|
109
|
+
|
110
|
+
# Make a BS4 object
|
111
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
112
|
+
|
113
|
+
# Find the table with bin collection data
|
114
|
+
table = soup.find("table", class_="collDates")
|
115
|
+
if table:
|
116
|
+
rows = table.find_all("tr")[1:] # Skip the header row
|
117
|
+
else:
|
118
|
+
rows = []
|
119
|
+
|
120
|
+
# Extract the data from the table and format it according to the JSON schema
|
121
|
+
bins = []
|
122
|
+
date_pattern = re.compile(r"(\d{2}) (\w+) (\d{4})")
|
123
|
+
|
124
|
+
for row in rows:
|
125
|
+
cols = row.find_all("td")
|
126
|
+
if len(cols) < 3:
|
127
|
+
print("Skipping row, not enough columns:", row)
|
128
|
+
continue # Skip rows that do not have enough columns
|
129
|
+
|
130
|
+
collection_type = cols[1].text.strip()
|
131
|
+
collection_date = cols[2].text.strip()
|
132
|
+
|
133
|
+
# Convert the collection date to the required format
|
134
|
+
date_match = date_pattern.search(collection_date)
|
135
|
+
if date_match:
|
136
|
+
day, month, year = date_match.groups()
|
137
|
+
month_number = {
|
138
|
+
"January": "01",
|
139
|
+
"February": "02",
|
140
|
+
"March": "03",
|
141
|
+
"April": "04",
|
142
|
+
"May": "05",
|
143
|
+
"June": "06",
|
144
|
+
"July": "07",
|
145
|
+
"August": "08",
|
146
|
+
"September": "09",
|
147
|
+
"October": "10",
|
148
|
+
"November": "11",
|
149
|
+
"December": "12",
|
150
|
+
}.get(month, "00")
|
151
|
+
|
152
|
+
formatted_date = f"{day}/{month_number}/{year}"
|
153
|
+
bins.append(
|
154
|
+
{"type": collection_type, "collectionDate": formatted_date}
|
155
|
+
)
|
156
|
+
else:
|
157
|
+
print("Date pattern not found in:", collection_date)
|
158
|
+
|
159
|
+
# Create the final JSON structure
|
160
|
+
bin_data = {"bins": bins}
|
161
|
+
return bin_data
|
162
|
+
except Exception as e:
|
163
|
+
logging.error(f"An error occurred: {e}")
|
164
|
+
raise
|
165
|
+
|
166
|
+
finally:
|
167
|
+
if driver:
|
168
|
+
driver.quit()
|