django-esi 8.0.0a3__py3-none-any.whl → 8.0.0b1__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.

Potentially problematic release.


This version of django-esi might be problematic. Click here for more details.

Files changed (44) hide show
  1. {django_esi-8.0.0a3.dist-info → django_esi-8.0.0b1.dist-info}/METADATA +3 -2
  2. {django_esi-8.0.0a3.dist-info → django_esi-8.0.0b1.dist-info}/RECORD +44 -33
  3. esi/__init__.py +2 -2
  4. esi/aiopenapi3/plugins.py +100 -3
  5. esi/clients.py +15 -6
  6. esi/helpers.py +37 -0
  7. esi/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
  8. esi/locale/cs_CZ/LC_MESSAGES/django.po +53 -0
  9. esi/locale/de/LC_MESSAGES/django.mo +0 -0
  10. esi/locale/de/LC_MESSAGES/django.po +10 -9
  11. esi/locale/en/LC_MESSAGES/django.mo +0 -0
  12. esi/locale/en/LC_MESSAGES/django.po +3 -3
  13. esi/locale/es/LC_MESSAGES/django.mo +0 -0
  14. esi/locale/es/LC_MESSAGES/django.po +12 -10
  15. esi/locale/fr_FR/LC_MESSAGES/django.mo +0 -0
  16. esi/locale/fr_FR/LC_MESSAGES/django.po +18 -10
  17. esi/locale/it_IT/LC_MESSAGES/django.mo +0 -0
  18. esi/locale/it_IT/LC_MESSAGES/django.po +12 -10
  19. esi/locale/ja/LC_MESSAGES/django.mo +0 -0
  20. esi/locale/ja/LC_MESSAGES/django.po +10 -9
  21. esi/locale/ko_KR/LC_MESSAGES/django.mo +0 -0
  22. esi/locale/ko_KR/LC_MESSAGES/django.po +10 -9
  23. esi/locale/nl_NL/LC_MESSAGES/django.mo +0 -0
  24. esi/locale/nl_NL/LC_MESSAGES/django.po +53 -0
  25. esi/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
  26. esi/locale/pl_PL/LC_MESSAGES/django.po +53 -0
  27. esi/locale/ru/LC_MESSAGES/django.mo +0 -0
  28. esi/locale/ru/LC_MESSAGES/django.po +13 -10
  29. esi/locale/sk/LC_MESSAGES/django.mo +0 -0
  30. esi/locale/sk/LC_MESSAGES/django.po +55 -0
  31. esi/locale/uk/LC_MESSAGES/django.mo +0 -0
  32. esi/locale/uk/LC_MESSAGES/django.po +57 -0
  33. esi/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  34. esi/locale/zh_Hans/LC_MESSAGES/django.po +10 -9
  35. esi/management/commands/generate_esi_stubs.py +11 -31
  36. esi/models.py +1 -1
  37. esi/openapi_clients.py +207 -54
  38. esi/stubs.pyi +395 -395
  39. esi/tests/__init__.py +3 -3
  40. esi/tests/test_clients.py +77 -19
  41. esi/tests/test_openapi.json +264 -0
  42. esi/tests/test_openapi.py +402 -1
  43. {django_esi-8.0.0a3.dist-info → django_esi-8.0.0b1.dist-info}/WHEEL +0 -0
  44. {django_esi-8.0.0a3.dist-info → django_esi-8.0.0b1.dist-info}/licenses/LICENSE +0 -0
esi/tests/__init__.py CHANGED
@@ -23,10 +23,10 @@ def _generate_token(
23
23
  expires_in: int = 1200,
24
24
  sso_version: int = 2
25
25
  ) -> dict:
26
- from datetime import datetime, timedelta
26
+ import datetime as dt
27
27
 
28
28
  if timestamp_dt is None:
29
- timestamp_dt = datetime.utcnow()
29
+ timestamp_dt = dt.datetime.now(dt.timezone.utc)
30
30
  if scopes is None:
