weni-cli 3.8.2__tar.gz → 3.8.4__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 (54) hide show
  1. {weni_cli-3.8.2 → weni_cli-3.8.4}/PKG-INFO +1 -1
  2. {weni_cli-3.8.2 → weni_cli-3.8.4}/pyproject.toml +1 -1
  3. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/cli_client.py +2 -2
  4. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/tests/test_cli_client.py +11 -1
  5. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_ticketer_definition.py +44 -0
  6. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/ticketer_definition.py +17 -0
  7. {weni_cli-3.8.2 → weni_cli-3.8.4}/README.md +0 -0
  8. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/__init__.py +0 -0
  9. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/auth.py +0 -0
  10. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/cli.py +0 -0
  11. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/__init__.py +0 -0
  12. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/common.py +0 -0
  13. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/response_handlers/__init__.py +0 -0
  14. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/response_handlers/handlers.py +0 -0
  15. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/tests/__init__.py +0 -0
  16. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/tests/test_weni_client.py +0 -0
  17. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/clients/weni_client.py +0 -0
  18. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/channel_create.py +0 -0
  19. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/eval_init.py +0 -0
  20. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/eval_run.py +0 -0
  21. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/init.py +0 -0
  22. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/login.py +0 -0
  23. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/logs.py +0 -0
  24. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/project_current.py +0 -0
  25. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/project_list.py +0 -0
  26. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/project_push.py +0 -0
  27. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/project_use.py +0 -0
  28. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/run.py +0 -0
  29. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/commands/ticketer_create.py +0 -0
  30. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/formatter/__init__.py +0 -0
  31. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/formatter/formatter.py +0 -0
  32. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/formatter/tests/test_formatter.py +0 -0
  33. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/handler.py +0 -0
  34. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/__init__.py +0 -0
  35. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/loader.py +0 -0
  36. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/packager.py +0 -0
  37. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/tests/__init__.py +0 -0
  38. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/tests/test_loader.py +0 -0
  39. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/packager/tests/test_packager.py +0 -0
  40. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/spinner/__init__.py +0 -0
  41. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/spinner/spinners.py +0 -0
  42. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/store.py +0 -0
  43. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/utils.py +0 -0
  44. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/__init__.py +0 -0
  45. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/agent_definition.py +0 -0
  46. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/channel_definition.py +0 -0
  47. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/source.py +0 -0
  48. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/__init__.py +0 -0
  49. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/conftest.py +0 -0
  50. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_active_test_definition.py +0 -0
  51. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_channel_definition.py +0 -0
  52. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_definition.py +0 -0
  53. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/validators/tests/test_source.py +0 -0
  54. {weni_cli-3.8.2 → weni_cli-3.8.4}/weni_cli/wsgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: weni-cli
3
- Version: 3.8.2
3
+ Version: 3.8.4
4
4
  Summary:
5
5
  Author: Paulo Bernardo
6
6
  Author-email: paulo.bernardo@weni.ai
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "weni-cli"
3
- version = "3.8.2"
3
+ version = "3.8.4"
4
4
  description = ""
5
5
  authors = ["Paulo Bernardo <paulo.bernardo@weni.ai>", "Matheus Leal <matheus.cardoso@vtex.com>"]
6
6
  readme = "README.md"
@@ -110,7 +110,7 @@ class CLIClient:
110
110
  timeout=timeout,
111
111
  )
112
112
 
113
- if response.status_code != 200:
113
+ if not (200 <= response.status_code < 300):
114
114
  if response.status_code == 401:
115
115
  raise RequestError("Invalid authentication token. Please login again using 'weni login'")
116
116
  try:
@@ -159,7 +159,7 @@ class CLIClient:
159
159
  params=params,
160
160
  )
161
161
 
162
- if response.status_code != 200:
162
+ if not (200 <= response.status_code < 300):
163
163
  if response.status_code == 401:
164
164
  raise RequestError("Invalid authentication token. Please login again using 'weni login'")
165
165
  try:
@@ -837,6 +837,16 @@ def test_request_method_error_handling(client, mocker):
837
837
  response = client._make_request("GET", "test/endpoint")
838
838
  assert response == success_resp
839
839
 
840
+ # 4. Test with 201 Created response (common for POST create endpoints)
841
+ created_resp = mocker.MagicMock()
842
+ created_resp.status_code = 201
843
+ created_resp.json.return_value = {"uuid": "new-resource-uuid"}
844
+
845
+ client.session.request = mocker.MagicMock(return_value=created_resp)
846
+
847
+ response = client._make_request("POST", "test/endpoint")
848
+ assert response == created_resp
849
+
840
850
 
841
851
  def test_streaming_request_json_error_response(client, mocker):
842
852
  """Test _streaming_request method with a JSON error response."""
@@ -1174,7 +1184,7 @@ def test_create_channel_with_whatsapp_channel_type(client, mocker):
1174
1184
  def test_create_ticketer_success(client, mocker):
1175
1185
  """Test successful ticketer creation."""
