Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Getting all issues and create spreadsheet with a date column to indicate when an issue was moved into To Test for the first time #6

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion config_default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ repos:
- '<organization>/<repository>'
milestone:
- v2.5.8

rke_milestone:
- 'RKE v1.2.8'
11 changes: 0 additions & 11 deletions lib/dates.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import datetime
import businesstimedelta

start_date = None

Expand All @@ -15,13 +14,3 @@ def set_start_date(date_time_str):

def get_start_date():
return start_date


def get_business_hours_rules():
# Define a working day/week
workday = businesstimedelta.WorkDayRule(
start_time=datetime.time(9),
end_time=datetime.time(18),
working_days=[0, 1, 2, 3, 4])

return businesstimedelta.Rules([workday])
53 changes: 52 additions & 1 deletion lib/gh.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ def get_all_users_issues(repos, users, milestone):
done_label = '[zube]: Done'
for repo in repos:
for user in users:
o_milestone = None
milestones = repo.get_milestones(state='open')
o_milestone = [m for m in milestones if m.title == milestone[0]]
if repo.name != 'rke':
Expand Down Expand Up @@ -59,6 +58,30 @@ def get_all_users_issues(repos, users, milestone):
return all_issues


def get_all_users_issues_label(repos, users, milestone, rke_milestone=''):
all_issues = []
for repo in repos:
milestones = repo.get_milestones(state='open')
o_milestone = [m for m in milestones if m.title == milestone[0]]
for user in users:
if len(o_milestone) > 0:
issues = repo.get_issues(assignee=user,
state='all',
milestone=o_milestone[0],
)
all_issues.extend(issues)
else:
if repo.name == 'rke' and rke_milestone != '':
milestones = repo.get_milestones(state='open')
o_milestone = [m for m in milestones if m.title == rke_milestone[0]]
all_issues.extend(repo.get_issues(assignee=user,
state='all',
milestone=o_milestone[0],
)
)
return all_issues


def create_data_for_spreadsheet(issues, users):
worksheet_data = []
for issue in issues:
Expand Down Expand Up @@ -95,3 +118,31 @@ def create_data_for_spreadsheet(issues, users):
test_event_date if issue.state != 'closed' else issue.closed_at
])
return worksheet_data


def create_to_test_data_for_spreadsheet(issues, users):
worksheet_data = []
for issue in issues:
for user in users:
if user in issue.assignees:
dupes = [wd[2] for wd in worksheet_data
if f'{issue.number} {issue.title}' in wd[2] and user.name in wd[0]]
if len(dupes) > 0:
continue
to_test_event_date = None
for e in issue.get_events():
if e.event == 'labeled' and e.label.name == '[zube]: To Test':
to_test_event_date = e.created_at
break
if to_test_event_date is None:
# issue has no event [zube]: To Test -> drop it
continue
worksheet_data.append([
user.name,
issue.repository.name,
f'{issue.number} {issue.title}',
'Closed' if issue.state == 'closed' else 'Working',
issue.html_url,
to_test_event_date
])
return worksheet_data
35 changes: 32 additions & 3 deletions lib/xlsx.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
from .dates import get_today
from .dates import get_start_date
from .dates import get_business_hours_rules
import xlsxwriter


today = get_today()
businesshrs = get_business_hours_rules()


def get_workbook_and_formats():
Expand Down Expand Up @@ -41,6 +39,22 @@ def create_worksheet(workbook, formats):
return worksheet


def create_to_test_worksheet(workbook, formats):
bold = formats['bold']
worksheet = workbook.add_worksheet('QAIssues')
worksheet.set_column(0, 0, 25)
worksheet.set_column(1, 1, 15)
worksheet.set_column(2, 2, 50)
worksheet.set_column(4, 5, 25)
worksheet.write('A1', 'FIRST TIME TO TEST ISSUES', bold)
worksheet.write('A2', 'Person', bold)
worksheet.write('B2', 'Repo', bold)
worksheet.write('C2', 'Issue', bold)
worksheet.write('D2', 'Status', bold)
worksheet.write('E2', 'Updated At', bold)
return worksheet


