You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

90 lines
2.5 KiB
Python

#!/usr/bin/env python
import argparse
from stackexchange import *
from pyquery import PyQuery as pq
import sys
class NoResult(Exception):
pass
class SOSearch(Site):
def __init__(self, qs, tags=None, **kw):
self.qs = qs
self.tags = '' if tags == None else tags
self.domain = 'api.stackoverflow.com'
super(SOSearch, self).__init__(self.domain, **kw)
self.qs = self.search(order=DESC, sort='votes', tagged=self.tags,
intitle=self.qs, filter='!-u2CTCMX')
if len(self.qs) == 0:
raise NoResult
def first_q(self):
self._populate_one_question(self.qs[0])
return self.qs[0]
def has_code(self, answer):
return '<code>' in answer.body
def _find_best_answer(self, question):
if hasattr(question, 'is_accepted_id'):
for a in question.answers:
if not self.has_code(a):
continue
if a.id == question.is_accepted_id:
question.best_answer = a
else:
for a in question.answers:
if self.has_code(a):
question.best_answer = question.answers[0]
else:
continue
def _order_answers(self, qs):
ordered = sorted(qs.answers, key=lambda a: a.score, reverse=True)
qs.answers = ordered
def _populate_one_question(self, qs):
qs.fetch()
qs.answers = self.answers([a.id for a in qs.answers], order=DESC, body='true')
for a in qs.answers:
html = pq(a.body)
el = html('code')
a.code = el.text()
self._order_answers(qs)
self._find_best_answer(qs)
def main(args):
"""docstring for main"""
try:
args.query = ' '.join(args.query).replace('?', '')
so = SOSearch(args.query, args.tags)
result = so.first_q().best_answer.code
if result != None:
print(result)
else:
print("Sorry I can't find your answer, try adding tags")
except NoResult:
print("Sorry I can't find your answer, try adding tags")
def cli_run():
"""docstring for argparse"""
parser = argparse.ArgumentParser(description='Stupidly simple code answers from StackOverflow')
parser.add_argument('query', help="What's the problem ?", type=str, nargs='+')
parser.add_argument('-t','--tags', help='semicolon separated tags -> python;lambda')
args = parser.parse_args()
main(args)
if __name__ == '__main__':
cli_run()