uk_bin_collection 0.135.4__py3-none-any.whl → 0.136.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.
@@ -162,11 +162,10 @@
162
162
  "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
163
163
  },
164
164
  "BexleyCouncil": {
165
- "house_number": "1 Dorchester Avenue, Bexley",
165
+ "house_number": "1",
166
166
  "postcode": "DA5 3AH",
167
167
  "skip_get_url": true,
168
- "uprn": "100020196143",
169
- "url": "https://mybexley.bexley.gov.uk/service/When_is_my_collection_day",
168
+ "url": "https://waste.bexley.gov.uk/waste",
170
169
  "web_driver": "http://selenium:4444",
171
170
  "wiki_name": "Bexley Council",
172
171
  "wiki_note": "In order to use this parser, you will need to sign up to [Bexley's @Home app](https://www.bexley.gov.uk/services/rubbish-and-recycling/bexley-home-recycling-app/about-app). Complete the setup by entering your email and setting your address with postcode and address line. Once you can see the calendar, you should be good to run the parser. Just pass the email you used in quotes in the UPRN parameter."
@@ -345,6 +344,12 @@
345
344
  "wiki_name": "Calderdale Council",
346
345
  "wiki_note": "Pass the UPRN and postcode. To get the UPRN, you can use [FindMyAddress](https://www.findmyaddress.co.uk/search)."
347
346
  },
347
+ "CambridgeCityCouncil": {
348
+ "uprn": "200004159750",
349
+ "url": "https://www.cambridge.gov.uk/",
350
+ "wiki_name": "Cambridge City Council",
351
+ "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
352
+ },
348
353
  "CannockChaseDistrictCouncil": {
349
354
  "postcode": "WS15 1JA",
350
355
  "skip_get_url": true,
@@ -1647,6 +1652,13 @@
1647
1652
  "wiki_name": "Somerset Council",
1648
1653
  "wiki_note": "Provide your UPRN and postcode. Find your UPRN using [FindMyAddress](https://www.findmyaddress.co.uk/search)."
1649
1654
  },
1655
+ "SouthamptonCityCouncil": {
1656
+ "skip_get_url": true,
1657
+ "uprn": "100060731893",
1658
+ "url": "https://www.southampton.gov.uk",
1659
+ "wiki_name": "Southampton City Council",
1660
+ "wiki_note": "Pass the UPRN. You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search)."
1661
+ },
1650
1662
  "SouthAyrshireCouncil": {
1651
1663
  "postcode": "KA19 7BN",
1652
1664
  "skip_get_url": true,
@@ -1740,6 +1752,13 @@
1740
1752
  "wiki_name": "Southwark Council",
1741
1753
  "wiki_note": "Replace `XXXXXXXX` with your UPRN. Use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN."
1742
1754
  },
