uk_bin_collection 0.125.2__py3-none-any.whl → 0.126.1__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.
@@ -1993,8 +1993,8 @@
1993
1993
  "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
1994
1994
  },
1995
1995
  "WestLindseyDistrictCouncil": {
1996
- "house_number": "PRIVATE ACCOMMODATION",
1997
- "postcode": "LN8 2AR",
1996
+ "house_number": "35",
1997
+ "postcode": "LN8 3AX",
1998
1998
  "skip_get_url": true,
1999
1999
  "url": "https://www.west-lindsey.gov.uk/",
2000
2000
  "wiki_name": "West Lindsey District Council",
@@ -5,7 +5,6 @@ import requests
5
5
  from uk_bin_collection.uk_bin_collection.common import *
6
6
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
7
7
 
8
-
9
8
  # import the wonderful Beautiful Soup and the URL grabber
10
9
  class CouncilClass(AbstractGetBinDataClass):
11
10
  """
@@ -21,7 +21,6 @@ class CouncilClass(AbstractGetBinDataClass):
21
21
  """
22
22
 
23
23
  def parse_data(self, page: str, **kwargs) -> dict:
24
- # Make a BS4 object
25
24
  driver = None
26
25
  try:
27
26
  bin_data_dict = {"bins": []}
@@ -76,12 +75,13 @@ class CouncilClass(AbstractGetBinDataClass):
76
75
  # Get the current year
77
76
  current_year = datetime.now().year
78
77
 
78
+ # Append the year to the date
79
+ date_with_year = date_object.replace(year=current_year)
80
+
79
81
  # Check if the parsed date is in the past compared to the current date
80
82
  if date_object < datetime.now():
81
83
  # If the parsed date is in the past, assume it's for the next year
82
84
  current_year += 1
83
- # Append the year to the date
84
- date_with_year = date_object.replace(year=current_year)
85
85
 
86
86
  # Format the date with the year
87
87
  date_with_year_formatted = date_with_year.strftime(
@@ -1,12 +1,17 @@
1
+ import time
1
2
  from datetime import datetime
2
3
  from typing import Optional
3
4
 
5
+ from bs4 import BeautifulSoup
4
6
  from selenium.common import TimeoutException
5
7
  from selenium.webdriver.common.by import By
6
8
  from selenium.webdriver.common.keys import Keys
7
9
  from selenium.webdriver.remote.webdriver import WebDriver
8
10
  from selenium.webdriver.support import expected_conditions as EC
9
11
  from selenium.webdriver.support.wait import WebDriverWait
12
+ from webdriver_manager.drivers.chrome import ChromeDriver
13
+
14
+ from selenium import webdriver
10
15
 
11
16
  from uk_bin_collection.uk_bin_collection.common import create_webdriver
12
17
  from uk_bin_collection.uk_bin_collection.common import date_format
@@ -55,78 +60,84 @@ class CouncilClass(AbstractGetBinDataClass):
55
60
 
56
61
  - Extract info from the 'alt' attribute of the images on that page
57
62
  """
58
- bins = []
63
+ data = {"bins": []}
64
+ collections = []
59
65
 
60
66
  user_paon = kwargs["paon"]
61
67
  user_postcode = kwargs["postcode"]
62
68
 
63
- self._driver = driver = create_webdriver(
64
- web_driver=kwargs["web_driver"],
65
- headless=kwargs.get("headless", True),
66
- session_name=__name__,
67
- )
69
+ self._driver = driver = webdriver.Chrome()
70
+ # self._driver = driver = create_webdriver(
71
+ # web_driver=kwargs["web_driver"],
72
+ # headless=kwargs.get("headless", True),
73
+ # session_name=__name__,
74
+ # )
68
75
  driver.implicitly_wait(1)
69
76
 
70
77
  driver.get(
71
- "https://www.kirklees.gov.uk/beta/your-property-bins-recycling/your-bins/default.aspx"
78
+ "https://my.kirklees.gov.uk/service/Bins_and_recycling___Manage_your_bins"
72
79
  )
73
80
 
74
- wait_for_element(
75
- driver, By.ID, "cphPageBody_cphContent_thisGeoSearch_txtGeoPremises"
76
- )
81
+ time.sleep(5)
82
+
83
+ # Switch to iframe
84
+ iframe = driver.find_element(By.CSS_SELECTOR, "#fillform-frame-1")
85
+ driver.switch_to.frame(iframe)
77
86
 
78
- house_input = driver.find_element(
79
- By.ID, "cphPageBody_cphContent_thisGeoSearch_txtGeoPremises"
87
+ wait_for_element(
88
+ driver, By.ID, "mandatory_Postcode", timeout=10
80
89
  )
81
- house_input.send_keys(user_paon)
82
90
 
83
91
  postcode_input = driver.find_element(
84
- By.ID, "cphPageBody_cphContent_thisGeoSearch_txtGeoSearch"
92
+ By.ID, "Postcode"
85
93
  )
86
94
  postcode_input.send_keys(user_postcode)
87
95
 
88
- # submit address search
89
- driver.find_element(By.ID, "butGeoSearch").send_keys(Keys.RETURN)
96
+ wait_for_element(driver, By.ID, "List")
97
+ time.sleep(2)
98
+
99
+ WebDriverWait(driver, 10).until(
100
+ EC.element_to_be_clickable(
101
+ (
102
+ By.XPATH,
103
+ "//select[@name='List']//option[contains(., '"
104
+ + user_paon
105
+ + "')]",
106
+ )
107
+ )
108
+ ).click()
90
109
 
91
- wait_for_element(
92
- driver,
93
- By.ID,
94
- "cphPageBody_cphContent_wtcDomestic240__lnkAccordionAnchor",
95
- # submitting can be slow
96
- timeout=30,
97
- )
110
+ time.sleep(10)
98
111
 
99
- # Open the panel
100
- driver.find_element(
101
- By.ID, "cphPageBody_cphContent_wtcDomestic240__lnkAccordionAnchor"
102
- ).click()
112
+ # For whatever reason, the page sometimes automatically goes to the next step
113
+ next_button = driver.find_element(By.XPATH, '/html/body/div/div/section/form/div/nav/div[2]/button')
114
+ if next_button.is_displayed():
115
+ next_button.click()
103
116
 
104
- # Domestic waste calendar
105
- wait_for_element(
106
- driver, By.ID, "cphPageBody_cphContent_wtcDomestic240__LnkCalendar"
107
- )
108
- calendar_link = driver.find_element(
109
- By.ID, "cphPageBody_cphContent_wtcDomestic240__LnkCalendar"
110
- )
111
- driver.execute_script("arguments[0].click();", calendar_link)
112
117
 
113
- # <img alt="Recycling collection date 14 March 2024"
114
- # <img alt="Domestic collection date 21 March 2024
115
- date_strings = driver.find_elements(
116
- By.CSS_SELECTOR, 'img[alt*="collection date"]'
117
- )
118
+ time.sleep(5)
118
119
 
119
- for date in date_strings:
120
- bin_type, _, _, day, month, year = date.get_attribute("alt").split()
121
- collection_date = datetime.strptime(
122
- f"{day} {month} {year}", "%d %B %Y"
123
- ).strftime(date_format)
124
-
125
- bins.append(
126
- {
127
- "type": bin_type,
128
- "collectionDate": collection_date,
129
- }
130
- )
120
+ soup = BeautifulSoup(self._driver.page_source, features="html.parser")
121
+ soup.prettify()
122
+
123
+ radio_button_text = soup.find_all("label", {"class": "radio-label"})
124
+ for label in radio_button_text:
125
+ parsed_text = label.text.split("x ")
126
+ row = parsed_text[1].lower().split("collection date: ")
127
+ bin_type = row[0].split("(")[0].strip()
128
+ date_text = row[1].strip().replace(")", "")
129
+ if date_text == "today":
130
+ bin_date = datetime.now()
131
+ else:
132
+ bin_date = datetime.strptime(date_text, "%A %d %B %Y")
133
+ collections.append((bin_type, bin_date))
134
+
135
+ ordered_data = sorted(collections, key=lambda x: x[1])
136
+ for item in ordered_data:
137
+ dict_data = {
138
+ "type": item[0].replace("standard ", "").capitalize(),
139
+ "collectionDate": item[1].strftime(date_format),
140
+ }
141
+ data["bins"].append(dict_data)
131
142
 
132
- return {"bins": bins}
143
+ return data
@@ -48,15 +48,13 @@ class CouncilClass(AbstractGetBinDataClass):
48
48
  alternateCheck = False
49
49
 
50
50
  strong = soup.find_all("strong")
51
+ collections = []
51
52
 
52
53
  if alternateCheck:
53
54
  bin_types = strong[2].text.strip().replace(".", "").split(" and ")
54
55
  for bin in bin_types:
55
- dict_data = {
56
- "type": bin,
57
- "collectionDate": strong[1].text.strip(),
58
- }
59
- bindata["bins"].append(dict_data)
56
+ collections.append((bin.capitalize(), datetime.strptime(strong[1].text.strip(), date_format)))
57
+
60
58
  else:
61
59
  p_tag = soup.find_all("p")
62
60
  i = 1
@@ -65,11 +63,18 @@ class CouncilClass(AbstractGetBinDataClass):
65
63
  p.text.split("Your ")[1].split(" is collected")[0].split(" and ")
66
64
  )
67
65
  for bin in bin_types:
68
- dict_data = {
69
- "type": bin,
70
- "collectionDate": strong[i].text.strip(),
71
- }
72
- bindata["bins"].append(dict_data)
66
+ collections.append((bin.capitalize(), datetime.strptime(strong[1].text.strip(), date_format)))
73
67
  i += 2
74
68
 
69
+ if len(strong) > 3:
70
+ collections.append(("Garden", datetime.strptime(strong[4].text.strip(), date_format)))
71
+
72
+ ordered_data = sorted(collections, key=lambda x: x[1])
73
+ for item in ordered_data:
74
+ dict_data = {
75
+ "type": item[0] + " bin",
76
+ "collectionDate": item[1].strftime(date_format),
77
+ }
78
+ bindata["bins"].append(dict_data)
79
+
75
80
  return bindata
@@ -13,11 +13,6 @@ class CouncilClass(AbstractGetBinDataClass):
13
13
 
14
14
  def parse_data(self, page: str, **kwargs) -> dict:
15
15
  data = {"bins": []}
16
- bin_types = {
17
- "240L RUBBISH BIN": "Black bin",
18
- "240L GARDEN BIN": "Green bin",
19
- "180L RECYCLING BIN": "Blue lid bin",
20
- }
21
16
  collections = []
22
17
 
23
18
  user_postcode = kwargs.get("postcode")
@@ -73,7 +68,8 @@ class CouncilClass(AbstractGetBinDataClass):
73
68
 
74
69
  for row in table_rows:
75
70
  row_text = row.text.strip().split("\n")
76
- bin_type = bin_types.get(row_text[0])
71
+ bin_text = row_text[0].split(" ")
72
+ bin_type = ' '.join(bin_text[1:]).capitalize()
77
73
  collections.append(
78
74
  (bin_type, datetime.strptime(row_text[1], "%A %d %b %Y"))
79
75
  )
@@ -6,8 +6,18 @@ from selenium.webdriver.support.wait import WebDriverWait
6
6
  from uk_bin_collection.uk_bin_collection.common import *
7
7
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
8
8
 
9
- # import the wonderful Beautiful Soup and the URL grabber
10
9
 
10
+ def parse_collection_date(date_string) -> datetime:
11
+ now = datetime.now()
12
+ if date_string == "is due today":
13
+ return now
14
+
15
+ parsed_date = datetime.strptime(date_string, "%A, %d %B").replace(year=now.year)
16
+
17
+ if now.month == 12 and parsed_date.month < 12:
18
+ parsed_date = parsed_date.replace(year=(now.year + 1))
19
+
20
+ return parsed_date
11
21
 
12
22
  class CouncilClass(AbstractGetBinDataClass):
13
23
  """
@@ -28,21 +28,25 @@ class CouncilClass(AbstractGetBinDataClass):
28
28
  response = requests.get(URI, headers=headers)
29
29
 
30
30
  soup = BeautifulSoup(response.text, "html.parser")
31
- # Extract links to collection shedule pages and iterate through the pages
32
- schedule_links = soup.findAll("a", {"class": "nav-link"}, href=True)
31
+ # Extract links to collection schedule pages and iterate through the pages
32
+ schedule_links = soup.findAll("td")
33
+
33
34
  for item in schedule_links:
34
- if "roundname" in item["href"]:
35
+ if "roundname" in item.contents[1]["href"]:
35
36
  # get bin colour
36
- bincolour = item["href"].split("=")[-1].split("%")[0].upper()
37
- binURL = "https://cag.walsall.gov.uk" + item["href"]
38
- r = requests.get(binURL, headers=headers)
37
+ bin_colour = item.contents[1]["href"].split("=")[-1].split("%")[0].upper()
38
+ bin_url = "https://cag.walsall.gov.uk" + item.contents[1]["href"]
39
+ r = requests.get(bin_url, headers=headers)
40
+ if r.status_code != 200:
41
+ print(f"Collection details for {bin_colour.lower()} bin could not be retrieved.")
42
+ break
39
43
  soup = BeautifulSoup(r.text, "html.parser")
40
44
  table = soup.findAll("tr")
41
45
  for tr in table:
42
46
  td = tr.findAll("td")
43
47
  if td:
44
48
  dict_data = {
45
- "type": bincolour,
49
+ "type": bin_colour.capitalize() + " bin",
46
50
  "collectionDate": datetime.strptime(
47
51
  td[1].text.strip(), "%d/%m/%Y"
48
52
  ).strftime("%d/%m/%Y"),
@@ -50,7 +54,7 @@ class CouncilClass(AbstractGetBinDataClass):
50
54
  bindata["bins"].append(dict_data)
51
55
 
52
56
  bindata["bins"].sort(
53
- key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
57
+ key=lambda x: datetime.strptime(x.get("collectionDate"), date_format)
54
58
  )
55
59
 
56
60
  return bindata
@@ -99,7 +99,7 @@ class CouncilClass(AbstractGetBinDataClass):
99
99
  ).replace(year=datetime.now().year)
100
100
 
101
101
  food_div = soup.find(
102
- "div", {"id": "FINDYOURBINDAYS_RECYCLINGDATE_OUTERDIV"}
102
+ "div", {"id": "FINDYOURBINDAYS_FOODWASTEDATE_OUTERDIV"}
103
103
  )
104
104
  food_date = food_div.find_all("div")[2]
105
105
  if food_date.text == "Today":
@@ -32,7 +32,7 @@ class CouncilClass(AbstractGetBinDataClass):
32
32
 
33
33
  # Strip data and parse the JSON
34
34
  address_data = json.loads(
35
- re.sub("getAddressesCallback\d+\(", "", address_data)[:-2]
35
+ re.sub(r"getAddressesCallback\d+\(", "", address_data)[:-2]
36
36
  )
37
37
 
38
38
  if address_data["TotalHits"] == 0:
@@ -48,9 +48,7 @@ class CouncilClass(AbstractGetBinDataClass):
48
48
  address_x = address_data["Locations"][0]["X"]
49
49
  address_y = address_data["Locations"][0]["Y"]
50
50
 
51
- stage2_url = "https://wlnk.statmap.co.uk/map/Cluster.svc/getpage?script=\Cluster\Cluster.AuroraScript$&taskId=bins&format=js&updateOnly=true&query=x%3D{}%3By%3D{}%3Bid%3D{}".format(
52
- address_x, address_y, address_id
53
- )
51
+ stage2_url = fr"https://wlnk.statmap.co.uk/map/Cluster.svc/getpage?script=\Cluster\Cluster.AuroraScript$&taskId=bins&format=js&updateOnly=true&query=x%3D{address_x}%3By%3D{address_y}%3Bid%3D{address_id}"
54
52
 
55
53
  bin_query = requests.get(stage2_url).text
56
54
 
@@ -61,7 +59,7 @@ class CouncilClass(AbstractGetBinDataClass):
61
59
  )
62
60
 
63
61
  # Return only the HTML contained within the Javascript function payload.
64
- pattern = 'document\.getElementById\("DR1"\)\.innerHTML="(.+)";'
62
+ pattern = r'document\.getElementById\("DR1"\)\.innerHTML="(.+)";'
65
63
 
66
64
  bin_html = re.findall(pattern, bin_query)
67
65
 
@@ -86,19 +84,20 @@ class CouncilClass(AbstractGetBinDataClass):
86
84
 
87
85
  # Get bin date
88
86
  bin_date_text = row.text
89
- pattern = "\d+\/\d+"
87
+ pattern = r"\d+\/\d+"
90
88
  bin_dates = re.findall(pattern, bin_date_text)
91
89
 
92
90
  for bin_date in bin_dates:
93
91
  # Split the bin date into day and month and build a full date with the current year
94
92
  split_date = bin_date.split("/")
93
+ if len(split_date[0]) < 1:
94
+ raise ValueError("Error parsing dates retrieved from website")
95
95
  full_date = datetime(
96
96
  datetime.now().year, int(split_date[1]), int(split_date[0])
97
97
  )
98
-
99
98
  # If the current month is December and one of the next collections is in January, increment the year
100
- if datetime.now().month == 12 and int(split_date[1]) == 1:
101
- full_date = bin_date + relativedelta(years=1)
99
+ if datetime.now().month == 12 and int(split_date[1]) < 12:
100
+ full_date = datetime(year=datetime.now().year + 1, month=int(split_date[1]), day=int(split_date[0]))
102
101
 
103
102
  # Since data in unordered, add to a tuple
104
103
  collections.append((bin_type.title(), full_date))
@@ -116,3 +115,4 @@ class CouncilClass(AbstractGetBinDataClass):
116
115
  data["bins"].append(dict_data)
117
116
 
118
117
  return data
118
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uk_bin_collection
3
- Version: 0.125.2
3
+ Version: 0.126.1
4
4
  Summary: Python Lib to collect UK Bin Data
5
5
  Author: Robert Bradley
6
6
  Author-email: robbrad182@gmail.com
@@ -115,7 +115,7 @@ If you miss this on the first setup you can reconfigure it.
115
115
  "color": "blue"
116
116
  }
