uk_bin_collection 0.121.1__py3-none-any.whl → 0.122.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- uk_bin_collection/tests/input.json +13 -1
- uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py +8 -5
- uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +10 -2
- uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py +3 -3
- uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +17 -0
- uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +10 -5
- uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py +71 -0
- uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py +70 -0
- uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +29 -10
- {uk_bin_collection-0.121.1.dist-info → uk_bin_collection-0.122.0.dist-info}/METADATA +1 -1
- {uk_bin_collection-0.121.1.dist-info → uk_bin_collection-0.122.0.dist-info}/RECORD +14 -12
- {uk_bin_collection-0.121.1.dist-info → uk_bin_collection-0.122.0.dist-info}/LICENSE +0 -0
- {uk_bin_collection-0.121.1.dist-info → uk_bin_collection-0.122.0.dist-info}/WHEEL +0 -0
- {uk_bin_collection-0.121.1.dist-info → uk_bin_collection-0.122.0.dist-info}/entry_points.txt +0 -0
| @@ -871,6 +871,12 @@ | |
| 871 871 | 
             
                    "wiki_name": "High Peak Council",
         | 
| 872 872 | 
             
                    "wiki_note": "Pass the name of the street with the house number parameter, wrapped in double quotes. This parser requires a Selenium webdriver."
         | 
| 873 873 | 
             
                },
         | 
| 874 | 
            +
                "HinckleyandBosworthBoroughCouncil": {
         | 
| 875 | 
            +
                    "url": "https://www.hinckley-bosworth.gov.uk",
         | 
| 876 | 
            +
                    "uprn": "100030533512",
         | 
| 877 | 
            +
                    "wiki_name": "Hinckley and Bosworth Borough Council",
         | 
| 878 | 
            +
                    "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
         | 
| 879 | 
            +
                },
         | 
| 874 880 | 
             
                "HounslowCouncil": {
         | 
| 875 881 | 
             
                    "house_number": "17A LAMPTON PARK ROAD, HOUNSLOW",
         | 
| 876 882 | 
             
                    "postcode": "TW3 4HS",
         | 
| @@ -1072,7 +1078,7 @@ | |
| 1072 1078 | 
             
                    "wiki_note": "Pass the UPRN. You can find it using [FindMyAddress](https://www.findmyaddress.co.uk/search)."
         | 
| 1073 1079 | 
             
                },
         | 
| 1074 1080 | 
             
                "MertonCouncil": {
         | 
| 1075 | 
            -
                    "url": "https://myneighbourhood.merton.gov.uk/wasteservices/WasteServices.aspx?ID= | 
| 1081 | 
            +
                    "url": "https://myneighbourhood.merton.gov.uk/wasteservices/WasteServices.aspx?ID=25936129",
         | 
| 1076 1082 | 
             
                    "wiki_command_url_override": "https://myneighbourhood.merton.gov.uk/Wasteservices/WasteServices.aspx?ID=XXXXXXXX",
         | 
| 1077 1083 | 
             
                    "wiki_name": "Merton Council",
         | 
| 1078 1084 | 
             
                    "wiki_note": "Follow the instructions [here](https://myneighbourhood.merton.gov.uk/Wasteservices/WasteServicesSearch.aspx) until you get the \"Your recycling and rubbish collection days\" page, then copy the URL and replace the URL in the command."
         | 
| @@ -1132,6 +1138,12 @@ | |
| 1132 1138 | 
             
                    "wiki_name": "Mole Valley District Council",
         | 
| 1133 1139 | 
             
                    "wiki_note": "UPRN can only be parsed with a valid postcode."
         | 
| 1134 1140 | 
             
                },
         | 
| 1141 | 
            +
                "MonmouthshireCountyCouncil": {
         | 
| 1142 | 
            +
                    "url": "https://maps.monmouthshire.gov.uk",
         | 
| 1143 | 
            +
                    "uprn": "100100266220",
         | 
| 1144 | 
            +
                    "wiki_name": "Monmouthshire County Council",
         | 
| 1145 | 
            +
                    "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
         | 
| 1146 | 
            +
                },
         | 
