autonomous-app 0.2.25__py3-none-any.whl → 0.3.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. autonomous/__init__.py +5 -2
  2. autonomous/ai/audioagent.py +32 -0
  3. autonomous/ai/imageagent.py +31 -0
  4. autonomous/ai/jsonagent.py +40 -0
  5. autonomous/ai/models/__init__.py +0 -0
  6. autonomous/ai/models/openai.py +308 -0
  7. autonomous/ai/oaiagent.py +20 -194
  8. autonomous/ai/textagent.py +35 -0
  9. autonomous/auth/autoauth.py +11 -11
  10. autonomous/auth/user.py +24 -11
  11. autonomous/db/__init__.py +41 -0
  12. autonomous/db/base/__init__.py +33 -0
  13. autonomous/db/base/common.py +62 -0
  14. autonomous/db/base/datastructures.py +476 -0
  15. autonomous/db/base/document.py +1230 -0
  16. autonomous/db/base/fields.py +767 -0
  17. autonomous/db/base/metaclasses.py +468 -0
  18. autonomous/db/base/utils.py +22 -0
  19. autonomous/db/common.py +79 -0
  20. autonomous/db/connection.py +472 -0
  21. autonomous/db/context_managers.py +313 -0
  22. autonomous/db/dereference.py +291 -0
  23. autonomous/db/document.py +1141 -0
  24. autonomous/db/errors.py +165 -0
  25. autonomous/db/fields.py +2732 -0
  26. autonomous/db/mongodb_support.py +24 -0
  27. autonomous/db/pymongo_support.py +80 -0
  28. autonomous/db/queryset/__init__.py +28 -0
  29. autonomous/db/queryset/base.py +2033 -0
  30. autonomous/db/queryset/field_list.py +88 -0
  31. autonomous/db/queryset/manager.py +58 -0
  32. autonomous/db/queryset/queryset.py +189 -0
  33. autonomous/db/queryset/transform.py +527 -0
  34. autonomous/db/queryset/visitor.py +189 -0
  35. autonomous/db/signals.py +59 -0
  36. autonomous/logger.py +3 -0
  37. autonomous/model/autoattr.py +120 -0
  38. autonomous/model/automodel.py +121 -308
  39. autonomous/storage/imagestorage.py +9 -54
  40. autonomous/tasks/autotask.py +0 -25
  41. {autonomous_app-0.2.25.dist-info → autonomous_app-0.3.1.dist-info}/METADATA +7 -8
  42. autonomous_app-0.3.1.dist-info/RECORD +60 -0
  43. {autonomous_app-0.2.25.dist-info → autonomous_app-0.3.1.dist-info}/WHEEL +1 -1
  44. autonomous/db/autodb.py +0 -86
  45. autonomous/db/table.py +0 -156
  46. autonomous/errors/__init__.py +0 -1
  47. autonomous/errors/danglingreferenceerror.py +0 -8
  48. autonomous/model/autoattribute.py +0 -20
  49. autonomous/model/orm.py +0 -86
  50. autonomous/model/serializer.py +0 -110
  51. autonomous_app-0.2.25.dist-info/RECORD +0 -36
  52. /autonomous/{storage → apis}/version_control/GHCallbacks.py +0 -0
  53. /autonomous/{storage → apis}/version_control/GHOrganization.py +0 -0
  54. /autonomous/{storage → apis}/version_control/GHRepo.py +0 -0
  55. /autonomous/{storage → apis}/version_control/GHVersionControl.py +0 -0
  56. /autonomous/{storage → apis}/version_control/__init__.py +0 -0
  57. /autonomous/{storage → utils}/markdown.py +0 -0
  58. {autonomous_app-0.2.25.dist-info → autonomous_app-0.3.1.dist-info}/LICENSE +0 -0
  59. {autonomous_app-0.2.25.dist-info → autonomous_app-0.3.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,35 @@
1
+ from autonomous import log
2
+ from autonomous.model.autoattr import ReferenceAttr, StringAttr
3
+ from autonomous.model.automodel import AutoModel
4
+
5
+ from .models.openai import OpenAIModel
6
+
7
+
8
+ class TextAgent(AutoModel):
9
+ client = ReferenceAttr(choices=[OpenAIModel])
10
+ name = StringAttr(default="textagent")
11
+ instructions = StringAttr(
12
+ default="You are highly skilled AI trained to assist with generating text according to the given requirements."
13
+ )
14
+ description = StringAttr(
15
+ default="A helpful AI assistant trained to assist with generating text according to the given requirements."
16
+ )
17
+
18
+ _ai_model = OpenAIModel
19
+
20
+ def get_client(self):
21
+ if self.client is None:
22
+ self.client = self._ai_model(
23
+ name=self.name,
24
+ instructions=self.instructions,
25
+ description=self.description,
26
+ )
27
+ self.client.save()
28
+ self.save()
29
+ return self.client
30
+
31
+ def summarize_text(self, text, primer=""):
32
+ return self.get_client().summarize_text(text, primer)
33
+
34
+ def generate(self, messages, additional_instructions=""):
35
+ return self.get_client().generate_text(messages, additional_instructions)
@@ -1,17 +1,18 @@
1
+ import json
1
2
  import uuid
2
3
  from datetime import datetime
3
4
  from functools import wraps
4
5
 
5
6
  import requests
6
7
  from authlib.integrations.requests_client import OAuth2Auth, OAuth2Session
7
- from flask import current_app, redirect, request, session, url_for
8
+ from flask import redirect, session, url_for
8
9
 
9
10
  from autonomous import log
10
- from autonomous.auth.user import AutoUser
11
+ from autonomous.auth.user import User
11
12
 
12
13
 
13
14
  class AutoAuth:
14
- user_class = AutoUser
15
+ user_class: type[User] = User
15
16
 
16
17
  def __init__(
17
18
  self,
@@ -46,13 +47,12 @@ class AutoAuth:
46
47
  """
47
48
  Returns the current user.
48
49
  """
49
- user = cls.user_class.get_guest()
50
- if session.get("user") and session["user"]["state"] == "authenticated":
51
- try:
52
- user = cls.user_class.get(session["user"].get("pk"))
53
- user.pk
54
- except Exception as e:
55
- log(e, session["user"])
50
+
51
+ user = (
52
+ cls.user_class.from_json(session["user"]) if session.get("user") else None
53
+ )
54
+ if not user or user.state != "authenticated":
55
+ user = cls.user_class.get_guest()
56
56
  return user
57
57
 
58
58
  def authenticate(self):
@@ -106,7 +106,7 @@ class AutoAuth:
106
106
  user.last_login = datetime.now()
107
107
  # log(user)
108
108
  user.save()
109
- session["user"] = user.serialize()
109
+ session["user"] = user.to_json()
110
110
  # log(guest, user.is_guest)
111
111
  if not guest and user.is_guest:
112
112
  return redirect(url_for("auth.login"))
autonomous/auth/user.py CHANGED
@@ -5,7 +5,7 @@ This module provides a User class that uses the OpenIDAuth class for authenticat
5
5
  from datetime import datetime
6
6
 
7
7
  from autonomous import log
8
- from autonomous.model.autoattribute import AutoAttribute
8
+ from autonomous.model.autoattr import DateTimeAttr, StringAttr
9
9
  from autonomous.model.automodel import AutoModel
10
10
 
11
11
 
@@ -14,15 +14,18 @@ class AutoUser(AutoModel):
14
14
  This class represents a user who can authenticate using OpenID.
15
15
  """
16
16
 
17
- attributes = {
18
- "name": AutoAttribute("TEXT"),
19
- "email": AutoAttribute("TEXT", required=True),
20
- "last_login": datetime.now(),
21
- "state": "unauthenticated",
22
- "provider": None,
23
- "role": "user",
24
- "token": None,
17
+ meta = {
18
+ "abstract": True,
19
+ "allow_inheritance": True,
20
+ "strict": False,
25
21
  }
22
+ name = StringAttr(default="Anonymous")
23
+ email = StringAttr(required=True)
24
+ last_login = DateTimeAttr(default=datetime.now)
25
+ state = StringAttr(default="unauthenticated")
26
+ provider = StringAttr()
27
+ role = StringAttr(default="guest")
28
+ token = StringAttr()
26
29
 
27
30
  def __eq__(self, other):
28
31
  return self.pk == other.pk
@@ -36,9 +39,10 @@ class AutoUser(AutoModel):
36
39
  email = user_info["email"].strip()
37
40
  name = user_info["name"].strip()
38
41
  user = cls.find(email=email)
42
+ log(email, user)
39
43
  if not user:
40
44
  log(f"Creating new user for {email}")
41
- user = cls(name=name, email=email)
45
+ # user = cls(name=name, email=email)
42
46
 
43
47
  # parse user_info into a user object
44
48
  user.name = name
@@ -53,7 +57,7 @@ class AutoUser(AutoModel):
53
57
  """
54
58
  Returns a guest user.
55
59
  """
56
- guest = cls.find(name="_GuestOfAutonomous_", state="guest")
60
+ guest = cls.find(name="_GuestOfAutonomous_")
57
61
  if not guest:
58
62
  guest = cls(
59
63
  name="_GuestOfAutonomous_",
@@ -84,3 +88,12 @@ class AutoUser(AutoModel):
84
88
  Returns True if the user is a guest, False otherwise.
85
89
  """
86
90
  return self.is_authenticated and self.role == "admin"
91
+
92
+
93
+ class User(AutoUser):
94
+ """
95
+ This class represents a user who can authenticate using OpenID.
96
+ """
97
+
98
+ def __repr__(self):
99
+ return f"<User {self.pk} {self.email}>"
autonomous/db/__init__.py CHANGED
@@ -1 +1,42 @@
1
+ # Import submodules so that we can expose their __all__
2
+ # Import everything from each submodule so that it can be accessed via
3
+ # autonomous.db, e.g. instead of `from autonomous.db.connection import connect`,
4
+ # users can simply use `from autonomous.db import connect`, or even
5
+ # `from autonomous.db import *` and then `connect('testdb')`.
6
+ from autonomous.db import (
7
+ connection,
8
+ document,
9
+ errors,
10
+ fields,
11
+ queryset,
12
+ signals,
13
+ )
14
+ from autonomous.db.connection import * # noqa: F401
15
+ from autonomous.db.document import * # noqa: F401
16
+ from autonomous.db.errors import * # noqa: F401
17
+ from autonomous.db.fields import * # noqa: F401
18
+ from autonomous.db.queryset import * # noqa: F401
19
+ from autonomous.db.signals import * # noqa: F401
1
20
 
21
+ __all__ = (
22
+ list(document.__all__)
23
+ + list(fields.__all__)
24
+ + list(connection.__all__)
25
+ + list(queryset.__all__)
26
+ + list(signals.__all__)
27
+ + list(errors.__all__)
28
+ )
29
+
30
+
31
+ VERSION = (0, 29, 0)
32
+
33
+
34
+ def get_version():
35
+ """Return the VERSION as a string.
36
+
37
+ For example, if `VERSION == (0, 10, 7)`, return '0.10.7'.
38
+ """
39
+ return ".".join(map(str, VERSION))
40
+
41
+
42
+ __version__ = get_version()
@@ -0,0 +1,33 @@
1
+ # Base module is split into several files for convenience. Files inside of
2
+ # this module should import from a specific submodule (e.g.
3
+ # `from autonomous.db.base.document import BaseDocument`), but all of the
4
+ # other modules should import directly from the top-level module (e.g.
5
+ # `from autonomous.db.base import BaseDocument`). This approach is cleaner and
6
+ # also helps with cyclical import errors.
7
+ from autonomous.db.base.common import *
8
+ from autonomous.db.base.datastructures import *
9
+ from autonomous.db.base.document import *
10
+ from autonomous.db.base.fields import *
11
+ from autonomous.db.base.metaclasses import *
12
+
13
+ __all__ = (
14
+ # common
15
+ "UPDATE_OPERATORS",
16
+ "_document_registry",
17
+ "get_document",
18
+ # datastructures
19
+ "BaseDict",
20
+ "BaseList",
21
+ "EmbeddedDocumentList",
22
+ "LazyReference",
23
+ # document
24
+ "BaseDocument",
25
+ # fields
26
+ "BaseField",
27
+ "ComplexBaseField",
28
+ "ObjectIdField",
29
+ "GeoJsonBaseField",
30
+ # metaclasses
31
+ "DocumentMetaclass",
32
+ "TopLevelDocumentMetaclass",
33
+ )
@@ -0,0 +1,62 @@
1
+ from autonomous.db.errors import NotRegistered
2
+
3
+ __all__ = ("UPDATE_OPERATORS", "get_document", "_document_registry")
4
+
5
+
6
+ UPDATE_OPERATORS = {
7
+ "set",
8
+ "unset",
9
+ "inc",
10
+ "dec",
11
+ "mul",
12
+ "pop",
13
+ "push",
14
+ "push_all",
15
+ "pull",
16
+ "pull_all",
17
+ "add_to_set",
18
+ "set_on_insert",
19
+ "min",
20
+ "max",
21
+ "rename",
22
+ }
23
+
24
+
25
+ _document_registry = {}
26
+
27
+
28
+ def get_document(name):
29
+ """Get a registered Document class by name."""
30
+ doc = _document_registry.get(name, None)
31
+ if not doc:
32
+ # Possible old style name
33
+ single_end = name.split(".")[-1]
34
+ compound_end = ".%s" % single_end
35
+ possible_match = [
36
+ k for k in _document_registry if k.endswith(compound_end) or k == single_end
37
+ ]
38
+ if len(possible_match) == 1:
39
+ doc = _document_registry.get(possible_match.pop(), None)
40
+ if not doc:
41
+ raise NotRegistered(
42
+ """
43
+ `%s` has not been registered in the document registry.
44
+ Importing the document class automatically registers it, has it
45
+ been imported?
46
+ """.strip()
47
+ % name
48
+ )
49
+ return doc
50
+
51
+
52
+ def _get_documents_by_db(connection_alias, default_connection_alias):
53
+ """Get all registered Documents class attached to a given database"""
54
+
55
+ def get_doc_alias(doc_cls):
56
+ return doc_cls._meta.get("db_alias", default_connection_alias)
57
+
58
+ return [
59
+ doc_cls
60
+ for doc_cls in _document_registry.values()
61
+ if get_doc_alias(doc_cls) == connection_alias
62
+ ]