PyArtifactory


NamePyArtifactory JSON
Version 2.2.0 PyPI version JSON
download
home_pagehttps://github.com/anancarv/python-artifactory
SummaryTyped interactions with the Jfrog Artifactory REST API
upload_time2024-04-30 16:18:09
maintainerNone
docs_urlNone
authorAnanias CARVALHO
requires_python<4.0,>=3.8
licenseMIT
keywords artifactory
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # PyArtifactory

[![GitHub Actions workflow](https://github.com/anancarv/python-artifactory/workflows/Check%20code/badge.svg)](https://github.com/anancarv/python-artifactory/actions)
[![PyPI version](https://badge.fury.io/py/pyartifactory.svg)](https://badge.fury.io/py/pyartifactory)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/c02851e5b9f24fe299783b48eab18f54)](https://www.codacy.com/gh/anancarv/python-artifactory/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=anancarv/python-artifactory&amp;utm_campaign=Badge_Grade)
[![Codacy Badge](https://app.codacy.com/project/badge/Coverage/c02851e5b9f24fe299783b48eab18f54)](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)
![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)


`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.8+ 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.8+

## 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','PASSWORD_OR_API_KEY'), cert="/path_to_file/server.pem", api_version=1)
```

Specify a local cert to use as custom CA certificate

```python
from pyartifactory import Artifactory
art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_OR_API_KEY'), verify="/path_to_file/ca.pem", cert="/path_to_file/server.pem", api_version=1)
```

> `verify` and `cert` configure certificates for distinct purposes. `verify` determines SSL/TLS certificate validation for the server, while `cert` supplies a client certificate for mutual authentication, as required by the server. You can use either one or both parameters as needed.

Disable host cert verification

```python
from pyartifactory import Artifactory
art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_OR_API_KEY'), verify=False, api_version=1)
```

> `verify` can be also set as a boolean to enable/disable SSL host verification.

### Admin objects

#### User

First, you need to create a new Artifactory object.
```python
from pyartifactory import Artifactory
art = Artifactory(url="ARTIFACTORY_URL", auth=('USERNAME','PASSWORD_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,
    FederatedRepository
)

# 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)

# Create federated repo
remote_repo = FederatedRepository(key="test_remote_repo")
new_federated_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.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/anancarv/python-artifactory",
    "name": "PyArtifactory",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.8",
    "maintainer_email": null,
    "keywords": "artifactory",
    "author": "Ananias CARVALHO",
    "author_email": "carvalhoananias@hotmail.com",
    "download_url": "https://files.pythonhosted.org/packages/91/b4/4858f69fe87fd4232bc4fb5d5152373661b29362dcd3edbe35dac4948087/pyartifactory-2.2.0.tar.gz",
    "platform": null,
    "description": "# PyArtifactory\n\n[![GitHub Actions workflow](https://github.com/anancarv/python-artifactory/workflows/Check%20code/badge.svg)](https://github.com/anancarv/python-artifactory/actions)\n[![PyPI version](https://badge.fury.io/py/pyartifactory.svg)](https://badge.fury.io/py/pyartifactory)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/c02851e5b9f24fe299783b48eab18f54)](https://www.codacy.com/gh/anancarv/python-artifactory/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=anancarv/python-artifactory&amp;utm_campaign=Badge_Grade)\n[![Codacy Badge](https://app.codacy.com/project/badge/Coverage/c02851e5b9f24fe299783b48eab18f54)](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)\n![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)\n\n\n`pyartifactory` is a Python library to access the [Artifactory REST API](https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API).\n\nThis library enables you to manage Artifactory resources such as users, groups, permissions, repositories, artifacts and access tokens in your applications. Based on Python 3.8+ type hints.\n\n<!-- toc -->\n\n- [Requirements](#requirements)\n- [Install](#install)\n- [Usage](#usage)\n  * [Authentication](#authentication)\n  * [SSL Cert Verification Options](#ssl-cert-verification-options)\n  * [Admin objects](#admin-objects)\n    + [User](#user)\n    + [Group](#group)\n    + [Security](#security)\n    + [Repository](#repository)\n    + [Permission](#permission)\n      - [Artifactory lower than 6.6.0](#artifactory-lower-than-660)\n      - [Artifactory 6.6.0 or higher](#artifactory-660-or-higher)\n  * [Artifacts](#artifacts)\n    + [Get the information about a file or folder](#get-the-information-about-a-file-or-folder)\n    + [Deploy an artifact](#deploy-an-artifact)\n    + [Download an artifact](#download-an-artifact)\n    + [Retrieve artifact list](#retrieve-artifact-list)\n    + [Retrieve artifact properties](#retrieve-artifact-properties)\n    + [Set artifact properties](#set-artifact-properties)\n    + [Update artifact properties](#update-artifact-properties)\n    + [Retrieve artifact stats](#retrieve-artifact-stats)\n    + [Copy artifact to a new location](#copy-artifact-to-a-new-location)\n    + [Move artifact to a new location](#move-artifact-to-a-new-location)\n    + [Delete an artifact](#delete-an-artifact)\n  * [Contributing](#contributing)\n\n<!-- tocstop -->\n\n## Requirements\n\n- Python 3.8+\n\n## Install\n\n```python\npip install pyartifactory\n```\n\n## Usage\n\n### Authentication\n\nSince 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.\n\n```python\nfrom pyartifactory import Artifactory\nart = Artifactory(url=\"ARTIFACTORY_URL\", auth=('USERNAME','PASSWORD_OR_API_KEY'), api_version=1)\n```\n\n### SSL Cert Verification Options\n\nSpecify a local cert to use as client side certificate\n\n```python\nfrom pyartifactory import Artifactory\nart = Artifactory(url=\"ARTIFACTORY_URL\", auth=('USERNAME','PASSWORD_OR_API_KEY'), cert=\"/path_to_file/server.pem\", api_version=1)\n```\n\nSpecify a local cert to use as custom CA certificate\n\n```python\nfrom pyartifactory import Artifactory\nart = Artifactory(url=\"ARTIFACTORY_URL\", auth=('USERNAME','PASSWORD_OR_API_KEY'), verify=\"/path_to_file/ca.pem\", cert=\"/path_to_file/server.pem\", api_version=1)\n```\n\n> `verify` and `cert` configure certificates for distinct purposes. `verify` determines SSL/TLS certificate validation for the server, while `cert` supplies a client certificate for mutual authentication, as required by the server. You can use either one or both parameters as needed.\n\nDisable host cert verification\n\n```python\nfrom pyartifactory import Artifactory\nart = Artifactory(url=\"ARTIFACTORY_URL\", auth=('USERNAME','PASSWORD_OR_API_KEY'), verify=False, api_version=1)\n```\n\n> `verify` can be also set as a boolean to enable/disable SSL host verification.\n\n### Admin objects\n\n#### User\n\nFirst, you need to create a new Artifactory object.\n```python\nfrom pyartifactory import Artifactory\nart = Artifactory(url=\"ARTIFACTORY_URL\", auth=('USERNAME','PASSWORD_OR_API_KEY'))\n```\n\nGet the list of users:\n```python\nusers = art.users.list()\n```\n\nGet a single user:\n```python\nuser = art.users.get(\"test_user\")\n```\n\nCreate a user:\n```python\nfrom pyartifactory.models import NewUser\n\n# Create User\nuser = NewUser(name=\"test_user\", password=\"test_password\", email=\"user@user.com\")\nnew_user = art.users.create(user)\n\n# Update user\nuser.email = \"test@test.com\"\nupdated_user = art.users.update(user)\n```\n\nUpdate a user:\n```python\nfrom pyartifactory.models import User\n\nuser = art.users.get(\"test_user\")\n\n# Update user\nuser.email = \"test@test.com\"\nupdated_user = art.users.update(user)\n```\n\nDelete a user:\n```python\nart.users.delete(\"test_user\")\n```\n\nUnlock a user:\n```python\nart.users.unlock(\"test_user\")\n```\n\n#### Group\n\nGet the list of groups:\n```python\ngroups = art.groups.list()\n```\n\nGet a single group:\n```python\ngroup = art.groups.get(\"group_name\")\n```\n\nCreate/Update a group:\n```python\nfrom pyartifactory.models import Group\n\n# Create a Group\ngroup = Group(name=\"test_group\", description=\"test_group\")\nnew_group = art.groups.create(group)\n\n# Update a Group\ngroup.description = \"test_group_2\"\nupdated_group = art.groups.update(group)\n```\n\nDelete a group:\n```python\nart.groups.delete(\"test_group\")\n```\n\n#### Security\n\nA set of methods for performing operations on apiKeys, passwords ...\n```python\n>>> art.security.\nart.security.create_api_key(          art.security.get_encrypted_password(  art.security.revoke_api_key(\nart.security.get_api_key(             art.security.regenerate_api_key(      art.security.revoke_user_api_key(\n```\n\nCreate an access token (for a transient user):\n```python\ntoken = art.security.create_access_token(user_name='transient_artifactory_user',\n                                         groups=['g1', 'g2'],\n                                         refreshable=True)\n```\n\nCreate an access token for an existing user (groups are implied from the existing user):\n```python\ntoken = art.security.create_access_token(user_name='existing_artifactory_user',\n                                         refreshable=True)\n```\n\nRevoke an existing revocable token:\n```python\nart.security.revoke_access_token(token.access_token)\n```\n\n#### Repository\n\nGet the list of repositories:\n\n```python\nrepositories = art.repositories.list()\n```\n\nGet a single repository\n```python\nrepo = art.repositories.get_repo(\"repo_name\")\n# According to the repo type, you'll have either a local, virtual or remote repository returned\n```\n\nCreate/Update a repository:\n```python\nfrom pyartifactory.models import (\n    LocalRepository,\n    VirtualRepository,\n    RemoteRepository,\n    FederatedRepository\n)\n\n# Create local repo\nlocal_repo = LocalRepository(key=\"test_local_repo\")\nnew_local_repo = art.repositories.create_repo(local_repo)\n\n# Create virtual repo\nvirtual_repo = VirtualRepository(key=\"test_virtual_repo\")\nnew_virtual_repo = art.repositories.create_repo(virtual_repo)\n\n# Create remote repo\nremote_repo = RemoteRepository(key=\"test_remote_repo\")\nnew_remote_repo = art.repositories.create_repo(remote_repo)\n\n# Create federated repo\nremote_repo = FederatedRepository(key=\"test_remote_repo\")\nnew_federated_repo = art.repositories.create_repo(remote_repo)\n\n# Update a repository\nlocal_repo = art.repositories.get_repo(\"test_local_repo\")\nlocal_repo.description = \"test_local_repo\"\nupdated_local_repo = art.repositories.update_repo(local_repo)\n```\n\nDelete a repository:\n```python\nart.repositories.delete(\"test_local_repo\")\n```\n\n#### Permission\nGet the list of permissions:\n\n```python\npermissions = art.permissions.list()\n```\n\nGet a single permission:\n```python\nusers = art.permissions.get(\"test_permission\")\n```\n\nCreate/Update a permission:\n\n##### Artifactory lower than 6.6.0\n\n```python\n\nfrom pyartifactory.models import Permission\n\n# Create a permission\npermission = Permission(\n    **{\n        \"name\": \"test_permission\",\n        \"repositories\": [\"test_repository\"],\n        \"principals\": {\n            \"users\": {\"test_user\": [\"r\", \"w\", \"n\", \"d\"]},\n            \"groups\": {\"developers\": [\"r\"]},\n        },\n    }\n)\nperm = art.permissions.create(permission)\n\n# Update permission\npermission.repositories = [\"test_repository_2\"]\nupdated_permission = art.permissions.update(permission)\n```\n\n##### Artifactory 6.6.0 or higher\n```python\nfrom pyartifactory import Artifactory\nfrom pyartifactory.models import PermissionV2\nfrom pyartifactory.models.permission import PermissionEnumV2, PrincipalsPermissionV2, RepoV2, BuildV2, ReleaseBundleV2\n\n# To use PermissionV2, make sure to set api_version=2\nart = Artifactory(url=\"ARTIFACTORY_URL\", auth=('USERNAME','PASSWORD_OR_API_KEY'), api_version=2)\n\n# Create a permission\npermission = PermissionV2(\n    name=\"test_permission\",\n    repo=RepoV2(\n        repositories=[\"test_repository\"],\n        actions=PrincipalsPermissionV2(\n            users={\n                \"test_user\": [\n                    PermissionEnumV2.read,\n                    PermissionEnumV2.annotate,\n                    PermissionEnumV2.write,\n                    PermissionEnumV2.delete,\n                ]\n            },\n            groups={\n                \"developers\": [\n                    PermissionEnumV2.read,\n                    PermissionEnumV2.annotate,\n                    PermissionEnumV2.write,\n                    PermissionEnumV2.delete,\n                ],\n            },\n        ),\n        includePatterns=[\"**\"],\n        excludePatterns=[],\n    ),\n    build=BuildV2(\n          actions=PrincipalsPermissionV2(\n              users={\n                  \"test_user\": [\n                      PermissionEnumV2.read,\n                      PermissionEnumV2.write,\n                  ]\n              },\n              groups={\n                  \"developers\": [\n                      PermissionEnumV2.read,\n                      PermissionEnumV2.write,\n                  ],\n              },\n          ),\n          includePatterns=[\"\"],\n          excludePatterns=[\"\"],\n      ),\n    releaseBundle=ReleaseBundleV2(\n          repositories=[\"release-bundles\"],\n          actions=PrincipalsPermissionV2(\n              users={\n                  \"test_user\": [\n                      PermissionEnumV2.read,\n                  ]\n              },\n              groups={\n                  \"developers\": [\n                      PermissionEnumV2.read,\n                  ],\n              },\n          ),\n          includePatterns=[\"\"],\n          excludePatterns=[\"\"],\n      )\n  # You don't have to set all the objects repo, build and releaseBundle\n  # If you only need repo for example, you can set only the repo object\n)\nperm = art.permissions.create(permission)\n\n# Update permission\npermission.repo.repositories = [\"test_repository_2\"]\nupdated_permission = art.permissions.update(permission)\n```\n\nDelete a permission:\n```python\nart.permissions.delete(\"test_permission\")\n```\n\n### Artifacts\n\n#### Get the information about a file or folder\n```python\nartifact_info = art.artifacts.info(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\")\n# file_info = art.artifacts.info(\"my-repository/my/artifact/directory/file.txt\")\n# folder_info = art.artifacts.info(\"my-repository/my/artifact/directory\")\n```\n\n#### Deploy an artifact\n```python\nartifact = art.artifacts.deploy(\"<LOCAL_FILE_LOCATION>\", \"<ARTIFACT_PATH_IN_ARTIFACTORY>\")\n# artifact = art.artifacts.deploy(\"Desktop/myNewFile.txt\", \"my-repository/my/new/artifact/directory/file.txt\")\n```\n\n#### Download an artifact\n```python\nartifact = art.artifacts.download(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", \"<LOCAL_DIRECTORY_PATH>\")\n# artifact = art.artifacts.download(\"my-artifactory-repository/my/new/artifact/file.txt\", \"Desktop/my/local/directory\")\n# The artifact location is returned by the download method\n# If you have not set a <LOCAL_DIRECTORY_PATH>, the artifact will be downloaded in the current directory\n```\n\n#### Retrieve artifact list\n```python\nartifacts = art.artifacts.list(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\")\n# files_only = art.artifacts.list(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", list_folders=False)\n# non_recursive = art.artifacts.list(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", recursive=False)\n# max_depth = art.artifacts.list(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", depth=3)\n```\n\n#### Retrieve artifact properties\n```python\nartifact_properties = art.artifacts.properties(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\")  # returns all properties\n# artifact_properties = art.artifacts.properties(\"my-repository/my/new/artifact/directory/file.txt\")\nartifact_properties = art.artifacts.properties(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", [\"prop1\", \"prop2\"])  # returns specific properties\nartifact_properties.properties[\"prop1\"]  # [\"value1\", \"value1-bis\"]\n```\n\n#### Set artifact properties\n```python\nartifact_properties = art.artifacts.set_properties(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", {\"prop1\": [\"value\"], \"prop2\": [\"value1\", \"value2\", \"etc\"})  # recursive mode is enabled by default\nartifact_properties = art.artifacts.set_properties(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", {\"prop1\": [\"value\"], \"prop2\": [\"value1\", \"value2\", \"etc\"]}, False) # disable recursive mode\n```\n\n#### Update artifact properties\n```python\nartifact_properties = art.artifacts.update_properties(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", {\"prop1\": [\"value\"], \"prop2\": [\"value1\", \"value2\", \"etc\"})  # recursive mode is enabled by default\nartifact_properties = art.artifacts.update_properties(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\", {\"prop1\": [\"value\"], \"prop2\": [\"value1\", \"value2\", \"etc\"}, False) # disable recursive mode\n```\n\n#### Retrieve artifact stats\n```python\nartifact_stats = art.artifacts.stats(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\")\n# artifact_stats = art.artifacts.stats(\"my-repository/my/new/artifact/directory/file.txt\")\n```\n\n#### Copy artifact to a new location\n```python\nartifact = art.artifacts.copy(\"<CURRENT_ARTIFACT_PATH_IN_ARTIFACTORY>\",\"<NEW_ARTIFACT_PATH_IN_ARTIFACTORY>\")\n\n# If you want to run a dryRun test, you can do the following:\n# artifact = art.artifacts.copy(\"my-repository/current/artifact/path/file.txt\",\"my-repository/new/artifact/path/file.txt\", dryrun=True)\n# It will return properties of the newly copied artifact\n```\n\n#### Move artifact to a new location\n```python\nartifact = art.artifacts.move(\"<CURRENT_ARTIFACT_PATH_IN_ARTIFACTORY>\",\"<NEW_ARTIFACT_PATH_IN_ARTIFACTORY>\")\n\n# You can also run a dryRun test with the move operation\n# It will return properties of the newly moved artifact\n```\n\n#### Delete an artifact\n```python\nart.artifacts.delete(\"<ARTIFACT_PATH_IN_ARTIFACTORY>\")\n```\n\n\n### Contributing\nPlease read the [Development - Contributing](./CONTRIBUTING.md) guidelines.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Typed interactions with the Jfrog Artifactory REST API",
    "version": "2.2.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/anancarv/python-artifactory/issues",
        "Documentation": "https://github.com/anancarv/python-artifactory",
        "Homepage": "https://github.com/anancarv/python-artifactory",
        "Repository": "https://github.com/anancarv/python-artifactory"
    },
    "split_keywords": [
        "artifactory"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "74924c8653953bcf33b3c0b53f95ccb4afe59ebfa2a72ce33737933fc887c2ce",
                "md5": "58b96e33364b93bef25866463a3719c4",
                "sha256": "cf5180d3838aea9e9c854297c134cd0c58e0d2cda38ba67810e83d3a99696bb2"
            },
            "downloads": -1,
            "filename": "pyartifactory-2.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "58b96e33364b93bef25866463a3719c4",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.8",
            "size": 25423,
            "upload_time": "2024-04-30T16:18:07",
            "upload_time_iso_8601": "2024-04-30T16:18:07.901555Z",
            "url": "https://files.pythonhosted.org/packages/74/92/4c8653953bcf33b3c0b53f95ccb4afe59ebfa2a72ce33737933fc887c2ce/pyartifactory-2.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "91b44858f69fe87fd4232bc4fb5d5152373661b29362dcd3edbe35dac4948087",
                "md5": "23309881fbc8e04826d83e76ce67cb8a",
                "sha256": "a60fcf83769de73b031cdda4a42d160669b00c9f342bf44e419de0d6c429f454"
            },
            "downloads": -1,
            "filename": "pyartifactory-2.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "23309881fbc8e04826d83e76ce67cb8a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.8",
            "size": 22537,
            "upload_time": "2024-04-30T16:18:09",
            "upload_time_iso_8601": "2024-04-30T16:18:09.963162Z",
            "url": "https://files.pythonhosted.org/packages/91/b4/4858f69fe87fd4232bc4fb5d5152373661b29362dcd3edbe35dac4948087/pyartifactory-2.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-30 16:18:09",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "anancarv",
    "github_project": "python-artifactory",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pyartifactory"
}
        
Elapsed time: 0.53667s