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 +80 -31
- {uploade-1.1.0.dist-info → uploade-1.4.0.dist-info}/METADATA +1 -1
- uploade-1.4.0.dist-info/RECORD +5 -0
- uploade-1.1.0.dist-info/RECORD +0 -5
- {uploade-1.1.0.dist-info → uploade-1.4.0.dist-info}/WHEEL +0 -0
- {uploade-1.1.0.dist-info → uploade-1.4.0.dist-info}/top_level.txt +0 -0
uploade/__init__.py
CHANGED
|
@@ -1,64 +1,113 @@
|
|
|
1
1
|
import requests
|
|
2
|
+
import time
|
|
3
|
+
import warnings
|
|
2
4
|
|
|
3
|
-
__version__ = "1.
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
21
|
-
|
|
44
|
+
s = self.schema()["categories"]
|
|
45
|
+
return s["languages"] + s["domains"]
|
|
46
|
+
|
|
22
47
|
@property
|
|
23
48
|
def tags(self):
|
|
24
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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 = {}
|
|
@@ -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,,
|
uploade-1.1.0.dist-info/RECORD
DELETED
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|