Skip to content

Commit ceb83fa

Browse files
authored
Merge pull request pypa#249 from pypa/bug/220
Fix --skip-existing with a new package upload
2 parents dd40b39 + 120558f commit ceb83fa

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

tests/test_repository.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14+
import requests
15+
1416
from twine import repository
1517

18+
import pretend
19+
1620

1721
def test_gpg_signature_structure_is_preserved():
1822
data = {
@@ -90,3 +94,48 @@ def test_make_user_agent_string():
9094
assert 'requests-toolbelt/' in user_agent
9195
assert 'pkginfo/' in user_agent
9296
assert 'setuptools/' in user_agent
97+
98+
99+
def response_with(**kwattrs):
100+
resp = requests.Response()
101+
for attr, value in kwattrs.items():
102+
if hasattr(resp, attr):
103+
setattr(resp, attr, value)
104+
105+
return resp
106+
107+
108+
def test_package_is_uploaded_404s():
109+
repo = repository.Repository(
110+
repository_url='https://pypi.python.org/pypi',
111+
username='username',
112+
password='password',
113+
)
114+
repo.session = pretend.stub(
115+
get=lambda url, headers: response_with(status_code=404)
116+
)
117+
package = pretend.stub(
118+
safe_name='fake',
119+
metadata=pretend.stub(version='2.12.0'),
120+
)
121+
122+
assert repo.package_is_uploaded(package) is False
123+
124+
125+
def test_package_is_uploaded_200s_with_no_releases():
126+
repo = repository.Repository(
127+
repository_url='https://pypi.python.org/pypi',
128+
username='username',
129+
password='password',
130+
)
131+
repo.session = pretend.stub(
132+
get=lambda url, headers: response_with(status_code=200,
133+
_content=b'{"releases": {}}',
134+
_content_consumed=True),
135+
)
136+
package = pretend.stub(
137+
safe_name='fake',
138+
metadata=pretend.stub(version='2.12.0'),
139+
)
140+
141+
assert repo.package_is_uploaded(package) is False

twine/repository.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,10 @@ def package_is_uploaded(self, package, bypass_cache=False):
188188
url=LEGACY_PYPI)
189189
headers = {'Accept': 'application/json'}
190190
response = self.session.get(url, headers=headers)
191-
releases = response.json()['releases']
191+
if response.status_code == 200:
192+
releases = response.json()['releases']
193+
else:
194+
releases = {}
192195
self._releases_json_data[safe_name] = releases
193196

194197
packages = releases.get(package.metadata.version, [])

0 commit comments

Comments
 (0)