Skip to content

Commit b209a9b

Browse files
committed
added documentation
1 parent 2da10ba commit b209a9b

File tree

1 file changed

+88
-4
lines changed

1 file changed

+88
-4
lines changed

faker_clickstream/clickstream.py

Lines changed: 88 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
class ClickstreamProvider(BaseProvider):
1616
"""
1717
A Provider for clickstream related test data.
18+
1819
>>> from faker import Faker
1920
>>> from faker_clickstream import ClickstreamProvider
2021
>>> fake = Faker()
@@ -23,15 +24,39 @@ class ClickstreamProvider(BaseProvider):
2324
"""
2425

2526
def user_agent(self):
27+
"""
28+
Generate random user agent.
29+
30+
:return: User agent string
31+
"""
2632
return choice(user_agents)
2733

2834
def event(self):
35+
"""
36+
Generate random event type name for e-commerce site.
37+
38+
:return: Event type string
39+
"""
2940
return choice(events)
3041

3142
def weighted_event(self):
43+
"""
44+
Generate a random event object according to popularity weight. Higher popularity increases the
45+
chances of occurrence.
46+
47+
:return: Event object (JSON)
48+
"""
3249
return random.choices(weighted_events, weights=[e['popularity'] for e in weighted_events], k=1)[0]
3350

3451
def session_clickstream(self, rand_session_max_size: int = 25):
52+
"""
53+
Generate session clickstream events.
54+
55+
:param rand_session_max_size: Max number of possible events in session. Defaults to 25.
56+
:return: List of session events
57+
"""
58+
59+
# Initialize static session values
3560
session_events = []
3661
user_id = _get_user_id()
3762
user_agent = self.user_agent()
@@ -40,11 +65,17 @@ def session_clickstream(self, rand_session_max_size: int = 25):
4065
channel_type = _get_channel()
4166
random_session_size = randint(1, rand_session_max_size)
4267
incremental_delta_delay = randint(1, 60)
68+
69+
# Keep track of unique values in a session
4370
unique_session_events = set()
4471
product_codes = set()
72+
4573
for s in range(random_session_size):
74+
# Mock time delay between events
4675
incremental_delta_delay = incremental_delta_delay + (s * randint(1, 60))
4776
event_time = _format_time(_get_event_time(delta=incremental_delta_delay))
77+
78+
# Fetch weighted event
4879
event = self.weighted_event()
4980

5081
if (event['name'] == 'Login' and event['name'] in unique_session_events) \
@@ -85,6 +116,7 @@ def session_clickstream(self, rand_session_max_size: int = 25):
85116
if 'DecreaseQuantity' in unique_session_events:
86117
unique_session_events.remove('DecreaseQuantity')
87118

119+
# Fill metadata object conditionally
88120
metadata = {}
89121
if event['name'] == 'Search':
90122
sample_product = _get_weighted_mobile_phone()
@@ -106,6 +138,7 @@ def session_clickstream(self, rand_session_max_size: int = 25):
106138
if event['name'] == 'CheckOrderStatus':
107139
metadata['order_id'] = _get_order_id()
108140

141+
# Construct final event object
109142
r = {
110143
"ip": ip,
111144
"user_id": user_id,
@@ -121,6 +154,11 @@ def session_clickstream(self, rand_session_max_size: int = 25):
121154

122155

123156
def _get_session_id():
157+
"""
158+
Generate session ID
159+
160+
:return: Session ID string
161+
"""
124162
return hashlib.sha256(
125163
('%s%s%s' % (
126164
datetime.now().strftime("%d/%m/%Y %H:%M:%S.%f"),
@@ -131,40 +169,86 @@ def _get_session_id():
131169

132170

133171
def _get_product_code():
172+
"""
173+
Generate random product code from range 1 to 999999.
174+
175+
:return: Random integer number
176+
"""
134177
return randint(1, 999999)
135178

136179

137180
def _get_order_id():
181+
"""
182+
Generate random order id from range 1 to 999999.
183+
184+
:return: Random integer number
185+
"""
138186
return randint(1, 999999)
139187

140188

141189
def _get_user_id(start: int = 0, end: int = 999999):
190+
"""
191+
Generate random user id from range 0 to 999999. Zero value may identify null user.
192+
193+
:param start: Index start (Default: 0)
194+
:param end: Index end (Default: 999999)
195+
:return:
196+
"""
142197
return randint(start, end)
143198

144199

145200
def _get_event_time(delta):
201+
"""
202+
Generate current event time, added by some delta value.
203+
204+
:param delta: Delta time value in seconds
205+
:return: Event time
206+
"""
146207
return datetime.now() + timedelta(seconds=delta)
147208

148209

149210
def _format_time(t):
150-
return t.strftime("%d/%m/%Y %H:%M:%S.%f")
151-
211+
"""
212+
Format time to string.
152213
153-
def _get_event_name():
154-
return choice(events)
214+
:param t: Time object
215+
:return: Time string in format like 28/03/2022 23:22:15.360252
216+
"""
217+
return t.strftime("%d/%m/%Y %H:%M:%S.%f")
155218

156219

157220
def _get_quantity():
221+
"""
222+
Get random product order quantity from 1 to 5. Values are given a weight, decreasing as the quantity number
223+
increases.
224+
225+
:return: Product quantity number
226+
"""
158227
return random.choices([1, 2, 3, 4, 5], weights=[50, 20, 20, 5, 5], k=1)[0]
159228

160229

161230
def _get_weighted_mobile_phone():
231+
"""
232+
Get mobile phone object according to popularity
233+
234+
:return: Mobile phone object
235+
"""
162236
return random.choices(mobile_phones, weights=[e['popularity'] for e in mobile_phones], k=1)[0]
163237

164238

165239
def _get_ip():
240+
"""
241+
Get random IP address from list.
242+
243+
:return: IP address string
244+
"""
166245
return choice(ip_list)
167246

168247

169248
def _get_channel():
249+
"""
250+
Get user origin channel (e.g. "Organic search", "Direct", "Social media", "Referral", "Other")
251+
252+
:return: Origin channel string
253+
"""
170254
return choice(channel)

0 commit comments

Comments
 (0)