117
117
  }
118
-
118
+ ```
119
119
  ---
120
120
 
121
121
  ## Standalone Usage
@@ -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=qDLpDG3LuoOhCLAevSKI4FrALTaLu6IHzmiAv827Jqk,112991
5
+ uk_bin_collection/tests/input.json,sha256=sx_MqqcCdD9-P6RKcn9Ekxi4EjRtFnr-vg5j3rts-lo,112972
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
@@ -12,7 +12,7 @@ uk_bin_collection/tests/test_conftest.py,sha256=qI_zgGjNOnwE9gmZUiuirL1SYz3TFw5y
12
12
  uk_bin_collection/tests/test_get_data.py,sha256=sFJz_Fd6o-1r2gdmzY52JGwVi0Of_mDzvYSoc7a3RUw,7239
13
13
  uk_bin_collection/uk_bin_collection/collect_data.py,sha256=dB7wWXsJX4fm5bIf84lexkvHIcO54CZ3JPxqmS-60YY,4654
14
14
  uk_bin_collection/uk_bin_collection/common.py,sha256=Wj6o2NaxYDE1lkpYzMFDIZiPARX0K3xmt-5bnt2kjSI,10970
15
- uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py,sha256=Je8VwVLK9KnYl9vqf2gWJ7ZYDgUq3A7caDiIzk5Xof8,4194
15
+ uk_bin_collection/uk_bin_collection/councils/AberdeenCityCouncil.py,sha256=1IV0qSSM5EcxsxcTwXnEdTmIUdzL_Xg4F5RYC_us4XE,4193
16
16
  uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py,sha256=aO1CSdyqa8oAD0fB79y1Q9bikAWCP_JFa7CsyTa2j9s,1655
17
17
  uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py,sha256=ppbrmm-MzB1wOulK--CU_0j4P-djNf3ozMhHnmQFqLo,1511
18
18
  uk_bin_collection/uk_bin_collection/councils/AntrimAndNewtonabbeyCouncil.py,sha256=Hp5pteaC5RjL5ZqPZ564S9WQ6ZTKLMO6Dl_fxip2TUc,1653
@@ -45,7 +45,7 @@ uk_bin_collection/uk_bin_collection/councils/BraintreeDistrictCouncil.py,sha256=
45
45
  uk_bin_collection/uk_bin_collection/councils/BrecklandCouncil.py,sha256=PX6A_pDvaN109aSNWmEhm88GFKfkClIkmbwGURWvsks,1744
46
46
  uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py,sha256=k6qt4cds-Ejd97Z-__pw2BYvGVbFdc9SUfF73PPrTNA,5823
47
47
  uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py,sha256=kJmmDJz_kQ45DHmG7ocrUpNJonEn0kuXYEDQyZaf9ks,5576
48
- uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py,sha256=_bAFykZWZkEVUB-QKeVLfWO8plG6nRgn71QF2BUN2rk,4329
48
+ uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py,sha256=dii85JLmYU1uMidCEsWVo3stTcq_QqyC65DxG8u1UmE,4302
49
49
  uk_bin_collection/uk_bin_collection/councils/BromsgroveDistrictCouncil.py,sha256=PUfxP8j5Oh9wFHkdjbrJzQli9UzMHZzwrZ2hkThrvhI,1781
50
50
  uk_bin_collection/uk_bin_collection/councils/BroxbourneCouncil.py,sha256=NR1FoxLF0Ne61cJJmlVJhGfxjZ2sj60aLlOHBWWxtrM,2921
51
51
  uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py,sha256=-Facq-ToQkcWUePpKBwq90LZUFxgUSydNL2sYaLX4yw,4473
@@ -131,7 +131,7 @@ uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py,sha256
131
131
  uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py,sha256=xavzL6ZIU9DG8Xro3vN0CEnYmNU31OGnOvnq78wgpQc,1258
132
132
  uk_bin_collection/uk_bin_collection/councils/KingsLynnandWestNorfolkBC.py,sha256=Shj18R-7NW4ivqJJFVJOLmf-EeN6hXP2Of30oI-SeAQ,1932
133
133
  uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py,sha256=iZ7njIxccCGBhUUWWd9Azh7cxUAKaofebCm3lo-TuxA,3543
134
- uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py,sha256=gtAtM6FappSZ0-BKid7_pnSrnqPPjHn_UYWqMg9wQlM,4499
134
+ uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py,sha256=RnxwjkTfdMGZEdBwkUUxTVLAIEOKGnaHDkqWEUbk1Xk,4802
135
135
  uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py,sha256=VdlWDESoHfr_X0r8-UMaLMUQhKZOa2BnpVPkX-1u3EQ,5605
136
136
  uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py,sha256=FmHT6oyD4BwWuhxA80PHnGA7HPrLuyjP_54Cg8hT6k4,2537
137
137
  uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py,sha256=iSZApZ9oSfSatQ6dAxmykSfti91jGuY6n2BwEkVMOiU,5144
@@ -183,7 +183,7 @@ uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py,sha256=MHfc
183
183
  uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py,sha256=gJj0dyQc5QUefqusKGk2LLXfWbG5tlEXUOh8KAPh3RI,4584
184
184
  uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py,sha256=2wTrr3VrZDp9-YtDPmWd649gXeWH4hbm2-Hw8Vau5Xs,1933
185
185
  uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py,sha256=KEFsxEvQ159fkuFo-fza67YCnnCZ5ElwE80zTrqDEWI,4990
186
- uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py,sha256=At-9dEcKBUZSrtJ2RncwvMnV0OVU3pE6kxEYbLL-Av8,2437
186
+ uk_bin_collection/uk_bin_collection/councils/NorwichCityCouncil.py,sha256=6w5-xKiyxTlJLaCkwUnAWjd5jnohonnNRr0sTlfACvk,2702
187
187
  uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py,sha256=panTCjnsBOQ98-TBO9xVZk_jcT_gjMhx3Gg5oWxBRLo,1254
188
188
  uk_bin_collection/uk_bin_collection/councils/NuneatonBedworthBoroughCouncil.py,sha256=KqjQczn214ctkTsm-zimlDSDtgvcLQ23fte3kHiCEsg,19187
189
189
  uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py,sha256=9dlesCxNoVXlmQaqZj7QFh00smnJbm1Gnjkr_Uvzurs,1771
@@ -203,7 +203,7 @@ uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py,sha256=rfhD66A9H
203
203
  uk_bin_collection/uk_bin_collection/councils/RotherDistrictCouncil.py,sha256=-fdLvtik9ytfwXrrhwWdBxqQOMq2N1pvrIuvShhf8PU,3090
204
204
  uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py,sha256=LtMPM8lj5bfReDR4buHEo-aRC_HTBIeo1nf8GE5-R80,1790
205
205
  uk_bin_collection/uk_bin_collection/councils/RoyalBoroughofGreenwich.py,sha256=BZzLmWK_VONOmMpSrLrnKtJaOrrepm6aStfKGVcgf9Y,3487
206
- uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py,sha256=a5ySLmFvvY56QMA7-bk6MVBxRp5tPBIBg4navH0eYas,4306
206
+ uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py,sha256=qwyi2K1p1erSawthC1QD1_oYghLfXFlXMdClszZTitU,4190
207
207
  uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py,sha256=wMtiYRirT585vtsEOIyXHugk7aEj3pvyVWBaAePdqtE,4005
208
208
  uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py,sha256=ZsGnXjoEaOS6U7fI0w7-uqxayAHdNVKsJi2fqIWEls8,3375
209
209
  uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py,sha256=XUGemp2cdzsvkWjnv2m4YKTMcoKDUfIlVy3YucX-_o4,2601
@@ -238,7 +238,7 @@ uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py,sha256=K
238
238
  uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py,sha256=DMTAcXT_lay8Cl1hBbzf_LN7-GwTDGxT3Ug9QJkaF9Y,3936
239
239
  uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py,sha256=9bYWppi7ViLGHL4VEg--nFn28MLYJYbiEntull1uZxU,3561
240
240
  uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py,sha256=4DnKyyu56_AwuchD6_oL1dvpDStMvkkxQtYN79rUKOs,3825
241
- uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py,sha256=wxoUAaeng1pf9nJ3Q12Xthcz0_LoS7SI86y0Hfv8hsM,4107
241
+ uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py,sha256=LNewGYrRHPforrsyZO7EaAy7Wx7VXi3I_tZ0SO9VcAA,4408
242
242
  uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py,sha256=nmVPoPhnFgVi--vczX2i4Sf3bqM5RWJuwfhioRUr5XE,2303
243
243
  uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py,sha256=lSIykpkBjVwQSf3rrnrNuh7YRepgnkKQLbf1iErMuJs,1932
244
244
  uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py,sha256=k2TAAZG7n2S1BWVyxbE_-4-lZuzhOimCNz4yimUCOGk,1995
@@ -258,7 +258,7 @@ uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py,sha256
258
258
  uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py,sha256=Phgb_ECiUOOkqOx6OsfsTHMCW5VQfRmOC2zgYIQhuZA,5044
259
259
  uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py,sha256=KBKGHcWAdPC_8-CfKnLOdP7Ww6RIvlxLIJGqBsq_77g,4208
260
260
  uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py,sha256=vRfIU0Uloi1bgXqjOCpdb-EQ4oY-aismcANZRwOIFkc,4914
261
- uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py,sha256=_anovUnXMr40lZLHyX3opIP73BwauCllKy-Z2SBrzPw,2076
261
+ uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py,sha256=wv-M3zZj0E6EIPoVB9AF_NCg_8XGM9uhqGa-F5yzoc4,2277
262
262
  uk_bin_collection/uk_bin_collection/councils/WalthamForest.py,sha256=P7MMw0EhpRmDbbnHb25tY5_yvYuZUFwJ1br4TOv24sY,4997
263
263
  uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py,sha256=aQoJpC7YkhKewQyZlsv5m4__2IPoKRsOrPxjNH5xRNo,2594
264
264
  uk_bin_collection/uk_bin_collection/councils/WarringtonBoroughCouncil.py,sha256=AB9mrV1v4pKKhfsBS8MpjO8XXBifqojSk53J9Q74Guk,1583
@@ -267,9 +267,9 @@ uk_bin_collection/uk_bin_collection/councils/WatfordBoroughCouncil.py,sha256=zFk
267
267
  uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py,sha256=tp9l7vdgSGRzNNG0pDfnNuFj4D2bpRJUJmAiTJ6bM0g,4662
268
268
  uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py,sha256=SvSSaLkx7iJjzypAwKkaJwegXkSsIQtUOS2V605kz1A,3368
269
269
  uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py,sha256=ikUft37dYNJghfe-_6Fskiq1JihqpLmLNj38QkKSUUA,2316
270
- uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py,sha256=2eHRlalZyY9jv_UsCWM9IYzOpRdhce2sEW5NtygEnpw,5513
270
+ uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py,sha256=pTNiyR4WoGdRnYPdMhv0T4ArVm5Blz82QBY1pSGh6eI,5513
271
271
  uk_bin_collection/uk_bin_collection/councils/WestLancashireBoroughCouncil.py,sha256=iohI2NZSjsEnCpSGsCPZFC2EQZL5pyzcb9Ng_H0tMUE,4718
272
- uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py,sha256=JFWUy4w0CKulGq16PfbRDKAdQEbokVEuabwlZYigdEU,4606
272
+ uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py,sha256=ip7HWKl2ysHHwGbn4nZMQWfMSwq9eh-5DWO_Hjb7It0,4757
273
273
  uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py,sha256=dq0jimtARvRkZiGbVFrXXZgY-BODtz3uYZ5UKn0bf64,4114
274
274
  uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py,sha256=jbqV3460rn9D0yTBGWjpSe1IvWWcdGur5pzgj-hJcQ4,2513
275
275
  uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py,sha256=Se3Cfn_6ADjhsUzEJI_JnGkVcIbXxSTferM4ZC6pZ0g,1166
@@ -291,8 +291,8 @@ uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py,sha256=I2kBYMlsD4bId
291
291
  uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py,sha256=EQWRhZ2pEejlvm0fPyOTsOHKvUZmPnxEYO_OWRGKTjs,1158
292
292
  uk_bin_collection/uk_bin_collection/create_new_council.py,sha256=m-IhmWmeWQlFsTZC4OxuFvtw5ZtB8EAJHxJTH4O59lQ,1536
293
293
  uk_bin_collection/uk_bin_collection/get_bin_data.py,sha256=YvmHfZqanwrJ8ToGch34x-L-7yPe31nB_x77_Mgl_vo,4545
294
- uk_bin_collection-0.125.2.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
295
- uk_bin_collection-0.125.2.dist-info/METADATA,sha256=-fpzqm_FA4UI5qXtYQXDsja8MwWClVCbdA-n-3SaC0E,17742
296
- uk_bin_collection-0.125.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
297
- uk_bin_collection-0.125.2.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
298
- uk_bin_collection-0.125.2.dist-info/RECORD,,
294
+ uk_bin_collection-0.126.1.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
295
+ uk_bin_collection-0.126.1.dist-info/METADATA,sha256=fN8jdX3P00t50rKftM6CEXIrAps_JOUb9Mrb89TL9Rk,17745
296
+ uk_bin_collection-0.126.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
297
+ uk_bin_collection-0.126.1.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
298
+ uk_bin_collection-0.126.1.dist-info/RECORD,,