The magic behind Zipa

Here are the rules zipa is following when doing its magic.

If you access a resource by object notation .name or dict notation [name] it makes no difference.

gh.users                            # /users
gh.orgs.django                      # /orgs/django
gh.orgs['django']                   # /orgs/django
gh.orgs['django'].repos['django']   # /orgs/django/repos/django

Calls to the remote are only made when you actually make a call from python

The following statements do not make a remote call

repos = gh.orgs['django'].repos
print(gh.orgs.django)

While these ones do:

repos = gh.orgs['django'].repos
# this calls GET /orgs/django/repos
repos()

# This calls GET /orgs/django
print(gh.orgs.django())

# This one calls GET /orgs/django/repos and subsequently calls the next url
# from the Link header
for repo in gh.orgs.django.repos:
    print(repo.name)

Filtering

You can add filters to iterators by using the slice notation like this:

# This one calls GET /orgs/django/repos?sort=created&direction=desc
for repo in gh.orgs.django.repos[{'sort': 'created', 'direction': 'desc'}]:
    print(repo.name)