Using with iPython

Link has been designed to work with iPython to make development and data exploration easier.

Tab Completion

Object Tab Completion

One of the nice features of link is that you can tab complete into your config. For instance:

In [1]: from link import lnk

In [2]: lnk.<hit tab>
lnk.dbs                        lnk.apis
lnk.config                     lnk.fresh

In [2]: lnk.dbs.<hit tab>
lnk.dbs.config           lnk.my_db1

Even though these are not objects yet, ipython knows what objects are available and will show them in your completion.

Wrapped Function Tab completion

This feature is a little strange at first. all Wrappers have a _wrapped object. The _wrapped object is what it is “wrapping”. In the case of an APIRequestWrapper, we are wrapping the Requests Session object:

In [15]: api._wrapped
Out[15]: <requests-client at 0x101509a90>

Requests is an extremely flexible package for interacting with apis, and making http requests. So, I wanted to make sure that I was not taking away from the functionality of this package. Rather, making it easy to use this package by injecting in your configuration (like username, password and custom auth). Another fancy iPython trick is when you tab complete you object, you will see all the available functions and properties of the _wrapped object.:

In [16]: api.<hit tab>
api.apikey            api.cert              api.delete            api.hooks
api.password          api.prefetch          api.requests          api.timeout
api.auth              api.clear_session     api.get
api.init_poolmanager  api.patch             api.proxies
api.response_wrapper  api.user
api.authenticate      api.config            api.head              api.options
api.poolmanager       api.put               api.run_command       api.verify
api.base_url          api.cookies           api.headers           api.params
api.post              api.request           api.secret            api.wrap_name

# this is a method of the _wrapped requests Session object
# but seems as though it belongs to api in tab completion and when you
# call it
In [19]: api.delete
Out[19]: <bound method Session.delete of <requests-client at 0x101509a90>>

Note, if your wrapper and the _wrapped object have the same function, your function will override the _wrapped function.

Lazy Environments

I like using iPython while I am developing, sometimes when I am not even developing in python. If you noticed, my configuration includes all the resources I use all the time. Yet, I am using aliases to use the commandline tools for things like mysql, sqlite, postgres...curl...vertica...netezza... Really, almost anything you can wrap. It would be nice if i could somehow use what I have configured in ipython to use the command-line tool. Just call your Wrapper like a function:

In [22]: my_db = lnk.dbs.my_sqlitedb

In [23]: my_db()
SQLite version 3.7.7 2011-06-25 16:35:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

sqlite> .exit

In [24]:

Same with mysql:

In [24]: my_db = lnk.dbs.my_mysql

In [25]: my_db()
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1876
Server version: 5.5.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show tables....

mysql> exit

In [26]:

When you exit you are right back in your ipython session, like nothing happened at all.