Skip to content

init instance class #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 201 additions & 0 deletions examples/cookbook/client_demo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
from helix.client import Client, Query
from helix.types import Payload
from typing import List
from helix.instance import Instance

helix_instance = Instance("helixdb-cfg", "6969", verbose=True)

# Deploy
print("\n" + "-"*20 + "DEPLOY" + "-"*20)
helix_instance.deploy()
print("-" * 70 + '\n')
helix_instance.status()
print("-" * 70 + '\n')

# Stop
print("\n" + "-"*20 + "STOP" + "-"*20)
helix_instance.stop()
print("-" * 70 + '\n')
helix_instance.status()
print("-" * 70 + '\n')

# Start
print("\n" + "-"*20 + "START" + "-"*20)
helix_instance.start()
print("-" * 70 + '\n')
helix_instance.status()
print("-" * 70 + '\n')

# Delete
print("\n" + "-"*20 + "DELETE" + "-"*20)
helix_instance.delete()
print("-" * 70 + '\n')
helix_instance.status()
print("-" * 70 + '\n')

db = Client(local=True, port=6969)

class create_user(Query):
def __init__(self, name:str, age:int, email:str, now:int):
super().__init__()
self.name = name
self.age = age
self.email = email
self.now = now

def query(self) -> List[Payload]:
return [{"name": self.name, "age": self.age, "email": self.email, "now": self.now}]

def response(self, response):
return response

class get_users(Query):
def __init__(self):
super().__init__()

def query(self) -> List[Payload]:
return [{}]

def response(self, response):
return response

class create_follow(Query):
def __init__(self, follower_id: str, followed_id: str, now: int):
super().__init__()
self.follower_id = follower_id
self.followed_id = followed_id
self.now = now

def query(self):
return [{"follower_id": self.follower_id, "followed_id": self.followed_id, "now": self.now}]


def response(self, response):
return response

class create_post(Query):
def __init__(self, user_id: str, content: str, now: int):
super().__init__()
self.user_id = user_id
self.content = content
self.now = now

def query(self):
return [{"user_id": self.user_id, "content": self.content, "now": self.now}]


def response(self, response):
return response

class get_posts(Query):
def __init__(self):
super().__init__()

def query(self) -> List[Payload]:
return [{}]

def response(self, response):
return response

class get_posts_by_user(Query):
def __init__(self, user_id: str):
super().__init__()
self.user_id = user_id

def query(self) -> List[Payload]:
return [{"user_id": self.user_id}]

def response(self, response):
return response

class get_followed_users(Query):
def __init__(self, user_id: str):
super().__init__()
self.user_id = user_id

def query(self) -> List[Payload]:
return [{"user_id": self.user_id}]

def response(self, response):
return response


class get_followed_users_posts(Query):
def __init__(self, user_id: str):
super().__init__()
self.user_id = user_id

def query(self) -> List[Payload]:
return [{"user_id": self.user_id}]

def response(self, response):
return response

print("\n" + "-"*20 + "CREATE USERS" + "-"*20)
user1 = db.query(create_user("John", 30, "[email protected]", 1722222222))
user2 = db.query(create_user("Jane", 25, "[email protected]", 1722222222))
print(user1, "\n", user2)
print("\n")

user1_id = user1[0]['user'][0]['id']
user2_id = user2[0]['user'][0]['id']

print("-"*20 + "GET USERS" + "-"*20)
for user in db.query(get_users())[0]['users']:
print(user)
print("\n")

print("-"*20 + "CREATE FOLLOW" + "-"*20)
print("Jane follows John")
print(db.query(create_follow(user1_id, user2_id, 1892222222)))
print("\n")

print("-"*20 + "CREATE POST" + "-"*20)
content1 = "Sample Post Content Hello World 1"
content2 = "Sample Post Content Hello World 2"
print(db.query(create_post(user1_id, content1, 1983333333))[0]['post'][0])
print(db.query(create_post(user2_id, content2, 1983333333))[0]['post'][0])
print("\n")

print("-"*20 + "GET POSTS" + "-"*20)
for post in db.query(get_posts())[0]['posts']:
print(post)
print("\n")

