@@ -22,27 +22,28 @@ class LabelBot(object):
2222 issue_comments_endpoint = urljoin (issue_endpoint ,
2323 'comments' )
2424
25- def __init__ (self , token_file , rules_file , default_label , interval ,
25+ def __init__ (self , token_file , github_token , rules_file , default_label ,
2626 check_comments , skip_labeled ):
2727 self .last_issue_checked = 0
28+ self .iterval = 0
2829 self .scheduler = sched .scheduler (time .time , time .sleep )
2930 self .default_label = default_label
30- self .interval = interval
3131 self .check_comments = check_comments
3232 self .skip_labeled = skip_labeled
3333
3434 # get GitHub token
35- self .token = self ._get_token (token_file )
35+ if github_token :
36+ self .token = github_token
37+ else :
38+ self .token = self ._get_token (token_file )
3639
3740 # get request session and validate token
3841 self .session = self ._get_requests_session (self .token )
3942
4043 # load and validate rules
4144 self .rules = self ._get_rules (rules_file )
4245
43- # TODO check status_code
44- self .available_repos_json = self .session .get (
45- self .repos_endpoint ).json ()
46+ self ._update_accessible_repos ()
4647
4748 def add_repos (self , repos ):
4849 """Check provided URLs are valid GitHub repositories.
@@ -65,16 +66,37 @@ def add_repos(self, repos):
6566
6667 # start labeling issues in given repos
6768 for repo in repo_names :
68- self .scheduler .enter (0 , 1 , self ._label_issues ,
69+ self .scheduler .enter (0 , 1 , self ._label_repo ,
6970 argument = (repo ,))
7071
71- def run (self ):
72+ def check_repo_accessible (self , repo ):
73+ """Updates list of available repos and checks whether given repo is
74+ accessible by labelbot.
75+
76+ Args:
77+ repo: full_name of github repository
78+ """
79+ # update available repos
80+ self ._update_accessible_repos ()
81+
82+ if repo in [available_repo ['full_name' ] for available_repo
83+ in self .available_repos_json ]:
84+ return True
85+ else :
86+ return False
87+
88+ def _update_accessible_repos (self ):
89+ # TODO check status_code
90+ self .available_repos_json = self .session .get (
91+ self .repos_endpoint ).json ()
92+
93+ def run_scheduled (self ):
7294 """Initiate labeling by running a scheduler"""
7395 self .scheduler .run ()
7496
75- def _label_issues (self , repo ):
76- """Iterates through all issues in given repo, tries to match all rules
77- and sets a new labels if needed .
97+ def _label_repo (self , repo , reschedule = True ):
98+ """Iterates through all issues in given repo and runs _label_issue() on
99+ each of them .
78100
79101 Args:
80102 repo: Full name of repository in form 'user/repo_name' as returned
@@ -98,53 +120,64 @@ def _label_issues(self, repo):
98120
99121 # iterate through all isues
100122 for issue in issues :
101- labels_to_add = []
102- matched = False
103-
104- # get existing label strings
105- existing_labels = [label ['name' ] for label in issue ['labels' ]]
106-
107- # skip this issue if it is already labeled and skip_labeled
108- # flag was used
109- if self .skip_labeled and len (existing_labels ) > 0 :
110- continue
111-
112- # match rules in issue body and title
113- for rule in self .rules :
114- if rule .pattern .findall (issue ['body' ])\
115- or rule .pattern .findall (issue ['title' ]):
116- labels_to_add .append (rule .label )
117- matched = True
118-
119- # match rules in issue comments if needed
120- if self .check_comments :
121- response = self .session .get (self .issue_comments_endpoint
122- .format (
123- issue = str (issue ['number' ]),
124- repo = repo ))
125- # TODO check status_code
126- comments = response .json ()
127- for comment in comments :
128- for rule in self .rules :
129- if rule .pattern .findall (comment ['body' ]):
130- labels_to_add .append (rule .label )
131- matched = True
132-
133- # set default label if needed
134- if self .default_label and matched == 0 :
135- labels_to_add .append (self .default_label )
136-
137- # set new labels
138- labels_to_add = list (set (labels_to_add )) # make values unique
139- new_labels = existing_labels + labels_to_add
140- if not new_labels == existing_labels :
141- response = self .session .patch (self .issue_endpoint .format (
142- issue = str (issue ['number' ]), repo = repo ),
143- data = json .dumps ({'labels' : new_labels }))
123+ self ._label_issue (repo , issue )
144124
145125 # run this again after given interval
146- self .scheduler .enter (self .interval , 1 , self ._label_issues ,
147- argument = (repo ,))
126+ if reschedule :
127+ self .scheduler .enter (self .interval , 1 , self ._label_repo ,
128+ argument = (repo ,))
129+
130+ def label_issue (self , repo , issue ):
131+ """Iterates through an issue and labels it.
132+
133+ Args:
134+ repo: Full name of repository in form 'user/repo_name' as returned
135+ by GitHub API
136+ issue: json interpretation of issue as returned by GitHub API
137+ """
138+ labels_to_add = []
139+ matched = False
140+
141+ # get existing label strings
142+ existing_labels = [label ['name' ] for label in issue ['labels' ]]
143+
144+ # skip this issue if it is already labeled and skip_labeled
145+ # flag was used
146+ if self .skip_labeled and len (existing_labels ) > 0 :
147+ return
148+
149+ # match rules in issue body and title
150+ for rule in self .rules :
151+ if rule .pattern .findall (issue ['body' ])\
152+ or rule .pattern .findall (issue ['title' ]):
153+ labels_to_add .append (rule .label )
154+ matched = True
155+
156+ # match rules in issue comments if needed
157+ if self .check_comments :
158+ response = self .session .get (self .issue_comments_endpoint
159+ .format (
160+ issue = str (issue ['number' ]),
161+ repo = repo ))
162+ # TODO check status_code
163+ comments = response .json ()
164+ for comment in comments :
165+ for rule in self .rules :
166+ if rule .pattern .findall (comment ['body' ]):
167+ labels_to_add .append (rule .label )
168+ matched = True
169+
170+ # set default label if needed
171+ if self .default_label and matched == 0 :
172+ labels_to_add .append (self .default_label )
173+
174+ # set new labels
175+ labels_to_add = list (set (labels_to_add )) # make values unique
176+ new_labels = existing_labels + labels_to_add
177+ if not new_labels == existing_labels :
178+ response = self .session .patch (self .issue_endpoint .format (
179+ issue = str (issue ['number' ]), repo = repo ),
180+ data = json .dumps ({'labels' : new_labels }))
148181
149182 def _get_rules (self , rules_file ):
150183 """Parse labeling rules from the provided file.
0 commit comments