uk_bin_collection 0.127.1__tar.gz → 0.127.3__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/PKG-INFO +66 -2
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/README.md +65 -1
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/pyproject.toml +1 -1
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/input.json +10 -11
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py +3 -3
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +18 -7
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +2 -2
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/PowysCouncil.py +10 -7
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +20 -11
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +6 -6
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +8 -3
- uk_bin_collection-0.127.3/uk_bin_collection/uk_bin_collection/councils/SurreyHeathBoroughCouncil.py +116 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +9 -6
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +18 -7
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +3 -3
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/LICENSE +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/README.rst +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/features/environment.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/output.schema +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/test_collect_data.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/test_common_functions.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/test_conftest.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/tests/test_get_data.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/common.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CopelandBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CumberlandAllerdaleCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DenbighshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DundeeCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EdinburghCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ExeterCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/FolkstoneandHytheDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/GwyneddCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HackneyCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HartDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HartlepoolBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/KingsLynnandWestNorfolkBC.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHavering.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLewisham.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MidDevonCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MidSuffolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/MorayCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NewcastleUnderLymeCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/OadbyAndWigstonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/OxfordCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RedditchBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SandwellBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthHamsDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StevenageBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StocktonOnTeesCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/ThurrockCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestDunbartonshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WolverhamptonCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WorcesterCityCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/WyreForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
- {uk_bin_collection-0.127.1 → uk_bin_collection-0.127.3}/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: uk_bin_collection
|
3
|
-
Version: 0.127.
|
3
|
+
Version: 0.127.3
|
4
4
|
Summary: Python Lib to collect UK Bin Data
|
5
5
|
Author: Robert Bradley
|
6
6
|
Author-email: robbrad182@gmail.com
|
@@ -256,7 +256,6 @@ Some councils need Selenium to run the scrape on behalf of Home Assistant. The e
|
|
256
256
|
```bash
|
257
257
|
docker run -d -p 4444:4444 --name selenium-chrome selenium/standalone-chrome
|
258
258
|
```
|
259
|
-
|
260
259
|
|
261
260
|
#### Step 3: Test the Selenium Server
|
262
261
|
|
@@ -288,6 +287,71 @@ docker pull selenium/standalone-chrome docker run -d -p 4444:4444 --name seleniu
|
|
288
287
|
|
289
288
|
---
|
290
289
|
|
290
|
+
### Instructions for Home Assistant OS
|
291
|
+
|
292
|
+
If you're running Home Assistant Supervised, it's possible to host the Selenium instance on the same system.
|
293
|
+
|
294
|
+
This guide is based on a Raspberry Pi 4. Instructions for other systems may vary.
|
295
|
+
|
296
|
+
#### Prerequisites
|
297
|
+
1. Install **Portainer** from Alex Belgium's add-on repository:
|
298
|
+
[github.com/alexbelgium/hassio-addons](https://github.com/alexbelgium/hassio-addons)
|
299
|
+
|
300
|
+
---
|
301
|
+
|
302
|
+
#### Step 1: Pull and Run Docker Image
|
303
|
+
|
304
|
+
Since the Raspberry Pi 4 uses an ARM64-based architecture, use the `seleniarm/standalone-chromium:latest` Docker image.
|
305
|
+
|
306
|
+
1. Open **Portainer** and navigate to the **Images** tab.
|
307
|
+
2. In the **Image** text box, enter:
|
308
|
+
|
309
|
+
```
|
310
|
+
seleniarm/standalone-chromium:latest
|
311
|
+
```
|
312
|
+
|
313
|
+
3. Click **Pull the image**.
|
314
|
+
|
315
|
+
4. Once the image is pulled, navigate to the **Containers** tab and click **Add container**.
|
316
|
+
|
317
|
+
5. Configure the container:
|
318
|
+
- **Name:** Give it a clear and descriptive name (e.g., `selenium-chromium`).
|
319
|
+
- **Image:** Enter:
|
320
|
+
|
321
|
+
```
|
322
|
+
seleniarm/standalone-chromium
|
323
|
+
```
|
324
|
+
|
325
|
+
Make sure to uncheck **Always pull the image**.
|
326
|
+
|
327
|
+
- **Network ports configuration:**
|
328
|
+
- Click **Map additional port**.
|
329
|
+
- Set both the **Host** and **Container** ports to `4444`.
|
330
|
+
|
331
|
+
6. Click **Deploy the container**.
|
332
|
+
|
333
|
+
---
|
334
|
+
|
335
|
+
#### Step 2: Configure UKBinCollectionData Integration
|
336
|
+
|
337
|
+
1. **Add the integration** in Home Assistant.
|
338
|
+
|
339
|
+
2. On the second stage of the integration setup wizard:
|
340
|
+
- Ensure that `http://localhost:4444` shows as accessible.
|
341
|
+
- If not, verify that the Selenium container is running in Portainer.
|
342
|
+
|
343
|
+
3. Enter the required information for the integration.
|
344
|
+
|
345
|
+
4. In the **Remote Selenium Server** text box, enter:
|
346
|
+
|
347
|
+
```
|
348
|
+
http://<HA IP address>:4444
|
349
|
+
```
|
350
|
+
|
351
|
+
Replace `<HA IP address>` with the IP address of your Home Assistant system.
|
352
|
+
|
353
|
+
---
|
354
|
+
|
291
355
|
## Reports
|
292
356
|
|
293
357
|
### Nightly Full Integration Test Reports:
|
@@ -233,7 +233,6 @@ Some councils need Selenium to run the scrape on behalf of Home Assistant. The e
|
|
233
233
|
```bash
|
234
234
|
docker run -d -p 4444:4444 --name selenium-chrome selenium/standalone-chrome
|
235
235
|
```
|
236
|
-
|
237
236
|
|
238
237
|
#### Step 3: Test the Selenium Server
|
239
238
|
|
@@ -265,6 +264,71 @@ docker pull selenium/standalone-chrome docker run -d -p 4444:4444 --name seleniu
|
|
265
264
|
|
266
265
|
---
|
267
266
|
|
267
|
+
### Instructions for Home Assistant OS
|
268
|
+
|
269
|
+
If you're running Home Assistant Supervised, it's possible to host the Selenium instance on the same system.
|
270
|
+
|
271
|
+
This guide is based on a Raspberry Pi 4. Instructions for other systems may vary.
|
272
|
+
|
273
|
+
#### Prerequisites
|
274
|
+
1. Install **Portainer** from Alex Belgium's add-on repository:
|
275
|
+
[github.com/alexbelgium/hassio-addons](https://github.com/alexbelgium/hassio-addons)
|
276
|
+
|
277
|
+
---
|
278
|
+
|
279
|
+
#### Step 1: Pull and Run Docker Image
|
280
|
+
|
281
|
+
Since the Raspberry Pi 4 uses an ARM64-based architecture, use the `seleniarm/standalone-chromium:latest` Docker image.
|
282
|
+
|
283
|
+
1. Open **Portainer** and navigate to the **Images** tab.
|
284
|
+
2. In the **Image** text box, enter:
|
285
|
+
|
286
|
+
```
|
287
|
+
seleniarm/standalone-chromium:latest
|
288
|
+
```
|
289
|
+
|
290
|
+
3. Click **Pull the image**.
|
291
|
+
|
292
|
+
4. Once the image is pulled, navigate to the **Containers** tab and click **Add container**.
|
293
|
+
|
294
|
+
5. Configure the container:
|
295
|
+
- **Name:** Give it a clear and descriptive name (e.g., `selenium-chromium`).
|
296
|
+
- **Image:** Enter:
|
297
|
+
|
298
|
+
```
|
299
|
+
seleniarm/standalone-chromium
|
300
|
+
```
|
301
|
+
|
302
|
+
Make sure to uncheck **Always pull the image**.
|
303
|
+
|
304
|
+
- **Network ports configuration:**
|
305
|
+
- Click **Map additional port**.
|
306
|
+
- Set both the **Host** and **Container** ports to `4444`.
|
307
|
+
|
308
|
+
6. Click **Deploy the container**.
|
309
|
+
|
310
|
+
---
|
311
|
+
|
312
|
+
#### Step 2: Configure UKBinCollectionData Integration
|
313
|
+
|
314
|
+
1. **Add the integration** in Home Assistant.
|
315
|
+
|
316
|
+
2. On the second stage of the integration setup wizard:
|
317
|
+
- Ensure that `http://localhost:4444` shows as accessible.
|
318
|
+
- If not, verify that the Selenium container is running in Portainer.
|
319
|
+
|
320
|
+
3. Enter the required information for the integration.
|
321
|
+
|
322
|
+
4. In the **Remote Selenium Server** text box, enter:
|
323
|
+
|
324
|
+
```
|
325
|
+
http://<HA IP address>:4444
|
326
|
+
```
|
327
|
+
|
328
|
+
Replace `<HA IP address>` with the IP address of your Home Assistant system.
|
329
|
+
|
330
|
+
---
|
331
|
+
|
268
332
|
## Reports
|
269
333
|
|
270
334
|
### Nightly Full Integration Test Reports:
|
@@ -1208,8 +1208,8 @@
|
|
1208
1208
|
"wiki_note": "Pass the postcode and UPRN. This parser requires a Selenium webdriver."
|
1209
1209
|
},
|
1210
1210
|
"NewarkAndSherwoodDC": {
|
1211
|
-
"url": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=200004258529
|
1212
|
-
"wiki_command_url_override": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=XXXXXXXX
|
1211
|
+
"url": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=200004258529",
|
1212
|
+
"wiki_command_url_override": "http://app.newark-sherwooddc.gov.uk/bincollection/calendar?pid=XXXXXXXX",
|
1213
1213
|
"wiki_name": "Newark and Sherwood District Council",
|
1214
1214
|
"wiki_note": "Replace XXXXXXXX with your UPRN."
|
1215
1215
|
},
|
@@ -1409,15 +1409,6 @@
|
|
1409
1409
|
"wiki_name": "Portsmouth City Council",
|
1410
1410
|
"wiki_note": "Pass the postcode and UPRN. This parser requires a Selenium webdriver."
|
1411
1411
|
},
|
1412
|
-
"PowysCouncil": {
|
1413
|
-
"house_number": "LANE COTTAGE",
|
1414
|
-
"postcode": "HR3 5JS",
|
1415
|
-
"skip_get_url": true,
|
1416
|
-
"url": "https://www.powys.gov.uk",
|
1417
|
-
"web_driver": "http://selenium:4444",
|
1418
|
-
"wiki_name": "Powys Council",
|
1419
|
-
"wiki_note": "Pass the house name/number and postcode in their respective parameters. This parser requires a Selenium webdriver."
|
1420
|
-
},
|
1421
1412
|
"PowysCouncil": {
|
1422
1413
|
"house_number": "LANE COTTAGE",
|
1423
1414
|
"postcode": "HR3 5JS",
|
@@ -1768,6 +1759,14 @@
|
|
1768
1759
|
"wiki_name": "Sunderland City Council",
|
1769
1760
|
"wiki_note": "Provide your house number (without quotes) and postcode (wrapped in double quotes with a space)."
|
1770
1761
|
},
|
1762
|
+
"SurreyHeathBoroughCouncil": {
|
1763
|
+
"house_number": "36",
|
1764
|
+
"postcode": "GU20 6PN",
|
1765
|
+
"skip_get_url": true,
|
1766
|
+
"url": "https://asjwsw-wrpsurreyheathmunicipal-live.whitespacews.com/",
|
1767
|
+
"wiki_name": "Surrey Heath Borough Council / Joint Waste Solutions",
|
1768
|
+
"wiki_note": "Provide your house number in the `house_number` parameter and postcode in the `postcode` parameter."
|
1769
|
+
},
|
1771
1770
|
"SwaleBoroughCouncil": {
|
1772
1771
|
"postcode": "ME12 2NQ",
|
1773
1772
|
"skip_get_url": true,
|
@@ -34,10 +34,10 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
34
34
|
|
35
35
|
# Find the next collection date
|
36
36
|
date_tag = container.find(class_="font11 text-center")
|
37
|
-
if date_tag
|
38
|
-
continue
|
39
|
-
else:
|
37
|
+
if date_tag:
|
40
38
|
collection_date = date_tag.text.strip()
|
39
|
+
else:
|
40
|
+
continue
|
41
41
|
|
42
42
|
dict_data = {
|
43
43
|
"type": bin_type,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import datetime
|
2
|
+
|
1
3
|
from bs4 import BeautifulSoup
|
2
4
|
|
3
5
|
from uk_bin_collection.uk_bin_collection.common import *
|
@@ -32,15 +34,24 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
32
34
|
for p in ps:
|
33
35
|
collection = p.text.strip().replace("Your next ", "").split(".")[0]
|
34
36
|
bin_type = collection.split(" day is")[0]
|
35
|
-
collection_date =
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
collection_date = remove_ordinal_indicator_from_date_string(
|
38
|
+
collection
|
39
|
+
).split("day is ")[1]
|
40
|
+
if collection_date == "Today":
|
41
|
+
collection_date = datetime.today().strftime(date_format)
|
42
|
+
elif collection_date == "Tomorrow":
|
43
|
+
collection_date = (datetime.today() + timedelta(days=1)).strftime(
|
44
|
+
date_format
|
45
|
+
)
|
46
|
+
print(collection_date)
|
47
|
+
else:
|
48
|
+
collection_date = datetime.strptime(
|
49
|
+
collection_date,
|
50
|
+
"%A %d %B %Y",
|
51
|
+
).strftime(date_format)
|
41
52
|
dict_data = {
|
42
53
|
"type": bin_type,
|
43
|
-
"collectionDate": collection_date
|
54
|
+
"collectionDate": collection_date,
|
44
55
|
}
|
45
56
|
data["bins"].append(dict_data)
|
46
57
|
|
@@ -47,10 +47,10 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
47
47
|
bin_type = cells[0].get_text().strip()
|
48
48
|
# Date is on the second cell, second paragraph, wrapped in p
|
49
49
|
collectionDate = None
|
50
|
-
for
|
50
|
+
for format in possible_formats:
|
51
51
|
try:
|
52
52
|
collectionDate = datetime.strptime(
|
53
|
-
cells[1].select("p > b")[2].get_text(strip=True),
|
53
|
+
cells[1].select("p > b")[2].get_text(strip=True), format
|
54
54
|
)
|
55
55
|
break # Exit the loop if parsing is successful
|
56
56
|
except ValueError:
|
@@ -127,12 +127,15 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
127
127
|
li.text for li in garden_waste_section.find_next("ul").find_all("li")
|
128
128
|
]
|
129
129
|
for date in garden_waste_dates:
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
130
|
+
try:
|
131
|
+
dict_data = {
|
132
|
+
"type": "Garden Waste",
|
133
|
+
"collectionDate": datetime.strptime(
|
134
|
+
remove_ordinal_indicator_from_date_string(date), "%d %B %Y"
|
135
|
+
).strftime(date_format),
|
136
|
+
}
|
137
|
+
data["bins"].append(dict_data)
|
138
|
+
except:
|
139
|
+
continue
|
137
140
|
|
138
141
|
return data
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import requests
|
2
2
|
from bs4 import BeautifulSoup
|
3
|
+
|
3
4
|
from uk_bin_collection.uk_bin_collection.common import *
|
4
5
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
5
6
|
|
@@ -54,6 +55,9 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
54
55
|
|
55
56
|
data = {"bins": []}
|
56
57
|
|
58
|
+
current_year = datetime.now().year
|
59
|
+
next_year = current_year + 1
|
60
|
+
|
57
61
|
# Page has slider info side by side, which are two instances of this class
|
58
62
|
for bin in soup.find_all("div", {"class": "binextra"}):
|
59
63
|
bin_info = list(bin.stripped_strings)
|
@@ -62,27 +66,32 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
62
66
|
if contains_date(bin_info[0]):
|
63
67
|
bin_date = get_next_occurrence_from_day_month(
|
64
68
|
datetime.strptime(
|
65
|
-
bin_info[0]
|
66
|
-
"%A %d %B -
|
69
|
+
bin_info[0],
|
70
|
+
"%A %d %B -",
|
67
71
|
)
|
68
|
-
)
|
69
|
-
bin_type = str.capitalize(bin_info[1])
|
72
|
+
)
|
73
|
+
bin_type = str.capitalize(" ".join(bin_info[1:]))
|
70
74
|
# On exceptional collection schedule (e.g. around English Bank Holidays), date will be contained in the second stripped string
|
71
75
|
else:
|
72
76
|
bin_date = get_next_occurrence_from_day_month(
|
73
77
|
datetime.strptime(
|
74
|
-
bin_info[1]
|
75
|
-
"%A %d %B -
|
78
|
+
bin_info[1],
|
79
|
+
"%A %d %B -",
|
76
80
|
)
|
77
|
-
)
|
78
|
-
|
79
|
-
except
|
80
|
-
|
81
|
+
)
|
82
|
+
str.capitalize(" ".join(bin_info[2:]))
|
83
|
+
except:
|
84
|
+
continue
|
85
|
+
|
86
|
+
if (datetime.now().month == 12) and (bin_date.month == 1):
|
87
|
+
bin_date = bin_date.replace(year=next_year)
|
88
|
+
else:
|
89
|
+
bin_date = bin_date.replace(year=current_year)
|
81
90
|
|
82
91
|
# Build data dict for each entry
|
83
92
|
dict_data = {
|
84
93
|
"type": bin_type,
|
85
|
-
"collectionDate": bin_date,
|
94
|
+
"collectionDate": bin_date.strftime(date_format),
|
86
95
|
}
|
87
96
|
data["bins"].append(dict_data)
|
88
97
|
|
@@ -30,12 +30,12 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
30
30
|
driver.get("https://www.staffsmoorlands.gov.uk/findyourbinday")
|
31
31
|
|
32
32
|
# Close cookies banner
|
33
|
-
cookieAccept = WebDriverWait(driver, 10).until(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
)
|
38
|
-
cookieAccept.click()
|
33
|
+
# cookieAccept = WebDriverWait(driver, 10).until(
|
34
|
+
# EC.presence_of_element_located(
|
35
|
+
# (By.CSS_SELECTOR, ".cookiemessage__link--close")
|
36
|
+
# )
|
37
|
+
# )
|
38
|
+
# cookieAccept.click()
|
39
39
|
|
40
40
|
# Wait for the postcode field to appear then populate it
|
41
41
|
inputElement_postcode = WebDriverWait(driver, 30).until(
|
@@ -1,8 +1,10 @@
|
|
1
|
+
from datetime import datetime, timedelta
|
2
|
+
from typing import Any, Dict
|
3
|
+
|
1
4
|
from bs4 import BeautifulSoup
|
5
|
+
|
2
6
|
from uk_bin_collection.uk_bin_collection.common import *
|
3
7
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
4
|
-
from datetime import datetime, timedelta
|
5
|
-
from typing import Dict, Any
|
6
8
|
|
7
9
|
|
8
10
|
class CouncilClass(AbstractGetBinDataClass):
|
@@ -78,7 +80,10 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
78
80
|
formatted_date = self.get_next_weekday(day_name)
|
79
81
|
else:
|
80
82
|
# Convert date format from "Tuesday 28 May 2024" to "28/05/2024"
|
81
|
-
|
83
|
+
try:
|
84
|
+
date_obj = datetime.strptime(value, "%A %d %B %Y")
|
85
|
+
except:
|
86
|
+
continue
|
82
87
|
formatted_date = date_obj.strftime("%d/%m/%Y")
|
83
88
|
|
84
89
|
bin_entry = {
|
uk_bin_collection-0.127.3/uk_bin_collection/uk_bin_collection/councils/SurreyHeathBoroughCouncil.py
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
import urllib
|
2
|
+
|
3
|
+
from bs4 import BeautifulSoup
|
4
|
+
|
5
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
6
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
7
|
+
|
8
|
+
|
9
|
+
class CouncilClass(AbstractGetBinDataClass):
|
10
|
+
"""
|
11
|
+
Concrete classes have to implement all abstract operations of the
|
12
|
+
base class. They can also override some operations with a default
|
13
|
+
implementation.
|
14
|
+
"""
|
15
|
+
|
16
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
17
|
+
requests.packages.urllib3.disable_warnings()
|
18
|
+
root_url = "https://asjwsw-wrpsurreyheathmunicipal-live.whitespacews.com/"
|
19
|
+
# Get the house number and postcode from the commandline
|
20
|
+
user_paon = kwargs.get("paon")
|
21
|
+
user_postcode = kwargs.get("postcode")
|
22
|
+
check_postcode(user_postcode)
|
23
|
+
|
24
|
+
# Start a new session for the form, and get the chosen URL from the commandline
|
25
|
+
session = requests.Session()
|
26
|
+
req = session.get(root_url)
|
27
|
+
|
28
|
+
# Parse the requested URL to get a link to the "View My Collections" portal with a unique service ID
|
29
|
+
start = BeautifulSoup(req.text, features="html.parser")
|
30
|
+
start.prettify()
|
31
|
+
base_link = start.select(
|
32
|
+
"#menu-content > div > div:nth-child(1) > p.govuk-body.govuk-\\!-margin-bottom-0.colorblue.lineheight15 > a"
|
33
|
+
)[0].attrs.get("href")
|
34
|
+
|
35
|
+
# We need to reorder the query parts from the unique URL, so split them up to make it easier
|
36
|
+
query_parts = urllib.parse.urlparse(base_link).query.split("&")
|
37
|
+
parts = base_link.split("?")
|
38
|
+
addr_link = (
|
39
|
+
parts[0] + "/mop.php?" + query_parts[1] + "&" + query_parts[0] + "&seq=2"
|
40
|
+
)
|
41
|
+
|
42
|
+
# Bring in some headers to emulate a browser, and put the UPRN and postcode into the form data.
|
43
|
+
# This is sent in a POST request, emulating browser behaviour.
|
44
|
+
headers = {
|
45
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
|
46
|
+
"Accept-Language": "en-GB,en;q=0.9",
|
47
|
+
"Cache-Control": "no-cache",
|
48
|
+
"Connection": "keep-alive",
|
49
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
50
|
+
"Origin": "https://asjwsw-wrpsurreyheathmunicipal-live.whitespacews.com",
|
51
|
+
"Pragma": "no-cache",
|
52
|
+
"Referer": "https://asjwsw-wrpsurreyheathmunicipal-live.whitespacews.com/",
|
53
|
+
"Sec-Fetch-Dest": "document",
|
54
|
+
"Sec-Fetch-Mode": "navigate",
|
55
|
+
"Sec-Fetch-Site": "same-origin",
|
56
|
+
"Sec-Fetch-User": "?1",
|
57
|
+
"Upgrade-Insecure-Requests": "1",
|
58
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 OPR/98.0.0.0",
|
59
|
+
"sec-ch-ua": '"Chromium";v="112", "Not_A Brand";v="24", "Opera GX";v="98"',
|
60
|
+
"sec-ch-ua-mobile": "?0",
|
61
|
+
"sec-ch-ua-platform": '"Windows"',
|
62
|
+
}
|
63
|
+
data = {
|
64
|
+
"address_name_number": user_paon,
|
65
|
+
"address_street": "",
|
66
|
+
"street_town": "",
|
67
|
+
"address_postcode": user_postcode,
|
68
|
+
}
|
69
|
+
addr_page = session.post(addr_link, headers=headers, data=data)
|
70
|
+
addr = BeautifulSoup(addr_page.text, features="html.parser")
|
71
|
+
addr.prettify()
|
72
|
+
|
73
|
+
# This page should only have one address, but regardless, select the first one and make a request to load the
|
74
|
+
# calendar page.
|
75
|
+
cal_link = root_url + addr.select("#property_list > ul > li > a")[0].attrs.get(
|
76
|
+
"href"
|
77
|
+
)
|
78
|
+
cal_page = session.get(cal_link)
|
79
|
+
|
80
|
+
# Parse the calendar page
|
81
|
+
soup = BeautifulSoup(cal_page.text, features="html.parser")
|
82
|
+
soup.prettify()
|
83
|
+
data = {"bins": []}
|
84
|
+
|
85
|
+
# For whatever reason, each row contains all the information for that row, and each one after it. This code
|
86
|
+
# essentially gets all items from each row, but ignores the whitespace that you get when splitting using \n.
|
87
|
+
# This produces a big list of dates then bin types, so we split them up into a list of lists - each pair is
|
88
|
+
# a date and the bin type.
|
89
|
+
items = [
|
90
|
+
i
|
91
|
+
for i in soup.find(
|
92
|
+
"u1",
|
93
|
+
{
|
94
|
+
"class": "displayinlineblock justifycontentleft alignitemscenter margin0 padding0"
|
95
|
+
},
|
96
|
+
).text.split("\n")
|
97
|
+
if i != ""
|
98
|
+
]
|
99
|
+
pairs = [items[i : i + 2] for i in range(0, len(items), 2)]
|
100
|
+
|
101
|
+
# Loop through the paired bin dates and types
|
102
|
+
for pair in pairs:
|
103
|
+
# This isn't necessary, but better safe than sorry
|
104
|
+
collection_date = datetime.strptime(pair[0], date_format).strftime(
|
105
|
+
date_format
|
106
|
+
)
|
107
|
+
# Change the formatting of the purple bins to replace the hyphens with slashes
|
108
|
+
if pair[1] == "Batteries-small electricals-textiles":
|
109
|
+
bin_type = pair[1].replace("-", "/").strip()
|
110
|
+
else:
|
111
|
+
bin_type = pair[1]
|
112
|
+
|
113
|
+
# Add the data into the dictionary
|
114
|
+
data["bins"].append({"type": bin_type, "collectionDate": collection_date})
|
115
|
+
|
116
|
+
return data
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from bs4 import BeautifulSoup
|
2
|
+
|
2
3
|
from uk_bin_collection.uk_bin_collection.common import *
|
3
4
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
4
5
|
|
@@ -31,12 +32,12 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
31
32
|
params = {
|
32
33
|
"RequestType": "LocalInfo",
|
33
34
|
"ms": "ValeOfGlamorgan/AllMaps",
|
34
|
-
"group": "
|
35
|
-
"type": "
|
35
|
+
"group": "Waste|new_refuse",
|
36
|
+
"type": "jsonp",
|
36
37
|
"callback": "AddressInfoCallback",
|
37
38
|
"uid": user_uprn,
|
38
|
-
"import": "
|
39
|
-
"_": "
|
39
|
+
"import": "jQuery35107288886041176057_1736292844067",
|
40
|
+
"_": "1736292844068",
|
40
41
|
}
|
41
42
|
|
42
43
|
# Get a response from the council
|
@@ -46,13 +47,15 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
46
47
|
headers=headers,
|
47
48
|
).text
|
48
49
|
|
50
|
+
response = response.replace("AddressInfoCallback(", "").rstrip(");")
|
51
|
+
|
49
52
|
# Load the JSON and seek out the bin week text, then add it to the calendar URL. Also take the weekly
|
50
53
|
# collection type and generate dates for it. Then make a GET request for the calendar
|
51
54
|
bin_week = str(
|
52
|
-
json.loads(response)["Results"]["
|
55
|
+
json.loads(response)["Results"]["waste"]["roundday_residual"]
|
53
56
|
).replace(" ", "-")
|
54
57
|
weekly_collection = str(
|
55
|
-
json.loads(response)["Results"]["
|
58
|
+
json.loads(response)["Results"]["waste"]["recycling_code"]
|
56
59
|
).capitalize()
|
57
60
|
weekly_dates = get_weekday_dates_in_period(
|
58
61
|
datetime.now(), days_of_week.get(bin_week.split("-")[0].strip()), amount=48
|
@@ -53,6 +53,9 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
53
53
|
|
54
54
|
data = {"bins": []}
|
55
55
|
|
56
|
+
current_year = datetime.now().year
|
57
|
+
next_year = current_year + 1
|
58
|
+
|
56
59
|
# Page has slider info side by side, which are two instances of this class
|
57
60
|
for bin in soup.find_all("div", {"class": "bintxt"}):
|
58
61
|
try:
|
@@ -74,23 +77,31 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
74
77
|
if contains_date(bin_date_info[0]):
|
75
78
|
bin_date = get_next_occurrence_from_day_month(
|
76
79
|
datetime.strptime(
|
77
|
-
bin_date_info[0]
|
78
|
-
"%A %d %B -
|
80
|
+
bin_date_info[0],
|
81
|
+
"%A %d %B -",
|
79
82
|
)
|
80
|
-
)
|
83
|
+
)
|
81
84
|
# On exceptional collection schedule (e.g. around English Bank Holidays), date will be contained in the second stripped string
|
82
85
|
else:
|
83
86
|
bin_date = get_next_occurrence_from_day_month(
|
84
87
|
datetime.strptime(
|
85
|
-
bin_date_info[1]
|
86
|
-
"%A %d %B -
|
88
|
+
bin_date_info[1],
|
89
|
+
"%A %d %B -",
|
87
90
|
)
|
88
|
-
)
|
91
|
+
)
|
89
92
|
except Exception as ex:
|
90
93
|
raise ValueError(f"Error parsing bin data: {ex}")
|
91
94
|
|
95
|
+
if (datetime.now().month == 12) and (bin_date.month == 1):
|
96
|
+
bin_date = bin_date.replace(year=next_year)
|
97
|
+
else:
|
98
|
+
bin_date = bin_date.replace(year=current_year)
|
99
|
+
|
92
100
|
# Build data dict for each entry
|
93
|
-
dict_data = {
|
101
|
+
dict_data = {
|
102
|
+
"type": bin_type,
|
103
|
+
"collectionDate": bin_date.strftime(date_format),
|
104
|
+
}
|
94
105
|
data["bins"].append(dict_data)
|
95
106
|
|
96
107
|
data["bins"].sort(
|
@@ -42,14 +42,14 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
42
42
|
wait = WebDriverWait(driver, 60)
|
43
43
|
address_entry_field = wait.until(
|
44
44
|
EC.presence_of_element_located(
|
45
|
-
(By.XPATH, '//*[@id="combobox-input-
|
45
|
+
(By.XPATH, '//*[@id="combobox-input-20"]')
|
46
46
|
)
|
47
47
|
)
|
48
48
|
|
49
49
|
address_entry_field.send_keys(str(full_address))
|
50
50
|
|
51
51
|
address_entry_field = wait.until(
|
52
|
-
EC.element_to_be_clickable((By.XPATH, '//*[@id="combobox-input-
|
52
|
+
EC.element_to_be_clickable((By.XPATH, '//*[@id="combobox-input-20"]'))
|
53
53
|
)
|
54
54
|
address_entry_field.click()
|
55
55
|
address_entry_field.send_keys(Keys.BACKSPACE)
|
@@ -57,7 +57,7 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
57
57
|
|
58
58
|
first_found_address = wait.until(
|
59
59
|
EC.element_to_be_clickable(
|
60
|
-
(By.XPATH, '//*[@id="dropdown-element-
|
60
|
+
(By.XPATH, '//*[@id="dropdown-element-20"]/ul')
|
61
61
|
)
|
62
62
|
)
|
63
63
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|