1176
1186
  mock_response = mocker.MagicMock()
1177
- mock_response.status_code = 200
1187
+ mock_response.status_code = 201
1178
1188
  mock_response.json.return_value = {"uuid": "ticketer-uuid", "name": "org support"}
1179
1189
  mocker.patch.object(client, "_make_request", return_value=mock_response)
1180
1190
 
@@ -186,6 +186,50 @@ class TestValidateTicketerDefinitionSchema:
186
186
  == "Ticketer at index 0: 'config.unknown_field' is not a recognized field in the ticketer definition file"
187
187
  )
188
188
 
189
+ def test_valid_ticketer_definition_with_equivalent_templates(self, valid_ticketer_definition):
190
+ data = valid_ticketer_definition.copy()
191
+ data["ticketers"] = [dict(data["ticketers"][0])]
192
+ data["ticketers"][0]["config"] = dict(data["ticketers"][0]["config"])
193
+ data["ticketers"][0]["config"].update(
194
+ {
195
+ "open_template": '{"ticket_id":{{json .ticket_id}},"contact":{{json .contact}},'
196
+ '"body":{{json .body}},"topic":{{json .topic}},"assignee":{{json .assignee}},'
197
+ '"metadata":{{json .metadata}},"opened_at":{{json .opened_at}}}',
198
+ "open_response_template": '{"external_id":{{json .external_id}},'
199
+ '"status":{{json .status}},"created_at":{{json .created_at}}}',
200
+ "forward_template": '{"ticket_id":{{json .ticket_id}},"external_id":{{json .external_id}},'
201
+ '"message_id":{{json .message_id}},"direction":{{json .direction}},'
202
+ '"sender":{{json .sender}},"text":{{json .text}},"attachments":{{json .attachments}},'
203
+ '"metadata":{{json .metadata}},"sent_at":{{json .sent_at}}}',
204
+ "forward_response_template": '{"message_external_id":{{json .message_external_id}},'
205
+ '"status":{{json .status}}}',
206
+ "close_template": '{"ticket_id":{{json .ticket_id}},"external_id":{{json .external_id}},'
207
+ '"closed_by":{{json .closed_by}},"reason":{{json .reason}},'
208
+ '"metadata":{{json .metadata}},"closed_at":{{json .closed_at}}}',
209
+ "close_response_template": '{"status":{{json .status}}}',
210
+ "history_mode": "batch",
211
+ "history_batch_size": "50",
212
+ "route_history_message": "/v1/tickets/{external_id}/messages",
213
+ "history_template": '{"ticket_id":{{json .ticket_id}},"external_id":{{json .external_id}},'
214
+ '"contact":{{json .contact}},"messages":{{json .messages}},"metadata":{{json .metadata}}}',
215
+ "history_response_template": '{"status":{{json .status}},'
216
+ '"messages_received":{{json .messages_received}}}',
217
+ "messages_template": '{"external_id":{{json .external_id}},'
218
+ '"message_external_id":{{json .message_external_id}},"direction":{{json .direction}},'
219
+ '"sender":{{json .sender}},"text":{{json .text}},"attachments":{{json .attachments}},'
220
+ '"metadata":{{json .metadata}},"sent_at":{{json .sent_at}}}',
221
+ "messages_response_template": '{"status":{{json .status}},'
222
+ '"ticket_uuid":{{json .ticket_uuid}},"message_uuid":{{json .message_uuid}}}',
223
+ "tickets_close_template": '{"external_id":{{json .external_id}},'
224
+ '"closed_by":{{json .closed_by}},"reason":{{json .reason}},'
225
+ '"metadata":{{json .metadata}},"closed_at":{{json .closed_at}}}',
226
+ "tickets_close_response_template": '{"status":{{json .status}},'
227
+ '"ticket_uuid":{{json .ticket_uuid}}}',
228
+ }
229
+ )
230
+ error = validate_ticketer_definition_schema(data)
231
+ assert error is None
232
+
189
233
 
190
234
  class TestLoadTicketerDefinition:
191
235
  """Tests for load_ticketer_definition function."""
@@ -18,7 +18,24 @@ OPTIONAL_CONFIG_FIELDS = [
18
18
  "route_close",
19
19
  "route_reopen",
20
20
  "route_history",
21
+ "route_history_message",
21
22
  "webhook_secret",
23
+ "history_mode",
24
+ "history_batch_size",
25
+ # Plataforma → Ticketer (request/response body templates)
26
+ "open_template",
27
+ "open_response_template",
28
+ "forward_template",
29
+ "forward_response_template",
30
+ "close_template",
31
+ "close_response_template",
32
+ "history_template",
33
+ "history_response_template",
34
+ # Ticketer → Plataforma (inbound webhook request/response templates)
35
+ "messages_template",
36
+ "messages_response_template",
37
+ "tickets_close_template",
38
+ "tickets_close_response_template",
22
39
  ]
23
40
 
24
41
  URL_PATTERN = re.compile(r"^https?://")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes