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.
Files changed (30) hide show
  1. {magicfeedback-1.0.2/src/MagicFeedback.egg-info → magicfeedback-1.0.3.2}/PKG-INFO +1 -1
  2. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/pyproject.toml +1 -1
  3. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/setup.py +1 -1
  4. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2/src/MagicFeedback.egg-info}/PKG-INFO +1 -1
  5. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/MagicFeedback.egg-info/SOURCES.txt +3 -1
  6. magicfeedback-1.0.3.2/src/magicfeedback_sdk/api/integrations_questions.py +15 -0
  7. magicfeedback-1.0.3.2/src/magicfeedback_sdk/auth.py +28 -0
  8. magicfeedback-1.0.3.2/src/magicfeedback_sdk/client.py +28 -0
  9. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/utils/request.py +3 -4
  10. magicfeedback-1.0.3.2/tests/test_integrations_questions.py +28 -0
  11. magicfeedback-1.0.2/src/magicfeedback_sdk/auth.py +0 -58
  12. magicfeedback-1.0.2/src/magicfeedback_sdk/client.py +0 -27
  13. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/LICENCE +0 -0
  14. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/README.md +0 -0
  15. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/setup.cfg +0 -0
  16. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/MagicFeedback.egg-info/dependency_links.txt +0 -0
  17. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/MagicFeedback.egg-info/top_level.txt +0 -0
  18. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/__init__.py +0 -0
  19. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/__init__.py +0 -0
  20. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/campaigns.py +0 -0
  21. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/contacts.py +0 -0
  22. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/feedback.py +0 -0
  23. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/api/metrics.py +0 -0
  24. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/logging_config.py +0 -0
  25. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/src/magicfeedback_sdk/utils/__init__.py +0 -0
  26. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_apikey.py +0 -0
  27. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_campaign.py +0 -0
  28. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_contact.py +0 -0
  29. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_feedback_answers_array.py +0 -0
  30. {magicfeedback-1.0.2 → magicfeedback-1.0.3.2}/tests/test_feedback_create.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MagicFeedback
3
- Version: 1.0.2
3
+ Version: 1.0.3.2
4
4
  Summary: SDK for MagicFeedback API
5
5
  Home-page: https://github.com/MagicFeedback/magicfeedback_python_sdk
6
6
  Author: Francisc Arias
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "MagicFeedback"
3
- version = "1.0.2"
3
+ version = "1.0.3.2"
4
4
  authors = [
5
5
  { name="Francisco Arias", email="farias@magicfedback.io" },
6
6
  ]
@@ -2,7 +2,7 @@ from setuptools import find_packages, setup
2
2
 
3
3
  setup(
4
4
  name="magicfeedback_sdk",
5
- version="1.0.2",
5
+ version="1.0.3.2",
6
6
  description="A Python SDK for interacting with the MagicFeedback API",
7
7
  author="Francisc Arias",
8
8
  author_email="farias@magicfeedback.io.io",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MagicFeedback
3
- Version: 1.0.2
3
+ Version: 1.0.3.2
4
4
  Summary: SDK for MagicFeedback API
5
5
  Home-page: https://github.com/MagicFeedback/magicfeedback_python_sdk
6
6
  Author: Francisc Arias
@@ -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, Callable, Dict
1
+ from typing import Any, Dict
2
2
 
3
3
  import requests
4
4
 
5
5
 
6
- def make_request(method: str, url: str, get_headers: Callable[[], Dict[str, str]], json=None, logger=None) -> Dict[str, Any]:
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