mirror of https://github.com/hwchase17/langchain
Harrison/figma doc loader (#1908)
Co-authored-by: Ismail Pelaseyed <homanp@gmail.com>pull/1911/head
parent
eec9b1b306
commit
6e1b5b8f7e
@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "33205b12",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# Figma\n",
|
||||||
|
"\n",
|
||||||
|
"This notebook covers how to load data from the Figma REST API into a format that can be ingested into LangChain."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "90b69c94",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import os\n",
|
||||||
|
"\n",
|
||||||
|
"from langchain.document_loaders import FigmaFileLoader"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 2,
|
||||||
|
"id": "13deb0f5",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"loader = FigmaFileLoader(\n",
|
||||||
|
" os.environ.get('ACCESS_TOKEN'),\n",
|
||||||
|
" os.environ.get('NODE_IDS'),\n",
|
||||||
|
" os.environ.get('FILE_KEY')\n",
|
||||||
|
")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "9ccc1e2f",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"loader.load()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "3e64cac2",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3 (ipykernel)",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.9.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
"""Loader that loads Figma files json dump."""
|
||||||
|
import json
|
||||||
|
import urllib.request
|
||||||
|
from typing import Any, List
|
||||||
|
|
||||||
|
from langchain.docstore.document import Document
|
||||||
|
from langchain.document_loaders.base import BaseLoader
|
||||||
|
|
||||||
|
|
||||||
|
def _stringify_value(val: Any) -> str:
|
||||||
|
if isinstance(val, str):
|
||||||
|
return val
|
||||||
|
elif isinstance(val, dict):
|
||||||
|
return "\n" + _stringify_dict(val)
|
||||||
|
elif isinstance(val, list):
|
||||||
|
return "\n".join(_stringify_value(v) for v in val)
|
||||||
|
else:
|
||||||
|
return str(val)
|
||||||
|
|
||||||
|
|
||||||
|
def _stringify_dict(data: dict) -> str:
|
||||||
|
text = ""
|
||||||
|
for key, value in data.items():
|
||||||
|
text += key + ": " + _stringify_value(data[key]) + "\n"
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
class FigmaFileLoader(BaseLoader):
|
||||||
|
"""Loader that loads Figma file json."""
|
||||||
|
|
||||||
|
def __init__(self, access_token: str, ids: str, key: str):
|
||||||
|
"""Initialize with access token, ids, and key."""
|
||||||
|
self.access_token = access_token
|
||||||
|
self.ids = ids
|
||||||
|
self.key = key
|
||||||
|
|
||||||
|
def _construct_figma_api_url(self) -> str:
|
||||||
|
api_url = "https://api.figma.com/v1/files/%s/nodes?ids=%s" % (
|
||||||
|
self.key,
|
||||||
|
self.ids,
|
||||||
|
)
|
||||||
|
return api_url
|
||||||
|
|
||||||
|
def _get_figma_file(self) -> Any:
|
||||||
|
"""Get Figma file from Figma REST API."""
|
||||||
|
headers = {"X-Figma-Token": self.access_token}
|
||||||
|
request = urllib.request.Request(
|
||||||
|
self._construct_figma_api_url(), headers=headers
|
||||||
|
)
|
||||||
|
with urllib.request.urlopen(request) as response:
|
||||||
|
json_data = json.loads(response.read().decode())
|
||||||
|
return json_data
|
||||||
|
|
||||||
|
def load(self) -> List[Document]:
|
||||||
|
"""Load file"""
|
||||||
|
data = self._get_figma_file()
|
||||||
|
text = _stringify_dict(data)
|
||||||
|
metadata = {"source": self._construct_figma_api_url()}
|
||||||
|
return [Document(page_content=text, metadata=metadata)]
|
@ -0,0 +1,13 @@
|
|||||||
|
from langchain.document_loaders.figma import FigmaFileLoader
|
||||||
|
|
||||||
|
ACCESS_TOKEN = ""
|
||||||
|
IDS = ""
|
||||||
|
KEY = ""
|
||||||
|
|
||||||
|
|
||||||
|
def test_figma_file_loader() -> None:
|
||||||
|
"""Test Figma file loader."""
|
||||||
|
loader = FigmaFileLoader(ACCESS_TOKEN, IDS, KEY)
|
||||||
|
docs = loader.load()
|
||||||
|
|
||||||
|
assert len(docs) == 1
|
Loading…
Reference in New Issue