class PyKickstarter(object):

    API_ROOT = "https://api.kickstarter.com"
    API_KEY = ( "client_id", "2II5GGBZLOOZAA5XBU1U0Y44BU57Q58L8KOGM7H0E0YFHP3KTG" )

    API_URLS = {
            'authenticate' : API_ROOT + "/xauth/access_token",
            'search' : API_ROOT + "/v1/projects/search",
            'get_categories' : API_ROOT + "/v1/categories",
            'category_search' : API_ROOT + "/v1/categories/%d/projects/popular", # Needs the Category ID
            'picks' : API_ROOT + "/v1/categories/projects/picks"
    }

    def __init__(self):
        self.api = PyKickstarterAPI(PyKickstarter.API_KEY)
        self.logged_in = False

    def login(self, email, password):
        response = self.api.request("POST", PyKickstarter.API_URLS['authenticate'], { "email" : email, "password" : password })
        oauth = self.get_auth_token(response)
        if (oauth != -1):
            self.logged_in = True
            self.api.set_access_token(('oauth_token', oauth))
        self.user = self.get_account(response)

    def get_auth_token(self, data):
        return data['access_token'] if 'access_token' in data else -1

    def get_account(self, data):
        return namedtuple('GenericDict', data['user'].keys())(**data['user']) if 'user' in data else None

    def get_backed_projects(self):
        response = self.api.request("GET", self.user.urls['api']['backed_projects'])
        return PyKickstarterProjectGenerator(response, self.api)

    def get_starred_projects(self):
        response = self.api.request("GET", self.user.urls['api']['starred_projects'])
        return PyKickstarterProjectGenerator(response, self.api)

    def get_created_projects(self):
        response = self.api.request("GET", self.user.urls['api']['created_projects'])
        return PyKickstarterProjectGenerator(response, self.api)

    def get_notifications(self):
        response = self.api.request("GET", self.user.urls['api']['notifications'])
        return PyKickstarterNotificationGenerator(response, self.api)

    def get_location(self):
        return PyKickstarterLocation(self.user.location, self.api)

    def refresh_user(self):
        response = self.api.request("GET", self.user.urls['api']['user'])
        self.data = self.get_account({ 'user' : response })

    def search_projects(self, search_terms):
        response = self.api.request("GET", PyKickstarter.API_URLS['search'] + "?" + self.api.encode_get_params({ 'q' : search_terms }))
        return PyKickstarterProjectGenerator(response, self.api)

    def get_categories(self):
        return self.api.request("GET", PyKickstarter.API_URLS['get_categories'])

    def get_category_projects(self, category_id):
        response = self.api.request("GET", PyKickstarter.API_URLS['category_search'] % category_id)
        return PyKickstarterProjectGenerator(response, self.api)

    def get_staff_picks_projects(self):
        response = self.api.request("GET", PyKickstarter.API_URLS['picks'])
        return PyKickstarterProjectGenerator(response, self.api)
class PyKickstarter(object):

    API_ROOT = "https://api.kickstarter.com"
    API_KEY = ("client_id",
               "2II5GGBZLOOZAA5XBU1U0Y44BU57Q58L8KOGM7H0E0YFHP3KTG")

    API_URLS = {
        'authenticate': API_ROOT + "/xauth/access_token",
        'search': API_ROOT + "/v1/projects/search",
        'get_categories': API_ROOT + "/v1/categories",
        'category_search': API_ROOT +
        "/v1/categories/%d/projects/popular",  # Needs the Category ID
        'picks': API_ROOT + "/v1/categories/projects/picks"
    }

    def __init__(self):
        self.api = PyKickstarterAPI(PyKickstarter.API_KEY)
        self.logged_in = False

    def login(self, email, password):
        response = self.api.request("POST",
                                    PyKickstarter.API_URLS['authenticate'], {
                                        "email": email,
                                        "password": password
                                    })
        oauth = self.get_auth_token(response)
        if (oauth != -1):
            self.logged_in = True
            self.api.set_access_token(('oauth_token', oauth))
        self.user = self.get_account(response)

    def get_auth_token(self, data):
        return data['access_token'] if 'access_token' in data else -1

    def get_account(self, data):
        return namedtuple('GenericDict', data['user'].keys())(
            **data['user']) if 'user' in data else None

    def get_backed_projects(self):
        response = self.api.request("GET",
                                    self.user.urls['api']['backed_projects'])
        return PyKickstarterProjectGenerator(response, self.api)

    def get_starred_projects(self):
        response = self.api.request("GET",
                                    self.user.urls['api']['starred_projects'])
        return PyKickstarterProjectGenerator(response, self.api)

    def get_created_projects(self):
        response = self.api.request("GET",
                                    self.user.urls['api']['created_projects'])
        return PyKickstarterProjectGenerator(response, self.api)

    def get_notifications(self):
        response = self.api.request("GET",
                                    self.user.urls['api']['notifications'])
        return PyKickstarterNotificationGenerator(response, self.api)

    def get_location(self):
        return PyKickstarterLocation(self.user.location, self.api)

    def refresh_user(self):
        response = self.api.request("GET", self.user.urls['api']['user'])
        self.data = self.get_account({'user': response})

    def search_projects(self, search_terms):
        response = self.api.request(
            "GET", PyKickstarter.API_URLS['search'] + "?" +
            self.api.encode_get_params({'q': search_terms}))
        return PyKickstarterProjectGenerator(response, self.api)

    def get_categories(self):
        return self.api.request("GET",
                                PyKickstarter.API_URLS['get_categories'])

    def get_category_projects(self, category_id):
        response = self.api.request(
            "GET", PyKickstarter.API_URLS['category_search'] % category_id)
        return PyKickstarterProjectGenerator(response, self.api)

    def get_staff_picks_projects(self):
        response = self.api.request("GET", PyKickstarter.API_URLS['picks'])
        return PyKickstarterProjectGenerator(response, self.api)
 def __init__(self):
     self.api = PyKickstarterAPI(PyKickstarter.API_KEY)
     self.logged_in = False
 def __init__(self):
     self.api = PyKickstarterAPI(PyKickstarter.API_KEY)
     self.logged_in = False