uk_bin_collection 0.125.2__py3-none-any.whl → 0.126.1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of uk_bin_collection might be problematic. Click here for more details.

@@ -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,,