Public
Edited
Nov 3, 2023
Paused
4 forks
Importers
21 stars
Github API in Observable
Bitbucket API in Observable
Also listed in…
Technology
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
response = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/penguins.json")
Insert cell
dataJson = (await response).json()
Insert cell
Insert cell
repoPenguins = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/penguins.json")
.then(response => response.json())
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
files = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/")
.then(response => response.json())
Insert cell
Insert cell
json = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/aapl.json")
.then(response => response.json())
Insert cell
Insert cell
csv = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/aapl.csv")
.then(res => res.text())
.then(text => d3.csvParse(text, d3.autoType))
Insert cell
Insert cell
db = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/chinook.db")
.then(SQLiteDatabaseClient.open)
Insert cell
db.describe("tracks")
Insert cell
Insert cell
arrowTable = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/flights-200k.arrow")
.then(res => res.arrayBuffer())
.then(buffer => Arrow.Table.from(new Uint8Array(buffer)))
Insert cell
Insert cell
aqArrow = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/flights-200k.arrow")
.then(res => res.arrayBuffer())
.then(buffer => Arrow.Table.from(new Uint8Array(buffer)))
.then(arrowTable => aq.fromArrow(arrowTable))
Insert cell
Insert cell
duckDb = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/flights-200k.arrow")
.then(res => res.arrayBuffer())
.then(buffer => Arrow.Table.from(new Uint8Array(buffer)))
.then(arrowTable => DuckDBClient.of({demo: aq.fromArrow(arrowTable).objects()}))
Insert cell
Insert cell
Insert cell
xlsx = require("xlsx@0.17.0/dist/xlsx.core.min.js")
Insert cell
workbook = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/Data%20Analyst%20Excel%20Meetup.xlsx")
.then(res => res.arrayBuffer())
.then(buffer => xlsx.read(new Uint8Array(buffer), { type: "array" }))
Insert cell
// example function to parse sheet from workbook object
// adapted from Fetch an Excel sheet by @neocarto
// - https://observablehq.com/@neocartocnrs/fetch-an-excel-sheet
function parseSheet(workbook, sheetname) {
let sheet = workbook.Sheets[sheetname];
// get the data
let range = xlsx.utils.decode_range(sheet["!ref"]);
range.s.r = 0; // skip rows
range.s.c = 0; // skip cols
sheet["!ref"] = xlsx.utils.encode_range(range);
return xlsx.utils.sheet_to_json(sheet);
}
Insert cell
excel = parseSheet(workbook, "StreetEasy Data")
Insert cell
Insert cell
image = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/simon-lee-KDFUR-sG2Ls-unsplash.jpeg")
.then(res => res.blob())
Insert cell
<img src=${URL.createObjectURL(image)}>
Insert cell
Insert cell
bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/secretPenguins.json")
.then(res => res.json())
Insert cell
Insert cell
bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/8218285f144755a96b5e08c4adc965427308f885/secretPenguins.json")
.then(res => res.json())
Insert cell
Insert cell
recentCommits = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/commits/")
.then(res => res.json())
Insert cell
Inputs.table(recentCommits.values, {
columns: ["date", "message", "hash"]
})
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
allInOne = {
let res = bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/")
return (await res).json()
}
Insert cell
Insert cell
Insert cell
Insert cell
resRefresh = { // source cell
refreshButton2
return bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/")
}
Insert cell
{ // wrangling cell
refreshButton1
return resRefresh.json()
}
Insert cell
Insert cell
bb("https://bitbucket.org/periscopic/bitbucket-api-demo/src/master/", {debug: true})
Insert cell
Insert cell
async function bb(
link // chosen link in bitbucket repo
, {
endpoint = "repositories", // endpoint string
username = credentials[0].username, // Bitbucket username
password = credentials[0].password, // Bitbucket App Password, see https://bitbucket.org/account/settings/app-passwords/
debug = false // if true, return API url
} = {}) {

// main url endpoint for API, see https://developer.atlassian.com/cloud/bitbucket/rest/intro/
const URL_PREFIX = 'https://api.bitbucket.org/2.0'

// parse data link: url → path
if (link == undefined) { return "Include Bitbucket Link (Docs: https://observablehq.com/@periscopic/bitbucket-api-in-observable)"}
const rawLink = String(link)
let urlLink = rawLink
if (urlLink.startsWith("https://bitbucket.org/")) { urlLink = urlLink.split('/').slice(3).join("/") }
if (!urlLink.startsWith("/") & urlLink !== "") { urlLink = '/' + urlLink }

// parse the endpoint
const rawEndpoint = String(endpoint)
let urlEndpoint = rawEndpoint
if (!urlEndpoint.startsWith("/")) { urlEndpoint = '/' + urlEndpoint }

// make full link to ping api
const fetchQuery = `${URL_PREFIX}${urlEndpoint}${urlLink}`
if (debug) { return fetchQuery }

// create header for authentication
const headers = (username !== null & password !== null)
? {Authorization: 'Basic ' + base64.encode(username + ':' + password)}
: {}

// get response, use username/password if provided
const response = await fetch(fetchQuery, {
headers: headers
})
return response
}
Insert cell
Insert cell
// pack up Observable Secrets, or return empty
credentials = {
try {
let username = Secret("BB_API_USERNAME")
let password = Secret("BB_API_PASSWORD")
return [{username, password}]
} catch (error) {
return [{username: null, password: null}]
}
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more