示例#1
0
 def do_authenticate(self, line):
     """
         This will authenticate you
     """
     self.oauth_api = GeekListOauthApi(consumer_info=consumer_info)
     request_token = self.oauth_api.request_token(type='oob')
     import webbrowser
     oauth_token = request_token['oauth_token']
     webbrowser.open(self.authorize_url + '?oauth_token=%s' % oauth_token)
     self.result = request_token
     print 'Once you got the verifier code from geekli.st. ' \
           'Call verify [code]'
示例#2
0
 def do_authenticate(self, line):
     """
         This will authenticate you
     """
     self.oauth_api = GeekListOauthApi(consumer_info=consumer_info)
     request_token = self.oauth_api.request_token(type='oob')
     import webbrowser
     oauth_token = request_token['oauth_token']
     webbrowser.open(self.authorize_url + '?oauth_token=%s' % oauth_token)
     self.result = request_token
     print 'Once you got the verifier code from geekli.st. ' \
           'Call verify [code]'
示例#3
0
class GeekCli(cmd.Cmd):
    prompt = 'geek>'
    page_count = 10
    gklist_objects = ['card', 'micro', 'link']
    listable_objects = [
        'followers', 'following', 'cards', 'micros', 'activities', 'links',
        'stream', 'populars'
    ]

    def do_whoami(self, line):
        """
            whoami
            Print the user information about the current authenticate user
        """
        self.type = 'info'
        self.result = self.api.user_info()

    def do_whois(self, name):
        """
            whois name
            Print the user information about user named [name]
        """

        self.type = 'info'
        self.result = self.api.user_info(username=name)

    def _list_user_activities(self, line):
        line_tokens = line.split()
        self.name = line_tokens[0] if line_tokens else None
        self.filter_type = line_tokens[1] if line_tokens and \
                                             len(line_tokens) > 1 else None
        self.result = self.api.list_user_activities(
            username=self.name, filter_type=self.filter_type)
        self.count = len(self.result)

    def __autocomplete(self, list, text):
        if not text:
            completions = list
        else:
            completions = [f for f in list if f.startswith(text)]
        return completions

    def complete_list(self, text, line, begidx, endidx):
        list_types = self.listable_objects
        return self.__autocomplete(list=list_types, text=text)

    def _call_list_function(self):
        function = getattr(self.api, 'list_' + self.type)
        result = function(self.name, self.page, self.page_count)
        if self.type == 'populars':
            self.result = result['links']
            self.count = len(self.result)
        else:
            self.result = result[self.type]
            self.count = result['total_%s' % self.type]

    def do_list(self, line):
        """
            list [activities|cards|micros|followers|following|populars|links] [name]
            Return the list of objects for a given [name]. If no name is
            provided Then it will return the list for the current authenticated user.

            After this command. You can use :
                next : to fetch the next page of result.
                show [attr] : to list an attribute.
                get [index] : to retrieve a specific object.
        """
        line_tokens = line.split()
        self.type = line_tokens[0]
        if self.type == 'activities':
            return self._list_user_activities(line.replace('activities', ''))
        self.name = line_tokens[1] if len(line_tokens) > 1 else None
        self.page = 1
        self._call_list_function()

    def do_fetch(self, line):
        """
            fetch [card|micro] id

            This will fetch a card or micro information given its id.

        """
        fetch_functions = {
            'card': self.api.card,
            'cards': self.api.card,
            'micro': self.api.micro,
            'micros': self.api.micro
        }
        line_tokens = line.split(' ')
        if len(line_tokens) == 2:
            type = line_tokens[0]
            arg = line_tokens[1]

            if type not in self.gklist_objects:
                self.result = "valid fetch objects are card and micro"
                return
        else:
            type = self.type
            arg = line_tokens[0]

        id = arg

        function = fetch_functions[type]
        self.result = function(id)

    def do_show(self, attr):
        """
            show attribute
            If attribute == 'count' Then show the total of object created
            Else This will print the attribute for each object return from the last command
        """
        self.skip_print = True
        if attr == 'count':
            print self.count
            return
        if type(self.result) == dict:
            print self.result[attr]
        else:
            print[item[attr] for item in self.result]

    def do_get(self, index):
        """
            get index
            Retrieve the object at position [index].
            Note: first and last are valid arguments
        """
        if index == 'last':
            index = -1
        if index == 'first':
            index = 0
        try:
            self.result = self.result[int(index)]
        except IndexError:
            self.result = "there is only %s elements in the array" % \
                          len(self.result)
            return

    def do_authenticate(self, line):
        """
            This will authenticate you
        """
        self.oauth_api = GeekListOauthApi(consumer_info=consumer_info)
        request_token = self.oauth_api.request_token(type='oob')
        import webbrowser
        oauth_token = request_token['oauth_token']
        webbrowser.open(self.authorize_url + '?oauth_token=%s' % oauth_token)
        self.result = request_token
        print 'Once you got the verifier code from geekli.st. ' \
              'Call verify [code]'

    def do_verify(self, line):
        """
          verify [code]
          This will fetch an access code after you authenticated on geekli.st.
          You need to provide the verifier code shown on their website
        """
        self.result = self.oauth_api.access_token(self.result, line)
        access_token = self.result
        json_file = open(self.access_token_file_name, mode='w')
        json.dump(access_token, json_file)
        json_file.close()
        self.api = GeekListUserApi(consumer_info=consumer_info,
                                   token=access_token)

    def complete_create(self, text, line, begidx, endidx):
        return self.__autocomplete(list=self.gklist_objects, text=text)

    complete_h5 = complete_create
    complete_reply = complete_create

    def do_create(self, line):
        """
            create {0} text...
            This will create a card or a micro. The rest of the line will be the arguments of created object
            examples:
                create card headline
                create micro status
                create link url|title|description|communities|category #only url and title are required, communities are comma-separated
        """.format(self.gklist_objects)
        line_tokens = line.split(' ')
        type = line_tokens[0]
        text = ' '.join(line_tokens[1:])
        if type not in self.gklist_objects:
            print "valid creation object are card and micro"

        if type == 'card':
            self.result = self.api.create_card(headline=text)
        elif type == 'micro':
            self.result = self.api.create_micro(status=text)
        elif type == 'link':
            self.result = self.api.create_link(*text.split("|"))
        self.type = type

    def do_h5(self, line):
        """
            h5 [card|micro] [id]
            This will send an h5 for the object
        """
        line_tokens = line.split(' ')
        type = line_tokens[0]
        object_id = line_tokens[1]
        if type not in self.gklist_objects:
            self.result = "only card and micro can be highfived"

        if type == 'card':
            self.result = self.api.high_five_card(object_id)

        elif type == 'micro':
            self.result = self.api.high_five_micro(object_id)

    def do_reply(self, line):
        """
            reply [card|micro] id text...
            Create a micro in reply to a card or micro with the rest of the
            line as the text
        """
        line_tokens = line.split(' ')
        type = line_tokens[0]
        object_id = line_tokens[1]
        text = line_tokens[2:]
        if type not in self.gklist_objects:
            self.result = "valid reply objects are card and micro"
            return

        if type == 'card':
            self.result = api.reply_to_card(card_id=object_id, status=text)
        elif type == 'micro':
            self.result = api.reply_to_micro(micro_id=object_id, status=text)
        self.type = type

    def do_set_url(self, url):
        """
            set_url url
            Change the base url
        """
        BaseGeeklistApi.BASE_URL = url
        self.result = "url is now %s" % BaseGeeklistApi.BASE_URL

    def do_next(self, ignore):
        """
            next
            This will fetch the next page of elements
        """
        if self.type not in self.listable_objects:
            self.result = "You must call list before calling next"
            return

        self.page += 1

        if self.type == 'activities':
            self.result = self.api.list_user_activities(
                username=self.name,
                filter_type=self.filter_type,
                page=self.page,
                count=self.page_count)
            return
        elif self.type == 'stream':
            self.result = self.api.list_all_activity(
                filter_type=self.filter_type,
                page=self.page,
                count=self.page_count)
            return

        self._call_list_function()

    def do_follow(self, name):
        """
            Follow [name]
            Will now follow [name] on geeklist
        """
        user = self.api.user_info(username=name)
        self.result = self.api.follow(user_id=user['id'])

    def do_unfollow(self, name):
        """
            Unfollow [name]
            Will unfollow [name] on geeklist
        """
        user = self.api.user_info(username=name)
        self.result = self.api.unfollow(user_id=user['id'])

    def do_stream(self, line):
        """
            stream [filter]
            Return the activity stream of geekli.st filtered by [filter]
        """
        line_tokens = line.split(' ')
        self.filter_type = line_tokens[0] if line_tokens else None
        self.type = 'stream'
        self.name = None
        self.page = 1
        self.result = self.api.list_all_activity(filter_type=self.filter_type,
                                                 page=self.page,
                                                 count=self.page_count)
        self.count = len(self.result)

    def do_page_count(self, count):
        """
            page_count number
            Set the number of results per page
        """
        self.page_count = count

    def do_quit(self, *args):
        self.skip_print = True
        return True

    do_exit = do_quit

    def do_EOF(self, line):
        """Exit"""
        self.skip_print = True
        return True

    def postcmd(self, stop, line):
        """
            Executed after each command. This will usually print
            the result of the command unless the skip_print variable have been set to True

        """
        if getattr(self, 'skip_print', False):
            self.skip_print = False
        elif not line.startswith('help'):
            if getattr(self, 'result', None):
                print json.dumps(self.result, indent=4)
        return cmd.Cmd.postcmd(self, stop, line)

    def onecmd(self, s):
        """
            Wrap each command to avoid quitting the loop because of an API error.
        """
        try:
            return cmd.Cmd.onecmd(self, s)
        except GeeklistProblem as problem:
            print problem.response

    def preloop(self):
        """
            Make sure we have access to geekli.st.
            If not this will call authenticate for us.
        """
        if not self.api:
            return self.do_authenticate('')
        return cmd.Cmd.preloop(self)
