uk_bin_collection 0.150.1__py3-none-any.whl → 0.152.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.
Files changed (19) hide show
  1. uk_bin_collection/tests/input.json +46 -8
  2. uk_bin_collection/uk_bin_collection/councils/AngusCouncil.py +149 -0
  3. uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py +0 -2
  4. uk_bin_collection/uk_bin_collection/councils/BarkingDagenham.py +11 -2
  5. uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py +47 -33
  6. uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +11 -2
  7. uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py +21 -6
  8. uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +105 -53
  9. uk_bin_collection/uk_bin_collection/councils/FermanaghOmaghDistrictCouncil.py +102 -0
  10. uk_bin_collection/uk_bin_collection/councils/MaidstoneBoroughCouncil.py +115 -0
  11. uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +61 -39
  12. uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +128 -71
  13. uk_bin_collection/uk_bin_collection/councils/SloughBoroughCouncil.py +140 -0
  14. uk_bin_collection/uk_bin_collection/councils/TewkesburyBoroughCouncil.py +40 -0
  15. {uk_bin_collection-0.150.1.dist-info → uk_bin_collection-0.152.0.dist-info}/METADATA +1 -1
  16. {uk_bin_collection-0.150.1.dist-info → uk_bin_collection-0.152.0.dist-info}/RECORD +19 -14
  17. {uk_bin_collection-0.150.1.dist-info → uk_bin_collection-0.152.0.dist-info}/LICENSE +0 -0
  18. {uk_bin_collection-0.150.1.dist-info → uk_bin_collection-0.152.0.dist-info}/WHEEL +0 -0
  19. {uk_bin_collection-0.150.1.dist-info → uk_bin_collection-0.152.0.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,11 @@
1
+ import time
2
+
1
3
  from bs4 import BeautifulSoup
4
+ from selenium.webdriver.common.by import By
5
+ from selenium.webdriver.common.keys import Keys
6
+ from selenium.webdriver.support import expected_conditions as EC
7
+ from selenium.webdriver.support.ui import Select, WebDriverWait
8
+
2
9
  from uk_bin_collection.uk_bin_collection.common import *
3
10
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
4
11
 
@@ -12,78 +19,128 @@ class CouncilClass(AbstractGetBinDataClass):
12
19
  """
13
20
 
14
21
  def parse_data(self, page: str, **kwargs) -> dict:
15
- data = {"bins": []}
16
- collections = []
17
-
18
- user_postcode = kwargs.get("postcode")
19
- user_uprn = kwargs.get("uprn")
20
-
21
- check_uprn(user_uprn)
22
- check_postcode(user_postcode)
23
-
24
- headers = {
25
- "authority": "www.rugby.gov.uk",
26
- "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
27
- "accept-language": "en-GB,en;q=0.9",
28
- "cache-control": "no-cache",
29
- "content-type": "application/x-www-form-urlencoded",
30
- # 'cookie': 'JSESSIONID=7E90CAB54B649C3DCC7F6B5DA0897C63; COOKIE_SUPPORT=true; GUEST_LANGUAGE_ID=en_GB; AWSELB=D941E98916B5759862ED6C39DA9FB3FD9880491851D200C98112ABEC3223D52B19A2A2C6B37A89D3650D44FA5728FCAFEDE7BB2592D948FFF9C7B18D76C41AF02C308B0F3A2DE17F1585E9959BCE68CC83BC3AC753; CookieControl={"necessaryCookies":[],"optionalCookies":{},"statement":{},"consentDate":1701710876715,"consentExpiry":90,"interactedWith":true,"user":"8FED8810-3C3E-4D50-A9DC-42655030B3B1"}',
31
- "origin": "https://www.rugby.gov.uk",
32
- "pragma": "no-cache",
33
- "referer": "https://www.rugby.gov.uk/check-your-next-bin-day",
34
- "sec-ch-ua": '"Chromium";v="118", "Opera GX";v="104", "Not=A?Brand";v="99"',
35
- "sec-ch-ua-mobile": "?0",
36
- "sec-ch-ua-platform": '"Windows"',
37
- "sec-fetch-dest": "document",
38
- "sec-fetch-mode": "navigate",
39
- "sec-fetch-site": "same-origin",
40
- "sec-fetch-user": "?1",
41
- "upgrade-insecure-requests": "1",
42
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.118 Safari/537.36",
43
- }
44
- params = {
45
- "p_p_id": "com_placecube_digitalplace_local_waste_portlet_CollectionDayFinderPortlet",
46
- "p_p_lifecycle": "0",
47
- "p_p_state": "normal",
48
- "p_p_mode": "view",
49
- "_com_placecube_digitalplace_local_waste_portlet_CollectionDayFinderPortlet_mvcRenderCommandName": "/collection_day_finder/get_days",
50
- }
51
- data = {
52
- "_com_placecube_digitalplace_local_waste_portlet_CollectionDayFinderPortlet_formDate": f"{datetime.now().timestamp().__floor__()}",
53
- "_com_placecube_digitalplace_local_waste_portlet_CollectionDayFinderPortlet_postcode": f"{user_postcode}",
54
- "_com_placecube_digitalplace_local_waste_portlet_CollectionDayFinderPortlet_uprn": f"{user_uprn}",
55
- }
56
-
57
- response = requests.post(
58
- "https://www.rugby.gov.uk/check-your-next-bin-day",
59
- params=params,
60
- headers=headers,
61
- data=data,
62
- )
63
-
64
- soup = BeautifulSoup(response.text, features="html.parser")
65
- soup.prettify()
66
-
67
- table_rows = soup.find("table", {"class": "table"}).find("tbody").find_all("tr")
68
-
69
- for row in table_rows:
70
- row_text = row.text.strip().split("\n")
71
- bin_text = row_text[0].split(" ")
72
- bin_type = " ".join(bin_text[1:]).capitalize()
73
- collections.append(
74
- (bin_type, datetime.strptime(row_text[1], "%A %d %b %Y"))
22
+ driver = None
23
+ try:
24
+ user_postcode = kwargs.get("postcode")
25
+ if not user_postcode:
26
+ raise ValueError("No postcode provided.")
27
+ check_postcode(user_postcode)
28
+
29
+ user_uprn = kwargs.get("uprn")
30
+ check_uprn(user_uprn)
31
+
32
+ headless = kwargs.get("headless")
33
+ web_driver = kwargs.get("web_driver")
34
+ driver = create_webdriver(web_driver, headless, None, __name__)
35
+ page = "https://www.rugby.gov.uk/check-your-next-bin-day"
36
+
37
+ driver.get(page)
38
+
39
+ wait = WebDriverWait(driver, 60)
40
+ accept_cookies_button = wait.until(
41
+ EC.element_to_be_clickable(
42
+ (
43
+ By.ID,
44
+ "ccc-recommended-settings",
45
+ )
46
+ )
75
47
  )
76
- collections.append(
77
- (bin_type, datetime.strptime(row_text[3], "%A %d %b %Y"))
48
+ accept_cookies_button.click()
49
+
50
+ postcode_input = WebDriverWait(driver, 10).until(
51
+ EC.presence_of_element_located(
52
+ (
53
+ By.XPATH,
54
+ '//*[@id="_com_placecube_digitalplace_local_waste_portlet_CollectionDayFinderPortlet_postcode"]',
55
+ )
56
+ )
57
+ )
58
+ postcode_input.send_keys(user_postcode + Keys.TAB + Keys.ENTER)
59
+
60
+ time.sleep(5)
61
+ # Wait for address box to be visible
62
+ select_address_input = WebDriverWait(driver, 10).until(
63
+ EC.presence_of_element_located(
64
+ (
65
+ By.ID,
66
+ "_com_placecube_digitalplace_local_waste_portlet_CollectionDayFinderPortlet_uprn",
67
+ )
68
+ )
69
+ )
70
+
71
+ # Select address based
72
+ select = Select(select_address_input)
73
+ for option in select.options:
74
+ if option.get_attribute("value") == str(user_uprn):
75
+ select.select_by_value(str(user_uprn))
76
+ break
77
+ else:
78
+ raise ValueError(f"UPRN {user_uprn} not found in address options")
79
+
80
+ select_address_input.send_keys(Keys.TAB + Keys.ENTER)
81
+
82
+ # Wait for the specified table to be present
83
+ target_table = WebDriverWait(driver, 10).until(
84
+ EC.presence_of_element_located(
85
+ (
86
+ By.XPATH,
87
+ '//*[@id="portlet_com_placecube_digitalplace_local_waste_portlet_CollectionDayFinderPortlet"]/div/div/div/div/table',
88
+ )
89
+ )
90
+ )
91
+
92
+ soup = BeautifulSoup(driver.page_source, "html.parser")
93
+
94
+ # Initialize bin data dictionary
95
+ bin_data = {"bins": []}
96
+
97
+ # Find the table
98
+ table = soup.find("table", class_="table")
99
+ if table:
100
+ # Find all rows in tbody
101
+ rows = table.find("tbody").find_all("tr")
102
+
103
+ for row in rows:
104
+ # Get all cells in the row
105
+ cells = row.find_all("td")
106
+ if len(cells) >= 4: # Ensure we have enough cells
107
+ bin_type = cells[0].text.strip()
108
+ next_collection = cells[1].text.strip()
109
+ following_collection = cells[3].text.strip()
110
+
111
+ # Parse the dates
112
+ for collection_date in [next_collection, following_collection]:
113
+ try:
114
+ # Convert date from "Friday 09 May 2025" format
115
+ parsed_date = datetime.strptime(
116
+ collection_date, "%A %d %B %Y"
117
+ )
118
+ formatted_date = parsed_date.strftime("%d/%m/%Y")
119
+
120
+ bin_info = {
121
+ "type": bin_type,
122
+ "collectionDate": formatted_date,
123
+ }
124
+ bin_data["bins"].append(bin_info)
125
+ except ValueError as e:
126
+ print(f"Error parsing date {collection_date}: {e}")
127
+ else:
128
+ raise ValueError("Collection data table not found")
129
+
130
+ # Sort the collections by date
131
+ bin_data["bins"].sort(
132
+ key=lambda x: datetime.strptime(x["collectionDate"], "%d/%m/%Y")
78
133
  )
79
134
 
80
- ordered_data = sorted(collections, key=lambda x: x[1])
81
- data = {"bins": []}
82
- for item in ordered_data:
83
- dict_data = {
84
- "type": item[0],
85
- "collectionDate": item[1].strftime(date_format),
86
- }
87
- data["bins"].append(dict_data)
135
+ print(bin_data)
88
136
 
89
- return data
137
+ except Exception as e:
138
+ # Here you can log the exception if needed
139
+ print(f"An error occurred: {e}")
140
+ # Optionally, re-raise the exception if you want it to propagate
141
+ raise
142
+ finally:
143
+ # This block ensures that the driver is closed regardless of an exception
144
+ if driver:
145
+ driver.quit()
146
+ return bin_data
@@ -0,0 +1,140 @@
1
+ import time
2
+ import re
3
+ import requests
4
+ from datetime import datetime
5
+ from bs4 import BeautifulSoup
6
+ from selenium.webdriver.common.by import By
7
+ from selenium.webdriver.common.keys import Keys
8
+ from selenium.webdriver.support import expected_conditions as EC
9
+ from selenium.webdriver.support.ui import WebDriverWait
10
+ from uk_bin_collection.uk_bin_collection.common import *
11
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
12
+
13
+ def get_street_from_postcode(postcode: str, api_key: str) -> str:
14
+ url = "https://maps.googleapis.com/maps/api/geocode/json"
15
+ params = {"address": postcode, "key": api_key}
16
+ response = requests.get(url, params=params)
17
+ data = response.json()
18
+
19
+ if data["status"] != "OK":
20
+ raise ValueError(f"API error: {data['status']}")
21
+
22
+ for component in data["results"][0]["address_components"]:
23
+ if "route" in component["types"]:
24
+ return component["long_name"]
25
+
26
+ raise ValueError("No street (route) found in the response.")
27
+
28
+ class CouncilClass(AbstractGetBinDataClass):
29
+ def parse_data(self, page: str, **kwargs) -> dict:
30
+ driver = None
31
+ bin_data = {"bins": []}
32
+ try:
33
+ user_postcode = kwargs.get("postcode")
34
+ if not user_postcode:
35
+ raise ValueError("No postcode provided.")
36
+ check_postcode(user_postcode)
37
+
38
+ headless = kwargs.get("headless")
39
+ web_driver = kwargs.get("web_driver")
40
+ driver = create_webdriver(web_driver, headless, None, __name__)
41
+ page = "https://www.slough.gov.uk/bin-collections"
42
+ driver.get(page)
43
+
44
+ # Accept cookies
45
+ WebDriverWait(driver, 10).until(
46
+ EC.element_to_be_clickable((By.ID, "ccc-recommended-settings"))
47
+ ).click()
48
+
49
+ # Enter the street name into the address search
50
+ address_input = WebDriverWait(driver, 10).until(
51
+ EC.presence_of_element_located((By.ID, "keyword_directory25"))
52
+ )
53
+ user_address = get_street_from_postcode(user_postcode, "AIzaSyBDLULT7EIlNtHerswPtfmL15Tt3Oc0bV8")
54
+ address_input.send_keys(user_address + Keys.ENTER)
55
+
56
+ # Wait for address results to load
57
+ WebDriverWait(driver, 10).until(
58
+ EC.presence_of_all_elements_located((By.CSS_SELECTOR, "span.list__link-text"))
59
+ )
60
+ span_elements = driver.find_elements(By.CSS_SELECTOR, "span.list__link-text")
61
+
62
+ for span in span_elements:
63
+ if user_address.lower() in span.text.lower():
64
+ span.click()
65
+ break
66
+ else:
67
+ raise Exception(f"No link found containing address: {user_address}")
68
+
69
+ # Wait for address detail page
70
+ WebDriverWait(driver, 10).until(
71
+ EC.presence_of_element_located((By.CSS_SELECTOR, "section.site-content"))
72
+ )
73
+ soup = BeautifulSoup(driver.page_source, "html.parser")
74
+
75
+ # Extract each bin link and type
76
+ for heading in soup.select("dt.definition__heading"):
77
+ heading_text = heading.get_text(strip=True)
78
+ if "bin day details" in heading_text.lower():
79
+ bin_type = heading_text.split()[0].capitalize() + " bin"
80
+ dd = heading.find_next_sibling("dd")
81
+ link = dd.find("a", href=True)
82
+
83
+ if link:
84
+ bin_url = link["href"]
85
+ if not bin_url.startswith("http"):
86
+ bin_url = "https://www.slough.gov.uk" + bin_url
87
+
88
+ # Visit the child page
89
+ print(f"Navigating to {bin_url}")
90
+ driver.get(bin_url)
91
+ WebDriverWait(driver, 10).until(
92
+ EC.presence_of_element_located((By.CSS_SELECTOR, "div.page-content"))
93
+ )
94
+ child_soup = BeautifulSoup(driver.page_source, "html.parser")
95
+
96
+ editor_div = child_soup.find("div", class_="editor")
97
+ if not editor_div:
98
+ print("No editor div found on bin detail page.")
99
+ continue
100
+
101
+ ul = editor_div.find("ul")
102
+ if not ul:
103
+ print("No <ul> with dates found in editor div.")
104
+ continue
105
+
106
+ for li in ul.find_all("li"):
107
+ raw_text = li.get_text(strip=True).replace(".", "")
108
+
109
+ if "no collection" in raw_text.lower() or "no collections" in raw_text.lower():
110
+ print(f"Ignoring non-collection note: {raw_text}")
111
+ continue
112
+
113
+ raw_date = raw_text
114
+
115
+ try:
116
+ parsed_date = datetime.strptime(raw_date, "%d %B %Y")
117
+ except ValueError:
118
+ raw_date_cleaned = raw_date.split("(")[0].strip()
119
+ try:
120
+ parsed_date = datetime.strptime(raw_date_cleaned, "%d %B %Y")
121
+ except Exception:
122
+ print(f"Could not parse date: {raw_text}")
123
+ continue
124
+
125
+ formatted_date = parsed_date.strftime("%d/%m/%Y")
126
+ contains_date(formatted_date)
127
+ bin_data["bins"].append({
128
+ "type": bin_type,
129
+ "collectionDate": formatted_date
130
+ })
131
+
132
+ print(f"Type: {bin_type}, Date: {formatted_date}")
133
+
134
+ except Exception as e:
135
+ print(f"An error occurred: {e}")
136
+ raise
137
+ finally:
138
+ if driver:
139
+ driver.quit()
140
+ return bin_data
@@ -0,0 +1,40 @@
1
+ import json
2
+ import requests
3
+ from datetime import datetime
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
+ class CouncilClass(AbstractGetBinDataClass):
9
+ def parse_data(self, page: str, **kwargs) -> dict:
10
+ user_uprn = kwargs.get("uprn")
11
+ check_uprn(user_uprn)
12
+
13
+ url = f"https://api-2.tewkesbury.gov.uk/incab/rounds/{user_uprn}/next-collection"
14
+ response = requests.get(url)
15
+ response.raise_for_status()
16
+
17
+ json_data = response.json()
18
+
19
+ data = {"bins": []}
20
+
21
+ if json_data.get("status") == "OK" and "body" in json_data:
22
+ for entry in json_data["body"]:
23
+ bin_type = entry.get("collectionType")
24
+ date_str = entry.get("NextCollection")
25
+
26
+ if bin_type and date_str:
27
+ try:
28
+ collection_date = datetime.strptime(date_str, "%Y-%m-%d")
29
+ data["bins"].append({
30
+ "type": bin_type,
31
+ "collectionDate": collection_date.strftime(date_format)
32
+ })
33
+ except ValueError:
34
+ continue
35
+
36
+ # Sort by date
37
+ data["bins"].sort(key=lambda x: x["collectionDate"])
38
+
39
+ print(json.dumps(data, indent=2))
40
+ return data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uk_bin_collection
3
- Version: 0.150.1
3
+ Version: 0.152.0
4
4
  Summary: Python Lib to collect UK Bin Data
5
5
  Author: Robert Bradley
6
6
  Author-email: robbrad182@gmail.com
@@ -7,7 +7,7 @@ uk_bin_collection/tests/council_feature_input_parity.py,sha256=DO6Mk4ImYgM5ZCZ-c
7
7
  uk_bin_collection/tests/features/environment.py,sha256=VQZjJdJI_kZn08M0j5cUgvKT4k3iTw8icJge1DGOkoA,127
8
8
  uk_bin_collection/tests/features/validate_council_outputs.feature,sha256=SJK-Vc737hrf03tssxxbeg_JIvAH-ddB8f6gU1LTbuQ,251
9
9
  uk_bin_collection/tests/generate_map_test_results.py,sha256=CKnGK2ZgiSXomRGkomX90DitgMP-X7wkHhyKORDcL2E,1144
10
- uk_bin_collection/tests/input.json,sha256=dPgWnCRdDky-incNNaf9iYMI4i9wrkktRs4BZmIwyzE,131794
10
+ uk_bin_collection/tests/input.json,sha256=pwAeJYV_DJ4zMkXDYolTi5e-v9g_0gd-AMv_VCeJsyE,133191
11
11
  uk_bin_collection/tests/output.schema,sha256=ZwKQBwYyTDEM4G2hJwfLUVM-5v1vKRvRK9W9SS1sd18,1086
12
12
  uk_bin_collection/tests/step_defs/step_helpers/file_handler.py,sha256=Ygzi4V0S1MIHqbdstUlIqtRIwnynvhu4UtpweJ6-5N8,1474
13
13
  uk_bin_collection/tests/step_defs/test_validate_council.py,sha256=VZ0a81sioJULD7syAYHjvK_-nT_Rd36tUyzPetSA0gk,3475
@@ -21,9 +21,10 @@ uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py,sha256=Je8Vw
21
21
  uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py,sha256=aO1CSdyqa8oAD0fB79y1Q9bikAWCP_JFa7CsyTa2j9s,1655
22
22
  uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py,sha256=ppbrmm-MzB1wOulK--CU_0j4P-djNf3ozMhHnmQFqLo,1511
23
23
  uk_bin_collection/uk_bin_collection/councils/AmberValleyBoroughCouncil.py,sha256=mTeluIIEcuxLxhfDQ95A1fp8RM6AkJT5tRGZPUbYGdk,1853
24
+ uk_bin_collection/uk_bin_collection/councils/AngusCouncil.py,sha256=YlhAnxkRAAvrwbUvleNKUuLROcwMTps2eMHElpuctm4,5894
24
25
  uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py,sha256=Hp5pteaC5RjL5ZqPZ564S9WQ6ZTKLMO6Dl_fxip2TUc,1653
25
26
  uk_bin_collection/uk_bin_collection/councils/ArdsAndNorthDownCouncil.py,sha256=iMBldxNErgi-ok1o6xpqdNgMvR6qapaNqoTWDTqMeGo,3824
26
- uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py,sha256=UnHge6FwigJKYuE6QYiXE659dTaKvs1xhHHJXoAXhSQ,5075
27
+ uk_bin_collection/uk_bin_collection/councils/ArgyllandButeCouncil.py,sha256=NBeXjzv0bOblkS5xjSy5D0DdW9vtx_TGMLVP0FP1JqA,5073
27
28
  uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py,sha256=o9NBbVCTdxKXnpYbP8-zxe1Gh8s57vwfV75Son_sAHE,2863
28
29
  uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py,sha256=yfhthv9nuogP19VOZ3TYQrq51qqjiCZcSel4sXhiKjs,4012
29
30
  uk_bin_collection/uk_bin_collection/councils/AshfieldDistrictCouncil.py,sha256=fhX7S_A3jqoND7NE6qITPMPvdk3FJSKZ3Eoa5RtSg3I,4247
@@ -31,7 +32,7 @@ uk_bin_collection/uk_bin_collection/councils/AshfordBoroughCouncil.py,sha256=kuL
31
32
  uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py,sha256=LouqjspEMt1TkOGqWHs2zkxwOETIy3n7p64uKIlAgUg,2401
32
33
  uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py,sha256=W7QBx6Mgso8RYosuXsaYo3GGNAu-tiyBSmuYxr1JSOU,1707
33
34
  uk_bin_collection/uk_bin_collection/councils/BaberghDistrictCouncil.py,sha256=1eXdST58xFRMdYl8AGNG_EwyQeLa31WSWUe882hQ2ec,6329
34
- uk_bin_collection/uk_bin_collection/councils/BarkingDagenham.py,sha256=8lYnRazbh_iOcmciSOJIhF44e8z3ZFlTZ0vnZKEfwJI,5973
35
+ uk_bin_collection/uk_bin_collection/councils/BarkingDagenham.py,sha256=fgbaD8jsUBJrnUWKbcjSdJHDVRAh9KRUsG6JwB31NYA,6263
35
36
  uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py,sha256=Sd4-pbv0QZsR7soxvXYqsfdOUIqZqS6notyoZthG77s,9182
36
37
  uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py,sha256=hqzVKEqwYmjcQjCYBletcCt9_pE96qQ3kn7eDroJeNk,4764
37
38
  uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py,sha256=NymPmq5pud0PJ8ePcc2r1SKED4EHQ0EY2l71O-Metxc,3313
@@ -52,10 +53,10 @@ uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py,sha256=Ll
52
53
  uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py,sha256=BEWS2c62cOsf26jqn1AkNUvVmc5AlUADYLaQuPn9RY4,5456
53
54
  uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py,sha256=2vYHilpI8mSwC2Ykdr1gxYAN3excDWqF6AwtGbkwbTw,2441
54
55
  uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py,sha256=PX6A_pDvaN109aSNWmEhm88GFKfkClIkmbwGURWvsks,1744
55
- uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py,sha256=ucwokxvASYi_KiOYSOVdaGfC1kfUbII0r6Zl2NE1hnU,4208
56
- uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py,sha256=k6qt4cds-Ejd97Z-__pw2BYvGVbFdc9SUfF73PPrTNA,5823
56
+ uk_bin_collection/uk_bin_collection/councils/BrentCouncil.py,sha256=BsP7V0vezteX0WAxcxqMf3g6ro-J78W6hubefALRMyg,5222
57
+ uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py,sha256=trTCVrSwQ8EuKe30V1vShkkCSw5fEG1kg0DimnsZqdM,6133
57
58
  uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py,sha256=nQeRBKrDcZE2m_EzjUBr9dJ5tcUdGcUuA5FcnLkbLr4,5575
58
- uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py,sha256=aelqhh503dx6O2EEmC3AT5tnY39Dc53qcouH8T-mek8,7613
59
+ uk_bin_collection/uk_bin_collection/councils/BroadlandDistrictCouncil.py,sha256=YhzP8zar_oSSkBOA3mdMAehnMTrcTBmGO0RfC4UBzvM,8236
59
60
  uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py,sha256=dii85JLmYU1uMidCEsWVo3stTcq_QqyC65DxG8u1UmE,4302
60
61
  uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py,sha256=PUfxP8j5Oh9wFHkdjbrJzQli9UzMHZzwrZ2hkThrvhI,1781
61
62
  uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py,sha256=mcRtkFc9g3YNN17OQfhzYJtNYeWrZPP_e7m7goEhz5I,3012
@@ -78,7 +79,7 @@ uk_bin_collection/uk_bin_collection/councils/CherwellDistrictCouncil.py,sha256=V
78
79
  uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py,sha256=I7Dj8LzG-Q4yrJ99jLRIwKwW5WQ9he8UksvF_YPzTxI,1681
79
80
  uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py,sha256=5mKZf22NgdyBY-SqV0c2q8b8IJobkoZrsfGEVUcxUyM,3544
80
81
  uk_bin_collection/uk_bin_collection/councils/ChesterfieldBoroughCouncil.py,sha256=mZiM8Ugm_OP0JkC5pLaQmi4i79mAp4SNNrcIdsREjHw,7198
81
- uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py,sha256=HxrLcJves7ZsE8FbooymeecTUmScY4R7Oi71vwCePPo,4118
82
+ uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py,sha256=bvtqXSZN64jSND0NxwzJ-WA9H49FwARQMGS3PlUSiUg,6311
82
83
  uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py,sha256=M7HjuUaFq8aSnOf_9m1QS4MmPPMmPhF3mLHSrfDPtV0,5194
83
84
  uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py,sha256=Mny-q2rQkWe2Tj1gINwEM1L4AkqQl1EDMAaKY0-deD4,3968
84
85
  uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py,sha256=QcFHTzW7Q1jYyHWq6thpA6fhO8w38eCOpUPk9EfjGIA,1291
@@ -124,6 +125,7 @@ uk_bin_collection/uk_bin_collection/councils/ExeterCityCouncil.py,sha256=FPNyBuQ
124
125
  uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py,sha256=C3OA9PEhBsCYPzwsSdqVi_SbF8uiB186i2XfHWKd3VI,1694
125
126
  uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py,sha256=25QxeN5q3ad1Wwexs2d-B7ooH0ru6pOUx58413FOTY4,2352
126
127
  uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py,sha256=sFrnKzIE2tIcz0YrC6A9HcevzgNdf6E6_HLGMWDKtGw,2513
128
+ uk_bin_collection/uk_bin_collection/councils/FermanaghOmaghDistrictCouncil.py,sha256=om9bdOv3_n16DMNX3-ndRwBEAlddhY1BB8z6doXrDfo,3317
127
129
  uk_bin_collection/uk_bin_collection/councils/FifeCouncil.py,sha256=eP_NnHtBLyflRUko9ubi_nxUPb7qg9SbaaSxqWZxNEs,2157
128
130
  uk_bin_collection/uk_bin_collection/councils/FlintshireCountyCouncil.py,sha256=RvPHhGbzP3mcjgWe2rIQux43UuDH7XofJGIKs7wJRe0,2060
129
131
  uk_bin_collection/uk_bin_collection/councils/FolkstoneandHytheDistrictCouncil.py,sha256=yKgZhua-2hjMihHshhncXVUBagbTOQBnNbKzdIZkWjw,3114
@@ -179,6 +181,7 @@ uk_bin_collection/uk_bin_collection/councils/LondonBoroughOfRichmondUponThames.p
179
181
  uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py,sha256=A_6Sis5hsF53Th04KeadHRasGbpAm6aoaWJ6X8eC4Y8,6604
180
182
  uk_bin_collection/uk_bin_collection/councils/LondonBoroughSutton.py,sha256=T0gCjpBQ9k3uNNIiJGphNiSXeh2n6bohflg9RwbL3NA,2565
181
183
  uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py,sha256=vScUi_R8FnBddii2_zLlZBLxuh85mKmCm8nKW3zxky0,2758
184
+ uk_bin_collection/uk_bin_collection/councils/MaidstoneBoroughCouncil.py,sha256=1YZIliUEX3_gaNJDbdCybxNPwkSz0A58gDAl9kSIHsE,4439
182
185
  uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py,sha256=PMVt2XFggttPmbWyrBrHJ-W6R_6-0ux1BkY1kj1IKzg,1997
183
186
  uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py,sha256=iQG0EkX2npBicvsGKQRYyBGSBvKVUbKvUvvwrC9xV1A,2100
184
187
  uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py,sha256=RY301_82z3-xInGai5ocT7rzoV75ATbf0N7uxn8Z9LE,3110
@@ -206,7 +209,7 @@ uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py,sha256=-UTgDseUtAG
206
209
  uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py,sha256=dAcl5P97bttl2xCPvxof1a18kmqOrMmiElgtn3Ej7zs,8480
207
210
  uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py,sha256=o8zv40Wt19d51mrN5lsgLMCKMokMPmI1cMHBNT5yAho,1976
208
211
  uk_bin_collection/uk_bin_collection/councils/NorthDevonCountyCouncil.py,sha256=tgJKIvu7nnCAHu_HImfG5SQABD6ygKFqrZU-ZoC6ObY,6260
209
- uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py,sha256=bps_uCFAeUHQla7AE5lZOv6sUkUz1fb6zduZdAcYMuw,4651
212
+ uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py,sha256=BfNpYcjG3z0Yz8OYN6NkfzvZ5k1FI-80D-rv211kPPU,5449
210
213
  uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py,sha256=fYf438VZIaOaqPSwdTTWVjFTdrI0jGfFsxVzOc-QdkA,1817
211
214
  uk_bin_collection/uk_bin_collection/councils/NorthHertfordshireDistrictCouncil.py,sha256=dFgvZqVKEVEP0zSPeh2s9xIWSCGbhYHpXn2U6Nk0HXM,2847
212
215
  uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py,sha256=vYOCerJXr9LTP6F2wm4vpYNYbQaWNZ6yfHEQ33N_hTw,1681
@@ -243,7 +246,7 @@ uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py,sha256=rfhD66A9H
243
246
  uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py,sha256=-fdLvtik9ytfwXrrhwWdBxqQOMq2N1pvrIuvShhf8PU,3090
244
247
  uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py,sha256=LtMPM8lj5bfReDR4buHEo-aRC_HTBIeo1nf8GE5-R80,1790
245
248
  uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py,sha256=BZzLmWK_VONOmMpSrLrnKtJaOrrepm6aStfKGVcgf9Y,3487
246
- uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py,sha256=cuoxb1PdKtGvYUvcp2bcj7MWL3r83cOnc66Jx79M3sE,4190
249
+ uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py,sha256=q0zMKJk9lEPFBMShqqcCkhw09cFU-CJPgRYCniL9XXA,5686
247
250
  uk_bin_collection/uk_bin_collection/councils/RunnymedeBoroughCouncil.py,sha256=vmTZfijt9b6sKzRdRwROE94lrMVnqs6kn6tg-xi1jR4,1618
248
251
  uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py,sha256=nWo8xeER71FEbnMTX8W9bcwZNpLEExWzPvgRT7DmcMc,4221
249
252
  uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py,sha256=ZsGnXjoEaOS6U7fI0w7-uqxayAHdNVKsJi2fqIWEls8,3375
@@ -253,6 +256,7 @@ uk_bin_collection/uk_bin_collection/councils/SeftonCouncil.py,sha256=XUEz2li0oHr
253
256
  uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py,sha256=qqrrRaSVm9CYAtm0rB2ZnyH_nLwaReuacoUxZpo597k,4260
254
257
  uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py,sha256=9g9AeiackoWyej9EVlKUzywzAtMuBVD0f93ZryAUha8,2016
255
258
  uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py,sha256=6OIEhJmv-zLJiEo8WaJePA7JuhNRGkh2WohFLhzN8Kk,1477
259
+ uk_bin_collection/uk_bin_collection/councils/SloughBoroughCouncil.py,sha256=B6ksHUgcPns9fRUrPpyTkGGAwqn1DH0rQfS3Ma6Gzrs,5987
256
260
  uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py,sha256=gbTHjbdV46evGfLfF8rxVMQIgNZD-XPHgZeuyje7kGY,1609
257
261
  uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py,sha256=CZJnkCGn4-yH31HH5_ix-8V2_vsjGuKYxgzAPGZdSAw,8480
258
262
  uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py,sha256=03eapeXwxneKI4ccKPSHoviIbhmV1m90I-0WQ_s3KsY,2722
@@ -293,6 +297,7 @@ uk_bin_collection/uk_bin_collection/councils/TeignbridgeCouncil.py,sha256=-NowMN
293
297
  uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py,sha256=p1ZS5R4EGxbEWlRBrkGXgKwE_lkyBT-R60yKFFhVObc,1844
294
298
  uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py,sha256=1_CkpWPTfRUEP5YJ9R4_dJRLtb-O9i83hfWJc1shw_c,4283
295
299
  uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py,sha256=Dtfkyrwt795W7gqFJxVGRR8t3R5WMNQZwTWJckLpZWE,8480
300
+ uk_bin_collection/uk_bin_collection/councils/TewkesburyBoroughCouncil.py,sha256=cSULCQBddk4tfaJZHv7mrNwM4sZkOYJpmlQXlvrZvPk,1396
296
301
  uk_bin_collection/uk_bin_collection/councils/ThanetDistrictCouncil.py,sha256=Cxrf0tUryDL-wFclPH5yovVt8i7Sc7g-ZFrU9_wg6KY,2717
297
302
  uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py,sha256=RHt3e9oeKzwxjjY-M8aC0nk-ZXhHIoyC81JzxkPVxsE,5531
298
303
  uk_bin_collection/uk_bin_collection/councils/ThurrockCouncil.py,sha256=vAZMm6mcsdEcOkP15xwxWy9gdXpmLYQFH7qRifurNoY,2935
@@ -339,8 +344,8 @@ uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py,sha256=I2kBYMlsD4bId
339
344
  uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py,sha256=QD4v4xpsEE0QheR_fGaNOIRMc2FatcUfKkkhAhseyVU,1159
340
345
  uk_bin_collection/uk_bin_collection/create_new_council.py,sha256=m-IhmWmeWQlFsTZC4OxuFvtw5ZtB8EAJHxJTH4O59lQ,1536
341
346
  uk_bin_collection/uk_bin_collection/get_bin_data.py,sha256=YvmHfZqanwrJ8ToGch34x-L-7yPe31nB_x77_Mgl_vo,4545
342
- uk_bin_collection-0.150.1.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
343
- uk_bin_collection-0.150.1.dist-info/METADATA,sha256=5EPNN3fs7XWzZbnRZwzDtpg-L9I_m7TljIQk4ZgjEgc,20914
344
- uk_bin_collection-0.150.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
345
- uk_bin_collection-0.150.1.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
346
- uk_bin_collection-0.150.1.dist-info/RECORD,,
347
+ uk_bin_collection-0.152.0.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
348
+ uk_bin_collection-0.152.0.dist-info/METADATA,sha256=2gnhvjy_Hu9moRYLw5s6ogGMDh1dYkitouNtc5DOOM4,20914
349
+ uk_bin_collection-0.152.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
350
+ uk_bin_collection-0.152.0.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
351
+ uk_bin_collection-0.152.0.dist-info/RECORD,,