Full Code of robbrad/UKBinCollectionData for AI

master 60bd3ccee981 cached
442 files
3.7 MB
1.0M tokens
1241 symbols
1 requests
Download .txt
Showing preview only (4,031K chars total). Download the full file or copy to clipboard to get everything.
Repository: robbrad/UKBinCollectionData
Branch: master
Commit: 60bd3ccee981
Files: 442
Total size: 3.7 MB

Directory structure:
gitextract_9uhgfajq/

├── .devcontainer/
│   ├── dev.Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml
├── .dockerignore
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── COUNCIL_ISSUE.yaml
│   │   ├── COUNCIL_REQUEST.yaml
│   │   └── HOME_ASSISTANT_CUSTOM_COMPONENT_ISSUE.yaml
│   ├── dependabot.yaml
│   └── workflows/
│       ├── behave_pull_request.yml
│       ├── behave_schedule.yml
│       ├── bump.yml
│       ├── codeql-analysis.yml
│       ├── docker-image.yml
│       ├── ha_compatibility_test.yml
│       ├── hacs_validation.yml
│       ├── lint.yml
│       ├── release.yml
│       ├── rollback-release.yml
│       ├── validate-release-ready.yml
│       └── wiki.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── COMPATIBILITY.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── behave.ini
├── bin_to_ics.py
├── conftest.py
├── custom_components/
│   ├── __init__.py
│   └── uk_bin_collection/
│       ├── README.md
│       ├── __init__.py
│       ├── calendar.py
│       ├── config_flow.py
│       ├── const.py
│       ├── manifest.json
│       ├── sensor.py
│       ├── services.yaml
│       ├── strings.json
│       ├── tests/
│       │   ├── __init__.py
│       │   ├── common_utils.py
│       │   ├── test_calendar.py
│       │   ├── test_config_flow.py
│       │   ├── test_init.py
│       │   └── test_sensor.py
│       └── translations/
│           ├── cy.json
│           ├── en.json
│           ├── ga.json
│           ├── gd.json
│           └── pt.json
├── docs/
│   ├── RELEASE-SETUP-SUMMARY.md
│   ├── deploy-key-setup.md
│   ├── example_council.md
│   ├── github-app-setup.md
│   ├── github-app-troubleshooting.md
│   ├── manual-tag-fix.md
│   ├── release-quick-reference.md
│   ├── release-workflow-branch-protection.md
│   ├── release-workflow-diagram.md
│   ├── release-workflow-fixes.md
│   ├── release-workflow-migration.md
│   ├── release-workflow-setup-checklist.md
│   ├── release-workflow.md
│   ├── rollback-release.md
│   ├── utilities.md
│   ├── workflow-improvements-summary.md
│   └── workflow-naming-conventions.md
├── hacs.json
├── poetry.lock
├── pyproject.toml
├── pytest.ini
├── scripts/
│   └── check_ha_compatibility.py
├── uk_bin_collection/
│   ├── Local_Authority_Boundaries.geojson
│   ├── README.rst
│   ├── compare_lad_codes.py
│   ├── map.html
│   ├── tests/
│   │   ├── check_selenium_url_in_input.json.py
│   │   ├── council_feature_input_parity.py
│   │   ├── features/
│   │   │   ├── environment.py
│   │   │   └── validate_council_outputs.feature
│   │   ├── generate_map_test_results.py
│   │   ├── input.json
│   │   ├── output.schema
│   │   ├── step_defs/
│   │   │   ├── step_helpers/
│   │   │   │   └── file_handler.py
│   │   │   └── test_validate_council.py
│   │   ├── test_collect_data.py
│   │   ├── test_common_functions.py
│   │   ├── test_conftest.py
│   │   └── test_get_data.py
│   └── uk_bin_collection/
│       ├── collect_data.py
│       ├── common.py
│       ├── councils/
│       │   ├── AberdeenCityCouncil.py
│       │   ├── AberdeenshireCouncil.py
│       │   ├── AdurAndWorthingCouncils.py
│       │   ├── AmberValleyBoroughCouncil.py
│       │   ├── AngusCouncil.py
│       │   ├── AntrimAndNewtonabbeyCouncil.py
│       │   ├── ArdsAndNorthDownCouncil.py
│       │   ├── ArgyllandButeCouncil.py
│       │   ├── ArmaghBanbridgeCraigavonCouncil.py
│       │   ├── ArunCouncil.py
│       │   ├── AshfieldDistrictCouncil.py
│       │   ├── AshfordBoroughCouncil.py
│       │   ├── BCPCouncil.py
│       │   ├── BaberghDistrictCouncil.py
│       │   ├── BarkingDagenham.py
│       │   ├── BarnetCouncil.py
│       │   ├── BarnsleyMBCouncil.py
│       │   ├── BasildonCouncil.py
│       │   ├── BasingstokeCouncil.py
│       │   ├── BathAndNorthEastSomersetCouncil.py
│       │   ├── BedfordBoroughCouncil.py
│       │   ├── BedfordshireCouncil.py
│       │   ├── BelfastCityCouncil.py
│       │   ├── BexleyCouncil.py
│       │   ├── BirminghamCityCouncil.py
│       │   ├── BlabyDistrictCouncil.py
│       │   ├── BlackburnCouncil.py
│       │   ├── BlackpoolCouncil.py
│       │   ├── BlaenauGwentCountyBoroughCouncil.py
│       │   ├── BolsoverCouncil.py
│       │   ├── BoltonCouncil.py
│       │   ├── BostonBoroughCouncil.py
│       │   ├── BracknellForestCouncil.py
│       │   ├── BradfordMDC.py
│       │   ├── BraintreeDistrictCouncil.py
│       │   ├── BrecklandCouncil.py
│       │   ├── BrentCouncil.py
│       │   ├── BrightonandHoveCityCouncil.py
│       │   ├── BristolCityCouncil.py
│       │   ├── BroadlandDistrictCouncil.py
│       │   ├── BromleyBoroughCouncil.py
│       │   ├── BromsgroveDistrictCouncil.py
│       │   ├── BroxbourneCouncil.py
│       │   ├── BroxtoweBoroughCouncil.py
│       │   ├── BuckinghamshireCouncil.py
│       │   ├── BurnleyBoroughCouncil.py
│       │   ├── BuryCouncil.py
│       │   ├── CalderdaleCouncil.py
│       │   ├── CambridgeCityCouncil.py
│       │   ├── CannockChaseDistrictCouncil.py
│       │   ├── CanterburyCityCouncil.py
│       │   ├── CardiffCouncil.py
│       │   ├── CarmarthenshireCountyCouncil.py
│       │   ├── CastlepointDistrictCouncil.py
│       │   ├── CeredigionCountyCouncil.py
│       │   ├── CharnwoodBoroughCouncil.py
│       │   ├── ChelmsfordCityCouncil.py
│       │   ├── CheltenhamBoroughCouncil.py
│       │   ├── CherwellDistrictCouncil.py
│       │   ├── CheshireEastCouncil.py
│       │   ├── CheshireWestAndChesterCouncil.py
│       │   ├── ChesterfieldBoroughCouncil.py
│       │   ├── ChichesterDistrictCouncil.py
│       │   ├── ChorleyCouncil.py
│       │   ├── ColchesterCityCouncil.py
│       │   ├── ConwyCountyBorough.py
│       │   ├── CornwallCouncil.py
│       │   ├── CotswoldDistrictCouncil.py
│       │   ├── CoventryCityCouncil.py
│       │   ├── CrawleyBoroughCouncil.py
│       │   ├── CroydonCouncil.py
│       │   ├── CumberlandCouncil.py
│       │   ├── DacorumBoroughCouncil.py
│       │   ├── DarlingtonBoroughCouncil.py
│       │   ├── DartfordBoroughCouncil.py
│       │   ├── DenbighshireCouncil.py
│       │   ├── DerbyCityCouncil.py
│       │   ├── DerbyshireDalesDistrictCouncil.py
│       │   ├── DoncasterCouncil.py
│       │   ├── DorsetCouncil.py
│       │   ├── DoverDistrictCouncil.py
│       │   ├── DudleyCouncil.py
│       │   ├── DumfriesandGallowayCouncil.py
│       │   ├── DundeeCityCouncil.py
│       │   ├── DurhamCouncil.py
│       │   ├── EalingCouncil.py
│       │   ├── EastAyrshireCouncil.py
│       │   ├── EastCambridgeshireCouncil.py
│       │   ├── EastDevonDC.py
│       │   ├── EastDunbartonshireCouncil.py
│       │   ├── EastHertsCouncil.py
│       │   ├── EastLindseyDistrictCouncil.py
│       │   ├── EastLothianCouncil.py
│       │   ├── EastRenfrewshireCouncil.py
│       │   ├── EastRidingCouncil.py
│       │   ├── EastStaffordshireBoroughCouncil.py
│       │   ├── EastSuffolkCouncil.py
│       │   ├── EastbourneBoroughCouncil.py
│       │   ├── EastleighBoroughCouncil.py
│       │   ├── EdenDistrictCouncil.py
│       │   ├── EdinburghCityCouncil.py
│       │   ├── ElmbridgeBoroughCouncil.py
│       │   ├── EnfieldCouncil.py
│       │   ├── EnvironmentFirst.py
│       │   ├── EppingForestDistrictCouncil.py
│       │   ├── EpsomandEwellBoroughCouncil.py
│       │   ├── ErewashBoroughCouncil.py
│       │   ├── ExeterCityCouncil.py
│       │   ├── FalkirkCouncil.py
│       │   ├── FarehamBoroughCouncil.py
│       │   ├── FenlandDistrictCouncil.py
│       │   ├── FermanaghOmaghDistrictCouncil.py
│       │   ├── FifeCouncil.py
│       │   ├── FlintshireCountyCouncil.py
│       │   ├── FolkestoneandHytheDistrictCouncil.py
│       │   ├── ForestOfDeanDistrictCouncil.py
│       │   ├── FyldeCouncil.py
│       │   ├── GatesheadCouncil.py
│       │   ├── GedlingBoroughCouncil.py
│       │   ├── GlasgowCityCouncil.py
│       │   ├── GloucesterCityCouncil.py
│       │   ├── GooglePublicCalendarCouncil.py
│       │   ├── GosportBoroughCouncil.py
│       │   ├── GraveshamBoroughCouncil.py
│       │   ├── GreatYarmouthBoroughCouncil.py
│       │   ├── GuildfordCouncil.py
│       │   ├── GwyneddCouncil.py
│       │   ├── HackneyCouncil.py
│       │   ├── HaltonBoroughCouncil.py
│       │   ├── HarboroughDistrictCouncil.py
│       │   ├── HaringeyCouncil.py
│       │   ├── HarlowCouncil.py
│       │   ├── HarrogateBoroughCouncil.py
│       │   ├── HartDistrictCouncil.py
│       │   ├── HartlepoolBoroughCouncil.py
│       │   ├── HastingsBoroughCouncil.py
│       │   ├── HerefordshireCouncil.py
│       │   ├── HertsmereBoroughCouncil.py
│       │   ├── HighPeakCouncil.py
│       │   ├── HighlandCouncil.py
│       │   ├── Hillingdon.py
│       │   ├── HinckleyandBosworthBoroughCouncil.py
│       │   ├── HorshamDistrictCouncil.py
│       │   ├── HullCityCouncil.py
│       │   ├── HuntingdonDistrictCouncil.py
│       │   ├── HyndburnBoroughCouncil.py
│       │   ├── IpswichBoroughCouncil.py
│       │   ├── IsleOfAngleseyCouncil.py
│       │   ├── IslingtonCouncil.py
│       │   ├── KingsLynnandWestNorfolkBC.py
│       │   ├── KingstonUponThamesCouncil.py
│       │   ├── KirkleesCouncil.py
│       │   ├── KnowsleyMBCouncil.py
│       │   ├── LancasterCityCouncil.py
│       │   ├── LeedsCityCouncil.py
│       │   ├── LeicesterCityCouncil.py
│       │   ├── LewesDistrictCouncil.py
│       │   ├── LichfieldDistrictCouncil.py
│       │   ├── LincolnCouncil.py
│       │   ├── LisburnCastlereaghCityCouncil.py
│       │   ├── LiverpoolCityCouncil.py
│       │   ├── LondonBoroughCamdenCouncil.py
│       │   ├── LondonBoroughEaling.py
│       │   ├── LondonBoroughHammersmithandFulham.py
│       │   ├── LondonBoroughHarrow.py
│       │   ├── LondonBoroughHavering.py
│       │   ├── LondonBoroughHounslow.py
│       │   ├── LondonBoroughLambeth.py
│       │   ├── LondonBoroughLewisham.py
│       │   ├── LondonBoroughOfRichmondUponThames.py
│       │   ├── LondonBoroughRedbridge.py
│       │   ├── LondonBoroughSutton.py
│       │   ├── LutonBoroughCouncil.py
│       │   ├── MaidstoneBoroughCouncil.py
│       │   ├── MaldonDistrictCouncil.py
│       │   ├── MalvernHillsDC.py
│       │   ├── ManchesterCityCouncil.py
│       │   ├── MansfieldDistrictCouncil.py
│       │   ├── MedwayCouncil.py
│       │   ├── MeltonBoroughCouncil.py
│       │   ├── MertonCouncil.py
│       │   ├── MidAndEastAntrimBoroughCouncil.py
│       │   ├── MidDevonCouncil.py
│       │   ├── MidSuffolkDistrictCouncil.py
│       │   ├── MidSussexDistrictCouncil.py
│       │   ├── MidUlsterDistrictCouncil.py
│       │   ├── MiddlesbroughCouncil.py
│       │   ├── MidlothianCouncil.py
│       │   ├── MiltonKeynesCityCouncil.py
│       │   ├── MoleValleyDistrictCouncil.py
│       │   ├── MonmouthshireCountyCouncil.py
│       │   ├── MorayCouncil.py
│       │   ├── NeathPortTalbotCouncil.py
│       │   ├── NewForestCouncil.py
│       │   ├── NewarkAndSherwoodDC.py
│       │   ├── NewcastleCityCouncil.py
│       │   ├── NewcastleUnderLymeCouncil.py
│       │   ├── NewhamCouncil.py
│       │   ├── NewportCityCouncil.py
│       │   ├── NorthAyrshireCouncil.py
│       │   ├── NorthDevonCountyCouncil.py
│       │   ├── NorthEastDerbyshireDistrictCouncil.py
│       │   ├── NorthEastLincs.py
│       │   ├── NorthHertfordshireDistrictCouncil.py
│       │   ├── NorthKestevenDistrictCouncil.py
│       │   ├── NorthLanarkshireCouncil.py
│       │   ├── NorthLincolnshireCouncil.py
│       │   ├── NorthNorfolkDistrictCouncil.py
│       │   ├── NorthNorthamptonshireCouncil.py
│       │   ├── NorthSomersetCouncil.py
│       │   ├── NorthTynesideCouncil.py
│       │   ├── NorthWarwickshireBoroughCouncil.py
│       │   ├── NorthWestLeicestershire.py
│       │   ├── NorthYorkshire.py
│       │   ├── NorthumberlandCouncil.py
│       │   ├── NorwichCityCouncil.py
│       │   ├── NottinghamCityCouncil.py
│       │   ├── NuneatonBedworthBoroughCouncil.py
│       │   ├── OadbyAndWigstonBoroughCouncil.py
│       │   ├── OldhamCouncil.py
│       │   ├── OxfordCityCouncil.py
│       │   ├── PembrokeshireCountyCouncil.py
│       │   ├── PerthAndKinrossCouncil.py
│       │   ├── PeterboroughCityCouncil.py
│       │   ├── PlymouthCouncil.py
│       │   ├── PortsmouthCityCouncil.py
│       │   ├── PowysCouncil.py
│       │   ├── PrestonCityCouncil.py
│       │   ├── ReadingBoroughCouncil.py
│       │   ├── RedcarandClevelandCouncil.py
│       │   ├── RedditchBoroughCouncil.py
│       │   ├── ReigateAndBansteadBoroughCouncil.py
│       │   ├── RenfrewshireCouncil.py
│       │   ├── RhonddaCynonTaffCouncil.py
│       │   ├── RochdaleCouncil.py
│       │   ├── RochfordCouncil.py
│       │   ├── RotherDistrictCouncil.py
│       │   ├── RotherhamCouncil.py
│       │   ├── RoyalBoroughofGreenwich.py
│       │   ├── RugbyBoroughCouncil.py
│       │   ├── RunnymedeBoroughCouncil.py
│       │   ├── RushcliffeBoroughCouncil.py
│       │   ├── RushmoorCouncil.py
│       │   ├── SalfordCityCouncil.py
│       │   ├── SandwellBoroughCouncil.py
│       │   ├── SeftonCouncil.py
│       │   ├── SevenoaksDistrictCouncil.py
│       │   ├── SheffieldCityCouncil.py
│       │   ├── ShropshireCouncil.py
│       │   ├── SloughBoroughCouncil.py
│       │   ├── SolihullCouncil.py
│       │   ├── SomersetCouncil.py
│       │   ├── SouthAyrshireCouncil.py
│       │   ├── SouthCambridgeshireCouncil.py
│       │   ├── SouthDerbyshireDistrictCouncil.py
│       │   ├── SouthGloucestershireCouncil.py
│       │   ├── SouthHamsDistrictCouncil.py
│       │   ├── SouthHollandDistrictCouncil.py
│       │   ├── SouthKestevenDistrictCouncil.py
│       │   ├── SouthLanarkshireCouncil.py
│       │   ├── SouthNorfolkCouncil.py
│       │   ├── SouthOxfordshireCouncil.py
│       │   ├── SouthRibbleCouncil.py
│       │   ├── SouthStaffordshireDistrictCouncil.py
│       │   ├── SouthTynesideCouncil.py
│       │   ├── SouthamptonCityCouncil.py
│       │   ├── SouthwarkCouncil.py
│       │   ├── SpelthorneBoroughCouncil.py
│       │   ├── StAlbansCityAndDistrictCouncil.py
│       │   ├── StHelensBC.py
│       │   ├── StaffordBoroughCouncil.py
│       │   ├── StaffordshireMoorlandsDistrictCouncil.py
│       │   ├── StevenageBoroughCouncil.py
│       │   ├── StirlingCouncil.py
│       │   ├── StockportBoroughCouncil.py
│       │   ├── StocktonOnTeesCouncil.py
│       │   ├── StokeOnTrentCityCouncil.py
│       │   ├── StratfordUponAvonCouncil.py
│       │   ├── StroudDistrictCouncil.py
│       │   ├── SunderlandCityCouncil.py
│       │   ├── SurreyHeathBoroughCouncil.py
│       │   ├── SwaleBoroughCouncil.py
│       │   ├── SwanseaCouncil.py
│       │   ├── SwindonBoroughCouncil.py
│       │   ├── TamesideMBCouncil.py
│       │   ├── TandridgeDistrictCouncil.py
│       │   ├── TeignbridgeCouncil.py
│       │   ├── TelfordAndWrekinCouncil.py
│       │   ├── TendringDistrictCouncil.py
│       │   ├── TestValleyBoroughCouncil.py
│       │   ├── TewkesburyBoroughCouncil.py
│       │   ├── ThanetDistrictCouncil.py
│       │   ├── ThreeRiversDistrictCouncil.py
│       │   ├── ThurrockCouncil.py
│       │   ├── TonbridgeAndMallingBC.py
│       │   ├── TorbayCouncil.py
│       │   ├── TorridgeDistrictCouncil.py
│       │   ├── TunbridgeWellsCouncil.py
│       │   ├── UttlesfordDistrictCouncil.py
│       │   ├── ValeofGlamorganCouncil.py
│       │   ├── ValeofWhiteHorseCouncil.py
│       │   ├── WakefieldCityCouncil.py
│       │   ├── WalsallCouncil.py
│       │   ├── WalthamForest.py
│       │   ├── WandsworthCouncil.py
│       │   ├── WarringtonBoroughCouncil.py
│       │   ├── WarwickDistrictCouncil.py
│       │   ├── WatfordBoroughCouncil.py
│       │   ├── WaverleyBoroughCouncil.py
│       │   ├── WealdenDistrictCouncil.py
│       │   ├── WelhatCouncil.py
│       │   ├── WestBerkshireCouncil.py
│       │   ├── WestDunbartonshireCouncil.py
│       │   ├── WestLancashireBoroughCouncil.py
│       │   ├── WestLindseyDistrictCouncil.py
│       │   ├── WestLothianCouncil.py
│       │   ├── WestMorlandAndFurness.py
│       │   ├── WestNorthamptonshireCouncil.py
│       │   ├── WestOxfordshireDistrictCouncil.py
│       │   ├── WestSuffolkCouncil.py
│       │   ├── WiganBoroughCouncil.py
│       │   ├── WiltshireCouncil.py
│       │   ├── WinchesterCityCouncil.py
│       │   ├── WindsorAndMaidenheadCouncil.py
│       │   ├── WirralCouncil.py
│       │   ├── WokingBoroughCouncil.py
│       │   ├── WokinghamBoroughCouncil.py
│       │   ├── WolverhamptonCityCouncil.py
│       │   ├── WorcesterCityCouncil.py
│       │   ├── WrexhamCountyBoroughCouncil.py
│       │   ├── WychavonDistrictCouncil.py
│       │   ├── WyreCouncil.py
│       │   ├── WyreForestDistrictCouncil.py
│       │   ├── YorkCouncil.py
│       │   ├── council_class_template/
│       │   │   └── councilclasstemplate.py
│       │   └── tests/
│       │       ├── conftest.py
│       │       ├── test_south_kesteven_district_council.py
│       │       └── test_south_kesteven_integration.py
│       ├── create_new_council.py
│       └── get_bin_data.py
├── uk_bin_collection_api_server/
│   ├── Dockerfile
│   ├── docker-compose.yml
│   ├── requirements.txt
│   ├── server.py
│   └── swagger.yaml
└── wiki/
    ├── Councils.md
    ├── Home.md
    ├── Setup.md
    └── generate_wiki.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .devcontainer/dev.Dockerfile
================================================
ARG VARIANT="3.12-bullseye"
FROM mcr.microsoft.com/devcontainers/python:${VARIANT} AS ukbc-dev-base

USER root

# Install dependencies for Google Chrome
RUN dpkg --add-architecture amd64 && \
    apt-get update && \
    apt-get install -y --no-install-recommends \
    wget \
    gnupg2 \
    software-properties-common \
    apt-transport-https \
    ca-certificates \
    unzip \
    libasound2 \
    libatk-bridge2.0-0 \
    libatk1.0-0 \
    libatspi2.0-0 \
    libcairo2 \
    libcups2 \
    libdbus-1-3 \
    libexpat1 \
    libgbm1 \
    libglib2.0-0 \
    libgtk-3-0 \
    libnspr4 \
    libnss3 \
    libpango-1.0-0 \
    libudev1 \
    libvulkan1 \
    libx11-6 \
    libxcb1 \
    libxcomposite1 \
    libxdamage1 \
    libxext6 \
    libxfixes3 \
    libxkbcommon0 \
    libxrandr2 \
    libcurl4 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Add Google Chrome repository
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - && \
    echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list && \
    apt-get update

# Install Chrome
RUN apt-get install -y google-chrome-stable && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Install ChromeDriver
RUN CHROME_VERSION=$(google-chrome --version | sed 's/Google Chrome //' | tr -d ' ') && \
    wget -O /tmp/chromedriver.zip "https://storage.googleapis.com/chrome-for-testing-public/${CHROME_VERSION}/linux64/chromedriver-linux64.zip" && \
    unzip /tmp/chromedriver.zip -d /tmp && \
    mv /tmp/chromedriver-linux64/chromedriver /usr/local/bin/ && \
    rm -rf /tmp/chromedriver* && \
    chmod +x /usr/local/bin/chromedriver

USER vscode

# Define the version of Poetry to install (default is 1.4.2)
# Define the directory of python virtual environment
ARG PYTHON_VIRTUALENV_HOME=/home/vscode/ukbc-py-env \
    POETRY_VERSION=1.8.4

ENV POETRY_VIRTUALENVS_IN_PROJECT=false \
    POETRY_NO_INTERACTION=true

# Install Poetry outside of the virtual environment to avoid conflicts
RUN python3 -m pip install --user pipx && \
    python3 -m pipx ensurepath && \
    pipx install poetry==${POETRY_VERSION}

# Create a Python virtual environment for the project
RUN python3 -m venv ${PYTHON_VIRTUALENV_HOME} && \
    $PYTHON_VIRTUALENV_HOME/bin/pip install --upgrade pip

ENV PATH="$PYTHON_VIRTUALENV_HOME/bin:$PATH" \
    VIRTUAL_ENV=$PYTHON_VIRTUALENV_HOME

# Setup for bash
RUN poetry completions bash >> /home/vscode/.bash_completion && \
    echo "export PATH=$PYTHON_VIRTUALENV_HOME/bin:$PATH" >> ~/.bashrc

# Set the working directory for the app
WORKDIR /ukbc_build

# Use a multi-stage build to install dependencies
FROM ukbc-dev-base AS ukbc-dev-dependencies

ARG PYTHON_VIRTUALENV_HOME

COPY . /ukbc_build/

RUN poetry install --no-interaction --no-ansi --with dev

#docker build -f .devcontainer/dev.Dockerfile -t ukbc_dev_container .


================================================
FILE: .devcontainer/devcontainer.json
================================================
{
    "dockerComposeFile": "docker-compose.yml",
    "service": "devcontainer",
    "workspaceFolder": "/workspaces/UKBinCollectionData",
    "customizations": {
        "vscode": {
            "extensions": [
                "alexkrechik.cucumberautocomplete",
                "eamodio.gitlens",
                "Gruntfuggly.todo-tree",
                "ms-python.black-formatter",
                "ms-python.isort",
                "ms-python.pylint", // Add pylint extension
                "ms-python.python",
                "ms-python.python",
                "ms-python.vscode-pep8", // Add pep8 extension
                "ms-python.vscode-pylance",
                "oderwat.indent-rainbow",
                "ryanluker.vscode-coverage-gutters",
                "yzhang.markdown-all-in-one"
            ],
            "settings": {
                "makefile.makefilePath": "${workspaceFolder}/",
                "files.exclude": {
                    "**/__pycache__": true,
                    "**/.pytest_cache": true
                },
                "autoSave": true,
                "git.autorefresh": true,
                "extensions.ignoreRecommendations": true,
                "isort.args": [
                    "--profile",
                    "black"
                ],
                "python.analysis.diagnosticMode": "workspace",
                "python.analysis.typeCheckingMode": "strict",
                "python.analysis.logLevel": "Trace",
                "python.analysis.disableSemanticOnNoPython": false,
                "python.analysis.enableSyncServer": true,
                "python.analysis.userFileIndexingLimit": -1,
                "python.formatting.provider": "none",
                "python.languageServer": "Pylance",
                "python.linting.enabled": true,
                "python.linting.pylintEnabled": true,
                "python.linting.pep8Enabled": true,
                "python.linting.lintOnSave": true,
                "python.testing.autoTestDiscoverOnSaveEnabled": false,
                "python.defaultInterpreterPath": "/home/vscode/ukbc-py-env",
                "python.testing.pytestArgs": [
                    "${workspaceFolder}/uk_bin_collection",
                    "${workspaceFolder}/custom_components/uk_bin_collection/tests",
                    "--headless=False",
                    "-o cache_dir=${workspaceFolder}/.pytest_cache"
                ],
                "python.testing.unittestEnabled": false,
                "python.testing.pytestEnabled": true,
                "[python]": {
                    "editor.defaultFormatter": "ms-python.black-formatter",
                    "editor.formatOnSave": true,
                    "editor.formatOnPaste": false,
                    "editor.formatOnSaveMode": "file",
                    "editor.codeActionsOnSave": {
                        "source.organizeImports": true
                    }
                },
                "workbench.colorCustomizations": {
                    "editorError.foreground":   "#ff000088",
                    "editorWarning.foreground": "#ffe60033",
                    "editorInfo.foreground":    "#00ff0088"
                }
            }
        }
    }
}


================================================
FILE: .devcontainer/docker-compose.yml
================================================
services:
  devcontainer:
    image: ukbc_dev_container  # This tags the built image
    build:
      context: ../  # Path to the directory containing the Dockerfile
      dockerfile: .devcontainer/dev.Dockerfile
    volumes:
      - ../:/workspaces/UKBinCollectionData:rw
    privileged: true
    hostname: devcontainer
    network_mode: host
    depends_on:
      - selenium-hub
    command: sleep infinity

  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    volumes:
      - .ha_config:/config:rw
      - ../custom_components:/config/custom_components
      - /etc/localtime:/etc/localtime:ro
      - /run/dbus:/run/dbus:ro
    restart: unless-stopped
    privileged: true
    networks:
      - devnet
    ports:
      - "8124:8123/tcp"

  chrome1:
    image: selenium/node-chrome:4.20.0-20240505
    shm_size: 2gb
    networks:
      - devnet
    depends_on:
      - selenium-hub
    ports:
      - "7901:7900"
      - "5551:5555"
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - VNC_NO_PASSWORD=1
    privileged: true
    restart: always

  chrome2:
    image: selenium/node-chrome:4.20.0-20240505
    shm_size: 2gb
    networks:
      - devnet
    depends_on:
      - selenium-hub
    ports:
      - "7902:7900"
      - "5552:5555"
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - VNC_NO_PASSWORD=1
    privileged: true
    restart: always

  chrome3:
    image: selenium/node-chrome:4.20.0-20240505
    shm_size: 2gb
    networks:
      - devnet
    depends_on:
      - selenium-hub
    ports:
      - "7903:7900"
      - "5553:5555"
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - VNC_NO_PASSWORD=1
    privileged: true
    restart: always

  chrome4:
    image: selenium/node-chrome:4.20.0-20240505
    shm_size: 2gb
    networks:
      - devnet
    depends_on:
      - selenium-hub
    ports:
      - "7904:7900"
      - "5554:5555"
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - VNC_NO_PASSWORD=1
    privileged: true
    restart: always

  chrome_video1:
    image: selenium/video:ffmpeg-6.1.1-20240505
    networks:
      - devnet
    volumes:
      - ../test_videos:/videos/
    depends_on:
      - chrome1
    environment:
      - DISPLAY_CONTAINER_NAME=chrome1
      - SE_VIDEO_FILE_NAME=auto
      - SE_NODE_GRID_URL=http://selenium-hub:4444
    privileged: true
    restart: always

  chrome_video2:
    image: selenium/video:ffmpeg-6.1.1-20240505
    networks:
      - devnet
    volumes:
      - ../test_videos:/videos/
    depends_on:
      - chrome2
    environment:
      - DISPLAY_CONTAINER_NAME=chrome2
      - SE_VIDEO_FILE_NAME=auto
      - SE_NODE_GRID_URL=http://selenium-hub:4444
    privileged: true
    restart: always

  chrome_video3:
    image: selenium/video:ffmpeg-6.1.1-20240505
    networks:
      - devnet
    volumes:
      - ../test_videos:/videos/
    depends_on:
      - chrome3
    environment:
      - DISPLAY_CONTAINER_NAME=chrome3
      - SE_VIDEO_FILE_NAME=auto
      - SE_NODE_GRID_URL=http://selenium-hub:4444
    privileged: true
    restart: always

  chrome_video4:
    image: selenium/video:ffmpeg-6.1.1-20240505
    networks:
      - devnet
    volumes:
      - ../test_videos:/videos/
    depends_on:
      - chrome4
    environment:
      - DISPLAY_CONTAINER_NAME=chrome4
      - SE_VIDEO_FILE_NAME=auto
      - SE_NODE_GRID_URL=http://selenium-hub:4444
    privileged: true
    restart: always

  selenium-hub:
    image: selenium/hub:4.20.0-20240505
    container_name: selenium-hub
    hostname: selenium
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"
    privileged: true
    restart: always
    networks:
      - devnet

networks:
  devnet:
    driver: bridge


================================================
FILE: .dockerignore
================================================
# Ignore everything
*

# But not these files...
!*.json
!*.py
!PipFile
!Pipfile.lock
!.gitignore
!.dockerignore
!*.toml
!*.md
!*.rst
!LICENSE
!*.schema
!Makefile
!dependabot.yaml
!poetry.lock
!behave.ini
!*.Dockerfile

# Or these folders...
!.github
!*.png
!.github/ISSUE_TEMPLATE
!.github/ISSUE_TEMPLATE/*.yaml
!.github/workflows
!.github/workflows/*.yml
!uk_bin_collection
!uk_bin_collection/**/*
!uk_bin_collection_api_server
!uk_bin_collection_api_server/**/*
!wiki
!wiki/**/*
!custom_components
__pycache__
!TO_BE_CONVERTED
!.devcontainer


================================================
FILE: .github/ISSUE_TEMPLATE/COUNCIL_ISSUE.yaml
================================================
name: Council Issue
description: Issue with an existing council
labels: ["bug"]

body:
    - type: input
      id: council
      attributes:
          label: Name of Council
          description: What council you were trying to use
          placeholder: e.g. Huntingdon District Council
      validations:
          required: true
    - type: textarea
      id: extra
      attributes:
        label: Issue Information
        description: What is the issue you're experiencing? How can we re-produce it?
        placeholder: Detailed explanation of the issue along with replication steps
    - type: checkboxes
      id: verification
      attributes:
        label: Verification
        description: 'Please verify that you''ve followed these steps:'
        options:
          - label: I searched for similar issues at https://github.com/robbrad/UKBinCollectionData/issues?q=is:issue and found no duplicates
            required: true
          - label: I have checked my address/postcode/UPRN works on the council's website
            required: true
          - label: I have provided a detailed explanation of the issue as well as steps to replicate the issue
            required: true
          - label: I understand that this project is run by volunteer contributors therefore completion of this issue cannot be guaranteed
            required: true

================================================
FILE: .github/ISSUE_TEMPLATE/COUNCIL_REQUEST.yaml
================================================
name: Council Request
description: Request for a council to be added to the repository
labels: ["council request"]

body:
    - type: input
      id: council
      attributes:
          label: Name of Council
          description: What council are you wishing to be added
          placeholder: e.g. Huntingdon District Council
      validations:
          required: true
    - type: input
      id: postcode
      attributes:
          label: Example Address/Postcode
          description: Please provide a tested working example address/postcode for the council's area
          placeholder: e.g. PE7 3YQ
      validations:
          required: true
    - type: textarea
      id: extra
      attributes:
          label: Additional Information
          description: Add any other information here
          placeholder: Links to the councils site, information you have already gathered
    - type: checkboxes
      id: verification
      attributes:
        label: Verification
        description: 'Please verify that you''ve followed these steps:'
        options:
          - label: I''ve checked the [wiki](https://github.com/robbrad/UKBinCollectionData/wiki/Councils#contents) and verified that my council has not been added
            required: true
          - label: I''ve checked that a request for my council does not already exist in the [Issues tracker](https://github.com/robbrad/UKBinCollectionData/issues?q=is%3Aopen+is%3Aissue+label%3A"council+request")
            required: true
          - label: I have provided a tested working address/postcode/UPRN with bin collections available, as well as a link to the council''s website
            required: true
          - label: I understand that this project is run by volunteer contributors and completion depends on numerous factors - even with a request, we cannot guarantee if/when your council will get a script
            required: true


================================================
FILE: .github/ISSUE_TEMPLATE/HOME_ASSISTANT_CUSTOM_COMPONENT_ISSUE.yaml
================================================
name: Home Assistant Custom Component Issue
description: Issue with the Home Assistant custom component
labels: ["bug", "home assistant custom component"]

body:
  - type: markdown
    attributes:
      value: If you were trying to add a specific council, please check it is listed as working [here](https://robbrad.github.io/UKBinCollectionData/3.12/) and open a [Council Issue](https://github.com/robbrad/UKBinCollectionData/issues/new/choose) instead if it's failing
  - type: input
    id: ha_version
    attributes:
      label: Home Assistant Version
      description: What version of Home Assistant you're running
      placeholder: e.g. 2023.10.3
    validations:
      required: true
  - type: dropdown
    id: install_method
    attributes:
      label: Installation Method
      description: How did you install the custom component?
      options:
        - Using HACS
        - Manually
    validations:
      required: true
  - type: input
    id: council
    attributes:
      label: Name of Council (if relevant)
      description: Which council were you trying to use?
      placeholder: e.g. Huntingdon District Council
  - type: textarea
    id: extra
    attributes:
      label: Issue Information
      description: What issue are you experiencing? How can we re-produce it?
      placeholder: Detailed explanation of the issue along with replication steps
    validations:
      required: true
  - type: checkboxes
    id: verification
    attributes:
      label: Verification
      description: 'Please verify that you''ve followed these steps:'
      options:
        - label: I searched for similar issues at https://github.com/robbrad/UKBinCollectionData/issues?q=is:issue and found no duplicates
          required: true
        - label: If trying to add a specific council, I've checked it is listed as working at https://robbrad.github.io/UKBinCollectionData/3.12/
          required: true
        - label: I have provided a detailed explanation of the issue as well as steps to replicate the issue
          required: true
        - label: I understand that this project is run by volunteer contributors therefore completion of this issue cannot be guaranteed
          required: true

================================================
FILE: .github/dependabot.yaml
================================================
---
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: daily
      time: "06:00"
    commit-message:
      # Prefix all commit messages with "chore: "
      prefix: "chore"

================================================
FILE: .github/workflows/behave_pull_request.yml
================================================
name: PR - Test Councils

on:
  workflow_dispatch:
  pull_request:
    branches: [ "master" ]
    paths-ignore:
      - "wiki/**"
      - "**/*.md"
      - "uk_bin_collection_api_server/**"

jobs:
  setup:
    name: Setup Environment
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install Poetry
        run: pipx install poetry==1.8.4

      - uses: actions/setup-python@v6
        with:
          python-version: 3.12

      - name: Install Dependencies
        run: make install-dev

      - name: Lint JSON
        run: jq empty uk_bin_collection/tests/input.json

      - name: Get All Council Files That Have Changed
        id: changed-council-files
        uses: tj-actions/changed-files@v47
        with:
          files: |
            uk_bin_collection/uk_bin_collection/councils/**.py
      - name: Set Council Tests Environment Variable
        id: set-council-tests
        run: |
          IFS=' ' read -ra FILES <<< "${{ steps.changed-council-files.outputs.all_changed_files }}"
          COUNCIL_TESTS=""
          for file in "${FILES[@]}"; do
            FILENAME=$(basename "$file" .py)
            if [ -z "$COUNCIL_TESTS" ]; then
              COUNCIL_TESTS="$FILENAME"
            else
              COUNCIL_TESTS="$COUNCIL_TESTS or $FILENAME"
            fi
          done
          echo "council_tests=$COUNCIL_TESTS" >> $GITHUB_OUTPUT
    outputs:
      council_tests: ${{ steps.set-council-tests.outputs.council_tests }}

  unit-tests:
    name: Run Unit Tests
    needs: setup
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.12]
        poetry-version: [1.8.4]
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Poetry
        run: pipx install poetry==${{ matrix.poetry-version }}

      - name: Install Dependencies
        run: make install-dev

      - name: Run Unit Tests
        run: make unit-tests

      - name: Upload Test Results to Codecov
        uses: codecov/codecov-action@v6
        with:
          fail_ci_if_error: false
          token: ${{ secrets.CODECOV_TOKEN }}
          file: coverage.xml

  parity-check:
    name: Parity Check
    needs: setup
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.12]
        poetry-version: [1.8.4]
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Poetry
        run: pipx install poetry==${{ matrix.poetry-version }}

      - name: Install Dependencies
        run: make install-dev
      
      - name: Check Parity of Councils / input.json / Feature file
        env:
          repo: ${{ github.event.pull_request.head.repo.full_name || 'robbrad/UKBinCollectionData' }}
          branch: ${{ github.event.pull_request.head.ref || 'master' }}
        run: make parity-check repo="$repo" branch="$branch"

  integration-tests:
    name: Run Integration Tests
    needs: setup
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.12]
        poetry-version: [1.8.4]
    services:
      selenium:
        image: selenium/standalone-chrome:latest
        options: --shm-size=2gb --name selenium --hostname selenium
        ports:
          - 4444:4444
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Poetry
        run: pipx install poetry==${{ matrix.poetry-version }}

      - name: Install Dependencies
        run: make install-dev

      - name: Run Integration Tests
        env:
          HEADLESS: True
          COUNCIL_TESTS: ${{ needs.setup.outputs.council_tests }}
        run: make matrix=${{ matrix.python-version }} councils="${{ env.COUNCIL_TESTS }}" integration-tests
        continue-on-error: true

      - name: Upload Integration Test Results to Codecov
        uses: codecov/codecov-action@v6
        with:
          fail_ci_if_error: false
          token: ${{ secrets.CODECOV_TOKEN }}
          report_type: test_results
          file: build/${{ matrix.python-version }}/integration-test-results/junit.xml
          flags: integrationtestspr
          name: integration-tests-pr


================================================
FILE: .github/workflows/behave_schedule.yml
================================================
name: Scheduled - Test All Councils

on:
  workflow_dispatch:
  schedule:
    - cron: '0 0 * * *' # Nightly schedule for full test run

jobs:
  setup:
    name: Setup Environment
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install Poetry
        run: pipx install poetry==1.8.4

      - uses: actions/setup-python@v6
        with:
          python-version: 3.12

      - name: Install Dependencies
        run: make install-dev

      - name: Lint JSON
        run: jq empty uk_bin_collection/tests/input.json

      - name: Set Council Tests Environment Variable
        id: set-council-tests
        run: |
          COUNCIL_TESTS=""
          echo "council_tests=$COUNCIL_TESTS" >> $GITHUB_OUTPUT

    outputs:
      council_tests: ${{ steps.set-council-tests.outputs.council_tests }}

  unit-tests:
    name: Run Unit Tests
    needs: setup
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.12]
        poetry-version: [1.8.4]
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Poetry
        run: pipx install poetry==${{ matrix.poetry-version }}

      - name: Install Dependencies
        run: make install-dev

      - name: Run Unit Tests
        run: make unit-tests

      - name: Upload Test Results to Codecov
        uses: codecov/codecov-action@v6
        with:
          fail_ci_if_error: false
          token: ${{ secrets.CODECOV_TOKEN }}
          file: coverage.xml

  parity-check:
    name: Parity Check
    needs: setup
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.12]
        poetry-version: [1.8.4]
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Poetry
        run: pipx install poetry==${{ matrix.poetry-version }}

      - name: Install Dependencies
        run: make install-dev

      - name: Check Parity of Councils / input.json / Feature file
        run: |
          repo=${{ github.event.pull_request.head.repo.full_name || 'robbrad/UKBinCollectionData' }}
          branch=${{ github.event.pull_request.head.ref || 'master' }}
          make parity-check repo=$repo branch=$branch

  integration-tests:
    name: Run Integration Tests
    needs: setup
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.12]
        poetry-version: [1.8.4]
    services:
      selenium:
        image: selenium/standalone-chrome:latest
        options: --shm-size=2gb --name selenium --hostname selenium
        ports:
          - 4444:4444
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Poetry
        run: pipx install poetry==${{ matrix.poetry-version }}

      - name: Install Dependencies
        run: make install-dev

      - name: Run Integration Tests
        env:
          HEADLESS: True
          COUNCIL_TESTS: ${{ needs.setup.outputs.council_tests }}
        run: make matrix=${{ matrix.python-version }} councils="${{ env.COUNCIL_TESTS }}" integration-tests
        continue-on-error: true

      - name: Upload Integration Test Results to Codecov
        uses: codecov/codecov-action@v6
        with:
          fail_ci_if_error: false
          token: ${{ secrets.CODECOV_TOKEN }}
          report_type: test_results
          file: build/${{ matrix.python-version }}/integration-test-results/junit.xml
          flags: integrationtestsfullnightly
          name: integration-tests-full-nightly

================================================
FILE: .github/workflows/bump.yml
================================================
name: Release - Bump Version

on:
  push:
    branches: [ "master" ]
    paths-ignore:
      - "wiki/**"
      - "**/*.md"
      - ".github/workflows/**"
  workflow_dispatch: {}

jobs:
  bump:
    if: "!startsWith(github.event.head_commit.message, 'bump:')"
    runs-on: ubuntu-latest
    permissions:
      contents: write
    concurrency: bump

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          ssh-key: ${{ secrets.DEPLOY_KEY }}
          persist-credentials: true

      - name: Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.12'
          cache: 'pip'

      - name: Cache Commitizen
        uses: actions/cache@v5
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip-commitizen-${{ hashFiles('**/pyproject.toml') }}
          restore-keys: |
            ${{ runner.os }}-pip-commitizen-

      - name: Install Commitizen
        run: pip install commitizen

      - name: Configure git identity
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

      - name: Bump version and create tag
        id: bump
        run: |
          # Check if there are commits to bump
          if cz bump --yes --changelog --dry-run 2>&1 | grep -q "No commits found"; then
            echo "No version bump needed - no conventional commits since last release"
            echo "skip=true" >> $GITHUB_OUTPUT
            exit 0
          fi
          cz bump --yes --changelog
          echo "version=$(cz version --project)" >> $GITHUB_OUTPUT
          echo "skip=false" >> $GITHUB_OUTPUT

      - name: Push changes and tags
        if: steps.bump.outputs.skip != 'true'
        run: |
          git push origin master
          git push origin --tags

      - name: Create workflow summary
        if: always()
        run: |
          echo "## Bump Summary" >> $GITHUB_STEP_SUMMARY
          if [ "${{ steps.bump.outputs.skip }}" == "true" ]; then
            echo "- **Status**: ⏭️ Skipped (no conventional commits)" >> $GITHUB_STEP_SUMMARY
          else
            echo "- **Status**: ✅ Success" >> $GITHUB_STEP_SUMMARY
            echo "- **New Version**: ${{ steps.bump.outputs.version }}" >> $GITHUB_STEP_SUMMARY
            echo "- **Tag Created**: ${{ steps.bump.outputs.version }}" >> $GITHUB_STEP_SUMMARY
          fi


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"

on:
  push:
    # Trigger unless only the wiki directory changed
    paths:
      - "**/**.py"
      - "**.py"
    branches: [ "master" ]
  pull_request:
    # Trigger unless only the wiki directory changed
    paths:
      - "**/**.py"
      - "**.py"
    # The branches below must be a subset of the branches above
    branches: [ "master" ]
  schedule:
    - cron: '36 13 * * 5'

jobs:
  analyze:
    if: "!startsWith(github.event.head_commit.message, 'bump:')"
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'python' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
    - name: Checkout repository
      uses: actions/checkout@v6

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.
        
        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
        # queries: security-extended,security-and-quality

        
    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@v4

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun

    #   If the Autobuild fails above, remove it and uncomment the following three lines. 
    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.

    # - run: |
    #   echo "Run, Build Application using script"
    #   ./location_of_script_within_repo/buildscript.sh

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v4


================================================
FILE: .github/workflows/docker-image.yml
================================================
name: Build - Docker Image

on:
  push:
    # Trigger unless only the wiki directory changed
    paths:
      - "uk_bin_collection_api_server/**"
      - ".github/workflows/docker-image.yml"
    branches: [ "master" ]
  pull_request:
    # Trigger unless only the wiki directory changed
    paths:
      - "uk_bin_collection_api_server/**"
    # The branches below must be a subset of the branches above
    branches: [ "master" ]
  workflow_dispatch:
  schedule:
    - cron: '0 0 * * 0' # This runs at 00:00 on Sunday every week

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
    - name: Publish to Registry
      uses: elgohr/Publish-Docker-Github-Action@v5
      with:
        name: robbrad182/uk-bin-collection
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_API_KEY }}
        workdir: uk_bin_collection_api_server


================================================
FILE: .github/workflows/ha_compatibility_test.yml
================================================
name: PR - Home Assistant Compatibility Test

on:
  push:
    branches: [ master, main ]
    paths:
      - 'custom_components/**'
      - 'pyproject.toml'
  pull_request:
    branches: [ master, main ]
    paths:
      - 'custom_components/**'
      - 'pyproject.toml'
  schedule:
    - cron: '0 6 * * 1'  # Weekly on Monday at 6 AM UTC

jobs:
  generate-matrix:
    name: Generate HA Version Matrix
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.get-versions.outputs.matrix }}
    steps:
      - name: Get HA versions from PyPI
        id: get-versions
        run: |
          MATRIX=$(curl -s https://pypi.org/pypi/homeassistant/json | jq -c '
            .releases
            | to_entries
            # keep only x.y.z (skip betas/devs/post)
            | map(select(.key | test("^[0-9]+\\.[0-9]+\\.[0-9]+$")))
            # group by major.minor, keep highest patch
            | group_by(.key | (split(".")[:2] | join(".")))
            | map(max_by(.key | (split(".")[2] | tonumber)) | .key)
            # sort numerically and take latest 8
            | sort_by(split(".") | map(tonumber))
            | .[-8:]
            # pick python version per HA series; adjust as needed
            | map({ha_version: ., python_version: (if (split(".")[0] == "2025" and (split(".")[1]|tonumber) >= 2) then "3.13" else "3.12" end)})
            # also test latest dev on py 3.13
            | . + [{ha_version: "dev", python_version: "3.13"}]
            | {include: .}
          ')
          echo "matrix=$MATRIX" >> "$GITHUB_OUTPUT"

  test-ha-compatibility:
    name: Test HA ${{ matrix.ha_version }}
    runs-on: ubuntu-latest
    needs: generate-matrix
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Determine Docker tag
        id: docker-tag
        run: |
          if [ "${{ matrix.ha_version }}" = "dev" ]; then
            echo "tag=dev" >> "$GITHUB_OUTPUT"
          else
            echo "tag=${{ matrix.ha_version }}" >> "$GITHUB_OUTPUT"
          fi

      - name: Setup HA config directory
        run: |
          mkdir -p config/custom_components config/.storage
          cp -r custom_components/uk_bin_collection config/custom_components/
          cat > config/configuration.yaml <<'YAML'
          logger:
            default: info
          YAML
          
          # Create a config entry to trigger component setup
          cat > config/.storage/core.config_entries <<'JSON'
          {
            "version": 1,
            "minor_version": 1,
            "key": "core.config_entries",
            "data": {
              "entries": [
                {
                  "entry_id": "test_uk_bin_collection",
                  "version": 3,
                  "domain": "uk_bin_collection",
                  "title": "Test Entry",
                  "data": {
                    "name": "Test Council",
                    "council": "GooglePublicCalendarCouncil",
                    "url": "https://calendar.google.com/calendar/ical/0d775884b4db6a7bae5204f06dae113c1a36e505b25991ebc27c6bd42edf5b5e%40group.calendar.google.com/public/basic.ics",
                    "timeout": 60,
                    "update_interval": 12,
                    "manual_refresh_only": true
                  },
                  "options": {},
                  "pref_disable_new_entities": false,
                  "pref_disable_polling": false,
                  "source": "user",
                  "unique_id": null,
                  "disabled_by": null
                }
              ]
            }
          }
          JSON

      - name: Start Home Assistant in Docker
        run: |
          docker run -d \
            --name homeassistant \
            -v $(pwd)/config:/config \
            -e TZ=UTC \
            ghcr.io/home-assistant/home-assistant:${{ steps.docker-tag.outputs.tag }}
          
          echo "Waiting for container to start..."
          sleep 5

      - name: Wait for Home Assistant to boot
        id: boot
        run: |
          set -euo pipefail
          TIMEOUT=150
          SECS=0
          INIT_MARKER="Home Assistant initialized"
          FAIL=0

          echo "Waiting for HA to initialize..."
          while (( SECS < TIMEOUT )); do
            LOGS=$(docker logs homeassistant 2>&1)
            if echo "$LOGS" | grep -q "$INIT_MARKER"; then
              echo "✅ HA initialized successfully"
              break
            fi
            sleep 1
            SECS=$((SECS+1))
            if (( SECS % 10 == 0 )); then
              echo "Waiting... ${SECS}s"
            fi
          done

          # Check for dependency installation and component setup
          LOGS=$(docker logs homeassistant 2>&1)
          if echo "$LOGS" | grep -q "Attempting install of uk-bin-collection"; then
            echo "✅ HA attempted to install uk-bin-collection dependency"
          fi
          
          if echo "$LOGS" | grep -Eq "(ERROR|CRITICAL).*(uk_bin_collection|custom_components\.uk_bin_collection)"; then
            echo "❌ Component has errors in logs:"
            echo "$LOGS" | grep -E "(ERROR|CRITICAL).*(uk_bin_collection|custom_components\.uk_bin_collection)" || true
            FAIL=1
          fi

          # Check timeout
          if (( SECS >= TIMEOUT )) && ! echo "$LOGS" | grep -q "$INIT_MARKER"; then
            echo "❌ HA did not finish booting within ${TIMEOUT}s"
            FAIL=1
          fi

          # Expose pass/fail to later steps
          echo "boot_failed=${FAIL}" >> "$GITHUB_OUTPUT"
          exit ${FAIL}

      - name: Save HA logs to file
        if: always()
        run: |
          docker logs homeassistant > home-assistant.log 2>&1 || true

      - name: Show HA logs
        if: always()
        run: |
          echo "--- Last 80 log lines ---"
          tail -n 80 home-assistant.log 2>/dev/null || docker logs homeassistant 2>&1 | tail -n 80

      - name: Stop and remove container
        if: always()
        run: |
          docker stop homeassistant || true
          docker rm homeassistant || true

      - name: Upload HA log (always)
        if: always()
        uses: actions/upload-artifact@v7
        with:
          name: ha-log-${{ matrix.ha_version }}
          path: home-assistant.log
          overwrite: true

      - name: Test manifest validation
        id: manifest
        run: |
          python <<'PY'
          import json, sys
          with open('custom_components/uk_bin_collection/manifest.json') as f:
              m = json.load(f)
          required = ['domain', 'name', 'version', 'requirements']
          missing = [k for k in required if k not in m]
          if missing:
              print(f'❌ Missing required manifest fields: {missing}')
              sys.exit(1)
          print('✅ Manifest validation passed')
          print(f'Component version: {m.get("version")}')
          print(f'Requirements: {m.get("requirements")}')
          PY

      - name: Create test result summary
        if: always()
        run: |
          echo "## Boot Results for HA ${{ matrix.ha_version }} (Python ${{ matrix.python_version }})" >> "$GITHUB_STEP_SUMMARY"
          if [ "${{ steps.boot.outputs.boot_failed }}" = "0" ] && [ "${{ steps.manifest.outcome }}" = "success" ]; then
            echo "✅ **PASSED** – HA booted with the custom component present" >> "$GITHUB_STEP_SUMMARY"
          else
            echo "❌ **FAILED** – HA failed to boot cleanly" >> "$GITHUB_STEP_SUMMARY"
            echo "" >> "$GITHUB_STEP_SUMMARY"
            echo "- boot step failed: \`${{ steps.boot.outputs.boot_failed }}\`" >> "$GITHUB_STEP_SUMMARY"
            echo "- manifest step: \`${{ steps.manifest.outcome }}\`" >> "$GITHUB_STEP_SUMMARY"
            echo "" >> "$GITHUB_STEP_SUMMARY"
            echo "See the uploaded **ha-log** artifact for details." >> "$GITHUB_STEP_SUMMARY"
          fi


  compatibility-report:
    name: Generate Compatibility Report
    runs-on: ubuntu-latest
    needs: [generate-matrix, test-ha-compatibility]
    if: always()
    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Create compatibility report
        run: |
          echo "# Home Assistant Compatibility Report" > report.md
          echo "" >> report.md
          echo "Matrix tested: \`${{ needs.generate-matrix.outputs.matrix }}\`" >> report.md
          echo "Last updated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")" >> report.md
          cat report.md >> "$GITHUB_STEP_SUMMARY"


================================================
FILE: .github/workflows/hacs_validation.yml
================================================
name: PR - Validate HACS

on:
  push:
  pull_request:
  schedule:
    - cron: "0 0 * * *"

jobs:
  hassfest_validation:
    name: HassFest Validation
    runs-on: "ubuntu-latest"
    steps:
      - uses: "actions/checkout@v6"
      - uses: home-assistant/actions/hassfest@master
  
  hacs:
    name: HACS Action Validation
    runs-on: "ubuntu-latest"
    steps:
      - name: HACS Action
        uses: "hacs/action@main"
        with:
          category: "integration"



================================================
FILE: .github/workflows/lint.yml
================================================
name: PR - Lint Commit Messages

on:
  push:
    # The branches below must be a subset of the branches above
    branches: [ "master" ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ "master" ]

jobs:
  # Make sure commit messages follow the conventional commits convention:
  # https://www.conventionalcommits.org
  commitlint:
    if: "!startsWith(github.event.head_commit.message, 'bump:')"
    name: Lint Commit Messages
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - run: "echo \"export default {extends: ['@commitlint/config-conventional'], rules: { 'subject-case': [0], 'body-max-line-length': [0], 'footer-max-line-length': [0] }}\" > commitlint.config.mjs"
      - uses: wagoid/commitlint-github-action@v6


================================================
FILE: .github/workflows/release.yml
================================================
name: Release - Publish to PyPI

on:
  push:
    tags:
      - '*'

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      id-token: write
    steps:
      - name: Checkout
        uses: actions/checkout@v6

      - name: Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.12'
          cache: 'pip'

      - name: Install Poetry
        uses: abatilo/actions-poetry@v4.0.0
        with:
          poetry-version: '1.8.4'

      - name: Cache Poetry dependencies
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
          restore-keys: |
            ${{ runner.os }}-poetry-

      - name: Set release version
        run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV

      - name: Verify version matches tag
        run: |
          POETRY_VERSION=$(poetry version -s)
          if [ "$POETRY_VERSION" != "${{ env.RELEASE_VERSION }}" ]; then
            echo "Error: Poetry version ($POETRY_VERSION) doesn't match tag (${{ env.RELEASE_VERSION }})"
            exit 1
          fi

      - name: Build package
        run: poetry build

      - name: Create GitHub release
        uses: ncipollo/release-action@v1
        with:
          tag: ${{ env.RELEASE_VERSION }}
          generateReleaseNotes: true
          artifacts: "dist/*"
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Publish to PyPI
        uses: nick-fields/retry@v4
        with:
          timeout_minutes: 5
          max_attempts: 3
          retry_wait_seconds: 30
          command: |
            poetry config pypi-token.pypi "${{ secrets.PYPI_API_KEY }}"
            poetry publish

      - name: Create workflow summary
        if: always()
        run: |
          echo "## Release Summary" >> $GITHUB_STEP_SUMMARY
          echo "- **Version**: ${{ env.RELEASE_VERSION }}" >> $GITHUB_STEP_SUMMARY
          echo "- **Status**: ${{ job.status }}" >> $GITHUB_STEP_SUMMARY
          if [ "${{ job.status }}" == "success" ]; then
            echo "- **PyPI**: https://pypi.org/project/uk-bin-collection/${{ env.RELEASE_VERSION }}/" >> $GITHUB_STEP_SUMMARY
            echo "- **GitHub Release**: https://github.com/${{ github.repository }}/releases/tag/${{ env.RELEASE_VERSION }}" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "✅ Release published successfully!" >> $GITHUB_STEP_SUMMARY
          else
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "❌ Release failed - check logs above" >> $GITHUB_STEP_SUMMARY
          fi

  docker:
    needs: release
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6

      - name: Login to Docker Hub
        uses: docker/login-action@v4
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_API_KEY }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v7
        with:
          context: ./uk_bin_collection_api_server
          push: true
          tags: |
            robbrad182/uk-bin-collection:${{ github.ref_name }}
            robbrad182/uk-bin-collection:latest


================================================
FILE: .github/workflows/rollback-release.yml
================================================
name: Release - Rollback

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Version to rollback (e.g., 0.155.0)'
        required: true
        type: string
      delete_pypi:
        description: 'Also yank from PyPI? (cannot delete, only yank)'
        required: false
        type: boolean
        default: false

jobs:
  rollback:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          ssh-key: ${{ secrets.DEPLOY_KEY }}

      - name: Validate version format
        run: |
          if ! [[ "${{ inputs.version }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            echo "❌ Invalid version format. Use X.Y.Z (e.g., 0.155.0)"
            exit 1
          fi
          echo "✅ Version format valid: ${{ inputs.version }}"

      - name: Check if release exists
        id: check
        run: |
          if gh release view ${{ inputs.version }} > /dev/null 2>&1; then
            echo "exists=true" >> $GITHUB_OUTPUT
            echo "✅ Release ${{ inputs.version }} exists"
          else
            echo "exists=false" >> $GITHUB_OUTPUT
            echo "⚠️ Release ${{ inputs.version }} not found"
          fi
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Delete GitHub Release
        if: steps.check.outputs.exists == 'true'
        run: |
          echo "🗑️ Deleting GitHub release ${{ inputs.version }}..."
          gh release delete ${{ inputs.version }} --yes
          echo "✅ GitHub release deleted"
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Delete Git Tag
        run: |
          if git rev-parse ${{ inputs.version }} >/dev/null 2>&1; then
            echo "🗑️ Deleting git tag ${{ inputs.version }}..."
            git push origin :refs/tags/${{ inputs.version }}
            echo "✅ Git tag deleted"
          else
            echo "⚠️ Tag ${{ inputs.version }} not found locally"
          fi

      - name: Setup Python (if PyPI yank requested)
        if: inputs.delete_pypi == true
        uses: actions/setup-python@v6
        with:
          python-version: '3.12'

      - name: Install Poetry (if PyPI yank requested)
        if: inputs.delete_pypi == true
        uses: abatilo/actions-poetry@v4.0.0
        with:
          poetry-version: '1.8.4'

      - name: Yank from PyPI
        if: inputs.delete_pypi == true
        run: |
          echo "⚠️ Yanking version ${{ inputs.version }} from PyPI..."
          echo "Note: This marks the release as unsuitable for installation but doesn't delete it"
          poetry config pypi-token.pypi "${{ secrets.PYPI_API_KEY }}"
          # PyPI doesn't support yanking via poetry directly, need to use twine
          pip install twine
          # Note: You'll need to manually yank via PyPI web interface or use:
          # twine upload --repository pypi --skip-existing dist/*
          echo "⚠️ PyPI yanking must be done manually at: https://pypi.org/manage/project/uk-bin-collection/releases/"
          echo "Go to the release and click 'Options' -> 'Yank release'"

      - name: Create workflow summary
        if: always()
        run: |
          echo "## Rollback Summary" >> $GITHUB_STEP_SUMMARY
          echo "- **Version**: ${{ inputs.version }}" >> $GITHUB_STEP_SUMMARY
          echo "- **GitHub Release**: ${{ steps.check.outputs.exists == 'true' && '✅ Deleted' || '⚠️ Not found' }}" >> $GITHUB_STEP_SUMMARY
          echo "- **Git Tag**: Deleted from remote" >> $GITHUB_STEP_SUMMARY
          if [ "${{ inputs.delete_pypi }}" == "true" ]; then
            echo "- **PyPI**: ⚠️ Manual yank required" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "### Next Steps for PyPI" >> $GITHUB_STEP_SUMMARY
            echo "1. Go to https://pypi.org/manage/project/uk-bin-collection/releases/" >> $GITHUB_STEP_SUMMARY
            echo "2. Find version ${{ inputs.version }}" >> $GITHUB_STEP_SUMMARY
            echo "3. Click 'Options' -> 'Yank release'" >> $GITHUB_STEP_SUMMARY
          fi
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "### ⚠️ Important Notes" >> $GITHUB_STEP_SUMMARY
          echo "- The version bump commit still exists in git history" >> $GITHUB_STEP_SUMMARY
          echo "- To fully rollback, you may need to revert the bump commit" >> $GITHUB_STEP_SUMMARY
          echo "- Users who already installed this version will keep it" >> $GITHUB_STEP_SUMMARY

      - name: Notify completion
        run: |
          echo "✅ Rollback completed for version ${{ inputs.version }}"
          echo "Check the summary tab for details"


================================================
FILE: .github/workflows/validate-release-ready.yml
================================================
name: PR - Validate Release Ready

on:
  workflow_dispatch:
  pull_request:
    branches: [ "master" ]
    types: [opened, synchronize, reopened]

jobs:
  validate:
    name: Validate Release Prerequisites
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - uses: actions/setup-python@v6
        with:
          python-version: '3.12'
          cache: 'pip'

      - name: Cache Poetry
        uses: actions/cache@v5
        with:
          path: ~/.local/pipx
          key: ${{ runner.os }}-pipx-poetry-1.8.4
          restore-keys: |
            ${{ runner.os }}-pipx-poetry-

      - name: Install Poetry
        run: pipx install poetry==1.8.4

      - name: Validate pyproject.toml
        run: poetry check

      - name: Check for conventional commits
        uses: wagoid/commitlint-github-action@v6
        with:
          configFile: commitlint.config.mjs


================================================
FILE: .github/workflows/wiki.yml
================================================
name: Deploy - Wiki

on:
  push:
    # Trigger only when wiki directory changes
    paths:
      - "wiki/**"
      - "uk_bin_collection/tests/input.json"
    branches: [ "master" ]
  pull_request:
    # Trigger only when wiki directory changes
    paths:
      - "wiki/**"
      - "uk_bin_collection/tests/input.json"
    # The branches below must be a subset of the branches above
    branches: [ "master" ]

jobs:
  deploy-wiki:
    # Only run on main branch push (e.g. after pull request merge).
    if: github.event_name == 'push'
    runs-on: ubuntu-latest
    environment: wiki
    steps:
    - uses: actions/checkout@v6
    - uses: actions/setup-python@v6
      with:
        python-version: '3.12'

    - name: Run image
      uses: abatilo/actions-poetry@v4.0.0
      with:
        poetry-version: '1.8.4'

    - name: Install
      run: make install

    - name: Update Councils.md from input.json
      run: make update-wiki

    - name: Commit and Push Wiki changes
      run: |
        git config --global user.name "Wiki GitHub Action"
        git config --global user.email "action@github.com"
        git add wiki
        git commit -m "docs: Update Councils.md from input.json"
        git push
      continue-on-error: true

    - name: Deploy Wiki Changes
      uses: Andrew-Chen-Wang/github-wiki-action@v5
      with:
        # Make sure WIKI_DIR ends with / as action uses rsync
        path: wiki/
        ignore: "generate_wiki.py"


================================================
FILE: .gitignore
================================================
# Ignore everything
*

# But not these files...
!*.json
!*.py
!PipFile
!Pipfile.lock
!.gitignore
!.dockerignore
!*.toml
!*.md
!*.rst
!LICENSE
!*.schema
!Makefile
!dependabot.yaml
!poetry.lock
!behave.ini
!*.Dockerfile
!docker-compose.yml
!.vscode/launch.json
!pytest.ini

# Or these folders...
!docs
!.github
!*.png
!.github/ISSUE_TEMPLATE
!.github/ISSUE_TEMPLATE/*.yaml
!.github/workflows
!.github/workflows/*.yml
!uk_bin_collection
!uk_bin_collection/**/*
!uk_bin_collection_api_server
!uk_bin_collection_api_server/**/*
!wiki
!wiki/**/*
!custom_components
!custom_components/**/*/
!custom_components/uk_bin_collection/services.yaml
__pycache__
!TO_BE_CONVERTED
!.devcontainer
uk_bin_collection/.DS_Store
uk_bin_collection/uk_bin_collection/.DS_Store
!scripts
!.kiro
ISSUE_RESOLUTION_PROGRESS.md


================================================
FILE: CHANGELOG.md
================================================
=======
## 0.165.0 (2026-03-28)

### Feat

- Lancaster City - support food waste collection (#1895)
- support lancaster city food waste collection
- North Northamptonshire - add food caddy bin type support (#1894)
- add support for food caddy bin type in North Northamptonshire Council scraper

### Fix

- expose errors in lancaster city date parsing
- correct casing for food caddy bin type in North Northamptonshire Council scraper
- Herefordshire Council - incorrectly picking up non-date string (#1888)
- Herefordshire Council incorrectly picking up non-date string
- EalingCouncil/LondonBoroughEaling - use collectionDate not collectionDateString (#1886)
- EalingCouncil/LondonBoroughEaling: Use collectionDate not collectionDateString

### Refactor

- ChorleyCouncil - use requests instead of Selenium (#1891)

## 0.164.0 (2026-03-14)

### Feat

- NewhamCouncil - add food waste collection scraping

### Fix

- update address selection XPath for BroxbourneCouncil
- nuneaton and bedworth
- nuneaton and bedworth
- NewhamCouncil - correct datetime parsing from DD/MM/YYYY to MM/DD/YYYY
- NewhamCouncil - disable SSL verification to resolve certificate verification errors
- updated ID's for multiple elements that had changed
- Broxtowe Borough Council
- #1872 - Broxtowe Borough Council
- Adding North Warwickshire Borough Council
- #1869 - Adding North Warwickshire Borough Council
- Bath and North East Somerset
- #1876 -  Bath and North East Somerset
- Hinckley & Bosworth Council
- #1879 - Hinckley & Bosworth Council
- Midlothian Council
- #1880 Midlothian Council
- Merton Council
- #1868 - Merton Council
- Eastleigh Borough Council
- #1867 - Eastleigh Borough Council
- London Borough Havering
- #1863 - London Borough Havering
- Leeds City Council
- #1864 - Leeds City Council
- North East Derbyshire District Council
- #1861 - North East Derbyshire District Council
- Cumberland Council
- #1858 - Cumberland Council
- Barking & Dagenham
- #1855 - Barking & Dagenham
- Redcar and Cleveland Council
- #1848 - Redcar and Cleveland Council
- Wakefield City Council
- #1853 - Wakefield City Council
- Bromley Borough Council
- #1851 Bromley Borough Council
- Mid Suffolk District Council
- #1845 - Mid Suffolk District Council
- Powys Council
- #1846 - Powys Council
- LondonBoroughHammersmithandFulham
- LondonBoroughHammersmithandFulham
- HarboroughDistrictCouncil
- HarboroughDistrictCouncil
- Adding Hammersmith & Fulham
- #1504 - Adding Hammersmith & Fulham
- Harborough District Council
- #1831 - Harborough District Council
- London Borough Redbridge
- #1836 - fix: London Borough Redbridge

## 0.163.0 (2026-02-02)

### Feat

- #1686 GosportBoroughCouncil - Add new council using Supatrak API
- #1593 #1618 #1794 - Add Causeway Coast and Glens, Rossendale Borough, North Warwickshire to GooglePublicCalendarCouncil

### Fix

- #1831 HarboroughDistrictCouncil - use data instead of json, suppress SSL warnings, improve parsing
- #1831 HarboroughDistrictCouncil - add SSL bypass and better error handling for 502 errors
- #1836 LondonBoroughRedbridge - updated selectors for redesigned website

## 0.162.7 (2026-02-02)

### Fix

- resolve issues #1776, #1780, #1782 - Camden, NE Derbyshire, Newport
- Broken councils
- remove URLs from translation strings for HACS compliance
- **CumberlandCouncil**: remove obsolete duplicate entries
- **AmberValleyBoroughCouncil**: filter invalid date 01/01/0001
- Kingston parser for HTML format change with explicit error handling
- Kingston-upon-Thames website HTML format change
- UttlesfordDistrictCouncil use color names for bin types
- EastHertsCouncil handle empty NextDate values
- UttlesfordDistrictCouncil incorrect bin types due to wrong alt text
- compare dates without time component in UttlesfordDistrictCouncil
- UttlesfordDistrictCouncil hardcoded year 2024
- Wyre Forest District Council
- #1835 - Wyre Forest District Council
- Babergh District Council
- #1783 - Babergh District Council
- Mid Suffolk District Council
- #1746 - Mid Suffolk District Council
- Waverley Borough Council
- #1834 - Waverley Borough Council
- London Borough Sutton
- #1830 - London Borough Sutton
- Bolton Council
- #1792 - Bolton Council
- Coventry City Council
- #1808 - Coventry City Council
- Slough Borough Council
- #1822 - Slough Borough Council
- Bromley Borough Council
- #1829 - Bromley Borough Council
- Burnley Borough Council
- #1820 - Burnley Borough Council

### Refactor

- add explicit datetime import in UttlesfordDistrictCouncil

## 0.162.6 (2026-01-14)

### Fix

- FolkestoneandHytheDistrictCouncil.py
- CastlepointDistrictCouncil
- Folkestone and Hythe District Council
- Castlepoint District Council
- #1803 #1793 Castlepoint District Council
- Folkstone and Hythe District Council
- #1760 - Folkstone and Hythe District Council
- Newark and Sherwood District Council
- #1777 - fix: Newark and Sherwood District Council
- South Lanarkshire Council
- #1771 -  South Lanarkshire Council
- Renfrewshire Council
- #1500 - Renfrewshire Council

## 0.162.5 (2025-12-08)

### Fix

- West Oxfordshire
- West Oxfordshire
- Adur & Worthing (#1454), Hillingdon (#1680)

## 0.162.4 (2025-12-08)

### Fix

- Cumberland Council

## 0.162.3 (2025-12-08)

### Fix

- Islington, Worcester

## 0.162.2 (2025-12-07)

### Fix

- Broken councils

## 0.162.1 (2025-12-07)

## 0.162.0 (2025-12-07)

### Feat

- Add support for Isle of Anglesey County Council
- replace Selenium with Cloud9 mobile API for NHDC bin collection data
- Adding Harlow Council
- #1639 Adding Harlow Council
- Adding Blackpool Council
- #1640 Adding Blackpool Council

### Fix

- add User-Agent header to KingsLynnandWestNorfolkBC scraper
- **southgloucestershirecouncil**: check none instead of empty string
- Treat missing response data as an error to prevent silent failure
- address latest CodeRabbit feedback
- address CodeRabbit feedback
- Fix input.json data
- fix UPRN param encoding for SouthamptonCityCouncil
- Replace loop variable for clarity in North Hertfordshire parsing logic
- Let requests handle query param encoding
- Address edge case in address splitting
- Handle edge case for date parsing validation
- Don't bail on invalid date format
- Add comment explaining where auth header came from
- Improve error handling for mobile API requests and JSON parsing
- Use constant for mobile API container count
- Improve error handling for mobile API JSON response
- Use named imports from common
- Add sorting key for bin collections using parsed datetime
- Improve error handling for collection date parsing
- Use `line.strip()` in list comp
- Update comment to match behaviour
- Amend list comprehension variable name to avoid shadowing
- Remove unused variable assignment
- Perform postcode/paon string manipulation after checking truthiness
- WiltshireCouncil.py
- Rushmoor Council
- #1724 - Rushmoor Council
- Wiltshire Council
- #1689 - Wiltshire Council
- Halton Borough Council
- #1209 Halton Borough Council
- Northumberland Council
- #1711 - Northumberland Council - Requires 12 digit UPRN
- South Lanarkshire Council
- #1712 - South Lanarkshire Council
- Argyll and Bute Council
- #1718 - Argyll and Bute Council
- Thurrock Council
- #1720 - Thurrock Council
- Mid Sussex
- #1721 Mid Sussex
- Chelmsford City Council
- #1707
- #1706 -  London Borough of Lambeth
- #1706 -  London Borough of Lambeth
- Fife Council
- Armagh Banbridge Craigavon Council
- #1622

### Refactor

- Adjust return payload aggregation logic

## 0.161.0 (2025-11-08)

### Feat

- Dumfries and Galloway Council

### Fix

- Herefordshire Council
- Herefordshire Council
- Southampton City Council
- #1698
- Newport City Council
- #1229
- Middlesborough Council
- #1382 - Removed the need for Selenium
- Boston Borough Council
- #1690
- Chelmsford City Council
- #1688 - BREAKING CHANGE
- Derby City Council
- #1676
- London Borough of Hounslow
- #1683
- Brighton & Hove
- #1685 - New URL
- Brighton & Hove
- #1685 - New URL
- Hart District Council
- #1625
- London Borough of Harrow
- #1621
- Wokingham Borough Council
- #1641
- Norwich City Council
- #1653
- Rochdale Council
- #1675
fix: #1259
- **tendring**: ignore stale 'Next collection' dates older than today
- **tendring**: restore headless=True default and silence unused lambda arg for lint
- **tendring**: use 'Next collection' column; fix imports/strings/waits; robust iframe/cookie handling
- **tendring**: read 'Next collection' column; harden cookie/iframe handling; normalise dd/MM/YYYY

## 0.160.1 (2025-10-21)

### Fix

- test valley wrong dates
- Remove merge conflict
- remove merge conflict
- remove merge conflict message

## 0.160.0 (2025-10-21)

### Feat

- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant
- adding tests to ensure releases work with Home assistant

## 0.159.3 (2025-10-20)

### Fix

- Broken dependancies

## 0.159.2 (2025-10-19)

### Fix

- allow pillow 11.x to fix home assistant compatibility

## 0.159.1 (2025-10-18)

### Fix

- Add null checks to prevent AttributeError when collection date text is not found. Introduces extract_collection_date() helper that safely extracts dates and returns None if parsing fails, allowing the scraper to gracefully skip missing collection types.

## 0.159.0 (2025-10-18)

### Feat

- Modernize South Kesteven scraper with requests-based approach and OCR

### Fix

- **feedbank**: address improvements suggested in PR review
- Update NorthTynesideCouncil to reflect changes to website and extract schedule from the UPRN linked page

## 0.158.1 (2025-10-18)

### Fix

- remove merge conflict annotations and delete old code
- click on the submit button instead of sending ENTER

## 0.158.0 (2025-10-11)

### Feat

- workflow overhaul
- workflow overhaul

## 0.157.0 (2025-10-11)

### Feat

- Create tag-on-merge.yml
- Update bump.yml
- fix bump.yml
- Update TorbayCouncil.py
- Update bump.yml
- fix release pipeline bump.yml
- fix Torbay

### Fix

- Update AberdeenCityCouncil.py
- Update TorbayCouncil.py
- Update TorbayCouncil.py
- Update TorbayCouncil.py
- Update URL for NewForestCouncil
- New URL and page for wheelie bins
- improve Mid Suffolk District Council holiday handling with dynamic bank holiday detection
- Oxford now rejects the "Requests" default user agent
- #1557 - Adding East Dunbartonshire
- #1557 - Adding East Dunbartonshire
- #1569 - Somerset Council
- #1569 - Somerset Council
- #1559 - Newport City Council
- #1559 - Newport City Council
- #1574 - Test Valley Borough Council
- #1574 - Test Valley Borough Council
- #1566 South Gloucestershire Council

## 0.154.0 (2025-09-21)

### Feat

- handle changes to northumberland council website
- modify input for NorthumberlandCouncil to accept uprn instead of house number, and use new page structure

### Fix

- the cookie banner is not optional
- #1570 - Slough Borough Council
- #1570 - Slough Borough Council
- #1520 - Erewash Borough Council
- #1520 - Erewash Borough Council
- #1554 - Folkestone and Hythe District Council
- #1554 - Folkestone and Hythe District Council
- #1604 - West Berkshire Council
- #1604 - West Berkshire Council
- #1606 - Brighton and Hove City Council
- #1606 - Brighton and Hove City Council
- #1565 - BCP Council
- #1565 - BCP Council
- #1571 - Castle Point District Council
- #1571 - Castle Point District Council
- #1584 - NorthHertfordshireDistrictCouncil
- #1584 - NorthHertfordshireDistrictCouncil
- #1599
- #1599 - Basingstoke Council
- #1587
- #1587 - Hartlepool Borough Council
- #1588
- #1588 Glasgow City Council
- #1591
- #1591 Rushmoor Council

## 0.153.0 (2025-09-02)

### Feat

- Change buckinghamshire council to get data from endpoint

### Fix

- 1573 Update Bolton council URL
- East Herts Council
- #1575
- Runnymede Borough Council
- #1513
- Wiltshire Council
- #1533
- Staffordshire Moorlands District Council
- #1535
- Ipswich Borough Council
- #1548
- North East Lincs
- Hinckley and Bosworth Borough Council
- Nuneaton Bedworth Borough Council
- #1514
- Lichfield District Council
- 1549

## 0.152.11 (2025-08-25)

### Feat

- fix releases process

### Fix

- date extraction in RochfordCouncil data parsing
- parsing error in BH selenium
- **hacs**: respect the headless option

### Refactor

- **hacs**: improve build_ukbcd_args with formatter functions

## 0.152.10 (2025-08-04)

### Fix

- Gateshead and East Lothian
- Enfield and Broxbourne
- East Herts
- FermanaghOmaghDistrictCouncil
- Enfield and Broxbourne
- East Herts

## 0.152.9 (2025-08-03)

### Fix

- Cotswald and coventry
- Fixing multiple broken councils
- multiple broken councils

## 0.152.8 (2025-07-26)

### Fix

- Add headers to request for Swindon Borough Council
- Add headers to requests for Royal Borough of Greenwich Fixes #1496 by ensuring that the requests are not rejected due to lack of headers.
- **MidlothianCouncil**: add request headers to resolve 403 Forbidden

## 0.152.7 (2025-07-01)

### Fix

- maidstone selenium fix

## 0.152.6 (2025-06-18)

### Fix

- removed In Progress from date
- removed a degub print statement
- **RugbyBoroughCouncil**: Amended parsed date from full to abbreviated month date, may worked but jun and jul did not
- **RugbyBoroughCouncil**: Amended parsed date
- Reworked Cumberland Council to cater for postcode addition
- **OxfordCityCouncil**: Fixed Oxford City Council parsing dues to changes in output from the website

## 0.152.5 (2025-06-07)

### Fix

- South Ribble and version pinning issues for input.json

## 0.152.4 (2025-06-07)

### Fix

- **SouthRibble**: Corrected Date formatting issue
- **SouthRibble**: Resolved South Ribble without selenium

## 0.152.3 (2025-06-04)

### Fix

- NorthHertfordshire selenium script
- Adur council
- Eastleigh date fix
- removed duplicates in BradfordMDC

## 0.152.2 (2025-06-04)

### Fix

- Update Makefile
- Update CheshireEastCouncil.py
- Github action to handle branch name with parentheses

## 0.152.1 (2025-05-15)

### Fix

- Update to fix North Somerset
- Glasgow SSL bypass
- more robust Northumberland
- updated Eastleigh input.json
- Eastleigh cloudflare fix
- converted collection datetimes into dates for BH parsing.
- Eastleigh cloudflare fix
- Eastleigh cloudflare fix
- added check_uprn to simplified councils
- simplified Swindon
- simplified East Devon
- simplified Dover
- Simplified Dartford
- simplified Cheshire East
- simplified Charnwood input.json
- improved Charnwood
- Adur Worthing fix
- Chorley simplification
- Bexley simplification
- added URL to Torbay script
- Guildford fixes
- reworked Maidstone
- maidstone input.json
- Croydon selenium version
- Stoke date-time fix

## 0.152.0 (2025-05-02)

### Feat

- Added Fermanagh Omagh
- Added Twekesbury
- added Slough council
- Added Argus Council
- added Angus to input.json

### Fix

- Chichester now only requires postcode and house number
- Broadland now only requires postcode and house number
- Barking now only requires postcode and house number
- Brighton now only requires postcode and house number
- ensured all bins for this council
- added skip_get_url to hyndburn

## 0.151.0 (2025-04-27)

### Feat

- version bump

### Fix

- more robust brent date handling
- input.json requires web_driver
- Rugby fix

## 0.150.0 (2025-04-27)

### Feat

- added melton
- added pembrokeshire

### Fix

- added melton
- processed all bins for Moray

## 0.148.6 (2025-04-27)

## 0.148.5 (2025-04-27)

### Fix

- output check
- parsed bin info
- selenium navigation
- input.json changes

## 0.148.4 (2025-04-27)

### Fix

- used canonical 'nice name'

## 0.148.3 (2025-04-25)

### Fix

- working hyndburn
- hyndburn input.json

## 0.148.2 (2025-04-24)

### Fix

- Update docker-compose.yml
- updated input.json
- cloudflare fix - switch to selenium method
- simplified blackburn

## 0.148.1 (2025-04-22)

### Fix

- added bank holiday offsets.
- added bank holiday offsets.

## 0.148.0 (2025-04-19)

### Feat

- adding Wrexham and #1046 Horsham councils

### Fix

- Argyll and Bute council #1053

## 0.147.2 (2025-04-18)

### Fix

- wait for element to be clickable

## 0.147.1 (2025-04-18)

### Fix

- #1351 - moved geopandas to petry dev

## 0.147.0 (2025-04-18)

### Feat

- add council tests results map

## 0.146.2 (2025-04-18)

### Fix

- adding map checking and matching

## 0.146.1 (2025-04-18)

### Fix

- more robust bank holiday handling

## 0.146.0 (2025-04-18)

### Feat

- #1342 Adding Includes Trafford, Clackmannanshire, Havant, North Warwickshire, Newry Mourne and Down, East Dunbartonshire, Pendle, Torfaen, East Hampshire, Ribble Valley, Brentwood, Isle of Wight, Westmorland and Furness, Derry and Strabane, and Norwich. Google Cal support for PDF councils via ICS file

### Fix

- Black reformatting

## 0.145.0 (2025-04-18)

### Feat

- Adding PDF councils

## 0.144.4 (2025-04-18)

### Fix

- Bristol #1275

## 0.144.3 (2025-04-17)

### Fix

- better address for input.json
- bank holiday overrides
- more robust address searching
- simple parsing done
- Selenium navigation

## 0.144.2 (2025-04-17)

### Fix

- knowsley
- knowsley
- knowsley
- knowsley
- KnowsleyMBCouncil.py
- #1220 adding Mid Ulster District Council

## 0.144.1 (2025-04-17)

### Fix

- fix Sandwell garden waste collection date

## 0.144.0 (2025-04-17)

### Feat

- added great yarmouth

## 0.143.6 (2025-04-17)

### Fix

- Renfrewshire Council

## 0.143.5 (2025-04-17)

### Fix

- Google Cal

## 0.143.4 (2025-04-17)

### Fix

- Google Cal

## 0.143.3 (2025-04-15)

### Fix

- #1301 Fix Leeds Council

## 0.143.2 (2025-04-15)

### Fix

- #1301 Fix Leeds Council

## 0.143.1 (2025-04-15)

### Fix

- Set the bin_type when different day

## 0.143.0 (2025-04-13)

### Fix

- corrected url in input.json
- fixed input.json
- parsed Barking Dagenham collection information
- selenium navigation Barking

## 0.142.0 (2025-04-13)

### Feat

- Added Stirling Council

### Fix

- typo in input.json

## 0.141.4 (2025-04-13)

### Fix

- #1304 - sesnors goes to unknown if the data is blank from councils who are less reliable

## 0.141.3 (2025-04-13)

### Fix

- Newham council

## 0.141.2 (2025-04-13)

### Fix

- Newham council
- Newham council

## 0.141.1 (2025-04-12)

### Fix

- missing finally block on selenium tests

## 0.141.0 (2025-04-12)

### Feat

- #1185 Adding PeterboroughCity Council

## 0.140.0 (2025-04-11)

### Feat

- Added Broadland District Council

### Fix

- cleanup of council file
- added Broadland to input.json

## 0.139.0 (2025-04-07)

### Feat

- adding #1037
- adding #1032 North Devon Count Council

### Fix

- #1296 Forest of dean
- 939 adding South Holland District Council - Lincolnshire UK

## 0.138.1 (2025-04-05)

### Fix

- Walhtam forest council - revert previous changes

## 0.138.0 (2025-04-05)

### Feat

- Adding Hastings Borough Council
- Adding Fylde Council

### Fix

- #1249
- #1039
fix: #1181
fix: #1266
fix: #1274
- Gloucester City Council
- #1282
- Mid Devon Council
- #1277
fix: #1287
- West Oxfordshire Council
- #1290

## 0.137.0 (2025-04-05)

### Feat

- #816 adding trafford council

## 0.136.0 (2025-03-24)

### Feat

- Adding Southampton City Council
- Adding Cambridge City Council
- Adding Spelthorne Borough Council

### Fix

- #1057
- #1264
- #1270
- Bexley Council
- #1256
- HinckleyandBosworthBoroughCouncil
- #1207
- Hackney Council
- #1230
- Castlepoint District Council
- #1252
- Canterbury City Council
- #1254

## 0.135.4 (2025-03-24)

### Fix

- parse scheduleCodeWorkflowIDs instead of scheduleCodeWorkflowID for Hackney Council

## 0.135.3 (2025-02-23)

## 0.135.2 (2025-02-19)

### Fix

- North Yorkshire - multiple bins on a day

## 0.135.1 (2025-02-18)

### Fix

- devcontainer

## 0.135.0 (2025-02-17)

### Fix

- #833 adding Middlesbrough and check script for Selenium
- Cotswold District Council
- #1238
- Leeds City Council
- #1222

## 0.134.3 (2025-02-15)

### Fix

- Update input.json
- 1235 Councils missing Selenium in input.json

## 0.134.2 (2025-02-15)

### Fix

- 1232 East herts missing Selenium url in input.json
- Derbyshire Dales District Council
- Conwy County Borough
- Sunderland City Council
- #1219
- Tendring District Council
- #1221

## 0.134.1 (2025-02-11)

### Fix

- Cheltenham Borough Council
- #1061

## 0.134.0 (2025-02-07)

### Feat

- Ipswich Borough Council - trying different address
- Ipswich Borough Council - correcting param name in input.json
- Ipswich Borough Council - added input.json values and refactored code
- Ipswich Borough Council - initial implementation
- Adding Runnymede Borough Council
- Adding Cherwell District Council
- Adding Epsom and Ewell Borough Council
- Adding Redcar and Cleveland Council
- Adding Amber Valley Borough Council
- Adding Bolsover Council

### Fix

- #1214
- #923
- #895
- #841
- #903
- #990
- Torridge District Council
- #1204
- Neath Port Talbot
- #1213

## 0.133.0 (2025-02-02)

### Feat

- adding manual refresh

## 0.132.0 (2025-02-02)

### Feat

- adding manual refresh

## 0.131.0 (2025-02-02)

### Feat

- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding unit tests for the new manual refresh
- adding manual refresh control

## 0.130.1 (2025-01-30)

### Fix

- slow councils

## 0.130.0 (2025-01-29)

### Feat

- Add Herefordshire Council (closes: #1011)

### Fix

- Fix spacing in wiki name

## 0.129.0 (2025-01-29)

### Fix

- input.json
- input.json

## 0.128.6 (2025-01-29)

### Fix

- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting

## 0.128.5 (2025-01-29)

### Feat

- Adding East Staffordshire Borough Council

### Fix

- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update CheshireEastCouncil.py
- Adding East Lothian Council
- #1171
- #1052
fix: #1083

## 0.128.4 (2025-01-28)

### Feat

- Adding Boston Borough Council

### Fix

- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Leicester City Council
- #1178
- Cardiff Council
- #1175
- Newcastle City Council
- #1179
- #1180
- Midlothian Council
- #1192 - Adding Next Page support

## 0.128.3 (2025-01-28)

### Fix

- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml

## 0.128.2 (2025-01-28)

### Fix

- Add communal recycling and communal rubbish
- Add garden waste to Merton Council

## 0.128.1 (2025-01-28)

### Fix

- Update AberdeenshireCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml

## 0.128.0 (2025-01-28)

### Feat

- implement Medway Council (#1021)

### Fix

- Forgot to include skip_get_url

## 0.127.4 (2025-01-25)

### Fix

- NewForestCouncil

## 0.127.3 (2025-01-16)

### Fix

- Swale Borough Council
- #1139
- Vale of White Horse
- #1156
- South Oxfordshire Council
- #1158
- Surrey Heath Borough Council
- #1164
- Carmarthenshire County Council
- #1167
- Glasgow City Council
- #1166

## 0.127.2 (2025-01-13)

### Fix

- Update bin type to be the full string

## 0.127.1 (2025-01-10)

### Fix

- Use visibility of list rather than existence
- Update Rushcliffe Borough Council input elements and flow
- Merton Council
- NewarkAndSherwoodDC
- Rushcliffe Borough Council
- Powys Council
- Staffordshire Moorlands District Council
- Stroud District Council
- Vale of Glamorgan Council
- West Oxfordshire District Council

## 0.127.0 (2025-01-07)

### Feat

- Adding Oadby And Wigston Borough Council
- Add Gwynedd Council
- Adding Denbighshire Council
- Adding Dundee City Council
- Adding Brent Council
- Adding West Dunbartonshire Council
- Adding Cumberland Council

### Fix

- #929
- Cornwall Council
- #1137
- #1125
- #1106
- #1108
- #1109
- #1134
- Northumberland Council
- #1082
- #1110
- Waltham Forest
- #1126
- London Borough Sutton
- #1131
- Kirklees Council
- #1129 - Breaking Change. UPRN required

## 0.126.2 (2025-01-07)

### Fix

- **tests**: updates test case url for coventry city council
- **tests**: removes duplicate key for coventry city council
- updates coventry city council button text

## 0.126.1 (2025-01-06)

### Fix

- behave_testing
- behave_testing

## 0.126.0 (2025-01-04)

### Fix

- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml

## 0.125.2 (2025-01-04)

### Fix

- Update ArdsAndNorthDownCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Swale Borough Council
- #1080
(cherry picked from commit 6f580b39fb68b8079990221e050ae8dd6d2b7285)
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update ArdsAndNorthDownCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Update WestLindseyDistrictCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml

## 0.125.1 (2025-01-04)

### Fix

- correctly handle year increment for January dates

## 0.125.0 (2025-01-04)

### Feat

- Adding Redditch Borough Council
- Adding Blaenau Gwent County Borough Council
- Adding Wandsworth Council

### Fix

- #1068
- #1098
- Wiltshire Council
- #1094
- Salford City Council
- #1097
- #1078
- Merton Council
- Swale Borough Council
- #1080
- London Borough Sutton
- #1076
- Update behave_schedule.yml
- Update bump.yml

## 0.124.4 (2025-01-04)

### Fix

- Update behave_schedule.yml

## 0.124.3 (2025-01-04)

### Fix

- allure reporting
- allure reporting
- allure reporting

## 0.124.2 (2025-01-03)

### Fix

- Update behave.yml

## 0.124.1 (2025-01-03)

### Fix

- avoid crashing on unexpected string value

## 0.124.0 (2025-01-02)

### Feat

- Hart District Council

## 0.123.2 (2024-12-19)

### Fix

- Update behave.yml

## 0.123.1 (2024-12-18)

### Feat

- #1063 - rewrite Kirklees Council parser for new website
- #1067 - Add garden bin collections where available for Norwich City Council
- Adding Wandsworth Council

### Fix

- Update AberdeenCityCouncil.py
- Update behave.yml
- #1101 - Fix table parsing for Walsall Council
- Remove invalid escape sequence warnings from West Lindsey District Council
- #1073 - change method of generating bin types to avoid manual mapping for Rugby Borough Council
- add missing backticks to separate colour config and standard usage instructions
- #1078
(cherry picked from commit 89d93666bb659010d1c130b98c1d81c6ff80cf7c)
- change date format to project default for Merton Council
- correct date logic for Swale Borough Council
- Merton Council
- London Borough Sutton
- #1076
(cherry picked from commit 1eab20c9a57c9c4438ea343f374202bb2e9b98ca)
- Swale Borough Council
- #1080
(cherry picked from commit 6f580b39fb68b8079990221e050ae8dd6d2b7285)
- correct date/year logic for West Lindsey District Council
- replace West Lindsey's input with working address
- #1089 - Correct shifted dates in Bromley Borough Council
- remove WDM import
- #1087 - Food waste date incorrect for West Berkshire Council

## 0.123.0 (2024-12-17)

## 0.122.0 (2024-12-04)

### Feat

- Adding Monmouthshire County Council
- Adding Hinckley and Bosworth Borough Council

### Fix

- Glasgow City Council
- Merton Council
- Blaby District Council
- Warwick District Council
- Blackburn Council
- Carmarthenshire County Council
- High Peak Council
- CarmarthenshireCountyCouncil

## 0.121.1 (2024-12-03)

### Fix

- London Borough of Lewisham to have more reliable parsing of dates

## 0.121.0 (2024-11-24)

### Feat

- Royal Borough of Greenwich
- Adding London Borough of Lewisham
- Adding Hackney Council
- Adding Sandwell Borough Council
- Adding Moray Council
- Adding Kings Lynn and West Norfolk Borough Council
- Adding Wyre Forest District Council
- Adding Folkstone and Hythe District Council
- Adding Cheltenham Borough Council
- Adding Thurrock Council

### Fix

- West Northamptonshire Council
- East Ayrshire Council
- Cotswold District Council

## 0.120.0 (2024-11-20)

### Feat

- Adding Hartlepool Borough Council
- Adding Newcastle Under Lyme Council
- Adding London Borough of Havering
- Add Garden collection to EnvironmentFirst
- Adding Cumberland Council (Allerdale District)
- Adding North Hertfordshire District Council

### Fix

- #844
- #778
- #769
- #1025
- Mid Siffolk and Babergh Garden Collection Day
- #1026
This will require the use of a DAY to be added to the UPRN field
- #1029
- #1028

## 0.119.0 (2024-11-20)

### Feat

- Adding Braintree District Council
- Adding Burnley Borough Council
- Adding Exeter City Council
- Adding Edinburgh City Council

### Fix

- #699
- #1015
- #1017
- #894

## 0.118.0 (2024-11-15)

### Feat

- Adding Aberdeen City Council
- Adding Wolverhampton City Council
- Adding Stevenage Borough Council
- Adding Thanet District Council
- Adding Copeland Borough Council
- Adding South Hams District Council

### Fix

- #1019
- #966
- #989
- #1004
- #1006
- #1008
- Rother District Council

## 0.117.0 (2024-11-13)

### Feat

- Adding South Staffordshire District Council fix: #885
- Adding Rother District Council

### Fix

- #1009

## 0.116.0 (2024-11-12)

### Feat

- Adding Ashfield District Council
- Adding Gravesham Borough Council
- Adding Argyll and Bute Council

### Fix

- CrawleyBoroughCouncil
- #1005
- Adding Garden collection to Babergh and MidSuffolk Council
- #995
- #579
- #991
- #692
- CheshireWestAndChesterCouncil
- #993
- Milton Keynes
- #702
- Adding Babergh and Mid Suffolk District Councils
- #868
fix: #919
- Adding Derby City Council
- #987

## 0.115.0 (2024-11-11)

### Feat

- Adding Warrington Borough Council
- Adding Antrim And Newtonabbey Council
- Adding Hertsmere Borough Council
- Adding West Lancashire Borough Council
- Broxbourne Council

### Fix

- #695
- #969
- #776
- #980
- #982
- Bradford MDC
- #984

## 0.114.6 (2024-11-09)

### Fix

- NBBC Date Fix

## 0.114.5 (2024-11-08)

### Fix

- migration logging and debugging

## 0.114.4 (2024-11-08)

### Fix

- migration not working
- migration not working

## 0.114.3 (2024-11-08)

## 0.114.2 (2024-11-08)

## 0.114.1 (2024-11-08)

### Fix

- Update manifest.json

## 0.114.0 (2024-11-07)

### Feat

- Nuneaton and Bedworth Borough Council

## 0.113.0 (2024-11-07)

## 0.112.1 (2024-11-07)

## 0.112.0 (2024-11-06)

### Feat

- adding calendar for Bins in Custom Component

### Fix

- fix manifest in custom component
- #975 adding routine to handle migration error
- #975 adding routine to handle migration error
- #767 BREAKING CHANGE - READD your sensors / config

## 0.111.0 (2024-11-06)

### Fix

- Add London Borough of Sutton
- #944
- Add Mid Devon Council
- #945
- Adding Oxford City Council
- #962
- Tunbridge Wells / Lincoln
- #963
- Glasgow City Council

## 0.110.0 (2024-11-04)

### Fix

- Adding Blaby District Council
- #904
- Adding Sefton Council
- #770
- Adding Bromsgrove District Council
- #893
- East Lindsey District Council
- #957
- Adding Carmarthenshire County Council
- #892
fix: #710
- Adding East Ayrshire Council
- #955

## 0.109.2 (2024-11-03)

### Fix

- CC testing and add Chesterfield

## 0.109.1 (2024-11-03)

### Fix

- CC testing and add Chesterfield
- CC testing and add Chesterfield

## 0.109.0 (2024-11-02)

### Feat

- Adding Cotswold District Council
- Adding Breckland Council

### Fix

- St Helens Borough Council
- #753
- NewarkAndSherwoodDC
- #941
- #658
- #656

## 0.108.2 (2024-11-01)

### Fix

- pytest-homeassistant-custom-component

## 0.108.1 (2024-11-01)

### Fix

- Pydandic version
- Pydandic version

## 0.108.0 (2024-11-01)

### Feat

- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes

## 0.107.0 (2024-10-31)

### Feat

- Adding Powys Council
- Adding Worcester City Council
- Adding Ards and North Down Council
- Adding East Herts Council
- Adding Ashford Borough Council

### Fix

- WestOxfordshireDistrictCouncil
- South Norfolk Council
- ForestOfDeanDistrictCouncil
- Croydon Council
- South Kesteven District Council
- #647
- #630
- #623
- #586
- #578
- #389

## 0.106.0 (2024-10-28)

### Feat

- Adding Stockton On Tees Council
- Adding Fife Council
- Adding Flintshire County Council

### Fix

- #930
- #933
- #750

## 0.105.1 (2024-10-24)

### Fix

- Refactor Midlothian Council scraper to use house number and postcode
- West Berkshire Council
- Southwark Council

## 0.105.0 (2024-10-21)

### Feat

- Adding Teignbridge Council
- Adding Harborough District Council
- Adding Watford Borough Council
- Adding Coventry City Council
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- Adding Powys Council
- Adding Worcester City Council
- Adding Ards and North Down Council
- Adding East Herts Council
- Adding Ashford Borough Council
- Adding Stockton On Tees Council
- Adding Fife Council
- Adding Flintshire County Council
- Adding Teignbridge Council
- Adding Harborough District Council
- Adding Watford Borough Council
- Adding Coventry City Council
- Python 3.12 only and CustomComp. Unit testing

### Fix

- #580
- #888
- #902
- #607
- CC testing and add Chesterfield
- CC testing and add Chesterfield
- CC testing and add Chesterfield
- pytest-homeassistant-custom-component
- Pydandic version
- Pydandic version
- WestOxfordshireDistrictCouncil
- South Norfolk Council
- ForestOfDeanDistrictCouncil
- Croydon Council
- South Kesteven District Council
- #647
- #630
- #623
- #586
- #578
- #389
- #930
- #933
- #750
- Refactor Midlothian Council scraper to use house number and postcode
- West Berkshire Council
- Southwark Council
- #580
- #888
- #902
- #607

## 0.104.0 (2024-10-20)

### Feat

- Adding Luton Borough Council
- Adding West Oxfordshire District Council
- Adding Aberdeenshire Council
- Adding Canterbury City Council
- Adding Swindon Borough Council

### Fix

- #697
- #694
- #659
- #590
- #900

## 0.103.0 (2024-10-20)

### Feat

- Adding RAW JSON Sensor

### Fix

- Black formatting
- Black formatting

## 0.102.0 (2024-10-20)

### Feat

- Moving from Attributes to Sensors
- Moving from Attributes to Sensors

## 0.101.0 (2024-10-20)

### Feat

- Add Midlothgian Council

## 0.100.0 (2024-10-18)

### Feat

- Adding Dudley Council
- Adding South Ribble Council
- Plymouth Council
- Adding Norwich City Council

### Fix

- #744
- #671
- #566
- #749

## 0.99.1 (2024-10-16)

### Fix

- #792 adding web_driver option to Wokingham Council

## 0.99.0 (2024-10-16)

### Feat

- Adding Lincoln Council
- Adding Tunbridge Wells Council
- Adding Perth and Kinross Council

### Fix

- Update wiki
- #748
- #598
- #572

## 0.98.5 (2024-10-15)

### Fix

- Swale Borough Council
- HaltonBoroughCouncil
- Barnet Council
- WestBerkshireCouncil

## 0.98.4 (2024-10-14)

### Fix

- West Suffolk Council
- Vale of White Horse Council
- Uttlesford District Council
- Neath Port Talbot Council
- Merton Council
- Manchester City Council
- Glasgow City Council
- BradfordMDC

## 0.98.3 (2024-10-13)

### Fix

- EastRiding

## 0.98.2 (2024-10-13)

### Fix

- MoleValley

## 0.98.1 (2024-10-13)

### Fix

- Barnet and Bexley

## 0.98.0 (2024-10-13)

### Feat

- Adding Wirral Council
- Adding Lichfield District Council
- Adding West Morland And Furness
- Adding Walsall Council
- Adding Armagh, Banbridge and Craigavon Council

### Fix

- #602
- #830
- #870
- #873
- #877

## 0.97.1 (2024-10-10)

### Fix

- NottinghamCityCouncil
- #875

## 0.97.0 (2024-10-10)

### Feat

- Adding Falkirk Council

### Fix

- #761

## 0.96.0 (2024-10-10)

### Feat

- Adding London Borough Harrow
- Adding North Ayrshire Council
- Adding Highland Council
- Add Elmbridge Borough Council
- Adding Southwark Council
- South Derbyshire District Council

### Fix

- #871
- #869
- #780
- #845
fix: #754
- #835
- #842

## 0.95.0 (2024-10-09)

### Feat

- Adding London Borough of Ealing

## 0.94.0 (2024-10-09)

### Feat

- Adding London Borough of Lambeth
- Adding Dacorum Borough Council

### Fix

- Dacorum Borough Council
- East Devon DC

## 0.93.0 (2024-10-08)

### Feat

- Update CheshireEastCouncil.py

## 0.92.0 (2024-10-08)

### Feat

- Update CheshireEastCouncil.py
- Update README.md
- Adding Wokingham Borough Council
- Adding Winchester City Council
- Adding Basildon Council
- Adding Colchester City Council

### Fix

- RochfordCouncil
- Neath Port Talbot Council
- Buckinghamshire Council
- #639
fix: #812

## 0.91.2 (2024-10-05)

### Fix

- Windsor and Maidenhead Council

## 0.91.1 (2024-10-04)

## 0.91.0 (2024-10-03)

## 0.90.0 (2024-10-03)

### Feat

- Adding East Renfrewshire Council

### Fix

- Update DorsetCouncil.py
- #829
- Update GatesheadCouncil.py
- #822

## 0.89.1 (2024-10-02)

### Fix

- High Peak have changed their cookie dialog Seems to be safe to ignore it now.

## 0.89.0 (2024-09-27)

### Feat

- Update CheshireEastCouncil.py
- Update README.md

### Fix

- release to be non pre release

## 0.88.0 (2024-09-16)

### Feat

- Add Ealing Council

### Fix

- Update README.md

## 0.87.0 (2024-09-10)

### Feat

- Add IslingtonCouncil

### Fix

- #565 Gloucester city council driver

## 0.86.1 (2024-09-09)

### Fix

- #773 Wakefield

## 0.86.0 (2024-09-06)

### Feat

- added Rotherham Council

## 0.85.7 (2024-09-05)

### Fix

- more unit tests
- more unit tests
- Chorley

## 0.85.6 (2024-09-03)

### Fix

- #795 and add reconfigure to custom comp.

## 0.85.5 (2024-09-03)

## 0.85.4 (2024-09-03)

### Fix

- #795 and add reconfigure to custom comp.
- #795 Unit Test Coverage

## 0.85.3 (2024-09-02)

### Fix

- #795 unit test coverage

## 0.85.2 (2024-09-02)

### Fix

- 791 Glasgow URL change

## 0.85.1 (2024-09-02)

### Fix

- 779 Add correct async wait to Home Assistant

## 0.85.0 (2024-08-27)

### Feat

- support for enfield council

## 0.84.2 (2024-08-27)

### Fix

- Re-work North Tyneside Council module for 2024 - some addresses do not have a garden collection
- Re-work North Tyneside Council module for 2024

## 0.84.1 (2024-08-08)

### Fix

- #771 Bolton bullet points on dates is now fixed

## 0.84.0 (2024-07-31)

## 0.83.0 (2024-07-07)

### Feat

- add has_numbers() function

### Fix

- update Gedling Borough Council parser to use alternative name key
- change Gedling to use new JSON data
- update instructions for Gedling
- update input.json to use UPRN parameter
- change DorsetCouncil.py to use API links provided in #756
- explicit import of logging.config to stop error in Python 3.11

## 0.82.0 (2024-06-13)

### Feat

- adding dev container updates
- adding dev container updates
- refactoring main files
- adding ability to set local mode in HA custom comp. if users dont have a Selenium Server

### Fix

- MidSussex

## 0.81.0 (2024-06-05)

### Feat

- Adding Wychavon District Council

### Fix

- IntTestWarnings
- IntTestWarnings

## 0.80.0 (2024-06-02)

### Feat

- Adding Uttlesford District Council
- Adding Stafford Boro Council
- Adding Swansea Council
- Adding New Forest
- Adding Three Rivers
- Adding Three Rivers

### Fix

- ThreeRivers
- #425 Entities are not updated
- sessions to avoid deprecation
- Update docker-image.yml
- Update docker-image.yml

## 0.79.1 (2024-05-29)

### Fix

- Change CSS class in search for collection types

## 0.79.0 (2024-05-28)

### Feat

- Adding Dartford
- Adding South Kesteven District Council
- Adding ChichesterCouncil
- adding HounslowCouncil
- adding HounslowCouncil
- adding HounslowCouncil
- Epping Fix
- Adding Epping Forest District Council
- Update input.json
- Epping Forest District Council
- Adding Stroud District Council
- Add support for Tendring District Council
- #269 Adding Waltham Forest
- #269 Adding Waltham Forest
- Adding council creation script

### Fix

- Update Mole Valley URL

## 0.78.0 (2024-05-26)

### Feat

- Add support for Fareham Borough Council

## 0.77.0 (2024-05-26)

### Feat

- Add support for Bracknell Forest Council

## 0.76.1 (2024-05-24)

### Fix

- Handle Barnet council cookies message

## 0.76.0 (2024-05-24)

### Feat

- add bin colour support WestSuffolkCouncil style: black format WestSuffolkCouncil
- add bin colour support WestSuffolkCouncil style: black format WestSuffolkCouncil

## 0.75.0 (2024-05-19)

### Feat

- #725 Add names to selenium test videos using "se:name" option in create webdriver function

## 0.74.1 (2024-05-18)

### Fix

- #693 Cheshire West & Chester Council Sensor Bug
- #693 Cheshire West & Chester Council Sensor Bug

## 0.74.0 (2024-05-17)

### Feat

- #722 Support Python 3.12
- #722 Support Python 3.12
- #722 Support Python 3.12

## 0.73.0 (2024-05-17)

### Feat

- #708 Adding HA to the dev container for debugging

## 0.72.0 (2024-05-17)

### Feat

- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging

## 0.71.0 (2024-05-17)

### Feat

- Update for West Suffolk Councils new website

## 0.70.0 (2024-05-17)

### Feat

- #708 Dev Container
- Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 simplifying Selenium integration tests
- #708 simplifying Selenium integration tests
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Dev Container testing
- #708 - dev container changes
- #706 Adding Dev Container
- #706 Adding initial Dev Container

## 0.69.7 (2024-05-17)

### Fix

-  #713 BarnsleyMBCouncil.py

## 0.69.6 (2024-05-16)

### Fix

- #709 Update DoverDistrictCouncil.py

## 0.69.5 (2024-05-14)

### Fix

- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 test coverage back to 100%

## 0.69.4 (2024-05-09)

### Fix

- pass in required parameter into `create_webdriver`
- test runners for `MiltonKeynesCityCouncil` and `NorthEastLincs`.

## 0.69.3 (2024-05-09)

### Fix

- fix AttributeError when no garden waste collection is available for properties using Huntingdon District Council
- add support for parsing "Today" / "Tomorrow" as date text for `BarnsleyMBCouncil`
- add support for parsing "Tomorrow" as date text for `LiverpoolCityCouncil`

## 0.69.1 (2024-05-01)

### Fix

- Handling the "Website cookies enhance your user experience." button
- Handling the "Website cookies enhance your user experience." button

## 0.69.0 (2024-04-28)

### Feat

- Adding Renfrewshire Council
- Adding Renfrewshire Council

## 0.68.2 (2024-04-28)

### Fix

- Remove 'import Dumper'

## 0.68.1 (2024-04-27)

### Fix

- input.json Bradford missing comma

## 0.68.0 (2024-04-27)

### Feat

- Add support for West Berkshire Council
- add support for Knowsley Metropolitan Borough Council
- add support for Cheshire West and Chester Council
- add support for Cheshire West and Chester Council

## 0.66.2 (2024-04-18)

### Fix

- Update HaringeyCouncil.py issue #670

## 0.66.1 (2024-04-15)

### Fix

- parse datetimes correctly and round to midnight

## 0.66.0 (2024-04-15)

## 0.65.2 (2024-04-15)

### Fix

- change address selection to fix errors selecting the user's PAON

## 0.65.1 (2024-04-15)

### Fix

- add check for parsed string length to stop datetime parsing error

## 0.65.0 (2024-04-13)

### Feat

- add Arun council
- add support for Sunderland City Council
- add support for Sunderland City Council

## 0.64.3 (2024-03-25)

### Fix

- sort data and correct dictionary name (#609)

## 0.64.2 (2024-03-24)

## 0.64.1 (2024-03-24)

### Fix

- fix Kirklees address search (switch to house & postcode)
- fixes json

## 0.64.0 (2024-03-23)

### Feat

- add Kirklees council

### Fix

- fixes json

## 0.63.0 (2024-03-23)

### Feat

- Add Solihull Council (#513)
- Add Adur and Worthing Councils (#544)
- Add Dover District Council (#614)
- Add Rochford Council (#620)
- Add Tandridge District Council (#621)
- Add West Northamptonshire Council (#567)
- Add Hull City Council (#622)
- Add Wyre Council (#625)
- Add Telford and Wrekin Co-operative Council (#632)
- Add Mansfield District Council (#560)
- Add Bedford Borough Council (#552)

### Fix

- spacing on input.json
- realign input.json
- capitalize bin type text
- formatting on input.json
- incorrect collections
- update testing URL for Merton
- attempt to resolve invisible banner hiding postcode box
- resolve JSON schema exception for date formatting
- resolve JSON schema exception for date formatting
- accept cookies banner

## 0.62.0 (2024-03-03)

### Fix

- Added missing .feature file entry to the test config for NewhamCouncil

## 0.61.1 (2024-02-16)

### Fix

- code optimisations
- Fix date parsing in WestLindseyDistrictCouncil.py

## 0.61.0 (2024-02-11)

### Feat

- Add Mole Valley District Council

## 0.60.1 (2024-02-03)

### Fix

- Update input.json Closes #599

## 0.60.0 (2024-01-28)

### Feat

- Add Scraper for St Albans City and District Council

## 0.59.1 (2024-01-25)

### Fix

- add wiki note for castlepoint
- update test data for castlepoint
- remove single line causing issues

## 0.59.0 (2024-01-20)

### Feat

- Add NorthYorkshire to test feature file
- Add north yorkshire to test input
- Add Support for north yorkshire council

### Fix

- remove unused code

## 0.58.8 (2024-01-19)

### Fix

- barnet no overrides

## 0.58.7 (2024-01-18)

### Fix

- accidentally returned strings when needed date objects, refactor to handle this
- checking for future/past dates

## 0.58.6 (2024-01-18)

### Fix

- correct date handling for North West Leicestershire

## 0.58.5 (2024-01-15)

### Fix

- Don't call driver.quit where already handled by finally block

## 0.58.4 (2024-01-15)

### Fix

- remove extra driver.quit to prevent errors

## 0.58.3 (2024-01-15)

### Feat

- Added support for Newham Council's bin collections

### Fix

- Add a default value for user_agent to fix all councils using selenium and not specifying agent

## 0.58.2 (2024-01-11)

### Fix

- use static values for bin types

## 0.58.1 (2024-01-10)

### Fix

- Eastleigh Borough Council doesnt cope with "You haven't yet signed up for ..."
- Eastleigh Borough Council doesnt cope when Garden Waste service hasn't been signed up for, which gets the value "You haven't yet signed up for our garden waste collections. Find out more about our\xa0garden waste collection service" which results in  ValueError: time data

## 0.58.0 (2024-01-10)

### Feat

- Add Test Valley Borough Council

## 0.57.0 (2024-01-09)

### Feat

- Add support for Chorley Council

## 0.56.13 (2024-01-09)

### Fix

- update logic to account for council website change

## 0.56.12 (2024-01-09)

### Fix

- duplicate driver.quit() calls causes error

## 0.56.11 (2024-01-08)

### Fix

- Headless now working on custom comp Update sensor.py

## 0.56.10 (2024-01-08)

### Fix

- headless mode in custom component

## 0.56.9 (2024-01-08)

### Fix

- headless mode

## 0.56.8 (2024-01-08)

### Fix

- headless in custom comp

## 0.56.7 (2024-01-08)

### Fix

- headless options

## 0.56.6 (2024-01-07)

### Fix

- modified Kingston-upon-Thames driver for greater reliability.

## 0.56.5 (2024-01-07)

### Fix

- Update KingstonUponThamesCouncil.py

## 0.56.4 (2024-01-07)

### Fix

- Update KingstonUponThamesCouncil.py

## 0.56.3 (2024-01-07)

### Fix

- headless options
- #542 - Selenium Grid Sessions must be terminated cleanly
- #542 - Selenium Grid Sessions must be terminated cleanly

## 0.56.2 (2024-01-07)

### Fix

- Update strings.json
- Update en.json
- Update config_flow.py

## 0.56.1 (2024-01-07)

### Fix

- Update common.py

## 0.156.0 (2025-10-11)

### Feat

- Create tag-on-merge.yml
- Update bump.yml
- fix bump.yml
- Update TorbayCouncil.py
- Update bump.yml
- fix release pipeline bump.yml
- fix Torbay

### Fix

- Update AberdeenCityCouncil.py
- Update TorbayCouncil.py
- Update TorbayCouncil.py
- Update TorbayCouncil.py
- Update URL for NewForestCouncil
- New URL and page for wheelie bins
- improve Mid Suffolk District Council holiday handling with dynamic bank holiday detection
- Oxford now rejects the "Requests" default user agent
- #1557 - Adding East Dunbartonshire
- #1557 - Adding East Dunbartonshire
- #1569 - Somerset Council
- #1569 - Somerset Council
- #1559 - Newport City Council
- #1559 - Newport City Council
- #1574 - Test Valley Borough Council
- #1574 - Test Valley Borough Council
- #1566 South Gloucestershire Council

## 0.154.0 (2025-09-21)

### Feat

- handle changes to northumberland council website
- modify input for NorthumberlandCouncil to accept uprn instead of house number, and use new page structure

### Fix

- the cookie banner is not optional
- #1570 - Slough Borough Council
- #1570 - Slough Borough Council
- #1520 - Erewash Borough Council
- #1520 - Erewash Borough Council
- #1554 - Folkestone and Hythe District Council
- #1554 - Folkestone and Hythe District Council
- #1604 - West Berkshire Council
- #1604 - West Berkshire Council
- #1606 - Brighton and Hove City Council
- #1606 - Brighton and Hove City Council
- #1565 - BCP Council
- #1565 - BCP Council
- #1571 - Castle Point District Council
- #1571 - Castle Point District Council
- #1584 - NorthHertfordshireDistrictCouncil
- #1584 - NorthHertfordshireDistrictCouncil
- #1599
- #1599 - Basingstoke Council
- #1587
- #1587 - Hartlepool Borough Council
- #1588
- #1588 Glasgow City Council
- #1591
- #1591 Rushmoor Council

## 0.153.0 (2025-09-02)

### Feat

- Change buckinghamshire council to get data from endpoint

### Fix

- 1573 Update Bolton council URL
- East Herts Council
- #1575
- Runnymede Borough Council
- #1513
- Wiltshire Council
- #1533
- Staffordshire Moorlands District Council
- #1535
- Ipswich Borough Council
- #1548
- North East Lincs
- Hinckley and Bosworth Borough Council
- Nuneaton Bedworth Borough Council
- #1514
- Lichfield District Council
- 1549

## 0.152.11 (2025-08-25)

### Feat

- fix releases process

### Fix

- date extraction in RochfordCouncil data parsing
- parsing error in BH selenium
- **hacs**: respect the headless option

### Refactor

- **hacs**: improve build_ukbcd_args with formatter functions

## 0.152.10 (2025-08-04)

### Fix

- Gateshead and East Lothian
- Enfield and Broxbourne
- East Herts
- FermanaghOmaghDistrictCouncil
- Enfield and Broxbourne
- East Herts

## 0.152.9 (2025-08-03)

### Fix

- Cotswald and coventry
- Fixing multiple broken councils
- multiple broken councils

## 0.152.8 (2025-07-26)

### Fix

- Add headers to request for Swindon Borough Council
- Add headers to requests for Royal Borough of Greenwich Fixes #1496 by ensuring that the requests are not rejected due to lack of headers.
- **MidlothianCouncil**: add request headers to resolve 403 Forbidden

## 0.152.7 (2025-07-01)

### Fix

- maidstone selenium fix

## 0.152.6 (2025-06-18)

### Fix

- removed In Progress from date
- removed a degub print statement
- **RugbyBoroughCouncil**: Amended parsed date from full to abbreviated month date, may worked but jun and jul did not
- **RugbyBoroughCouncil**: Amended parsed date
- Reworked Cumberland Council to cater for postcode addition
- **OxfordCityCouncil**: Fixed Oxford City Council parsing dues to changes in output from the website

## 0.152.5 (2025-06-07)

### Fix

- South Ribble and version pinning issues for input.json

## 0.152.4 (2025-06-07)

### Fix

- **SouthRibble**: Corrected Date formatting issue
- **SouthRibble**: Resolved South Ribble without selenium

## 0.152.3 (2025-06-04)

### Fix

- NorthHertfordshire selenium script
- Adur council
- Eastleigh date fix
- removed duplicates in BradfordMDC

## 0.152.2 (2025-06-04)

### Fix

- Update Makefile
- Update CheshireEastCouncil.py
- Github action to handle branch name with parentheses

## 0.152.1 (2025-05-15)

### Fix

- Update to fix North Somerset
- Glasgow SSL bypass
- more robust Northumberland
- updated Eastleigh input.json
- Eastleigh cloudflare fix
- converted collection datetimes into dates for BH parsing.
- Eastleigh cloudflare fix
- Eastleigh cloudflare fix
- added check_uprn to simplified councils
- simplified Swindon
- simplified East Devon
- simplified Dover
- Simplified Dartford
- simplified Cheshire East
- simplified Charnwood input.json
- improved Charnwood
- Adur Worthing fix
- Chorley simplification
- Bexley simplification
- added URL to Torbay script
- Guildford fixes
- reworked Maidstone
- maidstone input.json
- Croydon selenium version
- Stoke date-time fix

## 0.152.0 (2025-05-02)

### Feat

- Added Fermanagh Omagh
- Added Twekesbury
- added Slough council
- Added Argus Council
- added Angus to input.json

### Fix

- Chichester now only requires postcode and house number
- Broadland now only requires postcode and house number
- Barking now only requires postcode and house number
- Brighton now only requires postcode and house number
- ensured all bins for this council
- added skip_get_url to hyndburn

## 0.151.0 (2025-04-27)

### Feat

- version bump

### Fix

- more robust brent date handling
- input.json requires web_driver
- Rugby fix

## 0.150.0 (2025-04-27)

### Feat

- added melton
- added pembrokeshire

### Fix

- added melton
- processed all bins for Moray

## 0.148.6 (2025-04-27)

## 0.148.5 (2025-04-27)

### Fix

- output check
- parsed bin info
- selenium navigation
- input.json changes

## 0.148.4 (2025-04-27)

### Fix

- used canonical 'nice name'

## 0.148.3 (2025-04-25)

### Fix

- working hyndburn
- hyndburn input.json

## 0.148.2 (2025-04-24)

### Fix

- Update docker-compose.yml
- updated input.json
- cloudflare fix - switch to selenium method
- simplified blackburn

## 0.148.1 (2025-04-22)

### Fix

- added bank holiday offsets.
- added bank holiday offsets.

## 0.148.0 (2025-04-19)

### Feat

- adding Wrexham and #1046 Horsham councils

### Fix

- Argyll and Bute council #1053

## 0.147.2 (2025-04-18)

### Fix

- wait for element to be clickable

## 0.147.1 (2025-04-18)

### Fix

- #1351 - moved geopandas to petry dev

## 0.147.0 (2025-04-18)

### Feat

- add council tests results map

## 0.146.2 (2025-04-18)

### Fix

- adding map checking and matching

## 0.146.1 (2025-04-18)

### Fix

- more robust bank holiday handling

## 0.146.0 (2025-04-18)

### Feat

- #1342 Adding Includes Trafford, Clackmannanshire, Havant, North Warwickshire, Newry Mourne and Down, East Dunbartonshire, Pendle, Torfaen, East Hampshire, Ribble Valley, Brentwood, Isle of Wight, Westmorland and Furness, Derry and Strabane, and Norwich. Google Cal support for PDF councils via ICS file

### Fix

- Black reformatting

## 0.145.0 (2025-04-18)

### Feat

- Adding PDF councils

## 0.144.4 (2025-04-18)

### Fix

- Bristol #1275

## 0.144.3 (2025-04-17)

### Fix

- better address for input.json
- bank holiday overrides
- more robust address searching
- simple parsing done
- Selenium navigation

## 0.144.2 (2025-04-17)

### Fix

- knowsley
- knowsley
- knowsley
- knowsley
- KnowsleyMBCouncil.py
- #1220 adding Mid Ulster District Council

## 0.144.1 (2025-04-17)

### Fix

- fix Sandwell garden waste collection date

## 0.144.0 (2025-04-17)

### Feat

- added great yarmouth

## 0.143.6 (2025-04-17)

### Fix

- Renfrewshire Council

## 0.143.5 (2025-04-17)

### Fix

- Google Cal

## 0.143.4 (2025-04-17)

### Fix

- Google Cal

## 0.143.3 (2025-04-15)

### Fix

- #1301 Fix Leeds Council

## 0.143.2 (2025-04-15)

### Fix

- #1301 Fix Leeds Council

## 0.143.1 (2025-04-15)

### Fix

- Set the bin_type when different day

## 0.143.0 (2025-04-13)

### Fix

- corrected url in input.json
- fixed input.json
- parsed Barking Dagenham collection information
- selenium navigation Barking

## 0.142.0 (2025-04-13)

### Feat

- Added Stirling Council

### Fix

- typo in input.json

## 0.141.4 (2025-04-13)

### Fix

- #1304 - sesnors goes to unknown if the data is blank from councils who are less reliable

## 0.141.3 (2025-04-13)

### Fix

- Newham council

## 0.141.2 (2025-04-13)

### Fix

- Newham council
- Newham council

## 0.141.1 (2025-04-12)

### Fix

- missing finally block on selenium tests

## 0.141.0 (2025-04-12)

### Feat

- #1185 Adding PeterboroughCity Council

## 0.140.0 (2025-04-11)

### Feat

- Added Broadland District Council

### Fix

- cleanup of council file
- added Broadland to input.json

## 0.139.0 (2025-04-07)

### Feat

- adding #1037
- adding #1032 North Devon Count Council

### Fix

- #1296 Forest of dean
- 939 adding South Holland District Council - Lincolnshire UK

## 0.138.1 (2025-04-05)

### Fix

- Walhtam forest council - revert previous changes

## 0.138.0 (2025-04-05)

### Feat

- Adding Hastings Borough Council
- Adding Fylde Council

### Fix

- #1249
- #1039
fix: #1181
fix: #1266
fix: #1274
- Gloucester City Council
- #1282
- Mid Devon Council
- #1277
fix: #1287
- West Oxfordshire Council
- #1290

## 0.137.0 (2025-04-05)

### Feat

- #816 adding trafford council

## 0.136.0 (2025-03-24)

### Feat

- Adding Southampton City Council
- Adding Cambridge City Council
- Adding Spelthorne Borough Council

### Fix

- #1057
- #1264
- #1270
- Bexley Council
- #1256
- HinckleyandBosworthBoroughCouncil
- #1207
- Hackney Council
- #1230
- Castlepoint District Council
- #1252
- Canterbury City Council
- #1254

## 0.135.4 (2025-03-24)

### Fix

- parse scheduleCodeWorkflowIDs instead of scheduleCodeWorkflowID for Hackney Council

## 0.135.3 (2025-02-23)

## 0.135.2 (2025-02-19)

### Fix

- North Yorkshire - multiple bins on a day

## 0.135.1 (2025-02-18)

### Fix

- devcontainer

## 0.135.0 (2025-02-17)

### Fix

- #833 adding Middlesbrough and check script for Selenium
- Cotswold District Council
- #1238
- Leeds City Council
- #1222

## 0.134.3 (2025-02-15)

### Fix

- Update input.json
- 1235 Councils missing Selenium in input.json

## 0.134.2 (2025-02-15)

### Fix

- 1232 East herts missing Selenium url in input.json
- Derbyshire Dales District Council
- Conwy County Borough
- Sunderland City Council
- #1219
- Tendring District Council
- #1221

## 0.134.1 (2025-02-11)

### Fix

- Cheltenham Borough Council
- #1061

## 0.134.0 (2025-02-07)

### Feat

- Ipswich Borough Council - trying different address
- Ipswich Borough Council - correcting param name in input.json
- Ipswich Borough Council - added input.json values and refactored code
- Ipswich Borough Council - initial implementation
- Adding Runnymede Borough Council
- Adding Cherwell District Council
- Adding Epsom and Ewell Borough Council
- Adding Redcar and Cleveland Council
- Adding Amber Valley Borough Council
- Adding Bolsover Council

### Fix

- #1214
- #923
- #895
- #841
- #903
- #990
- Torridge District Council
- #1204
- Neath Port Talbot
- #1213

## 0.133.0 (2025-02-02)

### Feat

- adding manual refresh

## 0.132.0 (2025-02-02)

### Feat

- adding manual refresh

## 0.131.0 (2025-02-02)

### Feat

- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding unit tests for the new manual refresh
- adding manual refresh control

## 0.130.1 (2025-01-30)

### Fix

- slow councils

## 0.130.0 (2025-01-29)

### Feat

- Add Herefordshire Council (closes: #1011)

### Fix

- Fix spacing in wiki name

## 0.129.0 (2025-01-29)

### Fix

- input.json
- input.json

## 0.128.6 (2025-01-29)

### Fix

- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting

## 0.128.5 (2025-01-29)

### Feat

- Adding East Staffordshire Borough Council

### Fix

- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update CheshireEastCouncil.py
- Adding East Lothian Council
- #1171
- #1052
fix: #1083

## 0.128.4 (2025-01-28)

### Feat

- Adding Boston Borough Council

### Fix

- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Leicester City Council
- #1178
- Cardiff Council
- #1175
- Newcastle City Council
- #1179
- #1180
- Midlothian Council
- #1192 - Adding Next Page support

## 0.128.3 (2025-01-28)

### Fix

- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml

## 0.128.2 (2025-01-28)

### Fix

- Add communal recycling and communal rubbish
- Add garden waste to Merton Council

## 0.128.1 (2025-01-28)

### Fix

- Update AberdeenshireCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml

## 0.128.0 (2025-01-28)

### Feat

- implement Medway Council (#1021)

### Fix

- Forgot to include skip_get_url

## 0.127.4 (2025-01-25)

### Fix

- NewForestCouncil

## 0.127.3 (2025-01-16)

### Fix

- Swale Borough Council
- #1139
- Vale of White Horse
- #1156
- South Oxfordshire Council
- #1158
- Surrey Heath Borough Council
- #1164
- Carmarthenshire County Council
- #1167
- Glasgow City Council
- #1166

## 0.127.2 (2025-01-13)

### Fix

- Update bin type to be the full string

## 0.127.1 (2025-01-10)

### Fix

- Use visibility of list rather than existence
- Update Rushcliffe Borough Council input elements and flow
- Merton Council
- NewarkAndSherwoodDC
- Rushcliffe Borough Council
- Powys Council
- Staffordshire Moorlands District Council
- Stroud District Council
- Vale of Glamorgan Council
- West Oxfordshire District Council

## 0.127.0 (2025-01-07)

### Feat

- Adding Oadby And Wigston Borough Council
- Add Gwynedd Council
- Adding Denbighshire Council
- Adding Dundee City Council
- Adding Brent Council
- Adding West Dunbartonshire Council
- Adding Cumberland Council

### Fix

- #929
- Cornwall Council
- #1137
- #1125
- #1106
- #1108
- #1109
- #1134
- Northumberland Council
- #1082
- #1110
- Waltham Forest
- #1126
- London Borough Sutton
- #1131
- Kirklees Council
- #1129 - Breaking Change. UPRN required

## 0.126.2 (2025-01-07)

### Fix

- **tests**: updates test case url for coventry city council
- **tests**: removes duplicate key for coventry city council
- updates coventry city council button text

## 0.126.1 (2025-01-06)

### Fix

- behave_testing
- behave_testing

## 0.126.0 (2025-01-04)

### Fix

- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml

## 0.125.2 (2025-01-04)

### Fix

- Update ArdsAndNorthDownCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Swale Borough Council
- #1080
(cherry picked from commit 6f580b39fb68b8079990221e050ae8dd6d2b7285)
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update ArdsAndNorthDownCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Update WestLindseyDistrictCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml

## 0.125.1 (2025-01-04)

### Fix

- correctly handle year increment for January dates

## 0.125.0 (2025-01-04)

### Feat

- Adding Redditch Borough Council
- Adding Blaenau Gwent County Borough Council
- Adding Wandsworth Council

### Fix

- #1068
- #1098
- Wiltshire Council
- #1094
- Salford City Council
- #1097
- #1078
- Merton Council
- Swale Borough Council
- #1080
- London Borough Sutton
- #1076
- Update behave_schedule.yml
- Update bump.yml

## 0.124.4 (2025-01-04)

### Fix

- Update behave_schedule.yml

## 0.124.3 (2025-01-04)

### Fix

- allure reporting
- allure reporting
- allure reporting

## 0.124.2 (2025-01-03)

### Fix

- Update behave.yml

## 0.124.1 (2025-01-03)

### Fix

- avoid crashing on unexpected string value

## 0.124.0 (2025-01-02)

### Feat

- Hart District Council

## 0.123.2 (2024-12-19)

### Fix

- Update behave.yml

## 0.123.1 (2024-12-18)

### Feat

- #1063 - rewrite Kirklees Council parser for new website
- #1067 - Add garden bin collections where available for Norwich City Council
- Adding Wandsworth Council

### Fix

- Update AberdeenCityCouncil.py
- Update behave.yml
- #1101 - Fix table parsing for Walsall Council
- Remove invalid escape sequence warnings from West Lindsey District Council
- #1073 - change method of generating bin types to avoid manual mapping for Rugby Borough Council
- add missing backticks to separate colour config and standard usage instructions
- #1078
(cherry picked from commit 89d93666bb659010d1c130b98c1d81c6ff80cf7c)
- change date format to project default for Merton Council
- correct date logic for Swale Borough Council
- Merton Council
- London Borough Sutton
- #1076
(cherry picked from commit 1eab20c9a57c9c4438ea343f374202bb2e9b98ca)
- Swale Borough Council
- #1080
(cherry picked from commit 6f580b39fb68b8079990221e050ae8dd6d2b7285)
- correct date/year logic for West Lindsey District Council
- replace West Lindsey's input with working address
- #1089 - Correct shifted dates in Bromley Borough Council
- remove WDM import
- #1087 - Food waste date incorrect for West Berkshire Council

## 0.123.0 (2024-12-17)

## 0.122.0 (2024-12-04)

### Feat

- Adding Monmouthshire County Council
- Adding Hinckley and Bosworth Borough Council

### Fix

- Glasgow City Council
- Merton Council
- Blaby District Council
- Warwick District Council
- Blackburn Council
- Carmarthenshire County Council
- High Peak Council
- CarmarthenshireCountyCouncil

## 0.121.1 (2024-12-03)

### Fix

- London Borough of Lewisham to have more reliable parsing of dates

## 0.121.0 (2024-11-24)

### Feat

- Royal Borough of Greenwich
- Adding London Borough of Lewisham
- Adding Hackney Council
- Adding Sandwell Borough Council
- Adding Moray Council
- Adding Kings Lynn and West Norfolk Borough Council
- Adding Wyre Forest District Council
- Adding Folkstone and Hythe District Council
- Adding Cheltenham Borough Council
- Adding Thurrock Council

### Fix

- West Northamptonshire Council
- East Ayrshire Council
- Cotswold District Council

## 0.120.0 (2024-11-20)

### Feat

- Adding Hartlepool Borough Council
- Adding Newcastle Under Lyme Council
- Adding London Borough of Havering
- Add Garden collection to EnvironmentFirst
- Adding Cumberland Council (Allerdale District)
- Adding North Hertfordshire District Council

### Fix

- #844
- #778
- #769
- #1025
- Mid Siffolk and Babergh Garden Collection Day
- #1026
This will require the use of a DAY to be added to the UPRN field
- #1029
- #1028

## 0.119.0 (2024-11-20)

### Feat

- Adding Braintree District Council
- Adding Burnley Borough Council
- Adding Exeter City Council
- Adding Edinburgh City Council

### Fix

- #699
- #1015
- #1017
- #894

## 0.118.0 (2024-11-15)

### Feat

- Adding Aberdeen City Council
- Adding Wolverhampton City Council
- Adding Stevenage Borough Council
- Adding Thanet District Council
- Adding Copeland Borough Council
- Adding South Hams District Council

### Fix

- #1019
- #966
- #989
- #1004
- #1006
- #1008
- Rother District Council

## 0.117.0 (2024-11-13)

### Feat

- Adding South Staffordshire District Council fix: #885
- Adding Rother District Council

### Fix

- #1009

## 0.116.0 (2024-11-12)

### Feat

- Adding Ashfield District Council
- Adding Gravesham Borough Council
- Adding Argyll and Bute Council

### Fix

- CrawleyBoroughCouncil
- #1005
- Adding Garden collection to Babergh and MidSuffolk Council
- #995
- #579
- #991
- #692
- CheshireWestAndChesterCouncil
- #993
- Milton Keynes
- #702
- Adding Babergh and Mid Suffolk District Councils
- #868
fix: #919
- Adding Derby City Council
- #987

## 0.115.0 (2024-11-11)

### Feat

- Adding Warrington Borough Council
- Adding Antrim And Newtonabbey Council
- Adding Hertsmere Borough Council
- Adding West Lancashire Borough Council
- Broxbourne Council

### Fix

- #695
- #969
- #776
- #980
- #982
- Bradford MDC
- #984

## 0.114.6 (2024-11-09)

### Fix

- NBBC Date Fix

## 0.114.5 (2024-11-08)

### Fix

- migration logging and debugging

## 0.114.4 (2024-11-08)

### Fix

- migration not working
- migration not working

## 0.114.3 (2024-11-08)

## 0.114.2 (2024-11-08)

## 0.114.1 (2024-11-08)

### Fix

- Update manifest.json

## 0.114.0 (2024-11-07)

### Feat

- Nuneaton and Bedworth Borough Council

## 0.113.0 (2024-11-07)

## 0.112.1 (2024-11-07)

## 0.112.0 (2024-11-06)

### Feat

- adding calendar for Bins in Custom Component

### Fix

- fix manifest in custom component
- #975 adding routine to handle migration error
- #975 adding routine to handle migration error
- #767 BREAKING CHANGE - READD your sensors / config

## 0.111.0 (2024-11-06)

### Fix

- Add London Borough of Sutton
- #944
- Add Mid Devon Council
- #945
- Adding Oxford City Council
- #962
- Tunbridge Wells / Lincoln
- #963
- Glasgow City Council

## 0.110.0 (2024-11-04)

### Fix

- Adding Blaby District Council
- #904
- Adding Sefton Council
- #770
- Adding Bromsgrove District Council
- #893
- East Lindsey District Council
- #957
- Adding Carmarthenshire County Council
- #892
fix: #710
- Adding East Ayrshire Council
- #955

## 0.109.2 (2024-11-03)

### Fix

- CC testing and add Chesterfield

## 0.109.1 (2024-11-03)

### Fix

- CC testing and add Chesterfield
- CC testing and add Chesterfield

## 0.109.0 (2024-11-02)

### Feat

- Adding Cotswold District Council
- Adding Breckland Council

### Fix

- St Helens Borough Council
- #753
- NewarkAndSherwoodDC
- #941
- #658
- #656

## 0.108.2 (2024-11-01)

### Fix

- pytest-homeassistant-custom-component

## 0.108.1 (2024-11-01)

### Fix

- Pydandic version
- Pydandic version

## 0.108.0 (2024-11-01)

### Feat

- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes

## 0.107.0 (2024-10-31)

### Feat

- Adding Powys Council
- Adding Worcester City Council
- Adding Ards and North Down Council
- Adding East Herts Council
- Adding Ashford Borough Council

### Fix

- WestOxfordshireDistrictCouncil
- South Norfolk Council
- ForestOfDeanDistrictCouncil
- Croydon Council
- South Kesteven District Council
- #647
- #630
- #623
- #586
- #578
- #389

## 0.106.0 (2024-10-28)

### Feat

- Adding Stockton On Tees Council
- Adding Fife Council
- Adding Flintshire County Council

### Fix

- #930
- #933
- #750

## 0.105.1 (2024-10-24)

### Fix

- Refactor Midlothian Council scraper to use house number and postcode
- West Berkshire Council
- Southwark Council

## 0.105.0 (2024-10-21)

### Feat

- Adding Teignbridge Council
- Adding Harborough District Council
- Adding Watford Borough Council
- Adding Coventry City Council
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- Adding Powys Council
- Adding Worcester City Council
- Adding Ards and North Down Council
- Adding East Herts Council
- Adding Ashford Borough Council
- Adding Stockton On Tees Council
- Adding Fife Council
- Adding Flintshire County Council
- Adding Teignbridge Council
- Adding Harborough District Council
- Adding Watford Borough Council
- Adding Coventry City Council
- Python 3.12 only and CustomComp. Unit testing

### Fix

- #580
- #888
- #902
- #607
- CC testing and add Chesterfield
- CC testing and add Chesterfield
- CC testing and add Chesterfield
- pytest-homeassistant-custom-component
- Pydandic version
- Pydandic version
- WestOxfordshireDistrictCouncil
- South Norfolk Council
- ForestOfDeanDistrictCouncil
- Croydon Council
- South Kesteven District Council
- #647
- #630
- #623
- #586
- #578
- #389
- #930
- #933
- #750
- Refactor Midlothian Council scraper to use house number and postcode
- West Berkshire Council
- Southwark Council
- #580
- #888
- #902
- #607

## 0.104.0 (2024-10-20)

### Feat

- Adding Luton Borough Council
- Adding West Oxfordshire District Council
- Adding Aberdeenshire Council
- Adding Canterbury City Council
- Adding Swindon Borough Council

### Fix

- #697
- #694
- #659
- #590
- #900

## 0.103.0 (2024-10-20)

### Feat

- Adding RAW JSON Sensor

### Fix

- Black formatting
- Black formatting

## 0.102.0 (2024-10-20)

### Feat

- Moving from Attributes to Sensors
- Moving from Attributes to Sensors

## 0.101.0 (2024-10-20)

### Feat

- Add Midlothgian Council

## 0.100.0 (2024-10-18)

### Feat

- Adding Dudley Council
- Adding South Ribble Council
- Plymouth Council
- Adding Norwich City Council

### Fix

- #744
- #671
- #566
- #749

## 0.99.1 (2024-10-16)

### Fix

- #792 adding web_driver option to Wokingham Council

## 0.99.0 (2024-10-16)

### Feat

- Adding Lincoln Council
- Adding Tunbridge Wells Council
- Adding Perth and Kinross Council

### Fix

- Update wiki
- #748
- #598
- #572

## 0.98.5 (2024-10-15)

### Fix

- Swale Borough Council
- HaltonBoroughCouncil
- Barnet Council
- WestBerkshireCouncil

## 0.98.4 (2024-10-14)

### Fix

- West Suffolk Council
- Vale of White Horse Council
- Uttlesford District Council
- Neath Port Talbot Council
- Merton Council
- Manchester City Council
- Glasgow City Council
- BradfordMDC

## 0.98.3 (2024-10-13)

### Fix

- EastRiding

## 0.98.2 (2024-10-13)

### Fix

- MoleValley

## 0.98.1 (2024-10-13)

### Fix

- Barnet and Bexley

## 0.98.0 (2024-10-13)

### Feat

- Adding Wirral Council
- Adding Lichfield District Council
- Adding West Morland And Furness
- Adding Walsall Council
- Adding Armagh, Banbridge and Craigavon Council

### Fix

- #602
- #830
- #870
- #873
- #877

## 0.97.1 (2024-10-10)

### Fix

- NottinghamCityCouncil
- #875

## 0.97.0 (2024-10-10)

### Feat

- Adding Falkirk Council

### Fix

- #761

## 0.96.0 (2024-10-10)

### Feat

- Adding London Borough Harrow
- Adding North Ayrshire Council
- Adding Highland Council
- Add Elmbridge Borough Council
- Adding Southwark Council
- South Derbyshire District Council

### Fix

- #871
- #869
- #780
- #845
fix: #754
- #835
- #842

## 0.95.0 (2024-10-09)

### Feat

- Adding London Borough of Ealing

## 0.94.0 (2024-10-09)

### Feat

- Adding London Borough of Lambeth
- Adding Dacorum Borough Council

### Fix

- Dacorum Borough Council
- East Devon DC

## 0.93.0 (2024-10-08)

### Feat

- Update CheshireEastCouncil.py

## 0.92.0 (2024-10-08)

### Feat

- Update CheshireEastCouncil.py
- Update README.md
- Adding Wokingham Borough Council
- Adding Winchester City Council
- Adding Basildon Council
- Adding Colchester City Council

### Fix

- RochfordCouncil
- Neath Port Talbot Council
- Buckinghamshire Council
- #639
fix: #812

## 0.91.2 (2024-10-05)

### Fix

- Windsor and Maidenhead Council

## 0.91.1 (2024-10-04)

## 0.91.0 (2024-10-03)

## 0.90.0 (2024-10-03)

### Feat

- Adding East Renfrewshire Council

### Fix

- Update DorsetCouncil.py
- #829
- Update GatesheadCouncil.py
- #822

## 0.89.1 (2024-10-02)

### Fix

- High Peak have changed their cookie dialog Seems to be safe to ignore it now.

## 0.89.0 (2024-09-27)

### Feat

- Update CheshireEastCouncil.py
- Update README.md

### Fix

- release to be non pre release

## 0.88.0 (2024-09-16)

### Feat

- Add Ealing Council

### Fix

- Update README.md

## 0.87.0 (2024-09-10)

### Feat

- Add IslingtonCouncil

### Fix

- #565 Gloucester city council driver

## 0.86.1 (2024-09-09)

### Fix

- #773 Wakefield

## 0.86.0 (2024-09-06)

### Feat

- added Rotherham Council

## 0.85.7 (2024-09-05)

### Fix

- more unit tests
- more unit tests
- Chorley

## 0.85.6 (2024-09-03)

### Fix

- #795 and add reconfigure to custom comp.

## 0.85.5 (2024-09-03)

## 0.85.4 (2024-09-03)

### Fix

- #795 and add reconfigure to custom comp.
- #795 Unit Test Coverage

## 0.85.3 (2024-09-02)

### Fix

- #795 unit test coverage

## 0.85.2 (2024-09-02)

### Fix

- 791 Glasgow URL change

## 0.85.1 (2024-09-02)

### Fix

- 779 Add correct async wait to Home Assistant

## 0.85.0 (2024-08-27)

### Feat

- support for enfield council

## 0.84.2 (2024-08-27)

### Fix

- Re-work North Tyneside Council module for 2024 - some addresses do not have a garden collection
- Re-work North Tyneside Council module for 2024

## 0.84.1 (2024-08-08)

### Fix

- #771 Bolton bullet points on dates is now fixed

## 0.84.0 (2024-07-31)

## 0.83.0 (2024-07-07)

### Feat

- add has_numbers() function

### Fix

- update Gedling Borough Council parser to use alternative name key
- change Gedling to use new JSON data
- update instructions for Gedling
- update input.json to use UPRN parameter
- change DorsetCouncil.py to use API links provided in #756
- explicit import of logging.config to stop error in Python 3.11

## 0.82.0 (2024-06-13)

### Feat

- adding dev container updates
- adding dev container updates
- refactoring main files
- adding ability to set local mode in HA custom comp. if users dont have a Selenium Server

### Fix

- MidSussex

## 0.81.0 (2024-06-05)

### Feat

- Adding Wychavon District Council

### Fix

- IntTestWarnings
- IntTestWarnings

## 0.80.0 (2024-06-02)

### Feat

- Adding Uttlesford District Council
- Adding Stafford Boro Council
- Adding Swansea Council
- Adding New Forest
- Adding Three Rivers
- Adding Three Rivers

### Fix

- ThreeRivers
- #425 Entities are not updated
- sessions to avoid deprecation
- Update docker-image.yml
- Update docker-image.yml

## 0.79.1 (2024-05-29)

### Fix

- Change CSS class in search for collection types

## 0.79.0 (2024-05-28)

### Feat

- Adding Dartford
- Adding South Kesteven District Council
- Adding ChichesterCouncil
- adding HounslowCouncil
- adding HounslowCouncil
- adding HounslowCouncil
- Epping Fix
- Adding Epping Forest District Council
- Update input.json
- Epping Forest District Council
- Adding Stroud District Council
- Add support for Tendring District Council
- #269 Adding Waltham Forest
- #269 Adding Waltham Forest
- Adding council creation script

### Fix

- Update Mole Valley URL

## 0.78.0 (2024-05-26)

### Feat

- Add support for Fareham Borough Council

## 0.77.0 (2024-05-26)

### Feat

- Add support for Bracknell Forest Council

## 0.76.1 (2024-05-24)

### Fix

- Handle Barnet council cookies message

## 0.76.0 (2024-05-24)

### Feat

- add bin colour support WestSuffolkCouncil style: black format WestSuffolkCouncil
- add bin colour support WestSuffolkCouncil style: black format WestSuffolkCouncil

## 0.75.0 (2024-05-19)

### Feat

- #725 Add names to selenium test videos using "se:name" option in create webdriver function

## 0.74.1 (2024-05-18)

### Fix

- #693 Cheshire West & Chester Council Sensor Bug
- #693 Cheshire West & Chester Council Sensor Bug

## 0.74.0 (2024-05-17)

### Feat

- #722 Support Python 3.12
- #722 Support Python 3.12
- #722 Support Python 3.12

## 0.73.0 (2024-05-17)

### Feat

- #708 Adding HA to the dev container for debugging

## 0.72.0 (2024-05-17)

### Feat

- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging

## 0.71.0 (2024-05-17)

### Feat

- Update for West Suffolk Councils new website

## 0.70.0 (2024-05-17)

### Feat

- #708 Dev Container
- Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 simplifying Selenium integration tests
- #708 simplifying Selenium integration tests
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Dev Container testing
- #708 - dev container changes
- #706 Adding Dev Container
- #706 Adding initial Dev Container

## 0.69.7 (2024-05-17)

### Fix

-  #713 BarnsleyMBCouncil.py

## 0.69.6 (2024-05-16)

### Fix

- #709 Update DoverDistrictCouncil.py

## 0.69.5 (2024-05-14)

### Fix

- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 test coverage back to 100%

## 0.69.4 (2024-05-09)

### Fix

- pass in required parameter into `create_webdriver`
- test runners for `MiltonKeynesCityCouncil` and `NorthEastLincs`.

## 0.69.3 (2024-05-09)

### Fix

- fix AttributeError when no garden waste collection is available for properties using Huntingdon District Council
- add support for parsing "Today" / "Tomorrow" as date text for `BarnsleyMBCouncil`
- add support for parsing "Tomorrow" as date text for `LiverpoolCityCouncil`

## 0.69.1 (2024-05-01)

### Fix

- Handling the "Website cookies enhance your user experience." button
- Handling the "Website cookies enhance your user experience." button

## 0.69.0 (2024-04-28)

### Feat

- Adding Renfrewshire Council
- Adding Renfrewshire Council

## 0.68.2 (2024-04-28)

### Fix

- Remove 'import Dumper'

## 0.68.1 (2024-04-27)

### Fix

- input.json Bradford missing comma

## 0.68.0 (2024-04-27)

### Feat

- Add support for West Berkshire Council
- add support for Knowsley Metropolitan Borough Council
- add support for Cheshire West and Chester Council
- add support for Cheshire West and Chester Council

## 0.66.2 (2024-04-18)

### Fix

- Update HaringeyCouncil.py issue #670

## 0.66.1 (2024-04-15)

### Fix

- parse datetimes correctly and round to midnight

## 0.66.0 (2024-04-15)

## 0.65.2 (2024-04-15)

### Fix

- change address selection to fix errors selecting the user's PAON

## 0.65.1 (2024-04-15)

### Fix

- add check for parsed string length to stop datetime parsing error

## 0.65.0 (2024-04-13)

### Feat

- add Arun council
- add support for Sunderland City Council
- add support for Sunderland City Council

## 0.64.3 (2024-03-25)

### Fix

- sort data and correct dictionary name (#609)

## 0.64.2 (2024-03-24)

## 0.64.1 (2024-03-24)

### Fix

- fix Kirklees address search (switch to house & postcode)
- fixes json

## 0.64.0 (2024-03-23)

### Feat

- add Kirklees council

### Fix

- fixes json

## 0.63.0 (2024-03-23)

### Feat

- Add Solihull Council (#513)
- Add Adur and Worthing Councils (#544)
- Add Dover District Council (#614)
- Add Rochford Council (#620)
- Add Tandridge District Council (#621)
- Add West Northamptonshire Council (#567)
- Add Hull City Council (#622)
- Add Wyre Council (#625)
- Add Telford and Wrekin Co-operative Council (#632)
- Add Mansfield District Council (#560)
- Add Bedford Borough Council (#552)

### Fix

- spacing on input.json
- realign input.json
- capitalize bin type text
- formatting on input.json
- incorrect collections
- update testing URL for Merton
- attempt to resolve invisible banner hiding postcode box
- resolve JSON schema exception for date formatting
- resolve JSON schema exception for date formatting
- accept cookies banner

## 0.62.0 (2024-03-03)

### Fix

- Added missing .feature file entry to the test config for NewhamCouncil

## 0.61.1 (2024-02-16)

### Fix

- code optimisations
- Fix date parsing in WestLindseyDistrictCouncil.py

## 0.61.0 (2024-02-11)

### Feat

- Add Mole Valley District Council

## 0.60.1 (2024-02-03)

### Fix

- Update input.json Closes #599

## 0.60.0 (2024-01-28)

### Feat

- Add Scraper for St Albans City and District Council

## 0.59.1 (2024-01-25)

### Fix

- add wiki note for castlepoint
- update test data for castlepoint
- remove single line causing issues

## 0.59.0 (2024-01-20)

### Feat

- Add NorthYorkshire to test feature file
- Add north yorkshire to test input
- Add Support for north yorkshire council

### Fix

- remove unused code

## 0.58.8 (2024-01-19)

### Fix

- barnet no overrides

## 0.58.7 (2024-01-18)

### Fix

- accidentally returned strings when needed date objects, refactor to handle this
- checking for future/past dates

## 0.58.6 (2024-01-18)

### Fix

- correct date handling for North West Leicestershire

## 0.58.5 (2024-01-15)

### Fix

- Don't call driver.quit where already handled by finally block

## 0.58.4 (2024-01-15)

### Fix

- remove extra driver.quit to prevent errors

## 0.58.3 (2024-01-15)

### Feat

- Added support for Newham Council's bin collections

### Fix

- Add a default value for user_agent to fix all councils using selenium and not specifying agent

## 0.58.2 (2024-01-11)

### Fix

- use static values for bin types

## 0.58.1 (2024-01-10)

### Fix

- Eastleigh Borough Council doesnt cope with "You haven't yet signed up for ..."
- Eastleigh Borough Council doesnt cope when Garden Waste service hasn't been signed up for, which gets the value "You haven't yet signed up for our garden waste collections. Find out more about our\xa0garden waste collection service" which results in  ValueError: time data

## 0.58.0 (2024-01-10)

### Feat

- Add Test Valley Borough Council

## 0.57.0 (2024-01-09)

### Feat

- Add support for Chorley Council

## 0.56.13 (2024-01-09)

### Fix

- update logic to account for council website change

## 0.56.12 (2024-01-09)

### Fix

- duplicate driver.quit() calls causes error

## 0.56.11 (2024-01-08)

### Fix

- Headless now working on custom comp Update sensor.py

## 0.56.10 (2024-01-08)

### Fix

- headless mode in custom component

## 0.56.9 (2024-01-08)

### Fix

- headless mode

## 0.56.8 (2024-01-08)

### Fix

- headless in custom comp

## 0.56.7 (2024-01-08)

### Fix

- headless options

## 0.56.6 (2024-01-07)

### Fix

- modified Kingston-upon-Thames driver for greater reliability.

## 0.56.5 (2024-01-07)

### Fix

- Update KingstonUponThamesCouncil.py

## 0.56.4 (2024-01-07)

### Fix

- Update KingstonUponThamesCouncil.py

## 0.56.3 (2024-01-07)

### Fix

- headless options
- #542 - Selenium Grid Sessions must be terminated cleanly
- #542 - Selenium Grid Sessions must be terminated cleanly

## 0.56.2 (2024-01-07)

### Fix

- Update strings.json
- Update en.json
- Update config_flow.py

## 0.56.1 (2024-01-07)

### Fix

- Update common.py

## 0.56.0 (2024-01-07)

### Feat

- Update strings.json
- Update en.json
- Update config_flow.py
- adding headless control
- adding headless control
- adding headless control

## 0.55.3 (2024-01-05)

### Fix

- Update lint.yml

## 0.55.2 (2024-01-05)

### Fix

- Chelmsford

## 0.55.1 (2024-01-05)

### Fix

- Update ChelmsfordCityCouncil.py
- Update ChelmsfordCityCouncil.py
- Update ChelmsfordCityCouncil.py

## 0.155.0 (2025-10-11)

### Feat

- Create tag-on-merge.yml
- Update bump.yml
- fix bump.yml
- Update TorbayCouncil.py
- Update bump.yml
- fix release pipeline bump.yml
- fix Torbay
- fix releases process

### Fix

- Update AberdeenCityCouncil.py
- Update TorbayCouncil.py
- Update TorbayCouncil.py
- Update TorbayCouncil.py
- Update URL for NewForestCouncil
- New URL and page for wheelie bins
- improve Mid Suffolk District Council holiday handling with dynamic bank holiday detection
- Oxford now rejects the "Requests" default user agent
- #1557 - Adding East Dunbartonshire
- #1557 - Adding East Dunbartonshire
- #1569 - Somerset Council
- #1569 - Somerset Council
- #1559 - Newport City Council
- #1559 - Newport City Council
- #1574 - Test Valley Borough Council
- #1574 - Test Valley Borough Council
- #1566 South Gloucestershire Council

## 0.154.0 (2025-09-21)

### Feat

- handle changes to northumberland council website
- modify input for NorthumberlandCouncil to accept uprn instead of house number, and use new page structure

### Fix

- the cookie banner is not optional
- #1570 - Slough Borough Council
- #1570 - Slough Borough Council
- #1520 - Erewash Borough Council
- #1520 - Erewash Borough Council
- #1554 - Folkestone and Hythe District Council
- #1554 - Folkestone and Hythe District Council
- #1604 - West Berkshire Council
- #1604 - West Berkshire Council
- #1606 - Brighton and Hove City Council
- #1606 - Brighton and Hove City Council
- #1565 - BCP Council
- #1565 - BCP Council
- #1571 - Castle Point District Council
- #1571 - Castle Point District Council
- #1584 - NorthHertfordshireDistrictCouncil
- #1584 - NorthHertfordshireDistrictCouncil
- #1599
- #1599 - Basingstoke Council
- #1587
- #1587 - Hartlepool Borough Council
- #1588
- #1588 Glasgow City Council
- #1591
- #1591 Rushmoor Council

## 0.153.0 (2025-09-02)

### Feat

- Change buckinghamshire council to get data from endpoint

### Fix

- 1573 Update Bolton council URL
- East Herts Council
- #1575
- Runnymede Borough Council
- #1513
- Wiltshire Council
- #1533
- Staffordshire Moorlands District Council
- #1535
- Ipswich Borough Council
- #1548
- North East Lincs
- Hinckley and Bosworth Borough Council
- Nuneaton Bedworth Borough Council
- #1514
- Lichfield District Council
- 1549

## 0.152.11 (2025-08-25)

### Fix

- date extraction in RochfordCouncil data parsing
- parsing error in BH selenium
- **hacs**: respect the headless option

### Refactor

- **hacs**: improve build_ukbcd_args with formatter functions

## 0.152.10 (2025-08-04)

### Fix

- Gateshead and East Lothian
- Enfield and Broxbourne
- East Herts
- FermanaghOmaghDistrictCouncil
- Enfield and Broxbourne
- East Herts

## 0.152.9 (2025-08-03)

### Fix

- Cotswald and coventry
- Fixing multiple broken councils
- multiple broken councils

## 0.152.8 (2025-07-26)

### Fix

- Add headers to request for Swindon Borough Council
- Add headers to requests for Royal Borough of Greenwich Fixes #1496 by ensuring that the requests are not rejected due to lack of headers.
- **MidlothianCouncil**: add request headers to resolve 403 Forbidden

## 0.152.7 (2025-07-01)

### Fix

- maidstone selenium fix

## 0.152.6 (2025-06-18)

### Fix

- removed In Progress from date
- removed a degub print statement
- **RugbyBoroughCouncil**: Amended parsed date from full to abbreviated month date, may worked but jun and jul did not
- **RugbyBoroughCouncil**: Amended parsed date
- Reworked Cumberland Council to cater for postcode addition
- **OxfordCityCouncil**: Fixed Oxford City Council parsing dues to changes in output from the website

## 0.152.5 (2025-06-07)

### Fix

- South Ribble and version pinning issues for input.json

## 0.152.4 (2025-06-07)

### Fix

- **SouthRibble**: Corrected Date formatting issue
- **SouthRibble**: Resolved South Ribble without selenium

## 0.152.3 (2025-06-04)

### Fix

- NorthHertfordshire selenium script
- Adur council
- Eastleigh date fix
- removed duplicates in BradfordMDC

## 0.152.2 (2025-06-04)

### Fix

- Update Makefile
- Update CheshireEastCouncil.py
- Github action to handle branch name with parentheses

## 0.152.1 (2025-05-15)

### Fix

- Update to fix North Somerset
- Glasgow SSL bypass
- more robust Northumberland
- updated Eastleigh input.json
- Eastleigh cloudflare fix
- converted collection datetimes into dates for BH parsing.
- Eastleigh cloudflare fix
- Eastleigh cloudflare fix
- added check_uprn to simplified councils
- simplified Swindon
- simplified East Devon
- simplified Dover
- Simplified Dartford
- simplified Cheshire East
- simplified Charnwood input.json
- improved Charnwood
- Adur Worthing fix
- Chorley simplification
- Bexley simplification
- added URL to Torbay script
- Guildford fixes
- reworked Maidstone
- maidstone input.json
- Croydon selenium version
- Stoke date-time fix

## 0.152.0 (2025-05-02)

### Feat

- Added Fermanagh Omagh
- Added Twekesbury
- added Slough council
- Added Argus Council
- added Angus to input.json

### Fix

- Chichester now only requires postcode and house number
- Broadland now only requires postcode and house number
- Barking now only requires postcode and house number
- Brighton now only requires postcode and house number
- ensured all bins for this council
- added skip_get_url to hyndburn

## 0.151.0 (2025-04-27)

### Feat

- version bump

### Fix

- more robust brent date handling
- input.json requires web_driver
- Rugby fix
- simplified blackburn

## 0.150.0 (2025-04-27)

### Feat

- added melton

### Fix

- added melton
- processed all bins for Moray

## 0.149.0 (2025-04-27)

### Feat

- added pembrokeshire

## 0.148.6 (2025-04-27)

### Fix

- updated input.json
- cloudflare fix - switch to selenium method

## 0.148.5 (2025-04-27)

### Fix

- output check
- parsed bin info
- selenium navigation
- input.json changes

## 0.148.4 (2025-04-27)

### Fix

- used canonical 'nice name'

## 0.148.3 (2025-04-25)

### Fix

- working hyndburn
- hyndburn input.json

## 0.148.2 (2025-04-24)

### Fix

- Update docker-compose.yml

## 0.148.1 (2025-04-22)

### Fix

- added bank holiday offsets.
- added bank holiday offsets.

## 0.148.0 (2025-04-19)

### Feat

- adding Wrexham and #1046 Horsham councils

### Fix

- Argyll and Bute council #1053

## 0.147.2 (2025-04-18)

### Fix

- wait for element to be clickable

## 0.147.1 (2025-04-18)

### Fix

- #1351 - moved geopandas to petry dev

## 0.147.0 (2025-04-18)

### Feat

- add council tests results map

## 0.146.2 (2025-04-18)

### Fix

- adding map checking and matching

## 0.146.1 (2025-04-18)

### Fix

- more robust bank holiday handling

## 0.146.0 (2025-04-18)

### Feat

- #1342 Adding Includes Trafford, Clackmannanshire, Havant, North Warwickshire, Newry Mourne and Down, East Dunbartonshire, Pendle, Torfaen, East Hampshire, Ribble Valley, Brentwood, Isle of Wight, Westmorland and Furness, Derry and Strabane, and Norwich. Google Cal support for PDF councils via ICS file

### Fix

- Black reformatting

## 0.145.0 (2025-04-18)

### Feat

- Adding PDF councils

## 0.144.4 (2025-04-18)

### Fix

- Bristol #1275

## 0.144.3 (2025-04-17)

### Fix

- better address for input.json
- bank holiday overrides
- more robust address searching
- simple parsing done
- Selenium navigation

## 0.144.2 (2025-04-17)

### Fix

- knowsley
- knowsley
- knowsley
- knowsley
- KnowsleyMBCouncil.py
- #1220 adding Mid Ulster District Council

## 0.144.1 (2025-04-17)

### Fix

- fix Sandwell garden waste collection date

## 0.144.0 (2025-04-17)

### Feat

- added great yarmouth

## 0.143.6 (2025-04-17)

### Fix

- Renfrewshire Council

## 0.143.5 (2025-04-17)

### Fix

- Google Cal

## 0.143.4 (2025-04-17)

### Fix

- Google Cal

## 0.143.3 (2025-04-15)

### Fix

- #1301 Fix Leeds Council

## 0.143.2 (2025-04-15)

### Fix

- #1301 Fix Leeds Council

## 0.143.1 (2025-04-15)

### Fix

- Set the bin_type when different day

## 0.143.0 (2025-04-13)

### Fix

- corrected url in input.json
- fixed input.json
- parsed Barking Dagenham collection information
- selenium navigation Barking

## 0.142.0 (2025-04-13)

### Feat

- Added Stirling Council

### Fix

- typo in input.json

## 0.141.4 (2025-04-13)

### Fix

- #1304 - sesnors goes to unknown if the data is blank from councils who are less reliable

## 0.141.3 (2025-04-13)

### Fix

- Newham council

## 0.141.2 (2025-04-13)

### Fix

- Newham council
- Newham council

## 0.141.1 (2025-04-12)

### Fix

- missing finally block on selenium tests

## 0.141.0 (2025-04-12)

### Feat

- #1185 Adding PeterboroughCity Council

## 0.140.0 (2025-04-11)

### Feat

- Added Broadland District Council

### Fix

- cleanup of council file
- added Broadland to input.json

## 0.139.0 (2025-04-07)

### Feat

- adding #1037
- adding #1032 North Devon Count Council

### Fix

- #1296 Forest of dean
- 939 adding South Holland District Council - Lincolnshire UK

## 0.138.1 (2025-04-05)

### Fix

- Walhtam forest council - revert previous changes

## 0.138.0 (2025-04-05)

### Feat

- Adding Hastings Borough Council
- Adding Fylde Council

### Fix

- #1249
- #1039
fix: #1181
fix: #1266
fix: #1274
- Gloucester City Council
- #1282
- Mid Devon Council
- #1277
fix: #1287
- West Oxfordshire Council
- #1290

## 0.137.0 (2025-04-05)

### Feat

- #816 adding trafford council

## 0.136.0 (2025-03-24)

### Feat

- Adding Southampton City Council
- Adding Cambridge City Council
- Adding Spelthorne Borough Council

### Fix

- #1057
- #1264
- #1270
- Bexley Council
- #1256
- HinckleyandBosworthBoroughCouncil
- #1207
- Hackney Council
- #1230
- Castlepoint District Council
- #1252
- Canterbury City Council
- #1254

## 0.135.4 (2025-03-24)

### Fix

- parse scheduleCodeWorkflowIDs instead of scheduleCodeWorkflowID for Hackney Council

## 0.135.3 (2025-02-23)

## 0.135.2 (2025-02-19)

### Fix

- North Yorkshire - multiple bins on a day

## 0.135.1 (2025-02-18)

### Fix

- devcontainer

## 0.135.0 (2025-02-17)

### Feat

- Adding Runnymede Borough Council
- Adding Cherwell District Council
- Adding Epsom and Ewell Borough Council
- Adding Redcar and Cleveland Council
- Adding Amber Valley Borough Council
- Adding Bolsover Council

### Fix

- #833 adding Middlesbrough and check script for Selenium
- Cotswold District Council
- #1238
- Leeds City Council
- #1222
- Derbyshire Dales District Council
- Conwy County Borough
- Sunderland City Council
- #1219
- Tendring District Council
- #1221
- #1214
- #923
- #895
- #841
- #903
- #990
- Torridge District Council
- #1204
- Neath Port Talbot
- #1213

## 0.134.3 (2025-02-15)

### Fix

- Update input.json
- 1235 Councils missing Selenium in input.json

## 0.134.2 (2025-02-15)

### Fix

- 1232 East herts missing Selenium url in input.json

## 0.134.1 (2025-02-11)

### Fix

- Cheltenham Borough Council
- #1061

## 0.134.0 (2025-02-07)

### Feat

- Ipswich Borough Council - trying different address
- Ipswich Borough Council - correcting param name in input.json
- Ipswich Borough Council - added input.json values and refactored code
- Ipswich Borough Council - initial implementation

## 0.133.0 (2025-02-02)

### Feat

- adding manual refresh

## 0.132.0 (2025-02-02)

### Feat

- adding manual refresh

## 0.131.0 (2025-02-02)

### Feat

- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding manual refresh
- adding unit tests for the new manual refresh
- adding manual refresh control

## 0.130.1 (2025-01-30)

### Fix

- slow councils

## 0.130.0 (2025-01-29)

### Feat

- Add Herefordshire Council (closes: #1011)

### Fix

- Fix spacing in wiki name

## 0.129.0 (2025-01-29)

### Feat

- Adding East Staffordshire Borough Council
- Adding Boston Borough Council

### Fix

- input.json
- input.json
- Adding East Lothian Council
- #1171
- #1052
fix: #1083
- Leicester City Council
- #1178
- Cardiff Council
- #1175
- Newcastle City Council
- #1179
- #1180
- Midlothian Council
- #1192 - Adding Next Page support
- Swale Borough Council
- #1139

## 0.128.6 (2025-01-29)

### Fix

- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting
- moving away from broken Allure reporting

## 0.128.5 (2025-01-29)

### Fix

- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update CheshireEastCouncil.py

## 0.128.4 (2025-01-28)

### Fix

- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml

## 0.128.3 (2025-01-28)

### Fix

- Update CheshireEastCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml

## 0.128.2 (2025-01-28)

### Fix

- Add communal recycling and communal rubbish
- Add garden waste to Merton Council

## 0.128.1 (2025-01-28)

### Fix

- Update AberdeenshireCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml

## 0.128.0 (2025-01-28)

### Feat

- implement Medway Council (#1021)

### Fix

- Forgot to include skip_get_url

## 0.127.4 (2025-01-25)

### Fix

- NewForestCouncil

## 0.127.3 (2025-01-16)

### Fix

- Vale of White Horse
- #1156
- South Oxfordshire Council
- #1158
- Surrey Heath Borough Council
- #1164
- Carmarthenshire County Council
- #1167
- Glasgow City Council
- #1166
- Merton Council
- NewarkAndSherwoodDC
- Rushcliffe Borough Council
- Powys Council
- Staffordshire Moorlands District Council
- Stroud District Council
- Vale of Glamorgan Council
- West Oxfordshire District Council

## 0.127.2 (2025-01-13)

### Fix

- Update bin type to be the full string

## 0.127.1 (2025-01-10)

### Fix

- Use visibility of list rather than existence
- Update Rushcliffe Borough Council input elements and flow

## 0.127.0 (2025-01-07)

### Feat

- Adding Oadby And Wigston Borough Council
- Add Gwynedd Council
- Adding Denbighshire Council
- Adding Dundee City Council
- Adding Brent Council
- Adding West Dunbartonshire Council
- Adding Cumberland Council

### Fix

- #929
- Cornwall Council
- #1137
- #1125
- #1106
- #1108
- #1109
- #1134
- Northumberland Council
- #1082
- #1110
- Waltham Forest
- #1126
- London Borough Sutton
- #1131
- Kirklees Council
- #1129 - Breaking Change. UPRN required

## 0.126.2 (2025-01-07)

### Fix

- **tests**: updates test case url for coventry city council
- **tests**: removes duplicate key for coventry city council
- updates coventry city council button text

## 0.126.1 (2025-01-06)

### Fix

- behave_testing
- behave_testing

## 0.126.0 (2025-01-04)

### Feat

- #1063 - rewrite Kirklees Council parser for new website
- #1067 - Add garden bin collections where available for Norwich City Council
- Adding Wandsworth Council

### Fix

- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Swale Borough Council
- #1080
(cherry picked from commit 6f580b39fb68b8079990221e050ae8dd6d2b7285)
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update ArdsAndNorthDownCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Update WestLindseyDistrictCouncil.py
- #1101 - Fix table parsing for Walsall Council
- Remove invalid escape sequence warnings from West Lindsey District Council
- #1073 - change method of generating bin types to avoid manual mapping for Rugby Borough Council
- add missing backticks to separate colour config and standard usage instructions
- #1078
(cherry picked from commit 89d93666bb659010d1c130b98c1d81c6ff80cf7c)
- change date format to project default for Merton Council
- correct date logic for Swale Borough Council
- Merton Council
- London Borough Sutton
- #1076
(cherry picked from commit 1eab20c9a57c9c4438ea343f374202bb2e9b98ca)
- Swale Borough Council
- #1080
(cherry picked from commit 6f580b39fb68b8079990221e050ae8dd6d2b7285)
- correct date/year logic for West Lindsey District Council
- replace West Lindsey's input with working address
- #1089 - Correct shifted dates in Bromley Borough Council
- remove WDM import
- #1087 - Food waste date incorrect for West Berkshire Council

## 0.125.2 (2025-01-04)

### Fix

- Update ArdsAndNorthDownCouncil.py
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update README.md to have links to Full and Partial Integration Test Reports
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml
- Update behave_pull_request.yml
- Update behave_pull_request.yml
- Update behave_schedule.yml
- Update behave_schedule.yml

## 0.125.1 (2025-01-04)

### Fix

- correctly handle year increment for January dates

## 0.125.0 (2025-01-04)

### Feat

- Adding Redditch Borough Council
- Adding Blaenau Gwent County Borough Council
- Adding Wandsworth Council

### Fix

- #1068
- #1098
- Wiltshire Council
- #1094
- Salford City Council
- #1097
- #1078
- Merton Council
- Swale Borough Council
- #1080
- London Borough Sutton
- #1076
- Update behave_schedule.yml
- Update bump.yml

## 0.124.4 (2025-01-04)

### Fix

- Update behave_schedule.yml

## 0.124.3 (2025-01-04)

### Fix

- allure reporting
- allure reporting
- allure reporting

## 0.124.2 (2025-01-03)

### Fix

- Update behave.yml

## 0.124.1 (2025-01-03)

### Fix

- avoid crashing on unexpected string value

## 0.124.0 (2025-01-02)

### Feat

- Hart District Council

## 0.123.2 (2024-12-19)

### Fix

- Update behave.yml

## 0.123.1 (2024-12-18)

### Fix

- Update AberdeenCityCouncil.py
- Update behave.yml

## 0.123.0 (2024-12-17)

## 0.122.0 (2024-12-04)

### Feat

- Adding Monmouthshire County Council
- Adding Hinckley and Bosworth Borough Council

### Fix

- Glasgow City Council
- Merton Council
- Blaby District Council
- Warwick District Council
- Blackburn Council
- Carmarthenshire County Council
- High Peak Council
- CarmarthenshireCountyCouncil

## 0.121.1 (2024-12-03)

### Fix

- London Borough of Lewisham to have more reliable parsing of dates

## 0.121.0 (2024-11-24)

### Feat

- Royal Borough of Greenwich
- Adding London Borough of Lewisham
- Adding Hackney Council
- Adding Sandwell Borough Council
- Adding Moray Council
- Adding Kings Lynn and West Norfolk Borough Council
- Adding Wyre Forest District Council
- Adding Folkstone and Hythe District Council
- Adding Cheltenham Borough Council
- Adding Thurrock Council

### Fix

- West Northamptonshire Council
- East Ayrshire Council
- Cotswold District Council

## 0.120.0 (2024-11-20)

### Feat

- Adding Hartlepool Borough Council
- Adding Newcastle Under Lyme Council
- Adding London Borough of Havering
- Add Garden collection to EnvironmentFirst
- Adding Cumberland Council (Allerdale District)
- Adding North Hertfordshire District Council

### Fix

- #844
- #778
- #769
- #1025
- Mid Siffolk and Babergh Garden Collection Day
- #1026
This will require the use of a DAY to be added to the UPRN field
- #1029
- #1028

## 0.119.0 (2024-11-20)

### Feat

- Adding Braintree District Council
- Adding Burnley Borough Council
- Adding Exeter City Council
- Adding Edinburgh City Council
- Adding Aberdeen City Council

### Fix

- #699
- #1015
- #1017
- #894
- #1019

## 0.118.0 (2024-11-15)

### Feat

- Adding Wolverhampton City Council
- Adding Stevenage Borough Council
- Adding Thanet District Council
- Adding Copeland Borough Council
- Adding South Hams District Council
- Adding Rother District Council

### Fix

- #966
- #989
- #1004
- #1006
- #1008
- Rother District Council
- #1009
- CrawleyBoroughCouncil
- #1005
- Adding Garden collection to Babergh and MidSuffolk Council
- #995

## 0.117.0 (2024-11-13)

### Feat

- Adding South Staffordshire District Council fix: #885

## 0.116.0 (2024-11-12)

### Feat

- Adding Ashfield District Council
- Adding Gravesham Borough Council
- Adding Argyll and Bute Council

### Fix

- #579
- #991
- #692
- CheshireWestAndChesterCouncil
- #993
- Milton Keynes
- #702
- Adding Babergh and Mid Suffolk District Councils
- #868
fix: #919
- Adding Derby City Council
- #987

## 0.115.0 (2024-11-11)

### Feat

- Adding Warrington Borough Council
- Adding Antrim And Newtonabbey Council
- Adding Hertsmere Borough Council
- Adding West Lancashire Borough Council
- Broxbourne Council

### Fix

- #695
- #969
- #776
- #980
- #982
- Bradford MDC
- #984

## 0.114.6 (2024-11-09)

### Fix

- NBBC Date Fix

## 0.114.5 (2024-11-08)

### Fix

- migration logging and debugging

## 0.114.4 (2024-11-08)

### Fix

- migration not working
- migration not working

## 0.114.3 (2024-11-08)

### Fix

- fix manifest in custom component

## 0.114.2 (2024-11-08)

### Fix

- #975 adding routine to handle migration error
- #975 adding routine to handle migration error

## 0.114.1 (2024-11-08)

### Fix

- Update manifest.json

## 0.114.0 (2024-11-07)

### Feat

- Nuneaton and Bedworth Borough Council

## 0.113.0 (2024-11-07)

### Feat

- adding calendar for Bins in Custom Component

## 0.112.1 (2024-11-07)

### Fix

- #767 BREAKING CHANGE - READD your sensors / config

## 0.112.0 (2024-11-06)

### Feat

- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- Adding Powys Council
- Adding Worcester City Council
- Adding Ards and North Down Council
- Adding East Herts Council
- Adding Ashford Borough Council
- Adding Stockton On Tees Council
- Adding Fife Council
- Adding Flintshire County Council
- Adding Teignbridge Council
- Adding Harborough District Council
- Adding Watford Borough Council
- Adding Coventry City Council

### Fix

- CC testing and add Chesterfield
- CC testing and add Chesterfield
- CC testing and add Chesterfield
- pytest-homeassistant-custom-component
- Pydandic version
- Pydandic version
- WestOxfordshireDistrictCouncil
- South Norfolk Council
- ForestOfDeanDistrictCouncil
- Croydon Council
- South Kesteven District Council
- #647
- #630
- #623
- #586
- #578
- #389
- #930
- #933
- #750
- Refactor Midlothian Council scraper to use house number and postcode
- West Berkshire Council
- Southwark Council
- #580
- #888
- #902
- #607

## 0.111.0 (2024-11-06)

### Fix

- Add London Borough of Sutton
- #944
- Add Mid Devon Council
- #945
- Adding Oxford City Council
- #962
- Tunbridge Wells / Lincoln
- #963
- Glasgow City Council

## 0.110.0 (2024-11-04)

### Fix

- Adding Blaby District Council
- #904
- Adding Sefton Council
- #770
- Adding Bromsgrove District Council
- #893
- East Lindsey District Council
- #957
- Adding Carmarthenshire County Council
- #892
fix: #710
- Adding East Ayrshire Council
- #955

## 0.109.2 (2024-11-03)

### Fix

- CC testing and add Chesterfield

## 0.109.1 (2024-11-03)

### Fix

- CC testing and add Chesterfield
- CC testing and add Chesterfield

## 0.109.0 (2024-11-02)

### Feat

- Adding Cotswold District Council
- Adding Breckland Council

### Fix

- St Helens Borough Council
- #753
- NewarkAndSherwoodDC
- #941
- #658
- #656

## 0.108.2 (2024-11-01)

### Fix

- pytest-homeassistant-custom-component

## 0.108.1 (2024-11-01)

### Fix

- Pydandic version
- Pydandic version

## 0.108.0 (2024-11-01)

### Feat

- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- pytest fixes
- Python 3.12 only and CustomComp. Unit testing

## 0.107.0 (2024-10-31)

### Feat

- Adding Powys Council
- Adding Worcester City Council
- Adding Ards and North Down Council
- Adding East Herts Council
- Adding Ashford Borough Council

### Fix

- WestOxfordshireDistrictCouncil
- South Norfolk Council
- ForestOfDeanDistrictCouncil
- Croydon Council
- South Kesteven District Council
- #647
- #630
- #623
- #586
- #578
- #389

## 0.106.0 (2024-10-28)

### Feat

- Adding Stockton On Tees Council
- Adding Fife Council
- Adding Flintshire County Council

### Fix

- #930
- #933
- #750
- West Berkshire Council
- Southwark Council

## 0.105.1 (2024-10-24)

### Fix

- Refactor Midlothian Council scraper to use house number and postcode

## 0.105.0 (2024-10-21)

### Feat

- Adding Teignbridge Council
- Adding Harborough District Council
- Adding Watford Borough Council
- Adding Coventry City Council

### Fix

- #580
- #888
- #902
- #607

## 0.104.0 (2024-10-20)

### Feat

- Adding Luton Borough Council
- Adding West Oxfordshire District Council
- Adding Aberdeenshire Council
- Adding Canterbury City Council
- Adding Swindon Borough Council

### Fix

- #697
- #694
- #659
- #590
- #900

## 0.103.0 (2024-10-20)

### Feat

- Adding RAW JSON Sensor

### Fix

- Black formatting
- Black formatting

## 0.102.0 (2024-10-20)

### Feat

- Moving from Attributes to Sensors
- Moving from Attributes to Sensors

## 0.101.0 (2024-10-20)

### Feat

- Add Midlothgian Council

## 0.100.0 (2024-10-18)

### Feat

- Adding Dudley Council
- Adding South Ribble Council
- Plymouth Council
- Adding Norwich City Council

### Fix

- #744
- #671
- #566
- #749

## 0.99.1 (2024-10-16)

### Fix

- #792 adding web_driver option to Wokingham Council

## 0.99.0 (2024-10-16)

### Feat

- Adding Lincoln Council
- Adding Tunbridge Wells Council
- Adding Perth and Kinross Council

### Fix

- Update wiki
- #748
- #598
- #572

## 0.98.5 (2024-10-15)

### Fix

- Swale Borough Council
- HaltonBoroughCouncil
- Barnet Council
- WestBerkshireCouncil

## 0.98.4 (2024-10-14)

### Fix

- West Suffolk Council
- Vale of White Horse Council
- Uttlesford District Council
- Neath Port Talbot Council
- Merton Council
- Manchester City Council
- Glasgow City Council
- BradfordMDC

## 0.98.3 (2024-10-13)

### Fix

- EastRiding

## 0.98.2 (2024-10-13)

### Fix

- MoleValley

## 0.98.1 (2024-10-13)

### Fix

- Barnet and Bexley

## 0.98.0 (2024-10-13)

### Feat

- Adding Wirral Council
- Adding Lichfield District Council
- Adding West Morland And Furness
- Adding Walsall Council
- Adding Armagh, Banbridge and Craigavon Council

### Fix

- #602
- #830
- #870
- #873
- #877

## 0.97.1 (2024-10-10)

### Fix

- NottinghamCityCouncil
- #875

## 0.97.0 (2024-10-10)

### Feat

- Adding Falkirk Council
- Adding London Borough Harrow
- Adding North Ayrshire Council

### Fix

- #761
- #871
- #869

## 0.96.0 (2024-10-10)

### Feat

- Adding Highland Council
- Add Elmbridge Borough Council
- Adding Southwark Council
- South Derbyshire District Council

### Fix

- #780
- #845
fix: #754
- #835
- #842

## 0.95.0 (2024-10-09)

### Feat

- Adding London Borough of Ealing

## 0.94.0 (2024-10-09)

### Feat

- Adding London Borough of Lambeth
- Adding Dacorum Borough Council

### Fix

- Dacorum Borough Council
- East Devon DC

## 0.93.0 (2024-10-08)

### Feat

- Update CheshireEastCouncil.py

## 0.92.0 (2024-10-08)

### Feat

- Update CheshireEastCouncil.py
- Update README.md
- Adding Wokingham Borough Council
- Adding Winchester City Council
- Adding Basildon Council
- Adding Colchester City Council

### Fix

- RochfordCouncil
- Neath Port Talbot Council
- Buckinghamshire Council
- #639
fix: #812

## 0.91.2 (2024-10-05)

### Fix

- Windsor and Maidenhead Council

## 0.91.1 (2024-10-04)

### Fix

- Update DorsetCouncil.py
- #829
- Update GatesheadCouncil.py
- #822

## 0.91.0 (2024-10-03)

### Feat

- Adding East Renfrewshire Council

## 0.90.0 (2024-10-03)

## 0.89.1 (2024-10-02)

### Fix

- High Peak have changed their cookie dialog Seems to be safe to ignore it now.

## 0.89.0 (2024-09-27)

### Feat

- Update CheshireEastCouncil.py
- Update README.md

### Fix

- release to be non pre release

## 0.88.0 (2024-09-16)

### Feat

- Add Ealing Council

### Fix

- Update README.md

## 0.87.0 (2024-09-10)

### Feat

- Add IslingtonCouncil

## 0.86.2 (2024-09-09)

### Fix

- #565 Gloucester city council driver

## 0.86.1 (2024-09-09)

### Fix

- #773 Wakefield

## 0.86.0 (2024-09-06)

### Feat

- added Rotherham Council

## 0.85.7 (2024-09-05)

### Fix

- more unit tests
- more unit tests
- Chorley

## 0.85.6 (2024-09-03)

### Fix

- #795 and add reconfigure to custom comp.

## 0.85.5 (2024-09-03)

### Fix

- #795 and add reconfigure to custom comp.

## 0.85.4 (2024-09-03)

### Fix

- #795 Unit Test Coverage

## 0.85.3 (2024-09-02)

### Fix

- #795 unit test coverage

## 0.85.2 (2024-09-02)

### Fix

- 791 Glasgow URL change

## 0.85.1 (2024-09-02)

### Fix

- 779 Add correct async wait to Home Assistant

## 0.85.0 (2024-08-27)

### Feat

- support for enfield council

## 0.84.2 (2024-08-27)

### Fix

- Re-work North Tyneside Council module for 2024 - some addresses do not have a garden collection
- Re-work North Tyneside Council module for 2024

## 0.84.1 (2024-08-08)

### Fix

- #771 Bolton bullet points on dates is now fixed

## 0.84.0 (2024-07-31)

## 0.83.0 (2024-07-07)

### Feat

- add has_numbers() function

### Fix

- update Gedling Borough Council parser to use alternative name key
- change Gedling to use new JSON data
- update instructions for Gedling

## 0.82.1 (2024-06-28)

### Fix

- update input.json to use UPRN parameter
- change DorsetCouncil.py to use API links provided in #756
- explicit import of logging.config to stop error in Python 3.11

## 0.82.0 (2024-06-13)

### Feat

- adding dev container updates
- adding dev container updates
- refactoring main files
- adding ability to set local mode in HA custom comp. if users dont have a Selenium Server

### Fix

- MidSussex

## 0.81.0 (2024-06-05)

### Feat

- Adding Wychavon District Council

### Fix

- IntTestWarnings
- IntTestWarnings

## 0.80.0 (2024-06-02)

### Feat

- Adding Uttlesford District Council
- Adding Stafford Boro Council
- Adding Swansea Council
- Adding New Forest
- Adding Three Rivers
- Adding Three Rivers

### Fix

- ThreeRivers
- #425 Entities are not updated
- sessions to avoid deprecation
- Update docker-image.yml
- Update docker-image.yml

## 0.79.1 (2024-05-29)

### Fix

- Change CSS class in search for collection types

## 0.79.0 (2024-05-28)

### Feat

- Adding Dartford
- Adding South Kesteven District Council
- Adding ChichesterCouncil
- adding HounslowCouncil
- adding HounslowCouncil
- adding HounslowCouncil
- Epping Fix
- Adding Epping Forest District Council
- Update input.json
- Epping Forest District Council
- Adding Stroud District Council
- Add support for Tendring District Council
- #269 Adding Waltham Forest
- #269 Adding Waltham Forest
- Adding council creation script

### Fix

- Update Mole Valley URL

## 0.78.0 (2024-05-26)

### Feat

- Add support for Fareham Borough Council

## 0.77.0 (2024-05-26)

### Feat

- Add support for Bracknell Forest Council

## 0.76.1 (2024-05-24)

### Fix

- Handle Barnet council cookies message

## 0.76.0 (2024-05-24)

### Feat

- add bin colour support WestSuffolkCouncil style: black format WestSuffolkCouncil
- add bin colour support WestSuffolkCouncil style: black format WestSuffolkCouncil

## 0.75.0 (2024-05-19)

### Feat

- #725 Add names to selenium test videos using "se:name" option in create webdriver function

## 0.74.1 (2024-05-18)

### Fix

- #693 Cheshire West & Chester Council Sensor Bug
- #693 Cheshire West & Chester Council Sensor Bug

## 0.74.0 (2024-05-17)

### Feat

- #722 Support Python 3.12
- #722 Support Python 3.12
- #722 Support Python 3.12

## 0.73.0 (2024-05-17)

### Feat

- #708 Adding HA to the dev container for debugging

## 0.72.0 (2024-05-17)

### Feat

- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging
- #708 Adding HA to the dev container for debugging

## 0.71.0 (2024-05-17)

### Feat

- Update for West Suffolk Councils new website

## 0.70.0 (2024-05-17)

### Feat

- #708 Dev Container
- Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 Dev Container
- #708 simplifying Selenium integration tests
- #708 simplifying Selenium integration tests
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Test GH action seenium
- #708 Dev Container testing
- #708 - dev container changes
- #706 Adding Dev Container
- #706 Adding initial Dev Container

## 0.69.7 (2024-05-17)

### Fix

-  #713 BarnsleyMBCouncil.py

## 0.69.6 (2024-05-16)

### Fix

- #709 Update DoverDistrictCouncil.py

## 0.69.5 (2024-05-14)

### Fix

- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 Small issue and Black formatting
- #696 test coverage back to 100%

## 0.69.4 (2024-05-09)

### Fix

- pass in required parameter into `create_webdriver`
- test runners for `MiltonKeynesCityCouncil` and `NorthEastLincs`.

## 0.69.3 (2024-05-09)

### Fix

- fix AttributeError when no garden waste collection is available for properties using Huntingdon District Council
- add support for parsing "Today" / "Tomorrow" as date text for `BarnsleyMBCouncil`
- add support for parsing "Tomorrow" as date text for `LiverpoolCityCouncil`

## 0.69.1 (2024-05-01)

### Fix

- Handling the "Website cookies enhance your user experience." button
- Handling the "Website cookies enhance your user experience." button

## 0.69.0 (2024-04-28)

### Feat

- Adding Renfrewshire Council
- Adding Renfrewshire Council

## 0.68.2 (2024-04-28)

### Fix

- Remove 'import Dumper'

## 0.68.1 (2024-04-27)

### Fix

- input.json Bradford missing comma

## 0.68.0 (2024-04-27)

### Feat

- Add support for West Berkshire Council
- add support for Knowsley Metropolitan Borough Council
- add support for Cheshire West and Chester Council
- add support for Cheshire West and Chester Council

## 0.66.2 (2024-04-18)

### Fix

- Update HaringeyCouncil.py issue #670

## 0.66.1 (2024-04-15)

### Fix

- parse datetimes correctly and round to midnight

## 0.66.0 (2024-04-15)

## 0.65.2 (2024-04-15)

### Fix

- change address selection to fix errors selecting the user's PAON

## 0.65.1 (2024-04-15)

### Fix

- add check for parsed string length to stop datetime parsing error

## 0.65.0 (2024-04-13)

### Feat

- add Arun council
- add support for Sunderland City Council
- add support for Sunderland City Council

## 0.64.3 (2024-03-25)

### Fix

- sort data and correct dictionary name (#609)

## 0.64.2 (2024-03-24)

## 0.64.1 (2024-03-24)

### Fix

- fix Kirklees address search (switch to house & postcode)
- fixes json

## 0.64.0 (2024-03-23)

### Feat

- add Kirklees council

### Fix

- fixes json

## 0.63.0 (2024-03-23)

### Feat

- Add Solihull Council (#513)
- Add Adur and Worthing Councils (#544)
- Add Dover District Council (#614)
- Add Rochford Council (#620)
- Add Tandridge District Council (#621)
- Add West Northamptonshire Council (#567)
- Add Hull City Council (#622)
- Add Wyre Council (#625)
- Add Telford and Wrekin Co-operative Council (#632)
- Add Mansfield District Council (#560)
- Add Bedford Borough Council (#552)

### Fix

- spacing on input.json
- realign input.json
- capitalize bin type text
- formatting on input.json
- incorrect collections
- update testing URL for Merton
- attempt to resolve invisible banner hiding postcode box
- resolve JSON schema exception for date formatting
- resolve JSON schema exception for date formatting
- accept cookies banner

## 0.62.0 (2024-03-03)

### Fix

- Added missing .feature file entry to the test config for NewhamCouncil

## 0.61.1 (2024-02-16)

### Fix

- code optimisations
- Fix date parsing in WestLindseyDistrictCouncil.py

## 0.61.0 (2024-02-11)

### Feat

- Add Mole Valley District Council

## 0.60.1 (2024-02-03)

### Fix

- Update input.json Closes #599

## 0.60.0 (2024-01-28)

### Feat

- Add Scraper for St Albans City and District Council

## 0.59.1 (2024-01-25)

### Fix

- add wiki note for castlepoint
- update test data for castlepoint
- remove single line causing issues

## 0.59.0 (2024-01-20)

### Feat

- Add NorthYorkshire to test feature file
- Add north yorkshire to test input
- Add Support for north yorkshire council

### Fix

- remove unused code

## 0.58.8 (2024-01-19)

### Fix

- barnet no overrides

## 0.58.7 (2024-01-18)

### Fix

- accidentally returned strings when needed date objects, refactor to handle this
- checking for future/past dates

## 0.58.6 (2024-01-18)

### Fix

- correct date handling for North West Leicestershire

## 0.58.5 (2024-01-15)

### Fix

- Don't call driver.quit where already handled by finally block

## 0.58.4 (2024-01-15)

### Fix

- remove extra driver.quit to prevent errors

## 0.58.3 (2024-01-15)

### Feat

- Added support for Newham Council's bin collections

### Fix

- Add a default value for user_agent to fix all councils using selenium and not specifying agent

## 0.58.2 (2024-01-11)

### Fix

- use static values for bin types

## 0.58.1 (2024-01-10)

### Fix

- Eastleigh Borough Council doesnt cope with "You haven't yet signed up for ..."
- Eastleigh Borough Council doesnt cope when Garden Waste service hasn't been signed up for, which gets the value "You haven't yet signed up for our garden waste collections. Find out more about our\xa0garden waste collection service" which results in  ValueError: time data

## 0.58.0 (2024-01-10)

### Feat

- Add Test Valley Borough Council

## 0.57.0 (2024-01-09)

### Feat

- Add support for Chorley Council

## 0.56.13 (2024-01-09)

### Fix

- update logic to account for council website change

## 0.56.12 (2024-01-09)

### Fix

- duplicate driver.quit() calls causes error

## 0.56.11 (2024-01-08)

### Fix

- Headless now working on custom comp Update sensor.py

## 0.56.10 (2024-01-08)

### Fix

- headless mode in custom component

## 0.56.9 (2024-01-08)

### Fix

- headless mode

## 0.56.8 (2024-01-08)

### Fix

- headless in custom comp

## 0.56.7 (2024-01-08)

### Fix

- headless options

## 0.56.6 (2024-01-07)

### Fix

- modified Kingston-upon-Thames driver for greater reliability.

## 0.56.5 (2024-01-07)

### Fix

- Update KingstonUponThamesCouncil.py

## 0.56.4 (2024-01-07)

### Fix

- Update KingstonUponThamesCouncil.py

## 0.56.3 (2024-01-07)

### Fix

- headless options
- #542 - Selenium Grid Sessions must be terminated cleanly
- #542 - Selenium Grid Sessions must be terminated cleanly

## 0.56.2 (2024-01-07)

### Fix

- Update strings.json
- Update en.json
- Update config_flow.py

## 0.56.1 (2024-01-07)

### Fix

- Update common.py

## 0.56.0 (2024-01-07)

### Feat

- Update strings.json
- Update en.json
- Update config_flow.py
- adding headless control
- adding headless control
- adding headless control

## 0.55.3 (2024-01-05)

### Fix

- Update lint.yml

## 0.55.2 (2024-01-05)

### Fix

- Chelmsford

## 0.55.1 (2024-01-05)

### Fix

- Update ChelmsfordCityCouncil.py
- Update ChelmsfordCityCouncil.py
- Update ChelmsfordCityCouncil.py

## 0.55.0 (2024-01-05)

### Feat

- Update codeql-analysis.yml
- Update behave.yml
- Update CONTRIBUTING.md
- Update behave.yml
- Update behave.yml
- Update ConwyCountyBorough.py
- Update behave.yml
- Update CheshireEastCouncil.py
- Update behave.yml
- Update behave.yml
- Update behave.yml
- Update Makefile
- Update Makefile
- Update behave.yml
- Update Makefile
- Update validate_council_outputs.feature

## 0.54.0 (2024-01-04)

### Feat

- Barnet seasonal overrides

## 0.53.2 (2024-01-04)

### Fix

- barnet (again)

## 0.53.1 (2024-01-04)

### Fix

- barnet

## 0.53.0 (2024-01-04)

### Feat

- barnet council

## 0.52.0 (2024-01-04)

### Feat

- #525 Adding API Server and Docker build
- #525 Adding API Server and Docker build

## 0.51.0 (2024-01-04)

### Feat

- #522 Adding Nottingham City Council

## 0.50.1 (2024-01-03)

### Fix

- don't ask for URL for Vale of White Horse Council

## 0.50.0 (2024-01-03)

### Feat

- add Vale of White Horse District Council

### Fix

- account for additional string on exceptional schedule

## 0.49.1 (2024-01-01)

### Fix

- Torbay

## 0.49.0 (2024-01-01)

### Feat

- add South Gloucestershire Council

## 0.48.3 (2024-01-01)

### Fix

- manifest.json

## 0.48.2 (2024-01-01)

### Fix

- manifest.json to remove depricated attribute

## 0.48.1 (2024-01-01)

### Fix

- Hacs Validation Pipeline

## 0.48.0 (2024-01-01)

### Feat

- Adding HACS Validation

## 0.47.0 (2024-01-01)

### Feat

- Add hassfest validation.yml

## 0.46.1 (2023-12-31)

### Fix

- Black formatting
- Fix GuildfordCouncil

## 0.46.0 (2023-12-31)

### Feat

- Adding Brighton and Hove City Council
- Adding Brighton and Hove City Council
- Adding Brighton and Hove City Council
- Adding Brighton and Hove City Council
- Adding London Borough Redbridge
- London Borough Redbridge
- Adding LondonBoroughRedbridge 431

### Fix

- chelmsford #407

## 0.45.0 (2023-12-29)

### Feat

- Add Haringey Council.

## 0.44.2 (2023-12-29)

### Fix

- #509 Wiltshire Update input.json

## 0.44.1 (2023-12-28)

### Fix

- Bexley
- CharnwoodBoroughCouncil

## 0.44.0 (2023-12-27)

### Feat

- Adding support for Gedling Borough Council

## 0.43.0 (2023-12-25)

### Feat

- add Newport City Council

## 0.42.1 (2023-12-24)

### Feat

- Initial Test Commit for Gedling Borough Council

### Fix

- CastlepointDistrictCouncil
- 191_fixingbroken_councils
- 191_fixingbroken_councils
- 191_fixingbroken_councils

## 0.42.0 (2023-12-19)

### Feat

- Adding West Lindsey District Council
- Adding West Lindsey District Council

## 0.41.5 (2023-12-18)

### Fix

- #191 Preston City Council

## 0.41.4 (2023-12-17)

### Fix

- #493 Update input.json

## 0.41.3 (2023-12-17)

### Fix

- #27 East Riding

## 0.41.2 (2023-12-17)

### Fix

- #493 Leeds issues

## 0.41.1 (2023-12-17)

### Fix

- Add in URL override for wiki
- Update RushmoorCouncil.py to use new URL

## 0.41.0 (2023-12-16)

### Feat

- #264 Adding Oldham
- #250 Adding Halton Borough Council
- #244 Adding Portsmouth City Council

### Fix

- #141 Leeds speed up
- #174 / #244 / #204

## 0.40.1 (2023-12-16)

### Fix

- 488_blackburnfixes

## 0.40.0 (2023-12-15)

### Feat

- adding #204 Forest_of_Dean_District
- adding #204 Forest_of_Dean_District

## 0.39.0 (2023-12-13)

### Feat

- Adding support for Reading Borough Council

## 0.38.0 (2023-12-12)

### Feat

- Add Shropshire Council

## 0.37.2 (2023-12-08)

### Fix

- Issue 394 - change coordinator data from numerical indexed list to dictionary

## 0.37.1 (2023-12-08)

### Fix

- add postcode and uprn for Bedfordshire Council

## 0.37.0 (2023-12-07)

### Feat

- Add BefordshireCouncil scraper

## 0.36.0 (2023-12-07)

### Feat

- adding NorthEastDerbyshireDistrictCouncil

## 0.35.1 (2023-12-06)

### Fix

- move logging config to collect_data script

## 0.35.0 (2023-12-06)

### Feat

- Adding North_West_Leicestershire
- Adding North_West_Leicestershire

## 0.34.0 (2023-12-05)

### Feat

- Add Sevenoaks District Council
- Add Barnsley Metropolitan Borough Council to the feature file
- Add Barnsley Metropolitan Borough Council to input.json
- Add support for Barnsley Council (#444)
- Add Dorset Council to feature file
- Add Dorset Council to input.json
- Add support for Dorset Council
- Add Rugby Borough Council to feature file
- Add Rugby Borough Council to input.json
- Add parser for Rugby Borough Council (#456)

## 0.32.1 (2023-12-04)

### Fix

- Move LiverpoolCityCouncil.py to correct folder

## 0.32.0 (2023-12-01)

### Feat

- Add extra files for Stoke-on-Trent support
- Add support for Stoke-on-Trent (re: #440)

## 0.31.1 (2023-12-01)

### Fix

- change logic to add correct years and support 'Tomorrow' results

## 0.31.0 (2023-12-01)

### Feat

- Add support for Environment First collections (re: #433)
- Add support for Environment First collections (re: #433)
- change parameter name of 'x' to 'step' in get_dates_every_x_days()

## 0.30.1 (2023-12-01)

### Fix

- Increase data update timeout for slower selenium based tests

## 0.30.0 (2023-11-30)

### Feat

- Added WestSuffolkCouncil

## 0.29.1 (2023-11-29)

### Fix

- Fix scraper for Bolton

## 0.29.0 (2023-11-26)

### Feat

- Add Mid and East Antrim
- Add Mid and East Antrim
- Add Mid and East Antrim

## 0.28.1 (2023-11-22)

### Fix

- basingstoke adapt to basingstoke site changes

## 0.28.0 (2023-11-08)

### Feat

- Add support files for Liverpool City Council
- Add additional comments
- Add Liverpool City Council parser

### Fix

- change dateutil name

## 0.27.2 (2023-11-08)

### Fix

- Custom component web driver field label

## 0.27.1 (2023-11-05)

### Fix

- 419-fix-selenium-behave-tests

## 0.27.0 (2023-11-04)

### Feat

- Update EastSuffolkCouncil.py
- Change bin_type's to be title() so it reads better
- Driver quit needs to be after last use of driver

## 0.26.0 (2023-11-03)

### Feat

- Add remote Selenium web driver support

## 0.25.0 (2023-11-03)

### Feat

- Update dev mode & remove JSON outputs
- Update dev mode & remove JSON outputs
- Update dev mode & remove JSON outputs

## 0.24.3 (2023-11-01)

### Feat

- Add remote Selenium web driver support
- Add remote Selenium web driver support
- Add remote Selenium web driver support
- Add remote Selenium web driver support

### Fix

- Holidays subdivision error

## 0.24.2 (2023-11-01)

### Fix

- #378 update East Northamptionshire to North Northamptonshire

## 0.24.1 (2023-11-01)

### Fix

- 410 Adding more behave logging and hamcrest assertations

## 0.24.0 (2023-10-31)

### Feat

- Replace individual council schema's with a single common one

## 0.23.2 (2023-10-30)

### Fix

- #399 - DeprecationWarning: Python Package holidays

## 0.23.1 (2023-10-30)

### Fix

- unit test coverage

## 0.23.0 (2023-10-30)

### Feat

- Add support for Conwy council

## 0.22.0 (2023-10-30)

## 0.21.3 (2023-10-29)

### Feat

- Add support for Calderdale Council

### Fix

- Home Assistant custom component fix for Selenium based councils
- Home Assistant custom component fix for Selenium based councils
- Fix Chelmsford City Council
- Fix input.json order

## 0.21.1 (2023-10-24)

### Fix

- Fix the incorrect key collectionTime in json output of Salford Council

## 0.21.0 (2023-10-23)

### Feat

- Add support for West Lothian Council
- Add support for East Lindsey District Council
- Add support for Gateshead Council
- Add support for Staffordshire Moorlands District Council

## 0.20.0 (2023-10-20)

### Feat

- Add support for Cannock Chase District Council

## 0.19.0 (2023-10-19)

### Feat

- fix missing comma in test input for eastsuffolkcouncil

## 0.18.0 (2023-10-19)

### Feat

- Add EastSuffolkCouncil support

## 0.17.0 (2023-10-19)

### Feat

- Add support for Bury Council (#265)
- Add support for Bury Council (#265)

### Fix

- correctly align input.json

## 0.16.0 (2023-10-18)

### Feat

- Add support for Neath Port Talbot Council

## 0.15.0 (2023-10-18)

### Feat

- StratfordUponAvonCouncil Addition

## 0.14.0 (2023-10-18)

### Feat

- Rename Chilterns to Buckinghamshire Council

## 0.13.4 (2023-10-16)

### Fix

- Update poetry.lock to allow any urllib3 version

## 0.13.3 (2023-10-15)

### Fix

- Remove options flow from home assistant custom component

## 0.13.2 (2023-10-15)

### Fix

- Update poetry.lock

## 0.13.1 (2023-10-15)

### Fix

- Remove first BS4 call to stop page read
- fix ValueError and add in correct year data
- swap Crawley's USRN for house number
- fix date parsing and change BS4 logic

## 0.13.0 (2023-10-11)

### Feat

- Add supporting files for Rhondda Cynon Taff Council

## 0.12.1 (2023-09-28)

### Feat

- Add support for Reigate and Banstead Borough Council

### Fix

- Fix for Wakefield City Council custom component support
- Fix for Wakefield City Council custom component support

## 0.11.0 (2023-09-27)

### Feat

- Add support for Bath and North East Somerset Council
- Add support for multiple instances of the custom component

### Fix

- Fix Python Semantic Release version
- Fix Wakefield City Council

## 0.10.1 (2023-09-16)

## 0.10.0 (2023-09-16)

## 0.9.0 (2023-07-28)

## 0.8.0 (2023-07-23)

## 0.7.0 (2023-07-23)

## 0.6.0 (2023-07-22)

## 0.5.0 (2023-07-21)

## 0.4.0 (2023-07-20)

## 0.3.0 (2023-07-18)

## 0.2.0 (2023-07-16)

## 0.1.0 (2023-07-16)


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
Download .txt
gitextract_9uhgfajq/

├── .devcontainer/
│   ├── dev.Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml
├── .dockerignore
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── COUNCIL_ISSUE.yaml
│   │   ├── COUNCIL_REQUEST.yaml
│   │   └── HOME_ASSISTANT_CUSTOM_COMPONENT_ISSUE.yaml
│   ├── dependabot.yaml
│   └── workflows/
│       ├── behave_pull_request.yml
│       ├── behave_schedule.yml
│       ├── bump.yml
│       ├── codeql-analysis.yml
│       ├── docker-image.yml
│       ├── ha_compatibility_test.yml
│       ├── hacs_validation.yml
│       ├── lint.yml
│       ├── release.yml
│       ├── rollback-release.yml
│       ├── validate-release-ready.yml
│       └── wiki.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── COMPATIBILITY.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── behave.ini
├── bin_to_ics.py
├── conftest.py
├── custom_components/
│   ├── __init__.py
│   └── uk_bin_collection/
│       ├── README.md
│       ├── __init__.py
│       ├── calendar.py
│       ├── config_flow.py
│       ├── const.py
│       ├── manifest.json
│       ├── sensor.py
│       ├── services.yaml
│       ├── strings.json
│       ├── tests/
│       │   ├── __init__.py
│       │   ├── common_utils.py
│       │   ├── test_calendar.py
│       │   ├── test_config_flow.py
│       │   ├── test_init.py
│       │   └── test_sensor.py
│       └── translations/
│           ├── cy.json
│           ├── en.json
│           ├── ga.json
│           ├── gd.json
│           └── pt.json
├── docs/
│   ├── RELEASE-SETUP-SUMMARY.md
│   ├── deploy-key-setup.md
│   ├── example_council.md
│   ├── github-app-setup.md
│   ├── github-app-troubleshooting.md
│   ├── manual-tag-fix.md
│   ├── release-quick-reference.md
│   ├── release-workflow-branch-protection.md
│   ├── release-workflow-diagram.md
│   ├── release-workflow-fixes.md
│   ├── release-workflow-migration.md
│   ├── release-workflow-setup-checklist.md
│   ├── release-workflow.md
│   ├── rollback-release.md
│   ├── utilities.md
│   ├── workflow-improvements-summary.md
│   └── workflow-naming-conventions.md
├── hacs.json
├── poetry.lock
├── pyproject.toml
├── pytest.ini
├── scripts/
│   └── check_ha_compatibility.py
├── uk_bin_collection/
│   ├── Local_Authority_Boundaries.geojson
│   ├── README.rst
│   ├── compare_lad_codes.py
│   ├── map.html
│   ├── tests/
│   │   ├── check_selenium_url_in_input.json.py
│   │   ├── council_feature_input_parity.py
│   │   ├── features/
│   │   │   ├── environment.py
│   │   │   └── validate_council_outputs.feature
│   │   ├── generate_map_test_results.py
│   │   ├── input.json
│   │   ├── output.schema
│   │   ├── step_defs/
│   │   │   ├── step_helpers/
│   │   │   │   └── file_handler.py
│   │   │   └── test_validate_council.py
│   │   ├── test_collect_data.py
│   │   ├── test_common_functions.py
│   │   ├── test_conftest.py
│   │   └── test_get_data.py
│   └── uk_bin_collection/
│       ├── collect_data.py
│       ├── common.py
│       ├── councils/
│       │   ├── AberdeenCityCouncil.py
│       │   ├── AberdeenshireCouncil.py
│       │   ├── AdurAndWorthingCouncils.py
│       │   ├── AmberValleyBoroughCouncil.py
│       │   ├── AngusCouncil.py
│       │   ├── AntrimAndNewtonabbeyCouncil.py
│       │   ├── ArdsAndNorthDownCouncil.py
│       │   ├── ArgyllandButeCouncil.py
│       │   ├── ArmaghBanbridgeCraigavonCouncil.py
│       │   ├── ArunCouncil.py
│       │   ├── AshfieldDistrictCouncil.py
│       │   ├── AshfordBoroughCouncil.py
│       │   ├── BCPCouncil.py
│       │   ├── BaberghDistrictCouncil.py
│       │   ├── BarkingDagenham.py
│       │   ├── BarnetCouncil.py
│       │   ├── BarnsleyMBCouncil.py
│       │   ├── BasildonCouncil.py
│       │   ├── BasingstokeCouncil.py
│       │   ├── BathAndNorthEastSomersetCouncil.py
│       │   ├── BedfordBoroughCouncil.py
│       │   ├── BedfordshireCouncil.py
│       │   ├── BelfastCityCouncil.py
│       │   ├── BexleyCouncil.py
│       │   ├── BirminghamCityCouncil.py
│       │   ├── BlabyDistrictCouncil.py
│       │   ├── BlackburnCouncil.py
│       │   ├── BlackpoolCouncil.py
│       │   ├── BlaenauGwentCountyBoroughCouncil.py
│       │   ├── BolsoverCouncil.py
│       │   ├── BoltonCouncil.py
│       │   ├── BostonBoroughCouncil.py
│       │   ├── BracknellForestCouncil.py
│       │   ├── BradfordMDC.py
│       │   ├── BraintreeDistrictCouncil.py
│       │   ├── BrecklandCouncil.py
│       │   ├── BrentCouncil.py
│       │   ├── BrightonandHoveCityCouncil.py
│       │   ├── BristolCityCouncil.py
│       │   ├── BroadlandDistrictCouncil.py
│       │   ├── BromleyBoroughCouncil.py
│       │   ├── BromsgroveDistrictCouncil.py
│       │   ├── BroxbourneCouncil.py
│       │   ├── BroxtoweBoroughCouncil.py
│       │   ├── BuckinghamshireCouncil.py
│       │   ├── BurnleyBoroughCouncil.py
│       │   ├── BuryCouncil.py
│       │   ├── CalderdaleCouncil.py
│       │   ├── CambridgeCityCouncil.py
│       │   ├── CannockChaseDistrictCouncil.py
│       │   ├── CanterburyCityCouncil.py
│       │   ├── CardiffCouncil.py
│       │   ├── CarmarthenshireCountyCouncil.py
│       │   ├── CastlepointDistrictCouncil.py
│       │   ├── CeredigionCountyCouncil.py
│       │   ├── CharnwoodBoroughCouncil.py
│       │   ├── ChelmsfordCityCouncil.py
│       │   ├── CheltenhamBoroughCouncil.py
│       │   ├── CherwellDistrictCouncil.py
│       │   ├── CheshireEastCouncil.py
│       │   ├── CheshireWestAndChesterCouncil.py
│       │   ├── ChesterfieldBoroughCouncil.py
│       │   ├── ChichesterDistrictCouncil.py
│       │   ├── ChorleyCouncil.py
│       │   ├── ColchesterCityCouncil.py
│       │   ├── ConwyCountyBorough.py
│       │   ├── CornwallCouncil.py
│       │   ├── CotswoldDistrictCouncil.py
│       │   ├── CoventryCityCouncil.py
│       │   ├── CrawleyBoroughCouncil.py
│       │   ├── CroydonCouncil.py
│       │   ├── CumberlandCouncil.py
│       │   ├── DacorumBoroughCouncil.py
│       │   ├── DarlingtonBoroughCouncil.py
│       │   ├── DartfordBoroughCouncil.py
│       │   ├── DenbighshireCouncil.py
│       │   ├── DerbyCityCouncil.py
│       │   ├── DerbyshireDalesDistrictCouncil.py
│       │   ├── DoncasterCouncil.py
│       │   ├── DorsetCouncil.py
│       │   ├── DoverDistrictCouncil.py
│       │   ├── DudleyCouncil.py
│       │   ├── DumfriesandGallowayCouncil.py
│       │   ├── DundeeCityCouncil.py
│       │   ├── DurhamCouncil.py
│       │   ├── EalingCouncil.py
│       │   ├── EastAyrshireCouncil.py
│       │   ├── EastCambridgeshireCouncil.py
│       │   ├── EastDevonDC.py
│       │   ├── EastDunbartonshireCouncil.py
│       │   ├── EastHertsCouncil.py
│       │   ├── EastLindseyDistrictCouncil.py
│       │   ├── EastLothianCouncil.py
│       │   ├── EastRenfrewshireCouncil.py
│       │   ├── EastRidingCouncil.py
│       │   ├── EastStaffordshireBoroughCouncil.py
│       │   ├── EastSuffolkCouncil.py
│       │   ├── EastbourneBoroughCouncil.py
│       │   ├── EastleighBoroughCouncil.py
│       │   ├── EdenDistrictCouncil.py
│       │   ├── EdinburghCityCouncil.py
│       │   ├── ElmbridgeBoroughCouncil.py
│       │   ├── EnfieldCouncil.py
│       │   ├── EnvironmentFirst.py
│       │   ├── EppingForestDistrictCouncil.py
│       │   ├── EpsomandEwellBoroughCouncil.py
│       │   ├── ErewashBoroughCouncil.py
│       │   ├── ExeterCityCouncil.py
│       │   ├── FalkirkCouncil.py
│       │   ├── FarehamBoroughCouncil.py
│       │   ├── FenlandDistrictCouncil.py
│       │   ├── FermanaghOmaghDistrictCouncil.py
│       │   ├── FifeCouncil.py
│       │   ├── FlintshireCountyCouncil.py
│       │   ├── FolkestoneandHytheDistrictCouncil.py
│       │   ├── ForestOfDeanDistrictCouncil.py
│       │   ├── FyldeCouncil.py
│       │   ├── GatesheadCouncil.py
│       │   ├── GedlingBoroughCouncil.py
│       │   ├── GlasgowCityCouncil.py
│       │   ├── GloucesterCityCouncil.py
│       │   ├── GooglePublicCalendarCouncil.py
│       │   ├── GosportBoroughCouncil.py
│       │   ├── GraveshamBoroughCouncil.py
│       │   ├── GreatYarmouthBoroughCouncil.py
│       │   ├── GuildfordCouncil.py
│       │   ├── GwyneddCouncil.py
│       │   ├── HackneyCouncil.py
│       │   ├── HaltonBoroughCouncil.py
│       │   ├── HarboroughDistrictCouncil.py
│       │   ├── HaringeyCouncil.py
│       │   ├── HarlowCouncil.py
│       │   ├── HarrogateBoroughCouncil.py
│       │   ├── HartDistrictCouncil.py
│       │   ├── HartlepoolBoroughCouncil.py
│       │   ├── HastingsBoroughCouncil.py
│       │   ├── HerefordshireCouncil.py
│       │   ├── HertsmereBoroughCouncil.py
│       │   ├── HighPeakCouncil.py
│       │   ├── HighlandCouncil.py
│       │   ├── Hillingdon.py
│       │   ├── HinckleyandBosworthBoroughCouncil.py
│       │   ├── HorshamDistrictCouncil.py
│       │   ├── HullCityCouncil.py
│       │   ├── HuntingdonDistrictCouncil.py
│       │   ├── HyndburnBoroughCouncil.py
│       │   ├── IpswichBoroughCouncil.py
│       │   ├── IsleOfAngleseyCouncil.py
│       │   ├── IslingtonCouncil.py
│       │   ├── KingsLynnandWestNorfolkBC.py
│       │   ├── KingstonUponThamesCouncil.py
│       │   ├── KirkleesCouncil.py
│       │   ├── KnowsleyMBCouncil.py
│       │   ├── LancasterCityCouncil.py
│       │   ├── LeedsCityCouncil.py
│       │   ├── LeicesterCityCouncil.py
│       │   ├── LewesDistrictCouncil.py
│       │   ├── LichfieldDistrictCouncil.py
│       │   ├── LincolnCouncil.py
│       │   ├── LisburnCastlereaghCityCouncil.py
│       │   ├── LiverpoolCityCouncil.py
│       │   ├── LondonBoroughCamdenCouncil.py
│       │   ├── LondonBoroughEaling.py
│       │   ├── LondonBoroughHammersmithandFulham.py
│       │   ├── LondonBoroughHarrow.py
│       │   ├── LondonBoroughHavering.py
│       │   ├── LondonBoroughHounslow.py
│       │   ├── LondonBoroughLambeth.py
│       │   ├── LondonBoroughLewisham.py
│       │   ├── LondonBoroughOfRichmondUponThames.py
│       │   ├── LondonBoroughRedbridge.py
│       │   ├── LondonBoroughSutton.py
│       │   ├── LutonBoroughCouncil.py
│       │   ├── MaidstoneBoroughCouncil.py
│       │   ├── MaldonDistrictCouncil.py
│       │   ├── MalvernHillsDC.py
│       │   ├── ManchesterCityCouncil.py
│       │   ├── MansfieldDistrictCouncil.py
│       │   ├── MedwayCouncil.py
│       │   ├── MeltonBoroughCouncil.py
│       │   ├── MertonCouncil.py
│       │   ├── MidAndEastAntrimBoroughCouncil.py
│       │   ├── MidDevonCouncil.py
│       │   ├── MidSuffolkDistrictCouncil.py
│       │   ├── MidSussexDistrictCouncil.py
│       │   ├── MidUlsterDistrictCouncil.py
│       │   ├── MiddlesbroughCouncil.py
│       │   ├── MidlothianCouncil.py
│       │   ├── MiltonKeynesCityCouncil.py
│       │   ├── MoleValleyDistrictCouncil.py
│       │   ├── MonmouthshireCountyCouncil.py
│       │   ├── MorayCouncil.py
│       │   ├── NeathPortTalbotCouncil.py
│       │   ├── NewForestCouncil.py
│       │   ├── NewarkAndSherwoodDC.py
│       │   ├── NewcastleCityCouncil.py
│       │   ├── NewcastleUnderLymeCouncil.py
│       │   ├── NewhamCouncil.py
│       │   ├── NewportCityCouncil.py
│       │   ├── NorthAyrshireCouncil.py
│       │   ├── NorthDevonCountyCouncil.py
│       │   ├── NorthEastDerbyshireDistrictCouncil.py
│       │   ├── NorthEastLincs.py
│       │   ├── NorthHertfordshireDistrictCouncil.py
│       │   ├── NorthKestevenDistrictCouncil.py
│       │   ├── NorthLanarkshireCouncil.py
│       │   ├── NorthLincolnshireCouncil.py
│       │   ├── NorthNorfolkDistrictCouncil.py
│       │   ├── NorthNorthamptonshireCouncil.py
│       │   ├── NorthSomersetCouncil.py
│       │   ├── NorthTynesideCouncil.py
│       │   ├── NorthWarwickshireBoroughCouncil.py
│       │   ├── NorthWestLeicestershire.py
│       │   ├── NorthYorkshire.py
│       │   ├── NorthumberlandCouncil.py
│       │   ├── NorwichCityCouncil.py
│       │   ├── NottinghamCityCouncil.py
│       │   ├── NuneatonBedworthBoroughCouncil.py
│       │   ├── OadbyAndWigstonBoroughCouncil.py
│       │   ├── OldhamCouncil.py
│       │   ├── OxfordCityCouncil.py
│       │   ├── PembrokeshireCountyCouncil.py
│       │   ├── PerthAndKinrossCouncil.py
│       │   ├── PeterboroughCityCouncil.py
│       │   ├── PlymouthCouncil.py
│       │   ├── PortsmouthCityCouncil.py
│       │   ├── PowysCouncil.py
│       │   ├── PrestonCityCouncil.py
│       │   ├── ReadingBoroughCouncil.py
│       │   ├── RedcarandClevelandCouncil.py
│       │   ├── RedditchBoroughCouncil.py
│       │   ├── ReigateAndBansteadBoroughCouncil.py
│       │   ├── RenfrewshireCouncil.py
│       │   ├── RhonddaCynonTaffCouncil.py
│       │   ├── RochdaleCouncil.py
│       │   ├── RochfordCouncil.py
│       │   ├── RotherDistrictCouncil.py
│       │   ├── RotherhamCouncil.py
│       │   ├── RoyalBoroughofGreenwich.py
│       │   ├── RugbyBoroughCouncil.py
│       │   ├── RunnymedeBoroughCouncil.py
│       │   ├── RushcliffeBoroughCouncil.py
│       │   ├── RushmoorCouncil.py
│       │   ├── SalfordCityCouncil.py
│       │   ├── SandwellBoroughCouncil.py
│       │   ├── SeftonCouncil.py
│       │   ├── SevenoaksDistrictCouncil.py
│       │   ├── SheffieldCityCouncil.py
│       │   ├── ShropshireCouncil.py
│       │   ├── SloughBoroughCouncil.py
│       │   ├── SolihullCouncil.py
│       │   ├── SomersetCouncil.py
│       │   ├── SouthAyrshireCouncil.py
│       │   ├── SouthCambridgeshireCouncil.py
│       │   ├── SouthDerbyshireDistrictCouncil.py
│       │   ├── SouthGloucestershireCouncil.py
│       │   ├── SouthHamsDistrictCouncil.py
│       │   ├── SouthHollandDistrictCouncil.py
│       │   ├── SouthKestevenDistrictCouncil.py
│       │   ├── SouthLanarkshireCouncil.py
│       │   ├── SouthNorfolkCouncil.py
│       │   ├── SouthOxfordshireCouncil.py
│       │   ├── SouthRibbleCouncil.py
│       │   ├── SouthStaffordshireDistrictCouncil.py
│       │   ├── SouthTynesideCouncil.py
│       │   ├── SouthamptonCityCouncil.py
│       │   ├── SouthwarkCouncil.py
│       │   ├── SpelthorneBoroughCouncil.py
│       │   ├── StAlbansCityAndDistrictCouncil.py
│       │   ├── StHelensBC.py
│       │   ├── StaffordBoroughCouncil.py
│       │   ├── StaffordshireMoorlandsDistrictCouncil.py
│       │   ├── StevenageBoroughCouncil.py
│       │   ├── StirlingCouncil.py
│       │   ├── StockportBoroughCouncil.py
│       │   ├── StocktonOnTeesCouncil.py
│       │   ├── StokeOnTrentCityCouncil.py
│       │   ├── StratfordUponAvonCouncil.py
│       │   ├── StroudDistrictCouncil.py
│       │   ├── SunderlandCityCouncil.py
│       │   ├── SurreyHeathBoroughCouncil.py
│       │   ├── SwaleBoroughCouncil.py
│       │   ├── SwanseaCouncil.py
│       │   ├── SwindonBoroughCouncil.py
│       │   ├── TamesideMBCouncil.py
│       │   ├── TandridgeDistrictCouncil.py
│       │   ├── TeignbridgeCouncil.py
│       │   ├── TelfordAndWrekinCouncil.py
│       │   ├── TendringDistrictCouncil.py
│       │   ├── TestValleyBoroughCouncil.py
│       │   ├── TewkesburyBoroughCouncil.py
│       │   ├── ThanetDistrictCouncil.py
│       │   ├── ThreeRiversDistrictCouncil.py
│       │   ├── ThurrockCouncil.py
│       │   ├── TonbridgeAndMallingBC.py
│       │   ├── TorbayCouncil.py
│       │   ├── TorridgeDistrictCouncil.py
│       │   ├── TunbridgeWellsCouncil.py
│       │   ├── UttlesfordDistrictCouncil.py
│       │   ├── ValeofGlamorganCouncil.py
│       │   ├── ValeofWhiteHorseCouncil.py
│       │   ├── WakefieldCityCouncil.py
│       │   ├── WalsallCouncil.py
│       │   ├── WalthamForest.py
│       │   ├── WandsworthCouncil.py
│       │   ├── WarringtonBoroughCouncil.py
│       │   ├── WarwickDistrictCouncil.py
│       │   ├── WatfordBoroughCouncil.py
│       │   ├── WaverleyBoroughCouncil.py
│       │   ├── WealdenDistrictCouncil.py
│       │   ├── WelhatCouncil.py
│       │   ├── WestBerkshireCouncil.py
│       │   ├── WestDunbartonshireCouncil.py
│       │   ├── WestLancashireBoroughCouncil.py
│       │   ├── WestLindseyDistrictCouncil.py
│       │   ├── WestLothianCouncil.py
│       │   ├── WestMorlandAndFurness.py
│       │   ├── WestNorthamptonshireCouncil.py
│       │   ├── WestOxfordshireDistrictCouncil.py
│       │   ├── WestSuffolkCouncil.py
│       │   ├── WiganBoroughCouncil.py
│       │   ├── WiltshireCouncil.py
│       │   ├── WinchesterCityCouncil.py
│       │   ├── WindsorAndMaidenheadCouncil.py
│       │   ├── WirralCouncil.py
│       │   ├── WokingBoroughCouncil.py
│       │   ├── WokinghamBoroughCouncil.py
│       │   ├── WolverhamptonCityCouncil.py
│       │   ├── WorcesterCityCouncil.py
│       │   ├── WrexhamCountyBoroughCouncil.py
│       │   ├── WychavonDistrictCouncil.py
│       │   ├── WyreCouncil.py
│       │   ├── WyreForestDistrictCouncil.py
│       │   ├── YorkCouncil.py
│       │   ├── council_class_template/
│       │   │   └── councilclasstemplate.py
│       │   └── tests/
│       │       ├── conftest.py
│       │       ├── test_south_kesteven_district_council.py
│       │       └── test_south_kesteven_integration.py
│       ├── create_new_council.py
│       └── get_bin_data.py
├── uk_bin_collection_api_server/
│   ├── Dockerfile
│   ├── docker-compose.yml
│   ├── requirements.txt
│   ├── server.py
│   └── swagger.yaml
└── wiki/
    ├── Councils.md
    ├── Home.md
    ├── Setup.md
    └── generate_wiki.py
Download .txt
SYMBOL INDEX (1241 symbols across 367 files)

FILE: bin_to_ics.py
  function parse_time_delta (line 29) | def parse_time_delta(time_str: str) -> datetime.timedelta:
  function create_bin_calendar (line 87) | def create_bin_calendar(
  function create_alarm (line 184) | def create_alarm(trigger_before: datetime.timedelta) -> Alarm:
  function save_calendar (line 202) | def save_calendar(calendar: Calendar, output_file: str) -> None:
  function load_json_data (line 216) | def load_json_data(input_file: Optional[str] = None) -> Dict:
  function main (line 241) | def main():

FILE: conftest.py
  function pytest_addoption (line 12) | def pytest_addoption(parser: Parser) -> None:
  function headless_mode (line 18) | def headless_mode(request: FixtureRequest) -> str:
  function local_browser (line 22) | def local_browser(request: FixtureRequest) -> str:
  function selenium_url (line 26) | def selenium_url(request: FixtureRequest) -> str:
  function hass (line 30) | def hass():
  function enable_custom_integrations (line 59) | def enable_custom_integrations():

FILE: custom_components/uk_bin_collection/__init__.py
  function async_setup (line 28) | async def async_setup(hass: HomeAssistant, config: dict) -> bool:
  function async_migrate_entry (line 87) | async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigE...
  function async_setup_entry (line 130) | async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEnt...
  function async_unload_entry (line 243) | async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEn...
  function build_ukbcd_args (line 282) | def build_ukbcd_args(config_data: dict) -> list:
  class HouseholdBinCoordinator (line 312) | class HouseholdBinCoordinator(DataUpdateCoordinator):
    method __init__ (line 315) | def __init__(
    method _async_update_data (line 340) | async def _async_update_data(self) -> dict:
    method process_bin_data (line 386) | def process_bin_data(data: dict) -> dict:

FILE: custom_components/uk_bin_collection/calendar.py
  class UKBinCollectionCalendar (line 22) | class UKBinCollectionCalendar(CoordinatorEntity, CalendarEntity):
    method __init__ (line 25) | def __init__(
    method name (line 49) | def name(self) -> str:
    method event (line 54) | def event(self) -> Optional[CalendarEvent]:
    method async_get_events (line 65) | async def async_get_events(
    method _create_calendar_event (line 81) | def _create_calendar_event(self, collection_date: datetime.date) -> Ca...
    method unique_id (line 91) | def unique_id(self) -> str:
    method available (line 96) | def available(self) -> bool:
    method extra_state_attributes (line 107) | def extra_state_attributes(self) -> Dict[str, Any]:
    method _handle_coordinator_update (line 112) | def _handle_coordinator_update(self) -> None:
  function async_setup_entry (line 117) | async def async_setup_entry(
  function async_unload_entry (line 156) | async def async_unload_entry(
  function calc_unique_calendar_id (line 166) | def calc_unique_calendar_id(entry_id: str, bin_type: str) -> str:

FILE: custom_components/uk_bin_collection/config_flow.py
  class UkBinCollectionConfigFlow (line 19) | class UkBinCollectionConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
    method __init__ (line 24) | def __init__(self):
    method async_migrate_entry (line 35) | async def async_migrate_entry(
    method async_step_user (line 52) | async def async_step_user(self, user_input: Optional[Dict[str, Any]] =...
    method async_step_council (line 128) | async def async_step_council(self, user_input: Optional[Dict[str, Any]...
    method async_step_reconfigure (line 175) | async def async_step_reconfigure(self, user_input: Optional[Dict[str, ...
    method async_step_reconfigure_confirm (line 179) | async def async_step_reconfigure_confirm(
    method get_councils_json (line 253) | async def get_councils_json(self) -> Dict[str, Any]:
    method get_council_schema (line 285) | async def get_council_schema(self, council: str) -> vol.Schema:
    method build_reconfigure_schema (line 317) | def build_reconfigure_schema(
    method perform_selenium_checks (line 361) | async def perform_selenium_checks(self, council_key: str) -> str:
    method check_selenium_server (line 394) | async def check_selenium_server(self, custom_url: Optional[str] = None...
    method check_chromium_installed (line 421) | async def check_chromium_installed(self) -> bool:
    method _sync_check_chromium (line 431) | def _sync_check_chromium(self) -> bool:
    method map_wiki_name_to_council_key (line 446) | def map_wiki_name_to_council_key(self, wiki_name: str) -> str:
    method is_valid_json (line 460) | def is_valid_json(json_str: str) -> bool:
    method _async_entry_exists (line 469) | async def _async_entry_exists(
    method async_step_import (line 482) | async def async_step_import(
  class UkBinCollectionOptionsFlowHandler (line 489) | class UkBinCollectionOptionsFlowHandler(config_entries.OptionsFlow):
    method __init__ (line 492) | def __init__(self, config_entry):
    method async_step_init (line 499) | async def async_step_init(self, user_input=None):
    method get_councils_json (line 568) | async def get_councils_json(self) -> Dict[str, Any]:
    method build_options_schema (line 588) | def build_options_schema(self, existing_data: Dict[str, Any]) -> vol.S...
    method map_wiki_name_to_council_key (line 622) | def map_wiki_name_to_council_key(self, wiki_name: str) -> str:
    method is_valid_json (line 636) | def is_valid_json(json_str: str) -> bool:
  function async_get_options_flow (line 646) | async def async_get_options_flow(config_entry):

FILE: custom_components/uk_bin_collection/sensor.py
  function async_setup_entry (line 38) | async def async_setup_entry(
  function create_sensor_entities (line 63) | def create_sensor_entities(coordinator, entry_id, icon_color_mapping):
  function load_icon_color_mapping (line 100) | def load_icon_color_mapping(icon_color_mapping: str) -> Dict[str, Any]:
  class UKBinCollectionDataSensor (line 111) | class UKBinCollectionDataSensor(CoordinatorEntity, SensorEntity):
    method __init__ (line 116) | def __init__(
    method device_info (line 137) | def device_info(self) -> dict:
    method _handle_coordinator_update (line 148) | def _handle_coordinator_update(self) -> None:
    method update_state (line 153) | def update_state(self) -> None:
    method calculate_state (line 169) | def calculate_state(self) -> str:
    method get_icon (line 180) | def get_icon(self) -> str:
    method get_color (line 186) | def get_color(self) -> str:
    method get_default_icon (line 193) | def get_default_icon(self) -> str:
    method name (line 204) | def name(self) -> str:
    method state (line 209) | def state(self) -> str:
    method icon (line 214) | def icon(self) -> str:
    method extra_state_attributes (line 219) | def extra_state_attributes(self) -> dict:
    method available (line 232) | def available(self) -> bool:
    method unique_id (line 237) | def unique_id(self) -> str:
  class UKBinCollectionAttributeSensor (line 242) | class UKBinCollectionAttributeSensor(CoordinatorEntity, SensorEntity):
    method __init__ (line 245) | def __init__(
    method name (line 266) | def name(self) -> str:
    method state (line 271) | def state(self):
    method calculate_human_readable (line 290) | def calculate_human_readable(self) -> str:
    method calculate_days_until (line 305) | def calculate_days_until(self) -> int:
    method get_icon (line 312) | def get_icon(self) -> str:
    method get_color (line 318) | def get_color(self) -> str:
    method get_default_icon (line 322) | def get_default_icon(self) -> str:
    method icon (line 333) | def icon(self) -> str:
    method extra_state_attributes (line 338) | def extra_state_attributes(self) -> dict:
    method device_info (line 346) | def device_info(self) -> dict:
    method unique_id (line 357) | def unique_id(self) -> str:
    method available (line 362) | def available(self) -> bool:
  class UKBinCollectionRawJSONSensor (line 367) | class UKBinCollectionRawJSONSensor(CoordinatorEntity, SensorEntity):
    method __init__ (line 370) | def __init__(
    method name (line 383) | def name(self) -> str:
    method state (line 388) | def state(self) -> str:
    method unique_id (line 399) | def unique_id(self) -> str:
    method extra_state_attributes (line 404) | def extra_state_attributes(self) -> dict:
    method available (line 409) | def available(self) -> bool:

FILE: custom_components/uk_bin_collection/tests/common_utils.py
  class MockConfigEntry (line 9) | class MockConfigEntry:
    method __init__ (line 12) | def __init__(
    method add_to_hass (line 34) | def add_to_hass(self, hass):

FILE: custom_components/uk_bin_collection/tests/test_calendar.py
  function mock_coordinator (line 33) | def mock_coordinator():
  function mock_config_entry (line 43) | def mock_config_entry():
  function hass_instance (line 61) | def hass_instance() -> HomeAssistant:
  function test_calendar_entity_initialization (line 72) | def test_calendar_entity_initialization(hass_instance, mock_coordinator):
  function test_calendar_event_property (line 92) | def test_calendar_event_property(hass_instance, mock_coordinator):
  function test_calendar_event_property_no_data (line 114) | def test_calendar_event_property_no_data(hass_instance, mock_coordinator):
  function test_async_get_events (line 129) | async def test_async_get_events(hass_instance, mock_coordinator):
  function test_async_get_events_no_events_in_range (line 158) | async def test_async_get_events_no_events_in_range(hass_instance, mock_c...
  function test_calendar_update_on_coordinator_change (line 178) | def test_calendar_update_on_coordinator_change(hass_instance, mock_coord...
  function test_async_setup_entry_creates_calendar_entities (line 220) | async def test_async_setup_entry_creates_calendar_entities(
  function test_async_setup_entry_handles_empty_data (line 267) | async def test_async_setup_entry_handles_empty_data(hass_instance, mock_...
  function test_async_setup_entry_handles_coordinator_failure (line 291) | async def test_async_setup_entry_handles_coordinator_failure(
  function test_async_unload_entry (line 311) | async def test_async_unload_entry(hass_instance, mock_coordinator, mock_...
  function test_calendar_entity_available_property (line 324) | def test_calendar_entity_available_property(hass_instance, mock_coordina...
  function test_async_setup_entry_creates_no_calendar_entities_on_empty_data (line 350) | async def test_async_setup_entry_creates_no_calendar_entities_on_empty_d...
  function test_async_setup_entry_with_coordinator_failure (line 375) | async def test_async_setup_entry_with_coordinator_failure(
  function test_async_setup_entry_handles_coordinator_failure (line 395) | async def test_async_setup_entry_handles_coordinator_failure(
  function test_async_get_events_multiple_events_same_day (line 417) | async def test_async_get_events_multiple_events_same_day(
  function test_async_get_events_no_coordinator_data (line 469) | async def test_async_get_events_no_coordinator_data(hass_instance, mock_...
  function test_calendar_entity_available_property_no_data (line 486) | def test_calendar_entity_available_property_no_data(hass_instance, mock_...
  function test_calendar_entity_extra_state_attributes (line 501) | async def test_calendar_entity_extra_state_attributes(hass_instance, moc...
  function test_async_setup_entry_handles_coordinator_partial_data (line 523) | async def test_async_setup_entry_handles_coordinator_partial_data(

FILE: custom_components/uk_bin_collection/tests/test_config_flow.py
  function hass_with_loop (line 31) | def hass_with_loop(hass, event_loop):
  class DummyHass (line 88) | class DummyHass:
    method __init__ (line 89) | def __init__(self, loop):
  function dummy_hass (line 98) | def dummy_hass(event_loop):
  function options_flow (line 113) | def options_flow(dummy_hass):
  class DummyEntry (line 133) | class DummyEntry:
    method __init__ (line 134) | def __init__(self, data, entry_id="dummy"):
  function proceed_through_config_flow (line 141) | async def proceed_through_config_flow(
  function test_config_flow_with_uprn (line 157) | async def test_config_flow_with_uprn(hass: HomeAssistant):
  function test_config_flow_with_postcode_and_number (line 189) | async def test_config_flow_with_postcode_and_number(hass: HomeAssistant):
  function test_config_flow_with_web_driver (line 223) | async def test_config_flow_with_web_driver(hass: HomeAssistant):
  function test_config_flow_skipping_url (line 259) | async def test_config_flow_skipping_url(hass: HomeAssistant):
  function test_config_flow_with_custom_url_field (line 291) | async def test_config_flow_with_custom_url_field(hass: HomeAssistant):
  function test_config_flow_missing_name (line 323) | async def test_config_flow_missing_name(hass: HomeAssistant):
  function test_config_flow_invalid_icon_color_mapping (line 344) | async def test_config_flow_invalid_icon_color_mapping(hass: HomeAssistant):
  function test_config_flow_with_usrn (line 367) | async def test_config_flow_with_usrn(hass: HomeAssistant):
  function test_reconfigure_flow (line 400) | async def test_reconfigure_flow(hass):
  function get_councils_json (line 466) | async def get_councils_json(self) -> object:
  function test_get_councils_json_failure (line 480) | async def test_get_councils_json_failure(hass: HomeAssistant):
  function test_config_flow_user_input_none (line 510) | async def test_config_flow_user_input_none(hass: HomeAssistant):
  function test_config_flow_with_optional_fields (line 525) | async def test_config_flow_with_optional_fields(hass: HomeAssistant):
  function test_get_councils_json_session_creation_failure (line 571) | async def test_get_councils_json_session_creation_failure(hass):
  function test_config_flow_council_without_url (line 597) | async def test_config_flow_council_without_url(hass):
  function test_config_flow_missing_council (line 658) | async def test_config_flow_missing_council(hass: HomeAssistant):
  function test_reconfigure_flow_with_errors (line 681) | async def test_reconfigure_flow_with_errors(hass):
  function test_reconfigure_flow_entry_missing (line 757) | async def test_reconfigure_flow_entry_missing(hass):
  function test_reconfigure_flow_no_user_input (line 781) | async def test_reconfigure_flow_no_user_input(hass):
  function test_check_selenium_server_exception (line 830) | async def test_check_selenium_server_exception(hass: HomeAssistant):
  function test_get_councils_json_exception (line 849) | async def test_get_councils_json_exception(hass: HomeAssistant):
  function test_async_step_user_council_data_unavailable (line 863) | async def test_async_step_user_council_data_unavailable(hass: HomeAssist...
  function test_async_step_council_invalid_icon_color_mapping (line 879) | async def test_async_step_council_invalid_icon_color_mapping(hass: HomeA...
  function test_async_step_reconfigure_entry_none (line 907) | async def test_async_step_reconfigure_entry_none(hass: HomeAssistant):
  function test_async_step_reconfigure_confirm_user_input_none (line 922) | async def test_async_step_reconfigure_confirm_user_input_none(hass: Home...
  function test_async_step_council_missing_council_key (line 951) | async def test_async_step_council_missing_council_key(hass: HomeAssistant):
  function test_check_chromium_installed_exception (line 968) | async def test_check_chromium_installed_exception(hass: HomeAssistant):
  function test_async_step_reconfigure_confirm_invalid_json (line 981) | async def test_async_step_reconfigure_confirm_invalid_json(hass: HomeAss...
  function test_config_flow_with_manual_refresh_only (line 1028) | async def test_config_flow_with_manual_refresh_only(hass: HomeAssistant):
  function test_load_icon_color_mapping_valid (line 1083) | def test_load_icon_color_mapping_valid():
  function test_load_icon_color_mapping_invalid (line 1091) | def test_load_icon_color_mapping_invalid():
  function test_map_wiki_name_to_council_key (line 1101) | def test_map_wiki_name_to_council_key():
  function test_is_valid_json (line 1117) | def test_is_valid_json():
  function test_async_step_user_missing_fields (line 1128) | async def test_async_step_user_missing_fields(hass):
  function test_async_step_user_invalid_icon_mapping (line 1147) | async def test_async_step_user_invalid_icon_mapping(hass):
  function test_async_step_user_no_councils (line 1168) | async def test_async_step_user_no_councils(hass):
  function test_async_step_council_skip_get_url (line 1185) | async def test_async_step_council_skip_get_url(hass):
  function test_async_step_reconfigure_confirm_user_input_none (line 1210) | async def test_async_step_reconfigure_confirm_user_input_none(hass):
  function test_async_step_reconfigure_confirm_invalid_json (line 1236) | async def test_async_step_reconfigure_confirm_invalid_json(hass):
  function test_get_councils_json_failure (line 1278) | async def test_get_councils_json_failure(hass):
  function test_get_council_schema (line 1293) | async def test_get_council_schema(hass):
  function test_build_reconfigure_schema (line 1317) | def test_build_reconfigure_schema(hass):
  function test_async_step_import (line 1340) | async def test_async_step_import(hass):
  function test_options_flow_no_councils (line 1356) | async def test_options_flow_no_councils(dummy_hass):
  function test_build_options_schema (line 1372) | def test_build_options_schema(options_flow):
  function test_map_wiki_name_to_council_key (line 1400) | def test_map_wiki_name_to_council_key(options_flow):
  function test_is_valid_json (line 1409) | def test_is_valid_json():
  function test_is_valid_json_options (line 1422) | def test_is_valid_json_options():

FILE: custom_components/uk_bin_collection/tests/test_init.py
  class DummyUKBinCollectionApp (line 25) | class DummyUKBinCollectionApp:
    method __init__ (line 26) | def __init__(self):
    method set_args (line 31) | def set_args(self, args):
    method run (line 35) | def run(self):
  class DummyConfigEntry (line 56) | class DummyConfigEntry:
    method __init__ (line 57) | def __init__(self, data, version=1, entry_id="dummy_entry"):
  class DummyHass (line 64) | class DummyHass:
    method __init__ (line 65) | def __init__(self):
    method async_add_executor_job (line 70) | async def async_add_executor_job(self, func, *args, **kwargs):
  class Services (line 75) | class Services:
    method __init__ (line 76) | def __init__(self):
    method async_register (line 79) | def async_register(self, domain, service, service_func):
  class ConfigEntries (line 83) | class ConfigEntries:
    method async_forward_entry_setups (line 84) | async def async_forward_entry_setups(self, config_entry, platforms):
    method async_forward_entry_unload (line 88) | async def async_forward_entry_unload(self, config_entry, platform):
    method async_update_entry (line 92) | def async_update_entry(self, config_entry, data):
  function hass (line 97) | def hass():
  function dummy_config_entry (line 102) | def dummy_config_entry():
  function test_household_bin_coordinator_retains_last_good_data (line 116) | async def test_household_bin_coordinator_retains_last_good_data(hass):
  function test_async_setup_success (line 164) | async def test_async_setup_success(hass):
  function test_manual_refresh_no_entry (line 174) | async def test_manual_refresh_no_entry(hass):
  function test_async_migrate_entry_version_1 (line 190) | async def test_async_migrate_entry_version_1(hass, dummy_config_entry):
  function test_async_migrate_entry_no_migration (line 201) | async def test_async_migrate_entry_no_migration(hass, dummy_config_entry):
  function test_async_setup_entry_success (line 209) | async def test_async_setup_entry_success(hass, dummy_config_entry):
  function test_async_setup_entry_missing_name (line 225) | async def test_async_setup_entry_missing_name(hass, dummy_config_entry):
  function test_async_unload_entry_success (line 234) | async def test_async_unload_entry_success(hass, dummy_config_entry):
  function test_build_ukbcd_args_excludes_keys (line 246) | def test_build_ukbcd_args_excludes_keys():
  function test_household_bin_coordinator_update (line 265) | async def test_household_bin_coordinator_update(hass):
  function test_process_bin_data_valid (line 278) | def test_process_bin_data_valid():
  function test_process_bin_data_invalid (line 293) | def test_process_bin_data_invalid():

FILE: custom_components/uk_bin_collection/tests/test_sensor.py
  function mock_config_entry (line 62) | def mock_config_entry():
  function test_process_bin_data (line 80) | def test_process_bin_data(freezer):
  function test_process_bin_data_empty (line 92) | def test_process_bin_data_empty():
  function test_process_bin_data_past_dates (line 98) | def test_process_bin_data_past_dates(freezer):
  function test_process_bin_data_duplicate_bin_types (line 111) | def test_process_bin_data_duplicate_bin_types(freezer):
  function test_unique_id_uniqueness (line 127) | def test_unique_id_uniqueness():
  function test_async_setup_entry (line 145) | async def test_async_setup_entry(hass, mock_config_entry):
  function test_coordinator_fetch (line 182) | async def test_coordinator_fetch(hass):
  function test_bin_sensor (line 211) | async def test_bin_sensor(hass, mock_config_entry):
  function test_raw_json_sensor (line 252) | async def test_raw_json_sensor(hass, mock_config_entry):
  function test_bin_sensor_custom_icon_color (line 287) | async def test_bin_sensor_custom_icon_color(hass, mock_config_entry):
  function test_bin_sensor_today_collection (line 327) | async def test_bin_sensor_today_collection(hass, freezer, mock_config_en...
  function test_bin_sensor_tomorrow_collection (line 371) | async def test_bin_sensor_tomorrow_collection(hass, freezer, mock_config...
  function test_bin_sensor_partial_custom_icon_color (line 415) | async def test_bin_sensor_partial_custom_icon_color(hass, mock_config_en...
  function test_unique_id_uniqueness (line 467) | def test_unique_id_uniqueness(hass, mock_config_entry):
  function mock_dt_now_different_timezone (line 484) | def mock_dt_now_different_timezone():
  function test_raw_json_sensor_invalid_data (line 493) | async def test_raw_json_sensor_invalid_data(hass, mock_config_entry):
  function test_sensor_device_info (line 524) | def test_sensor_device_info(hass, mock_config_entry):
  function process_bin_data_duplicate_bin_types (line 544) | def process_bin_data_duplicate_bin_types(freezer):
  function test_coordinator_timeout_error (line 561) | async def test_coordinator_timeout_error(hass, mock_config_entry):
  function test_coordinator_json_decode_error (line 587) | async def test_coordinator_json_decode_error(hass, mock_config_entry):
  function test_coordinator_general_exception (line 617) | async def test_coordinator_general_exception(hass, mock_config_entry):
  function process_bin_data_duplicate_bin_types (line 642) | def process_bin_data_duplicate_bin_types(freezer):
  function process_bin_data_past_dates (line 658) | def process_bin_data_past_dates(freezer):
  function process_bin_data_missing_fields (line 672) | def process_bin_data_missing_fields(freezer):
  function process_bin_data_invalid_date_format (line 689) | def process_bin_data_invalid_date_format(freezer):
  function test_bin_sensor_state_today (line 706) | async def test_bin_sensor_state_today(hass, mock_config_entry, freezer):
  function test_bin_sensor_state_tomorrow (line 743) | async def test_bin_sensor_state_tomorrow(hass, mock_config_entry, freezer):
  function test_bin_sensor_state_in_days (line 777) | async def test_bin_sensor_state_in_days(hass, mock_config_entry, freezer):
  function test_bin_sensor_missing_data (line 813) | async def test_bin_sensor_missing_data(hass, mock_config_entry):
  function test_raw_json_sensor_invalid_data (line 849) | async def test_raw_json_sensor_invalid_data(hass, mock_config_entry):
  function test_sensor_available_property (line 881) | async def test_sensor_available_property(hass, mock_config_entry):
  function test_data_sensor_missing_icon_or_color (line 944) | async def test_data_sensor_missing_icon_or_color(hass, mock_config_entry):
  function test_attribute_sensor_with_complete_mappings (line 1006) | async def test_attribute_sensor_with_complete_mappings(hass, mock_config...
  function test_data_sensor_color_property_missing_or_none (line 1054) | async def test_data_sensor_color_property_missing_or_none(hass, mock_con...
  function test_sensor_available_property (line 1142) | async def test_sensor_available_property(hass, mock_config_entry):
  function test_coordinator_empty_data (line 1185) | async def test_coordinator_empty_data(hass, mock_config_entry):
  function test_coordinator_custom_update_interval (line 1209) | def test_coordinator_custom_update_interval(hass, mock_config_entry):
  function test_async_setup_entry_missing_required_fields (line 1219) | async def test_async_setup_entry_missing_required_fields(hass):
  function test_data_sensor_device_info (line 1246) | async def test_data_sensor_device_info(hass, mock_config_entry):
  function test_data_sensor_default_icon (line 1290) | async def test_data_sensor_default_icon(hass, mock_config_entry):
  function test_coordinator_update_interval (line 1325) | def test_coordinator_update_interval(hass, mock_config_entry):
  function test_manual_refresh_service (line 1332) | async def test_manual_refresh_service(hass, mock_config_entry):
  function test_load_icon_color_mapping_invalid_json (line 1384) | def test_load_icon_color_mapping_invalid_json():
  function test_bin_sensor_missing_bin_type (line 1402) | async def test_bin_sensor_missing_bin_type(hass, mock_config_entry):
  function test_attribute_sensor_undefined_attribute_type (line 1429) | async def test_attribute_sensor_undefined_attribute_type(hass, mock_conf...
  function test_bin_sensor_in_x_days (line 1452) | async def test_bin_sensor_in_x_days(hass, freezer, mock_config_entry):
  function test_data_sensor_default_icon_unknown_type (line 1467) | def test_data_sensor_default_icon_unknown_type():
  function test_raw_json_sensor_partial_data (line 1476) | def test_raw_json_sensor_partial_data():
  function test_data_sensor_unavailable_if_unknown_state (line 1488) | def test_data_sensor_unavailable_if_unknown_state():
  function test_attribute_sensor_unavailable_if_coordinator_failed (line 1498) | def test_attribute_sensor_unavailable_if_coordinator_failed():
  function test_create_sensor_entities_coordinator_data (line 1522) | def test_create_sensor_entities_coordinator_data():
  function test_create_sensor_entities_invalid_icon_json (line 1573) | def test_create_sensor_entities_invalid_icon_json():
  function test_attribute_sensor_days_and_human_readable (line 1592) | def test_attribute_sensor_days_and_human_readable():
  function test_data_sensor_coordinator_update (line 1626) | def test_data_sensor_coordinator_update():
  function test_data_sensor_today_tomorrow (line 1642) | def test_data_sensor_today_tomorrow():
  function test_create_sensor_entities_full_coverage (line 1669) | def test_create_sensor_entities_full_coverage(hass):
  function test_attribute_sensor_state_colour (line 1728) | def test_attribute_sensor_state_colour():
  function test_attribute_sensor_state_bin_type (line 1743) | def test_attribute_sensor_state_bin_type():
  function test_attribute_sensor_state_next_collection_date_with_data (line 1754) | def test_attribute_sensor_state_next_collection_date_with_data():
  function test_attribute_sensor_state_next_collection_date_no_data (line 1767) | def test_attribute_sensor_state_next_collection_date_no_data():
  function test_attribute_sensor_state_next_collection_human_readable_today (line 1779) | def test_attribute_sensor_state_next_collection_human_readable_today():
  function test_attribute_sensor_state_next_collection_human_readable_tomorrow (line 1792) | def test_attribute_sensor_state_next_collection_human_readable_tomorrow():
  function test_attribute_sensor_state_next_collection_human_readable_future (line 1804) | def test_attribute_sensor_state_next_collection_human_readable_future():
  function test_attribute_sensor_state_days_until_collection_with_data (line 1817) | def test_attribute_sensor_state_days_until_collection_with_data():
  function test_attribute_sensor_state_days_until_collection_no_data (line 1829) | def test_attribute_sensor_state_days_until_collection_no_data():
  function test_data_sensor_extra_state_attributes (line 1845) | def test_data_sensor_extra_state_attributes():
  function test_data_sensor_device_info_property (line 1860) | def test_data_sensor_device_info_property():
  function test_data_sensor_unique_id_property (line 1875) | def test_data_sensor_unique_id_property():
  function test_create_sensor_entities_coordinator_data (line 1889) | def test_create_sensor_entities_coordinator_data():
  function test_create_sensor_entities_invalid_icon_json (line 1934) | def test_create_sensor_entities_invalid_icon_json():
  function test_attribute_sensor_days_and_human_readable (line 1957) | def test_attribute_sensor_days_and_human_readable():
  function test_raw_json_sensor_partial_data (line 1984) | def test_raw_json_sensor_partial_data():
  function test_data_sensor_unavailable_if_unknown_state (line 1997) | def test_data_sensor_unavailable_if_unknown_state():
  function test_attribute_sensor_unavailable_if_coordinator_failed (line 2007) | def test_attribute_sensor_unavailable_if_coordinator_failed():
  function test_data_sensor_state_unknown_and_extra_attributes (line 2022) | def test_data_sensor_state_unknown_and_extra_attributes():
  function test_data_sensor_device_info_and_unique_id (line 2045) | def test_data_sensor_device_info_and_unique_id():
  function test_attribute_sensor_calculate_human_readable_and_days_until (line 2072) | def test_attribute_sensor_calculate_human_readable_and_days_until():
  function test_create_sensor_entities_with_no_data (line 2100) | def test_create_sensor_entities_with_no_data():
  function test_load_icon_color_mapping_empty_string (line 2116) | def test_load_icon_color_mapping_empty_string():
  function test_raw_json_sensor_with_no_data (line 2127) | def test_raw_json_sensor_with_no_data():

FILE: scripts/check_ha_compatibility.py
  function check_manifest (line 16) | def check_manifest() -> Tuple[bool, str]:
  function check_component_imports (line 34) | def check_component_imports() -> Tuple[bool, str]:
  function check_homeassistant_version (line 55) | def check_homeassistant_version() -> Tuple[bool, str]:
  function check_dependencies (line 67) | def check_dependencies() -> Tuple[bool, str]:
  function run_compatibility_check (line 78) | def run_compatibility_check() -> Dict[str, Tuple[bool, str]]:
  function main (line 89) | def main():

FILE: uk_bin_collection/compare_lad_codes.py
  function extract_lad_codes (line 5) | def extract_lad_codes(input_json_path):
  function compare_with_geojson (line 26) | def compare_with_geojson(input_lad_codes, geojson_path):

FILE: uk_bin_collection/tests/check_selenium_url_in_input.json.py
  function get_council_files (line 8) | def get_council_files(repo, branch):
  function get_council_file_content (line 39) | def get_council_file_content(api_url):
  function get_input_json_data (line 60) | def get_input_json_data(repo, branch):
  function council_needs_update (line 82) | def council_needs_update(council_name, json_data, council_file_content):
  function compare_councils (line 97) | def compare_councils(file_council_dict, json_data):
  function main (line 155) | def main(repo="robbrad/UKBinCollectionData", branch="master"):

FILE: uk_bin_collection/tests/council_feature_input_parity.py
  function get_councils_from_files (line 8) | def get_councils_from_files(repo, branch):
  function get_councils_from_json (line 35) | def get_councils_from_json(repo, branch):
  function compare_councils (line 54) | def compare_councils(councils1, councils2):
  function main (line 74) | def main(repo="robbrad/UKBinCollectionData", branch="master"):

FILE: uk_bin_collection/tests/features/environment.py
  function before_all (line 6) | def before_all(context):

FILE: uk_bin_collection/tests/generate_map_test_results.py
  function extract_council_name (line 8) | def extract_council_name(testname):
  function parse_junit_xml (line 19) | def parse_junit_xml(path):
  function main (line 37) | def main():

FILE: uk_bin_collection/tests/step_defs/step_helpers/file_handler.py
  function load_json_file (line 14) | def load_json_file(file_name: str) -> Dict[str, Any]:
  function validate_json (line 29) | def validate_json(json_str: str) -> Dict[str, Any]:
  function validate_json_schema (line 37) | def validate_json_schema(json_str: str, schema: Dict[str, Any]) -> bool:

FILE: uk_bin_collection/tests/step_defs/test_validate_council.py
  function get_council_list (line 16) | def get_council_list():
  function council (line 25) | def council(request):
  function test_scenario_outline (line 32) | def test_scenario_outline(council) -> None:
  function handle_test_errors (line 36) | def handle_test_errors(func: Callable[..., Any]) -> Callable[..., Any]:
  class Context (line 49) | class Context:
    method __init__ (line 50) | def __init__(self):
  function context (line 57) | def context():
  function get_council_step (line 63) | def get_council_step(context, council) -> None:
  function scrape_step (line 71) | def scrape_step(
  function validate_json_step (line 106) | def validate_json_step(context: Any) -> None:
  function validate_output_step (line 112) | def validate_output_step(context: Any) -> None:

FILE: uk_bin_collection/tests/test_collect_data.py
  function test_setup_arg_parser (line 8) | def test_setup_arg_parser():
  function test_set_args (line 33) | def test_set_args():
  function test_client_code (line 47) | def test_client_code():
  function test_run_function (line 62) | def test_run_function(mock_app_run, mock_setup_logging):

FILE: uk_bin_collection/tests/test_common_functions.py
  function test_check_postcode_valid (line 12) | def test_check_postcode_valid():
  function test_check_postcode_invalid (line 18) | def test_check_postcode_invalid():
  function test_check_paon (line 26) | def test_check_paon():
  function test_check_paon_invalid (line 32) | def test_check_paon_invalid(capfd):
  function test_get_data_check_uprn (line 42) | def test_get_data_check_uprn():
  function test_get_data_check_uprn_exception (line 48) | def test_get_data_check_uprn_exception(capfd):
  function test_get_data_check_usrn (line 55) | def test_get_data_check_usrn():
  function test_get_data_check_usrn_exception (line 61) | def test_get_data_check_usrn_exception(capfd):
  function test_get_date_with_ordinal (line 68) | def test_get_date_with_ordinal():
  function test_get_date_with_ordinal_exception (line 74) | def test_get_date_with_ordinal_exception():
  function test_parse_header (line 84) | def test_parse_header():
  function test_is_holiday_when_true (line 100) | def test_is_holiday_when_true(mock_holidays_func):
  function test_is_holiday_when_false (line 109) | def test_is_holiday_when_false(mock_holidays_func):
  function holiday_effect (line 117) | def holiday_effect(country_code, subdiv=None):
  function test_is_holiday_different_region (line 129) | def test_is_holiday_different_region(mock_holidays_func):
  function test_is_weekend_when_true (line 137) | def test_is_weekend_when_true():
  function test_is_weekend_when_false (line 142) | def test_is_weekend_when_false():
  function test_is_working_day_when_true (line 147) | def test_is_working_day_when_true():
  function test_is_working_day_when_false (line 152) | def test_is_working_day_when_false():
  function test_get_next_working_day (line 157) | def test_get_next_working_day():
  function test_remove_alpha_characters (line 163) | def test_remove_alpha_characters():
  function test_remove_alpha_characters_bad (line 169) | def test_remove_alpha_characters_bad():
  function test_get_dates_every_x_days (line 175) | def test_get_dates_every_x_days():
  function test_get_dates_every_x_days_bad (line 182) | def test_get_dates_every_x_days_bad():
  function test_remove_ordinal_indicator_from_date_string (line 189) | def test_remove_ordinal_indicator_from_date_string():
  function test_remove_ordinal_indicator_from_date_string_bad (line 195) | def test_remove_ordinal_indicator_from_date_string_bad():
  function test_get_weekday_dates_in_period (line 201) | def test_get_weekday_dates_in_period():
  function test_get_weekday_dates_in_period_bad (line 208) | def test_get_weekday_dates_in_period_bad():
  function test_get_next_occurrence_from_day_month_false (line 215) | def test_get_next_occurrence_from_day_month_false():
  function test_get_next_occurrence_from_day_month_true (line 220) | def test_get_next_occurrence_from_day_month_true():
  function test_update_input_json (line 227) | def test_update_input_json(mock_save_data, mock_load_data):
  function test_update_input_json_ioerror (line 253) | def test_update_input_json_ioerror(mock_save_data, mock_load_data):
  function test_update_input_json_jsondecodeerror (line 265) | def test_update_input_json_jsondecodeerror(mock_save_data, mock_load_data):
  function test_load_data_existing_file (line 275) | def test_load_data_existing_file():
  function test_load_data_non_existing_file (line 288) | def test_load_data_non_existing_file():
  function test_load_data_invalid_json (line 295) | def test_load_data_invalid_json():
  function test_save_data_to_file (line 305) | def test_save_data_to_file():
  function test_save_data_io_error (line 324) | def test_save_data_io_error():
  function test_contains_date_with_valid_dates (line 332) | def test_contains_date_with_valid_dates():
  function test_contains_date_with_invalid_dates (line 339) | def test_contains_date_with_invalid_dates():
  function test_contains_date_with_fuzzy_true (line 346) | def test_contains_date_with_fuzzy_true():
  function test_contains_date_with_fuzzy_false (line 351) | def test_contains_date_with_fuzzy_false():
  function test_contains_date_with_mixed_content (line 356) | def test_contains_date_with_mixed_content():
  function test_create_webdriver_local (line 361) | def test_create_webdriver_local():
  function test_create_webdriver_remote_failure (line 368) | def test_create_webdriver_remote_failure():
  function test_create_webdriver_remote_with_session_name (line 374) | def test_create_webdriver_remote_with_session_name():
  function test_string_with_numbers (line 397) | def test_string_with_numbers():
  function test_string_without_numbers (line 403) | def test_string_without_numbers():
  function test_empty_string (line 409) | def test_empty_string():
  function test_string_with_only_numbers (line 413) | def test_string_with_only_numbers():
  function test_string_with_special_characters_and_numbers (line 417) | def test_string_with_special_characters_and_numbers():
  function test_string_with_whitespace_and_numbers (line 422) | def test_string_with_whitespace_and_numbers():
  function test_get_next_day_of_week (line 457) | def test_get_next_day_of_week(today_str, day_name, expected):

FILE: uk_bin_collection/tests/test_conftest.py
  function test_headless_mode (line 6) | def test_headless_mode(pytestconfig):
  function test_local_browser (line 12) | def test_local_browser(pytestconfig):
  function test_selenium_url (line 17) | def test_selenium_url(pytestconfig):
  function test_headless_mode_fixture (line 27) | def test_headless_mode_fixture(headless_mode):
  function test_local_browser_fixture (line 31) | def test_local_browser_fixture(local_browser):
  function test_selenium_url_fixture (line 35) | def test_selenium_url_fixture(selenium_url):

FILE: uk_bin_collection/tests/test_get_data.py
  function mocked_requests_get (line 14) | def mocked_requests_get(*args, **kwargs):
  function test_logging_exception (line 53) | def test_logging_exception():
  function test_setup_logging_valid_config (line 60) | def test_setup_logging_valid_config():
  function test_get_data (line 87) | def test_get_data(mock_get):
  function test_get_data_error (line 96) | def test_get_data_error(mock_get, url):
  function test_output_json (line 102) | def test_output_json():
  class ConcreteGetBinDataClass (line 109) | class ConcreteGetBinDataClass(agbdc):
    method parse_data (line 112) | def parse_data(self, page: str, **kwargs) -> dict:
    method update_dev_mode_data (line 115) | def update_dev_mode_data(self, council_module_str, this_url, **kwargs):
  function concrete_class_instance (line 121) | def concrete_class_instance():
  function test_get_and_parse_data_no_skip_get_url (line 125) | def test_get_and_parse_data_no_skip_get_url(concrete_class_instance):
  function test_get_and_parse_data_skip_get_url (line 142) | def test_get_and_parse_data_skip_get_url(concrete_class_instance):
  function setup_test_update_dev_mode_data (line 160) | def setup_test_update_dev_mode_data():
  function test_update_dev_mode_data (line 180) | def test_update_dev_mode_data(setup_test_update_dev_mode_data):

FILE: uk_bin_collection/uk_bin_collection/collect_data.py
  function import_council_module (line 14) | def import_council_module(module_name, src_path="councils"):
  class UKBinCollectionApp (line 22) | class UKBinCollectionApp:
    method __init__ (line 23) | def __init__(self):
    method setup_arg_parser (line 27) | def setup_arg_parser(self):
    method set_args (line 94) | def set_args(self, args):
    method run (line 98) | def run(self):
    method client_code (line 115) | def client_code(self, get_bin_data_class, address_url, **kwargs):
  function run (line 124) | def run():

FILE: uk_bin_collection/uk_bin_collection/common.py
  class Region (line 29) | class Region(Enum):
  function check_postcode (line 36) | def check_postcode(postcode: str):
  function check_paon (line 52) | def check_paon(paon: str):
  function check_uprn (line 67) | def check_uprn(uprn: str):
  function check_usrn (line 81) | def check_usrn(usrn: str):
  function get_date_with_ordinal (line 95) | def get_date_with_ordinal(date_number: int) -> str:
  function has_numbers (line 109) | def has_numbers(inputString: str) -> bool:
  function remove_ordinal_indicator_from_date_string (line 119) | def remove_ordinal_indicator_from_date_string(date_string: str) -> str:
  function parse_header (line 129) | def parse_header(raw_header: str) -> dict:
  function is_holiday (line 149) | def is_holiday(date_to_check: datetime, region: Region = Region.ENG) -> ...
  function is_weekend (line 164) | def is_weekend(date_to_check: datetime) -> bool:
  function is_working_day (line 173) | def is_working_day(date_to_check: datetime, region: Region = Region.ENG)...
  function get_next_working_day (line 187) | def get_next_working_day(date: datetime, region: Region = Region.ENG) ->...
  function get_weekday_dates_in_period (line 193) | def get_weekday_dates_in_period(start: datetime, day_of_week: int, amoun...
  function get_dates_every_x_days (line 210) | def get_dates_every_x_days(start: datetime, step: int, amount: int = 8) ...
  function get_next_occurrence_from_day_month (line 227) | def get_next_occurrence_from_day_month(date: datetime) -> datetime:
  function remove_alpha_characters (line 246) | def remove_alpha_characters(input_string: str) -> str:
  function update_input_json (line 250) | def update_input_json(council: str, url: str, input_file_path: str, **kw...
  function load_data (line 272) | def load_data(file_path):
  function save_data (line 279) | def save_data(file_path, data):
  function get_next_day_of_week (line 284) | def get_next_day_of_week(day_name, date_format="%d/%m/%Y"):
  function contains_date (line 306) | def contains_date(string, fuzzy=False) -> bool:
  function create_webdriver (line 321) | def create_webdriver(

FILE: uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 13) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/AmberValleyBoroughCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/AngusCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BarkingDagenham.py
  class CouncilClass (line 18) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py
  function get_seasonal_overrides (line 14) | def get_seasonal_overrides():
  class CouncilClass (line 52) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 59) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py
  function parse_bin_text (line 14) | def parse_bin_text(bin_type_str: str, bin_date_str: str) -> List[Dict[st...
  class CouncilClass (line 40) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 47) | def parse_data(self, page: str, **kwargs: Any) -> Dict[str, Any]:

FILE: uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:
    method _try_api_method (line 32) | def _try_api_method(self, uprn: str) -> dict:
    method _try_selenium_method (line 74) | def _try_selenium_method(self, uprn: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py
  class CouncilClass (line 19) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py
  class CustomHttpAdapter (line 12) | class CustomHttpAdapter(requests.adapters.HTTPAdapter):
    method __init__ (line 15) | def __init__(self, ssl_context=None, **kwargs):
    method init_poolmanager (line 19) | def init_poolmanager(self, connections, maxsize, block=False):
  class CouncilClass (line 28) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 35) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method get_session_variable (line 20) | def get_session_variable(self, soup, id) -> str:
    method parse_data (line 28) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py
  class CouncilClass (line 17) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 24) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py
  function get_token (line 15) | def get_token(page) -> str:
  class CouncilClass (line 27) | class CouncilClass(AbstractGetBinDataClass):
    method get_data (line 34) | def get_data(self, url: str) -> str:
    method parse_data (line 67) | def parse_data(self, page: str, **kwargs: Any) -> Dict[str, List[Dict[...

FILE: uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py
  class CustomHttpAdapter (line 15) | class CustomHttpAdapter(requests.adapters.HTTPAdapter):
    method __init__ (line 18) | def __init__(self, ssl_context=None, **kwargs):
    method init_poolmanager (line 22) | def init_poolmanager(self, connections, maxsize, block=False):
  class CouncilClass (line 31) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 38) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BlackpoolCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BolsoverCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BostonBoroughCouncil.py
  class CouncilClass (line 17) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 24) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py
  function get_headers (line 9) | def get_headers(base_url: str, method: str) -> dict[str, str]:
  function get_session_storage_global (line 49) | def get_session_storage_global() -> object:
  function get_csrf_token (line 63) | def get_csrf_token(s: requests.session, base_url: str) -> str:
  function get_address_id (line 92) | def get_address_id(
  function get_collection_data (line 153) | def get_collection_data(
  class CouncilClass (line 197) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 204) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py
  class CouncilClass (line 20) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 27) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py
  class CouncilClass (line 20) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py
  class BucksInput (line 18) | class BucksInput:
  class CouncilClass (line 25) | class CouncilClass(AbstractGetBinDataClass):
    method encode_body (line 32) | def encode_body(self, bucks_input: BucksInput):
    method decode_response (line 49) | def decode_response(self, hex_input: str):
    method parse_data (line 66) | def parse_data(self, _: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py
  class CouncilClass (line 19) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 26) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CambridgeCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py
  class BearerAuth (line 17) | class BearerAuth(requests.auth.AuthBase):
    method __init__ (line 18) | def __init__(self, token):
    method __call__ (line 21) | def __call__(self, r):
  function parse_token (line 26) | def parse_token(text: str) -> str:
  function get_jwt (line 38) | def get_jwt() -> str:
  class CouncilClass (line 91) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 98) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CeredigionCountyCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs: str) -> dict[str, list[dict[...

FILE: uk_bin_collection/uk_bin_collection/councils/CherwellDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: Any, **kwargs: Any) -> Dict[str, Any]:

FILE: uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py
  class CouncilClass (line 19) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 24) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:
    method smart_select_address (line 82) | def smart_select_address(self, driver, house_number: str):

FILE: uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method get_and_parse_data (line 11) | def get_and_parse_data(self, url: str, **kwargs: Any) -> Dict[str, Lis...
    method parse_data (line 93) | def parse_data(self, page: str, **kwargs: Any) -> Dict[str, List[Dict[...

FILE: uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 11) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DarlingtonBoroughCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DenbighshireCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 11) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DumfriesandGallowayCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DundeeCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py
  class CouncilClass (line 6) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 13) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastDunbartonshireCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastLothianCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastStaffordshireBoroughCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastbourneBoroughCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EdenDistrictCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EdinburghCityCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/EpsomandEwellBoroughCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ExeterCityCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/FermanaghOmaghDistrictCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/FolkestoneandHytheDistrictCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py
  class CouncilClass (line 18) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 25) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/FyldeCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GooglePublicCalendarCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 11) | def parse_data(self, page: str, **kwargs: Any) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GosportBoroughCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 13) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GreatYarmouthBoroughCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py
  class CouncilClass (line 20) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 27) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/GwyneddCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HackneyCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py
  class CouncilClass (line 17) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 24) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HarboroughDistrictCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs: Any) -> Dict[str, List[Dict[...

FILE: uk_bin_collection/uk_bin_collection/councils/HarlowCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HartDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:
    method format_date (line 67) | def format_date(self, date_str):

FILE: uk_bin_collection/uk_bin_collection/councils/HartlepoolBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HastingsBoroughCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HerefordshireCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method get_data (line 19) | def get_data(self, page) -> dict:
    method parse_data (line 57) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/Hillingdon.py
  function get_bank_holiday_changes (line 35) | def get_bank_holiday_changes(driver: WebDriver) -> Dict[str, str]:
  class CouncilClass (line 98) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 99) | def parse_data(self, page: str, **kwargs: Any) -> Dict[str, Any]:

FILE: uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HorshamDistrictCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py
  class CouncilClass (line 17) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 25) | def parse_data(self, page, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/HyndburnBoroughCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/IpswichBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method transform_date (line 33) | def transform_date(self, date_str):
    method parse_data (line 40) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/IsleOfAngleseyCouncil.py
  class CouncilClass (line 22) | class CouncilClass(AbstractGetBinDataClass):
    method __init__ (line 27) | def __init__(self):
    method _initialise_session (line 37) | def _initialise_session(self) -> None:
    method _run_lookup (line 58) | def _run_lookup(self, lookup_id: str, payload: dict) -> dict:
    method _get_uprn_from_postcode_and_paon (line 89) | def _get_uprn_from_postcode_and_paon(self, postcode: str, paon: str) -...
    method parse_data (line 135) | def parse_data(self, page: str, **kwargs) -> dict:
    method _extract_bin_data (line 191) | def _extract_bin_data(schedule: dict) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 8) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/KingsLynnandWestNorfolkBC.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py
  class CouncilClass (line 21) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 28) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py
  class CouncilClass (line 23) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 30) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LeicesterCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LewesDistrictCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LincolnCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughCamdenCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 12) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughHammersmithandFulham.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughHavering.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughLewisham.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughOfRichmondUponThames.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:
    method _fetch_html (line 48) | def _fetch_html(self, url: str) -> str:
    method _parse_html_for_waste (line 61) | def _parse_html_for_waste(self, html: str) -> dict:
    method _extract_waste_block (line 113) | def _extract_waste_block(self, html: str) -> str | None:
    method _pid_from_url (line 126) | def _pid_from_url(self, url: str | None) -> str | None:
    method _pid_from_paon (line 135) | def _pid_from_paon(self, paon) -> str | None:
    method _clean (line 141) | def _clean(self, s: str) -> str:
    method _first_date_or_message (line 150) | def _first_date_or_message(self, lines) -> str | None:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py
  class CouncilClass (line 20) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 27) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MaidstoneBoroughCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MedwayCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MeltonBoroughCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method extract_dates (line 19) | def extract_dates(self, date_string: str) -> list:
    method parse_data (line 37) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 34) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MidDevonCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MidSuffolkDistrictCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MidUlsterDistrictCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MiddlesbroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 12) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 35) | def parse_data(self, page: str, **kwargs) -> dict:
    method _get_result_by_identifier (line 76) | def _get_result_by_identifier(self, soup, identifier: str) -> list:
    method _fetch_bin_collection_data (line 125) | def _fetch_bin_collection_data(self, url: str) -> list:
    method _parse_bin_collection_items (line 144) | def _parse_bin_collection_items(self, bin_items: list) -> list:

FILE: uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 12) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/MorayCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py
  class CouncilClass (line 22) | class CouncilClass(AbstractGetBinDataClass):
    method get_legacy_bins (line 24) | def get_legacy_bins(self, page: str) -> []:
    method parse_data (line 72) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page, **kwargs) -> None:

FILE: uk_bin_collection/uk_bin_collection/councils/NewcastleUnderLymeCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 9) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py
  class NewportInput (line 18) | class NewportInput:
  class CouncilClass (line 25) | class CouncilClass(AbstractGetBinDataClass):
    method encode_body (line 32) | def encode_body(self, newport_input: NewportInput):
    method decode_response (line 58) | def decode_response(self, hex_input: str):
    method parse_data (line 84) | def parse_data(self, _: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthDevonCountyCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py
  function lookup_uprn (line 34) | def lookup_uprn(postcode: str, paon: str) -> str:
  function fetch_mobile_api (line 120) | def fetch_mobile_api(uprn: str) -> dict:
  class CouncilClass (line 154) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 160) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py
  class CouncilClass (line 5) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 12) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py
  function myFunc (line 10) | def myFunc(e):
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py
  class CouncilClass (line 6) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 13) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthWarwickshireBoroughCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 11) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method extract_styles (line 23) | def extract_styles(self, style_str: str) -> dict:
    method parse_data (line 40) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 12) | def parse_data(self, page: str, **kwargs) -> dict:
    method get_bin_data (line 63) | def get_bin_data(self, url) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/OadbyAndWigstonBoroughCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/OxfordCityCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/PembrokeshireCountyCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/PerthAndKinrossCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/PeterboroughCityCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/PlymouthCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/PowysCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py
  class CouncilClass (line 5) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 12) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RedcarandClevelandCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RedditchBoroughCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RunnymedeBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SandwellBoroughCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 37) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method wait_for_element_conditions (line 16) | def wait_for_element_conditions(self, driver, conditions, timeout: int...
    method parse_data (line 23) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SloughBoroughCouncil.py
  function get_street_from_postcode (line 16) | def get_street_from_postcode(postcode: str, api_key: str) -> str:
  class CouncilClass (line 32) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 33) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py
  function format_bin_data (line 7) | def format_bin_data(key: str, date: datetime):
  class CouncilClass (line 23) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 24) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthHamsDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthHollandDistrictCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py
  class CouncilClass (line 27) | class CouncilClass(AbstractGetBinDataClass):
    method get_collection_day_from_postcode (line 34) | def get_collection_day_from_postcode(self, driver, postcode):
    method _get_collection_day_requests (line 45) | def _get_collection_day_requests(self, postcode):
    method _get_collection_day_selenium (line 157) | def _get_collection_day_selenium(self, driver, postcode):
    method get_green_bin_info_from_postcode (line 247) | def get_green_bin_info_from_postcode(self, driver, postcode):
    method _get_green_bin_info_requests (line 258) | def _get_green_bin_info_requests(self, postcode):
    method _get_green_bin_info_selenium (line 371) | def _get_green_bin_info_selenium(self, driver, postcode):
    method get_next_collection_dates (line 445) | def get_next_collection_dates(self, collection_day, num_weeks=8):
    method get_green_bin_collection_dates (line 471) | def get_green_bin_collection_dates(self, green_bin_info, num_weeks=8):
    method calculate_green_bin_dates_mathematically (line 506) | def calculate_green_bin_dates_mathematically(self, green_bin_info, num...
    method get_calendar_links (line 559) | def get_calendar_links(self):
    method download_calendar_images (line 649) | def download_calendar_images(self):
    method validate_calendar_image (line 712) | def validate_calendar_image(self, content, calendar_type):
    method download_calendar_images_fallback (line 735) | def download_calendar_images_fallback(self):
    method get_alternative_calendar_links (line 802) | def get_alternative_calendar_links(self):
    method parse_calendar_images (line 870) | def parse_calendar_images(self):
    method get_fallback_calendar_data (line 912) | def get_fallback_calendar_data(self):
    method initialize_ocr (line 924) | def initialize_ocr(self):
    method preprocess_image (line 939) | def preprocess_image(self, image_path):
    method extract_text_from_calendar (line 965) | def extract_text_from_calendar(self, image_path):
    method parse_calendar_with_ocr (line 995) | def parse_calendar_with_ocr(self, image_path, calendar_type='regular'):
    method parse_regular_calendar_text (line 1023) | def parse_regular_calendar_text(self, extracted_text):
    method parse_green_calendar_text (line 1067) | def parse_green_calendar_text(self, extracted_text):
    method get_bin_type_from_calendar (line 1106) | def get_bin_type_from_calendar(self, collection_date, calendar_data=No...
    method parse_data (line 1133) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method get_data (line 13) | def get_data(self, url: str) -> str:
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs: Any) -> Dict[str, List[Dict[...

FILE: uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_date (line 15) | def parse_date(self, date_str):
    method add_bin_types_to_collection (line 34) | def add_bin_types_to_collection(
    method parse_data (line 60) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py
  function get_address_uprn (line 9) | def get_address_uprn(postcode: str, paon: str, api_url: str) -> str:
  class CouncilClass (line 41) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 48) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthamptonCityCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py
  function extract_collection_date (line 9) | def extract_collection_date(section, section_id):
  class CouncilClass (line 39) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 46) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SpelthorneBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py
  class CouncilClass (line 6) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 7) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StHelensBC.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_date (line 14) | def parse_date(self, date_str):
    method parse_data (line 33) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StevenageBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StirlingCouncil.py
  class CouncilClass (line 18) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StocktonOnTeesCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method get_next_weekday (line 17) | def get_next_weekday(self, day_name: str) -> str:
    method parse_data (line 35) | def parse_data(self, page: Any, **kwargs: Any) -> Dict[str, Any]:

FILE: uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SurreyHeathBoroughCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py
  function parse_collection_date (line 10) | def parse_collection_date(date_string) -> datetime:
  class CouncilClass (line 23) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 30) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method get_session_variable (line 20) | def get_session_variable(self, soup, id) -> str:
    method parse_data (line 28) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 10) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py
  class CouncilClass (line 20) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 28) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TewkesburyBoroughCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 9) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py
  class CouncilClass (line 14) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 21) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py
  class CouncilClass (line 19) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ThurrockCouncil.py
  class CouncilClass (line 6) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 13) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py
  class CouncilClass (line 16) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py
  class CouncilClass (line 24) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 26) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WalthamForest.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py
  class CouncilClass (line 8) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 15) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py
  class CouncilClass (line 13) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 20) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py
  function get_token (line 6) | def get_token(page) -> str:
  class CouncilClass (line 18) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 25) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestDunbartonshireCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py
  class CouncilClass (line 17) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 24) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 12) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py
  class CouncilClass (line 12) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 19) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WolverhamptonCityCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WorcesterCityCouncil.py
  class CouncilClass (line 9) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 16) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WrexhamCountyBoroughCouncil.py
  class CouncilClass (line 15) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 22) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py
  class CouncilClass (line 24) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 26) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py
  class CouncilClass (line 11) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 18) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/WyreForestDistrictCouncil.py
  class CouncilClass (line 6) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 13) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py
  class CouncilClass (line 10) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 17) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py
  class CouncilClass (line 7) | class CouncilClass(AbstractGetBinDataClass):
    method parse_data (line 14) | def parse_data(self, page: str, **kwargs) -> dict:

FILE: uk_bin_collection/uk_bin_collection/councils/tests/conftest.py
  function pytest_configure (line 8) | def pytest_configure(config):
  function pytest_collection_modifyitems (line 15) | def pytest_collection_modifyitems(config, items):
  function test_postcode (line 23) | def test_postcode():

FILE: uk_bin_collection/uk_bin_collection/councils/tests/test_south_kesteven_district_council.py
  class TestSouthKestevenDistrictCouncil (line 13) | class TestSouthKestevenDistrictCouncil:
    method setup_method (line 16) | def setup_method(self):
    method test_get_next_collection_dates_monday (line 20) | def test_get_next_collection_dates_monday(self):
    method test_get_next_collection_dates_friday (line 33) | def test_get_next_collection_dates_friday(self):
    method test_get_next_collection_dates_same_day (line 46) | def test_get_next_collection_dates_same_day(self):
    method test_get_green_bin_collection_dates_week_1 (line 59) | def test_get_green_bin_collection_dates_week_1(self):
    method test_get_green_bin_collection_dates_week_2 (line 74) | def test_get_green_bin_collection_dates_week_2(self):
    method test_get_green_bin_collection_dates_no_info (line 89) | def test_get_green_bin_collection_dates_no_info(self):
    method test_get_collection_day_from_postcode_success (line 94) | def test_get_collection_day_from_postcode_success(self):
    method test_get_collection_day_from_postcode_failure (line 105) | def test_get_collection_day_from_postcode_failure(self):
    method test_get_green_bin_info_from_postcode_success (line 116) | def test_get_green_bin_info_from_postcode_success(self):
    method test_get_green_bin_info_from_postcode_failure (line 128) | def test_get_green_bin_info_from_postcode_failure(self):
    method test_parse_data_success_with_green_bin (line 139) | def test_parse_data_success_with_green_bin(self):
    method test_parse_data_success_without_green_bin (line 169) | def test_parse_data_success_without_green_bin(self):
    method test_parse_data_no_postcode (line 193) | def test_parse_data_no_postcode(self):
    method test_parse_data_collection_day_failure (line 198) | def test_parse_data_collection_day_failure(self):
    method test_parse_data_exception_handling (line 206) | def test_parse_data_exception_handling(self):
    method test_week_of_month_calculation (line 215) | def test_week_of_month_calculation(self):
    method test_days_of_week_mapping (line 235) | def test_days_of_week_mapping(self):

FILE: uk_bin_collection/uk_bin_collection/councils/tests/test_south_kesteven_integration.py
  class TestSouthKestevenIntegration (line 13) | class TestSouthKestevenIntegration:
    method setup_method (line 16) | def setup_method(self):
    method test_real_postcode_lookup (line 23) | def test_real_postcode_lookup(self):
    method test_invalid_postcode_handling (line 58) | def test_invalid_postcode_handling(self):
    method test_collection_day_extraction (line 70) | def test_collection_day_extraction(self):
    method test_green_bin_info_extraction (line 81) | def test_green_bin_info_extraction(self):
    method test_collection_date_calculation_accuracy (line 95) | def test_collection_date_calculation_accuracy(self):
    method test_green_bin_week_calculation_accuracy (line 122) | def test_green_bin_week_calculation_accuracy(self):

FILE: uk_bin_collection/uk_bin_collection/create_new_council.py
  function create_council (line 7) | def create_council(council_name: str, url: str) -> None:
  function main (line 36) | def main():

FILE: uk_bin_collection/uk_bin_collection/get_bin_data.py
  function setup_logging (line 28) | def setup_logging(logging_config, logger_name):
  class AbstractGetBinDataClass (line 43) | class AbstractGetBinDataClass(ABC):
    method template_method (line 50) | def template_method(self, address_url: str, **kwargs) -> None:  # prag...
    method get_and_parse_data (line 74) | def get_and_parse_data(self, address_url, **kwargs):
    method update_dev_mode_data (line 88) | def update_dev_mode_data(self, council_module_str, this_url, **kwargs):
    method get_data (line 110) | def get_data(cls, url) -> str:
    method parse_data (line 131) | def parse_data(self, page: str, **kwargs) -> dict:
    method output_json (line 139) | def output_json(cls, bin_data_dict: dict) -> str:

FILE: uk_bin_collection_api_server/server.py
  function council_data (line 9) | def council_data(
  function create_app (line 45) | def create_app():

FILE: wiki/generate_wiki.py
  function main (line 5) | def main():
Condensed preview — 442 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,124K chars).
[
  {
    "path": ".devcontainer/dev.Dockerfile",
    "chars": 2926,
    "preview": "ARG VARIANT=\"3.12-bullseye\"\nFROM mcr.microsoft.com/devcontainers/python:${VARIANT} AS ukbc-dev-base\n\nUSER root\n\n# Instal"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 3233,
    "preview": "{\n    \"dockerComposeFile\": \"docker-compose.yml\",\n    \"service\": \"devcontainer\",\n    \"workspaceFolder\": \"/workspaces/UKBi"
  },
  {
    "path": ".devcontainer/docker-compose.yml",
    "chars": 4092,
    "preview": "services:\n  devcontainer:\n    image: ukbc_dev_container  # This tags the built image\n    build:\n      context: ../  # Pa"
  },
  {
    "path": ".dockerignore",
    "chars": 544,
    "preview": "# Ignore everything\n*\n\n# But not these files...\n!*.json\n!*.py\n!PipFile\n!Pipfile.lock\n!.gitignore\n!.dockerignore\n!*.toml\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/COUNCIL_ISSUE.yaml",
    "chars": 1360,
    "preview": "name: Council Issue\ndescription: Issue with an existing council\nlabels: [\"bug\"]\n\nbody:\n    - type: input\n      id: counc"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/COUNCIL_REQUEST.yaml",
    "chars": 1915,
    "preview": "name: Council Request\ndescription: Request for a council to be added to the repository\nlabels: [\"council request\"]\n\nbody"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/HOME_ASSISTANT_CUSTOM_COMPONENT_ISSUE.yaml",
    "chars": 2216,
    "preview": "name: Home Assistant Custom Component Issue\ndescription: Issue with the Home Assistant custom component\nlabels: [\"bug\", "
  },
  {
    "path": ".github/dependabot.yaml",
    "chars": 230,
    "preview": "---\nversion: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: daily\n "
  },
  {
    "path": ".github/workflows/behave_pull_request.yml",
    "chars": 4404,
    "preview": "name: PR - Test Councils\n\non:\n  workflow_dispatch:\n  pull_request:\n    branches: [ \"master\" ]\n    paths-ignore:\n      - "
  },
  {
    "path": ".github/workflows/behave_schedule.yml",
    "chars": 3753,
    "preview": "name: Scheduled - Test All Councils\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 0 * * *' # Nightly schedule for"
  },
  {
    "path": ".github/workflows/bump.yml",
    "chars": 2466,
    "preview": "name: Release - Bump Version\n\non:\n  push:\n    branches: [ \"master\" ]\n    paths-ignore:\n      - \"wiki/**\"\n      - \"**/*.m"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 2988,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".github/workflows/docker-image.yml",
    "chars": 898,
    "preview": "name: Build - Docker Image\n\non:\n  push:\n    # Trigger unless only the wiki directory changed\n    paths:\n      - \"uk_bin_"
  },
  {
    "path": ".github/workflows/ha_compatibility_test.yml",
    "chars": 8613,
    "preview": "name: PR - Home Assistant Compatibility Test\n\non:\n  push:\n    branches: [ master, main ]\n    paths:\n      - 'custom_comp"
  },
  {
    "path": ".github/workflows/hacs_validation.yml",
    "chars": 471,
    "preview": "name: PR - Validate HACS\n\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: \"0 0 * * *\"\n\njobs:\n  hassfest_validation:\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 836,
    "preview": "name: PR - Lint Commit Messages\n\non:\n  push:\n    # The branches below must be a subset of the branches above\n    branche"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 3273,
    "preview": "name: Release - Publish to PyPI\n\non:\n  push:\n    tags:\n      - '*'\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    perm"
  },
  {
    "path": ".github/workflows/rollback-release.yml",
    "chars": 4699,
    "preview": "name: Release - Rollback\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'Version to rollback "
  },
  {
    "path": ".github/workflows/validate-release-ready.yml",
    "chars": 935,
    "preview": "name: PR - Validate Release Ready\n\non:\n  workflow_dispatch:\n  pull_request:\n    branches: [ \"master\" ]\n    types: [opene"
  },
  {
    "path": ".github/workflows/wiki.yml",
    "chars": 1455,
    "preview": "name: Deploy - Wiki\n\non:\n  push:\n    # Trigger only when wiki directory changes\n    paths:\n      - \"wiki/**\"\n      - \"uk"
  },
  {
    "path": ".gitignore",
    "chars": 847,
    "preview": "# Ignore everything\r\n*\r\n\r\n# But not these files...\r\n!*.json\r\n!*.py\r\n!PipFile\r\n!Pipfile.lock\r\n!.gitignore\r\n!.dockerignore"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 141594,
    "preview": "=======\n## 0.165.0 (2026-03-28)\n\n### Feat\n\n- Lancaster City - support food waste collection (#1895)\n- support lancaster "
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5202,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "COMPATIBILITY.md",
    "chars": 3438,
    "preview": "# Home Assistant Compatibility\n\nThis document outlines the Home Assistant compatibility testing for the UK Bin Collectio"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 21942,
    "preview": "\n# Contents\n- [Contents](#contents)\n- [Contributor guidelines](#contributor-guidelines)\n  - [Getting Started](#getting-s"
  },
  {
    "path": "LICENSE",
    "chars": 1071,
    "preview": "MIT License\n\nCopyright (c) 2022 Robert Bradley\n\nPermission is hereby granted, free of charge, to any person obtaining a "
  },
  {
    "path": "Makefile",
    "chars": 2193,
    "preview": ".PHONY: install pre-build build black pycodestyle update-wiki\n\n## @CI_actions Installs the checked out version of the co"
  },
  {
    "path": "README.md",
    "chars": 25874,
    "preview": "[![Made with Python](https://img.shields.io/badge/Made%20With%20Python-red?style=for-the-badge&logo=python&logoColor=whi"
  },
  {
    "path": "behave.ini",
    "chars": 445,
    "preview": "[behave]\n#default_tags = not (@xfail or @not_implemented)\nshow_skipped = true\nformat   = rerun\n    progress3\noutfiles = "
  },
  {
    "path": "bin_to_ics.py",
    "chars": 9251,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nScript to convert UK Bin Collection Data to ICS calendar file.\nTakes JSON output from the bin"
  },
  {
    "path": "conftest.py",
    "chars": 2114,
    "preview": "# conftest.py\n\nimport pytest\nfrom _pytest.config.argparsing import Parser\nfrom _pytest.fixtures import FixtureRequest\nfr"
  },
  {
    "path": "custom_components/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "custom_components/uk_bin_collection/README.md",
    "chars": 9575,
    "preview": "# UK Bin Collection Integration Configuration\n\nThis integration allows you to configure the collection details for your "
  },
  {
    "path": "custom_components/uk_bin_collection/__init__.py",
    "chars": 16040,
    "preview": "\"\"\"The UK Bin Collection integration.\"\"\"\n\nimport asyncio\nimport logging\nfrom datetime import timedelta\nimport json\n\nfrom"
  },
  {
    "path": "custom_components/uk_bin_collection/calendar.py",
    "chars": 5546,
    "preview": "\"\"\"Calendar platform support for UK Bin Collection Data.\"\"\"\n\nimport logging\nimport uuid\nfrom datetime import datetime, t"
  },
  {
    "path": "custom_components/uk_bin_collection/config_flow.py",
    "chars": 26825,
    "preview": "import json\nimport logging\nimport shutil\nimport asyncio\nfrom typing import Any, Dict, Optional\n\nimport aiohttp\nimport ho"
  },
  {
    "path": "custom_components/uk_bin_collection/const.py",
    "chars": 921,
    "preview": "\"\"\"Constants for UK Bin Collection Data.\"\"\"\n\nfrom datetime import timedelta\n\nfrom homeassistant.const import Platform\n\nI"
  },
  {
    "path": "custom_components/uk_bin_collection/manifest.json",
    "chars": 508,
    "preview": "{\n    \"domain\": \"uk_bin_collection\",\n    \"name\": \"UK Bin Collection Data\",\n    \"after_dependencies\": [],\n    \"codeowners"
  },
  {
    "path": "custom_components/uk_bin_collection/sensor.py",
    "chars": 13399,
    "preview": "\"\"\"Support for UK Bin Collection Data sensors.\"\"\"\n\nfrom datetime import datetime, timedelta\nimport json\nimport logging\ni"
  },
  {
    "path": "custom_components/uk_bin_collection/services.yaml",
    "chars": 291,
    "preview": "manual_refresh:\n  name: \"Manual Refresh\"\n  description: \"Manually refresh bin data for a specific config entry.\"\n  field"
  },
  {
    "path": "custom_components/uk_bin_collection/strings.json",
    "chars": 3324,
    "preview": "{\n    \"title\": \"UK Bin Collection Data\",\n    \"config\": {\n        \"step\": {\n            \"user\": {\n                \"title\""
  },
  {
    "path": "custom_components/uk_bin_collection/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "custom_components/uk_bin_collection/tests/common_utils.py",
    "chars": 1908,
    "preview": "# custom_components/uk_bin_collection/tests/common_utils.py\n\nimport uuid\nfrom unittest.mock import Mock, AsyncMock  # Im"
  },
  {
    "path": "custom_components/uk_bin_collection/tests/test_calendar.py",
    "chars": 20164,
    "preview": "# test_calendar.py\n\n\"\"\"Unit tests for the UK Bin Collection Calendar platform.\"\"\"\n\nimport pytest\nfrom unittest.mock impo"
  },
  {
    "path": "custom_components/uk_bin_collection/tests/test_config_flow.py",
    "chars": 50250,
    "preview": "# test_config_flow.py\n\n\"\"\"Test UkBinCollection config flow.\"\"\"\n\nimport asyncio\nimport json\nfrom datetime import date, da"
  },
  {
    "path": "custom_components/uk_bin_collection/tests/test_init.py",
    "chars": 9845,
    "preview": "# test_init.py\nimport asyncio\nimport json\nfrom datetime import datetime, timedelta\nfrom unittest.mock import AsyncMock, "
  },
  {
    "path": "custom_components/uk_bin_collection/tests/test_sensor.py",
    "chars": 74899,
    "preview": "import asyncio\nimport json\nimport logging\nfrom datetime import date, datetime, timedelta\nfrom json import JSONDecodeErro"
  },
  {
    "path": "custom_components/uk_bin_collection/translations/cy.json",
    "chars": 3765,
    "preview": "{\n    \"title\": \"Data Casglu Biniau y DU\",\n    \"config\": {\n        \"step\": {\n            \"user\": {\n                \"title"
  },
  {
    "path": "custom_components/uk_bin_collection/translations/en.json",
    "chars": 3324,
    "preview": "{\n    \"title\": \"UK Bin Collection Data\",\n    \"config\": {\n        \"step\": {\n            \"user\": {\n                \"title\""
  },
  {
    "path": "custom_components/uk_bin_collection/translations/ga.json",
    "chars": 3874,
    "preview": "{\n    \"title\": \"Sonraí Bailithe Binn RA\",\n    \"config\": {\n        \"step\": {\n            \"user\": {\n                \"title"
  },
  {
    "path": "custom_components/uk_bin_collection/translations/gd.json",
    "chars": 4298,
    "preview": "{\n    \"title\": \"Dàta Cruinneachadh Biona RA\",\n    \"config\": {\n        \"step\": {\n            \"user\": {\n                \"t"
  },
  {
    "path": "custom_components/uk_bin_collection/translations/pt.json",
    "chars": 3983,
    "preview": "{\n    \"title\": \"Dados de Coleta de Lixo do Reino Unido\",\n    \"config\": {\n        \"step\": {\n            \"user\": {\n       "
  },
  {
    "path": "docs/RELEASE-SETUP-SUMMARY.md",
    "chars": 4239,
    "preview": "# Release Workflow Setup Summary\n\n## What You Need to Do\n\nYour release workflow has been updated to use a GitHub App for"
  },
  {
    "path": "docs/deploy-key-setup.md",
    "chars": 3295,
    "preview": "# Deploy Key Setup Guide\n\nSince the GitHub App bypass feature isn't available on your plan, we'll use a deploy key inste"
  },
  {
    "path": "docs/example_council.md",
    "chars": 1848,
    "preview": "# Example Council Implementation\n\nThis document shows how to implement a council class using the new utilities.\n\n## Basi"
  },
  {
    "path": "docs/github-app-setup.md",
    "chars": 5818,
    "preview": "# GitHub App Setup Guide\n\nThis guide walks you through creating and configuring a GitHub App to allow the release workfl"
  },
  {
    "path": "docs/github-app-troubleshooting.md",
    "chars": 3644,
    "preview": "# GitHub App Troubleshooting - Branch Protection\n\n## Problem: \"Protected branch update failed\"\n\nIf you're getting this e"
  },
  {
    "path": "docs/manual-tag-fix.md",
    "chars": 923,
    "preview": "# Manual Tag Fix for Version 0.155.0\n\nSince the tag wasn't pushed, you need to manually create and push it to trigger th"
  },
  {
    "path": "docs/release-quick-reference.md",
    "chars": 2831,
    "preview": "# Release Workflow Quick Reference\n\n## Commit Message Cheat Sheet\n\n| Type | Version Bump | Example |\n|------|-----------"
  },
  {
    "path": "docs/release-workflow-branch-protection.md",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/release-workflow-diagram.md",
    "chars": 7930,
    "preview": "# Release Workflow Diagram\n\n```\n┌─────────────────────────────────────────────────────────────────────────────┐\n│       "
  },
  {
    "path": "docs/release-workflow-fixes.md",
    "chars": 5535,
    "preview": "# Release Workflow Fixes Applied\n\n## Summary\nFixed the release workflow to ensure proper version bumping and release pub"
  },
  {
    "path": "docs/release-workflow-migration.md",
    "chars": 5133,
    "preview": "# Release Workflow Migration Guide\n\n## Overview\n\nThe release workflow has been simplified to use Commitizen and GITHUB_T"
  },
  {
    "path": "docs/release-workflow-setup-checklist.md",
    "chars": 7004,
    "preview": "# Release Workflow Setup Checklist\n\nUse this checklist to verify your simplified release workflow is properly configured"
  },
  {
    "path": "docs/release-workflow.md",
    "chars": 6780,
    "preview": "# Release Workflow Documentation\n\n## Overview\nThis document describes the complete release workflow from pull request to"
  },
  {
    "path": "docs/rollback-release.md",
    "chars": 5497,
    "preview": "# Rollback Release Guide\n\nThis guide explains how to rollback a release if something goes wrong.\n\n## When to Rollback\n\nR"
  },
  {
    "path": "docs/utilities.md",
    "chars": 5360,
    "preview": "# UK Bin Collection Data Utilities\n\nThis document provides an overview of the utility modules available in the UK Bin Co"
  },
  {
    "path": "docs/workflow-improvements-summary.md",
    "chars": 7134,
    "preview": "# Workflow Improvements Summary\n\n## Changes Made\n\nAll workflow improvements have been implemented to make your release p"
  },
  {
    "path": "docs/workflow-naming-conventions.md",
    "chars": 5865,
    "preview": "# Workflow Naming Conventions\n\nAll GitHub Actions workflows now follow a consistent naming pattern for better organizati"
  },
  {
    "path": "hacs.json",
    "chars": 84,
    "preview": "{\n  \"name\": \"UK Bin Collection Data\",\n  \"render_readme\": true,\n  \"country\": [\"GB\"]\n}"
  },
  {
    "path": "poetry.lock",
    "chars": 389373,
    "preview": "# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.\n\n[[package]]\nname = \"aiohttp\""
  },
  {
    "path": "pyproject.toml",
    "chars": 2075,
    "preview": "[tool.poetry]\nname = \"uk_bin_collection\"\nversion = \"0.165.0\"\ndescription = \"Python Lib to collect UK Bin Data\"\nreadme = "
  },
  {
    "path": "pytest.ini",
    "chars": 392,
    "preview": "[pytest]\npythonpath = ./uk_bin_collection\nasyncio_mode=auto\n# Unsetting this will cause testing to fail with a key error"
  },
  {
    "path": "scripts/check_ha_compatibility.py",
    "chars": 3516,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nHome Assistant Compatibility Checker for UK Bin Collection Component\n\nThis script checks if t"
  },
  {
    "path": "uk_bin_collection/Local_Authority_Boundaries.geojson",
    "chars": 1175921,
    "preview": "{\"type\":\"FeatureCollection\",\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}},\"features\":[{\"type\":\"Feature\",\"id\":1"
  },
  {
    "path": "uk_bin_collection/README.rst",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "uk_bin_collection/compare_lad_codes.py",
    "chars": 2223,
    "preview": "import json\nimport geopandas as gpd\n\n\ndef extract_lad_codes(input_json_path):\n    with open(input_json_path, \"r\") as f:\n"
  },
  {
    "path": "uk_bin_collection/map.html",
    "chars": 4114,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width,"
  },
  {
    "path": "uk_bin_collection/tests/check_selenium_url_in_input.json.py",
    "chars": 7867,
    "preview": "import json\nimport requests\nimport sys\nimport base64\nfrom tabulate import tabulate\n\n\ndef get_council_files(repo, branch)"
  },
  {
    "path": "uk_bin_collection/tests/council_feature_input_parity.py",
    "chars": 3835,
    "preview": "import json\nimport requests\nimport sys\nfrom tabulate import tabulate\nimport base64\n\n\ndef get_councils_from_files(repo, b"
  },
  {
    "path": "uk_bin_collection/tests/features/environment.py",
    "chars": 127,
    "preview": "from behave import use_step_matcher\n\nuse_step_matcher(\"cfparse\")\n\n\ndef before_all(context):\n    context.config.setup_log"
  },
  {
    "path": "uk_bin_collection/tests/features/validate_council_outputs.feature",
    "chars": 251,
    "preview": "Feature: Test each council output matches expected results\n\n  Scenario: Validate Council Output\n    Given the council\n  "
  },
  {
    "path": "uk_bin_collection/tests/generate_map_test_results.py",
    "chars": 1144,
    "preview": "import sys\nimport json\nimport xml.etree.ElementTree as ET\nfrom collections import defaultdict\nimport re\n\n\ndef extract_co"
  },
  {
    "path": "uk_bin_collection/tests/input.json",
    "chars": 134995,
    "preview": "{\n    \"AberdeenCityCouncil\": {\n        \"LAD24CD\": \"S12000033\",\n        \"uprn\": \"9051156186\",\n        \"url\": \"https://www"
  },
  {
    "path": "uk_bin_collection/tests/output.schema",
    "chars": 1086,
    "preview": "{\n    \"$schema\": \"http://json-schema.org/draft-06/schema#\",\n    \"$ref\": \"#/definitions/BinData\",\n    \"definitions\": {\n  "
  },
  {
    "path": "uk_bin_collection/tests/step_defs/step_helpers/file_handler.py",
    "chars": 1474,
    "preview": "import json\nimport logging\nfrom jsonschema import validate, ValidationError\nfrom pathlib import Path\nfrom typing import "
  },
  {
    "path": "uk_bin_collection/tests/step_defs/test_validate_council.py",
    "chars": 3475,
    "preview": "import json\nimport logging\nimport traceback\nfrom functools import wraps\nfrom typing import Any, Callable, Generator\n\nimp"
  },
  {
    "path": "uk_bin_collection/tests/test_collect_data.py",
    "chars": 2252,
    "preview": "from unittest.mock import MagicMock, patch\nimport argparse\nimport pytest\nfrom uk_bin_collection.collect_data import UKBi"
  },
  {
    "path": "uk_bin_collection/tests/test_common_functions.py",
    "chars": 14800,
    "preview": "from contextlib import redirect_stdout\nfrom io import StringIO\nfrom unittest import mock\nfrom unittest.mock import Magic"
  },
  {
    "path": "uk_bin_collection/tests/test_conftest.py",
    "chars": 1100,
    "preview": "import pytest\n\n# Test the command-line options\n\n\ndef test_headless_mode(pytestconfig):\n    # Simulate pytest command-lin"
  },
  {
    "path": "uk_bin_collection/tests/test_get_data.py",
    "chars": 7239,
    "preview": "import os\nfrom unittest import mock\nimport tempfile\n\nimport pytest\nfrom requests import exceptions as req_exp\nfrom reque"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/collect_data.py",
    "chars": 4654,
    "preview": "import argparse\nimport importlib\nimport os\nimport sys\nimport logging\nfrom uk_bin_collection.uk_bin_collection.get_bin_da"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/common.py",
    "chars": 11182,
    "preview": "import calendar\nimport json\nimport os\nimport re\nfrom datetime import datetime, timedelta\nfrom enum import Enum\n\nimport h"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py",
    "chars": 4193,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py",
    "chars": 1655,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py",
    "chars": 4555,
    "preview": "from datetime import datetime\n\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import (\n "
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/AmberValleyBoroughCouncil.py",
    "chars": 1918,
    "preview": "from datetime import datetime\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/AngusCouncil.py",
    "chars": 6678,
    "preview": "import re\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom "
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py",
    "chars": 1653,
    "preview": "from bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_co"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py",
    "chars": 3824,
    "preview": "from datetime import datetime\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.c"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py",
    "chars": 6042,
    "preview": "from datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.w"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py",
    "chars": 4413,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py",
    "chars": 4012,
    "preview": "import time\n\nfrom bs4 import BeautifulSoup\nfrom selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfr"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py",
    "chars": 4247,
    "preview": "import time\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium import webdriver\nfrom selenium.we"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py",
    "chars": 5227,
    "preview": "from datetime import datetime\n\nimport requests\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py",
    "chars": 1951,
    "preview": "import time\n\nimport requests\nfrom dateutil.relativedelta import relativedelta\n\nfrom uk_bin_collection.uk_bin_collection."
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py",
    "chars": 5616,
    "preview": "import datetime\nimport time\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common."
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BarkingDagenham.py",
    "chars": 5510,
    "preview": "# This script pulls bin collection data from Barking and Dagenham Council\n# Example URL: https://www.lbbd.gov.uk/rubbish"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py",
    "chars": 11508,
    "preview": "import time\nimport re\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by imp"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py",
    "chars": 4759,
    "preview": "from typing import Dict, List, Any\nfrom bs4 import BeautifulSoup\nfrom dateutil.relativedelta import relativedelta\nimport"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py",
    "chars": 4401,
    "preview": "import requests\nimport json\nfrom datetime import datetime\nfrom bs4 import BeautifulSoup\nfrom selenium import webdriver\nf"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py",
    "chars": 2678,
    "preview": "from datetime import datetime\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.c"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py",
    "chars": 3107,
    "preview": "import json\nimport ssl\n\nimport requests\nimport urllib3\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py",
    "chars": 1669,
    "preview": "import json\nimport requests\nfrom bs4 import BeautifulSoup\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom "
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py",
    "chars": 2720,
    "preview": "from datetime import datetime\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.c"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py",
    "chars": 4327,
    "preview": "import logging\nfrom datetime import datetime\n\nimport requests\nimport urllib\n\nfrom bs4 import BeautifulSoup\nfrom uk_bin_c"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py",
    "chars": 5306,
    "preview": "import time\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfro"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py",
    "chars": 5040,
    "preview": "from typing import Dict, List, Any, Optional\nfrom bs4 import BeautifulSoup\nfrom dateutil.relativedelta import relativede"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py",
    "chars": 2062,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\nimport urllib3\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nf"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py",
    "chars": 4477,
    "preview": "import json\nimport logging\nimport ssl\nfrom collections import OrderedDict\nfrom datetime import datetime\n\nimport requests"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BlackpoolCouncil.py",
    "chars": 3821,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BlaenauGwentCountyBoroughCouncil.py",
    "chars": 6190,
    "preview": "from bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support import expecte"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BolsoverCouncil.py",
    "chars": 10354,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py",
    "chars": 4444,
    "preview": "import re\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom dateutil.relativedelta import relativedelta\n"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BostonBoroughCouncil.py",
    "chars": 8539,
    "preview": "import time\n\nfrom bs4 import BeautifulSoup\nfrom selenium.common.exceptions import (\n    ElementClickInterceptedException"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py",
    "chars": 9015,
    "preview": "import time\n\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collect"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py",
    "chars": 6114,
    "preview": "import re\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom "
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py",
    "chars": 2441,
    "preview": "import time\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfro"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py",
    "chars": 1744,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py",
    "chars": 5222,
    "preview": "from time import sleep\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common i"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py",
    "chars": 6340,
    "preview": "# This script pulls (in one hit) the data from Bromley Council Bins Data\nimport datetime\nimport re\nimport time\nfrom date"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py",
    "chars": 5575,
    "preview": "import ast\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py",
    "chars": 8236,
    "preview": "# This script pulls (in one hit) the data from Broadland District Council Bins Data\n# Working command line:\n# python col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py",
    "chars": 4658,
    "preview": "# This script pulls (in one hit) the data from Bromley Council Bins Data\nimport datetime\nfrom datetime import datetime\n\n"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py",
    "chars": 1781,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py",
    "chars": 5172,
    "preview": "from datetime import datetime\nimport time\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfro"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py",
    "chars": 4672,
    "preview": "from bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support import expecte"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py",
    "chars": 4218,
    "preview": "import json\nfrom dataclasses import asdict, dataclass\nfrom typing import Literal\n\nimport requests\nfrom cryptography.hazm"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py",
    "chars": 3263,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py",
    "chars": 2632,
    "preview": "from bs4 import BeautifulSoup\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py",
    "chars": 4971,
    "preview": "# This script pulls (in one hit) the data from Bromley Council Bins Data\nimport datetime\nimport time\nfrom datetime impor"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CambridgeCityCouncil.py",
    "chars": 2048,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py",
    "chars": 2276,
    "preview": "from bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_co"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py",
    "chars": 1932,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py",
    "chars": 7188,
    "preview": "# So this script is a little different to the others...\n# Essentially, it uses Cardiff Council's waste collection API to"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py",
    "chars": 1864,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py",
    "chars": 4441,
    "preview": "from bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_co"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CeredigionCountyCouncil.py",
    "chars": 5924,
    "preview": "from time import sleep\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdrive"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py",
    "chars": 2569,
    "preview": "from datetime import timedelta\n\nfrom bs4 import BeautifulSoup\nfrom dateutil.relativedelta import relativedelta\n\nfrom uk_"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py",
    "chars": 5831,
    "preview": "import re\nimport time\nfrom datetime import datetime, timedelta\n\nimport requests\nfrom bs4 import BeautifulSoup\nfrom icale"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py",
    "chars": 17173,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\nfrom dateutil.parser import parse\n\nfrom uk_bin_collection.uk_bin_collectio"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CherwellDistrictCouncil.py",
    "chars": 3480,
    "preview": "from datetime import datetime, timedelta\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_c"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py",
    "chars": 2495,
    "preview": "from typing import Any, Dict, Optional\n\nfrom bs4 import BeautifulSoup, NavigableString, Tag\n\nfrom uk_bin_collection.uk_b"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py",
    "chars": 3544,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py",
    "chars": 7198,
    "preview": "import json\nimport logging\nimport re\nfrom datetime import datetime, timedelta\n\nimport requests\nfrom bs4 import Beautiful"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py",
    "chars": 6311,
    "preview": "import time\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfro"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py",
    "chars": 6122,
    "preview": "from bs4 import BeautifulSoup\nimport requests\nimport re\nfrom datetime import datetime\nfrom typing import Any, Dict, List"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py",
    "chars": 3968,
    "preview": "from bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support import expecte"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py",
    "chars": 1291,
    "preview": "from datetime import datetime\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.c"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py",
    "chars": 2907,
    "preview": "from bs4 import BeautifulSoup\nfrom dateutil.relativedelta import relativedelta\n\nfrom uk_bin_collection.uk_bin_collection"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CotswoldDistrictCouncil.py",
    "chars": 11812,
    "preview": "import time\nimport re\nfrom datetime import datetime, timedelta\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.co"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CoventryCityCouncil.py",
    "chars": 2287,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\nfrom dateutil.relativedelta import relativedelta\n\nfrom uk_bin_collection.u"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py",
    "chars": 4322,
    "preview": "import time\n\nimport requests\nfrom dateutil.relativedelta import relativedelta\n\nfrom uk_bin_collection.uk_bin_collection."
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py",
    "chars": 5369,
    "preview": "import time\n\nfrom bs4 import BeautifulSoup\nfrom selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfr"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/CumberlandCouncil.py",
    "chars": 1923,
    "preview": "from datetime import date\n\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.commo"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py",
    "chars": 4817,
    "preview": "from bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support import expecte"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DarlingtonBoroughCouncil.py",
    "chars": 2443,
    "preview": "import re\n\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collectio"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py",
    "chars": 2056,
    "preview": "from bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_co"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DenbighshireCouncil.py",
    "chars": 2103,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DerbyCityCouncil.py",
    "chars": 2808,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py",
    "chars": 4111,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py",
    "chars": 3118,
    "preview": "import json\nimport math\nfrom datetime import timedelta\n\nimport requests\nfrom uk_bin_collection.uk_bin_collection.common "
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py",
    "chars": 1523,
    "preview": "from bs4 import BeautifulSoup, element\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection."
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py",
    "chars": 2404,
    "preview": "import re\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common "
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DudleyCouncil.py",
    "chars": 3134,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DumfriesandGallowayCouncil.py",
    "chars": 2613,
    "preview": "import re\nimport time\nfrom datetime import datetime, timedelta\n\nimport requests\nfrom bs4 import BeautifulSoup\nfrom icale"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DundeeCityCouncil.py",
    "chars": 1285,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py",
    "chars": 1695,
    "preview": "import re\nfrom datetime import datetime\n\nimport requests\nfrom bs4 import BeautifulSoup\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py",
    "chars": 1318,
    "preview": "import json\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_collection.get_bin_da"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastAyrshireCouncil.py",
    "chars": 1614,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py",
    "chars": 1501,
    "preview": "from bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_co"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py",
    "chars": 3825,
    "preview": "import re\nfrom datetime import datetime\n\nimport pandas as pd\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bi"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastDunbartonshireCouncil.py",
    "chars": 1637,
    "preview": "import requests\nfrom bs4 import BeautifulSoup, Tag\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastHertsCouncil.py",
    "chars": 4022,
    "preview": "import time\n\nimport requests\nfrom dateutil.relativedelta import relativedelta\n\nfrom uk_bin_collection.uk_bin_collection."
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py",
    "chars": 4326,
    "preview": "from bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support import expecte"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastLothianCouncil.py",
    "chars": 2882,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py",
    "chars": 4910,
    "preview": "from bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support import expecte"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py",
    "chars": 5216,
    "preview": "import urllib.request\nfrom datetime import datetime\n\nimport pandas as pd\nfrom bs4 import BeautifulSoup\nfrom selenium.web"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastStaffordshireBoroughCouncil.py",
    "chars": 3692,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.suppor"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py",
    "chars": 4353,
    "preview": "from time import sleep\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdrive"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastbourneBoroughCouncil.py",
    "chars": 2669,
    "preview": "# Lewes Borough Council uses the same script.\n\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.c"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py",
    "chars": 3542,
    "preview": "from bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support import expecte"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EdenDistrictCouncil.py",
    "chars": 4004,
    "preview": "import requests\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_coll"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EdinburghCityCouncil.py",
    "chars": 4003,
    "preview": "import re\nimport time\n\nimport requests\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom se"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py",
    "chars": 3005,
    "preview": "import time\n\nimport requests\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collection.uk_bin_col"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py",
    "chars": 9498,
    "preview": "import time\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support i"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py",
    "chars": 2185,
    "preview": "# Legacy script. Copied to Lewes and Eastbourne.\n\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collectio"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py",
    "chars": 3336,
    "preview": "from datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium import webdriver\nfrom selenium.webdriver.comm"
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/EpsomandEwellBoroughCouncil.py",
    "chars": 6403,
    "preview": "import re\nfrom datetime import datetime\n\nfrom bs4 import BeautifulSoup\nfrom selenium.webdriver.common.by import By\nfrom "
  },
  {
    "path": "uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py",
    "chars": 2010,
    "preview": "import json\n\nfrom bs4 import BeautifulSoup\n\nfrom uk_bin_collection.uk_bin_collection.common import *\nfrom uk_bin_collect"
  }
]

// ... and 242 more files (download for full content)

About this extraction

This page contains the full source code of the robbrad/UKBinCollectionData GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 442 files (3.7 MB), approximately 1.0M tokens, and a symbol index with 1241 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!