Skip to content

Commit e480f97

Browse files
committed
Updated structure in easiest way
1 parent 0e67f7b commit e480f97

10 files changed

Lines changed: 186 additions & 167 deletions

File tree

README.md

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
# bugout-python
2-
Python client library for Bugout
2+
Python client library for Bugout API
33

44
```python
5-
from bugout.user import User
6-
from bugout.group import Group
75
from bugout.app import Bugout
86

9-
bugout = Bugout(url="http://localhost", port="433")
10-
bugout_user = User(bugout)
11-
bugout_group = Group(bugout)
12-
137
def main():
14-
print(bugout_user.get_user(token="<user token>"))
15-
print(bugout_group.get_group(group_id="<group id>",token="<user token>"))
8+
bugout = Bugout(brood_api_url="http://localhost:9001", spire_api_url="http://localhost:9002")
9+
user = bugout.get_user("<user token id>")
10+
group = bugout.get_group("<group id>", "<user token id>")
1611

1712
if __name__ == "__main__":
1813
main()
19-
20-
```
14+
```

bugout/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
__author__ = "Bugout"
55
__maintainer__ = __author__
66

7-
__email__ = "neeraj@bugout.dev"
7+
__email__ = "engineering@bugout.dev"
88
__license__ = "MIT"
99
__version__ = "0.0.1"
1010

bugout/__main__.py

Lines changed: 11 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import textwrap
44

55
from .app import Bugout
6-
from .user import User
76

87
logging.basicConfig(level=logging.INFO)
98
logger = logging.getLogger(__name__)
@@ -13,29 +12,9 @@ def user_get_handler(args: argparse.Namespace) -> None:
1312
"""
1413
Handler for "users get" subcommand.
1514
"""
16-
bugout = Bugout(url=args.url, port=args.port)
17-
user_obj = User(bugout)
18-
19-
result = user_obj.get_user(token=args.token)
20-
21-
print(result)
22-
23-
24-
def user_create_handler(args: argparse.Namespace) -> None:
25-
"""
26-
Handler for "users create" subcommand.
27-
"""
28-
bugout = Bugout(url=args.url, port=args.port)
29-
user_obj = User(bugout)
30-
31-
result = user_obj.create_user(
32-
username=args.username,
33-
email=args.email,
34-
password=args.password,
35-
autogenerated_token=args.autogenerated_token,
36-
)
37-
38-
print(result)
15+
bugout = Bugout(brood_api_url=args.brood_url, spire_api_url=args.spire_url)
16+
result = bugout.get_user(token=args.token)
17+
print(result.json())
3918

4019

4120
def main() -> None:
@@ -49,19 +28,19 @@ def main() -> None:
4928
subcommands = parser.add_subparsers(description="Journal commands")
5029

5130
parser.add_argument(
52-
"--url",
53-
default="localhost",
54-
help="Dest url",
31+
"--brood_url",
32+
default="http://localhost:7474",
33+
help="Brood url",
5534
)
5635
parser.add_argument(
57-
"--port",
58-
default="443",
59-
help="Dest port",
36+
"--spire_url",
37+
default="http://localhost:7475",
38+
help="Spire url",
6039
)
6140

62-
# Users handler
41+
# Users handlers
6342
parser_users = subcommands.add_parser(
64-
"users", description="Work with Bugout users API handlers"
43+
"user", description="Work with Bugout users API handlers"
6544
)
6645
parser_users.set_defaults(
6746
func=lambda _: parser_users.print_help(), subparser="users"
@@ -78,35 +57,6 @@ def main() -> None:
7857
)
7958
parser_user_get.set_defaults(func=user_get_handler)
8059

81-
parser_user_create = subcommands_users.add_parser(
82-
"create", description="Create user"
83-
)
84-
parser_user_create.set_defaults(subcommand="create")
85-
parser_user_create.add_argument(
86-
"-u",
87-
"--username",
88-
required=True,
89-
help="Username",
90-
)
91-
parser_user_create.add_argument(
92-
"-e",
93-
"--email",
94-
required=True,
95-
help="Email",
96-
)
97-
parser_user_create.add_argument(
98-
"-p",
99-
"--password",
100-
required=True,
101-
help="Password",
102-
)
103-
parser_user_create.add_argument(
104-
"-a",
105-
"--autogenerated_token",
106-
help="Token",
107-
)
108-
parser_user_create.set_defaults(func=user_create_handler)
109-
11060
args = parser.parse_args()
11161
args.func(args)
11262

bugout/app.py

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,46 @@
1-
from .data import Method
2-
from .calls import ApiCalls
1+
from typing import Any, Dict, List, Optional, Tuple
2+
3+
from . import data
4+
from . import calls
5+
from .group import Group
6+
from .journal import Journal
7+
from .user import User
38

49

510
class Bugout:
6-
def __init__(self, url, port) -> None:
7-
self.url = url
8-
self.port = port
11+
def __init__(self, brood_api_url: str, spire_api_url: str) -> None:
12+
self.brood_api_url = brood_api_url
13+
self.spire_api_url = spire_api_url
14+
self.user = User(self.brood_api_url)
15+
self.group = Group(self.brood_api_url)
16+
self.journal = Journal(self.spire_api_url)
17+
18+
@property
19+
def brood_url(self):
20+
return self.brood_api_url
21+
22+
def brood_ping(self) -> Dict[str, str]:
23+
return calls.ping(self.brood_api_url)
24+
25+
def spire_ping(self) -> Dict[str, str]:
26+
return calls.ping(self.spire_api_url)
27+
28+
def get_user(self, token: str) -> data.BugoutUser:
29+
return self.user.get_user(token)
930

10-
def _call(self, method: Method, path: str, **kwargs):
11-
url = f"{self.url.rstrip('/')}:{self.port}/{path.rstrip('/')}"
31+
def create_user(
32+
self,
33+
username: str,
34+
email: str,
35+
password: str,
36+
autogenerated_token: str = None,
37+
) -> data.BugoutUser:
38+
return self.user.create_user(
39+
username, email, password, autogenerated_token=autogenerated_token
40+
)
1241

13-
result = ApiCalls.make_request(method=method, url=url, **kwargs)
42+
def get_group(self, group_id: str, token: str) -> data.BugoutGroup:
43+
return self.group.get_group(group_id, token)
1444

15-
return result
45+
def get_journal(self, journal_id: str, token: str) -> data.BugoutJournal:
46+
return self.journal.get_journal(journal_id, token)

bugout/calls.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,18 @@ class BugoutUnexpectedResponse(Exception):
1414
"""
1515

1616

17-
class ApiCalls:
18-
"""
19-
Handle REST API requests.
20-
"""
21-
22-
@staticmethod
23-
def make_request(method: Method, url: str, **kwargs) -> Optional[Dict[str, Any]]:
24-
response_body = None
25-
26-
try:
27-
r = requests.request(method.value, url=url, **kwargs)
28-
r.raise_for_status()
29-
response_body = r.json()
30-
except Exception as e:
31-
logger.error(f"Exception {str(e)}")
32-
raise
33-
34-
return response_body
17+
def make_request(method: Method, url: str, **kwargs) -> Any:
18+
response_body = None
19+
try:
20+
r = requests.request(method.value, url=url, **kwargs)
21+
r.raise_for_status()
22+
response_body = r.json()
23+
except Exception as e:
24+
logger.error(f"Exception {str(e)}")
25+
raise
26+
return response_body
27+
28+
29+
def ping(url: str) -> Dict[str, Any]:
30+
url = f"{url.rstrip('/')}/ping"
31+
return make_request(Method.get, url)

bugout/data.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime
12
from enum import Enum, unique
23
from typing import Any, Dict, List, Optional, Tuple
34
import uuid
@@ -12,13 +13,27 @@ class Method(Enum):
1213
delete = "delete"
1314

1415

15-
class BroodUser(BaseModel):
16+
class BugoutUser(BaseModel):
1617
id: uuid.UUID
17-
username: Optional[str]
18-
email: Optional[str]
19-
token: Optional[uuid.UUID]
18+
username: str
19+
email: str
20+
normalized_email: str
21+
verified: bool
22+
autogenerated: bool
23+
created_at: datetime
24+
updated_at: datetime
2025

2126

22-
class BroodGroup(BaseModel):
27+
class BugoutGroup(BaseModel):
2328
id: uuid.UUID
2429
group_name: Optional[str]
30+
autogenerated: bool
31+
32+
33+
class BugoutJournal(BaseModel):
34+
id: uuid.UUID
35+
bugout_user_id: uuid.UUID
36+
holder_ids: List[uuid.UUID]
37+
name: str
38+
created_at: datetime
39+
updated_at: datetime

bugout/group.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import logging
22
from typing import Any, Dict, List, Optional, Tuple
33

4-
from .app import Bugout
5-
from .data import Method
4+
from .calls import make_request
5+
from .data import BugoutGroup, Method
66

77
logger = logging.getLogger(__name__)
88

@@ -13,20 +13,27 @@ class GroupNotFound(Exception):
1313
"""
1414

1515

16-
class Group(Bugout):
16+
class Group:
1717
"""
1818
Represent a group from Bugout.
1919
"""
2020

21-
def __init__(self, bugout: Bugout) -> None:
22-
super().__init__(bugout.url, bugout.port)
21+
def __init__(self, url) -> None:
22+
self.url = url
2323

24-
def get_group(self, group_id: str, token: str) -> Optional[Dict[str, Any]]:
25-
get_group_path = f"groups/{group_id}"
24+
def _call(self, method: Method, path: str, **kwargs):
25+
url = f"{self.url.rstrip('/')}/{path.rstrip('/')}"
26+
result = make_request(method=method, url=url, **kwargs)
27+
return result
2628

29+
def get_group(self, group_id: str, token: str) -> BugoutGroup:
30+
get_group_path = f"groups/{group_id}"
2731
headers = {
2832
"Authorization": f"Bearer {token}",
2933
}
30-
31-
result = super()._call(method=Method.get, path=get_group_path, headers=headers)
32-
return result
34+
result = self._call(method=Method.get, path=get_group_path, headers=headers)
35+
return BugoutGroup(
36+
id=result.get("id"),
37+
name=result.get("name"),
38+
autogenerated=result.get("autogenerated"),
39+
)

bugout/journal.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import logging
2+
from typing import Any, Dict, List, Optional, Tuple
3+
4+
from .calls import make_request
5+
from .data import BugoutJournal, Method
6+
7+
logger = logging.getLogger(__name__)
8+
9+
10+
class JournalNotFound(Exception):
11+
"""
12+
Raised on actions that involve journal which are not present in the database.
13+
"""
14+
15+
16+
class Journal:
17+
"""
18+
Represent a journal from Bugout.
19+
"""
20+
21+
def __init__(self, url) -> None:
22+
self.url = url
23+
24+
def _call(self, method: Method, path: str, **kwargs):
25+
url = f"{self.url.rstrip('/')}/{path.rstrip('/')}"
26+
result = make_request(method=method, url=url, **kwargs)
27+
return result
28+
29+
def get_journal(self, journal_id: str, token: str) -> BugoutJournal:
30+
get_group_path = f"journals/{journal_id}"
31+
headers = {
32+
"Authorization": f"Bearer {token}",
33+
}
34+
result = self._call(method=Method.get, path=get_group_path, headers=headers)
35+
return BugoutJournal(
36+
id=result.get("id"),
37+
bugout_user_id=result.get("bugout_user_id"),
38+
holder_ids=result.get("holder_ids"),
39+
name=result.get("name"),
40+
created_at=result.get("created_at"),
41+
updated_at=result.get("updated_at"),
42+
)

bugout/journals.py

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)