MagicFeedback 1.0.2__tar.gz → 1.0.3.2__tar.gz
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.
- {magicfeedback-1.0.2/src/MagicFeedback.egg-info → magicfeedback-1.0.3.2}/PKG-INFO +1 -1
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/pyproject.toml +1 -1
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/setup.py +1 -1
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2/src/MagicFeedback.egg-info}/PKG-INFO +1 -1
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/MagicFeedback.egg-info/SOURCES.txt +3 -1
- magicfeedback-1.0.3.2/src/magicfeedback_sdk/api/integrations_questions.py +15 -0
- magicfeedback-1.0.3.2/src/magicfeedback_sdk/auth.py +28 -0
- magicfeedback-1.0.3.2/src/magicfeedback_sdk/client.py +28 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/utils/request.py +3 -4
- magicfeedback-1.0.3.2/tests/test_integrations_questions.py +28 -0
- magicfeedback-1.0.2/src/magicfeedback_sdk/auth.py +0 -58
- magicfeedback-1.0.2/src/magicfeedback_sdk/client.py +0 -27
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/LICENCE +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/README.md +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/setup.cfg +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/MagicFeedback.egg-info/dependency_links.txt +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/MagicFeedback.egg-info/top_level.txt +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/__init__.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/__init__.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/campaigns.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/contacts.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/feedback.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/metrics.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/logging_config.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/utils/__init__.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_apikey.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_campaign.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_contact.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_feedback_answers_array.py +0 -0
- {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_feedback_create.py +0 -0
|
@@ -14,6 +14,7 @@ src/magicfeedback_sdk/api/__init__.py
|
|
|
14
14
|
src/magicfeedback_sdk/api/campaigns.py
|
|
15
15
|
src/magicfeedback_sdk/api/contacts.py
|
|
16
16
|
src/magicfeedback_sdk/api/feedback.py
|
|
17
|
+
src/magicfeedback_sdk/api/integrations_questions.py
|
|
17
18
|
src/magicfeedback_sdk/api/metrics.py
|
|
18
19
|
src/magicfeedback_sdk/utils/__init__.py
|
|
19
20
|
src/magicfeedback_sdk/utils/request.py
|
|
@@ -21,4 +22,5 @@ tests/test_apikey.py
|
|
|
21
22
|
tests/test_campaign.py
|
|
22
23
|
tests/test_contact.py
|
|
23
24
|
tests/test_feedback_answers_array.py
|
|
24
|
-
tests/test_feedback_create.py
|
|
25
|
+
tests/test_feedback_create.py
|
|
26
|
+
tests/test_integrations_questions.py
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from magicfeedback_sdk.utils.request import make_request
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class IntegrationsQuestionsAPI:
|
|
5
|
+
def __init__(self, base_url, headers, logger):
|
|
6
|
+
self.base_url = base_url
|
|
7
|
+
self.headers = headers
|
|
8
|
+
self.logger = logger
|
|
9
|
+
|
|
10
|
+
def get(self, integration_id, filter=None):
|
|
11
|
+
url = f"{self.base_url}/integrations/{integration_id}/questions"
|
|
12
|
+
if filter:
|
|
13
|
+
import json
|
|
14
|
+
url += f"?filter={json.dumps(filter)}"
|
|
15
|
+
return make_request("GET", url, self.headers, logger=self.logger)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
import requests
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AuthManager:
|
|
7
|
+
def __init__(self, ip_key: str, logger):
|
|
8
|
+
self.ip_key = ip_key
|
|
9
|
+
self.logger = logger
|
|
10
|
+
|
|
11
|
+
def get_api_key(self, user, password):
|
|
12
|
+
return self.identity_login(user, password)
|
|
13
|
+
|
|
14
|
+
def identity_login(self, user, password):
|
|
15
|
+
self.logger.info("Logging in with user: %s", user)
|
|
16
|
+
|
|
17
|
+
url = f"https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key={self.ip_key}"
|
|
18
|
+
headers = {"Content-Type": "application/json"}
|
|
19
|
+
payload = json.dumps({
|
|
20
|
+
"email": user,
|
|
21
|
+
"password": password,
|
|
22
|
+
"returnSecureToken": True
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
response = requests.post(url, headers=headers, data=payload)
|
|
26
|
+
response.raise_for_status()
|
|
27
|
+
data = response.json()
|
|
28
|
+
return data["idToken"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from magicfeedback_sdk.api.campaigns import CampaignsAPI
|
|
2
|
+
from magicfeedback_sdk.api.contacts import ContactsAPI
|
|
3
|
+
from magicfeedback_sdk.api.feedback import FeedbackAPI
|
|
4
|
+
from magicfeedback_sdk.api.metrics import MetricsAPI
|
|
5
|
+
from magicfeedback_sdk.api.integrations_questions import IntegrationsQuestionsAPI
|
|
6
|
+
from magicfeedback_sdk.auth import AuthManager
|
|
7
|
+
from magicfeedback_sdk.logging_config import configure_logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MagicFeedback:
|
|
11
|
+
def __init__(self, user: str, password: str, base_url: str = "https://api.magicfeedback.io", ip_key: str = "AIzaSyAKcR895VURSQZSN2T_RD6jX_9y5HRmH80"):
|
|
12
|
+
self.logger = configure_logger()
|
|
13
|
+
self.base_url = base_url
|
|
14
|
+
self.ip_key = ip_key
|
|
15
|
+
|
|
16
|
+
self.auth = AuthManager(ip_key, self.logger)
|
|
17
|
+
self.api_key = self.auth.get_api_key(user, password)
|
|
18
|
+
self.headers = {"Authorization": f"Bearer {self.api_key}"}
|
|
19
|
+
|
|
20
|
+
# APIs
|
|
21
|
+
self.feedbacks = FeedbackAPI(self.base_url, self.headers, self.logger)
|
|
22
|
+
self.contacts = ContactsAPI(self.base_url, self.headers, self.logger)
|
|
23
|
+
self.campaigns = CampaignsAPI(self.base_url, self.headers, self.logger)
|
|
24
|
+
self.metrics = MetricsAPI(self.base_url, self.headers, self.logger)
|
|
25
|
+
self.integrations_questions = IntegrationsQuestionsAPI(self.base_url, self.headers, self.logger)
|
|
26
|
+
|
|
27
|
+
def set_logging(self, level):
|
|
28
|
+
self.logger.setLevel(level)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
from typing import Any,
|
|
1
|
+
from typing import Any, Dict
|
|
2
2
|
|
|
3
3
|
import requests
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
def make_request(method: str, url: str,
|
|
7
|
-
headers = get_headers()
|
|
6
|
+
def make_request(method: str, url: str, headers: Dict[str, str], json=None, logger=None) -> Dict[str, Any]:
|
|
8
7
|
response = requests.request(method, url, headers=headers, json=json)
|
|
9
8
|
response.raise_for_status()
|
|
10
9
|
|
|
@@ -14,4 +13,4 @@ def make_request(method: str, url: str, get_headers: Callable[[], Dict[str, str]
|
|
|
14
13
|
|
|
15
14
|
if response.text:
|
|
16
15
|
return response.json()
|
|
17
|
-
return {}
|
|
16
|
+
return {}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import random
|
|
2
|
+
import string
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
from magicfeedback_sdk import MagicFeedback
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_list_questions(client):
|
|
10
|
+
"""Tests listing questions items."""
|
|
11
|
+
|
|
12
|
+
filter = {
|
|
13
|
+
"where": {
|
|
14
|
+
"integrationid": "0eb9d270-6dd7-11ef-9987-21e04f383573"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
response = client.integrations_questions.get(filter)
|
|
19
|
+
assert len(response) > 0
|
|
20
|
+
|
|
21
|
+
@pytest.fixture
|
|
22
|
+
def client():
|
|
23
|
+
"""Provides a MagicFeedbackClient instance for testing."""
|
|
24
|
+
|
|
25
|
+
client = MagicFeedback('sdk_tester@magicfeedback.io', 'caracter')
|
|
26
|
+
return client
|
|
27
|
+
|
|
28
|
+
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import time
|
|
3
|
-
|
|
4
|
-
import requests
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class AuthManager:
|
|
8
|
-
def __init__(self, ip_key: str, logger, user: str, password: str):
|
|
9
|
-
self.ip_key = ip_key
|
|
10
|
-
self.logger = logger
|
|
11
|
-
self.user = user
|
|
12
|
-
self.password = password
|
|
13
|
-
|
|
14
|
-
self.id_token = None
|
|
15
|
-
self.refresh_token = None
|
|
16
|
-
self.token_expiry = 0 # tiempo UNIX en segundos
|
|
17
|
-
|
|
18
|
-
def get_valid_token(self) -> str:
|
|
19
|
-
if not self.id_token or time.time() >= self.token_expiry:
|
|
20
|
-
if self.refresh_token:
|
|
21
|
-
self.logger.info("Refreshing token...")
|
|
22
|
-
self.refresh_id_token()
|
|
23
|
-
else:
|
|
24
|
-
self.logger.info("Logging in...")
|
|
25
|
-
self.identity_login()
|
|
26
|
-
return self.id_token
|
|
27
|
-
|
|
28
|
-
def identity_login(self):
|
|
29
|
-
self.logger.info("Logging in with user: %s", self.user)
|
|
30
|
-
|
|
31
|
-
url = f"https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key={self.ip_key}"
|
|
32
|
-
headers = {"Content-Type": "application/json"}
|
|
33
|
-
payload = json.dumps({
|
|
34
|
-
"email": self.user,
|
|
35
|
-
"password": self.password,
|
|
36
|
-
"returnSecureToken": True
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
response = requests.post(url, headers=headers, data=payload)
|
|
40
|
-
response.raise_for_status()
|
|
41
|
-
data = response.json()
|
|
42
|
-
|
|
43
|
-
self.id_token = data["idToken"]
|
|
44
|
-
self.refresh_token = data["refreshToken"]
|
|
45
|
-
self.token_expiry = time.time() + int(data["expiresIn"]) - 60 # margen de seguridad
|
|
46
|
-
|
|
47
|
-
def refresh_id_token(self):
|
|
48
|
-
url = f"https://securetoken.googleapis.com/v1/token?key={self.ip_key}"
|
|
49
|
-
headers = {"Content-Type": "application/x-www-form-urlencoded"}
|
|
50
|
-
payload = f"grant_type=refresh_token&refresh_token={self.refresh_token}"
|
|
51
|
-
|
|
52
|
-
response = requests.post(url, headers=headers, data=payload)
|
|
53
|
-
response.raise_for_status()
|
|
54
|
-
data = response.json()
|
|
55
|
-
|
|
56
|
-
self.id_token = data["id_token"]
|
|
57
|
-
self.refresh_token = data["refresh_token"]
|
|
58
|
-
self.token_expiry = time.time() + int(data["expires_in"]) - 60
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
from magicfeedback_sdk.api.campaigns import CampaignsAPI
|
|
2
|
-
from magicfeedback_sdk.api.contacts import ContactsAPI
|
|
3
|
-
from magicfeedback_sdk.api.feedback import FeedbackAPI
|
|
4
|
-
from magicfeedback_sdk.api.metrics import MetricsAPI
|
|
5
|
-
from magicfeedback_sdk.auth import AuthManager
|
|
6
|
-
from magicfeedback_sdk.logging_config import configure_logger
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class MagicFeedback:
|
|
10
|
-
def __init__(self, user: str, password: str, base_url: str = "https://api.magicfeedback.io", api_key: str = "AIzaSyAKcR895VURSQZSN2T_RD6jX_9y5HRmH80"):
|
|
11
|
-
self.logger = configure_logger()
|
|
12
|
-
self.base_url = base_url
|
|
13
|
-
self.api_key = api_key
|
|
14
|
-
|
|
15
|
-
self.auth = AuthManager(api_key, self.logger, user, password)
|
|
16
|
-
|
|
17
|
-
# APIs
|
|
18
|
-
self.feedbacks = FeedbackAPI(self.base_url, self.get_headers, self.logger)
|
|
19
|
-
self.contacts = ContactsAPI(self.base_url, self.get_headers, self.logger)
|
|
20
|
-
self.campaigns = CampaignsAPI(self.base_url, self.get_headers, self.logger)
|
|
21
|
-
self.metrics = MetricsAPI(self.base_url, self.get_headers, self.logger)
|
|
22
|
-
|
|
23
|
-
def set_logging(self, level):
|
|
24
|
-
self.logger.setLevel(level)
|
|
25
|
-
|
|
26
|
-
def get_headers(self):
|
|
27
|
-
return {"Authorization": f"Bearer {self.auth.get_valid_token()}"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/MagicFeedback.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|