1755
+ "SpelthorneBoroughCouncil": {
1756
+ "house_number": "1",
1757
+ "postcode": "TW18 2PR",
1758
+ "skip_get_url": true,
1759
+ "url": "https://www.spelthorne.gov.uk",
1760
+ "wiki_name": "Spelthorne Borough Council"
1761
+ },
1743
1762
  "StAlbansCityAndDistrictCouncil": {
1744
1763
  "skip_get_url": true,
1745
1764
  "uprn": "100081153583",
@@ -0,0 +1,61 @@
1
+ import time
2
+
3
+ import requests
4
+
5
+ from uk_bin_collection.uk_bin_collection.common import *
6
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
7
+
8
+
9
+ # import the wonderful Beautiful Soup and the URL grabber
10
+ class CouncilClass(AbstractGetBinDataClass):
11
+ """
12
+ Concrete classes have to implement all abstract operations of the
13
+ base class. They can also override some operations with a default
14
+ implementation.
15
+ """
16
+
17
+ def parse_data(self, page: str, **kwargs) -> dict:
18
+
19
+ user_uprn = kwargs.get("uprn")
20
+ check_uprn(user_uprn)
21
+ bindata = {"bins": []}
22
+
23
+ URI = f"https://servicelayer3c.azure-api.net/wastecalendar/collection/search/{user_uprn}/?authority=CCC/?numberOfCollections=255"
24
+
25
+ # Make the GET request
26
+ response = requests.get(URI)
27
+
28
+ # Parse the JSON response
29
+ bin_collection = response.json()
30
+
31
+ # Loop through each collection in bin_collection
32
+ for collection in bin_collection["collections"]:
33
+ bin_types = collection["roundTypes"]
34
+ collection_date = collection["date"]
35
+
36
+ # Loop through the dates for each collection type
37
+ for bin_type in bin_types:
38
+ # print(f"Bin Type: {bin_type}")
39
+ # print(f"Collection Date: {collection_date}")
40
+
41
+ if bin_type == "ORGANIC":
42
+ bin_type = "Green Bin"
43
+ if bin_type == "RECYCLE":
44
+ bin_type = "Blue Bin"
45
+ if bin_type == "DOMESTIC":
46
+ bin_type = "Black Bin"
47
+
48
+ dict_data = {
49
+ "type": bin_type,
50
+ "collectionDate": datetime.strptime(
51
+ collection_date,
52
+ "%Y-%m-%dT%H:%M:%SZ",
53
+ ).strftime("%d/%m/%Y"),
54
+ }
55
+ bindata["bins"].append(dict_data)
56
+
57
+ bindata["bins"].sort(
58
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
59
+ )
60
+
61
+ return bindata
@@ -22,12 +22,17 @@ class CouncilClass(AbstractGetBinDataClass):
22
22
 
23
23
  data = {"uprn": user_uprn, "usrn": "1"}
24
24
 
25
+ headers = {
26
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
27
+ "Accept": "application/json",
28
+ }
29
+
25
30
  URI = (
26
31
  "https://zbr7r13ke2.execute-api.eu-west-2.amazonaws.com/Beta/get-bin-dates"
27
32
  )
28
33
 
29
34
  # Make the GET request
30
- response = requests.post(URI, json=data)
35
+ response = requests.post(URI, json=data, headers=headers)
31
36
  response.raise_for_status()
32
37
 
33
38
  # Parse the JSON response
@@ -1,4 +1,5 @@
1
1
  from bs4 import BeautifulSoup
2
+
2
3
  from uk_bin_collection.uk_bin_collection.common import *
3
4
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
4
5
 
@@ -25,7 +26,7 @@ class CouncilClass(AbstractGetBinDataClass):
25
26
  uprn = kwargs.get("uprn")
26
27
  check_uprn(uprn)
27
28
 
28
- post_url = "https://apps.castlepoint.gov.uk/cpapps/index.cfm?fa=wastecalendar.displayDetails"
29
+ post_url = "https://apps.castlepoint.gov.uk/cpapps/index.cfm?fa=myStreet.displayDetails"
29
30
  post_header_str = (
30
31
  "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,"
31
32
  "image/apng,"
@@ -41,7 +42,7 @@ class CouncilClass(AbstractGetBinDataClass):
41
42
  )
42
43
 
43
44
  post_headers = parse_header(post_header_str)
44
- form_data = {"roadID": uprn}
45
+ form_data = {"USRN": uprn}
45
46
  post_response = requests.post(
46
47
  post_url, headers=post_headers, data=form_data, verify=False
47
48
  )
@@ -53,36 +54,28 @@ class CouncilClass(AbstractGetBinDataClass):
53
54
  data = {"bins": []}
54
55
  collection_tuple = []
55
56
 
56
- for i in range(1, 3):
57
- calendar = soup.select(
58
- f"#wasteCalendarContainer > div:nth-child(2) > div:nth-child({i}) > div"
59
- )[0]
60
- month = datetime.strptime(
61
- calendar.find_next("h2").get_text(), "%B %Y"
62
- ).strftime("%m")
63
- year = datetime.strptime(
64
- calendar.find_next("h2").get_text(), "%B %Y"
65
- ).strftime("%Y")
66
-
67
- pink_days = [
68
- day.get_text().strip() for day in calendar.find_all("td", class_="pink")
69
- ]
70
- black_days = [
71
- day.get_text().strip()
72
- for day in calendar.find_all("td", class_="normal")
73
- ]
74
-
75
- for day in pink_days:
76
- collection_date = datetime(
77
- year=int(year), month=int(month), day=int(day)
78
- )
79
- collection_tuple.append(("Pink collection", collection_date))
80
-
81
- for day in black_days:
82
- collection_date = datetime(
83
- year=int(year), month=int(month), day=int(day)
84
- )
85
- collection_tuple.append(("Normal collection", collection_date))
57
+ calendar = soup.find("table", class_="calendar")
58
+ month = datetime.strptime(
59
+ soup.find("div", class_="calMonthCurrent").get_text(), "[%b]"
60
+ ).strftime("%m")
61
+ year = datetime.strptime(
62
+ soup.find("h1").get_text(), "About my Street - %B %Y"
63
+ ).strftime("%Y")
64
+
65
+ pink_days = [
66
+ day.get_text().strip() for day in calendar.find_all("td", class_="pink")
67
+ ]
68
+ black_days = [
69
+ day.get_text().strip() for day in calendar.find_all("td", class_="normal")
70
+ ]
71
+
72
+ for day in pink_days:
73
+ collection_date = datetime(year=int(year), month=int(month), day=int(day))
74
+ collection_tuple.append(("Pink collection", collection_date))
75
+
76
+ for day in black_days:
77
+ collection_date = datetime(year=int(year), month=int(month), day=int(day))
78
+ collection_tuple.append(("Normal collection", collection_date))
86
79
 
87
80
  ordered_data = sorted(collection_tuple, key=lambda x: x[1])
88
81
 
@@ -16,6 +16,7 @@ class CouncilClass(AbstractGetBinDataClass):
16
16
  def parse_data(self, page: str, **kwargs) -> dict:
17
17
 
18
18
  user_uprn = kwargs.get("uprn")
19
+ user_uprn = str(user_uprn).zfill(12)
19
20
  check_uprn(user_uprn)
20
21
  bindata = {"bins": []}
21
22
 
@@ -0,0 +1,52 @@
1
+ import time
2
+
3
+ import requests
4
+
5
+ from uk_bin_collection.uk_bin_collection.common import *
6
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
7
+
8
+
9
+ # import the wonderful Beautiful Soup and the URL grabber
10
+ class CouncilClass(AbstractGetBinDataClass):
11
+ """
12
+ Concrete classes have to implement all abstract operations of the
13
+ base class. They can also override some operations with a default
14
+ implementation.
15
+ """
16
+
17
+ def parse_data(self, page: str, **kwargs) -> dict:
18
+
19
+ user_uprn = kwargs.get("uprn")
20
+ check_uprn(user_uprn)
21
+ bindata = {"bins": []}
22
+
23
+ REGEX = r"(Glass|Recycling|General Waste|Garden Waste).*?([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4})"
24
+
25
+ s = requests.Session()
26
+ r = s.get(
27
+ f"https://www.southampton.gov.uk/whereilive/waste-calendar?UPRN={user_uprn}"
28
+ )
29
+ r.raise_for_status()
30
+
31
+ # Limit search scope to avoid duplicates
32
+ calendar_view_only = re.search(
33
+ r"#calendar1.*?listView", r.text, flags=re.DOTALL
34
+ )[0]
35
+
36
+ results = re.findall(REGEX, calendar_view_only)
37
+
38
+ for item in results:
39
+
40
+ dict_data = {
41
+ "type": item[0],
42
+ "collectionDate": datetime.strptime(item[1], "%m/%d/%Y").strftime(
43
+ "%d/%m/%Y"
44
+ ),
45
+ }
46
+ bindata["bins"].append(dict_data)
47
+
48
+ bindata["bins"].sort(
49
+ key=lambda x: datetime.strptime(x.get("collectionDate"), "%d/%m/%Y")
50
+ )
51
+
52
+ return bindata
@@ -0,0 +1,161 @@
1
+ import time
2
+
3
+ import requests
4
+ from dateutil.relativedelta import relativedelta
5
+
6
+ from uk_bin_collection.uk_bin_collection.common import *
7
+ from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
8
+
9
+
10
+ # import the wonderful Beautiful Soup and the URL grabber
11
+ class CouncilClass(AbstractGetBinDataClass):
12
+ """
13
+ Concrete classes have to implement all abstract operations of the
14
+ base class. They can also override some operations with a default
15
+ implementation.
16
+ """
17
+
18
+ def parse_data(self, page: str, **kwargs) -> dict:
19
+
20
+ user_postcode = kwargs.get("postcode")
21
+ check_postcode(user_postcode)
22
+ user_paon = kwargs.get("paon")
23
+ check_paon(user_paon)
24
+ bindata = {"bins": []}
25
+
26
+ SESSION_URL = "https://spelthorne-self.achieveservice.com/authapi/isauthenticated?uri=https%253A%252F%252Fspelthorne-self.achieveservice.com%252Fen%252FAchieveForms%252F%253Fmode%253Dfill%2526consentMessage%253Dyes%2526form_uri%253Dsandbox-publish%253A%252F%252FAF-Process-8d0df9d6-6bd0-487e-bbfe-38815dcc780d%252FAF-Stage-bce7fc80-bcd7-45f1-bf55-a76d38dbebba%252Fdefinition.json%2526process%253D1%2526process_uri%253Dsandbox-processes%253A%252F%252FAF-Process-8d0df9d6-6bd0-487e-bbfe-38815dcc780d%2526process_id%253DAF-Process-8d0df9d6-6bd0-487e-bbfe-38815dcc780d%2526noLoginPrompt%253D1&hostname=spelthorne-self.achieveservice.com&withCredentials=true"
27
+
28
+ API_URL = "https://spelthorne-self.achieveservice.com/apibroker/runLookup"
29
+
30
+ headers = {
31
+ "Content-Type": "application/json",
32
+ "Accept": "application/json",
33
+ "User-Agent": "Mozilla/5.0",
34
+ "X-Requested-With": "XMLHttpRequest",
35
+ "Referer": "https://spelthorne-self.achieveservice.com/fillform/?iframe_id=fillform-frame-1&db_id=",
36
+ }
37
+ s = requests.session()
38
+ r = s.get(SESSION_URL)
39
+ r.raise_for_status()
40
+ session_data = r.json()
41
+ sid = session_data["auth-session"]
42
+ data = {
43
+ "formValues": {
44
+ "Property details": {
45
+ "postalcode": {"value": user_postcode},
46
+ }
47
+ }
48
+ }
49
+ params = {
50
+ "id": "59b4477d6d84e",
51
+ "repeat_against": "",
52
+ "noRetry": "false",
53
+ "getOnlyTokens": "undefined",
54
+ "log_id": "",
55
+ "app_name": "AF-Renderer::Self",
56
+ # unix_timestamp
57
+ "_": str(int(time.time() * 1000)),
58
+ "sid": sid,
59
+ }
60
+
61
+ r = s.post(API_URL, json=data, headers=headers, params=params)
62
+ r.raise_for_status()
63
+
64
+ data = r.json()
65
+
66
+ rows_data = data["integration"]["transformed"]["rows_data"]
67
+
68
+ for key, value in rows_data.items():
69
+
70
+ address = value.get("display")
71
+
72
+ if address.startswith(user_paon):
73
+ user_uprn = value.get("value")
74
+ break
75
+
76
+ params = {
77
+ "id": "5f97e6e09fedd",
78
+ "repeat_against": "",
79
+ "noRetry": "true",
80
+ "getOnlyTokens": "undefined",
81
+ "log_id": "",
82
+ "app_name": "AF-Renderer::Self",
83
+ # unix_timestamp
84
+ "_": str(int(time.time() * 1000)),
85
+ "sid": sid,
86
+ }
87
+
88
+ r = s.post(API_URL, headers=headers, params=params)
89
+ r.raise_for_status()
90
+
91
+ data = r.json()
92
+
93
+ rows_data = data["integration"]["transformed"]["rows_data"]["0"]
94
+
95
+ token = rows_data.get("tokenString")
96
+
97
+ start_date = datetime.today() + relativedelta(weeks=2)
98
+ last2weeks = datetime.today() - relativedelta(weeks=2)
99
+
100
+ # Format as YYYY-MM-DD
101
+ formatted_date = start_date.strftime("%Y-%m-%d")
102
+ last2weeks = last2weeks.strftime("%Y-%m-%d")
103
+
104
+ data = {
105
+ "formValues": {
106
+ "Property details": {
107
+ "uprn1": {"value": user_uprn},
108
+ "endDate": {"value": formatted_date},
109
+ "last2Weeks": {"value": last2weeks},
110
+ "token": {"value": token},
111
+ }
112
+ }
113
+ }
114
+
115
+ params = {
116
+ "id": "66042a164c9a5",
117
+ "repeat_against": "",
118
+ "noRetry": "true",
119
+ "getOnlyTokens": "undefined",
120
+ "log_id": "",
121
+ "app_name": "AF-Renderer::Self",
122
+ # unix_timestamp
123
+ "_": str(int(time.time() * 1000)),
124
+ "sid": sid,
125
+ }
126
+
127
+ r = s.post(API_URL, json=data, headers=headers, params=params)
128
+ r.raise_for_status()
129
+
130
+ data = r.json()
131
+
132
+ rows_data = data["integration"]["transformed"]["rows_data"]["0"]
133
+
134
+ if not isinstance(rows_data, dict):
135
+ raise ValueError("Invalid data returned from API")
136
+
137
+ use_new = any(k.endswith("New") and v for k, v in rows_data.items())
138
+ next_date_key = "NextDateNew" if use_new else "NextDateOld"
139
+
140
+ for key, value in rows_data.items():
141
+ if not (key.endswith("NextCollection") or key.endswith(next_date_key)):
142
+ continue
143
+
144
+ bin_type = key.split("NextCollection")[0]
145
+ if bin_type == "Gw":
146
+ bin_type = ["Garden Waste"]
147
+ if bin_type == "Rec":
148
+ bin_type = ["Recycling Bin", "Food Waste Bin"]
149
+ if bin_type == "Ref":
150
+ bin_type = ["Rubbish Bin", "Food Waste Bin"]
151
+
152
+ try:
153
+ date = datetime.strptime(value, "%Y-%m-%d").strftime("%d/%m/%Y")
154
+ except ValueError:
155
+ continue
156
+
157
+ for bin in bin_type:
158
+ dict_data = {"type": bin, "collectionDate": date}
159
+ bindata["bins"].append(dict_data)
160
+
161
+ return bindata
@@ -1,7 +1,9 @@
1
+ from datetime import datetime
2
+
1
3
  from bs4 import BeautifulSoup
4
+
2
5
  from uk_bin_collection.uk_bin_collection.common import *
3
6
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
4
- from datetime import datetime
5
7
 
6
8
 
7
9
  class CouncilClass(AbstractGetBinDataClass):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uk_bin_collection
3
- Version: 0.135.4
3
+ Version: 0.136.0
4
4
  Summary: Python Lib to collect UK Bin Data
5
5
  Author: Robert Bradley
6
6
  Author-email: robbrad182@gmail.com
@@ -3,7 +3,7 @@ uk_bin_collection/tests/check_selenium_url_in_input.json.py,sha256=Iecdja0I3XIiY
3
3
  uk_bin_collection/tests/council_feature_input_parity.py,sha256=DO6Mk4ImYgM5ZCZ-cutwz5RoYYWZRLYx2tr6zIs_9Rc,3843
4
4
  uk_bin_collection/tests/features/environment.py,sha256=VQZjJdJI_kZn08M0j5cUgvKT4k3iTw8icJge1DGOkoA,127
5
5
  uk_bin_collection/tests/features/validate_council_outputs.feature,sha256=SJK-Vc737hrf03tssxxbeg_JIvAH-ddB8f6gU1LTbuQ,251
6
- uk_bin_collection/tests/input.json,sha256=1WxEeiVgfEgwPt9QE7-fHgW3itmi4SiMJ6DzzXnmq5U,116247
6
+ uk_bin_collection/tests/input.json,sha256=69WL-6I_ph_YEnTj_EUbV5KYJI6S1x4_KwcGN3foYjQ,116985
7
7
  uk_bin_collection/tests/output.schema,sha256=ZwKQBwYyTDEM4G2hJwfLUVM-5v1vKRvRK9W9SS1sd18,1086
8
8
  uk_bin_collection/tests/step_defs/step_helpers/file_handler.py,sha256=Ygzi4V0S1MIHqbdstUlIqtRIwnynvhu4UtpweJ6-5N8,1474
9
9
  uk_bin_collection/tests/step_defs/test_validate_council.py,sha256=VZ0a81sioJULD7syAYHjvK_-nT_Rd36tUyzPetSA0gk,3475
@@ -58,11 +58,12 @@ uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py,sha256=_E
58
58
  uk_bin_collection/uk_bin_collection/councils/BurnleyBoroughCouncil.py,sha256=GJf1OPvUVj3vqsR3KjG0DFHZrSBu4ogIz_MJeVV8tNA,3192
59
59
  uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py,sha256=H7wAxO1nfxkewVoRRolumq8bBJG04siE3jieFH3RGpQ,2632
60
60
  uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py,sha256=OJZcHYlvZDzmBpjjPPm3J8CRK9Twc49vRj7O9c5fyQ4,4971
61
+ uk_bin_collection/uk_bin_collection/councils/CambridgeCityCouncil.py,sha256=CxmFCgaWN_kzQAo7uiE2tzMX8QGzbJl5FCUx9cvb2Jk,2048
61
62
  uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py,sha256=ZamevXN8_Q8mRZOTESWtkb8jVyDXkTczcmhXMAVVSkM,2276
62
- uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py,sha256=2s8OL2H0QlUaNu6gUWcoAKHrRdLuQzfMHjcSZuLYbB0,1771
63
+ uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py,sha256=Uz75GqCTFXv489-lZHN3a2r0G7A-PEKq-hWmcoXGuw4,1932
63
64
  uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py,sha256=_k3sT_WR-gnjjt3tHQ-L2-keP9sdBV0ZeW7gHDzFPYo,7208
64
65
  uk_bin_collection/uk_bin_collection/councils/CarmarthenshireCountyCouncil.py,sha256=viiZprMos_qcD44dki5_RRVZgGE4cH4zSHAzYRKrjHw,1864
65
- uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py,sha256=JVPYUIlU2ISgbUSr5AOOXNK6IFQFtQmhZyYIMAOedD4,3858
66
+ uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py,sha256=AjxuIqKxx0tYHMaTBITXTcnN2L-Zrx78uwUkqTjI0xU,3599
66
67
  uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py,sha256=tXfzMetN6wxahuGGRp2mIyCCDSL4F2aG61HhUxw6COQ,2172
67
68
  uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py,sha256=EB88D0MNJwuDZ2GX1ENc5maGYx17mnHTCtNl6s-v11E,5090
68
69
  uk_bin_collection/uk_bin_collection/councils/CheltenhamBoroughCouncil.py,sha256=fo9n2AuD8a174h3YMa9awa3S4YO2XU1KaInQ4ULz6s4,13686
@@ -138,7 +139,7 @@ uk_bin_collection/uk_bin_collection/councils/HerefordshireCouncil.py,sha256=JpQh
138
139
  uk_bin_collection/uk_bin_collection/councils/HertsmereBoroughCouncil.py,sha256=-ThSG6NIJP_wf2GmGL7SAvxbOujdhanZ8ECP4VSQCBs,5415
139
140
  uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py,sha256=x7dfy8mdt2iGl8qJxHb-uBh4u0knmi9MJ6irOJw9WYA,4805
140
141
  uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py,sha256=GNxDU65QuZHV5va2IrKtcJ6TQoDdwmV03JvkVqOauP4,3291
141
- uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py,sha256=2Hk-_pitSQXlLVct_Vmu1b2EiCNuTMQBYbJs1lJVdCc,2299
142
+ uk_bin_collection/uk_bin_collection/councils/HinckleyandBosworthBoroughCouncil.py,sha256=51vXTKrstfJhb7cLCcrsvA9qKCsptyNMZvy7ML9DasM,2344
142
143
  uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py,sha256=LXhJ47rujx7k3naz0tFiTT1l5k6gAYcVdekJN1t_HLY,4564
143
144
  uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py,sha256=UHcesBoctFVcXDYuwfag43KbcJcopkEDzJ-54NxtK0Q,1851
144
145
  uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py,sha256=dGyhhG6HRjQ2SPeiRwUPTGlk9dPIslagV2k0GjEOn1s,1587
@@ -248,7 +249,9 @@ uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py,sha256=u
248
249
  uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py,sha256=OdexbeiI5WsCfjlsnHjAce8oGF5fW-n7q2XOuxcpHzw,3604
249
250
  uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py,sha256=ACQMHWyamnj1ag3gNF-8Jhp-DKUok1GhFdnzH4nCzwU,3201
250
251
  uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py,sha256=dxXGrJfg_fn2IPTBgq6Duwy0WY8GYLafMuisaCjOnbs,3426
252
+ uk_bin_collection/uk_bin_collection/councils/SouthamptonCityCouncil.py,sha256=exNoI-Vun_C5FowCYhZ_600MBUe_OPR7MdGZEMNLL0I,1542
251
253
  uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py,sha256=Z6JIbUt3yr4oG60n1At4AjPIGrs7Qzn_sDNY-TsS62E,4882
254
+ uk_bin_collection/uk_bin_collection/councils/SpelthorneBoroughCouncil.py,sha256=iamG0wxIyYprttJPVc0jdbOoHavc1AmRpMhyc02MUrE,5703
252
255
  uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py,sha256=mPZz6Za6kTSkrfHnj0OfwtnpRYR1dKvxbuFEKnWsiL8,1451
253
256
  uk_bin_collection/uk_bin_collection/councils/StHelensBC.py,sha256=X9dvnQTNn7QUO8gv1A587e1aDI92TWN4iNLATTn3H3w,4777
254
257
  uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py,sha256=9Qj4HJI7Dbiqb2mVSG2UtkBe27Y7wvQ5SYFTwGzJ5g0,2292
@@ -280,7 +283,7 @@ uk_bin_collection/uk_bin_collection/councils/TunbridgeWellsCouncil.py,sha256=s8N
280
283
  uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py,sha256=GSELWbSn5jtznv6FSLIMxK6CyQ27MW9FoY_m5jhTEBA,4175
281
284
  uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py,sha256=dz3zDJsJKYYqUB-Gxf6twvP6kG_wyENaszxXxK4iJn0,5089
282
285
  uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py,sha256=fyskrQ4-osGOeCZuB_8m2TpW8iwHr7lpl52nrR06Xpo,4441
283
- uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py,sha256=vRfIU0Uloi1bgXqjOCpdb-EQ4oY-aismcANZRwOIFkc,4914
286
+ uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py,sha256=mdAXKcoSSF-xnXS8boesFftS8RiKyuR76ITHQ9Q5DgM,4916
284
287
  uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py,sha256=wv-M3zZj0E6EIPoVB9AF_NCg_8XGM9uhqGa-F5yzoc4,2277
285
288
  uk_bin_collection/uk_bin_collection/councils/WalthamForest.py,sha256=_0ucZrZx-x49wxV7DGZsj4zcKv25HT-o2PkPabw8r68,4997
286
289
  uk_bin_collection/uk_bin_collection/councils/WandsworthCouncil.py,sha256=aQoJpC7YkhKewQyZlsv5m4__2IPoKRsOrPxjNH5xRNo,2594
@@ -315,8 +318,8 @@ uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py,sha256=I2kBYMlsD4bId
315
318
  uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py,sha256=EQWRhZ2pEejlvm0fPyOTsOHKvUZmPnxEYO_OWRGKTjs,1158
316
319
  uk_bin_collection/uk_bin_collection/create_new_council.py,sha256=m-IhmWmeWQlFsTZC4OxuFvtw5ZtB8EAJHxJTH4O59lQ,1536
317
320
  uk_bin_collection/uk_bin_collection/get_bin_data.py,sha256=YvmHfZqanwrJ8ToGch34x-L-7yPe31nB_x77_Mgl_vo,4545
318
- uk_bin_collection-0.135.4.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
319
- uk_bin_collection-0.135.4.dist-info/METADATA,sha256=xURFA9pVH0wIfMIkLkwR2xYYwhpYrQVTU77a45msztI,19741
320
- uk_bin_collection-0.135.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
321
- uk_bin_collection-0.135.4.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
322
- uk_bin_collection-0.135.4.dist-info/RECORD,,
321
+ uk_bin_collection-0.136.0.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
322
+ uk_bin_collection-0.136.0.dist-info/METADATA,sha256=Wdp-bbINnFzO7xjPeuqCosmBRSOMFn_KaE5pYz-TOvc,19741
323
+ uk_bin_collection-0.136.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
324
+ uk_bin_collection-0.136.0.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
325
+ uk_bin_collection-0.136.0.dist-info/RECORD,,