31
31
  scopes = [
32
32
  'esi-mail.read_mail.v1',
@@ -40,7 +40,7 @@ def _generate_token(
40
40
  'timestamp': int(timestamp_dt.timestamp()),
41
41
  'character_id': character_id,
42
42
  'name': character_name,
43
- 'ExpiresOn': _dt_eveformat(timestamp_dt + timedelta(seconds=expires_in)),
43
+ 'ExpiresOn': _dt_eveformat(timestamp_dt + dt.timedelta(seconds=expires_in)),
44
44
  'scp': scopes,
45
45
  'token_type': 'character',
46
46
  'owner': character_owner_hash,
esi/tests/test_clients.py CHANGED
@@ -1,4 +1,4 @@
1
- from datetime import datetime, timedelta, timezone
1
+ import datetime
2
2
  import os
3
3
  from unittest.mock import patch, Mock
4
4
  import json
@@ -49,7 +49,7 @@ def _load_json_file(path):
49
49
 
50
50
  class MockResultFuture:
51
51
  def __init__(self):
52
- dt = datetime.utcnow().replace(tzinfo=timezone.utc) + timedelta(seconds=60)
52
+ dt = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=60)
53
53
  self.headers = {"Expires": dt.strftime("%a, %d %b %Y %H:%M:%S %Z")}
54
54
  self.status_code = 200
55
55
  self.text = "dummy"
@@ -57,7 +57,7 @@ class MockResultFuture:
57
57
 
58
58
  class MockResultPast:
59
59
  def __init__(self):
60
- dt = datetime.utcnow().replace(tzinfo=timezone.utc) - timedelta(seconds=60)
60
+ dt = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(seconds=60)
61
61
  self.headers = {"Expires": dt.strftime("%a, %d %b %Y %H:%M:%S %Z")}
62
62
 
63
63
 
@@ -198,7 +198,7 @@ class TestTokenAuthenticator(NoSocketsTestCase):
198
198
  request.headers = dict()
199
199
  request.params = dict()
200
200
 
201
- self.token.created -= timedelta(121)
201
+ self.token.created -= datetime.timedelta(121)
202
202
 
203
203
  x = TokenAuthenticator(token=self.token)
204
204
  request2 = x.apply(request)
@@ -212,7 +212,7 @@ class TestTokenAuthenticator(NoSocketsTestCase):
212
212
  request.headers = dict()
213
213
  request.params = dict()
214
214
 
215
- self.token.created -= timedelta(121)
215
+ self.token.created -= datetime.timedelta(121)
216
216
  self.token.refresh_token = None
217
217
 
218
218
  x = TokenAuthenticator(token=self.token)
@@ -733,7 +733,10 @@ class TestClientResult2(NoSocketsTestCase):
733
733
  # then
734
734
  self.assertTrue(requests_mocker.called)
735
735
  request = requests_mocker.last_request
736
- self.assertEqual(request._request.headers["User-Agent"], "Django-ESI/1.0.0 (email@example.com; +https://gitlab.com/allianceauth/django-esi)")
736
+
737
+ expected_title = 'DjangoEsi'
738
+
739
+ self.assertEqual(request._request.headers["User-Agent"], f"{expected_title}/1.0.0 (email@example.com; +https://gitlab.com/allianceauth/django-esi)")
737
740
 
738
741
  def test_existing_headers(self, requests_mocker):
739
742
  # given
@@ -743,7 +746,10 @@ class TestClientResult2(NoSocketsTestCase):
743
746
  # then
744
747
  self.assertTrue(requests_mocker.called)
745
748
  request = requests_mocker.last_request
746
- self.assertEqual(request._request.headers["User-Agent"], "Django-ESI/1.0.0 (email@example.com; +https://gitlab.com/allianceauth/django-esi)")
749
+
750
+ expected_title = 'DjangoEsi'
751
+
752
+ self.assertEqual(request._request.headers["User-Agent"], f"{expected_title}/1.0.0 (email@example.com; +https://gitlab.com/allianceauth/django-esi)")
747
753
 
748
754
 
749
755
  class TestRequestsClientPlus(NoSocketsTestCase):
@@ -809,7 +815,9 @@ class TestEsiClientFactoryAppText(NoSocketsTestCase):
809
815
  # when
810
816
  operation = client.Status.get_status()
811
817
  # then
812
- self.assertEqual(operation.future.request.headers["User-Agent"], "Django-ESI/1.0.0 (None; +https://gitlab.com/allianceauth/django-esi)")
818
+ expected_app_name = "MyApp"
819
+ expected_title = 'DjangoEsi'
820
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_title}/1.0.0 (None; +https://gitlab.com/allianceauth/django-esi)")
813
821
 
814
822
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
815
823
  def test_defaults_email(self, requests_mocker) -> None:
@@ -821,7 +829,9 @@ class TestEsiClientFactoryAppText(NoSocketsTestCase):
821
829
  # when
822
830
  operation = client.Status.get_status()
823
831
  # then
824
- self.assertEqual(operation.future.request.headers["User-Agent"], "Django-ESI/1.0.0 (email@example.com; +https://gitlab.com/allianceauth/django-esi)")
832
+ expected_app_name = "MyApp"
833
+ expected_title = 'DjangoEsi'
834
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_title}/1.0.0 (email@example.com; +https://gitlab.com/allianceauth/django-esi)")
825
835
 
826
836
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", None)
827
837
  def test_app_text(self, requests_mocker) -> None:
@@ -835,7 +845,9 @@ class TestEsiClientFactoryAppText(NoSocketsTestCase):
835
845
  # when
836
846
  operation = client.Status.get_status()
837
847
  # then
838
- self.assertEqual(operation.future.request.headers["User-Agent"], "my-app v1.0.0 (None) Django-ESI/1.0.0 (+https://gitlab.com/allianceauth/django-esi)",)
848
+ expected_app_name = "MyApp"
849
+ expected_title = 'DjangoEsi'
850
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"my-app v1.0.0 (None) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)",)
839
851
 
