Skip to content

Commit 1ec6ed2

Browse files
authored
Fix: Only list orgs in CLI where projects can be created (#1391)
1 parent d2a8878 commit 1ec6ed2

File tree

3 files changed

+52
-19
lines changed

3 files changed

+52
-19
lines changed

logfire/_internal/client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ def _post(self, endpoint: str, *, body: Any | None = None, error_message: str) -
7575

7676
def get_user_organizations(self) -> list[dict[str, Any]]:
7777
"""Get the organizations of the logged-in user."""
78-
return self._get('/v1/organizations/', error_message='Error retrieving list of organizations')
78+
return self._get(
79+
'/v1/organizations/available-for-projects/', error_message='Error retrieving list of organizations'
80+
)
7981

8082
def get_user_information(self) -> dict[str, Any]:
8183
"""Get information about the logged-in user."""

tests/test_cli.py

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,10 @@ def test_projects_new_with_project_name_and_org(
545545
m = requests_mock.Mocker()
546546
stack.enter_context(m)
547547
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
548-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
548+
m.get(
549+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
550+
json=[{'organization_name': 'fake_org'}],
551+
)
549552
create_project_response = {
550553
'json': {
551554
'project_name': 'myproject',
@@ -588,7 +591,10 @@ def test_projects_new_with_project_name_without_org(
588591
m = requests_mock.Mocker()
589592
stack.enter_context(m)
590593
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
591-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
594+
m.get(
595+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
596+
json=[{'organization_name': 'fake_org'}],
597+
)
592598
create_project_response = {
593599
'json': {
594600
'project_name': 'myproject',
@@ -633,7 +639,10 @@ def test_projects_new_with_project_name_and_wrong_org(
633639
m = requests_mock.Mocker()
634640
stack.enter_context(m)
635641
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
636-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
642+
m.get(
643+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
644+
json=[{'organization_name': 'fake_org'}],
645+
)
637646
create_project_response = {
638647
'json': {
639648
'project_name': 'myproject',
@@ -676,7 +685,10 @@ def test_projects_new_with_project_name_and_default_org(
676685
m = requests_mock.Mocker()
677686
stack.enter_context(m)
678687
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
679-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
688+
m.get(
689+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
690+
json=[{'organization_name': 'fake_org'}],
691+
)
680692
create_project_response = {
681693
'json': {
682694
'project_name': 'myproject',
@@ -718,7 +730,7 @@ def test_projects_new_with_project_name_multiple_organizations(
718730
stack.enter_context(m)
719731
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
720732
m.get(
721-
'https://logfire-us.pydantic.dev/v1/organizations/',
733+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
722734
json=[{'organization_name': 'fake_org'}, {'organization_name': 'fake_default_org'}],
723735
)
724736
m.get(
@@ -774,7 +786,7 @@ def test_projects_new_with_project_name_and_default_org_multiple_organizations(
774786
stack.enter_context(m)
775787
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
776788
m.get(
777-
'https://logfire-us.pydantic.dev/v1/organizations/',
789+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
778790
json=[{'organization_name': 'fake_org'}, {'organization_name': 'fake_default_org'}],
779791
)
780792
m.get(
@@ -822,7 +834,10 @@ def test_projects_new_without_project_name(
822834
m = requests_mock.Mocker()
823835
stack.enter_context(m)
824836
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
825-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
837+
m.get(
838+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
839+
json=[{'organization_name': 'fake_org'}],
840+
)
826841
create_project_response = {
827842
'json': {
828843
'project_name': 'myproject',
@@ -867,7 +882,10 @@ def test_projects_new_invalid_project_name(
867882
m = requests_mock.Mocker()
868883
stack.enter_context(m)
869884
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
870-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
885+
m.get(
886+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
887+
json=[{'organization_name': 'fake_org'}],
888+
)
871889
create_project_response = {
872890
'json': {
873891
'project_name': 'myproject',
@@ -917,7 +935,10 @@ def test_projects_new_error(tmp_dir_cwd: Path, default_credentials: Path) -> Non
917935
m = requests_mock.Mocker()
918936
stack.enter_context(m)
919937
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
920-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
938+
m.get(
939+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
940+
json=[{'organization_name': 'fake_org'}],
941+
)
921942
create_project_response = {
922943
'json': {
923944
'project_name': 'myproject',
@@ -952,7 +973,10 @@ def test_projects_without_project_name_without_org(
952973
m = requests_mock.Mocker()
953974
stack.enter_context(m)
954975
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
955-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
976+
m.get(
977+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
978+
json=[{'organization_name': 'fake_org'}],
979+
)
956980
create_project_response = {
957981
'json': {
958982
'project_name': 'myproject',
@@ -996,7 +1020,7 @@ def test_projects_new_get_organizations_error(tmp_dir_cwd: Path, default_credent
9961020

9971021
m = requests_mock.Mocker()
9981022
stack.enter_context(m)
999-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', text='Error', status_code=500)
1023+
m.get('https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/', text='Error', status_code=500)
10001024

10011025
with pytest.raises(LogfireConfigError, match='Error retrieving list of organizations'):
10021026
main(['projects', 'new'])
@@ -1017,7 +1041,7 @@ def test_projects_new_get_user_info_error(tmp_dir_cwd: Path, default_credentials
10171041
stack.enter_context(m)
10181042
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
10191043
m.get(
1020-
'https://logfire-us.pydantic.dev/v1/organizations/',
1044+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
10211045
json=[{'organization_name': 'fake_org'}, {'organization_name': 'fake_default_org'}],
10221046
)
10231047
m.get('https://logfire-us.pydantic.dev/v1/account/me', text='Error', status_code=500)
@@ -1041,7 +1065,10 @@ def test_projects_new_create_project_error(tmp_dir_cwd: Path, default_credential
10411065
m = requests_mock.Mocker()
10421066
stack.enter_context(m)
10431067
m.get('https://logfire-us.pydantic.dev/v1/writable-projects/', json=[])
1044-
m.get('https://logfire-us.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}])
1068+
m.get(
1069+
'https://logfire-us.pydantic.dev/v1/organizations/available-for-projects/',
1070+
json=[{'organization_name': 'fake_org'}],
1071+
)
10451072
m.post('https://logfire-us.pydantic.dev/v1/organizations/fake_org/projects', text='Error', status_code=500)
10461073

10471074
with pytest.raises(LogfireConfigError, match='Error creating new project'):

tests/test_configure.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,8 @@ def test_initialize_project_use_existing_project_no_projects(tmp_dir_cwd: Path,
911911
stack.enter_context(request_mocker)
912912
request_mocker.get('https://logfire-api.pydantic.dev/v1/writable-projects/', json=[])
913913
request_mocker.get(
914-
'https://logfire-api.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}]
914+
'https://logfire-api.pydantic.dev/v1/organizations/available-for-projects/',
915+
json=[{'organization_name': 'fake_org'}],
915916
)
916917
request_mocker.get(
917918
'https://logfire-api.pydantic.dev/v1/info',
@@ -1007,7 +1008,8 @@ def test_initialize_project_not_using_existing_project(
10071008
request_mocker = requests_mock.Mocker()
10081009
stack.enter_context(request_mocker)
10091010
request_mocker.get(
1010-
'https://logfire-api.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}]
1011+
'https://logfire-api.pydantic.dev/v1/organizations/available-for-projects/',
1012+
json=[{'organization_name': 'fake_org'}],
10111013
)
10121014
request_mocker.get(
10131015
'https://logfire-api.pydantic.dev/v1/info',
@@ -1065,7 +1067,8 @@ def test_initialize_project_not_confirming_organization(tmp_path: Path) -> None:
10651067
request_mocker = requests_mock.Mocker()
10661068
stack.enter_context(request_mocker)
10671069
request_mocker.get(
1068-
'https://logfire-api.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}]
1070+
'https://logfire-api.pydantic.dev/v1/organizations/available-for-projects/',
1071+
json=[{'organization_name': 'fake_org'}],
10691072
)
10701073
request_mocker.get(
10711074
'https://logfire-api.pydantic.dev/v1/writable-projects/',
@@ -1108,7 +1111,8 @@ def test_initialize_project_create_project(tmp_dir_cwd: Path, tmp_path: Path, ca
11081111
stack.enter_context(request_mocker)
11091112
request_mocker.get('https://logfire-api.pydantic.dev/v1/writable-projects/', json=[])
11101113
request_mocker.get(
1111-
'https://logfire-api.pydantic.dev/v1/organizations/', json=[{'organization_name': 'fake_org'}]
1114+
'https://logfire-api.pydantic.dev/v1/organizations/available-for-projects/',
1115+
json=[{'organization_name': 'fake_org'}],
11121116
)
11131117
request_mocker.get(
11141118
'https://logfire-api.pydantic.dev/v1/info',
@@ -1224,7 +1228,7 @@ def test_initialize_project_create_project_default_organization(tmp_dir_cwd: Pat
12241228
# request_mocker.get('https://logfire-api.pydantic.dev/v1/info', json={'project_name': 'myproject'})
12251229
request_mocker.get('https://logfire-api.pydantic.dev/v1/writable-projects/', json=[])
12261230
request_mocker.get(
1227-
'https://logfire-api.pydantic.dev/v1/organizations/',
1231+
'https://logfire-api.pydantic.dev/v1/organizations/available-for-projects/',
12281232
json=[{'organization_name': 'fake_org'}, {'organization_name': 'fake_org1'}],
12291233
)
12301234
request_mocker.get(

0 commit comments

Comments
 (0)