From 6e1b5b8f7eb3004555062ec2e2cd501eba2f5822 Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Wed, 22 Mar 2023 19:57:46 -0700 Subject: [PATCH] Harrison/figma doc loader (#1908) Co-authored-by: Ismail Pelaseyed --- .../document_loaders/examples/figma.ipynb | 79 +++++++++++++++++++ langchain/document_loaders/figma.py | 59 ++++++++++++++ .../document_loaders/test_figma.py | 13 +++ 3 files changed, 151 insertions(+) create mode 100644 docs/modules/document_loaders/examples/figma.ipynb create mode 100644 langchain/document_loaders/figma.py create mode 100644 tests/integration_tests/document_loaders/test_figma.py diff --git a/docs/modules/document_loaders/examples/figma.ipynb b/docs/modules/document_loaders/examples/figma.ipynb new file mode 100644 index 00000000..aa0e1b73 --- /dev/null +++ b/docs/modules/document_loaders/examples/figma.ipynb @@ -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 +} diff --git a/langchain/document_loaders/figma.py b/langchain/document_loaders/figma.py new file mode 100644 index 00000000..420ef0e9 --- /dev/null +++ b/langchain/document_loaders/figma.py @@ -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)] diff --git a/tests/integration_tests/document_loaders/test_figma.py b/tests/integration_tests/document_loaders/test_figma.py new file mode 100644 index 00000000..00fa6488 --- /dev/null +++ b/tests/integration_tests/document_loaders/test_figma.py @@ -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