Python wrapper for Coda.io API
Project description
Python wrapper for Coda.io API
codaio
is in active development stage. Issues and PRs very welcome!
Installation
pip install codaio
Config via environment variables
The following variables will be called from environment where applicable:
CODA_API_ENDPOINT
(default valuehttps://coda.io/apis/v1beta1
)CODA_API_KEY
- your API key to use when initializing document from environment
Quickstart using raw API
Coda class provides a wrapper for all API methods. If API response included a JSON it will be returned as a dictionary from all methods. If it didn't a dictionary {"status": response.status_code}
will be returned.
If request wasn't successful a CodaError
will be raised with details of the API error.
from codaio import Coda
coda = Coda('YOUR_API_KEY')
>>> coda.create_doc('My document')
{'id': 'NEW_DOC_ID', 'type': 'doc', 'href': 'https://coda.io/apis/v1beta1/docs/LINK', 'browserLink': 'https://coda.io/d/LINK', 'name': 'My Document', 'owner': 'your@email', 'createdAt': '2019-08-29T11:36:45.120Z', 'updatedAt': '2019-08-29T11:36:45.272Z'}
For full API reference for Coda class see documentation
Quickstart using codaio objects
codaio
implements convenient classes to work with Coda documents: Document
, Table
, Row
, Column
and Cell
.
from codaio import Coda, Document
# Initialize by providing a coda object directly
coda = Coda('YOUR_API_KEY')
doc = Document('YOUR_DOC_ID', coda=coda)
# Or initialiaze from environment by storing your API key in environment variable `CODA_API_KEY`
doc = Document.from_environment('YOUR_DOC_ID')
doc.list_tables()
table = doc.get_table('TABLE_ID')
Fetching a Row
# You can fetch a row by ID
row = table['ROW_ID']
Using with Pandas
If you want to load a codaio Table or Row into pandas, you can use the Table.to_dict()
or Row.to_dict()
methods:
import pandas as pd
df = pd.DataFrame(table.to_dict())
Fetching a Cell
# Or fetch a cell by ROW_ID and COLUMN_ID
cell = table['ROW_ID']['COLUMN_ID']
# This is equivalent to getting item from a row
cell = row['COLUMN_ID']
# or
cell = row['COLUMN_NAME'] # This should work fine if COLUMN_NAME is unique, otherwise it will raise AmbiguousColumn error
# or use a Column instance
cell = row[column]
Changing Cell value
row['COLUMN_ID'] = 'foo'
# or
row['Column Name'] = 'foo'
Iterating over rows
# Iterate over rows using IDs -> delete rows that match a condition
for row in table.rows():
if row['COLUMN_ID'] == 'foo':
row.delete()
# Iterate over rows using names -> edit cells in rows that match a condition
for row in table.rows():
if row['Name'] == 'bar':
row['Value'] = 'spam'
Upserting new row
To upsert a new row you can pass a list of cells to table.upsert_row()
name_cell = Cell(column='COLUMN_ID', value_storage='new_name')
value_cell = Cell(column='COLUMN_ID', value_storage='new_value')
table.upsert_row([name_cell, value_cell])
Upserting multiple new rows
Works like upserting one row, except you pass a list of lists to table.upsert_rows()
(rows, not row)
name_cell_a = Cell(column='COLUMN_ID', value_storage='new_name')
value_cell_a = Cell(column='COLUMN_ID', value_storage='new_value')
name_cell_b = Cell(column='COLUMN_ID', value_storage='new_name')
value_cell_b = Cell(column='COLUMN_ID', value_storage='new_value')
table.upsert_rows([[name_cell_a, value_cell_a], [name_cell_b, value_cell_b]])
Updating a row
To update a row use table.update_row(row, cells)
row = table['ROW_ID']
name_cell_a = Cell(column='COLUMN_ID', value_storage='new_name')
value_cell_a = Cell(column='COLUMN_ID', value_storage='new_value')
table.update_row(row, [name_cell_a, value_cell_a])
Documentation
codaio
documentation lives at readthedocs.io
Testing
All tests are in the /tests
folder. It's a little bit problematic to test against the live API since some responses may take a bit longer, so test results are not reliable enough to use a CI system.
Check out the fixtures if you want to improve the testing process.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.