From 319ddd69f86aa47d641d39619f1b1ee18648acb8 Mon Sep 17 00:00:00 2001 From: David Okpare Date: Sat, 24 Jun 2023 03:25:22 +0100 Subject: [PATCH] Installed erdantic and added schemas (#20) * Move examples to dir and fix imports * Install erdantic and pygraphviz * Add schema function and image * Separate erd diagram function from example script --------- Co-authored-by: Jason Liu --- .../citation_fuzzy_match.py | 4 +++- examples/citation_fuzzy_match/diagram.py | 6 ++++++ examples/citation_fuzzy_match/schema.png | Bin 0 -> 17457 bytes examples/parse_recursive_paths/diagram.py | 6 ++++++ .../parse_recursive_paths.py | 9 +++++---- examples/parse_recursive_paths/schema.png | Bin 0 -> 22841 bytes examples/query_planner_execution/diagram.py | 6 ++++++ .../query_planner_execution.py | 11 ++++------- examples/query_planner_execution/schema.png | Bin 0 -> 19825 bytes examples/safe_sql/diagram.py | 6 ++++++ safe_sql.py => examples/safe_sql/safe_sql.py | 10 ++++++---- examples/safe_sql/schema.png | Bin 0 -> 22548 bytes examples/segment_search_queries/diagram.py | 6 ++++++ examples/segment_search_queries/schema.png | Bin 0 -> 18096 bytes .../segment_search_queries.py | 12 +++++++----- .../task_planner_topological_sort/diagram.py | 6 ++++++ .../task_planner_topological_sort/schema.png | Bin 0 -> 14643 bytes .../task_planner_topological_sort.py | 6 ++++-- requirements.txt | 4 +++- 19 files changed, 68 insertions(+), 24 deletions(-) rename citation_fuzzy_match.py => examples/citation_fuzzy_match/citation_fuzzy_match.py (99%) create mode 100644 examples/citation_fuzzy_match/diagram.py create mode 100644 examples/citation_fuzzy_match/schema.png create mode 100644 examples/parse_recursive_paths/diagram.py rename parse_recursive_paths.py => examples/parse_recursive_paths/parse_recursive_paths.py (99%) create mode 100644 examples/parse_recursive_paths/schema.png create mode 100644 examples/query_planner_execution/diagram.py rename query_planner_execution.py => examples/query_planner_execution/query_planner_execution.py (98%) create mode 100644 examples/query_planner_execution/schema.png create mode 100644 examples/safe_sql/diagram.py rename safe_sql.py => examples/safe_sql/safe_sql.py (99%) create mode 100644 examples/safe_sql/schema.png create mode 100644 examples/segment_search_queries/diagram.py create mode 100644 examples/segment_search_queries/schema.png rename segment_search_queries.py => examples/segment_search_queries/segment_search_queries.py (99%) create mode 100644 examples/task_planner_topological_sort/diagram.py create mode 100644 examples/task_planner_topological_sort/schema.png rename task_planner_topological_sort.py => examples/task_planner_topological_sort/task_planner_topological_sort.py (99%) diff --git a/citation_fuzzy_match.py b/examples/citation_fuzzy_match/citation_fuzzy_match.py similarity index 99% rename from citation_fuzzy_match.py rename to examples/citation_fuzzy_match/citation_fuzzy_match.py index 6f27d71..69f8c82 100644 --- a/citation_fuzzy_match.py +++ b/examples/citation_fuzzy_match/citation_fuzzy_match.py @@ -1,6 +1,8 @@ -import openai from typing import List + +import openai from pydantic import Field, BaseModel + from openai_function_call import OpenAISchema diff --git a/examples/citation_fuzzy_match/diagram.py b/examples/citation_fuzzy_match/diagram.py new file mode 100644 index 0000000..87ed23c --- /dev/null +++ b/examples/citation_fuzzy_match/diagram.py @@ -0,0 +1,6 @@ +import erdantic as erd + +from citation_fuzzy_match import QuestionAnswer + +diagram = erd.create(QuestionAnswer) +diagram.draw("examples/citation_fuzzy_match/schema.png") diff --git a/examples/citation_fuzzy_match/schema.png b/examples/citation_fuzzy_match/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..66bd66c849eb35a6d5f97c8565fb806b5ed289a8 GIT binary patch literal 17457 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 JQ-#wv{ul6P@cIA% literal 0 HcmV?d00001 diff --git a/examples/parse_recursive_paths/diagram.py b/examples/parse_recursive_paths/diagram.py new file mode 100644 index 0000000..178c3a4 --- /dev/null +++ b/examples/parse_recursive_paths/diagram.py @@ -0,0 +1,6 @@ +import erdantic as erd + +from parse_recursive_paths import DirectoryTree + +diagram = erd.create(DirectoryTree) +diagram.draw("examples/parse_recursive_paths/schema.png") diff --git a/parse_recursive_paths.py b/examples/parse_recursive_paths/parse_recursive_paths.py similarity index 99% rename from parse_recursive_paths.py rename to examples/parse_recursive_paths/parse_recursive_paths.py index 8ddabe0..eab2e4f 100644 --- a/parse_recursive_paths.py +++ b/examples/parse_recursive_paths/parse_recursive_paths.py @@ -40,14 +40,15 @@ Example usage: # >>> root/folder2/subfolder1/file4.txt NodeType.FILE """ -import openai import enum - -from pydantic import Field from typing import List -from openai_function_call import OpenAISchema + +import openai +from pydantic import Field from tenacity import retry, stop_after_attempt +from openai_function_call import OpenAISchema + class NodeType(str, enum.Enum): """Enumeration representing the types of nodes in a filesystem.""" diff --git a/examples/parse_recursive_paths/schema.png b/examples/parse_recursive_paths/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..42a3dfd3edf5f18f2a5ccc9942cb209e3e8f53ae GIT binary patch literal 22841 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 literal 0 HcmV?d00001 diff --git a/examples/query_planner_execution/diagram.py b/examples/query_planner_execution/diagram.py new file mode 100644 index 0000000..b002a6e --- /dev/null +++ b/examples/query_planner_execution/diagram.py @@ -0,0 +1,6 @@ +from erdantic import erd + +from query_planner_execution import QueryPlan + +diagram = erd.create(QueryPlan) +diagram.draw("examples/query_planner_execution/schema.png") diff --git a/query_planner_execution.py b/examples/query_planner_execution/query_planner_execution.py similarity index 98% rename from query_planner_execution.py rename to examples/query_planner_execution/query_planner_execution.py index 3409ba6..18284dd 100644 --- a/query_planner_execution.py +++ b/examples/query_planner_execution/query_planner_execution.py @@ -1,14 +1,11 @@ -from functools import lru_cache -import openai -import enum -import json import asyncio +import enum +from typing import List +import openai from pydantic import Field -from typing import List, Tuple + from openai_function_call import OpenAISchema -from tenacity import retry, stop_after_attempt -from pprint import pprint class QueryType(str, enum.Enum): diff --git a/examples/query_planner_execution/schema.png b/examples/query_planner_execution/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..2022c823c1373da1a6922385f52049ec02706800 GIT binary patch literal 19825 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 literal 0 HcmV?d00001 diff --git a/examples/safe_sql/diagram.py b/examples/safe_sql/diagram.py new file mode 100644 index 0000000..ae274ef --- /dev/null +++ b/examples/safe_sql/diagram.py @@ -0,0 +1,6 @@ +import erdantic as erd + +from safe_sql import SQL + +diagram = erd.create(SQL) +diagram.draw("examples/safe_sql/schema.png") diff --git a/safe_sql.py b/examples/safe_sql/safe_sql.py similarity index 99% rename from safe_sql.py rename to examples/safe_sql/safe_sql.py index f0dce7d..7c51671 100644 --- a/safe_sql.py +++ b/examples/safe_sql/safe_sql.py @@ -1,8 +1,10 @@ -from openai_function_call import OpenAISchema -from pydantic import Field -from typing import Any, List -import openai import enum +from typing import Any, List + +import openai +from pydantic import Field + +from openai_function_call import OpenAISchema class SQLTemplateType(str, enum.Enum): diff --git a/examples/safe_sql/schema.png b/examples/safe_sql/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..40df1f150c01f86a3812e44b03eec52ae5575aa5 GIT binary patch literal 22548 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 DwrBKn literal 0 HcmV?d00001 diff --git a/segment_search_queries.py b/examples/segment_search_queries/segment_search_queries.py similarity index 99% rename from segment_search_queries.py rename to examples/segment_search_queries/segment_search_queries.py index 97ec733..7040c69 100644 --- a/segment_search_queries.py +++ b/examples/segment_search_queries/segment_search_queries.py @@ -16,12 +16,14 @@ Examples: # >>> Searching for `Documents` with query `GPDR policy` using `SearchType.EMAIL` """ -from openai_function_call import OpenAISchema -from pydantic import Field -from typing import List -from tenacity import retry, stop_after_attempt -import openai import enum +from typing import List + +import openai +from pydantic import Field +from tenacity import retry, stop_after_attempt + +from openai_function_call import OpenAISchema class SearchType(str, enum.Enum): diff --git a/examples/task_planner_topological_sort/diagram.py b/examples/task_planner_topological_sort/diagram.py new file mode 100644 index 0000000..c4e73d8 --- /dev/null +++ b/examples/task_planner_topological_sort/diagram.py @@ -0,0 +1,6 @@ +import erdantic as erd + +from task_planner_topological_sort import TaskPlan + +diagram = erd.create(TaskPlan) +diagram.draw("examples/task_planner_topological_sort/schema.png") diff --git a/examples/task_planner_topological_sort/schema.png b/examples/task_planner_topological_sort/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..35065547439430c77ce3bd419ada7ac8d04b3a5c GIT binary patch literal 14643 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