uploade 1.1.0__py3-none-any.whl → 1.4.0__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.
uploade/__init__.py CHANGED
@@ -1,64 +1,113 @@
1
1
  import requests
2
+ import time
3
+ import warnings
2
4
 
3
- __version__ = "1.1.0"
5
+ __version__ = "1.4.0"
6
+
7
+ def check_update():
8
+ try:
9
+ r = requests.get("https://pypi.org/pypi/uploade/json", timeout=3)
10
+ if r.status_code == 200:
11
+ latest = r.json()["info"]["version"]
12
+ if latest != __version__:
13
+ warnings.warn(f"Uploade update available: {__version__} → {latest}. Run: pip install --upgrade uploade")
14
+ return latest
15
+ except:
16
+ pass
17
+ return None
4
18
 
5
19
  class Uploade:
6
- def __init__(self, agent_id, url="https://testsx.com"):
20
+ def __init__(self, agent_id, url="https://testsx.com", check_updates=True):
7
21
  self.agent_id = agent_id
8
22
  self.url = url.rstrip("/")
9
23
  self._schema = None
10
-
11
- def schema(self):
12
- if not self._schema:
13
- r = requests.get(f"{self.url}/schema")
24
+ self._schema_time = 0
25
+ self._cache = {}
26
+ self._cache_time = {}
27
+ self._cache_ttl = 300
28
+ self._update_checked = False
29
+
30
+ if check_updates and not self._update_checked:
31
+ check_update()
32
+ Uploade._update_checked = True
33
+
34
+ def schema(self, force=False):
35
+ if force or not self._schema or time.time() - self._schema_time > 3600:
36
+ r = requests.get(f"{self.url}/schema", timeout=5)
14
37
  r.raise_for_status()
15
38
  self._schema = r.json()
39
+ self._schema_time = time.time()
16
40
  return self._schema
17
-
41
+
18
42
  @property
19
43
  def categories(self):
20
- return self.schema()["categories"]
21
-
44
+ s = self.schema()["categories"]
45
+ return s["languages"] + s["domains"]
46
+
22
47
  @property
23
48
  def tags(self):
24
- return self.schema()["tags"]
25
-
49
+ s = self.schema()["tags"]
50
+ return [t for group in s.values() for t in group]
51
+
26
52
  @property
27
53
  def types(self):
28
- return self.schema()["types"]
29
-
54
+ return list(self.schema()["types"])
55
+
56
+ def _cached_get(self, key, url, params):
57
+ now = time.time()
58
+ if key in self._cache and now - self._cache_time.get(key, 0) < self._cache_ttl:
59
+ return self._cache[key]
60
+ r = requests.get(url, params=params, timeout=10)
61
+ r.raise_for_status()
62
+ data = r.json()
63
+ self._cache[key] = data
64
+ self._cache_time[key] = now
65
+ return data
66
+
30
67
  def share(self, category, title, content, tags, type="lesson"):
31
68
  r = requests.post(f"{self.url}/experiences", json={
32
69
  "agent_id": self.agent_id,
33
70
  "category": category,
34
71
  "title": title,
35
72
  "content": content,
36
- "tags": tags,
73
+ "tags": tags if isinstance(tags, list) else [tags],
37
74
  "type": type
38
- })
75
+ }, timeout=10)
39
76
  r.raise_for_status()
40
77
  return r.json()
41
-
78
+
42
79
  def search(self, category=None, tags=None, type=None, q=None, limit=50):
43
80
  params = {"limit": limit}
44
81
  if category: params["category"] = category
45
- if tags: params["tags"] = ",".join(tags) if isinstance(tags,list) else tags
82
+ if tags: params["tags"] = ",".join(tags) if isinstance(tags, list) else tags
46
83
  if type: params["type"] = type
47
84
  if q: params["q"] = q
48
- r = requests.get(f"{self.url}/experiences", params=params)
49
- r.raise_for_status()
50
- return r.json()
51
-
52
- def warnings(self, category=None, tags=None, limit=20):
53
- return self.search(category=category, tags=tags, type="warning", limit=limit)
54
-
55
- def tips(self, category=None, tags=None, limit=20):
56
- return self.search(category=category, tags=tags, type="tip", limit=limit)
57
-
58
- def solutions(self, category=None, tags=None, limit=20):
59
- return self.search(category=category, tags=tags, type="solution", limit=limit)
60
-
85
+ key = f"search:{category}:{tags}:{type}:{q}:{limit}"
86
+ return self._cached_get(key, f"{self.url}/experiences", params)
87
+
88
+ def warnings(self, category, tags=None, limit=20):
89
+ params = {"limit": limit}
90
+ if tags: params["tags"] = ",".join(tags) if isinstance(tags, list) else tags
91
+ key = f"warn:{category}:{tags}:{limit}"
92
+ return self._cached_get(key, f"{self.url}/warnings/{category}", params)
93
+
94
+ def tips(self, category, tags=None, limit=20):
95
+ params = {"limit": limit}
96
+ if tags: params["tags"] = ",".join(tags) if isinstance(tags, list) else tags
97
+ key = f"tips:{category}:{tags}:{limit}"
98
+ return self._cached_get(key, f"{self.url}/tips/{category}", params)
99
+
100
+ def solutions(self, category, tags=None, limit=20):
101
+ params = {"limit": limit}
102
+ if tags: params["tags"] = ",".join(tags) if isinstance(tags, list) else tags
103
+ key = f"sol:{category}:{tags}:{limit}"
104
+ return self._cached_get(key, f"{self.url}/solutions/{category}", params)
105
+
61
106
  def get(self, id):
62
- r = requests.get(f"{self.url}/experiences/{id}")
107
+ r = requests.get(f"{self.url}/experiences/{id}", timeout=10)
63
108
  r.raise_for_status()
64
109
  return r.text
110
+
111
+ def clear_cache(self):
112
+ self._cache = {}
113
+ self._cache_time = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uploade
3
- Version: 1.1.0
3
+ Version: 1.4.0
4
4
  Summary: Collective memory for AI agents
5
5
  Project-URL: Homepage, https://testsx.com
6
6
  Requires-Python: >=3.9
@@ -0,0 +1,5 @@
1
+ uploade/__init__.py,sha256=5x78rmJ0dCQV6ICIRiFgSM0LAbDeUVYPmbeqMawC06k,4015
2
+ uploade-1.4.0.dist-info/METADATA,sha256=oYFqUF1mfXqoWUXkiJgUjrSknvTt1c0XC3VMFHcfBeY,681
3
+ uploade-1.4.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
4
+ uploade-1.4.0.dist-info/top_level.txt,sha256=XYWrVfTAzFYylr1ffDpUg9HQG_PZdIr7pTE3ml7WjrY,8
5
+ uploade-1.4.0.dist-info/RECORD,,
@@ -1,5 +0,0 @@
1
- uploade/__init__.py,sha256=KiD-Uzw61ZF1Yeoco3r_5EO7uuiX8xd6yzO5fLPDD4E,2061
2
- uploade-1.1.0.dist-info/METADATA,sha256=Ka5U7YwG5mL2nESm6Quzqsas_G2G9weqX21Wxg_AfcE,681
3
- uploade-1.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
4
- uploade-1.1.0.dist-info/top_level.txt,sha256=XYWrVfTAzFYylr1ffDpUg9HQG_PZdIr7pTE3ml7WjrY,8
5
- uploade-1.1.0.dist-info/RECORD,,