print("-"*20 + "GET POSTS BY USER" + "-"*20)
print(f"Should get {content1}")
for post in db.query(get_posts_by_user(user1_id))[0]['posts']:
print(post)
print("\n")

print("-"*20 + "GET FOLLOWED USERS" + "-"*20)
for user in db.query(get_followed_users(user1_id))[0]['followed']:
print(user)
print("\n")

print("-"*20 + "GET FOLLOWED USERS POSTS" + "-"*20)
for post in db.query(get_followed_users_posts(user1_id))[0]['posts']:
print(post)
print("\n")

print("-"*20 + "NEW INSTANCE TO TERMINATE" + "-"*20)
delete_db = Client(local=True, port=6970)
print("\n")

print("-"*20 + "STATUS" + "-"*20)
print("Should have 2 instances running")
print(delete_db.instance.status())
print("\n")

print("-"*20 + "TERMINATE" + "-"*20)
delete_db.terminate()
print("\n")

print("-"*20 + "STATUS" + "-"*20)
print("Should have 1 instance running")
print(delete_db.instance.status())
print("\n")

print("Should have 1 instance not running after script ends")
print("Try running `helix instances` to see")
print(f"\nRun `helix delete {db.instance.instance_id}` to delete the instance")
28 changes: 28 additions & 0 deletions examples/cookbook/instance_demo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from helix.instance import Instance

helix_instance = Instance("helixdb-cfg", "6969", verbose=True)
print("-" * 70 + '\n')

# Deploy
helix_instance.deploy()
print("-" * 70 + '\n')
helix_instance.status()
print("-" * 70 + '\n')

# Stop
helix_instance.stop()
print("-" * 70 + '\n')
helix_instance.status()
print("-" * 70 + '\n')

# Start
helix_instance.start()
print("-" * 70 + '\n')
helix_instance.status()
print("-" * 70 + '\n')

# Delete
helix_instance.delete()
print("-" * 70 + '\n')
helix_instance.status()
print("-" * 70 + '\n')
1 change: 1 addition & 0 deletions helix/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from helix.client import Client, Query, init, next, call_tool, schema_resource
from helix.types import Payload
from helix.loader import Loader
from helix.instance import Instance

__version__ = "0.2.3"

19 changes: 18 additions & 1 deletion helix/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from helix.loader import Loader
from helix.types import GHELIX, RHELIX, Payload
from helix.instance import Instance
import socket
import json
import urllib.request
Expand All @@ -9,6 +10,8 @@
import numpy as np
from tqdm import tqdm
import sys
import time
import atexit

class Query(ABC):
def __init__(self, endpoint: Optional[str]=None):
Expand Down Expand Up @@ -107,12 +110,17 @@ def response(self, response): return response
# have it running already before starting script
# maybe try a .init to start from python script
class Client:
def __init__(self, local: bool, port: int=6969, api_endpoint: str=""):
def __init__(self, local: bool, port: int=6969, api_endpoint: str="", redeploy: bool=False):
self.h_server_port = port
self.h_server_api_endpoint = "" if local else api_endpoint
self.h_server_url = "http://0.0.0.0" if local else ("https://api.helix-db.com/" + self.h_server_api_endpoint)
self.instance = Instance("helixdb-cfg", port, verbose=False)
try:
self.instance.deploy(redeploy=redeploy)
atexit.register(self.instance.stop)

hostname = self.h_server_url.replace("http://", "").replace("https://", "").split("/")[0]
time.sleep(0.1) # Wait for server to spin up TODO: Need better fix
socket.create_connection((hostname, self.h_server_port), timeout=5)
print(f"{GHELIX} Helix instance found at '{self.h_server_url}:{self.h_server_port}'", file=sys.stderr)
except socket.error:
Expand Down Expand Up @@ -146,3 +154,12 @@ def query(self, query: Query) -> List[Any]:

return responses

def terminate(self):
if input("Are you sure you want to delete the instance and its data? (y/n): ") == "y":
self.instance.delete()
atexit.unregister(self.instance.stop)
print(f"{GHELIX} Instance deleted", file=sys.stderr)
else:
self.instance.stop()
atexit.unregister(self.instance.stop)
print(f"{GHELIX} Instance stopped", file=sys.stderr)
Loading