| 1135 1147 | 
             
                "MorayCouncil": {
         | 
| 1136 1148 | 
             
                    "uprn": "28841",
         | 
| 1137 1149 | 
             
                    "url": "https://bindayfinder.moray.gov.uk/",
         | 
| @@ -31,11 +31,14 @@ class CouncilClass(AbstractGetBinDataClass): | |
| 31 31 | 
             
                    for container in soup.find_all(class_="box-item"):
         | 
| 32 32 |  | 
| 33 33 | 
             
                        # Get the next collection dates from the <p> tag containing <strong>
         | 
| 34 | 
            -
                         | 
| 35 | 
            -
                             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 34 | 
            +
                        try:
         | 
| 35 | 
            +
                            dates_tag = (
         | 
| 36 | 
            +
                                container.find("p", string=lambda text: "Next" in text)
         | 
| 37 | 
            +
                                .find_next("p")
         | 
| 38 | 
            +
                                .find("strong")
         | 
| 39 | 
            +
                            )
         | 
| 40 | 
            +
                        except:
         | 
| 41 | 
            +
                            continue
         | 
| 39 42 | 
             
                        collection_dates = (
         | 
| 40 43 | 
             
                            dates_tag.text.strip().split(", and then ")
         | 
| 41 44 | 
             
                            if dates_tag
         | 
| @@ -67,11 +67,19 @@ class CouncilClass(AbstractGetBinDataClass): | |
| 67 67 | 
             
                            for collection in bin_collections:
         | 
| 68 68 | 
             
                                if collection is not None:
         | 
| 69 69 | 
             
                                    bin_type = collection[0].get("BinType")
         | 
| 70 | 
            +
                                    current_collection_date = collection[0].get("CollectionDate")
         | 
| 71 | 
            +
                                    if current_collection_date is None:
         | 
| 72 | 
            +
                                        continue
         | 
| 70 73 | 
             
                                    current_collection_date = datetime.strptime(
         | 
| 71 | 
            -
                                         | 
| 74 | 
            +
                                        current_collection_date, "%Y-%m-%d"
         | 
| 72 75 | 
             
                                    )
         | 
| 76 | 
            +
                                    next_collection_date = collection[0].get(
         | 
| 77 | 
            +
                                        "NextScheduledCollectionDate"
         | 
| 78 | 
            +
                                    )
         | 
| 79 | 
            +
                                    if next_collection_date is None:
         | 
| 80 | 
            +
                                        continue
         | 
| 73 81 | 
             
                                    next_collection_date = datetime.strptime(
         | 
| 74 | 
            -
                                         | 
| 82 | 
            +
                                        next_collection_date, "%Y-%m-%d"
         | 
| 75 83 | 
             
                                    )
         | 
| 76 84 |  | 
| 77 85 | 
             
                                    # Work out the most recent collection date to display
         | 
| @@ -34,10 +34,10 @@ class CouncilClass(AbstractGetBinDataClass): | |
| 34 34 |  | 
| 35 35 | 
             
                        # Find the next collection date
         | 
| 36 36 | 
             
                        date_tag = container.find(class_="font11 text-center")
         | 
| 37 | 
            -
                        if date_tag:
         | 
| 38 | 
            -
                            collection_date = date_tag.text.strip()
         | 
| 39 | 
            -
                        else:
         | 
| 37 | 
            +
                        if date_tag.text.strip() == "":
         | 
| 40 38 | 
             
                            continue
         | 
| 39 | 
            +
                        else:
         | 
| 40 | 
            +
                            collection_date = date_tag.text.strip()
         | 
| 41 41 |  | 
| 42 42 | 
             
                        dict_data = {
         | 
| 43 43 | 
             
                            "type": bin_type,
         | 
| @@ -27,6 +27,23 @@ class CouncilClass(AbstractGetBinDataClass): | |
| 27 27 | 
             
                        "../Images/Bins/ashBin.gif": "Ash bin",
         | 
| 28 28 | 
             
                    }
         | 
| 29 29 |  | 
| 30 | 
            +
                    fieldset = soup.find("fieldset")
         | 
| 31 | 
            +
                    ps = fieldset.find_all("p")
         | 
| 32 | 
            +
                    for p in ps:
         | 
| 33 | 
            +
                        collection = p.text.strip().replace("Your next ", "").split(".")[0]
         | 
| 34 | 
            +
                        bin_type = collection.split(" day is")[0]
         | 
| 35 | 
            +
                        collection_date = datetime.strptime(
         | 
| 36 | 
            +
                            remove_ordinal_indicator_from_date_string(collection).split("day is ")[
         | 
| 37 | 
            +
                                1
         | 
| 38 | 
            +
                            ],
         | 
| 39 | 
            +
                            "%A %d %B %Y",
         | 
| 40 | 
            +
                        )
         | 
| 41 | 
            +
                        dict_data = {
         | 
| 42 | 
            +
                            "type": bin_type,
         | 
| 43 | 
            +
                            "collectionDate": collection_date.strftime(date_format),
         | 
| 44 | 
            +
                        }
         | 
| 45 | 
            +
                        data["bins"].append(dict_data)
         | 
| 46 | 
            +
             | 
| 30 47 | 
             
                    # Find the page body with all the calendars
         | 
| 31 48 | 
             
                    body = soup.find("div", {"id": "Application_ctl00"})
         | 
| 32 49 | 
             
                    calendars = body.find_all_next("table", {"title": "Calendar"})
         | 
| @@ -83,11 +83,16 @@ class CouncilClass(AbstractGetBinDataClass): | |
| 83 83 | 
             
                        )
         | 
| 84 84 |  | 
| 85 85 | 
             
                        # Select address from dropdown and wait
         | 
| 86 | 
            -
                         | 
| 87 | 
            -
                             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 86 | 
            +
                        WebDriverWait(driver, 10).until(
         | 
| 87 | 
            +
                            EC.element_to_be_clickable(
         | 
| 88 | 
            +
                                (
         | 
| 89 | 
            +
                                    By.XPATH,
         | 
| 90 | 
            +
                                    "//select[@id='FINDBINDAYSHIGHPEAK_ADDRESSSELECT_ADDRESS']//option[contains(., '"
         | 
| 91 | 
            +
                                    + user_paon
         | 
| 92 | 
            +
                                    + "')]",
         | 
| 93 | 
            +
                                )
         | 
| 94 | 
            +
                            )
         | 
| 95 | 
            +
                        ).click()
         | 
| 91 96 |  | 
| 92 97 | 
             
                        WebDriverWait(driver, 10).until(
         | 
| 93 98 | 
             
                            EC.presence_of_element_located(
         | 
| @@ -0,0 +1,71 @@ | |
| 1 | 
            +
            import requests
         | 
| 2 | 
            +
            from bs4 import BeautifulSoup
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            from uk_bin_collection.uk_bin_collection.common import *
         | 
| 5 | 
            +
            from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            # import the wonderful Beautiful Soup and the URL grabber
         | 
| 9 | 
            +
            class CouncilClass(AbstractGetBinDataClass):
         | 
| 10 | 
            +
                """
         | 
| 11 | 
            +
                Concrete classes have to implement all abstract operations of the
         | 
| 12 | 
            +
                base class. They can also override some operations with a default
         | 
| 13 | 
            +
                implementation.
         | 
| 14 | 
            +
                """
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def parse_data(self, page: str, **kwargs) -> dict:
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    user_uprn = kwargs.get("uprn")
         | 
| 19 | 
            +
                    check_uprn(user_uprn)
         | 
| 20 | 
            +
                    bindata = {"bins": []}
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    URI = f"https://www.hinckley-bosworth.gov.uk/set-location?id={user_uprn}&redirect=refuse&rememberloc="
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    # Make the GET request
         | 
| 25 | 
            +
                    response = requests.get(URI)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    # Parse the HTML
         | 
| 28 | 
            +
                    soup = BeautifulSoup(response.content, "html.parser")
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    # Find all the bin collection date containers
         | 
| 31 | 
            +
                    bin_schedule = []
         | 
| 32 | 
            +
                    collection_divs = soup.find_all(
         | 
| 33 | 
            +
                        "div", class_=["first_date_bins", "last_date_bins"]
         | 
| 34 | 
            +
                    )
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    for div in collection_divs:
         | 
| 37 | 
            +
                        # Extract the date
         | 
| 38 | 
            +
                        date = div.find("h3", class_="collectiondate").text.strip().replace(":", "")
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                        # Extract bin types
         | 
| 41 | 
            +
                        bins = [img["alt"] for img in div.find_all("img", class_="collection")]
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                        # Append to the schedule
         | 
| 44 | 
            +
                        bin_schedule.append({"date": date, "bins": bins})
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    current_year = datetime.now().year
         | 
| 47 | 
            +
                    current_month = datetime.now().month
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    # Print the schedule
         | 
| 50 | 
            +
                    for entry in bin_schedule:
         | 
| 51 | 
            +
                        bin_types = entry["bins"]
         | 
| 52 | 
            +
                        date = datetime.strptime(entry["date"], "%d %B")
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                        if (current_month > 9) and (date.month < 4):
         | 
| 55 | 
            +
                            date = date.replace(year=(current_year + 1))
         | 
| 56 | 
            +
                        else:
         | 
| 57 | 
            +
                            date = date.replace(year=current_year)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                        for bin_type in bin_types:
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                            dict_data = {
         | 
| 62 | 
            +
                                "type": bin_type,
         | 
| 63 | 
            +
                                "collectionDate": date.strftime("%d/%m/%Y"),
         | 
| 64 | 
            +
                            }
         | 
| 65 | 
            +
                            bindata["bins"].append(dict_data)
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                    bindata["bins"].sort(
         | 
| 68 | 
            +
                        key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
         | 
| 69 | 
            +
                    )
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    return bindata
         | 
| @@ -0,0 +1,70 @@ | |
| 1 | 
            +
            import requests
         | 
| 2 | 
            +
            from bs4 import BeautifulSoup
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            from uk_bin_collection.uk_bin_collection.common import *
         | 
| 5 | 
            +
            from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            # import the wonderful Beautiful Soup and the URL grabber
         | 
| 9 | 
            +
            class CouncilClass(AbstractGetBinDataClass):
         | 
| 10 | 
            +
                """
         | 
| 11 | 
            +
                Concrete classes have to implement all abstract operations of the
         | 
| 12 | 
            +
                base class. They can also override some operations with a default
         | 
| 13 | 
            +
                implementation.
         | 
| 14 | 
            +
                """
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def parse_data(self, page: str, **kwargs) -> dict:
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    user_uprn = kwargs.get("uprn")
         | 
| 19 | 
            +
                    check_uprn(user_uprn)
         | 
| 20 | 
            +
                    bindata = {"bins": []}
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    URI = (
         | 
| 23 | 
            +
                        f"https://maps.monmouthshire.gov.uk/?action=SetAddress&UniqueId={user_uprn}"
         | 
| 24 | 
            +
                    )
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    # Make the GET request
         | 
| 27 | 
            +
                    response = requests.get(URI)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    # Parse the HTML
         | 
| 30 | 
            +
                    soup = BeautifulSoup(response.content, "html.parser")
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    waste_collections_div = soup.find("div", {"aria-label": "Waste Collections"})
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    # Find all bin collection panels
         | 
| 35 | 
            +
                    bin_panels = waste_collections_div.find_all("div", class_="atPanelContent")
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    current_year = datetime.now().year
         | 
| 38 | 
            +
                    current_month = datetime.now().month
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                    for panel in bin_panels:
         | 
| 41 | 
            +
                        # Extract bin name (e.g., "Household rubbish bag")
         | 
| 42 | 
            +
                        bin_name = panel.find("h4").text.strip().replace("\r", "").replace("\n", "")
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                        # Extract collection date (e.g., "Monday 9th December")
         | 
| 45 | 
            +
                        date_tag = panel.find("p")
         | 
| 46 | 
            +
                        if date_tag and "Your next collection date is" in date_tag.text:
         | 
| 47 | 
            +
                            collection_date = date_tag.find("strong").text.strip()
         | 
| 48 | 
            +
                        else:
         | 
| 49 | 
            +
                            continue
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                        collection_date = datetime.strptime(
         | 
| 52 | 
            +
                            remove_ordinal_indicator_from_date_string(collection_date), "%A %d %B"
         | 
| 53 | 
            +
                        )
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                        if (current_month > 9) and (collection_date.month < 4):
         | 
| 56 | 
            +
                            collection_date = collection_date.replace(year=(current_year + 1))
         | 
| 57 | 
            +
                        else:
         | 
| 58 | 
            +
                            collection_date = collection_date.replace(year=current_year)
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                        dict_data = {
         | 
| 61 | 
            +
                            "type": bin_name,
         | 
| 62 | 
            +
                            "collectionDate": collection_date.strftime("%d/%m/%Y"),
         | 
| 63 | 
            +
                        }
         | 
| 64 | 
            +
                        bindata["bins"].append(dict_data)
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    bindata["bins"].sort(
         | 
| 67 | 
            +
                        key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
         | 
| 68 | 
            +
                    )
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                    return bindata
         | 
| @@ -1,7 +1,11 @@ | |
| 1 1 | 
             
            # This script pulls (in one hit) the data
         | 
| 2 2 | 
             
            # from Warick District Council Bins Data
         | 
| 3 3 |  | 
| 4 | 
            +
            from datetime import datetime
         | 
| 5 | 
            +
             | 
| 4 6 | 
             
            from bs4 import BeautifulSoup
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            from uk_bin_collection.uk_bin_collection.common import *
         | 
| 5 9 | 
             
            from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
         | 
| 6 10 |  | 
| 7 11 |  | 
| @@ -20,15 +24,30 @@ class CouncilClass(AbstractGetBinDataClass): | |
| 20 24 |  | 
| 21 25 | 
             
                    data = {"bins": []}
         | 
| 22 26 |  | 
| 23 | 
            -
                     | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
                         | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
                         | 
| 27 | 
            +
                    # Find all bin panels
         | 
| 28 | 
            +
                    bin_panels = soup.find_all("div", class_="col-sm-4 col-lg-3")
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    # Iterate through each panel to extract information
         | 
| 31 | 
            +
                    for panel in bin_panels:
         | 
| 32 | 
            +
                        bin_type = panel.find("img")["alt"].strip()
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                        waste_dates = panel.find(
         | 
| 35 | 
            +
                            "div", class_="col-xs-12 text-center waste-dates margin-bottom-15"
         | 
| 36 | 
            +
                        )
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                        for p in waste_dates.find_all("p")[1:]:
         | 
| 39 | 
            +
                            date = p.text.strip()
         | 
| 40 | 
            +
                            if " " in date:
         | 
| 41 | 
            +
                                date = date.split(" ")[1]
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                            dict_data = {
         | 
| 44 | 
            +
                                "type": bin_type,
         | 
| 45 | 
            +
                                "collectionDate": date,
         | 
| 46 | 
            +
                            }
         | 
| 47 | 
            +
                            data["bins"].append(dict_data)
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    data["bins"].sort(
         | 
| 50 | 
            +
                        key=lambda x: datetime.strptime(x.get("collectionDate"), date_format)
         | 
| 51 | 
            +
                    )
         | 
| 33 52 |  | 
| 34 53 | 
             
                    return data
         | 
| @@ -2,7 +2,7 @@ uk_bin_collection/README.rst,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU, | |
| 2 2 | 
             
            uk_bin_collection/tests/council_feature_input_parity.py,sha256=DO6Mk4ImYgM5ZCZ-cutwz5RoYYWZRLYx2tr6zIs_9Rc,3843
         | 
| 3 3 | 
             
            uk_bin_collection/tests/features/environment.py,sha256=VQZjJdJI_kZn08M0j5cUgvKT4k3iTw8icJge1DGOkoA,127
         | 
| 4 4 | 
             
            uk_bin_collection/tests/features/validate_council_outputs.feature,sha256=SJK-Vc737hrf03tssxxbeg_JIvAH-ddB8f6gU1LTbuQ,251
         | 
| 5 | 
            -
            uk_bin_collection/tests/input.json,sha256= | 
| 5 | 
            +
            uk_bin_collection/tests/input.json,sha256=bKqDUy2Db-A44Vz-Tc0a-xwRh6MIaSxbvbsgBP1Bw1U,111573
         | 
| 6 6 | 
             
            uk_bin_collection/tests/output.schema,sha256=ZwKQBwYyTDEM4G2hJwfLUVM-5v1vKRvRK9W9SS1sd18,1086
         | 
| 7 7 | 
             
            uk_bin_collection/tests/step_defs/step_helpers/file_handler.py,sha256=Ygzi4V0S1MIHqbdstUlIqtRIwnynvhu4UtpweJ6-5N8,1474
         | 
| 8 8 | 
             
            uk_bin_collection/tests/step_defs/test_validate_council.py,sha256=VZ0a81sioJULD7syAYHjvK_-nT_Rd36tUyzPetSA0gk,3475
         | 
| @@ -35,8 +35,8 @@ uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py,sha256=U1HOr | |
| 35 35 | 
             
            uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py,sha256=SGOv9mm3fByyR3TQDyNcSLeidX_7FlHelkxnh-NUTcY,4327
         | 
| 36 36 | 
             
            uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py,sha256=wqqCQZzu_q_pJrxTTlTrGGDgPB5EYgd4RiBy7nKnSHc,5835
         | 
| 37 37 | 
             
            uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py,sha256=now2xgpfshYM33UWC18j6xa6BuBydO5Sl7OrDQOo6b0,4687
         | 
| 38 | 
            -
            uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py,sha256= | 
| 39 | 
            -
            uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py,sha256= | 
| 38 | 
            +
            uk_bin_collection/uk_bin_collection/councils/BlabyDistrictCouncil.py,sha256=xqWkQz3HDLkP5TgxQqVJziHJF2yl-q9PcV3Rv-38xDU,1941
         | 
| 39 | 
            +
            uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py,sha256=ZLA2V3qPsJTom7SeQdGDhF4tJSfgIV5Qi202QvGKJZ0,4477
         | 
| 40 40 | 
             
            uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py,sha256=WI68r8jB0IHPUT4CgmZMtng899AAMFTxkyTdPg9yLF8,4117
         | 
| 41 41 | 
             
            uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py,sha256=Llo1rULaAZ8rChVYZqXFFLo7CN6vbT0ULUJD6ActouY,9015
         | 
| 42 42 | 
             
            uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py,sha256=BEWS2c62cOsf26jqn1AkNUvVmc5AlUADYLaQuPn9RY4,5456
         | 
| @@ -55,7 +55,7 @@ uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py,sha256=OJZcHYl | |
| 55 55 | 
             
            uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py,sha256=ZamevXN8_Q8mRZOTESWtkb8jVyDXkTczcmhXMAVVSkM,2276
         | 
| 56 56 | 
             
            uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py,sha256=2s8OL2H0QlUaNu6gUWcoAKHrRdLuQzfMHjcSZuLYbB0,1771
         | 
| 57 57 | 
             
            uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py,sha256=_k3sT_WR-gnjjt3tHQ-L2-keP9sdBV0ZeW7gHDzFPYo,7208
         | 
| 58 | 
            -
            uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py,sha256= | 
| 58 | 
            +
            uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py,sha256=lcZdnARG64NZMn9NxwANaxCk_Uq6pXRBpPXfhbd-3bE,1883
         | 
| 59 59 | 
             
            uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py,sha256=JVPYUIlU2ISgbUSr5AOOXNK6IFQFtQmhZyYIMAOedD4,3858
         | 
| 60 60 | 
             
            uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py,sha256=tXfzMetN6wxahuGGRp2mIyCCDSL4F2aG61HhUxw6COQ,2172
         | 
| 61 61 | 
             
            uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py,sha256=EB88D0MNJwuDZ2GX1ENc5maGYx17mnHTCtNl6s-v11E,5090
         | 
| @@ -109,7 +109,7 @@ uk_bin_collection/uk_bin_collection/councils/FolkstoneandHytheDistrictCouncil.py | |
| 109 109 | 
             
            uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py,sha256=YWT2GM2-bQ3Zh9ps1K14XRZfanuJOlV-zHpOOYMXAXY,4893
         | 
| 110 110 | 
             
            uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py,sha256=SRCgYhYs6rv_8C1UEDVORHZgXxcJkoZBjzdYS4Lu-ew,4531
         | 
| 111 111 | 
             
            uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py,sha256=XzfFMCwclh9zAJgsbaj4jywjdiH0wPaFicaVsLrN3ms,2297
         | 
| 112 | 
            -
            uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py,sha256 | 
| 112 | 
            +
            uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py,sha256=-QKWlavyDqydJz97WYywvOjBC9fJmS530HyHnnxTe1A,2974
         | 
| 113 113 | 
             
            uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py,sha256=8Wjvmdvg5blHVrREaEnhhWZaWhYVP4v_KdDVPLIUxaU,4889
         | 
| 114 114 | 
             
            uk_bin_collection/uk_bin_collection/councils/GraveshamBoroughCouncil.py,sha256=ueQ9xFiTxMUBTGV9VjtySHA1EFWliTM0AeNePBIG9ho,4568
         | 
| 115 115 | 
             
            uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py,sha256=9pVrmQhZcK2AD8gX8mNvP--L4L9KaY6L3B822VX6fec,5695
         | 
| @@ -120,8 +120,9 @@ uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py,sha256=t_6AkAu4w | |
| 120 120 | 
             
            uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py,sha256=_g3fP5Nq-OUjgNrfRf4UEyFKzq0x8QK-4enh5RP1efA,2050
         | 
| 121 121 | 
             
            uk_bin_collection/uk_bin_collection/councils/HartlepoolBoroughCouncil.py,sha256=MUT1A24iZShT2p55rXEvgYwGUuw3W05Z4ZQAveehv-s,2842
         | 
| 122 122 | 
             
            uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py,sha256=-ThSG6NIJP_wf2GmGL7SAvxbOujdhanZ8ECP4VSQCBs,5415
         | 
| 123 | 
            -
            uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py,sha256= | 
| 123 | 
            +
            uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py,sha256=x7dfy8mdt2iGl8qJxHb-uBh4u0knmi9MJ6irOJw9WYA,4805
         | 
| 124 124 | 
             
            uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py,sha256=GNxDU65QuZHV5va2IrKtcJ6TQoDdwmV03JvkVqOauP4,3291
         | 
| 125 | 
            +
            uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py,sha256=2Hk-_pitSQXlLVct_Vmu1b2EiCNuTMQBYbJs1lJVdCc,2299
         | 
| 125 126 | 
             
            uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py,sha256=LXhJ47rujx7k3naz0tFiTT1l5k6gAYcVdekJN1t_HLY,4564
         | 
| 126 127 | 
             
            uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py,sha256=UHcesBoctFVcXDYuwfag43KbcJcopkEDzJ-54NxtK0Q,1851
         | 
| 127 128 | 
             
            uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py,sha256=dGyhhG6HRjQ2SPeiRwUPTGlk9dPIslagV2k0GjEOn1s,1587
         | 
| @@ -157,6 +158,7 @@ uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py,sha256= | |
| 157 158 | 
             
            uk_bin_collection/uk_bin_collection/councils/MidlothianCouncil.py,sha256=mM5-itJDNhjsT5UEjSFfWppmfmPFSns4u_1QblewuFU,5605
         | 
| 158 159 | 
             
            uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py,sha256=7e2pGBLCw24pNItHeI9jkxQ3rEOZ4WC4zVlbvKYGdXE,2600
         | 
| 159 160 | 
             
            uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py,sha256=xWR5S0gwQu9gXxjl788Wux1KaC0CT7ZFw0iXuRLZCEM,5599
         | 
| 161 | 
            +
            uk_bin_collection/uk_bin_collection/councils/MonmouthshireCountyCouncil.py,sha256=jLdnZUVHPmm21hk4oQ6fruEj39Y4YikSl8TVb_CuN0s,2424
         | 
| 160 162 | 
             
            uk_bin_collection/uk_bin_collection/councils/MorayCouncil.py,sha256=jsHCQ_aV_bG0GPfF7h6g5TP84sroplYC5k2M6iEKiTw,2265
         | 
| 161 163 | 
             
            uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py,sha256=ychYR2nsyk2UIb8tjWaKrLUT4hxSsHN558l3RqZ0mjw,5635
         | 
| 162 164 | 
             
            uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py,sha256=ylTn9KmWITtaO9_Z8kJCN2w2ALfhrfGt3SeJ78lgw7M,5391
         | 
| @@ -256,7 +258,7 @@ uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py,sha256=vRfI | |
| 256 258 | 
             
            uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py,sha256=_anovUnXMr40lZLHyX3opIP73BwauCllKy-Z2SBrzPw,2076
         | 
| 257 259 | 
             
            uk_bin_collection/uk_bin_collection/councils/WalthamForest.py,sha256=P7MMw0EhpRmDbbnHb25tY5_yvYuZUFwJ1br4TOv24sY,4997
         | 
| 258 260 | 
             
            uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py,sha256=AB9mrV1v4pKKhfsBS8MpjO8XXBifqojSk53J9Q74Guk,1583
         | 
| 259 | 
            -
            uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py,sha256= | 
| 261 | 
            +
            uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py,sha256=DAL_f0BcIxFj7Ngkms5Q80kgSGp9y5zB35wRPudayz8,1644
         | 
| 260 262 | 
             
            uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py,sha256=zFkXmF1X5g8pjv7II_jXBdrHJu16gy_PowVWVdaDg7A,2657
         | 
| 261 263 | 
             
            uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py,sha256=tp9l7vdgSGRzNNG0pDfnNuFj4D2bpRJUJmAiTJ6bM0g,4662
         | 
| 262 264 | 
             
            uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py,sha256=SvSSaLkx7iJjzypAwKkaJwegXkSsIQtUOS2V605kz1A,3368
         | 
| @@ -285,8 +287,8 @@ uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py,sha256=I2kBYMlsD4bId | |
| 285 287 | 
             
            uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py,sha256=EQWRhZ2pEejlvm0fPyOTsOHKvUZmPnxEYO_OWRGKTjs,1158
         | 
| 286 288 | 
             
            uk_bin_collection/uk_bin_collection/create_new_council.py,sha256=m-IhmWmeWQlFsTZC4OxuFvtw5ZtB8EAJHxJTH4O59lQ,1536
         | 
| 287 289 | 
             
            uk_bin_collection/uk_bin_collection/get_bin_data.py,sha256=YvmHfZqanwrJ8ToGch34x-L-7yPe31nB_x77_Mgl_vo,4545
         | 
| 288 | 
            -
            uk_bin_collection-0. | 
| 289 | 
            -
            uk_bin_collection-0. | 
| 290 | 
            -
            uk_bin_collection-0. | 
| 291 | 
            -
            uk_bin_collection-0. | 
| 292 | 
            -
            uk_bin_collection-0. | 
| 290 | 
            +
            uk_bin_collection-0.122.0.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
         | 
| 291 | 
            +
            uk_bin_collection-0.122.0.dist-info/METADATA,sha256=cuaZZvJNMw784bFqOHyuc7nJOJGOYROQ5LdyS6On0pA,17574
         | 
| 292 | 
            +
            uk_bin_collection-0.122.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
         | 
| 293 | 
            +
            uk_bin_collection-0.122.0.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
         | 
| 294 | 
            +
            uk_bin_collection-0.122.0.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
    
        {uk_bin_collection-0.121.1.dist-info → uk_bin_collection-0.122.0.dist-info}/entry_points.txt
    RENAMED
    
    | 
            File without changes
         |