Skip to content

Commit 0a56c44

Browse files
committed
unit test for token usage
2 parents cc27ae8 + ba41e4b commit 0a56c44

23 files changed

+385
-1122
lines changed

.github/workflows/tests.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,23 @@ jobs:
5151

5252
- name: Show out.csv
5353
run: cat out.csv
54+
55+
token-usage-unit_test:
56+
57+
runs-on: ubuntu-latest
58+
steps:
59+
- uses: actions/checkout@v4
60+
61+
- name: Cache pip
62+
uses: actions/cache@v3
63+
with:
64+
path: ~/.cache/pip
65+
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
66+
restore-keys: |
67+
${{ runner.os }}-pip-
68+
69+
- name: Install dependencies
70+
run: pip install -r requirements.txt
71+
72+
- name: Run test
73+
run: python3 test_token_usage.py --tt1 ${{ secrets.TEST_TOKEN_GITHUB }} -tt2 ${{ secrets.SECOND_TEST_TOKEN_GITHUB }} --repo moevm/github_repo_commitment_calc --out out.csv

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 & 15 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
from github import Github, GithubException
176

@@ -117,7 +106,6 @@ def get_issues(self, repo: Repository) -> list[Issue]:
117106
def get_pull_requests(self, repo: Repository) -> list[PullRequest]:
118107
try:
119108
pulls = self.client.get_repo(repo._id).get_pulls(state='all')
120-
print(dir(pulls[0].merged_by))
121109
return [
122110
PullRequest(
123111
_id=p.number,

commits_parser.py

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
from utils import logger
2-
import pytz
1+
from dataclasses import asdict, dataclass
32
from time import sleep
3+
from typing import Generator
4+
from datetime import datetime
5+
6+
import pytz
47

5-
# from github import Github, Repository, GithubException, PullRequest
8+
from constants import EMPTY_FIELD, GOOGLE_MAX_CELL_LEN, TIMEDELTA, TIMEZONE
69
from interface_wrapper import IRepositoryAPI, Repository
10+
from utils import logger
11+
712

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
13+
@dataclass(kw_only=True, frozen=True)
14+
class CommitData:
15+
repository_name: str = ''
16+
author_name: str = ''
17+
author_email: str = ''
18+
datetime: str = ''
19+
changed_files: str = ''
20+
commit_id: str = ''
21+
branch: str = ''
2222

2323

2424
def log_repository_commits(
@@ -45,29 +45,36 @@ def log_repository_commits(
4545
continue
4646

4747
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))
48+
changed_files = changed_files[:GOOGLE_MAX_CELL_LEN]
49+
commit_data = CommitData(
50+
repository_name=repository.name,
51+
author_name=commit.author.username,
52+
author_email=commit.author.email or EMPTY_FIELD,
53+
datetime=commit.date.astimezone(pytz.timezone(TIMEZONE)).isoformat(),
54+
changed_files=changed_files,
55+
commit_id=commit._id,
56+
branch=branch,
57+
)
58+
info = asdict(commit_data)
5859

59-
logger.log_to_csv(csv_name, FIELDNAMES, info)
60+
logger.log_to_csv(csv_name, list(info.keys()), info)
6061
logger.log_to_stdout(info)
6162

6263
sleep(TIMEDELTA)
6364

6465

6566
def log_commits(
66-
client: IRepositoryAPI, working_repos, csv_name, start, finish, branch, fork_flag
67+
binded_repos: Generator[tuple[IRepositoryAPI, Repository, str], None],
68+
csv_name: str,
69+
start: datetime,
70+
finish: datetime,
71+
branch: str,
72+
fork_flag: bool,
6773
):
68-
logger.log_to_csv(csv_name, FIELDNAMES)
74+
info = asdict(CommitData())
75+
logger.log_to_csv(csv_name, list(info.keys()))
6976

70-
for repo, token in working_repos:
77+
for client, repo, token in binded_repos:
7178
try:
7279
logger.log_title(repo.name)
7380
log_repository_commits(client, repo, csv_name, start, finish, branch)

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: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
1-
from utils import logger
1+
from dataclasses import asdict, dataclass
22
from time import sleep
33
from typing import Generator
4+
from datetime import datetime
5+
6+
from constants import EMPTY_FIELD, TIMEDELTA
47
from interface_wrapper import IRepositoryAPI, Repository
8+
from utils import logger
9+
510

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-
)
11+
@dataclass(kw_only=True, frozen=True)
12+
class ContributorData:
13+
repository_name: str = ''
14+
login: str = ''
15+
name: str = ''
16+
email: str = ''
17+
url: str = ''
18+
permissions: str = ''
19+
total_commits: int = 0
20+
node_id: str = ''
21+
type: str = ''
22+
bio: str = ''
23+
site_admin: bool = False
2324

2425

2526
def log_repository_contributors(
@@ -36,22 +37,24 @@ def nvl(val):
3637
repository, contributor
3738
)
3839

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)
40+
contributor_data = ContributorData(
41+
repository_name=repository.name,
42+
login=contributor.login,
43+
name=nvl(contributor.username),
44+
email=nvl(contributor_stat['email']),
45+
url=contributor.html_url,
46+
permissions=nvl(contributor_permissions),
47+
total_commits=contributor_stat['total_commits'],
48+
node_id=contributor.node_id,
49+
type=contributor.type,
50+
bio=nvl(contributor.bio),
51+
site_admin=contributor.site_admin,
52+
)
53+
54+
info_dict = asdict(contributor_data)
55+
56+
logger.log_to_csv(csv_name, list(info_dict.keys()), info_dict)
57+
logger.log_to_stdout(info_dict)
5558

5659
sleep(TIMEDELTA)
5760

@@ -78,11 +81,14 @@ def get_contributors_stats(client: IRepositoryAPI, repository: Repository) -> di
7881

7982

8083
def log_contributors(
81-
client: IRepositoryAPI, working_repos: Generator, csv_name: str, fork_flag: bool
84+
binded_repos: Generator[tuple[IRepositoryAPI, Repository, str], None],
85+
csv_name: str,
86+
fork_flag: bool,
8287
):
83-
logger.log_to_csv(csv_name, FIELDNAMES)
88+
info = asdict(ContributorData())
89+
logger.log_to_csv(csv_name, list(info.keys()))
8490

85-
for repo, token in working_repos:
91+
for client, repo, token in binded_repos:
8692
try:
8793
logger.log_title(repo.name)
8894
log_repository_contributors(client, repo, csv_name)

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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from interface_wrapper import RepositoryFactory, IRepositoryAPI
21
from time import sleep
32

4-
TIMEDELTA = 0.05
3+
from constants import TIMEDELTA
4+
from interface_wrapper import IRepositoryAPI, RepositoryFactory
55

66
def login(source, token, base_url):
77
client = RepositoryFactory.create_api(source, token, base_url)
@@ -21,7 +21,6 @@ def get_repos_from_file(repos_path: str) -> list[str]:
2121

2222
return list_repos
2323

24-
2524
class Clients:
2625
def __init__(self, source: str, tokens: list[str], base_url: str | None = None):
2726
# Возможно это можно переписать покрасивее

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, Auth
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(auth=Auth.Token(token)))

0 commit comments

Comments
 (0)