Skip to content
This repository was archived by the owner on Feb 27, 2023. It is now read-only.

Commit e092a43

Browse files
authored
Feature/versions (#34)
Feature/versions
2 parents 6afb244 + f3ae118 commit e092a43

File tree

3 files changed

+183
-2
lines changed

3 files changed

+183
-2
lines changed

bintray/bintray.py

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
44
https://bintray.com/docs/api
55
"""
6-
import json
76
import os
87

98
from bintray.requester import Requester
@@ -1066,3 +1065,130 @@ def delete_ip_restrictions(self, subject, repo):
10661065
response = self._requester.delete(url)
10671066
self._logger.info("Update successfully")
10681067
return response
1068+
1069+
# Versions
1070+
1071+
def get_version(self, subject, repo, package, version="_latest", attribute_values=True):
1072+
""" Get general information about a specified version, or query for the latest version that
1073+
has at least one file published to it.
1074+
1075+
:param subject: repository owner
1076+
:param repo: repository name
1077+
:param package: package name
1078+
:param version: package version
1079+
:param attribute_values: show attributes
1080+
:return: request response + package version information
1081+
"""
1082+
url = "{}/packages/{}/{}/{}/versions/{}".format(Bintray.BINTRAY_URL, subject, repo,
1083+
package, version)
1084+
params = {"attribute_values": bool_to_number(attribute_values)}
1085+
response = self._requester.get(url, params=params)
1086+
self._logger.info("Get successfully")
1087+
return response
1088+
1089+
def create_version(self, subject, repo, package, version, description=None,
1090+
released=None, github_release_notes_file=None,
1091+
github_use_tag_release_notes=None, vcs_tag=None):
1092+
""" Creates a new version in the specified package (user has to be owner of the package)
1093+
1094+
Security: Authenticated user with 'publish' permission, or package read/write
1095+
entitlement.
1096+
1097+
:param subject: repository owner
1098+
:param repo: repository name
1099+
:param package: package name
1100+
:param version: version name
1101+
:param description: version description
1102+
:param released: release date ISO8601
1103+
:param github_release_notes_file: file path for release notes e.g. RELEASE.txt
1104+
:param github_use_tag_release_notes: True when contain release notes file
1105+
:param vcs_tag: tag name in VCS
1106+
:return: request response
1107+
"""
1108+
url = "{}/packages/{}/{}/{}/versions".format(Bintray.BINTRAY_URL, subject, repo, package)
1109+
json_data = {'name': version}
1110+
if isinstance(description, str):
1111+
json_data["desc"] = description
1112+
if isinstance(released, str):
1113+
json_data["released"] = released
1114+
if isinstance(github_release_notes_file, str):
1115+
json_data["github_release_notes_file"] = github_release_notes_file
1116+
if isinstance(github_use_tag_release_notes, bool):
1117+
json_data["github_use_tag_release_notes"] = github_use_tag_release_notes
1118+
if isinstance(vcs_tag, str):
1119+
json_data["vcs_tag"] = vcs_tag
1120+
1121+
response = self._requester.post(url, json=json_data)
1122+
self._logger.info("Create successfully")
1123+
return response
1124+
1125+
def delete_version(self, subject, repo, package, version):
1126+
""" Delete the specified version
1127+
1128+
Security: Authenticated user with 'publish' permission, or package read/write
1129+
entitlement.
1130+
1131+
param subject: repository owner
1132+
:param repo: repository name
1133+
:param package: package name
1134+
:param version: version to be deleted
1135+
:return: request response
1136+
"""
1137+
url = "{}/packages/{}/{}/{}/versions/{}".format(Bintray.BINTRAY_URL, subject, repo, package,
1138+
version)
1139+
1140+
response = self._requester.delete(url)
1141+
self._logger.info("Delete successfully")
1142+
return response
1143+
1144+
def update_version(self, subject, repo, package, version, description=None,
1145+
github_release_notes_file=None, github_use_tag_release_notes=None,
1146+
vcs_tag=None):
1147+
""" Update the information of the specified version
1148+
1149+
Security: Authenticated user with 'publish' permission, or package read/write
1150+
entitlement.
1151+
1152+
:param subject: repository owner
1153+
:param repo: repository name
1154+
:param package: package name
1155+
:param version: version name to be updated
1156+
:param description: version description
1157+
:param github_release_notes_file: file path for release notes e.g. RELEASE.txt
1158+
:param github_use_tag_release_notes: True when contain release notes file
1159+
:param vcs_tag: tag name in VCS
1160+
:return: request response
1161+
"""
1162+
url = "{}/packages/{}/{}/{}/versions/{}".format(Bintray.BINTRAY_URL, subject, repo,
1163+
package, version)
1164+
json_data = {}
1165+
if isinstance(description, str):
1166+
json_data["desc"] = description
1167+
if isinstance(github_release_notes_file, str):
1168+
json_data["github_release_notes_file"] = github_release_notes_file
1169+
if isinstance(github_use_tag_release_notes, bool):
1170+
json_data["github_use_tag_release_notes"] = github_use_tag_release_notes
1171+
if isinstance(vcs_tag, str):
1172+
json_data["vcs_tag"] = vcs_tag
1173+
1174+
if not json_data:
1175+
raise ValueError("At lease one parameter must be filled.")
1176+
1177+
response = self._requester.patch(url, json=json_data)
1178+
self._logger.info("Create successfully")
1179+
return response
1180+
1181+
def version_for_file(self, subject, repo, file_path):
1182+
""" Get general information about the version a repository file is associated with.
1183+
1184+
Security: Non-authenticated user.
1185+
1186+
:param subject: repository owner
1187+
:param repo: repository name
1188+
:param file_path: associated file path
1189+
:return: request response
1190+
"""
1191+
url = "{}/file_version/{}/{}/{}".format(Bintray.BINTRAY_URL, subject, repo, file_path)
1192+
response = self._requester.get(url)
1193+
self._logger.info("Get successfully")
1194+
return response

bintray/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ def bool_to_number(value):
77
:param value: Any boolean value
88
:return: "1" when True. Otherwise, "0"
99
"""
10-
return "1" if value else "0"
10+
return 1 if value else 0

tests/test_versions.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import datetime
4+
import pytest
5+
from bintray.bintray import Bintray
6+
7+
8+
PACKAGE_VERSION = None
9+
10+
@pytest.fixture
11+
def create_version():
12+
global PACKAGE_VERSION
13+
bintray = Bintray()
14+
now = datetime.datetime.now()
15+
PACKAGE_VERSION = now.strftime("%Y%m%d%H%M%S%f")
16+
released = now.strftime("%Y-%m-%d")
17+
18+
return bintray.create_version("uilianries", "generic", "statistics", version=PACKAGE_VERSION,
19+
released=released, vcs_tag="0.1.0")
20+
21+
22+
def test_get_version():
23+
bintray = Bintray()
24+
response = bintray.get_version("uilianries", "generic", "statistics", version="_latest")
25+
assert response.get("error") == False
26+
assert response.get("name") == "test"
27+
assert response.get("statusCode") == 200
28+
29+
30+
def test_create_version(create_version):
31+
assert create_version.get("error") == False
32+
assert create_version.get("name") == PACKAGE_VERSION
33+
assert create_version.get("statusCode") == 201
34+
35+
36+
def test_delete_version(create_version):
37+
bintray = Bintray()
38+
response = bintray.delete_version("uilianries", "generic", "statistics",
39+
version=PACKAGE_VERSION)
40+
assert {'error': False, 'message': 'success', 'statusCode': 200} == response
41+
42+
43+
def test_update_version(create_version):
44+
bintray = Bintray()
45+
response = bintray.update_version("uilianries", "generic", "statistics",
46+
version=PACKAGE_VERSION, description="foobar",
47+
vcs_tag="0.1.1")
48+
assert {'error': False, 'message': 'success', 'statusCode': 200} == response
49+
50+
51+
def test_version_for_file():
52+
bintray = Bintray()
53+
response = bintray.version_for_file("uilianries", "generic", "packages.json")
54+
assert response.get("error") == False
55+
assert response.get("statusCode") == 200

0 commit comments

Comments
 (0)