MCPcopy Create free account
hub / github.com/GerevAI/gerev / BookStack

Class BookStack

app/data_source/sources/bookstack/bookstack.py:32–100  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

30
31
32class BookStack(Session):
33 VERIFY_SSL = os.environ.get('BOOKSTACK_VERIFY_SSL') is not None
34
35 def __init__(self, url: str, token_id: str, token_secret: str, *args, **kwargs):
36 super().__init__(*args, **kwargs)
37 self.base_url = url
38 self.auth = BookStackAuth(token_id, token_secret)
39 self.rate_limit_reach = False
40
41 def request(self, method, url_path, *args, **kwargs):
42 while self.rate_limit_reach:
43 sleep(1)
44
45 url = urljoin(self.base_url, url_path)
46 r = super().request(method, url, verify=BookStack.VERIFY_SSL, *args, **kwargs)
47
48 if r.status_code != 200:
49 if r.status_code == 429:
50 if not self.rate_limit_reach:
51 logger.info("API rate limit reach, waiting...")
52 self.rate_limit_reach = True
53 sleep(60)
54 self.rate_limit_reach = False
55 logger.info("Done waiting for the API rate limit")
56 return self.request(method, url, verify=BookStack.VERIFY_SSL, *args, **kwargs)
57 r.raise_for_status()
58 return r
59
60 def get_list(self, url: str, count: int = 500, sort: str = None, filters: Dict = None):
61 # Add filter[...] to keys, avoiding the insertion of unwanted parameters
62 if filters is not None:
63 filters = {f"filter[{k}]": v for k, v in filters.items()}
64 else:
65 filters = {}
66
67 data = []
68 records = 0
69 total = 1 # Set 1 to enter the loop
70 while records < total:
71 r = self.get(url, params={"count": count, "offset": records, "sort": sort, **filters},
72 headers={"Content-Type": "application/json"})
73 json = r.json()
74 data += json.get("data")
75 records = len(data)
76 total = json.get("total")
77 return data
78
79 def get_all_books(self) -> List[Dict]:
80 return self.get_list("/api/books", sort="+updated_at")
81
82 def get_all_pages_from_book(self, book) -> List[Dict]:
83 pages = self.get_list("/api/pages", sort="+updated_at", filters={"book_id": book["id"]})
84
85 # Add parent book object to each page
86 for page in pages:
87 page.update({"book": book})
88
89 return pages

Callers 2

validate_configMethod · 0.85
__init__Method · 0.85

Calls 1

getMethod · 0.45

Tested by

no test coverage detected