-
Notifications
You must be signed in to change notification settings - Fork 0
/
shorten_url.py
77 lines (64 loc) · 1.95 KB
/
shorten_url.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python3
"""
File to shorten the url and serialize/de-serialize the data.
Author: Santhosh Balasa
Email: santhosh.kbr@gmail.com
Date: 28/May/2021
"""
import string
import pickle
import random
# Global
PICKLED_FILE = "cached_urls.pickle"
def deserialize_data():
"""
Function to de-serialize the data via writing to pickle file.
Returns:
data (dict): data from the pickle file
"""
with open(PICKLED_FILE, "rb") as p:
data = pickle.load(p)
return data
def serialize_data(data):
"""
Function to serialize the data via reading the pickle file.
Args:
data (dict): Shortened urls along with its long urls
"""
with open(PICKLED_FILE, "wb") as p:
pickle.dump(data, p, protocol=pickle.HIGHEST_PROTOCOL)
def get_cached_urls():
"""
Function to get all the shortened urls.
Returns:
list_of_urls (dict): List of cached urls
"""
return deserialize_data()
def store_cached_urls(list_of_short_urls, short_url, long_url):
"""
Function to cache the shortened urls.
Args:
list_of_short_urls (dict): List of all shortened urls serialized
short_url (str): Shortened URL
long_url (str): Long URL passed by the user
"""
list_of_short_urls.update({short_url: long_url})
serialize_data(list_of_short_urls)
def encode(long_url):
"""
Function to shorten the long url.
Args:
long_url (str): Long url passed by the user
Returns:
short_url (str): Shortened URL
"""
list_of_short_urls = get_cached_urls()
if long_url not in list_of_short_urls.values():
res = "".join(random.choices(string.ascii_letters + string.digits, k=8))
list_of_short_urls[res] = long_url
store_cached_urls(list_of_short_urls, res, long_url)
return res
else:
for short, long in list_of_short_urls.items(): # To keep it unique
if long == long_url:
return short