840
852
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
841
853
  def test_app_text_with_email(self, requests_mocker):
@@ -848,7 +860,9 @@ class TestEsiClientFactoryAppText(NoSocketsTestCase):
848
860
  # when
849
861
  operation = client.Status.get_status()
850
862
  # then
851
- self.assertEqual(operation.future.request.headers["User-Agent"], "my-app v1.0.0 (email@example.com) Django-ESI/1.0.0 (+https://gitlab.com/allianceauth/django-esi)",)
863
+ expected_app_name = "MyApp"
864
+ expected_title = 'DjangoEsi'
865
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"my-app v1.0.0 (email@example.com) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)",)
852
866
 
853
867
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
854
868
  def test_ua_generator(self, requests_mocker):
@@ -859,7 +873,41 @@ class TestEsiClientFactoryAppText(NoSocketsTestCase):
859
873
  # when
860
874
  operation = client.Status.get_status()
861
875
  # then
862
- self.assertEqual(operation.future.request.headers["User-Agent"], "MyApp/1.0.0 (email@example.com) Django-ESI/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
876
+ expected_app_name = "MyApp"
877
+ expected_title = 'DjangoEsi'
878
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_app_name}/1.0.0 (email@example.com) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
879
+
880
+ @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
881
+ def test_ua_generator_for_appname_with_spaces(self, requests_mocker):
882
+ requests_mocker.register_uri("GET", url="https://esi.evetech.net/_latest/swagger.json", json=self.spec)
883
+ requests_mocker.register_uri("GET", url="https://esi.evetech.net/latest/swagger.json", json=self.spec)
884
+ requests_mocker.register_uri("GET", url="https://esi.evetech.net/v1/status/", json=self.status_response)
885
+ client = esi_client_factory(ua_appname="My App", ua_version="1.0.0")
886
+
887
+ # when
888
+ operation = client.Status.get_status()
889
+
890
+ # then
891
+ expected_app_name = "MyApp"
892
+ expected_title = 'DjangoEsi'
893
+
894
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_app_name}/1.0.0 (email@example.com) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
895
+
896
+ @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
897
+ def test_ua_generator_for_appname_with_hyphens(self, requests_mocker):
898
+ requests_mocker.register_uri("GET", url="https://esi.evetech.net/_latest/swagger.json", json=self.spec)
899
+ requests_mocker.register_uri("GET", url="https://esi.evetech.net/latest/swagger.json", json=self.spec)
900
+ requests_mocker.register_uri("GET", url="https://esi.evetech.net/v1/status/", json=self.status_response)
901
+ client = esi_client_factory(ua_appname="My-App", ua_version="1.0.0")
902
+
903
+ # when
904
+ operation = client.Status.get_status()
905
+
906
+ # then
907
+ expected_app_name = "MyApp"
908
+ expected_title = 'DjangoEsi'
909
+
910
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_app_name}/1.0.0 (email@example.com) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
863
911
 
864
912
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
865
913
  def test_ua_generator_with_url(self, requests_mocker):
@@ -870,7 +918,9 @@ class TestEsiClientFactoryAppText(NoSocketsTestCase):
870
918
  # when
871
919
  operation = client.Status.get_status()
872
920
  # then
