diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-pyartifactory.spec | 1385 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 1387 insertions, 0 deletions
@@ -0,0 +1 @@ +/pyartifactory-1.12.0.tar.gz diff --git a/python-pyartifactory.spec b/python-pyartifactory.spec new file mode 100644 index 0000000..927708c --- /dev/null +++ b/python-pyartifactory.spec @@ -0,0 +1,1385 @@ +%global _empty_manifest_terminate_build 0 +Name: python-pyartifactory +Version: 1.12.0 +Release: 1 +Summary: Typed interactions with the Jfrog Artifactory REST API +License: MIT +URL: https://github.com/anancarv/python-artifactory +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/41/7b/cff309398523173b330cba24720c22849158874e5ae3726945a64f507bc3/pyartifactory-1.12.0.tar.gz +BuildArch: noarch + +Requires: python3-requests +Requires: python3-email_validator +Requires: python3-pydantic +Requires: python3-typing_extensions +Requires: python3-typing_extensions + +%description +# PyArtifactory + +[](https://github.com/anancarv/python-artifactory/actions) +[](https://badge.fury.io/py/pyartifactory) +[](https://www.codacy.com/gh/anancarv/python-artifactory/dashboard?utm_source=github.com&utm_medium=referral&utm_content=anancarv/python-artifactory&utm_campaign=Badge_Grade) +[](https://www.codacy.com/gh/anancarv/python-artifactory/dashboard?utm_source=github.com&utm_medium=referral&utm_content=anancarv/python-artifactory&utm_campaign=Badge_Coverage) + + + +`pyartifactory` is a Python library to access the [Artifactory REST API](https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API). + +This library enables you to manage Artifactory resources such as users, groups, permissions, repositories, artifacts and access tokens in your applications. Based on Python 3.6+ type hints. + +<!-- toc --> + +- [Requirements](#requirements) +- [Install](#install) +- [Usage](#usage) + * [Authentication](#authentication) + * [SSL Cert Verification Options](#ssl-cert-verification-options) + * [Admin objects](#admin-objects) + + [User](#user) + + [Group](#group) + + [Security](#security) + + [Repository](#repository) + + [Permission](#permission) + - [Artifactory lower than 6.6.0](#artifactory-lower-than-660) + - [Artifactory 6.6.0 or higher](#artifactory-660-or-higher) + * [Artifacts](#artifacts) + + [Get the information about a file or folder](#get-the-information-about-a-file-or-folder) + + [Deploy an artifact](#deploy-an-artifact) + + [Download an artifact](#download-an-artifact) + + [Retrieve artifact list](#retrieve-artifact-list) + + [Retrieve artifact properties](#retrieve-artifact-properties) + + [Set artifact properties](#set-artifact-properties) + + [Update artifact properties](#update-artifact-properties) + + [Retrieve artifact stats](#retrieve-artifact-stats) + + [Copy artifact to a new location](#copy-artifact-to-a-new-location) + + [Move artifact to a new location](#move-artifact-to-a-new-location) + + [Delete an artifact](#delete-an-artifact) + * [Contributing](#contributing) + +<!-- tocstop --> + +## Requirements + +* Python 3.6+ + + +## Install + +```python +pip install pyartifactory +``` + +## Usage + +### Authentication + +Since Artifactory 6.6.0 there is version 2 of the REST API for permission management, in case you have that version or higher, you need to pass api_version=2 to the constructor when you instantiate the class. + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_OR_API_KEY'), api_version=1) +``` + +### SSL Cert Verification Options +Specify a local cert to use as client side certificate + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY'), cert="/path_to_file/server.pem",api_version=1) +``` + +Disable host cert verification + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY'), verify=False, api_version=1) +``` + +### Admin objects + +#### User + +First, you need to create a new Artifactory object. +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY')) +``` + +Get the list of users: +```python +users = art.users.list() +``` + +Get a single user: +```python +user = art.users.get("test_user") +``` + +Create a user: +```python +from pyartifactory.models import NewUser + +# Create User +user = NewUser(name="test_user", password="test_password", email="user@user.com") +new_user = art.users.create(user) + +# Update user +user.email = "test@test.com" +updated_user = art.users.update(user) +``` + +Update a user: +```python +from pyartifactory.models import User + +user = art.users.get("test_user") + +# Update user +user.email = "test@test.com" +updated_user = art.users.update(user) +``` + +Delete a user: +```python +art.users.delete("test_user") +``` + +Unlock a user: +```python +art.users.unlock("test_user") +``` + +#### Group + +Get the list of groups: +```python +groups = art.groups.list() +``` + +Get a single group: +```python +group = art.groups.get("group_name") +``` + +Create/Update a group: +```python +from pyartifactory.models import Group + +# Create a Group +group = Group(name="test_group", description="test_group") +new_group = art.groups.create(group) + +# Update a Group +group.description = "test_group_2" +updated_group = art.groups.update(group) +``` + +Delete a group: +```python +art.groups.delete("test_group") +``` + +#### Security + +A set of methods for performing operations on apiKeys, passwords ... +```python +>>> art.security. +art.security.create_api_key( art.security.get_encrypted_password( art.security.revoke_api_key( +art.security.get_api_key( art.security.regenerate_api_key( art.security.revoke_user_api_key( +``` + +Create an access token (for a transient user): +```python +token = art.security.create_access_token(user_name='transient_artifactory_user', + groups=['g1', 'g2'], + refreshable=True) +``` + +Create an access token for an existing user (groups are implied from the existing user): +```python +token = art.security.create_access_token(user_name='existing_artifactory_user', + refreshable=True) +``` + +Revoke an existing revocable token: +```python +art.security.revoke_access_token(token.access_token) +``` + +#### Repository + +Get the list of repositories: +```python +repositories = art.repositories.list() +``` + +Get a single repository +```python +repo = art.repositories.get_repo("repo_name") +# According to the repo type, you'll have either a local, virtual or remote repository returned +``` + +Create/Update a repository: +```python +from pyartifactory.models import LocalRepository, VirtualRepository, RemoteRepository + +# Create local repo +local_repo = LocalRepository(key="test_local_repo") +new_local_repo = art.repositories.create_repo(local_repo) + +# Create virtual repo +virtual_repo = VirtualRepository(key="test_virtual_repo") +new_virtual_repo = art.repositories.create_repo(virtual_repo) + +# Create remote repo +remote_repo = RemoteRepository(key="test_remote_repo") +new_remote_repo = art.repositories.create_repo(remote_repo) + +# Update a repository +local_repo = art.repositories.get_repo("test_local_repo") +local_repo.description = "test_local_repo" +updated_local_repo = art.repositories.update_repo(local_repo) +``` + +Delete a repository: +```python +art.repositories.delete("test_local_repo") +``` + +#### Permission +Get the list of permissions: +```python +permissions = art.permissions.list() +``` + +Get a single permission: +```python +users = art.permissions.get("test_permission") +``` + +Create/Update a permission: + +##### Artifactory lower than 6.6.0 + +```python + +from pyartifactory.models import Permission + +# Create a permission +permission = Permission( + **{ + "name": "test_permission", + "repositories": ["test_repository"], + "principals": { + "users": {"test_user": ["r", "w", "n", "d"]}, + "groups": {"developers": ["r"]}, + }, + } +) +perm = art.permissions.create(permission) + +# Update permission +permission.repositories = ["test_repository_2"] +updated_permission = art.permissions.update(permission) +``` + +##### Artifactory 6.6.0 or higher +```python +from pyartifactory import Artifactory +from pyartifactory.models import PermissionV2 +from pyartifactory.models.permission import PermissionEnumV2, PrincipalsPermissionV2, RepoV2, BuildV2, ReleaseBundleV2 + +# To use PermissionV2, make sure to set api_version=2 +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_OR_API_KEY'), api_version=2) + +# Create a permission +permission = PermissionV2( + name="test_permission", + repo=RepoV2( + repositories=["test_repository"], + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + PermissionEnumV2.annotate, + PermissionEnumV2.write, + PermissionEnumV2.delete, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + PermissionEnumV2.annotate, + PermissionEnumV2.write, + PermissionEnumV2.delete, + ], + }, + ), + includePatterns=["**"], + excludePatterns=[], + ), + build=BuildV2( + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + PermissionEnumV2.write, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + PermissionEnumV2.write, + ], + }, + ), + includePatterns=[""], + excludePatterns=[""], + ), + releaseBundle=ReleaseBundleV2( + repositories=["release-bundles"], + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + ], + }, + ), + includePatterns=[""], + excludePatterns=[""], + ) + # You don't have to set all the objects repo, build and releaseBundle + # If you only need repo for example, you can set only the repo object +) +perm = art.permissions.create(permission) + +# Update permission +permission.repo.repositories = ["test_repository_2"] +updated_permission = art.permissions.update(permission) +``` + +Delete a permission: +```python +art.permissions.delete("test_permission") +``` + +### Artifacts + +#### Get the information about a file or folder +```python +artifact_info = art.artifacts.info("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# file_info = art.artifacts.info("my-repository/my/artifact/directory/file.txt") +# folder_info = art.artifacts.info("my-repository/my/artifact/directory") +``` + +#### Deploy an artifact +```python +artifact = art.artifacts.deploy("<LOCAL_FILE_LOCATION>", "<ARTIFACT_PATH_IN_ARTIFACTORY>") +# artifact = art.artifacts.deploy("Desktop/myNewFile.txt", "my-repository/my/new/artifact/directory/file.txt") +``` + +#### Download an artifact +```python +artifact = art.artifacts.download("<ARTIFACT_PATH_IN_ARTIFACTORY>", "<LOCAL_DIRECTORY_PATH>") +# artifact = art.artifacts.download("my-artifactory-repository/my/new/artifact/file.txt", "Desktop/my/local/directory") +# The artifact location is returned by the download method +# If you have not set a <LOCAL_DIRECTORY_PATH>, the artifact will be downloaded in the current directory +``` + +#### Retrieve artifact list +```python +artifacts = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# files_only = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", list_folders=False) +# non_recursive = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", recursive=False) +# max_depth = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", depth=3) +``` + +#### Retrieve artifact properties +```python +artifact_properties = art.artifacts.properties("<ARTIFACT_PATH_IN_ARTIFACTORY>") # returns all properties +# artifact_properties = art.artifacts.properties("my-repository/my/new/artifact/directory/file.txt") +artifact_properties = art.artifacts.properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", ["prop1", "prop2"]) # returns specific properties +artifact_properties.properties["prop1"] # ["value1", "value1-bis"] +``` + +#### Set artifact properties +```python +artifact_properties = art.artifacts.set_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}) # recursive mode is enabled by default +artifact_properties = art.artifacts.set_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"]}, False) # disable recursive mode +``` + +#### Update artifact properties +```python +artifact_properties = art.artifacts.update_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}) # recursive mode is enabled by default +artifact_properties = art.artifacts.update_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}, False) # disable recursive mode +``` + +#### Retrieve artifact stats +```python +artifact_stats = art.artifacts.stats("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# artifact_stats = art.artifacts.stats("my-repository/my/new/artifact/directory/file.txt") +``` + +#### Copy artifact to a new location +```python +artifact = art.artifacts.copy("<CURRENT_ARTIFACT_PATH_IN_ARTIFACTORY>","<NEW_ARTIFACT_PATH_IN_ARTIFACTORY>") + +# If you want to run a dryRun test, you can do the following: +# artifact = art.artifacts.copy("my-repository/current/artifact/path/file.txt","my-repository/new/artifact/path/file.txt", dryrun=True) +# It will return properties of the newly copied artifact +``` + +#### Move artifact to a new location +```python +artifact = art.artifacts.move("<CURRENT_ARTIFACT_PATH_IN_ARTIFACTORY>","<NEW_ARTIFACT_PATH_IN_ARTIFACTORY>") + +# You can also run a dryRun test with the move operation +# It will return properties of the newly moved artifact +``` + +#### Delete an artifact +```python +art.artifacts.delete("<ARTIFACT_PATH_IN_ARTIFACTORY>") +``` + + +### Contributing +Please read the [Development - Contributing](./CONTRIBUTING.md) guidelines. + + +%package -n python3-pyartifactory +Summary: Typed interactions with the Jfrog Artifactory REST API +Provides: python-pyartifactory +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-pyartifactory +# PyArtifactory + +[](https://github.com/anancarv/python-artifactory/actions) +[](https://badge.fury.io/py/pyartifactory) +[](https://www.codacy.com/gh/anancarv/python-artifactory/dashboard?utm_source=github.com&utm_medium=referral&utm_content=anancarv/python-artifactory&utm_campaign=Badge_Grade) +[](https://www.codacy.com/gh/anancarv/python-artifactory/dashboard?utm_source=github.com&utm_medium=referral&utm_content=anancarv/python-artifactory&utm_campaign=Badge_Coverage) + + + +`pyartifactory` is a Python library to access the [Artifactory REST API](https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API). + +This library enables you to manage Artifactory resources such as users, groups, permissions, repositories, artifacts and access tokens in your applications. Based on Python 3.6+ type hints. + +<!-- toc --> + +- [Requirements](#requirements) +- [Install](#install) +- [Usage](#usage) + * [Authentication](#authentication) + * [SSL Cert Verification Options](#ssl-cert-verification-options) + * [Admin objects](#admin-objects) + + [User](#user) + + [Group](#group) + + [Security](#security) + + [Repository](#repository) + + [Permission](#permission) + - [Artifactory lower than 6.6.0](#artifactory-lower-than-660) + - [Artifactory 6.6.0 or higher](#artifactory-660-or-higher) + * [Artifacts](#artifacts) + + [Get the information about a file or folder](#get-the-information-about-a-file-or-folder) + + [Deploy an artifact](#deploy-an-artifact) + + [Download an artifact](#download-an-artifact) + + [Retrieve artifact list](#retrieve-artifact-list) + + [Retrieve artifact properties](#retrieve-artifact-properties) + + [Set artifact properties](#set-artifact-properties) + + [Update artifact properties](#update-artifact-properties) + + [Retrieve artifact stats](#retrieve-artifact-stats) + + [Copy artifact to a new location](#copy-artifact-to-a-new-location) + + [Move artifact to a new location](#move-artifact-to-a-new-location) + + [Delete an artifact](#delete-an-artifact) + * [Contributing](#contributing) + +<!-- tocstop --> + +## Requirements + +* Python 3.6+ + + +## Install + +```python +pip install pyartifactory +``` + +## Usage + +### Authentication + +Since Artifactory 6.6.0 there is version 2 of the REST API for permission management, in case you have that version or higher, you need to pass api_version=2 to the constructor when you instantiate the class. + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_OR_API_KEY'), api_version=1) +``` + +### SSL Cert Verification Options +Specify a local cert to use as client side certificate + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY'), cert="/path_to_file/server.pem",api_version=1) +``` + +Disable host cert verification + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY'), verify=False, api_version=1) +``` + +### Admin objects + +#### User + +First, you need to create a new Artifactory object. +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY')) +``` + +Get the list of users: +```python +users = art.users.list() +``` + +Get a single user: +```python +user = art.users.get("test_user") +``` + +Create a user: +```python +from pyartifactory.models import NewUser + +# Create User +user = NewUser(name="test_user", password="test_password", email="user@user.com") +new_user = art.users.create(user) + +# Update user +user.email = "test@test.com" +updated_user = art.users.update(user) +``` + +Update a user: +```python +from pyartifactory.models import User + +user = art.users.get("test_user") + +# Update user +user.email = "test@test.com" +updated_user = art.users.update(user) +``` + +Delete a user: +```python +art.users.delete("test_user") +``` + +Unlock a user: +```python +art.users.unlock("test_user") +``` + +#### Group + +Get the list of groups: +```python +groups = art.groups.list() +``` + +Get a single group: +```python +group = art.groups.get("group_name") +``` + +Create/Update a group: +```python +from pyartifactory.models import Group + +# Create a Group +group = Group(name="test_group", description="test_group") +new_group = art.groups.create(group) + +# Update a Group +group.description = "test_group_2" +updated_group = art.groups.update(group) +``` + +Delete a group: +```python +art.groups.delete("test_group") +``` + +#### Security + +A set of methods for performing operations on apiKeys, passwords ... +```python +>>> art.security. +art.security.create_api_key( art.security.get_encrypted_password( art.security.revoke_api_key( +art.security.get_api_key( art.security.regenerate_api_key( art.security.revoke_user_api_key( +``` + +Create an access token (for a transient user): +```python +token = art.security.create_access_token(user_name='transient_artifactory_user', + groups=['g1', 'g2'], + refreshable=True) +``` + +Create an access token for an existing user (groups are implied from the existing user): +```python +token = art.security.create_access_token(user_name='existing_artifactory_user', + refreshable=True) +``` + +Revoke an existing revocable token: +```python +art.security.revoke_access_token(token.access_token) +``` + +#### Repository + +Get the list of repositories: +```python +repositories = art.repositories.list() +``` + +Get a single repository +```python +repo = art.repositories.get_repo("repo_name") +# According to the repo type, you'll have either a local, virtual or remote repository returned +``` + +Create/Update a repository: +```python +from pyartifactory.models import LocalRepository, VirtualRepository, RemoteRepository + +# Create local repo +local_repo = LocalRepository(key="test_local_repo") +new_local_repo = art.repositories.create_repo(local_repo) + +# Create virtual repo +virtual_repo = VirtualRepository(key="test_virtual_repo") +new_virtual_repo = art.repositories.create_repo(virtual_repo) + +# Create remote repo +remote_repo = RemoteRepository(key="test_remote_repo") +new_remote_repo = art.repositories.create_repo(remote_repo) + +# Update a repository +local_repo = art.repositories.get_repo("test_local_repo") +local_repo.description = "test_local_repo" +updated_local_repo = art.repositories.update_repo(local_repo) +``` + +Delete a repository: +```python +art.repositories.delete("test_local_repo") +``` + +#### Permission +Get the list of permissions: +```python +permissions = art.permissions.list() +``` + +Get a single permission: +```python +users = art.permissions.get("test_permission") +``` + +Create/Update a permission: + +##### Artifactory lower than 6.6.0 + +```python + +from pyartifactory.models import Permission + +# Create a permission +permission = Permission( + **{ + "name": "test_permission", + "repositories": ["test_repository"], + "principals": { + "users": {"test_user": ["r", "w", "n", "d"]}, + "groups": {"developers": ["r"]}, + }, + } +) +perm = art.permissions.create(permission) + +# Update permission +permission.repositories = ["test_repository_2"] +updated_permission = art.permissions.update(permission) +``` + +##### Artifactory 6.6.0 or higher +```python +from pyartifactory import Artifactory +from pyartifactory.models import PermissionV2 +from pyartifactory.models.permission import PermissionEnumV2, PrincipalsPermissionV2, RepoV2, BuildV2, ReleaseBundleV2 + +# To use PermissionV2, make sure to set api_version=2 +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_OR_API_KEY'), api_version=2) + +# Create a permission +permission = PermissionV2( + name="test_permission", + repo=RepoV2( + repositories=["test_repository"], + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + PermissionEnumV2.annotate, + PermissionEnumV2.write, + PermissionEnumV2.delete, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + PermissionEnumV2.annotate, + PermissionEnumV2.write, + PermissionEnumV2.delete, + ], + }, + ), + includePatterns=["**"], + excludePatterns=[], + ), + build=BuildV2( + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + PermissionEnumV2.write, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + PermissionEnumV2.write, + ], + }, + ), + includePatterns=[""], + excludePatterns=[""], + ), + releaseBundle=ReleaseBundleV2( + repositories=["release-bundles"], + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + ], + }, + ), + includePatterns=[""], + excludePatterns=[""], + ) + # You don't have to set all the objects repo, build and releaseBundle + # If you only need repo for example, you can set only the repo object +) +perm = art.permissions.create(permission) + +# Update permission +permission.repo.repositories = ["test_repository_2"] +updated_permission = art.permissions.update(permission) +``` + +Delete a permission: +```python +art.permissions.delete("test_permission") +``` + +### Artifacts + +#### Get the information about a file or folder +```python +artifact_info = art.artifacts.info("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# file_info = art.artifacts.info("my-repository/my/artifact/directory/file.txt") +# folder_info = art.artifacts.info("my-repository/my/artifact/directory") +``` + +#### Deploy an artifact +```python +artifact = art.artifacts.deploy("<LOCAL_FILE_LOCATION>", "<ARTIFACT_PATH_IN_ARTIFACTORY>") +# artifact = art.artifacts.deploy("Desktop/myNewFile.txt", "my-repository/my/new/artifact/directory/file.txt") +``` + +#### Download an artifact +```python +artifact = art.artifacts.download("<ARTIFACT_PATH_IN_ARTIFACTORY>", "<LOCAL_DIRECTORY_PATH>") +# artifact = art.artifacts.download("my-artifactory-repository/my/new/artifact/file.txt", "Desktop/my/local/directory") +# The artifact location is returned by the download method +# If you have not set a <LOCAL_DIRECTORY_PATH>, the artifact will be downloaded in the current directory +``` + +#### Retrieve artifact list +```python +artifacts = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# files_only = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", list_folders=False) +# non_recursive = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", recursive=False) +# max_depth = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", depth=3) +``` + +#### Retrieve artifact properties +```python +artifact_properties = art.artifacts.properties("<ARTIFACT_PATH_IN_ARTIFACTORY>") # returns all properties +# artifact_properties = art.artifacts.properties("my-repository/my/new/artifact/directory/file.txt") +artifact_properties = art.artifacts.properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", ["prop1", "prop2"]) # returns specific properties +artifact_properties.properties["prop1"] # ["value1", "value1-bis"] +``` + +#### Set artifact properties +```python +artifact_properties = art.artifacts.set_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}) # recursive mode is enabled by default +artifact_properties = art.artifacts.set_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"]}, False) # disable recursive mode +``` + +#### Update artifact properties +```python +artifact_properties = art.artifacts.update_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}) # recursive mode is enabled by default +artifact_properties = art.artifacts.update_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}, False) # disable recursive mode +``` + +#### Retrieve artifact stats +```python +artifact_stats = art.artifacts.stats("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# artifact_stats = art.artifacts.stats("my-repository/my/new/artifact/directory/file.txt") +``` + +#### Copy artifact to a new location +```python +artifact = art.artifacts.copy("<CURRENT_ARTIFACT_PATH_IN_ARTIFACTORY>","<NEW_ARTIFACT_PATH_IN_ARTIFACTORY>") + +# If you want to run a dryRun test, you can do the following: +# artifact = art.artifacts.copy("my-repository/current/artifact/path/file.txt","my-repository/new/artifact/path/file.txt", dryrun=True) +# It will return properties of the newly copied artifact +``` + +#### Move artifact to a new location +```python +artifact = art.artifacts.move("<CURRENT_ARTIFACT_PATH_IN_ARTIFACTORY>","<NEW_ARTIFACT_PATH_IN_ARTIFACTORY>") + +# You can also run a dryRun test with the move operation +# It will return properties of the newly moved artifact +``` + +#### Delete an artifact +```python +art.artifacts.delete("<ARTIFACT_PATH_IN_ARTIFACTORY>") +``` + + +### Contributing +Please read the [Development - Contributing](./CONTRIBUTING.md) guidelines. + + +%package help +Summary: Development documents and examples for pyartifactory +Provides: python3-pyartifactory-doc +%description help +# PyArtifactory + +[](https://github.com/anancarv/python-artifactory/actions) +[](https://badge.fury.io/py/pyartifactory) +[](https://www.codacy.com/gh/anancarv/python-artifactory/dashboard?utm_source=github.com&utm_medium=referral&utm_content=anancarv/python-artifactory&utm_campaign=Badge_Grade) +[](https://www.codacy.com/gh/anancarv/python-artifactory/dashboard?utm_source=github.com&utm_medium=referral&utm_content=anancarv/python-artifactory&utm_campaign=Badge_Coverage) + + + +`pyartifactory` is a Python library to access the [Artifactory REST API](https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API). + +This library enables you to manage Artifactory resources such as users, groups, permissions, repositories, artifacts and access tokens in your applications. Based on Python 3.6+ type hints. + +<!-- toc --> + +- [Requirements](#requirements) +- [Install](#install) +- [Usage](#usage) + * [Authentication](#authentication) + * [SSL Cert Verification Options](#ssl-cert-verification-options) + * [Admin objects](#admin-objects) + + [User](#user) + + [Group](#group) + + [Security](#security) + + [Repository](#repository) + + [Permission](#permission) + - [Artifactory lower than 6.6.0](#artifactory-lower-than-660) + - [Artifactory 6.6.0 or higher](#artifactory-660-or-higher) + * [Artifacts](#artifacts) + + [Get the information about a file or folder](#get-the-information-about-a-file-or-folder) + + [Deploy an artifact](#deploy-an-artifact) + + [Download an artifact](#download-an-artifact) + + [Retrieve artifact list](#retrieve-artifact-list) + + [Retrieve artifact properties](#retrieve-artifact-properties) + + [Set artifact properties](#set-artifact-properties) + + [Update artifact properties](#update-artifact-properties) + + [Retrieve artifact stats](#retrieve-artifact-stats) + + [Copy artifact to a new location](#copy-artifact-to-a-new-location) + + [Move artifact to a new location](#move-artifact-to-a-new-location) + + [Delete an artifact](#delete-an-artifact) + * [Contributing](#contributing) + +<!-- tocstop --> + +## Requirements + +* Python 3.6+ + + +## Install + +```python +pip install pyartifactory +``` + +## Usage + +### Authentication + +Since Artifactory 6.6.0 there is version 2 of the REST API for permission management, in case you have that version or higher, you need to pass api_version=2 to the constructor when you instantiate the class. + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_OR_API_KEY'), api_version=1) +``` + +### SSL Cert Verification Options +Specify a local cert to use as client side certificate + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY'), cert="/path_to_file/server.pem",api_version=1) +``` + +Disable host cert verification + +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY'), verify=False, api_version=1) +``` + +### Admin objects + +#### User + +First, you need to create a new Artifactory object. +```python +from pyartifactory import Artifactory +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSORD_OR_API_KEY')) +``` + +Get the list of users: +```python +users = art.users.list() +``` + +Get a single user: +```python +user = art.users.get("test_user") +``` + +Create a user: +```python +from pyartifactory.models import NewUser + +# Create User +user = NewUser(name="test_user", password="test_password", email="user@user.com") +new_user = art.users.create(user) + +# Update user +user.email = "test@test.com" +updated_user = art.users.update(user) +``` + +Update a user: +```python +from pyartifactory.models import User + +user = art.users.get("test_user") + +# Update user +user.email = "test@test.com" +updated_user = art.users.update(user) +``` + +Delete a user: +```python +art.users.delete("test_user") +``` + +Unlock a user: +```python +art.users.unlock("test_user") +``` + +#### Group + +Get the list of groups: +```python +groups = art.groups.list() +``` + +Get a single group: +```python +group = art.groups.get("group_name") +``` + +Create/Update a group: +```python +from pyartifactory.models import Group + +# Create a Group +group = Group(name="test_group", description="test_group") +new_group = art.groups.create(group) + +# Update a Group +group.description = "test_group_2" +updated_group = art.groups.update(group) +``` + +Delete a group: +```python +art.groups.delete("test_group") +``` + +#### Security + +A set of methods for performing operations on apiKeys, passwords ... +```python +>>> art.security. +art.security.create_api_key( art.security.get_encrypted_password( art.security.revoke_api_key( +art.security.get_api_key( art.security.regenerate_api_key( art.security.revoke_user_api_key( +``` + +Create an access token (for a transient user): +```python +token = art.security.create_access_token(user_name='transient_artifactory_user', + groups=['g1', 'g2'], + refreshable=True) +``` + +Create an access token for an existing user (groups are implied from the existing user): +```python +token = art.security.create_access_token(user_name='existing_artifactory_user', + refreshable=True) +``` + +Revoke an existing revocable token: +```python +art.security.revoke_access_token(token.access_token) +``` + +#### Repository + +Get the list of repositories: +```python +repositories = art.repositories.list() +``` + +Get a single repository +```python +repo = art.repositories.get_repo("repo_name") +# According to the repo type, you'll have either a local, virtual or remote repository returned +``` + +Create/Update a repository: +```python +from pyartifactory.models import LocalRepository, VirtualRepository, RemoteRepository + +# Create local repo +local_repo = LocalRepository(key="test_local_repo") +new_local_repo = art.repositories.create_repo(local_repo) + +# Create virtual repo +virtual_repo = VirtualRepository(key="test_virtual_repo") +new_virtual_repo = art.repositories.create_repo(virtual_repo) + +# Create remote repo +remote_repo = RemoteRepository(key="test_remote_repo") +new_remote_repo = art.repositories.create_repo(remote_repo) + +# Update a repository +local_repo = art.repositories.get_repo("test_local_repo") +local_repo.description = "test_local_repo" +updated_local_repo = art.repositories.update_repo(local_repo) +``` + +Delete a repository: +```python +art.repositories.delete("test_local_repo") +``` + +#### Permission +Get the list of permissions: +```python +permissions = art.permissions.list() +``` + +Get a single permission: +```python +users = art.permissions.get("test_permission") +``` + +Create/Update a permission: + +##### Artifactory lower than 6.6.0 + +```python + +from pyartifactory.models import Permission + +# Create a permission +permission = Permission( + **{ + "name": "test_permission", + "repositories": ["test_repository"], + "principals": { + "users": {"test_user": ["r", "w", "n", "d"]}, + "groups": {"developers": ["r"]}, + }, + } +) +perm = art.permissions.create(permission) + +# Update permission +permission.repositories = ["test_repository_2"] +updated_permission = art.permissions.update(permission) +``` + +##### Artifactory 6.6.0 or higher +```python +from pyartifactory import Artifactory +from pyartifactory.models import PermissionV2 +from pyartifactory.models.permission import PermissionEnumV2, PrincipalsPermissionV2, RepoV2, BuildV2, ReleaseBundleV2 + +# To use PermissionV2, make sure to set api_version=2 +art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_OR_API_KEY'), api_version=2) + +# Create a permission +permission = PermissionV2( + name="test_permission", + repo=RepoV2( + repositories=["test_repository"], + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + PermissionEnumV2.annotate, + PermissionEnumV2.write, + PermissionEnumV2.delete, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + PermissionEnumV2.annotate, + PermissionEnumV2.write, + PermissionEnumV2.delete, + ], + }, + ), + includePatterns=["**"], + excludePatterns=[], + ), + build=BuildV2( + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + PermissionEnumV2.write, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + PermissionEnumV2.write, + ], + }, + ), + includePatterns=[""], + excludePatterns=[""], + ), + releaseBundle=ReleaseBundleV2( + repositories=["release-bundles"], + actions=PrincipalsPermissionV2( + users={ + "test_user": [ + PermissionEnumV2.read, + ] + }, + groups={ + "developers": [ + PermissionEnumV2.read, + ], + }, + ), + includePatterns=[""], + excludePatterns=[""], + ) + # You don't have to set all the objects repo, build and releaseBundle + # If you only need repo for example, you can set only the repo object +) +perm = art.permissions.create(permission) + +# Update permission +permission.repo.repositories = ["test_repository_2"] +updated_permission = art.permissions.update(permission) +``` + +Delete a permission: +```python +art.permissions.delete("test_permission") +``` + +### Artifacts + +#### Get the information about a file or folder +```python +artifact_info = art.artifacts.info("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# file_info = art.artifacts.info("my-repository/my/artifact/directory/file.txt") +# folder_info = art.artifacts.info("my-repository/my/artifact/directory") +``` + +#### Deploy an artifact +```python +artifact = art.artifacts.deploy("<LOCAL_FILE_LOCATION>", "<ARTIFACT_PATH_IN_ARTIFACTORY>") +# artifact = art.artifacts.deploy("Desktop/myNewFile.txt", "my-repository/my/new/artifact/directory/file.txt") +``` + +#### Download an artifact +```python +artifact = art.artifacts.download("<ARTIFACT_PATH_IN_ARTIFACTORY>", "<LOCAL_DIRECTORY_PATH>") +# artifact = art.artifacts.download("my-artifactory-repository/my/new/artifact/file.txt", "Desktop/my/local/directory") +# The artifact location is returned by the download method +# If you have not set a <LOCAL_DIRECTORY_PATH>, the artifact will be downloaded in the current directory +``` + +#### Retrieve artifact list +```python +artifacts = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# files_only = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", list_folders=False) +# non_recursive = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", recursive=False) +# max_depth = art.artifacts.list("<ARTIFACT_PATH_IN_ARTIFACTORY>", depth=3) +``` + +#### Retrieve artifact properties +```python +artifact_properties = art.artifacts.properties("<ARTIFACT_PATH_IN_ARTIFACTORY>") # returns all properties +# artifact_properties = art.artifacts.properties("my-repository/my/new/artifact/directory/file.txt") +artifact_properties = art.artifacts.properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", ["prop1", "prop2"]) # returns specific properties +artifact_properties.properties["prop1"] # ["value1", "value1-bis"] +``` + +#### Set artifact properties +```python +artifact_properties = art.artifacts.set_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}) # recursive mode is enabled by default +artifact_properties = art.artifacts.set_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"]}, False) # disable recursive mode +``` + +#### Update artifact properties +```python +artifact_properties = art.artifacts.update_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}) # recursive mode is enabled by default +artifact_properties = art.artifacts.update_properties("<ARTIFACT_PATH_IN_ARTIFACTORY>", {"prop1": ["value"], "prop2": ["value1", "value2", "etc"}, False) # disable recursive mode +``` + +#### Retrieve artifact stats +```python +artifact_stats = art.artifacts.stats("<ARTIFACT_PATH_IN_ARTIFACTORY>") +# artifact_stats = art.artifacts.stats("my-repository/my/new/artifact/directory/file.txt") +``` + +#### Copy artifact to a new location +```python +artifact = art.artifacts.copy("<CURRENT_ARTIFACT_PATH_IN_ARTIFACTORY>","<NEW_ARTIFACT_PATH_IN_ARTIFACTORY>") + +# If you want to run a dryRun test, you can do the following: +# artifact = art.artifacts.copy("my-repository/current/artifact/path/file.txt","my-repository/new/artifact/path/file.txt", dryrun=True) +# It will return properties of the newly copied artifact +``` + +#### Move artifact to a new location +```python +artifact = art.artifacts.move("<CURRENT_ARTIFACT_PATH_IN_ARTIFACTORY>","<NEW_ARTIFACT_PATH_IN_ARTIFACTORY>") + +# You can also run a dryRun test with the move operation +# It will return properties of the newly moved artifact +``` + +#### Delete an artifact +```python +art.artifacts.delete("<ARTIFACT_PATH_IN_ARTIFACTORY>") +``` + + +### Contributing +Please read the [Development - Contributing](./CONTRIBUTING.md) guidelines. + + +%prep +%autosetup -n pyartifactory-1.12.0 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-pyartifactory -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Tue Apr 11 2023 Python_Bot <Python_Bot@openeuler.org> - 1.12.0-1 +- Package Spec generated @@ -0,0 +1 @@ +5460c8a7aea6f832f6cc171de83921b2 pyartifactory-1.12.0.tar.gz |