uk_bin_collection 0.103.0__py3-none-any.whl → 0.104.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- uk_bin_collection/tests/input.json +37 -0
- uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py +52 -0
- uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py +54 -0
- uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py +81 -0
- uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py +56 -0
- uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py +113 -0
- {uk_bin_collection-0.103.0.dist-info → uk_bin_collection-0.104.0.dist-info}/METADATA +1 -1
- {uk_bin_collection-0.103.0.dist-info → uk_bin_collection-0.104.0.dist-info}/RECORD +11 -6
- {uk_bin_collection-0.103.0.dist-info → uk_bin_collection-0.104.0.dist-info}/LICENSE +0 -0
- {uk_bin_collection-0.103.0.dist-info → uk_bin_collection-0.104.0.dist-info}/WHEEL +0 -0
- {uk_bin_collection-0.103.0.dist-info → uk_bin_collection-0.104.0.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,11 @@
|
|
1
1
|
{
|
2
|
+
"AberdeenshireCouncil": {
|
3
|
+
"url": "https://online.aberdeenshire.gov.uk",
|
4
|
+
"wiki_command_url_override": "https://online.aberdeenshire.gov.uk",
|
5
|
+
"uprn": "151176430",
|
6
|
+
"wiki_name": "Aberdeenshire Council",
|
7
|
+
"wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
|
8
|
+
},
|
2
9
|
"AdurAndWorthingCouncils": {
|
3
10
|
"url": "https://www.adur-worthing.gov.uk/bin-day/?brlu-selected-address=100061878829",
|
4
11
|
"wiki_command_url_override": "https://www.adur-worthing.gov.uk/bin-day/?brlu-selected-address=XXXXXXXX",
|
@@ -201,6 +208,13 @@
|
|
201
208
|
"wiki_name": "Cannock Chase District Council",
|
202
209
|
"wiki_note": "To get the UPRN, you can use [FindMyAddress](https://www.findmyaddress.co.uk/search)"
|
203
210
|
},
|
211
|
+
"CanterburyCityCouncil": {
|
212
|
+
"url": "https://www.canterbury.gov.uk",
|
213
|
+
"wiki_command_url_override": "https://www.canterbury.gov.uk",
|
214
|
+
"uprn": "10094583181",
|
215
|
+
"wiki_name": "Canterbury City Council",
|
216
|
+
"wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
|
217
|
+
},
|
204
218
|
"CardiffCouncil": {
|
205
219
|
"skip_get_url": true,
|
206
220
|
"uprn": "100100112419",
|
@@ -681,6 +695,13 @@
|
|
681
695
|
"wiki_name": "London Borough Redbridge",
|
682
696
|
"wiki_note": "Follow the instructions [here](https://my.redbridge.gov.uk/RecycleRefuse) until you get the page listing your \"Address\" then copy the entire address text and use that in the house number field."
|
683
697
|
},
|
698
|
+
"LutonBoroughCouncil": {
|
699
|
+
"url": "https://myforms.luton.gov.uk",
|
700
|
+
"wiki_command_url_override": "https://myforms.luton.gov.uk",
|
701
|
+
"uprn": "100080155778",
|
702
|
+
"wiki_name": "Luton Borough Council",
|
703
|
+
"wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
|
704
|
+
},
|
684
705
|
"MaldonDistrictCouncil": {
|
685
706
|
"skip_get_url": true,
|
686
707
|
"uprn": "100090557253",
|
@@ -1189,6 +1210,13 @@
|
|
1189
1210
|
"url": "https://www1.swansea.gov.uk/recyclingsearch/",
|
1190
1211
|
"wiki_name": "SwanseaCouncil"
|
1191
1212
|
},
|
1213
|
+
"SwindonBoroughCouncil": {
|
1214
|
+
"url": "https://www.swindon.gov.uk",
|
1215
|
+
"wiki_command_url_override": "https://www.swindon.gov.uk",
|
1216
|
+
"uprn": "10022793351",
|
1217
|
+
"wiki_name": "Swindon Borough Council",
|
1218
|
+
"wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find the UPRN."
|
1219
|
+
},
|
1192
1220
|
"TamesideMBCouncil": {
|
1193
1221
|
"skip_get_url": true,
|
1194
1222
|
"uprn": "100012835362",
|
@@ -1369,6 +1397,15 @@
|
|
1369
1397
|
"url": "https://www.northampton.gov.uk/info/200084/bins-waste-and-recycling/1602/check-your-collection-day",
|
1370
1398
|
"wiki_name": "West Northamptonshire Council"
|
1371
1399
|
},
|
1400
|
+
"WestOxfordshireDistrictCouncil": {
|
1401
|
+
"house_number": "24",
|
1402
|
+
"postcode": "OX28 1YA",
|
1403
|
+
"skip_get_url": true,
|
1404
|
+
"url": "https://community.westoxon.gov.uk/s/waste-collection-enquiry",
|
1405
|
+
"web_driver": "http://selenium:4444",
|
1406
|
+
"wiki_name": "West Oxfordshire District Council",
|
1407
|
+
"wiki_note": "Pass the full address in the house number and postcode in"
|
1408
|
+
},
|
1372
1409
|
"WestSuffolkCouncil": {
|
1373
1410
|
"postcode": "IP28 6DR",
|
1374
1411
|
"skip_get_url": true,
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import requests
|
2
|
+
from bs4 import BeautifulSoup
|
3
|
+
|
4
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
5
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
6
|
+
|
7
|
+
|
8
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
9
|
+
class CouncilClass(AbstractGetBinDataClass):
|
10
|
+
"""
|
11
|
+
Concrete classes have to implement all abstract operations of the
|
12
|
+
base class. They can also override some operations with a default
|
13
|
+
implementation.
|
14
|
+
"""
|
15
|
+
|
16
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
17
|
+
|
18
|
+
user_uprn = kwargs.get("uprn")
|
19
|
+
check_uprn(user_uprn)
|
20
|
+
bindata = {"bins": []}
|
21
|
+
|
22
|
+
URI = f"https://online.aberdeenshire.gov.uk/Apps/Waste-Collections/Routes/Route/{user_uprn}"
|
23
|
+
|
24
|
+
# Make the GET request
|
25
|
+
response = requests.get(URI)
|
26
|
+
|
27
|
+
soup = BeautifulSoup(response.content, features="html.parser")
|
28
|
+
soup.prettify()
|
29
|
+
|
30
|
+
for collection in soup.find("table").find("tbody").find_all("tr"):
|
31
|
+
th = collection.find("th")
|
32
|
+
if th:
|
33
|
+
continue
|
34
|
+
td = collection.find_all("td")
|
35
|
+
collection_date = datetime.strptime(
|
36
|
+
td[0].text,
|
37
|
+
"%d/%m/%Y %A",
|
38
|
+
)
|
39
|
+
bin_type = td[1].text.split(" and ")
|
40
|
+
|
41
|
+
for bin in bin_type:
|
42
|
+
dict_data = {
|
43
|
+
"type": bin,
|
44
|
+
"collectionDate": collection_date.strftime(date_format),
|
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,54 @@
|
|
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
|
+
data = {"uprn": user_uprn, "usrn": "1"}
|
24
|
+
|
25
|
+
URI = (
|
26
|
+
"https://zbr7r13ke2.execute-api.eu-west-2.amazonaws.com/Beta/get-bin-dates"
|
27
|
+
)
|
28
|
+
|
29
|
+
# Make the GET request
|
30
|
+
response = requests.post(URI, json=data)
|
31
|
+
response.raise_for_status()
|
32
|
+
|
33
|
+
# Parse the JSON response
|
34
|
+
bin_collection = json.loads(response.json()["dates"])
|
35
|
+
collections = {
|
36
|
+
"General": bin_collection["blackBinDay"],
|
37
|
+
"Recycling": bin_collection["recyclingBinDay"],
|
38
|
+
"Food": bin_collection["foodBinDay"],
|
39
|
+
"Garden": bin_collection["gardenBinDay"],
|
40
|
+
}
|
41
|
+
# Loop through each collection in bin_collection
|
42
|
+
for collection in collections:
|
43
|
+
print(collection)
|
44
|
+
|
45
|
+
if len(collections[collection]) <= 0:
|
46
|
+
continue
|
47
|
+
for date in collections[collection]:
|
48
|
+
date = (
|
49
|
+
datetime.strptime(date, "%Y-%m-%dT%H:%M:%S").strftime("%d/%m/%Y"),
|
50
|
+
)
|
51
|
+
dict_data = {"type": collection, "collectionDate": date[0]}
|
52
|
+
bindata["bins"].append(dict_data)
|
53
|
+
|
54
|
+
return bindata
|
@@ -0,0 +1,81 @@
|
|
1
|
+
import time
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from bs4 import BeautifulSoup
|
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_uprn = kwargs.get("uprn")
|
21
|
+
check_uprn(user_uprn)
|
22
|
+
bindata = {"bins": []}
|
23
|
+
|
24
|
+
SESSION_URL = "https://myforms.luton.gov.uk/authapi/isauthenticated?uri=https%253A%252F%252Fmyforms.luton.gov.uk%252Fservice%252FFind_my_bin_collection_date&hostname=myforms.luton.gov.uk&withCredentials=true"
|
25
|
+
|
26
|
+
API_URL = "https://myforms.luton.gov.uk/apibroker/runLookup"
|
27
|
+
|
28
|
+
data = {
|
29
|
+
"formValues": {
|
30
|
+
"Find my bin collection date": {
|
31
|
+
"id": {
|
32
|
+
"value": f"1-{user_uprn}",
|
33
|
+
},
|
34
|
+
},
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
headers = {
|
39
|
+
"Content-Type": "application/json",
|
40
|
+
"Accept": "application/json",
|
41
|
+
"User-Agent": "Mozilla/5.0",
|
42
|
+
"X-Requested-With": "XMLHttpRequest",
|
43
|
+
"Referer": "https://myforms.luton.gov.uk/fillform/?iframe_id=fillform-frame-1&db_id=",
|
44
|
+
}
|
45
|
+
s = requests.session()
|
46
|
+
r = s.get(SESSION_URL)
|
47
|
+
r.raise_for_status()
|
48
|
+
session_data = r.json()
|
49
|
+
sid = session_data["auth-session"]
|
50
|
+
params = {
|
51
|
+
"id": "65cb710f8d525",
|
52
|
+
"repeat_against": "",
|
53
|
+
"noRetry": "true",
|
54
|
+
"getOnlyTokens": "undefined",
|
55
|
+
"log_id": "",
|
56
|
+
"app_name": "AF-Renderer::Self",
|
57
|
+
# unix_timestamp
|
58
|
+
"_": str(int(time.time() * 1000)),
|
59
|
+
"sid": sid,
|
60
|
+
}
|
61
|
+
r = s.post(API_URL, json=data, headers=headers, params=params)
|
62
|
+
r.raise_for_status()
|
63
|
+
data = r.json()
|
64
|
+
rows_data = data["integration"]["transformed"]["rows_data"][f"{user_uprn}"]
|
65
|
+
|
66
|
+
soup = BeautifulSoup(rows_data["html"], features="html.parser")
|
67
|
+
soup.prettify()
|
68
|
+
for collection in soup.find_all("tr"):
|
69
|
+
tds = collection.find_all("td")
|
70
|
+
bin_type = tds[1].text
|
71
|
+
collection_date = datetime.strptime(
|
72
|
+
tds[0].text,
|
73
|
+
"%A %d %b %Y",
|
74
|
+
)
|
75
|
+
dict_data = {
|
76
|
+
"type": bin_type,
|
77
|
+
"collectionDate": collection_date.strftime(date_format),
|
78
|
+
}
|
79
|
+
bindata["bins"].append(dict_data)
|
80
|
+
|
81
|
+
return bindata
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import time
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from bs4 import BeautifulSoup
|
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_uprn = kwargs.get("uprn")
|
21
|
+
check_uprn(user_uprn)
|
22
|
+
bindata = {"bins": []}
|
23
|
+
|
24
|
+
URI = f"https://www.swindon.gov.uk/info/20122/rubbish_and_recycling_collection_days?addressList={user_uprn}&uprnSubmit=Yes"
|
25
|
+
|
26
|
+
# Make the GET request
|
27
|
+
response = requests.get(URI)
|
28
|
+
|
29
|
+
# Parse the JSON response
|
30
|
+
soup = BeautifulSoup(response.text, "html.parser")
|
31
|
+
|
32
|
+
bin_collection_content = soup.find_all(
|
33
|
+
"div", {"class": "bin-collection-content"}
|
34
|
+
)
|
35
|
+
for content in bin_collection_content:
|
36
|
+
content_left = content.find("div", {"class": "content-left"})
|
37
|
+
content_right = content.find("div", {"class": "content-right"})
|
38
|
+
if content_left and content_right:
|
39
|
+
|
40
|
+
bin_types = content_left.find("h3").text.split(" and ")
|
41
|
+
for bin_type in bin_types:
|
42
|
+
|
43
|
+
collection_date = datetime.strptime(
|
44
|
+
content_right.find(
|
45
|
+
"span", {"class": "nextCollectionDate"}
|
46
|
+
).text,
|
47
|
+
"%A, %d %B %Y",
|
48
|
+
).strftime(date_format)
|
49
|
+
|
50
|
+
dict_data = {
|
51
|
+
"type": bin_type,
|
52
|
+
"collectionDate": collection_date,
|
53
|
+
}
|
54
|
+
bindata["bins"].append(dict_data)
|
55
|
+
|
56
|
+
return bindata
|
@@ -0,0 +1,113 @@
|
|
1
|
+
import time
|
2
|
+
from datetime import datetime
|
3
|
+
|
4
|
+
from bs4 import BeautifulSoup
|
5
|
+
from selenium.webdriver.common.by import By
|
6
|
+
from selenium.webdriver.common.keys import Keys
|
7
|
+
from selenium.webdriver.support import expected_conditions as EC
|
8
|
+
from selenium.webdriver.support.ui import Select
|
9
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
10
|
+
|
11
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
12
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
13
|
+
|
14
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
15
|
+
|
16
|
+
|
17
|
+
class CouncilClass(AbstractGetBinDataClass):
|
18
|
+
"""
|
19
|
+
Concrete classes have to implement all abstract operations of the
|
20
|
+
base class. They can also override some operations with a default
|
21
|
+
implementation.
|
22
|
+
"""
|
23
|
+
|
24
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
25
|
+
driver = None
|
26
|
+
try:
|
27
|
+
page = "https://community.westoxon.gov.uk/s/waste-collection-enquiry"
|
28
|
+
|
29
|
+
data = {"bins": []}
|
30
|
+
|
31
|
+
house_number = kwargs.get("paon")
|
32
|
+
postcode = kwargs.get("postcode")
|
33
|
+
full_address = f"{house_number}, {postcode}"
|
34
|
+
web_driver = kwargs.get("web_driver")
|
35
|
+
headless = kwargs.get("headless")
|
36
|
+
|
37
|
+
# Create Selenium webdriver
|
38
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
39
|
+
driver.get(page)
|
40
|
+
|
41
|
+
# If you bang in the house number (or property name) and postcode in the box it should find your property
|
42
|
+
wait = WebDriverWait(driver, 60)
|
43
|
+
address_entry_field = wait.until(
|
44
|
+
EC.presence_of_element_located(
|
45
|
+
(By.XPATH, '//*[@id="combobox-input-19"]')
|
46
|
+
)
|
47
|
+
)
|
48
|
+
|
49
|
+
address_entry_field.send_keys(str(full_address))
|
50
|
+
|
51
|
+
address_entry_field = wait.until(
|
52
|
+
EC.element_to_be_clickable((By.XPATH, '//*[@id="combobox-input-19"]'))
|
53
|
+
)
|
54
|
+
address_entry_field.click()
|
55
|
+
address_entry_field.send_keys(Keys.BACKSPACE)
|
56
|
+
address_entry_field.send_keys(str(full_address[len(full_address) - 1]))
|
57
|
+
|
58
|
+
first_found_address = wait.until(
|
59
|
+
EC.element_to_be_clickable(
|
60
|
+
(By.XPATH, '//*[@id="dropdown-element-19"]/ul')
|
61
|
+
)
|
62
|
+
)
|
63
|
+
|
64
|
+
first_found_address.click()
|
65
|
+
# Wait for the 'Select your property' dropdown to appear and select the first result
|
66
|
+
next_btn = wait.until(
|
67
|
+
EC.element_to_be_clickable((By.XPATH, "//lightning-button/button"))
|
68
|
+
)
|
69
|
+
next_btn.click()
|
70
|
+
bin_data = wait.until(
|
71
|
+
EC.presence_of_element_located(
|
72
|
+
(By.XPATH, "//span[contains(text(), 'Container')]")
|
73
|
+
)
|
74
|
+
)
|
75
|
+
|
76
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
77
|
+
|
78
|
+
rows = soup.find_all("tr", class_="slds-hint-parent")
|
79
|
+
current_year = datetime.now().year
|
80
|
+
|
81
|
+
for row in rows:
|
82
|
+
columns = row.find_all("td")
|
83
|
+
if columns:
|
84
|
+
container_type = row.find("th").text.strip()
|
85
|
+
collection_day = re.sub(
|
86
|
+
r"[^a-zA-Z0-9,\s]", "", columns[0].get_text()
|
87
|
+
).strip()
|
88
|
+
|
89
|
+
# Parse the date from the string
|
90
|
+
parsed_date = datetime.strptime(collection_day, "%a, %d %B")
|
91
|
+
if parsed_date < datetime(
|
92
|
+
parsed_date.year, parsed_date.month, parsed_date.day
|
93
|
+
):
|
94
|
+
parsed_date = parsed_date.replace(year=current_year + 1)
|
95
|
+
else:
|
96
|
+
parsed_date = parsed_date.replace(year=current_year)
|
97
|
+
# Format the date as %d/%m/%Y
|
98
|
+
formatted_date = parsed_date.strftime("%d/%m/%Y")
|
99
|
+
|
100
|
+
# Add the bin type and collection date to the 'data' dictionary
|
101
|
+
data["bins"].append(
|
102
|
+
{"type": container_type, "collectionDate": formatted_date}
|
103
|
+
)
|
104
|
+
except Exception as e:
|
105
|
+
# Here you can log the exception if needed
|
106
|
+
print(f"An error occurred: {e}")
|
107
|
+
# Optionally, re-raise the exception if you want it to propagate
|
108
|
+
raise
|
109
|
+
finally:
|
110
|
+
# This block ensures that the driver is closed regardless of an exception
|
111
|
+
if driver:
|
112
|
+
driver.quit()
|
113
|
+
return data
|
@@ -2,7 +2,7 @@ uk_bin_collection/README.rst,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
|
|
2
2
|
uk_bin_collection/tests/council_feature_input_parity.py,sha256=DO6Mk4ImYgM5ZCZ-cutwz5RoYYWZRLYx2tr6zIs_9Rc,3843
|
3
3
|
uk_bin_collection/tests/features/environment.py,sha256=VQZjJdJI_kZn08M0j5cUgvKT4k3iTw8icJge1DGOkoA,127
|
4
4
|
uk_bin_collection/tests/features/validate_council_outputs.feature,sha256=SJK-Vc737hrf03tssxxbeg_JIvAH-ddB8f6gU1LTbuQ,251
|
5
|
-
uk_bin_collection/tests/input.json,sha256=
|
5
|
+
uk_bin_collection/tests/input.json,sha256=Na6Dc5LUyK4byfnhGubysbs-tKpviNfcvkz8O01J-C8,72925
|
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=LrOSt_loA1Mw3vTqaO2LpaDMu7rYJy6k5Kr-EOBln7s,3424
|
@@ -12,6 +12,7 @@ uk_bin_collection/tests/test_conftest.py,sha256=GWqP6-fCv5A2VUYiyXqUO-Dm0hlUOwbF
|
|
12
12
|
uk_bin_collection/tests/test_get_data.py,sha256=tQGyuTR8pZvnwzVsDqFhUrFtBeMP11eRnWD4Xq-mF-U,7181
|
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=oZQW8CYRGfbhNSyq7t7jEhrFl1tjb4H157xSx8QHWSY,10106
|
15
|
+
uk_bin_collection/uk_bin_collection/councils/AberdeenshireCouncil.py,sha256=aO1CSdyqa8oAD0fB79y1Q9bikAWCP_JFa7CsyTa2j9s,1655
|
15
16
|
uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py,sha256=ppbrmm-MzB1wOulK--CU_0j4P-djNf3ozMhHnmQFqLo,1511
|
16
17
|
uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py,sha256=o9NBbVCTdxKXnpYbP8-zxe1Gh8s57vwfV75Son_sAHE,2863
|
17
18
|
uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py,sha256=yfhthv9nuogP19VOZ3TYQrq51qqjiCZcSel4sXhiKjs,4012
|
@@ -39,6 +40,7 @@ uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py,sha256=_E
|
|
39
40
|
uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py,sha256=H7wAxO1nfxkewVoRRolumq8bBJG04siE3jieFH3RGpQ,2632
|
40
41
|
uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py,sha256=OJZcHYlvZDzmBpjjPPm3J8CRK9Twc49vRj7O9c5fyQ4,4971
|
41
42
|
uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py,sha256=ZamevXN8_Q8mRZOTESWtkb8jVyDXkTczcmhXMAVVSkM,2276
|
43
|
+
uk_bin_collection/uk_bin_collection/councils/CanterburyCityCouncil.py,sha256=2s8OL2H0QlUaNu6gUWcoAKHrRdLuQzfMHjcSZuLYbB0,1771
|
42
44
|
uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py,sha256=_k3sT_WR-gnjjt3tHQ-L2-keP9sdBV0ZeW7gHDzFPYo,7208
|
43
45
|
uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py,sha256=JVPYUIlU2ISgbUSr5AOOXNK6IFQFtQmhZyYIMAOedD4,3858
|
44
46
|
uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py,sha256=tXfzMetN6wxahuGGRp2mIyCCDSL4F2aG61HhUxw6COQ,2172
|
@@ -105,6 +107,7 @@ uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py,sha256=kzKwb
|
|
105
107
|
uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py,sha256=UOeiOxGMvVMm2UFaqjmQpm7vxzqJNSSN8LM9lAUjs2c,3021
|
106
108
|
uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py,sha256=r9D5lHe5kIRStCd5lRIax16yhb4KTFzzfYEFv1bacWw,2009
|
107
109
|
uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py,sha256=A_6Sis5hsF53Th04KeadHRasGbpAm6aoaWJ6X8eC4Y8,6604
|
110
|
+
uk_bin_collection/uk_bin_collection/councils/LutonBoroughCouncil.py,sha256=vScUi_R8FnBddii2_zLlZBLxuh85mKmCm8nKW3zxky0,2758
|
108
111
|
uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py,sha256=PMVt2XFggttPmbWyrBrHJ-W6R_6-0ux1BkY1kj1IKzg,1997
|
109
112
|
uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py,sha256=iQG0EkX2npBicvsGKQRYyBGSBvKVUbKvUvvwrC9xV1A,2100
|
110
113
|
uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py,sha256=RY301_82z3-xInGai5ocT7rzoV75ATbf0N7uxn8Z9LE,3110
|
@@ -179,6 +182,7 @@ uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py,sha256=9bY
|
|
179
182
|
uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py,sha256=4DnKyyu56_AwuchD6_oL1dvpDStMvkkxQtYN79rUKOs,3825
|
180
183
|
uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py,sha256=ak0zqBJ6UAS8_t5zKGwigMxPMdlQuYXRsGCQJCNERJs,3415
|
181
184
|
uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py,sha256=nmVPoPhnFgVi--vczX2i4Sf3bqM5RWJuwfhioRUr5XE,2303
|
185
|
+
uk_bin_collection/uk_bin_collection/councils/SwindonBoroughCouncil.py,sha256=lSIykpkBjVwQSf3rrnrNuh7YRepgnkKQLbf1iErMuJs,1932
|
182
186
|
uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py,sha256=k2TAAZG7n2S1BWVyxbE_-4-lZuzhOimCNz4yimUCOGk,1995
|
183
187
|
uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py,sha256=KLVvM2NNq_DQylVe5dwO2l7qPahLHg08jJGLCv1MBQ4,2324
|
184
188
|
uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py,sha256=p1ZS5R4EGxbEWlRBrkGXgKwE_lkyBT-R60yKFFhVObc,1844
|
@@ -204,6 +208,7 @@ uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py,sha25
|
|
204
208
|
uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py,sha256=dq0jimtARvRkZiGbVFrXXZgY-BODtz3uYZ5UKn0bf64,4114
|
205
209
|
uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py,sha256=jbqV3460rn9D0yTBGWjpSe1IvWWcdGur5pzgj-hJcQ4,2513
|
206
210
|
uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py,sha256=F1GeJUGND4DN_HuM6N0Elpeb0DAMm9_KeqG6qtIgZf4,1079
|
211
|
+
uk_bin_collection/uk_bin_collection/councils/WestOxfordshireDistrictCouncil.py,sha256=0JIN_2XCYBGCC-wsYhsWIlKJEtJV3f1eh7eHCn5Id9k,4507
|
207
212
|
uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py,sha256=9i8AQHh-qIRPZ_5Ad97_h04-qgyLQDPV064obBzab1Y,2587
|
208
213
|
uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py,sha256=3gqFA4-BVx_In6QOu3KUNqPN4Fkn9iMlZTeopMK9p6A,3746
|
209
214
|
uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py,sha256=it2Oh5Kmq3lD30gAZgk2bzZPNCtJcFHyQO1NgOQtfvU,5653
|
@@ -218,8 +223,8 @@ uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py,sha256=I2kBYMlsD4bId
|
|
218
223
|
uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py,sha256=4s9ODGPAwPqwXc8SrTX5Wlfmizs3_58iXUtHc4Ir86o,1162
|
219
224
|
uk_bin_collection/uk_bin_collection/create_new_council.py,sha256=m-IhmWmeWQlFsTZC4OxuFvtw5ZtB8EAJHxJTH4O59lQ,1536
|
220
225
|
uk_bin_collection/uk_bin_collection/get_bin_data.py,sha256=YvmHfZqanwrJ8ToGch34x-L-7yPe31nB_x77_Mgl_vo,4545
|
221
|
-
uk_bin_collection-0.
|
222
|
-
uk_bin_collection-0.
|
223
|
-
uk_bin_collection-0.
|
224
|
-
uk_bin_collection-0.
|
225
|
-
uk_bin_collection-0.
|
226
|
+
uk_bin_collection-0.104.0.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
|
227
|
+
uk_bin_collection-0.104.0.dist-info/METADATA,sha256=c_rgBGtmU3esnA0-pdg2SJnf5V-zLBMuIc20qLySZs8,17630
|
228
|
+
uk_bin_collection-0.104.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
229
|
+
uk_bin_collection-0.104.0.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
|
230
|
+
uk_bin_collection-0.104.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{uk_bin_collection-0.103.0.dist-info → uk_bin_collection-0.104.0.dist-info}/entry_points.txt
RENAMED
File without changes
|