873
- self.assertEqual(operation.future.request.headers["User-Agent"], "MyApp/1.0.0 (email@example.com; +https://example.com) Django-ESI/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
921
+ expected_app_name = "MyApp"
922
+ expected_title = 'DjangoEsi'
923
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_app_name}/1.0.0 (email@example.com; +https://example.com) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
874
924
 
875
925
  @patch(MODULE_PATH + ".__title__", "Django-ESI")
876
926
  @patch(MODULE_PATH + ".__version__", "1.0.0")
@@ -897,7 +947,8 @@ class TestEsiClientProviderAppText(NoSocketsTestCase):
897
947
  # when
898
948
  operation = client.Status.get_status()
899
949
  # then
900
- self.assertEqual(operation.future.request.headers["User-Agent"], "Django-ESI/1.0.0 (None; +https://gitlab.com/allianceauth/django-esi)")
950
+ expected_title = 'DjangoEsi'
951
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_title}/1.0.0 (None; +https://gitlab.com/allianceauth/django-esi)")
901
952
 
902
953
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
903
954
  def test_defaults_email(self, requests_mocker) -> None:
@@ -909,7 +960,8 @@ class TestEsiClientProviderAppText(NoSocketsTestCase):
909
960
  # when
910
961
  operation = client.Status.get_status()
911
962
  # then
912
- self.assertEqual(operation.future.request.headers["User-Agent"], "Django-ESI/1.0.0 (email@example.com; +https://gitlab.com/allianceauth/django-esi)")
963
+ expected_title = 'DjangoEsi'
964
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_title}/1.0.0 (email@example.com; +https://gitlab.com/allianceauth/django-esi)")
913
965
 
914
966
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", None)
915
967
  def test_app_text(self, requests_mocker) -> None:
@@ -923,7 +975,8 @@ class TestEsiClientProviderAppText(NoSocketsTestCase):
923
975
  # when
924
976
  operation = client.Status.get_status()
925
977
  # then
926
- self.assertEqual(operation.future.request.headers["User-Agent"], "my-app v1.0.0 (None) Django-ESI/1.0.0 (+https://gitlab.com/allianceauth/django-esi)",)
978
+ expected_title = 'DjangoEsi'
979
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"my-app v1.0.0 (None) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)",)
927
980
 
928
981
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
929
982
  def test_app_text_with_email(self, requests_mocker):
@@ -936,7 +989,8 @@ class TestEsiClientProviderAppText(NoSocketsTestCase):
936
989
  # when
937
990
  operation = client.Status.get_status()
938
991
  # then
939
- self.assertEqual(operation.future.request.headers["User-Agent"], "my-app v1.0.0 (email@example.com) Django-ESI/1.0.0 (+https://gitlab.com/allianceauth/django-esi)",)
992
+ expected_title = 'DjangoEsi'
993
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"my-app v1.0.0 (email@example.com) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)",)
940
994
 
941
995
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
942
996
  def test_ua_generator(self, requests_mocker):
@@ -947,7 +1001,9 @@ class TestEsiClientProviderAppText(NoSocketsTestCase):
947
1001
  # when
948
1002
  operation = client.Status.get_status()
949
1003
  # then
950
- self.assertEqual(operation.future.request.headers["User-Agent"], "MyApp/1.0.0 (email@example.com) Django-ESI/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
1004
+ expected_app_name = "MyApp"
1005
+ expected_title = 'DjangoEsi'
1006
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_app_name}/1.0.0 (email@example.com) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
951
1007
 
952
1008
  @patch(MODULE_PATH + ".app_settings.ESI_USER_CONTACT_EMAIL", "email@example.com")
953
1009
  def test_ua_generator_with_url(self, requests_mocker):
@@ -958,4 +1014,6 @@ class TestEsiClientProviderAppText(NoSocketsTestCase):
958
1014
  # when
959
1015
  operation = client.Status.get_status()
960
1016
  # then
