Skip to content

Commit ac91bfb

Browse files
committed
feat : Added new generator - csv_row_reader, directory_watcher and sliding_window.
1 parent 6a5c987 commit ac91bfb

5 files changed

Lines changed: 60 additions & 0 deletions

File tree

generators/csv_row_reader.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import csv
2+
3+
4+
def csv_row_reader(filepath):
5+
"""Yields rows from a CSV file as dictionaries (using header row)."""
6+
with open(filepath, newline='', encoding='utf-8') as f:
7+
reader = csv.DictReader(f)
8+
for row in reader:
9+
yield row

generators/directory_watcher.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import os
2+
import time
3+
4+
5+
def directory_watcher(path, interval=1.0):
6+
"""
7+
Yields new filenames in a directory as they appear.
8+
"""
9+
seen = set(os.listdir(path))
10+
11+
while True:
12+
time.sleep(interval)
13+
current = set(os.listdir(path))
14+
new_files = current - seen
15+
for file in new_files:
16+
yield file
17+
seen = current

generators/sliding_window.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from collections import deque
2+
3+
4+
def sliding_window(iterable, size):
5+
"""Yields sliding windows of the given size from an iterable."""
6+
it = iter(iterable)
7+
window = deque(maxlen=size)
8+
9+
for item in it:
10+
window.append(item)
11+
if len(window) == size:
12+
yield tuple(window)

tests/test_csv_row_reader.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import tempfile
2+
import csv
3+
from generators.csv_row_reader import csv_row_reader
4+
5+
6+
def test_csv_row_reader():
7+
with tempfile.NamedTemporaryFile(mode='w+', newline='', delete=False) as f:
8+
writer = csv.DictWriter(f, fieldnames=["id", "name"])
9+
writer.writeheader()
10+
writer.writerow({"id": "1", "name": "Alice"})
11+
writer.writerow({"id": "2", "name": "Bob"})
12+
path = f.name
13+
14+
rows = list(csv_row_reader(path))
15+
assert len(rows) == 2
16+
assert rows[0]["name"] == "Alice"

tests/test_sliding_window.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from generators.sliding_window import sliding_window
2+
3+
4+
def test_sliding_window():
5+
result = list(sliding_window(range(5), 3))
6+
assert result == [(0, 1, 2), (1, 2, 3), (2, 3, 4)]

0 commit comments

Comments
 (0)