Example #1
0
    def __init__(self,
                 base_uri="https://api.github.com",
                 token=None,
                 debug=False,
                 proxies=None,
                 force_curl=False):
        self.base_uri = base_uri
        self.token = token
        self.debug = debug
        self.proxies = proxies

        if debug:
            logger.setLevel(logging.DEBUG)

        # set up requests session with the root CA cert bundle
        cert_path = os.path.join(sublime.packages_path(), "sublime-github",
                                 "ca-bundle.crt")
        if not os.path.isfile(cert_path):
            logger.warning(
                "Root CA cert bundle not found at %s! Not verifying requests."
                % cert_path)
            cert_path = None
        self.rsession = requests.session(
            verify=cert_path,
            config={'verbose': sys.stderr if self.debug else None},
            force_curl=force_curl)
Example #2
0
    def __init__(self,
                 base_uri="https://api.github.com",
                 token=None,
                 debug=False,
                 proxies=None,
                 force_curl=False):
        self.base_uri = base_uri
        self.token = token
        self.debug = debug
        self.proxies = proxies

        if debug:
            try:
                import http.client as httplib
            except ImportError:
                import httplib
            httplib.HTTPConnection.debuglevel = 1
            logger.setLevel(logging.DEBUG)
            requests_log = logging.getLogger("requests.packages.urllib3")
            requests_log.setLevel(logging.DEBUG)
            requests_log.propagate = True

        # set up requests session with the root CA cert bundle
        cert_path = os.path.join(sublime.packages_path(), "sublime-github",
                                 "ca-bundle.crt")
        if not os.path.isfile(cert_path):
            logger.warning(
                "Root CA cert bundle not found at %s! Not verifying requests."
                % cert_path)
            cert_path = None
        self.rsession = requests.session(verify=cert_path,
                                         force_curl=force_curl)
Example #3
0
    def __init__(self, token=None, debug=False):
        self.token = token
        self.debug = debug
        if debug:
            logger.setLevel(logging.DEBUG)

        # set up requests session with the github ssl cert, if found
        cert_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "api.github.com.crt")
        if not os.path.isfile(cert_path):
            logger.warning("GitHub SSL cert not found at %s! Not verifying requests." % cert_path)
            cert_path = None
        self.rsession = requests.session(verify=cert_path,
                                         config={'verbose': sys.stderr if self.debug else None})
Example #4
0
    def __init__(self, base_uri="https://api.github.com", token=None, debug=False):
        self.base_uri = base_uri
        self.token = token
        self.debug = debug
        if debug:
            logger.setLevel(logging.DEBUG)

        # set up requests session with the github ssl cert, if found
        cert_path = os.path.join(sublime.packages_path(), "sublime-github", "api.github.com.crt")
        if not os.path.isfile(cert_path):
            logger.warning("GitHub SSL cert not found at %s! Not verifying requests." % cert_path)
            cert_path = None
        self.rsession = requests.session(verify=cert_path,
                                         config={'verbose': sys.stderr if self.debug else None})
Example #5
0
    def __init__(self, token=None, debug=False):
        self.token = token
        self.debug = debug
        if debug:
            logger.setLevel(logging.DEBUG)

        # set up requests session with the github ssl cert, if found
        cert_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                 "api.github.com.crt")
        if not os.path.isfile(cert_path):
            logger.warning(
                "GitHub SSL cert not found at %s! Not verifying requests." %
                cert_path)
            cert_path = None
        self.rsession = requests.session(
            verify=cert_path,
            config={'verbose': sys.stderr if self.debug else None})
Example #6
0
    def __init__(self, base_uri="https://api.github.com", token=None, debug=False, proxies=None, force_curl=False):
        self.base_uri = base_uri
        self.token = token
        self.debug = debug
        self.proxies = proxies

        if debug:
            logger.setLevel(logging.DEBUG)

        # set up requests session with the root CA cert bundle
        cert_path = os.path.join(sublime.packages_path(), "sublime-github", "ca-bundle.crt")
        if not os.path.isfile(cert_path):
            logger.warning("Root CA cert bundle not found at %s! Not verifying requests." % cert_path)
            cert_path = None
        self.rsession = requests.session(verify=cert_path,
                                         config={'verbose': sys.stderr if self.debug else None},
                                         force_curl=force_curl)
