Skip to content

Commit 9e8ac90

Browse files
authored
Purge products (#2349)
* add vision_product_search_purge_products_in_product_set * add vision_product_search_purge_orphan_products * update comment * flake * update print message * update python sample to use operation.result * longer timeout * remove unused variable
1 parent db332fd commit 9e8ac90

5 files changed

+115
-4
lines changed

vision/cloud-client/product_search/product_in_product_set_management.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525

2626
# [START vision_product_search_add_product_to_product_set]
2727
# [START vision_product_search_remove_product_from_product_set]
28+
# [START vision_product_search_purge_products_in_product_set]
2829
from google.cloud import vision
2930

3031
# [END vision_product_search_add_product_to_product_set]
3132
# [END vision_product_search_remove_product_from_product_set]
33+
# [END vision_product_search_purge_products_in_product_set]
3234

3335

3436
# [START vision_product_search_add_product_to_product_set]
@@ -117,6 +119,40 @@ def remove_product_from_product_set(
117119
# [END vision_product_search_remove_product_from_product_set]
118120

119121

122+
# [START vision_product_search_purge_products_in_product_set]
123+
def purge_products_in_product_set(
124+
project_id, location, product_set_id, force):
125+
"""Delete all products in a product set.
126+
Args:
127+
project_id: Id of the project.
128+
location: A compute region name.
129+
product_set_id: Id of the product set.
130+
force: Perform the purge only when force is set to True.
131+
"""
132+
client = vision.ProductSearchClient()
133+
134+
parent = client.location_path(
135+
project=project_id, location=location)
136+
137+
product_set_purge_config = vision.types.ProductSetPurgeConfig(
138+
product_set_id=product_set_id)
139+
140+
# The purge operation is async.
141+
operation = client.purge_products(
142+
parent=parent,
143+
product_set_purge_config=product_set_purge_config,
144+
# The operation is irreversible and removes multiple products.
145+
# The user is required to pass in force=True to actually perform the
146+
# purge.
147+
# If force is not set to True, the service raises an exception.
148+
force=force)
149+
150+
operation.result(timeout=120)
151+
152+
print('Deleted products in product set.')
153+
# [END vision_product_search_purge_products_in_product_set]
154+
155+
120156
if __name__ == '__main__':
121157
parser = argparse.ArgumentParser(
122158
description=__doc__,
@@ -147,6 +183,13 @@ def remove_product_from_product_set(
147183
remove_product_from_product_set_parser.add_argument('product_id')
148184
remove_product_from_product_set_parser.add_argument('product_set_id')
149185

186+
purge_products_in_product_set_parser = subparsers.add_parser(
187+
'purge_products_in_product_set',
188+
help=purge_products_in_product_set.__doc__)
189+
purge_products_in_product_set_parser.add_argument('product_set_id')
190+
purge_products_in_product_set_parser.add_argument(
191+
'--force', action='store_true')
192+
150193
args = parser.parse_args()
151194

152195
if args.command == 'add_product_to_product_set':
@@ -160,3 +203,6 @@ def remove_product_from_product_set(
160203
remove_product_from_product_set(
161204
args.project_id, args.location, args.product_id,
162205
args.product_set_id)
206+
elif args.command == 'purge_products_in_product_set':
207+
purge_products_in_product_set(
208+
args.project_id, args.location, args.product_set_id, args.force)

vision/cloud-client/product_search/product_in_product_set_management_test.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
from product_in_product_set_management import (
2020
add_product_to_product_set, list_products_in_product_set,
21-
remove_product_from_product_set)
22-
from product_management import create_product, delete_product
21+
purge_products_in_product_set, remove_product_from_product_set)
22+
from product_management import create_product, delete_product, list_products
2323
from product_set_management import (
2424
create_product_set, delete_product_set)
2525

@@ -75,3 +75,20 @@ def test_remove_product_from_product_set(capsys, product_and_product_set):
7575
list_products_in_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID)
7676
out, _ = capsys.readouterr()
7777
assert 'Product id: {}'.format(PRODUCT_ID) not in out
78+
79+
80+
def test_purge_products_in_product_set(capsys, product_and_product_set):
81+
add_product_to_product_set(
82+
PROJECT_ID, LOCATION, PRODUCT_ID, PRODUCT_SET_ID)
83+
list_products(PROJECT_ID, LOCATION)
84+
out, _ = capsys.readouterr()
85+
assert 'Product id: {}'.format(PRODUCT_ID) in out
86+
87+
purge_products_in_product_set(
88+
PROJECT_ID, LOCATION, PRODUCT_SET_ID, force=True)
89+
90+
list_products(PROJECT_ID, LOCATION)
91+
out, _ = capsys.readouterr()
92+
assert 'Product id: {}'.format(PRODUCT_ID) not in out
93+
94+
print(out)

vision/cloud-client/product_search/product_management.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@
2828
# [START vision_product_search_list_products]
2929
# [START vision_product_search_get_product]
3030
# [START vision_product_search_update_product_labels]
31+
# [START vision_product_search_purge_orphan_products]
3132
from google.cloud import vision
3233

3334
# [END vision_product_search_create_product]
3435
# [END vision_product_search_delete_product]
3536
# [END vision_product_search_list_products]
3637
# [END vision_product_search_get_product]
3738
# [END vision_product_search_update_product_labels]
39+
# [END vision_product_search_purge_orphan_products]
3840

3941

4042
# [START vision_product_search_create_product]
@@ -181,6 +183,34 @@ def delete_product(project_id, location, product_id):
181183
# [END vision_product_search_delete_product]
182184

183185

186+
# [START vision_product_search_purge_orphan_products]
187+
def purge_orphan_products(project_id, location, force):
188+
"""Delete all products not in any product sets.
189+
Args:
190+
project_id: Id of the project.
191+
location: A compute region name.
192+
"""
193+
client = vision.ProductSearchClient()
194+
195+
parent = client.location_path(
196+
project=project_id, location=location)
197+
198+
# The purge operation is async.
199+
operation = client.purge_products(
200+
parent=parent,
201+
delete_orphan_products=True,
202+
# The operation is irreversible and removes multiple products.
203+
# The user is required to pass in force=True to actually perform the
204+
# purge.
205+
# If force is not set to True, the service raises an exception.
206+
force=force)
207+
208+
operation.result(timeout=120)
209+
210+
print('Orphan products deleted.')
211+
# [END vision_product_search_purge_orphan_products]
212+
213+
184214
if __name__ == '__main__':
185215
parser = argparse.ArgumentParser(
186216
description=__doc__,
@@ -219,6 +249,10 @@ def delete_product(project_id, location, product_id):
219249
'delete_product', help=delete_product.__doc__)
220250
delete_product_parser.add_argument('product_id')
221251

252+
purge_orphan_products_parser = subparsers.add_parser(
253+
'purge_orphan_products', help=purge_orphan_products.__doc__)
254+
purge_orphan_products_parser.add_argument('--force', action='store_true')
255+
222256
args = parser.parse_args()
223257

224258
if args.command == 'create_product':
@@ -235,3 +269,5 @@ def delete_product(project_id, location, product_id):
235269
args.key, args.value)
236270
elif args.command == 'delete_product':
237271
delete_product(args.project_id, args.location, args.product_id)
272+
elif args.command == 'purge_orphan_products':
273+
purge_orphan_products(args.project_id, args.location, args.force)

vision/cloud-client/product_search/product_management_test.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
from product_management import (
2020
create_product, delete_product, get_product, list_products,
21-
update_product_labels)
21+
purge_orphan_products, update_product_labels)
2222

2323

2424
PROJECT_ID = os.getenv('GCLOUD_PROJECT')
@@ -83,3 +83,15 @@ def test_update_product_labels(capsys, product):
8383
assert VALUE in out
8484

8585
delete_product(PROJECT_ID, LOCATION, PRODUCT_ID)
86+
87+
88+
def test_purge_orphan_products(capsys, product):
89+
list_products(PROJECT_ID, LOCATION)
90+
out, _ = capsys.readouterr()
91+
assert PRODUCT_ID in out
92+
93+
purge_orphan_products(PROJECT_ID, LOCATION, force=True)
94+
95+
list_products(PROJECT_ID, LOCATION)
96+
out, _ = capsys.readouterr()
97+
assert PRODUCT_ID not in out
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
google-cloud-vision==0.35.2
1+
google-cloud-vision==0.39.0

0 commit comments

Comments
 (0)