uk_bin_collection 0.104.0__tar.gz → 0.105.1__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/PKG-INFO +1 -1
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/pyproject.toml +1 -1
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/input.json +33 -3
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +41 -25
- uk_bin_collection-0.105.1/uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py +51 -0
- uk_bin_collection-0.105.1/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py +58 -0
- uk_bin_collection-0.105.1/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +147 -0
- uk_bin_collection-0.105.1/uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py +59 -0
- uk_bin_collection-0.105.1/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py +72 -0
- uk_bin_collection-0.104.0/uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py +0 -68
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/LICENSE +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/README.md +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/README.rst +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/features/environment.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/output.schema +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_collect_data.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_common_functions.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_conftest.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_get_data.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/common.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
- {uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -0
@@ -299,6 +299,12 @@
|
|
299
299
|
"wiki_name": "Cornwall Council",
|
300
300
|
"wiki_note": "Use https://uprn.uk/ to find your UPRN."
|
301
301
|
},
|
302
|
+
"CoventryCityCouncil": {
|
303
|
+
"url": "https://www.coventry.gov.uk/directory-record/56384/abberton-way-",
|
304
|
+
"wiki_command_url_override": "https://www.coventry.gov.uk/directory_record/XXXXXX/XXXXXX",
|
305
|
+
"wiki_name": "Coventry City Council",
|
306
|
+
"wiki_note": "Follow the instructions [here](https://www.coventry.gov.uk/bin-collection-calendar) until you get the page that shows the weekly collections for your address then copy the URL and replace the URL in the command."
|
307
|
+
},
|
302
308
|
"CrawleyBoroughCouncil": {
|
303
309
|
"house_number": "9701076",
|
304
310
|
"skip_get_url": true,
|
@@ -537,6 +543,13 @@
|
|
537
543
|
"wiki_name": "Halton Borough Council",
|
538
544
|
"wiki_note": "Pass the House number and post code"
|
539
545
|
},
|
546
|
+
"HarboroughDistrictCouncil": {
|
547
|
+
"url": "https://www.harborough.gov.uk",
|
548
|
+
"wiki_command_url_override": "https://www.harborough.gov.uk",
|
549
|
+
"uprn": "100030489072",
|
550
|
+
"wiki_name": "Harborough District Council",
|
551
|
+
"wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
|
552
|
+
},
|
540
553
|
"HaringeyCouncil": {
|
541
554
|
"skip_get_url": true,
|
542
555
|
"uprn": "100021203052",
|
@@ -741,10 +754,12 @@
|
|
741
754
|
"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.)."
|
742
755
|
},
|
743
756
|
"MidlothianCouncil": {
|
744
|
-
"
|
745
|
-
"
|
757
|
+
"house_number": "52",
|
758
|
+
"postcode": "EH19 2EB",
|
759
|
+
"skip_get_url": true,
|
760
|
+
"url": "https://www.midlothian.gov.uk/info/1054/bins_and_recycling/343/bin_collection_days",
|
746
761
|
"wiki_name": "Midlothian Council",
|
747
|
-
"wiki_note": "
|
762
|
+
"wiki_note": "Pass the house name/number wrapped in double quotes along with the postcode parameter"
|
748
763
|
},
|
749
764
|
"MidSussexDistrictCouncil": {
|
750
765
|
"house_number": "OAKLANDS, OAKLANDS ROAD RH16 1SS",
|
@@ -1229,6 +1244,14 @@
|
|
1229
1244
|
"url": "https://tdcws01.tandridge.gov.uk/TDCWebAppsPublic/tfaBranded/408?utm_source=pressrelease&utm_medium=smposts&utm_campaign=check_my_bin_day",
|
1230
1245
|
"wiki_name": "Tandridge District Council"
|
1231
1246
|
},
|
1247
|
+
"TeignbridgeCouncil": {
|
1248
|
+
"url": "https://www.google.co.uk",
|
1249
|
+
"wiki_command_url_override": "https://www.google.co.uk",
|
1250
|
+
"uprn": "100040338776",
|
1251
|
+
"web_driver": "http://selenium:4444",
|
1252
|
+
"wiki_name": "Teignbridge Council",
|
1253
|
+
"wiki_note": "Provide Google as the URL as the real URL breaks the integration. You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
|
1254
|
+
},
|
1232
1255
|
"TelfordAndWrekinCouncil": {
|
1233
1256
|
"skip_get_url": true,
|
1234
1257
|
"uprn": "000452015013",
|
@@ -1338,6 +1361,13 @@
|
|
1338
1361
|
"wiki_name": "Warwick District Council",
|
1339
1362
|
"wiki_note": "Replace XXXXXXXX with UPRN."
|
1340
1363
|
},
|
1364
|
+
"WatfordBoroughCouncil": {
|
1365
|
+
"url": "https://www.watford.gov.uk",
|
1366
|
+
"wiki_command_url_override": "https://www.watford.gov.uk",
|
1367
|
+
"uprn": "100080942183",
|
1368
|
+
"wiki_name": "Watford Borough Council",
|
1369
|
+
"wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
|
1370
|
+
},
|
1341
1371
|
"WaverleyBoroughCouncil": {
|
1342
1372
|
"house_number": "23",
|
1343
1373
|
"postcode": "GU9 9QG",
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Dict, Any
|
1
|
+
from typing import Dict, List, Any
|
2
2
|
from bs4 import BeautifulSoup
|
3
3
|
from dateutil.relativedelta import relativedelta
|
4
4
|
import requests
|
@@ -11,6 +11,30 @@ from uk_bin_collection.uk_bin_collection.common import (
|
|
11
11
|
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
12
12
|
|
13
13
|
|
14
|
+
def parse_bin_text(bin_type_str: str, bin_date_str: str) -> List[Dict[str, str]]:
|
15
|
+
"""
|
16
|
+
Takes a raw bin and date string, parses the bin(s) and date, then returns
|
17
|
+
a list of bins with their date.
|
18
|
+
"""
|
19
|
+
|
20
|
+
bins = []
|
21
|
+
|
22
|
+
if bin_date_str == "Today":
|
23
|
+
bin_date = datetime.today()
|
24
|
+
elif bin_date_str == "Tomorrow":
|
25
|
+
bin_date = datetime.today() + relativedelta(days=1)
|
26
|
+
else:
|
27
|
+
bin_date = datetime.strptime(bin_date_str, "%A, %B %d, %Y")
|
28
|
+
|
29
|
+
for bin_type in bin_type_str.split(", "):
|
30
|
+
bins.append({
|
31
|
+
"type": bin_type.strip() + " bin",
|
32
|
+
"collectionDate": bin_date.strftime(date_format)
|
33
|
+
})
|
34
|
+
|
35
|
+
return bins
|
36
|
+
|
37
|
+
|
14
38
|
class CouncilClass(AbstractGetBinDataClass):
|
15
39
|
"""
|
16
40
|
Concrete classes have to implement all abstract operations of the
|
@@ -73,37 +97,29 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
73
97
|
bin_date_str = highlight_content.find(
|
74
98
|
"em", {"class": "ui-bin-next-date"}
|
75
99
|
).text.strip()
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
)
|
100
|
+
bin_type_str = highlight_content.find(
|
101
|
+
"p", {"class": "ui-bin-next-type"}
|
102
|
+
).text.strip()
|
80
103
|
|
81
|
-
|
82
|
-
bin_date = datetime.today()
|
83
|
-
elif bin_date_str == "Tomorrow":
|
84
|
-
bin_date = datetime.today() + relativedelta(days=1)
|
85
|
-
else:
|
86
|
-
bin_date = datetime.strptime(bin_date_str, "%A, %B %d, %Y")
|
104
|
+
data["bins"].extend(parse_bin_text(bin_type_str, bin_date_str))
|
87
105
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
}
|
92
|
-
data["bins"].append(dict_data)
|
106
|
+
# Hold bins we already got from next collection, to avoid re-adding
|
107
|
+
# from upcoming collections.
|
108
|
+
used_bins = set(bin["type"] for bin in data["bins"])
|
93
109
|
|
94
110
|
# Upcoming collections
|
95
111
|
upcoming_collections = results[1].find("tbody").find_all("tr")
|
96
112
|
for row in upcoming_collections:
|
97
113
|
columns = row.find_all("td")
|
98
114
|
bin_date_str = columns[0].text.strip()
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
"
|
105
|
-
|
106
|
-
|
107
|
-
|
115
|
+
bin_type_str = columns[1].text.strip()
|
116
|
+
|
117
|
+
# Only add to bin list if not already present.
|
118
|
+
for bin in parse_bin_text(bin_type_str, bin_date_str):
|
119
|
+
if bin["type"] not in used_bins:
|
120
|
+
data["bins"].append(bin)
|
121
|
+
|
122
|
+
# Add to used bins, so future collections are not re-added.
|
123
|
+
used_bins.add(bin["type"])
|
108
124
|
|
109
125
|
return data
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import requests
|
2
|
+
from bs4 import BeautifulSoup
|
3
|
+
from dateutil.relativedelta import relativedelta
|
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
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
10
|
+
class CouncilClass(AbstractGetBinDataClass):
|
11
|
+
"""
|
12
|
+
Concrete classes have to implement all abstract operations of the
|
13
|
+
base class. They can also override some operations with a default
|
14
|
+
implementation.
|
15
|
+
"""
|
16
|
+
|
17
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
18
|
+
|
19
|
+
bindata = {"bins": []}
|
20
|
+
curr_date = datetime.today()
|
21
|
+
|
22
|
+
soup = BeautifulSoup(page.content, features="html.parser")
|
23
|
+
button = soup.find("a", text="Find out which bin will be collected when.")
|
24
|
+
|
25
|
+
if button["href"]:
|
26
|
+
URI = button["href"]
|
27
|
+
# Make the GET request
|
28
|
+
response = requests.get(URI)
|
29
|
+
soup = BeautifulSoup(response.content, features="html.parser")
|
30
|
+
divs = soup.find_all("div", {"class": "editor"})
|
31
|
+
for div in divs:
|
32
|
+
lis = div.find_all("li")
|
33
|
+
for li in lis:
|
34
|
+
collection = li.text.split(": ")
|
35
|
+
collection_date = datetime.strptime(
|
36
|
+
collection[0],
|
37
|
+
"%A %d %B",
|
38
|
+
).replace(year=curr_date.year)
|
39
|
+
if curr_date.month == 12 and collection_date.month == 1:
|
40
|
+
collection_date = collection_date + relativedelta(years=1)
|
41
|
+
bin_types = collection[1].split(" and ")
|
42
|
+
for bin_type in bin_types:
|
43
|
+
dict_data = {
|
44
|
+
"type": bin_type,
|
45
|
+
"collectionDate": collection_date.strftime("%d/%m/%Y"),
|
46
|
+
}
|
47
|
+
bindata["bins"].append(dict_data)
|
48
|
+
else:
|
49
|
+
print("Failed to find bin schedule")
|
50
|
+
|
51
|
+
return bindata
|
uk_bin_collection-0.105.1/uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
import requests
|
2
|
+
from bs4 import BeautifulSoup
|
3
|
+
|
4
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
5
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
6
|
+
|
7
|
+
|
8
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
9
|
+
class CouncilClass(AbstractGetBinDataClass):
|
10
|
+
"""
|
11
|
+
Concrete classes have to implement all abstract operations of the
|
12
|
+
base class. They can also override some operations with a default
|
13
|
+
implementation.
|
14
|
+
"""
|
15
|
+
|
16
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
17
|
+
|
18
|
+
user_uprn = kwargs.get("uprn")
|
19
|
+
check_uprn(user_uprn)
|
20
|
+
bindata = {"bins": []}
|
21
|
+
|
22
|
+
URI = "https://harborough.fccenvironment.co.uk/detail-address"
|
23
|
+
|
24
|
+
headers = {
|
25
|
+
"Content-Type": "application/json",
|
26
|
+
"User-Agent": "Mozilla/5.0",
|
27
|
+
"Referer": "https://harborough.fccenvironment.co.uk/",
|
28
|
+
}
|
29
|
+
params = {"Uprn": user_uprn}
|
30
|
+
response = requests.post(URI, headers=headers, json=params)
|
31
|
+
|
32
|
+
soup = BeautifulSoup(response.content, features="html.parser")
|
33
|
+
bin_collection = soup.find(
|
34
|
+
"div", {"class": "blocks block-your-next-scheduled-bin-collection-days"}
|
35
|
+
)
|
36
|
+
lis = bin_collection.find_all("li")
|
37
|
+
for li in lis:
|
38
|
+
try:
|
39
|
+
split = re.match(r"(.+)\s(\d{1,2} \w+ \d{4})$", li.text)
|
40
|
+
bin_type = split.group(1).strip()
|
41
|
+
date = split.group(2)
|
42
|
+
|
43
|
+
dict_data = {
|
44
|
+
"type": bin_type,
|
45
|
+
"collectionDate": datetime.strptime(
|
46
|
+
date,
|
47
|
+
"%d %B %Y",
|
48
|
+
).strftime("%d/%m/%Y"),
|
49
|
+
}
|
50
|
+
bindata["bins"].append(dict_data)
|
51
|
+
except:
|
52
|
+
continue
|
53
|
+
|
54
|
+
bindata["bins"].sort(
|
55
|
+
key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
|
56
|
+
)
|
57
|
+
|
58
|
+
return bindata
|
@@ -0,0 +1,147 @@
|
|
1
|
+
from urllib.parse import quote, urljoin
|
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
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
10
|
+
class CouncilClass(AbstractGetBinDataClass):
|
11
|
+
"""
|
12
|
+
Concrete classes have to implement all abstract operations of the
|
13
|
+
base class. They can also override some operations with a default
|
14
|
+
implementation.
|
15
|
+
"""
|
16
|
+
|
17
|
+
BASE_URL = "https://www.midlothian.gov.uk"
|
18
|
+
DIRECTORY_URL = f"{BASE_URL}/site/scripts/directory_search.php?directoryID=35&keywords={{}}&search=Search"
|
19
|
+
BIN_TYPES = {
|
20
|
+
"Next recycling collection": "Recycling",
|
21
|
+
"Next grey bin collection": "Grey Bin",
|
22
|
+
"Next brown bin collection": "Brown Bin",
|
23
|
+
"Next food bin collection": "Food Bin",
|
24
|
+
}
|
25
|
+
|
26
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
27
|
+
|
28
|
+
house_identifier = kwargs.get(
|
29
|
+
"paon", ""
|
30
|
+
).strip() # Could be house number or name
|
31
|
+
postcode = kwargs.get("postcode")
|
32
|
+
|
33
|
+
# Check if both house identifier and postcode are provided
|
34
|
+
if not house_identifier:
|
35
|
+
print("Error: House identifier (number or name) must be provided.")
|
36
|
+
return {"bins": []}
|
37
|
+
|
38
|
+
if not postcode:
|
39
|
+
print("Error: Postcode must be provided.")
|
40
|
+
return {"bins": []}
|
41
|
+
|
42
|
+
check_postcode(postcode)
|
43
|
+
check_paon(house_identifier)
|
44
|
+
|
45
|
+
data = {"bins": []}
|
46
|
+
search_url = self.DIRECTORY_URL.format(quote(postcode))
|
47
|
+
|
48
|
+
try:
|
49
|
+
search_results_html = requests.get(search_url)
|
50
|
+
search_results_html.raise_for_status()
|
51
|
+
|
52
|
+
soup = BeautifulSoup(search_results_html.text, "html.parser")
|
53
|
+
address_link = self._get_result_by_identifier(soup, house_identifier)
|
54
|
+
|
55
|
+
if address_link:
|
56
|
+
collections_url = urljoin(search_url, address_link["href"])
|
57
|
+
bin_collection_data = self._fetch_bin_collection_data(collections_url)
|
58
|
+
|
59
|
+
if bin_collection_data:
|
60
|
+
data["bins"].extend(bin_collection_data)
|
61
|
+
|
62
|
+
except requests.RequestException as e:
|
63
|
+
print(f"Warning: Failed to fetch data from {search_url}. Error: {e}")
|
64
|
+
|
65
|
+
return data
|
66
|
+
|
67
|
+
def _get_result_by_identifier(self, soup, identifier: str) -> list:
|
68
|
+
"""Extract the result link that matches the given house number or house name."""
|
69
|
+
try:
|
70
|
+
results_list = (
|
71
|
+
soup.find("article", class_="container")
|
72
|
+
.find("h2", text="Search results")
|
73
|
+
.find_next("ul", class_="item-list item-list__rich")
|
74
|
+
)
|
75
|
+
|
76
|
+
pattern = re.compile(re.escape(identifier.lower()) + r"[ ,]")
|
77
|
+
|
78
|
+
for item in results_list.find_all("li"):
|
79
|
+
address_link = item.find("a")
|
80
|
+
if address_link:
|
81
|
+
link_text = address_link.text.strip().lower()
|
82
|
+
if pattern.match(link_text):
|
83
|
+
return address_link
|
84
|
+
|
85
|
+
print(f"Warning: No results found for identifier '{identifier}'.")
|
86
|
+
return None # Return None if no match is found
|
87
|
+
|
88
|
+
except AttributeError as e:
|
89
|
+
print(f"Warning: Could not find the search results. Error: {e}")
|
90
|
+
return None # Return None if no result found
|
91
|
+
|
92
|
+
def _fetch_bin_collection_data(self, url: str) -> list:
|
93
|
+
"""Fetch and parse bin collection data from the given URL."""
|
94
|
+
try:
|
95
|
+
bin_collection_html = requests.get(url)
|
96
|
+
bin_collection_html.raise_for_status()
|
97
|
+
|
98
|
+
soup = BeautifulSoup(bin_collection_html.text, "html.parser")
|
99
|
+
bin_collections = soup.find("ul", class_="data-table")
|
100
|
+
|
101
|
+
if bin_collections:
|
102
|
+
return self._parse_bin_collection_items(
|
103
|
+
bin_collections.find_all("li")[2:] # Skip the first two items
|
104
|
+
)
|
105
|
+
|
106
|
+
except requests.RequestException as e:
|
107
|
+
print(
|
108
|
+
f"Warning: Failed to fetch bin collection data from {url}. Error: {e}"
|
109
|
+
)
|
110
|
+
|
111
|
+
return [] # Return an empty list on error
|
112
|
+
|
113
|
+
def _parse_bin_collection_items(self, bin_items: list) -> list:
|
114
|
+
"""Parse bin collection items into a structured format."""
|
115
|
+
parsed_bins = []
|
116
|
+
|
117
|
+
for bin_item in bin_items:
|
118
|
+
bin_type = None
|
119
|
+
try:
|
120
|
+
if bin_item.h2 and bin_item.h2.text.strip() in self.BIN_TYPES:
|
121
|
+
bin_type = self.BIN_TYPES[bin_item.h2.text.strip()]
|
122
|
+
|
123
|
+
bin_collection_date = None
|
124
|
+
if bin_item.div and bin_item.div.text.strip():
|
125
|
+
try:
|
126
|
+
bin_collection_date = datetime.strptime(
|
127
|
+
bin_item.div.text.strip(), "%A %d/%m/%Y"
|
128
|
+
).strftime(date_format)
|
129
|
+
except ValueError:
|
130
|
+
print(
|
131
|
+
f"Warning: Date parsing failed for {bin_item.div.text.strip()}."
|
132
|
+
)
|
133
|
+
|
134
|
+
if bin_type and bin_collection_date:
|
135
|
+
parsed_bins.append(
|
136
|
+
{
|
137
|
+
"type": bin_type,
|
138
|
+
"collectionDate": bin_collection_date,
|
139
|
+
}
|
140
|
+
)
|
141
|
+
else:
|
142
|
+
print(f"Warning: Missing data for bin item: {bin_item}")
|
143
|
+
|
144
|
+
except Exception as e:
|
145
|
+
print(f"Warning: An error occurred while parsing bin item. Error: {e}")
|
146
|
+
|
147
|
+
return parsed_bins
|
@@ -0,0 +1,59 @@
|
|
1
|
+
from bs4 import BeautifulSoup
|
2
|
+
from selenium.webdriver.common.by import By
|
3
|
+
from selenium.webdriver.support import expected_conditions as EC
|
4
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
5
|
+
|
6
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
7
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
8
|
+
|
9
|
+
|
10
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
11
|
+
class CouncilClass(AbstractGetBinDataClass):
|
12
|
+
"""
|
13
|
+
Concrete classes have to implement all abstract operations of the
|
14
|
+
base class. They can also override some operations with a default
|
15
|
+
implementation.
|
16
|
+
"""
|
17
|
+
|
18
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
19
|
+
|
20
|
+
user_uprn = kwargs.get("uprn")
|
21
|
+
web_driver = kwargs.get("web_driver")
|
22
|
+
headless = kwargs.get("headless")
|
23
|
+
check_uprn(user_uprn)
|
24
|
+
bindata = {"bins": []}
|
25
|
+
|
26
|
+
URI = f"https://www.teignbridge.gov.uk/repositories/hidden-pages/bin-finder?uprn={user_uprn}"
|
27
|
+
|
28
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
29
|
+
driver.get(URI)
|
30
|
+
|
31
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
32
|
+
|
33
|
+
collection_dates = soup.find_all(
|
34
|
+
"h3"
|
35
|
+
) # Assuming bin types are inside <h3> tags
|
36
|
+
bin_type_headers = soup.find_all(
|
37
|
+
"div", {"class": "binInfoContainer"}
|
38
|
+
) # Assuming collection dates are inside <p> tags
|
39
|
+
|
40
|
+
# Iterate over the results and extract bin type and collection dates
|
41
|
+
for i, date in enumerate(collection_dates):
|
42
|
+
collection_date = date.get_text(strip=True)
|
43
|
+
|
44
|
+
bin_types = bin_type_headers[i].find_all("div")
|
45
|
+
for bin_type in bin_types:
|
46
|
+
dict_data = {
|
47
|
+
"type": bin_type.text.strip(),
|
48
|
+
"collectionDate": datetime.strptime(
|
49
|
+
collection_date,
|
50
|
+
"%d %B %Y%A",
|
51
|
+
).strftime("%d/%m/%Y"),
|
52
|
+
}
|
53
|
+
bindata["bins"].append(dict_data)
|
54
|
+
|
55
|
+
bindata["bins"].sort(
|
56
|
+
key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
|
57
|
+
)
|
58
|
+
|
59
|
+
return bindata
|
uk_bin_collection-0.105.1/uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
import time
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from bs4 import BeautifulSoup
|
5
|
+
|
6
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
7
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
8
|
+
|
9
|
+
|
10
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
11
|
+
class CouncilClass(AbstractGetBinDataClass):
|
12
|
+
"""
|
13
|
+
Concrete classes have to implement all abstract operations of the
|
14
|
+
base class. They can also override some operations with a default
|
15
|
+
implementation.
|
16
|
+
"""
|
17
|
+
|
18
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
19
|
+
|
20
|
+
user_uprn = kwargs.get("uprn")
|
21
|
+
check_uprn(user_uprn)
|
22
|
+
bindata = {"bins": []}
|
23
|
+
|
24
|
+
SESSION_URL = "https://watfordbc-self.achieveservice.com/authapi/isauthenticated?uri=https%253A%252F%252Fwatfordbc-self.achieveservice.com%252Fen%252Fservice%252FBin_collections%253Faccept%253Dyes%2526consentMessageIds%255B%255D%253D4&hostname=watfordbc-self.achieveservice.com&withCredentials=true"
|
25
|
+
|
26
|
+
API_URL = "https://watfordbc-self.achieveservice.com/apibroker/runLookup"
|
27
|
+
|
28
|
+
data = {
|
29
|
+
"formValues": {
|
30
|
+
"Address": {
|
31
|
+
"echoUprn": {"value": user_uprn},
|
32
|
+
},
|
33
|
+
},
|
34
|
+
}
|
35
|
+
|
36
|
+
headers = {
|
37
|
+
"Content-Type": "application/json",
|
38
|
+
"Accept": "application/json",
|
39
|
+
"User-Agent": "Mozilla/5.0",
|
40
|
+
"X-Requested-With": "XMLHttpRequest",
|
41
|
+
"Referer": "https://watfordbc-self.achieveservice.com/fillform/?iframe_id=fillform-frame-1&db_id=",
|
42
|
+
}
|
43
|
+
s = requests.session()
|
44
|
+
r = s.get(SESSION_URL)
|
45
|
+
r.raise_for_status()
|
46
|
+
session_data = r.json()
|
47
|
+
sid = session_data["auth-session"]
|
48
|
+
params = {
|
49
|
+
"id": "5e79edf15b2ec",
|
50
|
+
"repeat_against": "",
|
51
|
+
"noRetry": "true",
|
52
|
+
"getOnlyTokens": "undefined",
|
53
|
+
"log_id": "",
|
54
|
+
"app_name": "AF-Renderer::Self",
|
55
|
+
# unix_timestamp
|
56
|
+
"_": str(int(time.time() * 1000)),
|
57
|
+
"sid": sid,
|
58
|
+
}
|
59
|
+
r = s.post(API_URL, json=data, headers=headers, params=params)
|
60
|
+
r.raise_for_status()
|
61
|
+
data = r.json()
|
62
|
+
dispHTML = data["integration"]["transformed"]["rows_data"]["0"]["dispHTML"]
|
63
|
+
soup = BeautifulSoup(dispHTML, features="html.parser")
|
64
|
+
|
65
|
+
collections = soup.find_all("li")
|
66
|
+
for collection in collections:
|
67
|
+
bin_type = collection.find("h3").text
|
68
|
+
collection_date = collection.find("strong").text.strip()
|
69
|
+
dict_data = {"type": bin_type, "collectionDate": collection_date}
|
70
|
+
bindata["bins"].append(dict_data)
|
71
|
+
|
72
|
+
return bindata
|
@@ -1,68 +0,0 @@
|
|
1
|
-
from bs4 import BeautifulSoup
|
2
|
-
|
3
|
-
from uk_bin_collection.uk_bin_collection.common import *
|
4
|
-
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
5
|
-
|
6
|
-
|
7
|
-
# import the wonderful Beautiful Soup and the URL grabber
|
8
|
-
class CouncilClass(AbstractGetBinDataClass):
|
9
|
-
"""
|
10
|
-
Concrete classes have to implement all abstract operations of the
|
11
|
-
base class. They can also override some operations with a default
|
12
|
-
implementation.
|
13
|
-
"""
|
14
|
-
|
15
|
-
def parse_data(self, page: str, **kwargs) -> dict:
|
16
|
-
# Parse the HTML content using BeautifulSoup
|
17
|
-
soup = BeautifulSoup(page.text, features="html.parser")
|
18
|
-
|
19
|
-
# Initialize a dictionary to store the parsed bin data
|
20
|
-
data = {"bins": []}
|
21
|
-
|
22
|
-
# Define a mapping of bin collection labels to their corresponding types
|
23
|
-
bin_types = {
|
24
|
-
"Next recycling collection": "Recycling",
|
25
|
-
"Next grey bin collection": "Grey Bin",
|
26
|
-
"Next brown bin collection": "Brown Bin",
|
27
|
-
"Next food bin collection": "Food Bin",
|
28
|
-
}
|
29
|
-
|
30
|
-
# Locate the <ul> element with the class "data-table"
|
31
|
-
bin_collections = soup.find("ul", {"class": "data-table"})
|
32
|
-
|
33
|
-
# Proceed only if the <ul> element is found
|
34
|
-
if bin_collections:
|
35
|
-
# Retrieve all <li> elements within the <ul>, skipping the first two (not relevant)
|
36
|
-
bin_items = bin_collections.find_all("li")[2:]
|
37
|
-
|
38
|
-
# Iterate through each bin item
|
39
|
-
for bin in bin_items:
|
40
|
-
bin_type = None
|
41
|
-
# Retrieve the bin type from the header if it exists
|
42
|
-
if bin.h2 and bin.h2.text.strip() in bin_types:
|
43
|
-
bin_type = bin_types[bin.h2.text.strip()]
|
44
|
-
|
45
|
-
bin_collection_date = None
|
46
|
-
# Retrieve the bin collection date from the div if it exists
|
47
|
-
if bin.div and bin.div.text.strip():
|
48
|
-
try:
|
49
|
-
# Parse the collection date from the div text and format it
|
50
|
-
bin_collection_date = datetime.strptime(
|
51
|
-
bin.div.text.strip(),
|
52
|
-
"%A %d/%m/%Y",
|
53
|
-
).strftime(date_format)
|
54
|
-
except ValueError:
|
55
|
-
# If date parsing fails, keep bin_collection_date as None
|
56
|
-
pass
|
57
|
-
|
58
|
-
# If both bin type and collection date are identified, add to the data
|
59
|
-
if bin_type and bin_collection_date:
|
60
|
-
data["bins"].append(
|
61
|
-
{
|
62
|
-
"type": bin_type,
|
63
|
-
"collectionDate": bin_collection_date,
|
64
|
-
}
|
65
|
-
)
|
66
|
-
|
67
|
-
# Return the parsed data, which may be empty if no bins were found
|
68
|
-
return data
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/output.schema
RENAMED
File without changes
|
File without changes
|
File without changes
|
{uk_bin_collection-0.104.0 → uk_bin_collection-0.105.1}/uk_bin_collection/tests/test_collect_data.py
RENAMED
File without changes
|
File without changes
|