cloudinary-cli 1.17.0__tar.gz → 1.18.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/PKG-INFO +29 -2
  2. cloudinary_cli-1.17.0/cloudinary_cli.egg-info/PKG-INFO → cloudinary_cli-1.18.0/README.md +27 -26
  3. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/__init__.py +2 -0
  4. cloudinary_cli-1.18.0/cloudinary_cli/core/collections.py +29 -0
  5. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/utils.py +2 -1
  6. cloudinary_cli-1.18.0/cloudinary_cli/version.py +1 -0
  7. cloudinary_cli-1.17.0/README.md → cloudinary_cli-1.18.0/cloudinary_cli.egg-info/PKG-INFO +53 -0
  8. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli.egg-info/SOURCES.txt +1 -0
  9. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli.egg-info/requires.txt +1 -1
  10. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/requirements.txt +1 -1
  11. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli.py +1 -0
  12. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_api.py +17 -0
  13. cloudinary_cli-1.17.0/cloudinary_cli/version.py +0 -1
  14. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/LICENSE +0 -0
  15. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/MANIFEST.in +0 -0
  16. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/__init__.py +0 -0
  17. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/auth/__init__.py +0 -0
  18. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/auth/callback_page.py +0 -0
  19. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/auth/flow.py +0 -0
  20. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/auth/loopback_server.py +0 -0
  21. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/auth/oauth_config.py +0 -0
  22. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/auth/refresh.py +0 -0
  23. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/auth/session.py +0 -0
  24. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/cli.py +0 -0
  25. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/cli_group.py +0 -0
  26. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/admin.py +0 -0
  27. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/agent.py +0 -0
  28. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/auth.py +0 -0
  29. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/config.py +0 -0
  30. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/overrides.py +0 -0
  31. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/provisioning.py +0 -0
  32. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/search.py +0 -0
  33. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/uploader.py +0 -0
  34. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/core/utils.py +0 -0
  35. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/defaults.py +0 -0
  36. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/modules/__init__.py +0 -0
  37. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/modules/clone.py +0 -0
  38. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/modules/make.py +0 -0
  39. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/modules/migrate.py +0 -0
  40. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/modules/regen_derived.py +0 -0
  41. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/modules/sync.py +0 -0
  42. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/modules/upload_dir.py +0 -0
  43. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/samples/__init__.py +0 -0
  44. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/html/media_library_widget +0 -0
  45. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/html/product_gallery +0 -0
  46. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/html/upload_widget +0 -0
  47. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/html/video_player +0 -0
  48. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/node/upload +0 -0
  49. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/python/base +0 -0
  50. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/python/explicit +0 -0
  51. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/python/find_all_empty_folders +0 -0
  52. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/python/upload +0 -0
  53. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/templates/ruby/upload +0 -0
  54. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/__init__.py +0 -0
  55. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/api_utils.py +0 -0
  56. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/config_listing.py +0 -0
  57. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/config_resolver.py +0 -0
  58. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/config_utils.py +0 -0
  59. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/env_config.py +0 -0
  60. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/file_utils.py +0 -0
  61. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/json_utils.py +0 -0
  62. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/search_utils.py +0 -0
  63. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli/utils/url_utils.py +0 -0
  64. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli.egg-info/dependency_links.txt +0 -0
  65. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli.egg-info/entry_points.txt +0 -0
  66. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli.egg-info/not-zip-safe +0 -0
  67. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/cloudinary_cli.egg-info/top_level.txt +0 -0
  68. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/setup.cfg +0 -0
  69. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/setup.py +0 -0
  70. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/__init__.py +0 -0
  71. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/conftest.py +0 -0
  72. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/helper_test.py +0 -0
  73. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/oauth_helpers.py +0 -0
  74. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_auth_flow.py +0 -0
  75. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_auth_loopback.py +0 -0
  76. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_auth_region.py +0 -0
  77. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_auth_session.py +0 -0
  78. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_agent.py +0 -0
  79. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_agent_cloud.py +0 -0
  80. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_config.py +0 -0
  81. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_config_oauth.py +0 -0
  82. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_samples.py +0 -0
  83. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_search_api.py +0 -0
  84. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_url.py +0 -0
  85. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_cli_utils.py +0 -0
  86. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_config_cache.py +0 -0
  87. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_config_concurrency.py +0 -0
  88. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_config_permissions.py +0 -0
  89. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_default_config.py +0 -0
  90. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_file_utils.py +0 -0
  91. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_json_utils.py +0 -0
  92. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_modules/__init__.py +0 -0
  93. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_modules/test_cli_clone.py +0 -0
  94. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_modules/test_cli_make.py +0 -0
  95. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_modules/test_cli_regen_derived.py +0 -0
  96. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_modules/test_cli_sync.py +0 -0
  97. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_modules/test_cli_upload_dir.py +0 -0
  98. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_oauth_multiprocess.py +0 -0
  99. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_oauth_retry.py +0 -0
  100. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_oauth_token_seam.py +0 -0
  101. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_search_utils.py +0 -0
  102. {cloudinary_cli-1.17.0 → cloudinary_cli-1.18.0}/test/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudinary-cli