示例#4
0
class GeekCli(cmd.Cmd):
    prompt = 'geek>'
    page_count = 10
    gklist_objects = ['card', 'micro', 'link']
    listable_objects = ['followers', 'following', 'cards', 'micros', 'activities', 'links', 'stream', 'populars']

    def do_whoami(self, line):
        """
            whoami
            Print the user information about the current authenticate user
        """
        self.type = 'info'
        self.result = self.api.user_info()

    def do_whois(self, name):
        """
            whois name
            Print the user information about user named [name]
        """

        self.type = 'info'
        self.result = self.api.user_info(username=name)

    def _list_user_activities(self, line):
        line_tokens = line.split()
        self.name = line_tokens[0] if line_tokens else None
        self.filter_type = line_tokens[1] if line_tokens and \
                                             len(line_tokens) > 1 else None
        self.result = self.api.list_user_activities(
            username=self.name,
            filter_type=self.filter_type)
        self.count = len(self.result)

    def __autocomplete(self,list,text):
        if not text:
            completions = list
        else:
            completions = [f for f in list if f.startswith(text)]
        return completions

    def complete_list(self, text, line, begidx, endidx):
        list_types = self.listable_objects
        return self.__autocomplete(list=list_types,text=text)

    def _call_list_function(self):
        function = getattr(self.api,'list_'+self.type)
        result = function(self.name,self.page,self.page_count)
        if self.type == 'populars':
            self.result = result['links']
            self.count = len(self.result)
        else:
            self.result = result[self.type]
            self.count = result['total_%s' % self.type]

    def do_list(self, line):
        """
            list [activities|cards|micros|followers|following|populars|links] [name]
            Return the list of objects for a given [name]. If no name is
            provided Then it will return the list for the current authenticated user.

            After this command. You can use :
                next : to fetch the next page of result.
                show [attr] : to list an attribute.
                get [index] : to retrieve a specific object.
        """
        line_tokens = line.split()
        self.type = line_tokens[0]
        if self.type == 'activities':
            return self._list_user_activities(line.replace('activities', ''))
        self.name = line_tokens[1] if len(line_tokens) > 1 else None
        self.page = 1
        self._call_list_function()

    def do_fetch(self,line):
        """
            fetch [card|micro] id

            This will fetch a card or micro information given its id.

        """
        fetch_functions = {
            'card':self.api.card,
            'cards':self.api.card,
            'micro':self.api.micro,
            'micros':self.api.micro
        }
        line_tokens = line.split(' ')
        if len(line_tokens) == 2:
            type = line_tokens[0]
            arg = line_tokens[1]

            if type not in self.gklist_objects:
                self.result = "valid fetch objects are card and micro"
                return
        else:
            type = self.type
            arg = line_tokens[0]

        id = arg

        function = fetch_functions[type]
        self.result = function(id)

    def do_show(self, attr):
        """
            show attribute
            If attribute == 'count' Then show the total of object created
            Else This will print the attribute for each object return from the last command
        """
        self.skip_print = True
        if attr == 'count':
            print self.count
            return
        if type(self.result) == dict:
            print self.result[attr]
        else:
            print [item[attr] for item in self.result]

    def do_get(self, index):
        """
            get index
            Retrieve the object at position [index].
            Note: first and last are valid arguments
        """
        if index == 'last':
            index = -1
        if index == 'first':
            index = 0
        try:
            self.result = self.result[int(index)]
        except IndexError:
            self.result = "there is only %s elements in the array" % \
                          len(self.result)
            return

    def do_authenticate(self, line):
        """
            This will authenticate you
        """
        self.oauth_api = GeekListOauthApi(consumer_info=consumer_info)
        request_token = self.oauth_api.request_token(type='oob')
        import webbrowser
        oauth_token = request_token['oauth_token']
        webbrowser.open(self.authorize_url + '?oauth_token=%s' % oauth_token)
        self.result = request_token
        print 'Once you got the verifier code from geekli.st. ' \
              'Call verify [code]'

    def do_verify(self, line):
        """
          verify [code]
          This will fetch an access code after you authenticated on geekli.st.
          You need to provide the verifier code shown on their website
        """
        self.result = self.oauth_api.access_token(self.result, line)
        access_token = self.result
        json_file = open(self.access_token_file_name, mode='w')
        json.dump(access_token,json_file)
        json_file.close()
        self.api = GeekListUserApi(
            consumer_info=consumer_info,
            token=access_token)

    def complete_create(self, text, line, begidx, endidx):
        return self.__autocomplete(list=self.gklist_objects,text=text)
    complete_h5 = complete_create
    complete_reply = complete_create

    def do_create(self, line):
        """
            create {0} text...
            This will create a card or a micro. The rest of the line will be the arguments of created object
            examples:
                create card headline
                create micro status
                create link url|title|description|communities|category #only url and title are required, communities are comma-separated
        """.format(self.gklist_objects)
        line_tokens = line.split(' ')
        type = line_tokens[0]
        text = ' '.join(line_tokens[1:])
        if type not in self.gklist_objects:
            print "valid creation object are card and micro"

        if type == 'card':
            self.result = self.api.create_card(headline=text)
        elif type == 'micro':
            self.result = self.api.create_micro(status=text)
        elif type == 'link':
            self.result = self.api.create_link(*text.split("|"))
        self.type = type

    def do_h5(self, line):
        """
            h5 [card|micro] [id]
            This will send an h5 for the object
        """
        line_tokens = line.split(' ')
        type = line_tokens[0]
        object_id = line_tokens[1]
        if type not in self.gklist_objects:
            self.result = "only card and micro can be highfived"

        if type == 'card':
            self.result = self.api.high_five_card(object_id)

        elif type == 'micro':
            self.result = self.api.high_five_micro(object_id)

    def do_reply(self, line):
        """
            reply [card|micro] id text...
            Create a micro in reply to a card or micro with the rest of the
            line as the text
        """
        line_tokens = line.split(' ')
        type = line_tokens[0]
        object_id = line_tokens[1]
        text = line_tokens[2:]
        if type not in self.gklist_objects:
            self.result = "valid reply objects are card and micro"
            return

        if type == 'card':
            self.result = api.reply_to_card(card_id=object_id, status=text)
        elif type == 'micro':
            self.result = api.reply_to_micro(micro_id=object_id, status=text)
        self.type = type

    def do_set_url(self, url):
        """
            set_url url
            Change the base url
        """
        BaseGeeklistApi.BASE_URL = url
        self.result = "url is now %s" % BaseGeeklistApi.BASE_URL

    def do_next(self, ignore):
        """
            next
            This will fetch the next page of elements
        """
        if self.type not in self.listable_objects:
            self.result = "You must call list before calling next"
            return

        self.page += 1

        if self.type == 'activities':
            self.result = self.api.list_user_activities(
                username=self.name,
                filter_type=self.filter_type,
                page=self.page,
                count=self.page_count)
            return
        elif self.type == 'stream':
            self.result = self.api.list_all_activity(
                filter_type=self.filter_type,
                page=self.page,
                count=self.page_count)
            return

        self._call_list_function()

    def do_follow(self, name):
        """
            Follow [name]
            Will now follow [name] on geeklist
        """
        user = self.api.user_info(username=name)
        self.result = self.api.follow(user_id=user['id'])

    def do_unfollow(self, name):
        """
            Unfollow [name]
            Will unfollow [name] on geeklist
        """
        user = self.api.user_info(username=name)
        self.result = self.api.unfollow(user_id=user['id'])

    def do_stream(self, line):
        """
            stream [filter]
            Return the activity stream of geekli.st filtered by [filter]
        """
        line_tokens = line.split(' ')
        self.filter_type = line_tokens[0] if line_tokens else None
        self.type = 'stream'
        self.name = None
        self.page = 1
        self.result = self.api.list_all_activity(filter_type=self.filter_type,
            page=self.page,
            count=self.page_count)
        self.count = len(self.result)

    def do_page_count(self,count):
        """
            page_count number
            Set the number of results per page
        """
        self.page_count = count

    def do_quit(self, *args):
        self.skip_print = True
        return True

    do_exit = do_quit

    def do_EOF(self, line):
        """Exit"""
        self.skip_print = True
        return True

    def postcmd(self, stop, line):
        """
            Executed after each command. This will usually print
            the result of the command unless the skip_print variable have been set to True

        """
        if getattr(self, 'skip_print', False):
            self.skip_print = False
        elif not line.startswith('help'):
            if getattr(self, 'result', None):
                print json.dumps(self.result, indent=4)
        return cmd.Cmd.postcmd(self, stop, line)

    def onecmd(self, s):
        """
            Wrap each command to avoid quitting the loop because of an API error.
        """
        try:
            return cmd.Cmd.onecmd(self, s)
        except GeeklistProblem as problem:
            print problem.response

    def preloop(self):
        """
            Make sure we have access to geekli.st.
            If not this will call authenticate for us.
        """
        if not self.api:
            return self.do_authenticate('')
        return cmd.Cmd.preloop(self)