hi mahmoud,
I tried with the twitter.py patch which u forwarded,but i am still getting
some errors when i run my app...

Traceback (most recent call last):

*File "F:\Projects\SampApp\src\Main.py", line 6, in <module>

*

users = api.GetFriends()

*File "F:\Projects\SampApp\src\Twitter\twitter.py", line 1093, in GetFriends

*

json = self._FetchUrl(url)

*File "F:\Projects\SampApp\src\Twitter\twitter.py", line 1421, in _FetchUrl

*

last_cached = self._cache.GetCachedTime(key)

*File "F:\Projects\SampApp\src\Twitter\twitter.py", line 1552, in
GetCachedTime

*

entry = _DbCacheEntry.get_by_key_name(key)

*File "C:\Program
Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line
845, in get_by_key_name

*

for name in key_names]

*File "C:\Program
Files\Google\google_appengine\google\appengine\api\datastore_types.py", line
205, in from_path

*

_app = ResolveAppId(kwds.pop('_app', None))

*File "C:\Program
Files\Google\google_appengine\google\appengine\api\datastore_types.py", line
123, in ResolveAppId

*

ValidateString(app, '_app', datastore_errors.BadArgumentError)

*File "C:\Program
Files\Google\google_appengine\google\appengine\api\datastore_types.py", line
100, in ValidateString

*

raise exception('%s must not be empty.' % name)

google.appengine.api.datastore_errors.BadArgumentError: _app must not be
empty.

Please He*lp*

*Regards*

*venkat*