Example #7
0
    def __init__(self, base_uri="https://api.github.com", token=None, debug=False, proxies=None, force_curl=False):
        self.base_uri = base_uri
        self.token = token
        self.debug = debug
        self.proxies = proxies

        if debug:
            try:
                import http.client as httplib
            except ImportError:
                import httplib
            httplib.HTTPConnection.debuglevel = 1
            logger.setLevel(logging.DEBUG)
            requests_log = logging.getLogger("requests.packages.urllib3")
            requests_log.setLevel(logging.DEBUG)
            requests_log.propagate = True

        # set up requests session with the root CA cert bundle
        cert_path = os.path.join(sublime.packages_path(), "sublime-github", "ca-bundle.crt")
        if not os.path.isfile(cert_path):
            logger.warning("Root CA cert bundle not found at %s! Not verifying requests." % cert_path)
            cert_path = None
        self.rsession = requests.session(verify=cert_path, force_curl=force_curl)
Example #8
0
    def __init__(self, api_key, oauth_token):
        self.session = requests.session()

        self.key = api_key
        self.token = oauth_token
Example #9
0
    def __init__(self, api_key, oauth_token):
        self.session = requests.session()

        self.key = api_key
        self.token = oauth_token
Example #10
0
class GitHubApi(object):
    "Encapsulates the GitHub API"
    BASE_URI = "https://api.github.com"
    PER_PAGE = 100
    etags = {}
    cache = {}

    class UnauthorizedException(Exception):
        "Raised if we get a 401 from GitHub"
        pass

    class UnknownException(Exception):
        "Raised if we get a response code we don't recognize from GitHub"
        pass

    # set up requests session with the github ssl cert
    rsession = requests.session(verify=os.path.join(
        os.path.dirname(os.path.abspath(__file__)), "api.github.com.crt"))

    def __init__(self, token):
        self.token = token

    @classmethod
    def get_token(cls, username, password):
        auth_data = {
            "scopes": ["gist"],
            "note": "Sublime GitHub",
            "note_url": "https://github.com/bgreenlee/sublime-github"
        }
        resp = cls.rsession.post("https://api.github.com/authorizations",
                                 auth=(username, password),
                                 data=json.dumps(auth_data))
        if resp.status_code == 201:
            data = json.loads(resp.text)
            return data["token"]
        elif resp.status_code == 401:
            raise cls.UnauthorizedException()
        else:
            raise cls.UnknownException("%d %s" % (resp.status_code, resp.text))

    def post(self, endpoint, data=None):
        return self.request('post', endpoint, data=data)

    def patch(self, endpoint, data=None):
        return self.request('patch', endpoint, data=data)

    def get(self, endpoint, params=None):
        return self.request('get', endpoint, params=params)

    def request(self, method, url, params=None, data=None):
        if not url.startswith("http"):
            url = self.BASE_URI + url
        if data:
            data = json.dumps(data)

        headers = {"Authorization": "token %s" % self.token}
        # add an etag to the header if we have one
        if method == 'get' and url in self.etags:
            headers["If-None-Match"] = self.etags[url]

        resp = self.rsession.request(method,
                                     url,
                                     headers=headers,
                                     params=params,
                                     data=data,
                                     allow_redirects=True)
        full_url = resp.url
        if resp.status_code in [
                requests.codes.ok, requests.codes.created, requests.codes.found
        ]:
            if 'application/json' in resp.headers['content-type']:
                resp_data = json.loads(resp.text)
            else:
                resp_data = resp.text
            if method == 'get':  # cache the response
                etag = resp.headers['etag']
                self.etags[full_url] = etag
                self.cache[etag] = resp_data
            return resp_data
        elif resp.status_code == requests.codes.not_modified:
            return self.cache[resp.headers['etag']]
        elif resp.status_code == requests.codes.unauthorized:
            raise self.UnauthorizedException()
        else:
            raise self.UnknownException("%d %s" %
                                        (resp.status_code, resp.text))

    def create_gist(self,
                    description="",
                    filename="",
                    content="",
                    public=False):
        data = self.post(
            "/gists", {
                "description": description,
                "public": public,
                "files": {
                    filename: {
                        "content": content
                    }
                }
            })
        return data["html_url"]

    def update_gist(self, gist, content):
        filename = gist["files"].keys()[0]
        resp = self.patch(
            "/gists/" + gist["id"], {
                "description": gist["description"],
                "files": {
                    filename: {
                        "content": content
                    }
                }
            })
        return resp["html_url"]

    def list_gists(self, starred=False):
        page = 1
        data = []
        # fetch all pages
        while True:
            endpoint = "/gists" + ("/starred" if starred else "")
            page_data = self.get(endpoint,
                                 params={
                                     'page': page,
                                     'per_page': self.PER_PAGE
                                 })
            data.extend(page_data)
            if len(page_data) < self.PER_PAGE:
                break
            page += 1
        return data