3
- Version: 1.17.0
3
+ Version: 1.18.0
4
4
  Summary: A command line interface for Cloudinary with full API support
5
5
  Home-page: https://github.com/cloudinary/cloudinary-cli
6
6
  Author: Cloudinary, Brian Luk
@@ -13,7 +13,7 @@ Classifier: Operating System :: OS Independent
13
13
  Requires-Python: >=3.8.0
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
- Requires-Dist: cloudinary>=1.46.3
16
+ Requires-Dist: cloudinary>=1.47.0
17
17
  Requires-Dist: pygments
18
18
  Requires-Dist: jinja2
19
19
  Requires-Dist: click
@@ -181,6 +181,7 @@ cld logout # Revokes and removes a saved OAuth login.
181
181
  cld search --help # Shows usage for the Search API.
182
182
  cld admin # Lists Admin API methods.
183
183
  cld uploader # Lists Upload API methods.
184
+ cld collections # Lists Collections API methods.
184
185
  cld agent signup # For AI agents: creates a Cloudinary account on behalf of a human.
185
186
  cld agent cloud # For AI agents: creates a temporary cloud that works immediately.
186
187
  ```
@@ -262,6 +263,32 @@ cld admin transformation my_new_transformation
262
263
 
263
264
  _**Note:** you can omit 'admin' from the command when calling an Admin API method._
264
265
 
266
+ ## Collections API
267
+
268
+ Enables you to run any methods that can be called through the collections API, to organize assets into collections and share them through public pages.
269
+
270
+ You can find documentation for each of the Collections API methods at [https://cloudinary.com/documentation/collections_api](https://cloudinary.com/documentation/collections_api).
271
+
272
+ The basic syntax using the Collections API is as follows:
273
+
274
+ ```
275
+ cld [cli options] collections [command options] [method] [method parameters]
276
+ ```
277
+
278
+ Example: create a collection, add an asset to it and publish it as a public page:
279
+
280
+ ```
281
+ cld collections create_collection "Summer campaign" -o description "Campaign assets"
282
+ cld collections add_collection_assets <collection_id> '["<asset_id>"]'
283
+ cld collections create_collection_public_page <collection_id>
284
+ ```
285
+
286
+ Create a dynamic collection from a search expression:
287
+
288
+ ```
289
+ cld collections create_collection "Summer images" -o type dynamic -O configuration '{"expression": "tags=summer"}'
290
+ ```
291
+
265
292
  ## Search API
266
293
 
267
294
  Runs the admin API search method, allowing you to use a Lucene query string as the expression.
@@ -1,29 +1,3 @@
1
- Metadata-Version: 2.1
2
- Name: cloudinary-cli
3
- Version: 1.17.0
4
- Summary: A command line interface for Cloudinary with full API support
5
- Home-page: https://github.com/cloudinary/cloudinary-cli
6
- Author: Cloudinary, Brian Luk
7
- Author-email: info@cloudinary.com, lukitsbrian@gmail.com
8
- License: MIT
9
- Keywords: cloudinary cli pycloudinary image video digital asset management command line interface transformation friendly easy flexible
10
- Classifier: Programming Language :: Python :: 3 :: Only
11
- Classifier: License :: OSI Approved :: MIT License
12
- Classifier: Operating System :: OS Independent
13
- Requires-Python: >=3.8.0
14
- Description-Content-Type: text/markdown
15
- License-File: LICENSE
16
- Requires-Dist: cloudinary>=1.46.3
17
- Requires-Dist: pygments
18
- Requires-Dist: jinja2
19
- Requires-Dist: click
20
- Requires-Dist: click-log
21
- Requires-Dist: filelock
22
- Requires-Dist: requests
23
- Requires-Dist: docstring-parser
24
- Requires-Dist: urllib3>=2.2.2
25
- Requires-Dist: zipp>=3.19.1
26
-
27
1
  [![Build Status](https://app.travis-ci.com/cloudinary/cloudinary-cli.svg)](https://app.travis-ci.com/cloudinary/cloudinary-cli)
28
2
  [![PyPI Downloads](https://img.shields.io/pypi/dm/cloudinary-cli.svg)](https://pypistats.org/packages/cloudinary-cli)
29
3
  [![PyPI License](https://img.shields.io/pypi/l/cloudinary-cli.svg)](LICENSE)
@@ -181,6 +155,7 @@ cld logout # Revokes and removes a saved OAuth login.
181
155
  cld search --help # Shows usage for the Search API.
182
156
  cld admin # Lists Admin API methods.
183
157
  cld uploader # Lists Upload API methods.
158
+ cld collections # Lists Collections API methods.
184
159
  cld agent signup # For AI agents: creates a Cloudinary account on behalf of a human.
185
160
  cld agent cloud # For AI agents: creates a temporary cloud that works immediately.
186
161
  ```