On 3/21/09, Mahmoud <[email protected]> wrote:
>
>
> Venkat,
> You should try Miha's patch here:
> http://persistent.info/files/twitter_appengine.patch
>
> It patches twitter.py to work with GAE's restrictions.
>
> -Mahmoud
>
> On Mar 20, 8:19 am, venkat rambotla <[email protected]> wrote:
> > hey hi tim,
> > my twitter.py code goes like this
> >
> > #!/*usr*/bin/*python
> > *
> >
> > #
> >
> > # Copyright 2007 *Google* Inc. All Rights Reserved.
> >
> > *
> >
> > '''A library that provides a python interface to the Twitter API'''
> > *
> >
> > __author__ = *'[email protected]'
> > *
> >
> > __version__ = *'0.5'
> > *
> >
> > import base64
> >
> > import md5
> >
> > import os
> >
> > import *sys
> > *
> >
> > import tempfile
> >
> > import time
> >
> > import urllib
> >
> > import urllib2
> >
> > import urlparse
> >
> > import simplejson
> >
> > class *TwitterError*(Exception):
> > *
> >
> > **'''Base class for Twitter errors'''
> > *
> >
> > class *Status*(object):
> > *
> >
> > *def *__init__*(*self*,
> >
> > created_at=None,
> >
> > id=None,
> >
> > text=None,
> >
> > user=None,
> >
> > now=None):
> >
> > *'''An object to hold a Twitter status message.
> > *
> >
> > *
> >
> > This class is normally instantiated by the twitter.Api class and
> >
> > returned in a sequence.
> > *
> >
> > *
> >
> > Note: Dates are posted in the form "Sat Jan 27 04:17:38 +0000 2007"
> > *
> >
> > *
> >
> > Args:
> >
> > created_at: The time this status message was posted
> >
> > id: The unique id of this status message
> >
> > text: The text of this status message
> >
> > relative_created_at:
> >
> > A human readable string representing the posting time
> >
> > user:
> >
> > A twitter.User instance representing the person posting the message
> >
> > now:
> >
> > The current time, if the client choses to set it. Defaults to the
> >
> > wall clock time.
> >
> > '''
> > *
> >
> > *self*.created_at = created_at
> >
> > *self*.id = id
> >
> > *self*.text = text
> >
> > *self*.user = user
> >
> > *self*.now = now
> >
> > *
> >
> > *def *GetCreatedAt*(*self*):
> >
> > *'''Get the time this status message was posted.
> > *
> >
> > *
> >
> > Returns:
> >
> > The time this status message was posted
> >
> > '''
> > *
> >
> > return *self*._created_at
> >
> > *
> >
> > *def *SetCreatedAt*(*self*, created_at):
> >
> > *'''Set the time this status message was posted.
> > *
> >
> > *
> >
> > Args:
> >
> > created_at: The time this status message was created
> >
> > '''
> > *
> >
> > *self*._created_at = created_at
> >
> > *
> >
> > *created_at = property(GetCreatedAt, SetCreatedAt,
> >
> > doc=*'The time this status message was posted.'*)
> >
> > *
> >
> > *def *GetCreatedAtInSeconds*(*self*):
> >
> > *'''Get the time this status message was posted, in seconds since the
> epoch.
> > *
> >
> > *
> >
> > Returns:
> >
> > The time this status message was posted, in seconds since the epoch.
> >
> > '''
> > *
> >
> > return time.mktime(time.strptime(*self*.created_at, *'%a %b %d %H:%M:%S
> > +0000 %Y'*))
> >
> > *
> >
> > *created_at_in_seconds = property(GetCreatedAtInSeconds,
> >
> > doc=*"The time this status message was "
> > *
> >
> > *"posted, in seconds since the epoch"*)
> >
> > *
> >
> > *def *GetId*(*self*):
> >
> > *'''Get the unique id of this status message.
> > *
> >
> > *
> >
> > Returns:
> >
> > The unique id of this status message
> >
> > '''
> > *
> >
> > return *self*._id
> >
> > *
> >
> > *def *SetId*(*self*, id):
> >
> > *'''Set the unique id of this status message.
> > *
> >
> > *
> >
> > Args:
> >
> > id: The unique id of this status message
> >
> > '''
> > *
> >
> > *self*._id = id
> >
> > *
> >
> > *id = property(GetId, SetId,
> >
> > doc=*'The unique id of this status message.'*)
> >
> > *
> >
> > *def *GetText*(*self*):
> >
> > *'''Get the text of this status message.
> > *
> >
> > *
> >
> > Returns:
> >
> > The text of this status message.
> >
> > '''
> > *
> >
> > return *self*._text
> >
> > *
> >
> > *def *SetText*(*self*, text):
> >
> > *'''Set the text of this status message.
> > *
> >
> > *
> >
> > Args:
> >
> > text: The text of this status message
> >
> > '''
> > *
> >
> > *self*._text = text
> >
> > *
> >
> > *text = property(GetText, SetText,
> >
> > doc=*'The text of this status message'*)
> >
> > *
> >
> > *def *GetRelativeCreatedAt*(*self*):
> >
> > *'''Get a human redable string representing the posting time
> > *
> >
> > *
> >
> > Returns:
> >
> > A human readable string representing the posting time
> >
> > '''
> > *
> >
> > fudge = 1.25
> >
> > delta = int(*self*.now) - int(*self*.created_at_in_seconds)
> >
> > if delta < (1 * fudge):
> > *
> >
> > *return *'about a second ago'
> > *
> >
> > elif delta < (60 * (1/fudge)):
> > *
> >
> > *return *'about %d seconds ago'* % (delta)
> >
> > elif delta < (60 * fudge):
> > *
> >
> > *return *'about a minute ago'
> > *
> >
> > elif delta < (60 * 60 * (1/fudge)):
> > *
> >
> > *return *'about %d minutes ago'* % (delta / 60)
> >
> > elif delta < (60 * 60 * fudge):
> > *
> >
> > *return *'about an hour ago'
> > *
> >
> > elif delta < (60 * 60 * 24 * (1/fudge)):
> > *
> >
> > *return *'about %d hours ago'* % (delta / (60 * 60))
> >
> > elif delta < (60 * 60 * 24 * fudge):
> > *
> >
> > *return *'about a day ago'
> > *
> >
> > else:
> > *
> >
> > *return *'about %d days ago'* % (delta / (60 * 60 * 24))
> >
> > *
> >
> > *relative_created_at = property(GetRelativeCreatedAt,
> >
> > doc=*'Get a human readable string representing'
> > *
> >
> > *'the posting time'*)
> >
> > *
> >
> > *def *GetUser*(*self*):
> >
> > *'''Get a twitter.User reprenting the entity posting this status message.
> > *
> >
> > *
> >
> > Returns:
> >
> > A twitter.User reprenting the entity posting this status message
> >
> > '''
> > *
> >
> > return *self*._user
> >
> > *
> >
> > *def *SetUser*(*self*, user):
> >
> > *'''Set a twitter.User reprenting the entity posting this status message.
> > *
> >
> > *
> >
> > Args:
> >
> > user: A twitter.User reprenting the entity posting this status message
> >
> > '''
> > *
> >
> > *self*._user = user
> >
> > *
> >
> > *user = property(GetUser, SetUser,
> >
> > doc=*'A twitter.User reprenting the entity posting this '
> > *
> >
> > *'status message'*)
> >
> > *
> >
> > *def *GetNow*(*self*):
> >
> > *'''Get the wallclock time for this status message.
> > *
> >
> > *
> >
> > Used to calculate relative_created_at. Defaults to the time
> >
> > the object was instantiated.
> > *
> >
> > *
> >
> > Returns:
> >
> > Whatever the status instance believes the current time to be,
> >
> > in seconds since the epoch.
> >
> > '''
> > *
> >
> > if *self*._now is None:
> > *
> >
> > **self*._now = time.mktime(time.gmtime())
> >
> > return *self*._now
> >
> > *
> >
> > *def *SetNow*(*self*, now):
> >
> > *'''Set the wallclock time for this status message.
> > *
> >
> > *
> >
> > Used to calculate relative_created_at. Defaults to the time
> >
> > the object was instantiated.
> > *
> >
> > *
> >
> > Args:
> >
> > now: The wallclock time for this instance.
> >
> > '''
> > *
> >
> > *self*._now = now
> >
> > *
> >
> > *now = property(GetNow, SetNow,
> >
> > doc=*'The wallclock time for this status instance.'*)
> >
> > *
> >
> > *def *__ne__*(*self*, other):
> >
> > return not *self*.__eq__(other)
> >
> > *
> >
> > *def *__eq__*(*self*, other):
> >
> > try:
> > *
> >
> > *return other and \
> >
> > *self*.created_at == other.created_at and \
> >
> > *self*.id == other.id and \
> >
> > *self*.text == other.text and \
> >
> > *self*.user == other.user
> >
> > except AttributeError:
> > *
> >
> > *return False
> >
> > *
> >
> > *def *__str__*(*self*):
> >
> > *'''A string representation of this twitter.Status instance.
> > *
> >
> > *
> >
> > The return value is the same as the JSON string representation.
> > *
> >
> > *
> >
> > Returns:
> >
> > A string representation of this twitter.Status instance.
> >
> > '''
> > *
> >
> > return *self*.AsJsonString()
> >
> > *
> >
> > *def *AsJsonString*(*self*):
> >
> > *'''A JSON string representation of this twitter.Status instance.
> > *
> >
> > *
> >
> > Returns:
> >
> > A JSON string representation of this twitter.Status instance
> >
> > '''
> > *
> >
> > return simplejson.dumps(*self*.AsDict(), sort_keys=True)
> >
> > *
> >
> > *def *AsDict*(*self*):
> >
> > *'''A dict representation of this twitter.Status instance.
> > *
> >
> > *
> >
> > The return value uses the same key names as the JSON representation.
> > *
> >
> > *
> >
> > Return:
> >
> > A dict representing this twitter.Status instance
> >
> > '''
> > *
> >
> > data = {}
> >
> > if *self*.created_at:
> > *
> >
> > *data[*'created_at'*] = *self*.created_at
> >
> > if *self*.id:
> > *
> >
> > *data[*'id'*] = *self*.id
> >
> > if *self*.text:
> > *
> >
> > *data[*'text'*] = *self*.text
> >
> > if *self*.user:
> > *
> >
> > *data[*'user'*] = *self*.user.AsDict()
> >
> > return data
> >
> > *
> >
> > *...@staticmethod
> > **
> >
> > *def *NewFromJsonDict*(data):
> >
> > *'''Create a new instance based on a JSON dict.
> > *
> >
> > *
> >
> > Args:
> >
> > data: A JSON dict, as converted from the JSON in the twitter API
> >
> > Returns:
> >
> > A twitter.Status instance
> >
> > '''
> > *
> >
> > if *'user'* in data:
> > *
> >
> > *user = User.NewFromJsonDict(data[*'user'*])
> >
> > else:
> > *
> >
> > *user = None
> >
> > return Status(created_at=data.get(*'created_at'*, None),
> >
> > id=data.get(*'id'*, None),
> >
> > text=data.get(*'text'*, None),
> >
> > user=user)
> >
> > class *User*(object):
> > *
> >
> > **'''A class representing the User structure used by the twitter API.
> > *
> >
> > *
> >
> > The User structure exposes the following properties:
> > *
> >
> > *
> >
> > user.id
> >
> > user.name
> >
> > user.screen_name
> >
> > user.location
> >
> > user.description
> >
> > user.profile_image_url
> >
> > user.url
> >
> > user.status
> >
> > '''
> > **
> >
> > *def *__init__*(*self*,
> >
> > id=None,
> >
> > name=None,
> >
> > screen_name=None,
> >
> > location=None,
> >
> > description=None,
> >
> > profile_image_url=None,
> >
> > url=None,
> >
> > status=None):
> >
> > *self*.id = id
> >
> > *self*.name = name
> >
> > *self*.screen_name = screen_name
> >
> > *self*.location = location
> >
> > *self*.description = description
> >
> > *self*.profile_image_url = profile_image_url
> >
> > *self*.url = url
> >
> > *self*.status = status
> >
> > *
> >
> > *def *GetId*(*self*):
> >
> > *'''Get the unique id of this user.
> > *
> >
> > *
> >
> > Returns:
> >
> > The unique id of this user
> >
> > '''
> > *
> >
> > return *self*._id
> >
> > *
> >
> > *def *SetId*(*self*, id):
> >
> > *'''Set the unique id of this user.
> > *
> >
> > *
> >
> > Args:
> >
> > id: The unique id of this user.
> >
> > '''
> > *
> >
> > *self*._id = id
> >
> > *
> >
> > *id = property(GetId, SetId,
> >
> > doc=*'The unique id of this user.'*)
> >
> > *
> >
> > *def *GetName*(*self*):
> >
> > *'''Get the real name of this user.
> > *
> >
> > *
> >
> > Returns:
> >
> > The real name of this user
> >
> > '''
> > *
> >
> > return *self*._name
> >
> > *
> >
> > *def *SetName*(*self*, name):
> >
> > *'''Set the real name of this user.
> > *
> >
> > *
> >
> > Args:
> >
> > name: The real name of this user
> >
> > '''
> > *
> >
> > *self*._name = name
> >
> > *
> >
> > *name = property(GetName, SetName,
> >
> > doc=*'The real name of this user.'*)
> >
> > *
> >
> > *def *GetScreenName*(*self*):
> >
> > *'''Get the short username of this user.
> > *
> >
> > *
> >
> > Returns:
> >
> > The short username of this user
> >
> > '''
> > *
> >
> > return *self*._screen_name
> >
> > *
> >
> > *def *SetScreenName*(*self*, screen_name):
> >
> > *'''Set the short username of this user.
> > *
> >
> > *
> >
> > Args:
> >
> > screen_name: the short username of this user
> >
> > '''
> > *
> >
> > *self*._screen_name = screen_name
> >
> > *
> >
> > *screen_name = property(GetScreenName, SetScreenName,
> >
> > doc=*'The short username of this user.'*)
> >
> > *
> >
> > *def *GetLocation*(*self*):
> >
> > *'''Get the geographic location of this user.
> > *
> >
> > *
> >
> > Returns:
> >
> > The geographic location of this user
> >
> > '''
> > *
> >
> > return *self*._location
> >
> > *
> >
> > *def *SetLocation*(*self*, location):
> >
> > *'''Set the geographic location of this user.
> > *
> >
> > *
> >
> > Args:
> >
> > location: The geographic location of this user
> >
> > '''
> > *...
> >
> > read more ยป
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to