Skip to content

Commit 4b6e2f1

Browse files
authored
fix: rsconnect list bug (#726)
* fix sorting bug * lint * make name optional again and update tests * update changelog
1 parent bf64351 commit 4b6e2f1

File tree

4 files changed

+31
-15
lines changed

4 files changed

+31
-15
lines changed

docs/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased] - ??
99

10+
### Fixed
11+
12+
- `rsconnect list` now properly functions when a stored server has no nickname.
13+
1014
## [1.28.0] - 2025-11-06
1115

1216
### Added

rsconnect/metadata.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,16 @@
1515
from io import BufferedWriter
1616
from os.path import abspath, basename, dirname, exists, join
1717
from threading import Lock
18-
from typing import TYPE_CHECKING, Callable, Dict, Generic, Mapping, Optional, TypeVar, Union
18+
from typing import (
19+
TYPE_CHECKING,
20+
Callable,
21+
Dict,
22+
Generic,
23+
Mapping,
24+
Optional,
25+
TypeVar,
26+
Union,
27+
)
1928
from urllib.parse import urlparse
2029

2130
# Even though TypedDict is available in Python 3.8, because it's used with NotRequired,
@@ -316,7 +325,7 @@ def get_all_servers(self):
316325
317326
:return: the sorted list of known servers.
318327
"""
319-
return self._get_sorted_values(lambda s: s["name"])
328+
return self._get_sorted_values(lambda s: s.get("name") or "")
320329

321330
def set(
322331
self,

tests/test_main.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from os.path import join
55
from unittest import TestCase, mock
66

7-
87
import click
98
import httpretty
109
import pytest

tests/test_metadata.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ def setUp(self):
3232
secret="c29tZVNlY3JldAo=",
3333
)
3434
self.server_store.set("qux", "https://example.snowflakecomputing.app", snowflake_connection_name="dev")
35-
self.assertEqual(len(self.server_store.get_all_servers()), 4, "Unexpected servers after setup")
35+
self.server_store.set("None", "http://connect.test", "notAnApiKey")
36+
self.assertEqual(len(self.server_store.get_all_servers()), 5, "Unexpected servers after setup")
3637

3738
def tearDown(self):
3839
# clean up our temp test directory created with tempfile.mkdtemp()
@@ -93,21 +94,23 @@ def test_remove_by_url(self):
9394

9495
def test_remove_not_found(self):
9596
self.assertFalse(self.server_store.remove_by_name("frazzle"))
96-
self.assertEqual(len(self.server_store.get_all_servers()), 4)
97+
self.assertEqual(len(self.server_store.get_all_servers()), 5)
9798
self.assertFalse(self.server_store.remove_by_url("http://frazzle"))
98-
self.assertEqual(len(self.server_store.get_all_servers()), 4)
99+
self.assertEqual(len(self.server_store.get_all_servers()), 5)
99100

100101
def test_list(self):
101102
servers = self.server_store.get_all_servers()
102-
self.assertEqual(len(servers), 4)
103-
self.assertEqual(servers[0]["name"], "bar")
104-
self.assertEqual(servers[0]["url"], "http://connect.remote")
105-
self.assertEqual(servers[1]["name"], "baz")
106-
self.assertEqual(servers[1]["url"], "https://shinyapps.io")
107-
self.assertEqual(servers[2]["name"], "foo")
108-
self.assertEqual(servers[2]["url"], "http://connect.local")
109-
self.assertEqual(servers[3]["name"], "qux")
110-
self.assertEqual(servers[3]["url"], "https://example.snowflakecomputing.app")
103+
self.assertEqual(len(servers), 5)
104+
self.assertEqual(servers[0]["name"], "None")
105+
self.assertEqual(servers[0]["url"], "http://connect.test")
106+
self.assertEqual(servers[1]["name"], "bar")
107+
self.assertEqual(servers[1]["url"], "http://connect.remote")
108+
self.assertEqual(servers[2]["name"], "baz")
109+
self.assertEqual(servers[2]["url"], "https://shinyapps.io")
110+
self.assertEqual(servers[3]["name"], "foo")
111+
self.assertEqual(servers[3]["url"], "http://connect.local")
112+
self.assertEqual(servers[4]["name"], "qux")
113+
self.assertEqual(servers[4]["url"], "https://example.snowflakecomputing.app")
111114

112115
def check_resolve_call(self, name, server, api_key, insecure, ca_cert, should_be_from_store):
113116
server_data = self.server_store.resolve(name, server)
@@ -133,6 +136,7 @@ def test_resolve_by_default(self):
133136
self.server_store.remove_by_url("http://connect.remote")
134137
self.server_store.remove_by_url("https://shinyapps.io")
135138
self.server_store.remove_by_name("qux")
139+
self.server_store.remove_by_name("None")
136140
self.check_resolve_call(None, None, None, None, None, True)
137141

138142
def test_resolve_from_args(self):

0 commit comments

Comments
 (0)