Skip to content

Commit ba41e4b

Browse files
add dataclasses (#106)
- dataclasses instead of dicts - constants - refactor
1 parent a5e27a4 commit ba41e4b

14 files changed

+316
-315
lines changed

ForgejoRepoAPI.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,12 @@
1-
from interface_wrapper import (
2-
logging,
3-
IRepositoryAPI,
4-
Repository,
5-
Commit,
6-
Branch,
7-
User,
8-
Contributor,
9-
Issue,
10-
PullRequest,
11-
WikiPage,
12-
Comment,
13-
Invite,
14-
)
151
import base64
162
import sys
17-
from pyforgejo import PyforgejoApi
3+
184
import isodate
5+
from pyforgejo import PyforgejoApi
6+
7+
from interface_wrapper import (Branch, Comment, Commit, Contributor, Invite,
8+
IRepositoryAPI, Issue, PullRequest, Repository,
9+
User, WikiPage, logging)
1910

2011

2112
class ForgejoRepoAPI(IRepositoryAPI):

GitHubRepoAPI.py

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,6 @@
1-
from interface_wrapper import (
2-
logging,
3-
Repository,
4-
Contributor,
5-
Commit,
6-
Issue,
7-
PullRequest,
8-
WikiPage,
9-
Branch,
10-
IRepositoryAPI,
11-
User,
12-
Comment,
13-
Invite,
14-
)
1+
from interface_wrapper import (Branch, Comment, Commit, Contributor, Invite,
2+
IRepositoryAPI, Issue, PullRequest, Repository,
3+
User, WikiPage, logging)
154

165

176
class GitHubRepoAPI(IRepositoryAPI):

commits_parser.py

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
1-
from utils import logger
2-
import pytz
1+
from dataclasses import asdict, dataclass
32
from time import sleep
43

5-
# from github import Github, Repository, GithubException, PullRequest
4+
import pytz
5+
6+
from constants import EMPTY_FIELD, GOOGLE_MAX_CELL_LEN, TIMEDELTA, TIMEZONE
67
from interface_wrapper import IRepositoryAPI, Repository
8+
from utils import logger
9+
710

8-
EMPTY_FIELD = 'Empty field'
9-
TIMEDELTA = 0.05
10-
TIMEZONE = 'Europe/Moscow'
11-
FIELDNAMES = (
12-
'repository name',
13-
'author name',
14-
'author login',
15-
'author email',
16-
'date and time',
17-
'changed files',
18-
'commit id',
19-
'branch',
20-
)
21-
GOOGLE_MAX_CELL_LEN = 50000
11+
@dataclass(kw_only=True, frozen=True)
12+
class CommitData:
13+
repository_name: str = ''
14+
author_name: str = ''
15+
author_email: str = ''
16+
datetime: str = ''
17+
changed_files: str = ''
18+
commit_id: str = ''
19+
branch: str = ''
2220

2321

2422
def log_repository_commits(
@@ -45,18 +43,19 @@ def log_repository_commits(
4543
continue
4644

4745
changed_files = '; '.join([file for file in commit.files])
48-
commit_data = [
49-
repository.name,
50-
commit.author.username,
51-
commit.author.email or EMPTY_FIELD,
52-
commit.date,
53-
changed_files[:GOOGLE_MAX_CELL_LEN],
54-
commit._id,
55-
branch,
56-
]
57-
info = dict(zip(FIELDNAMES, commit_data))
46+
changed_files = changed_files[:GOOGLE_MAX_CELL_LEN]
47+
commit_data = CommitData(
48+
repository_name=repository.name,
49+
author_name=commit.author.username,
50+
author_email=commit.author.email or EMPTY_FIELD,
51+
datetime=commit.date.astimezone(pytz.timezone(TIMEZONE)).isoformat(),
52+
changed_files=changed_files,
53+
commit_id=commit._id,
54+
branch=branch,
55+
)
56+
info = asdict(commit_data)
5857

59-
logger.log_to_csv(csv_name, FIELDNAMES, info)
58+
logger.log_to_csv(csv_name, list(info.keys()), info)
6059
logger.log_to_stdout(info)
6160

6261
sleep(TIMEDELTA)
@@ -65,7 +64,8 @@ def log_repository_commits(
6564
def log_commits(
6665
client: IRepositoryAPI, working_repos, csv_name, start, finish, branch, fork_flag
6766
):
68-
logger.log_to_csv(csv_name, FIELDNAMES)
67+
info = asdict(CommitData())
68+
logger.log_to_csv(csv_name, list(info.keys()))
6969

7070
for repo, token in working_repos:
7171
try:

constants.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
EMPTY_FIELD = 'Empty field'
2+
TIMEDELTA = 0.05
3+
TIMEZONE = 'Europe/Moscow'
4+
GOOGLE_MAX_CELL_LEN = 50000
5+
TITLE_LEN = 80
6+
MIN_SIDE_PADDING = 4
7+
SIDE_WHITE_SPACES = 1
8+
WIKI_FIELDNAMES = [
9+
'repository name',
10+
'author name',
11+
'author login',
12+
'datetime',
13+
'page',
14+
'action',
15+
'revision id',
16+
'added lines',
17+
'deleted lines',
18+
]

contributors_parser.py

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
1-
from utils import logger
1+
from dataclasses import asdict, dataclass
22
from time import sleep
33
from typing import Generator
4+
5+
from constants import EMPTY_FIELD, TIMEDELTA
46
from interface_wrapper import IRepositoryAPI, Repository
7+
from utils import logger
8+
59

6-
EMPTY_FIELD = 'Empty field'
7-
TIMEDELTA = 0.05
8-
TIMEZONE = 'Europe/Moscow'
9-
FIELDNAMES = (
10-
'repository name',
11-
'login',
12-
'name',
13-
'email',
14-
'url',
15-
'permissions',
16-
'total_commits',
17-
'id',
18-
'node_id',
19-
'type',
20-
'bio',
21-
'site_admin',
22-
)
10+
@dataclass(kw_only=True, frozen=True)
11+
class ContributorData:
12+
repository_name: str = ''
13+
login: str = ''
14+
name: str = ''
15+
email: str = ''
16+
url: str = ''
17+
permissions: str = ''
18+
total_commits: int = 0
19+
node_id: str = ''
20+
type: str = ''
21+
bio: str = ''
22+
site_admin: bool = False
2323

2424

2525
def log_repository_contributors(
@@ -36,22 +36,24 @@ def nvl(val):
3636
repository, contributor
3737
)
3838

39-
info_tmp = {
40-
'repository name': repository.name,
41-
'login': contributor.login,
42-
'name': nvl(contributor.username),
43-
'email': nvl(contributor_stat['email']),
44-
'url': contributor.html_url,
45-
'permissions': nvl(contributor_permissions),
46-
'total_commits': contributor_stat['total_commits'],
47-
'node_id': contributor.node_id,
48-
'type': contributor.type,
49-
'bio': nvl(contributor.bio),
50-
'site_admin': contributor.site_admin,
51-
}
52-
53-
logger.log_to_csv(csv_name, FIELDNAMES, info_tmp)
54-
logger.log_to_stdout(info_tmp)
39+
contributor_data = ContributorData(
40+
repository_name=repository.name,
41+
login=contributor.login,
42+
name=nvl(contributor.username),
43+
email=nvl(contributor_stat['email']),
44+
url=contributor.html_url,
45+
permissions=nvl(contributor_permissions),
46+
total_commits=contributor_stat['total_commits'],
47+
node_id=contributor.node_id,
48+
type=contributor.type,
49+
bio=nvl(contributor.bio),
50+
site_admin=contributor.site_admin,
51+
)
52+
53+
info_dict = asdict(contributor_data)
54+
55+
logger.log_to_csv(csv_name, list(info_dict.keys()), info_dict)
56+
logger.log_to_stdout(info_dict)
5557

5658
sleep(TIMEDELTA)
5759

@@ -80,7 +82,8 @@ def get_contributors_stats(client: IRepositoryAPI, repository: Repository) -> di
8082
def log_contributors(
8183
client: IRepositoryAPI, working_repos: Generator, csv_name: str, fork_flag: bool
8284
):
83-
logger.log_to_csv(csv_name, FIELDNAMES)
85+
info = asdict(ContributorData())
86+
logger.log_to_csv(csv_name, list(info.keys()))
8487

8588
for repo, token in working_repos:
8689
try:

export_sheets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import pygsheets
21
import pandas as pd
2+
import pygsheets
33

44
INT_MASS = [{"one": 1, "two": 2, "what?": 3}]
55

git_logger.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
from interface_wrapper import RepositoryFactory, IRepositoryAPI
21
from time import sleep
32

4-
TIMEDELTA = 0.05
5-
TIMEZONE = 'Europe/Moscow'
3+
from constants import TIMEDELTA
4+
from interface_wrapper import IRepositoryAPI, RepositoryFactory
65

76

87
def login(source, token, base_url):
@@ -69,7 +68,6 @@ def get_next_repo(clients: GitClients, repositories):
6968
print(f'get_next_repo(): failed to load repository "{repo_name}"')
7069
exit(1)
7170
else:
72-
print(cur_client['token'])
7371
yield repo, cur_client['token']
7472

7573

interface_wrapper.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import logging
12
from abc import ABC, abstractmethod
2-
from datetime import datetime
33
from dataclasses import dataclass
4-
import logging
4+
from datetime import datetime
55

66
from github import Github
77
from pyforgejo import PyforgejoApi
@@ -178,8 +178,8 @@ class RepositoryFactory:
178178
def create_api(
179179
source: str, token: str, base_url: str | None = None
180180
) -> IRepositoryAPI:
181-
from GitHubRepoAPI import GitHubRepoAPI
182181
from ForgejoRepoAPI import ForgejoRepoAPI
182+
from GitHubRepoAPI import GitHubRepoAPI
183183

184184
if source == 'github':
185185
return GitHubRepoAPI(Github(token))

invites_parser.py

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,39 @@
1-
from utils import logger
1+
from dataclasses import asdict, dataclass
22
from time import sleep
3-
from interface_wrapper import IRepositoryAPI, Repository
43

5-
FIELDNAMES = (
6-
'repository name',
7-
'invited login',
8-
'invite creation date',
9-
'invitation url',
10-
)
11-
TIMEDELTA = 0.05
4+
from constants import TIMEDELTA
5+
from interface_wrapper import IRepositoryAPI, Repository
6+
from utils import logger
127

138

14-
def log_inviter(repo, invite, writer):
15-
invite_info = [
16-
repo.full_name,
17-
invite.invitee.login,
18-
invite.created_at.strftime("%d/%m/%Y, %H:%M:%S"),
19-
invite.html_url,
20-
]
21-
writer.writerow(invite_info)
22-
print(invite_info)
9+
@dataclass(kw_only=True, frozen=True)
10+
class InviteData:
11+
repository_name: str = ''
12+
invited_login: str = ''
13+
invite_creation_date: str = ''
14+
invitation_url: str = ''
2315

2416

2517
def log_repository_invitations(
26-
client: IRepositoryAPI, repository: Repository, csv_name
18+
client: IRepositoryAPI, repository: Repository, csv_name: str
2719
):
2820
invitations = client.get_invites(repository)
2921
for invite in invitations:
30-
invite_info = {
31-
'repository name': repository.name,
32-
'invited login': invite.invitee.login,
33-
'invite creation date': invite.created_at.strftime("%d/%m/%Y, %H:%M:%S"),
34-
'invitation url': invite.html_url,
35-
}
36-
logger.log_to_csv(csv_name, FIELDNAMES, invite_info)
37-
logger.log_to_stdout(invite_info)
22+
invite_data = InviteData(
23+
repository_name=repository.name,
24+
invited_login=invite.invitee.login,
25+
invite_creation_date=invite.created_at.strftime("%d/%m/%Y, %H:%M:%S"),
26+
invitation_url=invite.html_url,
27+
)
28+
invite_dict = asdict(invite_data)
29+
logger.log_to_csv(csv_name, list(invite_dict.keys()), invite_dict)
30+
logger.log_to_stdout(invite_dict)
3831
sleep(TIMEDELTA)
3932

4033

41-
def log_invitations(client: IRepositoryAPI, working_repos, csv_name):
42-
logger.log_to_csv(csv_name, FIELDNAMES)
34+
def log_invitations(client: IRepositoryAPI, working_repos, csv_name: str):
35+
info = asdict(InviteData())
36+
logger.log_to_csv(csv_name, list(info.keys()))
4337

4438
for repo, token in working_repos:
4539
logger.log_title(repo.name)

0 commit comments

Comments
 (0)