Skip to content

Commit 027a727

Browse files
add flexible export
1 parent 3b8cc38 commit 027a727

File tree

3 files changed

+45
-6
lines changed

3 files changed

+45
-6
lines changed

main.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import argparse
22
import traceback
3+
import sys
34

45
from src import commits_parser
56
from src import contributors_parser
@@ -10,7 +11,7 @@
1011
from src import pull_requests_parser
1112
from src import wikipars
1213
from src import workflow_runs_parser
13-
from src.utils import parse_time
14+
from src.utils import parse_time, validate_and_normalize_cell
1415

1516

1617
def parse_args():
@@ -35,6 +36,13 @@ def parse_args():
3536
help="export table to google sheets",
3637
action="store_true",
3738
)
39+
parser.add_argument(
40+
'--start_cell',
41+
type=str,
42+
required=False,
43+
help='Starting cell for Google Sheets export (e.g., "A1", "B3")',
44+
default=None
45+
)
3846

3947
parser.add_argument(
4048
'--base_url',
@@ -162,14 +170,26 @@ def run(args, binded_repos, repos_for_wiki=None):
162170
if args.wikis:
163171
wikipars.wikiparser(repos_for_wiki, args.download_repos, args.out)
164172
if args.export_google_sheets:
165-
export_sheets.write_data_to_table(
166-
args.out, args.google_token, args.table_id, args.sheet_id
167-
)
173+
if args.start_cell:
174+
export_sheets.write_data_to_table(
175+
args.out, args.google_token, args.table_id, args.sheet_id, args.start_cell
176+
)
177+
else:
178+
export_sheets.write_data_to_table(
179+
args.out, args.google_token, args.table_id, args.sheet_id
180+
)
168181

169182

170183
def main():
171184
args = parse_args()
172185

186+
if args.start_cell is not None:
187+
try:
188+
args.start_cell = validate_and_normalize_cell(args.start_cell)
189+
except ValueError as e:
190+
print(f"Error in start_cell argument: {e}")
191+
sys.exit(1)
192+
173193
if args.token:
174194
tokens = [args.token]
175195
else:

src/export_sheets.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
INT_MASS = [{"one": 1, "two": 2, "what?": 3}]
55

66

7-
def write_data_to_table(csv_path, google_token, table_id, sheet_id):
7+
def write_data_to_table(csv_path, google_token, table_id, sheet_id, start_cell="A1"):
88
if google_token and sheet_id and table_id:
99
gc = pygsheets.authorize(service_file=google_token)
1010
sh = gc.open_by_key(table_id)
@@ -25,4 +25,4 @@ def write_data_to_table(csv_path, google_token, table_id, sheet_id):
2525
wk_content.clear()
2626

2727
# Запись новых данных
28-
wk_content.set_dataframe(df, 'A1', copy_head=True)
28+
wk_content.set_dataframe(df, start_cell, copy_head=True)

src/utils.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from datetime import datetime
33
from functools import wraps
44
import traceback
5+
import re
56

67
import pytz
78

@@ -96,3 +97,21 @@ def wrapper(*args, **kwargs):
9697
return default_return
9798
return wrapper
9899
return decorator
100+
101+
def validate_and_normalize_cell(cell: str):
102+
"""
103+
Проверка на соответствие строки формату ячейки Google Sheets:
104+
- Идут буквы, потому идут цифры
105+
- Буквы латинские
106+
- Буквы в верхнем регистре (нижний регистр не вызывает ошибку -- принудительно переводится в верхний в return)
107+
"""
108+
if not re.match(r'^[A-Za-z]+\d+$', cell):
109+
raise ValueError(f"Invalid cell format: '{cell}'. Must be letters followed by digits (e.g., 'A1', 'B3').")
110+
111+
letters = re.findall(r'[A-Za-z]+', cell)[0]
112+
numbers = re.findall(r'\d+', cell)[0]
113+
114+
if not re.match(r'^[A-Za-z]+$', letters):
115+
raise ValueError(f"Cell contains non-latin characters: '{letters}'. Only Latin letters allowed.")
116+
117+
return letters.upper() + numbers

0 commit comments

Comments
 (0)