@@ -262,6 +237,32 @@ cld admin transformation my_new_transformation
262
237
 
263
238
  _**Note:** you can omit 'admin' from the command when calling an Admin API method._
264
239
 
240
+ ## Collections API
241
+
242
+ Enables you to run any methods that can be called through the collections API, to organize assets into collections and share them through public pages.
243
+
244
+ You can find documentation for each of the Collections API methods at [https://cloudinary.com/documentation/collections_api](https://cloudinary.com/documentation/collections_api).
245
+
246
+ The basic syntax using the Collections API is as follows:
247
+
248
+ ```
249
+ cld [cli options] collections [command options] [method] [method parameters]
250
+ ```
251
+
252
+ Example: create a collection, add an asset to it and publish it as a public page:
253
+
254
+ ```
255
+ cld collections create_collection "Summer campaign" -o description "Campaign assets"
256
+ cld collections add_collection_assets <collection_id> '["<asset_id>"]'
257
+ cld collections create_collection_public_page <collection_id>
258
+ ```
259
+
260
+ Create a dynamic collection from a search expression:
261
+
262
+ ```
263
+ cld collections create_collection "Summer images" -o type dynamic -O configuration '{"expression": "tags=summer"}'
264
+ ```
265
+
265
266
  ## Search API
266
267
 
267
268
  Runs the admin API search method, allowing you to use a Lucene query string as the expression.
@@ -3,6 +3,7 @@ import click
3
3
  from cloudinary_cli.core.admin import admin
4
4
  from cloudinary_cli.core.agent import agent_group
5
5
  from cloudinary_cli.core.auth import login, logout
6
+ from cloudinary_cli.core.collections import collections
6
7
  from cloudinary_cli.core.config import config_command
7
8
  from cloudinary_cli.core.search import search, search_folders
8
9
  from cloudinary_cli.core.uploader import uploader
@@ -22,6 +23,7 @@ commands = [
22
23
  admin,
23
24
  uploader,
24
25
  provisioning,
26
+ collections,
25
27
  url,
26
28
  utils
27
29
  ]
@@ -0,0 +1,29 @@
1
+ from click import command, argument, option
2
+ import cloudinary.collections
3
+
4
+ from cloudinary_cli.utils.api_utils import handle_api_command
5
+
6
+
7
+ @command("collections",
8
+ short_help="Run any methods that can be called through the collections API.",
9
+ help="""\b
10
+ Run any methods that can be called through the collections API.
11
+ Format: cld <cli options> collections <command options> <method> <method parameters>
12
+ \te.g. cld collections create_collection "Summer campaign" -o description "Campaign assets"
13
+ \t OR
14
+ \t cld collections add_collection_assets <collection_id> '["<asset_id>"]'
15
+ """)
16
+ @argument("params", nargs=-1)
17
+ @option("-o", "--optional_parameter", multiple=True, nargs=2,
18
+ help="Pass an optional parameter as a string, with no parsing. e.g. -o query summer")
19
+ @option("-O", "--optional_parameter_parsed", multiple=True, nargs=2,
20
+ help="Pass an optional parameter and parse its value as JSON or a boolean. "
21
+ "e.g. -O configuration '{\"expression\": \"tags=summer\"}'")
22
+ @option("-ls", "--ls", is_flag=True, help="List all available methods in the Collections API.")
23
+ @option("--save", nargs=1, help="Save output to a file.")
24
+ @option("-d", "--doc", is_flag=True, help="Open the Collections API reference in a browser.")
25
+ def collections(params, optional_parameter, optional_parameter_parsed, ls, save, doc):
26
+ return handle_api_command(params, optional_parameter, optional_parameter_parsed, ls, save, doc,
27
+ doc_url="https://cloudinary.com/documentation/collections_api",
28
+ api_instance=cloudinary.collections,
29
+ api_name="collections")
@@ -22,7 +22,8 @@ from cloudinary.utils import build_array
22
22
 
23
23
  not_callable = ('is_appengine_sandbox', 'call_tags_api', 'call_context_api', 'call_cacheable_api', 'call_api',
24
24
  'call_metadata_api', 'call_json_api', 'only', 'transformation_string', 'account_config',
25
- 'reset_config', 'upload_large_part', 'upload_image', 'upload_resource', 'build_eager')
25
+ 'reset_config', 'upload_large_part', 'upload_image', 'upload_resource', 'build_eager',
26
+ 'base64url_decode')
26
27
 