961
- self.assertEqual(operation.future.request.headers["User-Agent"], "MyApp/1.0.0 (email@example.com; +https://example.com) Django-ESI/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
1017
+ expected_app_name = "MyApp"
1018
+ expected_title = 'DjangoEsi'
1019
+ self.assertEqual(operation.future.request.headers["User-Agent"], f"{expected_app_name}/1.0.0 (email@example.com; +https://example.com) {expected_title}/1.0.0 (+https://gitlab.com/allianceauth/django-esi)")
@@ -0,0 +1,264 @@
1
+ {
2
+ "components": {
3
+ "headers": {
4
+ "CacheControl": {
5
+ "description": "Directives for caching mechanisms. It controls how the response can be cached, by whom, and for how long.",
6
+ "schema": { "type": "string" }
7
+ },
8
+ "ContentLanguage": {
9
+ "description": "The language used in the response.",
10
+ "schema": {
11
+ "enum": ["en", "de", "fr", "ja", "ru", "zh", "ko", "es"],
12
+ "type": "string"
13
+ }
14
+ },
15
+ "ETag": {
16
+ "description": "The ETag value of the response body. Use this with If-None-Match to check whether the resource has changed.",
17
+ "schema": { "type": "string" }
18
+ },
19
+ "LastModified": {
20
+ "description": "The last modified date of the response. Use this with If-Modified-Since to check whether the resource has changed.",
21
+ "schema": { "type": "string" }
22
+ }
23
+ },
24
+ "parameters": {
25
+ "AcceptLanguage": {
26
+ "description": "The language to use for the response.",
27
+ "in": "header",
28
+ "name": "Accept-Language",
29
+ "schema": {
30
+ "default": "en",
31
+ "enum": ["en", "de", "fr", "ja", "ru", "zh", "ko", "es"],
32
+ "type": "string"
33
+ }
34
+ },
35
+ "CompatibilityDate": {
36
+ "description": "The compatibility date for the request.",
37
+ "in": "header",
38
+ "name": "X-Compatibility-Date",
39
+ "required": true,
40
+ "schema": { "enum": ["2025-08-26"], "format": "date", "type": "string" }
41
+ },
42
+ "IfModifiedSince": {
43
+ "description": "The date the resource was last modified. A 304 will be returned if the resource has not been modified since this date.",
44
+ "in": "header",
45
+ "name": "If-Modified-Since",
46
+ "schema": { "type": "string" }
47
+ },
48
+ "IfNoneMatch": {
49
+ "description": "The ETag of the previous request. A 304 will be returned if this matches the current ETag.",
50
+ "in": "header",
51
+ "name": "If-None-Match",
52
+ "schema": { "type": "string" }
53
+ },
54
+ "Tenant": {
55
+ "description": "The tenant ID for the request.",
56
+ "example": "",
57
+ "in": "header",
58
+ "name": "X-Tenant",
59
+ "schema": { "default": "tranquility", "type": "string" }
60
+ }
61
+ },
62
+ "schemas": {
63
+ "StatusGet": {
64
+ "properties": {
65
+ "players": {
66
+ "description": "Current online player count",
67
+ "type": "integer"
68
+ },
69
+ "server_version": {
70
+ "description": "Running version as string",
71
+ "type": "string"
72
+ },
73
+ "start_time": {
74
+ "description": "Server start timestamp",
75
+ "format": "date-time",
76
+ "type": "string"
77
+ },
78
+ "vip": {
79
+ "description": "If the server is in VIP mode",
80
+ "type": "boolean"
81
+ }
82
+ },
83
+ "required": ["start_time", "players", "server_version"],
84
+ "type": "object"
85
+ },
86
+ "Error": {
87
+ "additionalProperties": false,
88
+ "properties": {
89
+ "details": {
90
+ "description": "List of individual error details.",
91
+ "items": {
92
+ "$ref": "#/components/schemas/ErrorDetail"
93
+ },
94
+ "type": [
95
+ "array",
96
+ "null"
97
+ ]
98
+ },
99
+ "error": {
100
+ "description": "Error message.",
101
+ "type": "string"
102
+ }
103
+ },
104
+ "required": [
105
+ "error"
106
+ ],
107
+ "type": "object"
108
+ },
109
+ "ErrorDetail": {
110
+ "additionalProperties": false,
111
+ "properties": {
112
+ "location": {
113
+ "description": "Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'",
114
+ "type": "string"
115
+ },
116
+ "message": {
117
+ "description": "Error message text",
118
+ "type": "string"
119
+ },
120
+ "value": {
121
+ "description": "The value at the given location"
122
+ }
123
+ },
124
+ "type": "object"
125
+ }
126
+ },
127
+ "securitySchemes": {
128
+ "OAuth2": {
129
+ "flows": {
130
+ "authorizationCode": {
131
+ "authorizationUrl": "https://login.eveonline.com/v2/oauth/authorize",
132
+ "scopes": {
133
+ "esi-alliances.read_contacts.v1": "esi-alliances.read_contacts.v1",
134
+ "esi-assets.read_assets.v1": "esi-assets.read_assets.v1",
135
+ "esi-assets.read_corporation_assets.v1": "esi-assets.read_corporation_assets.v1",
136
+ "esi-calendar.read_calendar_events.v1": "esi-calendar.read_calendar_events.v1",
137
+ "esi-calendar.respond_calendar_events.v1": "esi-calendar.respond_calendar_events.v1",
138
+ "esi-characters.read_agents_research.v1": "esi-characters.read_agents_research.v1",
139
+ "esi-characters.read_blueprints.v1": "esi-characters.read_blueprints.v1",
140
+ "esi-characters.read_contacts.v1": "esi-characters.read_contacts.v1",
141
+ "esi-characters.read_corporation_roles.v1": "esi-characters.read_corporation_roles.v1",
142
+ "esi-characters.read_fatigue.v1": "esi-characters.read_fatigue.v1",
143
+ "esi-characters.read_fw_stats.v1": "esi-characters.read_fw_stats.v1",
144
+ "esi-characters.read_loyalty.v1": "esi-characters.read_loyalty.v1",
145
+ "esi-characters.read_medals.v1": "esi-characters.read_medals.v1",
146
+ "esi-characters.read_notifications.v1": "esi-characters.read_notifications.v1",
147
+ "esi-characters.read_standings.v1": "esi-characters.read_standings.v1",
148
+ "esi-characters.read_titles.v1": "esi-characters.read_titles.v1",
149
+ "esi-characters.write_contacts.v1": "esi-characters.write_contacts.v1",
150
+ "esi-clones.read_clones.v1": "esi-clones.read_clones.v1",
151
+ "esi-clones.read_implants.v1": "esi-clones.read_implants.v1",
152
+ "esi-contracts.read_character_contracts.v1": "esi-contracts.read_character_contracts.v1",
153
+ "esi-contracts.read_corporation_contracts.v1": "esi-contracts.read_corporation_contracts.v1",
154
+ "esi-corporations.read_blueprints.v1": "esi-corporations.read_blueprints.v1",
155
+ "esi-corporations.read_contacts.v1": "esi-corporations.read_contacts.v1",
156
+ "esi-corporations.read_container_logs.v1": "esi-corporations.read_container_logs.v1",
157
+ "esi-corporations.read_corporation_membership.v1": "esi-corporations.read_corporation_membership.v1",
158
+ "esi-corporations.read_divisions.v1": "esi-corporations.read_divisions.v1",
159
+ "esi-corporations.read_facilities.v1": "esi-corporations.read_facilities.v1",
160
+ "esi-corporations.read_fw_stats.v1": "esi-corporations.read_fw_stats.v1",
161
+ "esi-corporations.read_medals.v1": "esi-corporations.read_medals.v1",
162
+ "esi-corporations.read_projects.v1": "esi-corporations.read_projects.v1",
163
+ "esi-corporations.read_standings.v1": "esi-corporations.read_standings.v1",
164
+ "esi-corporations.read_starbases.v1": "esi-corporations.read_starbases.v1",
165
+ "esi-corporations.read_structures.v1": "esi-corporations.read_structures.v1",
166
+ "esi-corporations.read_titles.v1": "esi-corporations.read_titles.v1",
167
+ "esi-corporations.track_members.v1": "esi-corporations.track_members.v1",
168
+ "esi-fittings.read_fittings.v1": "esi-fittings.read_fittings.v1",
169
+ "esi-fittings.write_fittings.v1": "esi-fittings.write_fittings.v1",
170
+ "esi-fleets.read_fleet.v1": "esi-fleets.read_fleet.v1",
171
+ "esi-fleets.write_fleet.v1": "esi-fleets.write_fleet.v1",
172
+ "esi-industry.read_character_jobs.v1": "esi-industry.read_character_jobs.v1",
173
+ "esi-industry.read_character_mining.v1": "esi-industry.read_character_mining.v1",
174
+ "esi-industry.read_corporation_jobs.v1": "esi-industry.read_corporation_jobs.v1",
175
+ "esi-industry.read_corporation_mining.v1": "esi-industry.read_corporation_mining.v1",
176
+ "esi-killmails.read_corporation_killmails.v1": "esi-killmails.read_corporation_killmails.v1",
177
+ "esi-killmails.read_killmails.v1": "esi-killmails.read_killmails.v1",
178
+ "esi-location.read_location.v1": "esi-location.read_location.v1",
179
+ "esi-location.read_online.v1": "esi-location.read_online.v1",
180
+ "esi-location.read_ship_type.v1": "esi-location.read_ship_type.v1",
181
+ "esi-mail.organize_mail.v1": "esi-mail.organize_mail.v1",
182
+ "esi-mail.read_mail.v1": "esi-mail.read_mail.v1",
183
+ "esi-mail.send_mail.v1": "esi-mail.send_mail.v1",
184
+ "esi-markets.read_character_orders.v1": "esi-markets.read_character_orders.v1",
185
+ "esi-markets.read_corporation_orders.v1": "esi-markets.read_corporation_orders.v1",
186
+ "esi-markets.structure_markets.v1": "esi-markets.structure_markets.v1",
187
+ "esi-planets.manage_planets.v1": "esi-planets.manage_planets.v1",
188
+ "esi-planets.read_customs_offices.v1": "esi-planets.read_customs_offices.v1",
189
+ "esi-search.search_structures.v1": "esi-search.search_structures.v1",
190
+ "esi-skills.read_skillqueue.v1": "esi-skills.read_skillqueue.v1",
191
+ "esi-skills.read_skills.v1": "esi-skills.read_skills.v1",
192
+ "esi-ui.open_window.v1": "esi-ui.open_window.v1",
193
+ "esi-ui.write_waypoint.v1": "esi-ui.write_waypoint.v1",
194
+ "esi-universe.read_structures.v1": "esi-universe.read_structures.v1",
195
+ "esi-wallet.read_character_wallet.v1": "esi-wallet.read_character_wallet.v1",
196
+ "esi-wallet.read_corporation_wallets.v1": "esi-wallet.read_corporation_wallets.v1"
197
+ },
198
+ "tokenUrl": "https://login.eveonline.com/v2/oauth/token"
199
+ }
200
+ },
201
+ "type": "oauth2"
202
+ }
203
+ }
204
+ },
205
+ "info": {
206
+ "contact": {
207
+ "name": "ESI Support",
208
+ "url": "https://developers.eveonline.com/docs/support/"
209
+ },
210
+ "license": {
211
+ "name": "EVE Developer License",
212
+ "url": "https://developers.eveonline.com/license-agreement"
213
+ },
214
+ "termsOfService": "https://support.eveonline.com/hc/en-us/articles/8414770561948-EVE-Online-Terms-of-Service",
215
+ "title": "EVE Stable Infrastructure (ESI) - tranquility",
216
+ "version": "2025-08-26"
217
+ },
218
+ "openapi": "3.1.0",
219
+ "paths": {
220
+ "/status": {
221
+ "get": {
222
+ "description": "EVE Server status",
223
+ "operationId": "GetStatus",
224
+ "parameters": [
225
+ { "$ref": "#/components/parameters/AcceptLanguage" },
226
+ { "$ref": "#/components/parameters/IfNoneMatch" },
227
+ { "$ref": "#/components/parameters/CompatibilityDate" },
228
+ { "$ref": "#/components/parameters/Tenant" }
229
+ ],
230
+ "responses": {
231
+ "200": {
232
+ "content": {
233
+ "application/json": {
234
+ "schema": { "$ref": "#/components/schemas/StatusGet" }
235
+ }
236
+ },
237
+ "description": "OK",
238
+ "headers": {
239
+ "Cache-Control": { "$ref": "#/components/headers/CacheControl" },
240
+ "ETag": { "$ref": "#/components/headers/ETag" },
241
+ "Last-Modified": { "$ref": "#/components/headers/LastModified" }
242
+ }
243
+ },
244
+ "default": {
245
+ "content": {
246
+ "application/json": {
247
+ "schema": { "$ref": "#/components/schemas/Error" }
248
+ }
249
+ },
250
+ "description": "Error"
251
+ }
252
+ },
253
+ "summary": "Retrieve the uptime and player counts",
254
+ "tags": ["Status"],
255
+ "x-cache-age": 30,
256
+ "x-compatibility-date": "2020-01-01"
257
+ }
258
+ }
259
+ },
260
+ "servers": [{ "url": "https://esi.evetech.net" }],
261
+ "tags": [
262
+ { "name": "Status" }
263
+ ]
264
+ }