Skip to content

Usage

Creating a BBDB database

To create a new database is as simple as you might expect:

>>> from bbdb.database import BBDB
>>> db = BBDB()

The database starts with no records. To add a new one, use the add_record() method, specifying the first and last names, and any other attributes you want to set:

>>> fred = db.add_record("Fred", "Flintstone")
>>> fred                       # doctest: +ELLIPSIS +REPORT_UDIFF
Record(firstname='Fred', lastname='Flintstone', affix=[], aka=[], ...

>>> barney = db.add_record("Barney", "Rubble")
>>> db
<BBDB: 2 records>

The first and last names are attributes:

>>> fred.firstname, fred.lastname
('Fred', 'Flintstone')

There's also a composite name property:

>>> fred.name
'Fred Flintstone'

You can set other attributes on the returned record object:

Most BBDB attributes consist of lists of things:

>>> fred.add_company("Slate Rock & Gravel")
>>> fred.add_affix("Mr")
>>> fred.add_aka("Freddie")
>>> fred.add_net("fred@bedrock.org")
>>> fred.add_net("fred.flintstone@gravel.com")

>>> fred.net
['fred@bedrock.org', 'fred.flintstone@gravel.com']

>>> fred.affix
['Mr']

Telephone records consist of a location tag and a phone number. The phone number can be either a list of integers (USA-style) or a string (international style):

>>> fred.add_phone("Home", "555-1234")
>>> fred.add_phone("Work", [555, 6789])
>>> list(sorted(fred.phone.items()))
[('Home', '555-1234'), ('Work', [555, 6789])]

Records can have multiple addresses, each indexed by a location tag. Each address in turn has several attributes:

>>> home = fred.add_address("Home")
>>> home.set_location("Cave 2a", "345 Cavestone Road")
>>> home.city = "Bedrock"
>>> home.state = "Hanna Barbera"
>>> home.zipcode = "12345"
>>> home.country = "USA"

>>> home                       # doctest: +ELLIPSIS +REPORT_UDIFF
Address(location=['Cave 2a', '345 Cavestone Road'], city='Bedrock', ...

>>> home.location
['Cave 2a', '345 Cavestone Road']

>>> home.zipcode
'12345'

Finally, each entry can have an arbitrary dictionary of user-defined notes:

>>> fred.add_note("spouse", "Wilma")
>>> fred.add_note("kids", "Pebbles, Bam-Bam")
>>> fred.add_note("catchphrase", '"Yabba dabba doo!"')
>>> list(sorted(fred.notes.items()))
[('catchphrase', '"Yabba dabba doo!"'), ('kids', 'Pebbles, Bam-Bam'), ('spouse', 'Wilma')]

Note values can also have newlines:

>>> barney.add_note("pets", "brontosaurus\npterodactyl")

Reading and writing BBDB files

The write() method will write the database to a stream (default stdout) in a format suitable for use by GNU Emacs. THe write_file() method writes to a file instead. They both use the lisp() method internally, to return the raw lisp text:

>>> print(db.lisp())      # doctest: +ELLIPSIS +REPORT_UDIFF
;; -*-coding: utf-8-emacs;-*-
;;; file-version: 9
;;; user-fields: (catchphrase kids pets spouse)
["Barney" "Rubble" nil nil nil nil nil nil ((pets . "brontosaurus\npterodactyl")) ...
["Fred" "Flintstone" ("Mr") ("Freddie") ("Slate Rock & Gravel") (["Home" "555-1234"] ...

The convenience write_file() method will put that in a file:

>>> db.write_file("examples/bbdb.el")

You can read a database from file using the fromfile() static method:

>>> newdb = BBDB.fromfile("examples/bbdb.el")
>>> newdb
<BBDB: 2 records>

The read() and read_file() methods of a BBDB database can be used import records from other databases.

Exporting to other formats

You can convert a BBDB database to a JSON string for serialization, using the json method:

>>> print(db.json(indent=4))   # doctest: +ELLIPSIS +REPORT_UDIFF
{
    "coding": "utf-8-emacs",
    "fileversion": 9,
    "records": [
        {
            "firstname": "Barney",
            "lastname": "Rubble",
            "affix": [],
            "aka": [],
            "company": [],
            "phone": {},
            "address": {},
            "net": [],
            "notes": {
                "pets": "brontosaurus\\npterodactyl"
            },
            "uuid": ...
            "creation": ...
            "timestamp": ...
        },
        {
            "firstname": "Fred",
            "lastname": "Flintstone",
            "affix": [
                "Mr"
            ],
            "aka": [
                "Freddie"
            ],
            "company": [
                "Slate Rock & Gravel"
            ],
            "phone": {
                "Home": "555-1234",
                "Work": [
                    555,
                    6789
                ]
            },
            "address": {
                "Home": {
                    "location": [
                        "Cave 2a",
                        "345 Cavestone Road"
                    ],
                    "city": "Bedrock",
                    "state": "Hanna Barbera",
                    "zipcode": "12345",
                    "country": "USA"
                }
            },
            "net": [
                "fred@bedrock.org",
                "fred.flintstone@gravel.com"
            ],
            "notes": {
                "spouse": "Wilma",
                "kids": "Pebbles, Bam-Bam",
                "catchphrase": "\"Yabba dabba doo!\""
            },
            "uuid": ...
            "creation": ...
            "timestamp": ...
        }
    ]
}

The dict() method dumps the database as a Python dict. You can also create a BBDB database from an appropriately-structured dict using the fromdict() method:

>>> data = db.dict()
>>> newdb = BBDB.fromdict(data)
>>> newdb == db
True