We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[RFC] Resolve depreciation warning for depreciated property kv
**Is your feature request related to a problem? Please describe.**
Yes, Currently we are hitting the depreciation warning in hvac 0.11 since the kv property is depreciated and adviced to use from `Client.secrets`

Clear Warning:
DeprecationWarning: Call to deprecated property 'kv'. This property will be removed in version '0.9.0' Please use the 'kv' property on the 'Client.secrets' attribute moving forward

**Describe the solution you'd like**
Remove the usage of kv property directly in dynaconf and use if from `Client.secrets`

**Describe alternatives you've considered**
The alternative is not required.


[RFC] Resolve depreciation warning for depreciated property kv
**Is your feature request related to a problem? Please describe.**
Yes, Currently we are hitting the depreciation warning in hvac 0.11 since the kv property is depreciated and adviced to use from `Client.secrets`

Clear Warning:
DeprecationWarning: Call to deprecated property 'kv'. This property will be removed in version '0.9.0' Please use the 'kv' property on the 'Client.secrets' attribute moving forward

**Describe the solution you'd like**
Remove the usage of kv property directly in dynaconf and use if from `Client.secrets`

**Describe alternatives you've considered**
The alternative is not required.



--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `dynaconf/loaders/vault_loader.py`
Content:
```
1 # docker run -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -p 8200:8200 vault
2 # pip install hvac
3 from __future__ import annotations
4 
5 from dynaconf.utils import build_env_list
6 from dynaconf.utils.parse_conf import parse_conf_data
7 
8 try:
9     import boto3
10 except ImportError:
11     boto3 = None
12 
13 try:
14     from hvac import Client
15     from hvac.exceptions import InvalidPath
16 except ImportError:
17     raise ImportError(
18         "vault package is not installed in your environment. "
19         "`pip install dynaconf[vault]` or disable the vault loader with "
20         "export VAULT_ENABLED_FOR_DYNACONF=false"
21     )
22 
23 
24 IDENTIFIER = "vault"
25 
26 
27 # backwards compatibility
28 _get_env_list = build_env_list
29 
30 
31 def get_client(obj):
32     client = Client(
33         **{k: v for k, v in obj.VAULT_FOR_DYNACONF.items() if v is not None}
34     )
35     if obj.VAULT_ROLE_ID_FOR_DYNACONF is not None:
36         client.auth_approle(
37             role_id=obj.VAULT_ROLE_ID_FOR_DYNACONF,
38             secret_id=obj.get("VAULT_SECRET_ID_FOR_DYNACONF"),
39         )
40     elif obj.VAULT_ROOT_TOKEN_FOR_DYNACONF is not None:
41         client.token = obj.VAULT_ROOT_TOKEN_FOR_DYNACONF
42     elif obj.VAULT_AUTH_WITH_IAM_FOR_DYNACONF:
43         if boto3 is None:
44             raise ImportError(
45                 "boto3 package is not installed in your environment. "
46                 "`pip install boto3` or disable the VAULT_AUTH_WITH_IAM"
47             )
48 
49         session = boto3.Session()
50         credentials = session.get_credentials()
51         client.auth.aws.iam_login(
52             credentials.access_key,
53             credentials.secret_key,
54             credentials.token,
55             role=obj.VAULT_AUTH_ROLE_FOR_DYNACONF,
56         )
57     assert client.is_authenticated(), (
58         "Vault authentication error: is VAULT_TOKEN_FOR_DYNACONF or "
59         "VAULT_ROLE_ID_FOR_DYNACONF defined?"
60     )
61     client.kv.default_kv_version = obj.VAULT_KV_VERSION_FOR_DYNACONF
62     return client
63 
64 
65 def load(obj, env=None, silent=None, key=None):
66     """Reads and loads in to "settings" a single key or all keys from vault
67 
68     :param obj: the settings instance
69     :param env: settings env default='DYNACONF'
70     :param silent: if errors should raise
71     :param key: if defined load a single key, else load all in env
72     :return: None
73     """
74     client = get_client(obj)
75     try:
76         if obj.VAULT_KV_VERSION_FOR_DYNACONF == 2:
77             dirs = client.secrets.kv.v2.list_secrets(
78                 path=obj.VAULT_PATH_FOR_DYNACONF,
79                 mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,
80             )["data"]["keys"]
81         else:
82             dirs = client.secrets.kv.v1.list_secrets(
83                 path=obj.VAULT_PATH_FOR_DYNACONF,
84                 mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,
85             )["data"]["keys"]
86     except InvalidPath:
87         # The given path is not a directory
88         dirs = []
89     # First look for secrets into environments less store
90     if not obj.ENVIRONMENTS_FOR_DYNACONF:
91         # By adding '', dynaconf will now read secrets from environments-less
92         # store which are not written by `dynaconf write` to Vault store
93         env_list = [obj.MAIN_ENV_FOR_DYNACONF.lower(), ""]
94     # Finally, look for secret into all the environments
95     else:
96         env_list = dirs + build_env_list(obj, env)
97     for env in env_list:
98         path = "/".join([obj.VAULT_PATH_FOR_DYNACONF, env])
99         try:
100             if obj.VAULT_KV_VERSION_FOR_DYNACONF == 2:
101                 data = client.secrets.kv.v2.read_secret_version(
102                     path, mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF
103                 )
104             else:
105                 data = client.secrets.kv.read_secret(
106                     "data/" + path,
107                     mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,
108                 )
109         except InvalidPath:
110             # If the path doesn't exist, ignore it and set data to None
111             data = None
112         if data:
113             # There seems to be a data dict within a data dict,
114             # extract the inner data
115             data = data.get("data", {}).get("data", {})
116         try:
117             if (
118                 obj.VAULT_KV_VERSION_FOR_DYNACONF == 2
119                 and obj.ENVIRONMENTS_FOR_DYNACONF
120                 and data
121             ):
122                 data = data.get("data", {})
123             if data and key:
124                 value = parse_conf_data(
125                     data.get(key), tomlfy=True, box_settings=obj
126                 )
127                 if value:
128                     obj.set(key, value)
129             elif data:
130                 obj.update(data, loader_identifier=IDENTIFIER, tomlfy=True)
131         except Exception:
132             if silent:
133                 return False
134             raise
135 
136 
137 def write(obj, data=None, **kwargs):
138     """Write a value in to loader source
139 
140     :param obj: settings object
141     :param data: vars to be stored
142     :param kwargs: vars to be stored
143     :return:
144     """
145     if obj.VAULT_ENABLED_FOR_DYNACONF is False:
146         raise RuntimeError(
147             "Vault is not configured \n"
148             "export VAULT_ENABLED_FOR_DYNACONF=true\n"
149             "and configure the VAULT_FOR_DYNACONF_* variables"
150         )
151     data = data or {}
152     data.update(kwargs)
153     if not data:
154         raise AttributeError("Data must be provided")
155     data = {"data": data}
156     client = get_client(obj)
157     if obj.VAULT_KV_VERSION_FOR_DYNACONF == 1:
158         mount_point = obj.VAULT_MOUNT_POINT_FOR_DYNACONF + "/data"
159     else:
160         mount_point = obj.VAULT_MOUNT_POINT_FOR_DYNACONF
161     path = "/".join([obj.VAULT_PATH_FOR_DYNACONF, obj.current_env.lower()])
162     client.secrets.kv.create_or_update_secret(
163         path, secret=data, mount_point=mount_point
164     )
165     load(obj)
166 
167 
168 def list_envs(obj, path=""):
169     """
170     This function is a helper to get a list of all the existing envs in
171     the source of data, the use case is:
172         existing_envs = vault_loader.list_envs(settings)
173         for env in exiting_envs:
174             with settings.using_env(env):  # switch to the env
175             # do something with a key of that env
176 
177     :param obj: settings object
178     :param path: path to the vault secrets
179     :return: list containing all the keys at the given path
180     """
181     client = get_client(obj)
182     path = path or obj.get("VAULT_PATH_FOR_DYNACONF")
183     try:
184         return client.list(f"/secret/metadata/{path}")["data"]["keys"]
185     except TypeError:
186         return []
187
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/dynaconf/loaders/vault_loader.py b/dynaconf/loaders/vault_loader.py
--- a/dynaconf/loaders/vault_loader.py
+++ b/dynaconf/loaders/vault_loader.py
@@ -58,7 +58,7 @@
         "Vault authentication error: is VAULT_TOKEN_FOR_DYNACONF or "
         "VAULT_ROLE_ID_FOR_DYNACONF defined?"
     )
-    client.kv.default_kv_version = obj.VAULT_KV_VERSION_FOR_DYNACONF
+    client.secrets.kv.default_kv_version = obj.VAULT_KV_VERSION_FOR_DYNACONF
     return client

{"golden_diff": "diff --git a/dynaconf/loaders/vault_loader.py b/dynaconf/loaders/vault_loader.py\n--- a/dynaconf/loaders/vault_loader.py\n+++ b/dynaconf/loaders/vault_loader.py\n@@ -58,7 +58,7 @@\n         \"Vault authentication error: is VAULT_TOKEN_FOR_DYNACONF or \"\n         \"VAULT_ROLE_ID_FOR_DYNACONF defined?\"\n     )\n-    client.kv.default_kv_version = obj.VAULT_KV_VERSION_FOR_DYNACONF\n+    client.secrets.kv.default_kv_version = obj.VAULT_KV_VERSION_FOR_DYNACONF\n     return client\n", "issue": "[RFC] Resolve depreciation warning for depreciated property kv\n**Is your feature request related to a problem? Please describe.**\r\nYes, Currently we are hitting the depreciation warning in hvac 0.11 since the kv property is depreciated and adviced to use from `Client.secrets`\r\n\r\nClear Warning:\r\nDeprecationWarning: Call to deprecated property 'kv'. This property will be removed in version '0.9.0' Please use the 'kv' property on the 'Client.secrets' attribute moving forward\r\n\r\n**Describe the solution you'd like**\r\nRemove the usage of kv property directly in dynaconf and use if from `Client.secrets`\r\n\r\n**Describe alternatives you've considered**\r\nThe alternative is not required.\r\n\r\n\n[RFC] Resolve depreciation warning for depreciated property kv\n**Is your feature request related to a problem? Please describe.**\r\nYes, Currently we are hitting the depreciation warning in hvac 0.11 since the kv property is depreciated and adviced to use from `Client.secrets`\r\n\r\nClear Warning:\r\nDeprecationWarning: Call to deprecated property 'kv'. This property will be removed in version '0.9.0' Please use the 'kv' property on the 'Client.secrets' attribute moving forward\r\n\r\n**Describe the solution you'd like**\r\nRemove the usage of kv property directly in dynaconf and use if from `Client.secrets`\r\n\r\n**Describe alternatives you've considered**\r\nThe alternative is not required.\r\n\r\n\n", "before_files": [{"content": "# docker run -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -p 8200:8200 vault\n# pip install hvac\nfrom __future__ import annotations\n\nfrom dynaconf.utils import build_env_list\nfrom dynaconf.utils.parse_conf import parse_conf_data\n\ntry:\n    import boto3\nexcept ImportError:\n    boto3 = None\n\ntry:\n    from hvac import Client\n    from hvac.exceptions import InvalidPath\nexcept ImportError:\n    raise ImportError(\n        \"vault package is not installed in your environment. \"\n        \"`pip install dynaconf[vault]` or disable the vault loader with \"\n        \"export VAULT_ENABLED_FOR_DYNACONF=false\"\n    )\n\n\nIDENTIFIER = \"vault\"\n\n\n# backwards compatibility\n_get_env_list = build_env_list\n\n\ndef get_client(obj):\n    client = Client(\n        **{k: v for k, v in obj.VAULT_FOR_DYNACONF.items() if v is not None}\n    )\n    if obj.VAULT_ROLE_ID_FOR_DYNACONF is not None:\n        client.auth_approle(\n            role_id=obj.VAULT_ROLE_ID_FOR_DYNACONF,\n            secret_id=obj.get(\"VAULT_SECRET_ID_FOR_DYNACONF\"),\n        )\n    elif obj.VAULT_ROOT_TOKEN_FOR_DYNACONF is not None:\n        client.token = obj.VAULT_ROOT_TOKEN_FOR_DYNACONF\n    elif obj.VAULT_AUTH_WITH_IAM_FOR_DYNACONF:\n        if boto3 is None:\n            raise ImportError(\n                \"boto3 package is not installed in your environment. \"\n                \"`pip install boto3` or disable the VAULT_AUTH_WITH_IAM\"\n            )\n\n        session = boto3.Session()\n        credentials = session.get_credentials()\n        client.auth.aws.iam_login(\n            credentials.access_key,\n            credentials.secret_key,\n            credentials.token,\n            role=obj.VAULT_AUTH_ROLE_FOR_DYNACONF,\n        )\n    assert client.is_authenticated(), (\n        \"Vault authentication error: is VAULT_TOKEN_FOR_DYNACONF or \"\n        \"VAULT_ROLE_ID_FOR_DYNACONF defined?\"\n    )\n    client.kv.default_kv_version = obj.VAULT_KV_VERSION_FOR_DYNACONF\n    return client\n\n\ndef load(obj, env=None, silent=None, key=None):\n    \"\"\"Reads and loads in to \"settings\" a single key or all keys from vault\n\n    :param obj: the settings instance\n    :param env: settings env default='DYNACONF'\n    :param silent: if errors should raise\n    :param key: if defined load a single key, else load all in env\n    :return: None\n    \"\"\"\n    client = get_client(obj)\n    try:\n        if obj.VAULT_KV_VERSION_FOR_DYNACONF == 2:\n            dirs = client.secrets.kv.v2.list_secrets(\n                path=obj.VAULT_PATH_FOR_DYNACONF,\n                mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,\n            )[\"data\"][\"keys\"]\n        else:\n            dirs = client.secrets.kv.v1.list_secrets(\n                path=obj.VAULT_PATH_FOR_DYNACONF,\n                mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,\n            )[\"data\"][\"keys\"]\n    except InvalidPath:\n        # The given path is not a directory\n        dirs = []\n    # First look for secrets into environments less store\n    if not obj.ENVIRONMENTS_FOR_DYNACONF:\n        # By adding '', dynaconf will now read secrets from environments-less\n        # store which are not written by `dynaconf write` to Vault store\n        env_list = [obj.MAIN_ENV_FOR_DYNACONF.lower(), \"\"]\n    # Finally, look for secret into all the environments\n    else:\n        env_list = dirs + build_env_list(obj, env)\n    for env in env_list:\n        path = \"/\".join([obj.VAULT_PATH_FOR_DYNACONF, env])\n        try:\n            if obj.VAULT_KV_VERSION_FOR_DYNACONF == 2:\n                data = client.secrets.kv.v2.read_secret_version(\n                    path, mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF\n                )\n            else:\n                data = client.secrets.kv.read_secret(\n                    \"data/\" + path,\n                    mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,\n                )\n        except InvalidPath:\n            # If the path doesn't exist, ignore it and set data to None\n            data = None\n        if data:\n            # There seems to be a data dict within a data dict,\n            # extract the inner data\n            data = data.get(\"data\", {}).get(\"data\", {})\n        try:\n            if (\n                obj.VAULT_KV_VERSION_FOR_DYNACONF == 2\n                and obj.ENVIRONMENTS_FOR_DYNACONF\n                and data\n            ):\n                data = data.get(\"data\", {})\n            if data and key:\n                value = parse_conf_data(\n                    data.get(key), tomlfy=True, box_settings=obj\n                )\n                if value:\n                    obj.set(key, value)\n            elif data:\n                obj.update(data, loader_identifier=IDENTIFIER, tomlfy=True)\n        except Exception:\n            if silent:\n                return False\n            raise\n\n\ndef write(obj, data=None, **kwargs):\n    \"\"\"Write a value in to loader source\n\n    :param obj: settings object\n    :param data: vars to be stored\n    :param kwargs: vars to be stored\n    :return:\n    \"\"\"\n    if obj.VAULT_ENABLED_FOR_DYNACONF is False:\n        raise RuntimeError(\n            \"Vault is not configured \\n\"\n            \"export VAULT_ENABLED_FOR_DYNACONF=true\\n\"\n            \"and configure the VAULT_FOR_DYNACONF_* variables\"\n        )\n    data = data or {}\n    data.update(kwargs)\n    if not data:\n        raise AttributeError(\"Data must be provided\")\n    data = {\"data\": data}\n    client = get_client(obj)\n    if obj.VAULT_KV_VERSION_FOR_DYNACONF == 1:\n        mount_point = obj.VAULT_MOUNT_POINT_FOR_DYNACONF + \"/data\"\n    else:\n        mount_point = obj.VAULT_MOUNT_POINT_FOR_DYNACONF\n    path = \"/\".join([obj.VAULT_PATH_FOR_DYNACONF, obj.current_env.lower()])\n    client.secrets.kv.create_or_update_secret(\n        path, secret=data, mount_point=mount_point\n    )\n    load(obj)\n\n\ndef list_envs(obj, path=\"\"):\n    \"\"\"\n    This function is a helper to get a list of all the existing envs in\n    the source of data, the use case is:\n        existing_envs = vault_loader.list_envs(settings)\n        for env in exiting_envs:\n            with settings.using_env(env):  # switch to the env\n            # do something with a key of that env\n\n    :param obj: settings object\n    :param path: path to the vault secrets\n    :return: list containing all the keys at the given path\n    \"\"\"\n    client = get_client(obj)\n    path = path or obj.get(\"VAULT_PATH_FOR_DYNACONF\")\n    try:\n        return client.list(f\"/secret/metadata/{path}\")[\"data\"][\"keys\"]\n    except TypeError:\n        return []\n", "path": "dynaconf/loaders/vault_loader.py"}], "after_files": [{"content": "# docker run -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -p 8200:8200 vault\n# pip install hvac\nfrom __future__ import annotations\n\nfrom dynaconf.utils import build_env_list\nfrom dynaconf.utils.parse_conf import parse_conf_data\n\ntry:\n    import boto3\nexcept ImportError:\n    boto3 = None\n\ntry:\n    from hvac import Client\n    from hvac.exceptions import InvalidPath\nexcept ImportError:\n    raise ImportError(\n        \"vault package is not installed in your environment. \"\n        \"`pip install dynaconf[vault]` or disable the vault loader with \"\n        \"export VAULT_ENABLED_FOR_DYNACONF=false\"\n    )\n\n\nIDENTIFIER = \"vault\"\n\n\n# backwards compatibility\n_get_env_list = build_env_list\n\n\ndef get_client(obj):\n    client = Client(\n        **{k: v for k, v in obj.VAULT_FOR_DYNACONF.items() if v is not None}\n    )\n    if obj.VAULT_ROLE_ID_FOR_DYNACONF is not None:\n        client.auth_approle(\n            role_id=obj.VAULT_ROLE_ID_FOR_DYNACONF,\n            secret_id=obj.get(\"VAULT_SECRET_ID_FOR_DYNACONF\"),\n        )\n    elif obj.VAULT_ROOT_TOKEN_FOR_DYNACONF is not None:\n        client.token = obj.VAULT_ROOT_TOKEN_FOR_DYNACONF\n    elif obj.VAULT_AUTH_WITH_IAM_FOR_DYNACONF:\n        if boto3 is None:\n            raise ImportError(\n                \"boto3 package is not installed in your environment. \"\n                \"`pip install boto3` or disable the VAULT_AUTH_WITH_IAM\"\n            )\n\n        session = boto3.Session()\n        credentials = session.get_credentials()\n        client.auth.aws.iam_login(\n            credentials.access_key,\n            credentials.secret_key,\n            credentials.token,\n            role=obj.VAULT_AUTH_ROLE_FOR_DYNACONF,\n        )\n    assert client.is_authenticated(), (\n        \"Vault authentication error: is VAULT_TOKEN_FOR_DYNACONF or \"\n        \"VAULT_ROLE_ID_FOR_DYNACONF defined?\"\n    )\n    client.secrets.kv.default_kv_version = obj.VAULT_KV_VERSION_FOR_DYNACONF\n    return client\n\n\ndef load(obj, env=None, silent=None, key=None):\n    \"\"\"Reads and loads in to \"settings\" a single key or all keys from vault\n\n    :param obj: the settings instance\n    :param env: settings env default='DYNACONF'\n    :param silent: if errors should raise\n    :param key: if defined load a single key, else load all in env\n    :return: None\n    \"\"\"\n    client = get_client(obj)\n    try:\n        if obj.VAULT_KV_VERSION_FOR_DYNACONF == 2:\n            dirs = client.secrets.kv.v2.list_secrets(\n                path=obj.VAULT_PATH_FOR_DYNACONF,\n                mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,\n            )[\"data\"][\"keys\"]\n        else:\n            dirs = client.secrets.kv.v1.list_secrets(\n                path=obj.VAULT_PATH_FOR_DYNACONF,\n                mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,\n            )[\"data\"][\"keys\"]\n    except InvalidPath:\n        # The given path is not a directory\n        dirs = []\n    # First look for secrets into environments less store\n    if not obj.ENVIRONMENTS_FOR_DYNACONF:\n        # By adding '', dynaconf will now read secrets from environments-less\n        # store which are not written by `dynaconf write` to Vault store\n        env_list = [obj.MAIN_ENV_FOR_DYNACONF.lower(), \"\"]\n    # Finally, look for secret into all the environments\n    else:\n        env_list = dirs + build_env_list(obj, env)\n    for env in env_list:\n        path = \"/\".join([obj.VAULT_PATH_FOR_DYNACONF, env])\n        try:\n            if obj.VAULT_KV_VERSION_FOR_DYNACONF == 2:\n                data = client.secrets.kv.v2.read_secret_version(\n                    path, mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF\n                )\n            else:\n                data = client.secrets.kv.read_secret(\n                    \"data/\" + path,\n                    mount_point=obj.VAULT_MOUNT_POINT_FOR_DYNACONF,\n                )\n        except InvalidPath:\n            # If the path doesn't exist, ignore it and set data to None\n            data = None\n        if data:\n            # There seems to be a data dict within a data dict,\n            # extract the inner data\n            data = data.get(\"data\", {}).get(\"data\", {})\n        try:\n            if (\n                obj.VAULT_KV_VERSION_FOR_DYNACONF == 2\n                and obj.ENVIRONMENTS_FOR_DYNACONF\n                and data\n            ):\n                data = data.get(\"data\", {})\n            if data and key:\n                value = parse_conf_data(\n                    data.get(key), tomlfy=True, box_settings=obj\n                )\n                if value:\n                    obj.set(key, value)\n            elif data:\n                obj.update(data, loader_identifier=IDENTIFIER, tomlfy=True)\n        except Exception:\n            if silent:\n                return False\n            raise\n\n\ndef write(obj, data=None, **kwargs):\n    \"\"\"Write a value in to loader source\n\n    :param obj: settings object\n    :param data: vars to be stored\n    :param kwargs: vars to be stored\n    :return:\n    \"\"\"\n    if obj.VAULT_ENABLED_FOR_DYNACONF is False:\n        raise RuntimeError(\n            \"Vault is not configured \\n\"\n            \"export VAULT_ENABLED_FOR_DYNACONF=true\\n\"\n            \"and configure the VAULT_FOR_DYNACONF_* variables\"\n        )\n    data = data or {}\n    data.update(kwargs)\n    if not data:\n        raise AttributeError(\"Data must be provided\")\n    data = {\"data\": data}\n    client = get_client(obj)\n    if obj.VAULT_KV_VERSION_FOR_DYNACONF == 1:\n        mount_point = obj.VAULT_MOUNT_POINT_FOR_DYNACONF + \"/data\"\n    else:\n        mount_point = obj.VAULT_MOUNT_POINT_FOR_DYNACONF\n    path = \"/\".join([obj.VAULT_PATH_FOR_DYNACONF, obj.current_env.lower()])\n    client.secrets.kv.create_or_update_secret(\n        path, secret=data, mount_point=mount_point\n    )\n    load(obj)\n\n\ndef list_envs(obj, path=\"\"):\n    \"\"\"\n    This function is a helper to get a list of all the existing envs in\n    the source of data, the use case is:\n        existing_envs = vault_loader.list_envs(settings)\n        for env in exiting_envs:\n            with settings.using_env(env):  # switch to the env\n            # do something with a key of that env\n\n    :param obj: settings object\n    :param path: path to the vault secrets\n    :return: list containing all the keys at the given path\n    \"\"\"\n    client = get_client(obj)\n    path = path or obj.get(\"VAULT_PATH_FOR_DYNACONF\")\n    try:\n        return client.list(f\"/secret/metadata/{path}\")[\"data\"][\"keys\"]\n    except TypeError:\n        return []\n", "path": "dynaconf/loaders/vault_loader.py"}]}