Diff for "API/Examples"

Not logged in - Log In / Register

Differences between revisions 12 and 21 (spanning 9 versions)
Revision 12 as of 2009-11-26 01:45:48
Size: 4398
Editor: ppp112-44
Comment:
Revision 21 as of 2010-06-25 04:08:00
Size: 7361
Editor: pool-74-107-147-166
Comment:
Deletions are marked like this. Additions are marked like this.
Line 12: Line 12:
#!python
import launchpadlib
print launchpadlib.__version__
   import launchpadlib
   print launchpadlib.__version__
Line 17: Line 16:
'''1.5.1''' or above is the answer you're looking for; all subsequent examples assume you have at least that recent a launchpadlib. '''1.5.1''' or above is the answer you're looking for; almost all subsequent examples assume you have at least that recent a launchpadlib.
Line 24: Line 23:
#!python
from launchpadlib.launchpad import Launchpad, EDGE_SERVICE_ROOT
launchpad = Launchpad.login_with(
    
'hello-world', EDGE_SERVICE_ROOT)
print 'Hello, %s!' % launchpad.me.display_name
   from launchpadlib.launchpad import Launchpad
  launchpad = Launchpad.login_with('hello-world', 'edge')
   print 'Hello, %s!' % launchpad.me.display_name
Line 31: Line 28:
The `hello-world` bit is the name of the application and EDGE_SERVICE_ROOT means connect to the edge server. The `hello-world` bit is the name of the application and 'edge' means connect to the edge server.
Line 36: Line 33:
#!python
from launchpadlib.launchpad import Launchpad, EDGE_SERVICE_ROOT

def has_target(bug, series):
    series_url = str(series)
    for task in bug.bug_tasks:
        if str(task).startswith(series_url):
            return True
    return False

launchpad = Launchpad.login_with(
    'hello-world', EDGE_SERVICE_ROOT)
b = launchpad.bugs[324614]
ubuntu = launchpad.distributions["ubuntu"]
jaunty = ubuntu.getSeries(name_or_version="jaunty")
has_target(b, jaunty)
### ==> should evalute to True
   from launchpadlib.launchpad import Launchpad
   
   def has_target(bug, series):
       series_url = str(series)
       for task in bug.bug_tasks:
           if str(task).startswith(series_url):
               return True
       return False
   
   launchpad = Launchpad.login_with(
       'hello-world', 'edge')
   b = launchpad.bugs[324614]
   ubuntu = launchpad.distributions["ubuntu"]
   jaunty = ubuntu.getSeries(name_or_version="jaunty")
   has_target(b, jaunty)
   ### ==> should evalute to True
Line 58: Line 54:
#!python
from launchpadlib.launchpad import Launchpad, EDGE_SERVICE_ROOT

launchpad = Launchpad.login_with(
    'hello-world', EDGE_SERVICE_ROOT)
ubuntu = launchpad.distributions["ubuntu"]
archive = ubuntu.main_archive
series = ubuntu.current_series
archive.getPublishedSources(exact_match=True, source_name="apport", distro_series=series)[0].source_package_version
### ==> should return u'0.123'
   from launchpadlib.launchpad import Launchpad
       
launchpad = Launchpad.login_with(
    'hello-world', 'edge')
   ubuntu = launchpad.distributions["ubuntu"]
   archive = ubuntu.main_archive
   series = ubuntu.current_series
   
archive.getPublishedSources(exact_match=True, source_name="apport", distro_series=series)[0].source_package_version
   ### ==> should return u'0.123'
Line 73: Line 68:
#!python
import re
import urlparse

### See previous examples for how to get an archive.
                
def create_webroot_url_from_self_link(self_link):
    scheme, netloc, _, _, _ = urlparse.urlsplit(self_link)
    netloc = netloc.lstrip("api.")
    return u"%s://%s/" %(scheme, netloc)
    
def get_dsc(archive):
    re_version = re.compile(r"^\d+\:")
    x = archive.getPublishedSources()
    webroot = create_webroot_url_from_self_link(archive.self_link)
    for i in x:
        version = i.source_package_version
        version = re_version.sub("", version, 1)
        yield "%s~%s/+archive/+files/%s_%s.dsc" \
            %(webroot, archive.owner.name, i.source_package_name, version)
   import re
   import urlparse
   
   
### See previous examples for how to get an archive.
                       def create_webroot_url_from_self_link(self_link):
       scheme, netloc, _, _, _ = urlparse.urlsplit(self_link)
       netloc = netloc.lstrip("api.")
    return u"%s://%s/" %(scheme, netloc)
           def get_dsc(archive):
    re_version = re.compile(r"^\d+\:")
       x = archive.getPublishedSources()
       webroot = create_webroot_url_from_self_link(archive.self_link)
    for i in x:
           version = i.source_package_version
           version = re_version.sub("", version, 1)
    yield "%s~%s/+archive/+files/%s_%s.dsc" \
               %(webroot, archive.owner.name, i.source_package_name, version)
Line 97: Line 91:
From <https://launchpad.net/hydrazine> - use your own application name ''This one is for older launchpadlibs. If you are using a current version, just replace the code below with `Launchpad.login_with`.''

From <https://launchpad.net/hydrazine> - use your own application name.

{{{
   def create_session():
       lplib_cachedir = os.path.expanduser("~/.cache/launchpadlib/")
       hydrazine_cachedir = os.path.expanduser("~/.cache/hydrazine/")
       rrd_dir = os.path.expanduser("~/.cache/hydrazine/rrd")
       for d in [lplib_cachedir, hydrazine_cachedir, rrd_dir]:
           if not os.path.isdir(d):
               os.makedirs(d, mode=0700)
   
   
       hydrazine_credentials_filename = os.path.join(hydrazine_cachedir,
           'credentials')
       if os.path.exists(hydrazine_credentials_filename):
           credentials = Credentials()
           credentials.load(file(
               os.path.expanduser("~/.cache/hydrazine/credentials"),
               "r"))
           trace('loaded existing credentials')
           return Launchpad(credentials, service_root,
               lplib_cachedir)
           # TODO: handle the case of having credentials that have expired etc
       else:
           launchpad = Launchpad.get_token_and_login(
               'Hydrazine',
               service_root,
               lplib_cachedir)
           trace('saving credentials...')
           launchpad.credentials.save(file(
               hydrazine_credentials_filename,
               "w"))
           return launchpad
}}}

== Get date a user joined a team ==

This is an example of using team_membership details

{{{
def get_join_date(team, user):
    team = launchpad.people[team]
    members = team.members_details
    for member in members:
        if member.member.name == user:
            return member.date_joined
    return None

print get_join_date("zeitgeist", "thekorn")
### ==> should return a datetime.datetime object like 2009-06-14 18:01:10.511369+00:00
}}}

== Turn on debugging output ==

{{{
import httplib2
httplib2.debuglevel = 1
}}}

This enables detailed traces of requests launchpadlib makes. This can be worthwhile for debugging issues or optimizing performance.

== Get a useful error message from launchpadlib ==

''Recent versions of launchpadlib include useful information in the str() of the exception object, so you don't need to do this''

Because launchpadlib is just a simple wrapper for an HTTP API, when the Launchpad server raises an error, this appears on the client side as an HTTP error. However, there is useful information to be had!
Line 101: Line 162:
def create_session():
    lplib_cachedir = os.path.expanduser("~/.cache/launchpadlib/")
    hydrazine_cachedir = os.path.expanduser("~/.cache/hydrazine/")
    rrd_dir = os.path.expanduser("~/.cache/hydrazine/rrd")
    for d in [lplib_cachedir, hydrazine_cachedir, rrd_dir]:
        if not os.path.isdir(d):
            os.makedirs(d, mode=0700)
try:
    do_something_errorful()
except HTTPError, e:
    # e.content has the actual Launchpad error.
    print e.content
}}}
Line 110: Line 170:
    hydrazine_credentials_filename = os.path.join(hydrazine_cachedir,
        'credentials')
    if os.path.exists(hydrazine_credentials_filename):
        credentials = Credentials()
        credentials.load(file(
            os.path.expanduser("~/.cache/hydrazine/credentials"),
            "r"))
        trace('loaded existing credentials')
        return Launchpad(credentials, service_root,
            lplib_cachedir)
        # TODO: handle the case of having credentials that have expired etc
    else:
        launchpad = Launchpad.get_token_and_login(
            'Hydrazine',
            service_root,
            lplib_cachedir)
        trace('saving credentials...')
        launchpad.credentials.save(file(
            hydrazine_credentials_filename,
            "w"))
        return launchpad
== Fetching an object's raw JSON ==

Launchpadlib provides a nice Python wrapper around JSON objects, but it does allow you to directly access the JSON itself. Each launchpadlib object has a `self_link` property which you can use to view the JSON in a regular web brower, but you can not do this while using launchpadlib's access permissions. This recipe shows you how to fetch the JSON for an object with the same permissions as the currently running script.

We can use the semi-private `_browser` member of the current `Launchpad` object to grab the raw JSON using the current authentication. We can pass a launchpadlib object's `self_link` URL to the browser, the same as launchpadlib itself does.

{{{
#!python

from launchpadlib.launchpad import Launchpad

launchpad = Launchpad.login_with('lplib.cookbook.json_fetcher', 'edge', '.lplib-json_fetcher-cache')

# Our authenticated browser object
browser = launchpad._browser

def get_person_as_json(person_name):
    person = launchpad.people[person_name]
    if not person:
        # Oops, this person does not exist.
        return None
    
    return browser.get(person.self_link)
Line 132: Line 194:

== Get the type of requested code review ==

The trick here ([[https://bugs.launchpad.net/bugs/526362|bug 526362]]) is that the review type is actually an attribute of the pending review, and the pending review is recorded as a 'vote' with no vote or comment. So you need to iterate the {{{votes}}} attribute of the merge proposal.

Launchpad Help > API > Examples

This page has a bunch of examples of how to use launchpadlib and the Python APIs. Think of it like a cookbook that you can add your favourite recipe to.

If this duplicates launchpadlib or API/Uses too much, then please merge or edit pages as needed.

Find out if your launchpadlib version is recent enough (>= 1.5.1)

   import launchpadlib
   print launchpadlib.__version__

1.5.1 or above is the answer you're looking for; almost all subsequent examples assume you have at least that recent a launchpadlib.

Hello Launchpad!

Ever wanted to have Launchpad greet you by your own name? Now you can, in the comfort of your own home.

   from launchpadlib.launchpad import Launchpad
   launchpad = Launchpad.login_with('hello-world', 'edge')
   print 'Hello, %s!' % launchpad.me.display_name

The hello-world bit is the name of the application and 'edge' means connect to the edge server.

Does a bug have a release target?

   from launchpadlib.launchpad import Launchpad
   
   def has_target(bug, series):
       series_url = str(series)
       for task in bug.bug_tasks:
           if str(task).startswith(series_url):
               return True
       return False
   
   launchpad = Launchpad.login_with(
       'hello-world', 'edge')
   b = launchpad.bugs[324614]
   ubuntu = launchpad.distributions["ubuntu"]
   jaunty = ubuntu.getSeries(name_or_version="jaunty")
   has_target(b, jaunty)
   ### ==> should evalute to True

Listing the current package versions in a particular distroseries

   from launchpadlib.launchpad import Launchpad
   
   launchpad = Launchpad.login_with(
       'hello-world', 'edge')
   ubuntu = launchpad.distributions["ubuntu"]
   archive = ubuntu.main_archive
   series = ubuntu.current_series
   archive.getPublishedSources(exact_match=True, source_name="apport", distro_series=series)[0].source_package_version
   ### ==> should return u'0.123'

Get dsc-files for sources in an archive

   import re
   import urlparse
   
   ### See previous examples for how to get an archive.
                   
   def create_webroot_url_from_self_link(self_link):
       scheme, netloc, _, _, _ = urlparse.urlsplit(self_link)
       netloc = netloc.lstrip("api.")
       return u"%s://%s/" %(scheme, netloc)
       
   def get_dsc(archive):
       re_version = re.compile(r"^\d+\:")
       x = archive.getPublishedSources()
       webroot = create_webroot_url_from_self_link(archive.self_link)
       for i in x:
           version = i.source_package_version
           version = re_version.sub("", version, 1)
           yield "%s~%s/+archive/+files/%s_%s.dsc" \
               %(webroot, archive.owner.name, i.source_package_name, version)

Cache Launchpad credentials per application

This one is for older launchpadlibs. If you are using a current version, just replace the code below with Launchpad.login_with.

From <https://launchpad.net/hydrazine> - use your own application name.

   def create_session():
       lplib_cachedir = os.path.expanduser("~/.cache/launchpadlib/")
       hydrazine_cachedir = os.path.expanduser("~/.cache/hydrazine/")
       rrd_dir = os.path.expanduser("~/.cache/hydrazine/rrd")
       for d in [lplib_cachedir, hydrazine_cachedir, rrd_dir]:
           if not os.path.isdir(d):
               os.makedirs(d, mode=0700)
   
   
       hydrazine_credentials_filename = os.path.join(hydrazine_cachedir,
           'credentials')
       if os.path.exists(hydrazine_credentials_filename):
           credentials = Credentials()
           credentials.load(file(
               os.path.expanduser("~/.cache/hydrazine/credentials"),
               "r"))
           trace('loaded existing credentials')
           return Launchpad(credentials, service_root,
               lplib_cachedir)
           # TODO: handle the case of having credentials that have expired etc
       else:
           launchpad = Launchpad.get_token_and_login(
               'Hydrazine',
               service_root,
               lplib_cachedir)
           trace('saving credentials...')
           launchpad.credentials.save(file(
               hydrazine_credentials_filename,
               "w"))
           return launchpad

Get date a user joined a team

This is an example of using team_membership details

def get_join_date(team, user):
    team = launchpad.people[team]
    members = team.members_details
    for member in members:
        if member.member.name == user:
            return member.date_joined
    return None

print get_join_date("zeitgeist", "thekorn")
### ==> should return a datetime.datetime object like  2009-06-14 18:01:10.511369+00:00

Turn on debugging output

import httplib2
httplib2.debuglevel = 1

This enables detailed traces of requests launchpadlib makes. This can be worthwhile for debugging issues or optimizing performance.

Get a useful error message from launchpadlib

Recent versions of launchpadlib include useful information in the str() of the exception object, so you don't need to do this

Because launchpadlib is just a simple wrapper for an HTTP API, when the Launchpad server raises an error, this appears on the client side as an HTTP error. However, there is useful information to be had!

   1 try:
   2     do_something_errorful()
   3 except HTTPError, e:
   4     # e.content has the actual Launchpad error.
   5     print e.content

Fetching an object's raw JSON

Launchpadlib provides a nice Python wrapper around JSON objects, but it does allow you to directly access the JSON itself. Each launchpadlib object has a self_link property which you can use to view the JSON in a regular web brower, but you can not do this while using launchpadlib's access permissions. This recipe shows you how to fetch the JSON for an object with the same permissions as the currently running script.

We can use the semi-private _browser member of the current Launchpad object to grab the raw JSON using the current authentication. We can pass a launchpadlib object's self_link URL to the browser, the same as launchpadlib itself does.

   1 from launchpadlib.launchpad import Launchpad
   2 
   3 launchpad = Launchpad.login_with('lplib.cookbook.json_fetcher', 'edge', '.lplib-json_fetcher-cache')
   4 
   5 # Our authenticated browser object
   6 browser = launchpad._browser
   7 
   8 def get_person_as_json(person_name):
   9     person = launchpad.people[person_name]
  10     if not person:
  11         # Oops, this person does not exist.
  12         return None
  13     
  14     return browser.get(person.self_link)

Get the type of requested code review

The trick here (bug 526362) is that the review type is actually an attribute of the pending review, and the pending review is recorded as a 'vote' with no vote or comment. So you need to iterate the votes attribute of the merge proposal.

API/Examples (last edited 2024-06-03 10:18:34 by ruinedyourlife)