def write_gh_data_to_worksheet(worksheet, worksheet_data, workbook_formats):
worksheet_data.sort()
row = 2
Expand All @@ -50,7 +64,8 @@ def write_gh_data_to_worksheet(worksheet, worksheet_data, workbook_formats):
bg_yellow = workbook_formats['bg_yellow']
time_diff_hours = None
if size:
time_diff_hours = businesshrs.difference(updated_or_closed_at, today).timedelta.total_seconds() / 3600
# time_diff_hours = businesshrs.difference(updated_or_closed_at, today).timedelta.total_seconds() / 3600
time_diff_hours = (today - updated_or_closed_at).total_seconds() / 3600
if (time_diff_hours and time_diff_hours > 0) and status != 'Closed':
worksheet.write_string(row, col, name, cell_format=bg_yellow)
worksheet.write_string(row, col + 1, repo, cell_format=bg_yellow)
Expand All @@ -68,3 +83,17 @@ def write_gh_data_to_worksheet(worksheet, worksheet_data, workbook_formats):
worksheet.write_string(row, col + 4, size)
worksheet.write_datetime(row, col + 5, updated_or_closed_at, workbook_formats['date_format'])
row += 1


def write_gh_to_test_data_to_worksheet(worksheet, worksheet_data, workbook_formats):
worksheet_data.sort()
row = 2
col = 0

for name, repo, issue, status, url, updated_or_closed_at in worksheet_data:
worksheet.write_string(row, col, name)
worksheet.write_string(row, col + 1, repo)
worksheet.write_url(row, col + 2, url, string=issue)
worksheet.write_string(row, col + 3, status)
worksheet.write_datetime(row, col + 4, updated_or_closed_at, workbook_formats['date_format'])
row += 1
29 changes: 25 additions & 4 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
from lib import github_authenticate
from lib.dates import set_start_date
from lib.gh import create_data_for_spreadsheet
from lib.gh import create_to_test_data_for_spreadsheet
from lib.gh import get_filtered_repos
from lib.gh import get_users_by_ids
from lib.gh import get_all_users_issues
from lib.gh import get_all_users_issues_label
from lib.xlsx import create_worksheet
from lib.xlsx import create_to_test_worksheet
from lib.xlsx import get_workbook_and_formats
from lib.xlsx import write_gh_data_to_worksheet
from lib.xlsx import write_gh_to_test_data_to_worksheet
import confuse
import argparse

template = {
'users_ids': confuse.StrSeq(),
'repos': confuse.StrSeq(),
'milestone': confuse.StrSeq()
'milestone': confuse.StrSeq(),
'rke_milestone': confuse.StrSeq()
}


Expand All @@ -31,6 +36,18 @@ def main(users_ids, repos, milestone):
workbook.close()


def get_to_test(users_ids, repos, milestone, rke_milestone):
github_authenticate(args.token)
repos = get_filtered_repos(repos)
users = get_users_by_ids(users_ids)
all_issues = get_all_users_issues_label(repos, users, milestone, rke_milestone)
worksheet_data = create_to_test_data_for_spreadsheet(all_issues, users)
workbook, workbook_formats = get_workbook_and_formats()
worksheet = create_to_test_worksheet(workbook, workbook_formats)
write_gh_to_test_data_to_worksheet(worksheet, worksheet_data, workbook_formats)
workbook.close()


if __name__ == '__main__':
config = confuse.Configuration('issues_finder', __name__)
parser = argparse.ArgumentParser(description='get github issues')
Expand All @@ -39,10 +56,14 @@ def main(users_ids, repos, milestone):
parser.add_argument('--date', '-d', dest='date',
help='start date to start search for issues format: %Y-%m-%d 2021-03-20')

parser.add_argument('--totest', '-tt', action='store_true')

args = parser.parse_args()
config.set_file('./config_default.yaml')
config.set_args(args, dots=True)

# print('configuration directory is', config.config_dir())
print(config.keys())
valid = config.get(template)
main(valid.users_ids, valid.repos, valid.milestone)
if 'totest' in config.keys():
get_to_test(valid.users_ids, valid.repos, valid.milestone, valid.rke_milestone)
else:
main(valid.users_ids, valid.repos, valid.milestone)