27
28
  BLOCK_SIZE = 65536
28
29
 
@@ -0,0 +1 @@
1
+ __version__ = "1.18.0"
@@ -1,3 +1,29 @@
1
+ Metadata-Version: 2.1
2
+ Name: cloudinary-cli
3
+ Version: 1.18.0
4
+ Summary: A command line interface for Cloudinary with full API support
5
+ Home-page: https://github.com/cloudinary/cloudinary-cli
6
+ Author: Cloudinary, Brian Luk
7
+ Author-email: info@cloudinary.com, lukitsbrian@gmail.com
8
+ License: MIT
9
+ Keywords: cloudinary cli pycloudinary image video digital asset management command line interface transformation friendly easy flexible
10
+ Classifier: Programming Language :: Python :: 3 :: Only
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Requires-Python: >=3.8.0
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: cloudinary>=1.47.0
17
+ Requires-Dist: pygments
18
+ Requires-Dist: jinja2
19
+ Requires-Dist: click
20
+ Requires-Dist: click-log
21
+ Requires-Dist: filelock
22
+ Requires-Dist: requests
23
+ Requires-Dist: docstring-parser
24
+ Requires-Dist: urllib3>=2.2.2
25
+ Requires-Dist: zipp>=3.19.1
26
+
1
27
  [![Build Status](https://app.travis-ci.com/cloudinary/cloudinary-cli.svg)](https://app.travis-ci.com/cloudinary/cloudinary-cli)
2
28
  [![PyPI Downloads](https://img.shields.io/pypi/dm/cloudinary-cli.svg)](https://pypistats.org/packages/cloudinary-cli)
3
29
  [![PyPI License](https://img.shields.io/pypi/l/cloudinary-cli.svg)](LICENSE)
@@ -155,6 +181,7 @@ cld logout # Revokes and removes a saved OAuth login.
155
181
  cld search --help # Shows usage for the Search API.
156
182
  cld admin # Lists Admin API methods.
157
183
  cld uploader # Lists Upload API methods.
184
+ cld collections # Lists Collections API methods.
158
185
  cld agent signup # For AI agents: creates a Cloudinary account on behalf of a human.
159
186
  cld agent cloud # For AI agents: creates a temporary cloud that works immediately.
160
187
  ```
@@ -236,6 +263,32 @@ cld admin transformation my_new_transformation
236
263
 
237
264
  _**Note:** you can omit 'admin' from the command when calling an Admin API method._
238
265
 
266
+ ## Collections API
267
+
268
+ Enables you to run any methods that can be called through the collections API, to organize assets into collections and share them through public pages.
269
+
270
+ You can find documentation for each of the Collections API methods at [https://cloudinary.com/documentation/collections_api](https://cloudinary.com/documentation/collections_api).
271
+
272
+ The basic syntax using the Collections API is as follows:
273
+
274
+ ```
275
+ cld [cli options] collections [command options] [method] [method parameters]
276
+ ```
277
+
278
+ Example: create a collection, add an asset to it and publish it as a public page:
279
+
280
+ ```
281
+ cld collections create_collection "Summer campaign" -o description "Campaign assets"
282
+ cld collections add_collection_assets <collection_id> '["<asset_id>"]'
283
+ cld collections create_collection_public_page <collection_id>
284
+ ```
285
+
286
+ Create a dynamic collection from a search expression:
287
+
288
+ ```
289
+ cld collections create_collection "Summer images" -o type dynamic -O configuration '{"expression": "tags=summer"}'
290
+ ```
291
+
239
292
  ## Search API
240
293
 
241
294
  Runs the admin API search method, allowing you to use a Lucene query string as the expression.
@@ -26,6 +26,7 @@ cloudinary_cli/core/__init__.py
26
26
  cloudinary_cli/core/admin.py
27
27
  cloudinary_cli/core/agent.py
28
28
  cloudinary_cli/core/auth.py
29
+ cloudinary_cli/core/collections.py
29
30
  cloudinary_cli/core/config.py
30
31
  cloudinary_cli/core/overrides.py
31
32
  cloudinary_cli/core/provisioning.py
@@ -1,4 +1,4 @@
1
- cloudinary>=1.46.3
1
+ cloudinary>=1.47.0
2
2
  pygments
3
3
  jinja2
4
4
  click
@@ -1,4 +1,4 @@
1
- cloudinary>=1.46.3
1
+ cloudinary>=1.47.0
2
2
  pygments
3
3
  jinja2
4
4
  click
@@ -16,6 +16,7 @@ class TestCLI(unittest.TestCase):
16
16
  COMMANDS = [
17
17
  'admin',
18
18
  'agent',
19
+ 'collections',
19
20
  'config',
20
21
  'login',
21
22
  'logout',
@@ -45,6 +45,23 @@ class TestCLIApi(unittest.TestCase):
45
45
  self.assertEqual(0, result.exit_code, result.output)
46
46
  self.assertIn('"foo": "bar"', result.output)
47
47
 
48
+ @unittest.skipUnless(CONFIG_PRESENT, REQUIRES_CONFIG)
49
+ @patch(URLLIB3_REQUEST)
50
+ def test_collections(self, mocker):
51
+ mocker.return_value = API_MOCK_RESPONSE
52
+ result = self.runner.invoke(cli, ['collections', 'add_collection_assets', 'col1', '["a1", "a2"]'])
53
+
54
+ self.assertEqual(0, result.exit_code, result.output)
55
+ self.assertIn('"foo": "bar"', result.output)
56
+ self.assertIn('/collections/col1/assets', mocker.call_args[1]['url'])
57
+
58
+ def test_collections_ls(self):
59
+ result = self.runner.invoke(cli, ['collections', '-ls'])
60
+
61
+ self.assertEqual(0, result.exit_code, result.output)
62
+ self.assertIn('create_collection', result.output)
63
+ self.assertNotIn('base64url_decode', result.output)
64
+
48
65
 
49
66
  class TestDestructiveBulkConfirmation(unittest.TestCase):
50
67
  runner = CliRunner()
@@ -1 +0,0 @@
1
- __version__ = "1.17.0"
File without changes