Skip to content

Commit 247c6da

Browse files
authored
[v2] Document minimum and maximum constraints for --page-size (#10413)
Surface min/max value constraints for service-modeled page-sizes in generated documentation and `aws help` pages.
1 parent 2494b4b commit 247c6da

4 files changed

Lines changed: 96 additions & 2 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"type": "enhancement",
3+
"category": "Documentation",
4+
"description": "Update documentation generation so that minimum and maximum value constraints for `--page-size` are surfaced in documentation."
5+
}

awscli/customizations/paginate.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ def unify_paging_params(
187187
PAGE_SIZE_HELP,
188188
parse_type=type_name,
189189
serialized_name='PageSize',
190+
shape_metadata=limit_key_shape.metadata,
190191
),
191192
shadowed_args,
192193
)
@@ -367,8 +368,22 @@ class PageArgument(BaseCLIArgument):
367368
'long': int,
368369
}
369370

370-
def __init__(self, name, documentation, parse_type, serialized_name):
371-
self.argument_model = model.Shape('PageArgument', {'type': 'string'})
371+
SHAPE_CONSTRAINT_KEYS = ('min', 'max')
372+
373+
def __init__(
374+
self,
375+
name,
376+
documentation,
377+
parse_type,
378+
serialized_name,
379+
shape_metadata=None,
380+
):
381+
shape_model = {'type': parse_type}
382+
if shape_metadata:
383+
for key in self.SHAPE_CONSTRAINT_KEYS:
384+
if key in shape_metadata:
385+
shape_model[key] = shape_metadata[key]
386+
self.argument_model = model.Shape('PageArgument', shape_model)
372387
self._name = name
373388
self._serialized_name = serialized_name
374389
self._documentation = documentation

tests/functional/docs/test_help_output.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,26 @@ def test_paging_documentation_added(self):
353353
self.assert_contains('When using ``--output text`` and the')
354354
self.assert_contains('following query expressions: ')
355355

356+
def test_page_size_documents_constraints(self):
357+
session = self.driver.session
358+
paginator_config = session.get_paginator_model('s3').get_paginator(
359+
'ListBuckets'
360+
)
361+
limit_key = paginator_config['limit_key']
362+
operation_model = session.get_service_model('s3').operation_model(
363+
'ListBuckets'
364+
)
365+
shape_metadata = operation_model.input_shape.members[
366+
limit_key
367+
].metadata
368+
369+
self.driver.main(['s3api', 'list-buckets', 'help'])
370+
self.assert_contains('``--page-size``')
371+
for constraint in ('min', 'max'):
372+
value = shape_metadata.get(constraint)
373+
if value is not None:
374+
self.assert_contains(f'{constraint}: ``{value}``')
375+
356376

357377
class TestMergeBooleanGroupArgs(BaseAWSHelpOutputTest):
358378
def test_merge_bool_args(self):

tests/unit/customizations/test_paginate.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def setUp(self):
4646
self.bar_param = mock.Mock()
4747
self.bar_param.type_name = 'string'
4848
self.bar_param.name = 'Bar'
49+
self.bar_param.metadata = {}
4950
self.params = [self.foo_param, self.bar_param]
5051
self.operation_model.input_shape.members = {
5152
"Foo": self.foo_param,
@@ -437,6 +438,59 @@ def test_can_handle_missing_page_size(self):
437438
)
438439

439440

441+
class TestPageSizeConstraints(TestPaginateBase):
442+
def test_page_size_copies_min_max_from_limit_key_shape(self):
443+
self.bar_param.type_name = 'integer'
444+
self.bar_param.metadata = {'min': 1, 'max': 100}
445+
argument_table = {
446+
'foo': mock.Mock(),
447+
'bar': mock.Mock(),
448+
}
449+
paginate.unify_paging_params(
450+
argument_table,
451+
self.operation_model,
452+
'building-argument-table.foo.bar',
453+
self.session,
454+
)
455+
page_size_arg = argument_table['page-size']
456+
self.assertEqual(page_size_arg.argument_model.metadata.get('min'), 1)
457+
self.assertEqual(page_size_arg.argument_model.metadata.get('max'), 100)
458+
459+
def test_page_size_no_constraints_when_limit_key_has_none(self):
460+
self.bar_param.type_name = 'integer'
461+
self.bar_param.metadata = {}
462+
argument_table = {
463+
'foo': mock.Mock(),
464+
'bar': mock.Mock(),
465+
}
466+
paginate.unify_paging_params(
467+
argument_table,
468+
self.operation_model,
469+
'building-argument-table.foo.bar',
470+
self.session,
471+
)
472+
page_size_arg = argument_table['page-size']
473+
self.assertNotIn('min', page_size_arg.argument_model.metadata)
474+
self.assertNotIn('max', page_size_arg.argument_model.metadata)
475+
476+
def test_page_size_copies_partial_constraints(self):
477+
self.bar_param.type_name = 'integer'
478+
self.bar_param.metadata = {'min': 1}
479+
argument_table = {
480+
'foo': mock.Mock(),
481+
'bar': mock.Mock(),
482+
}
483+
paginate.unify_paging_params(
484+
argument_table,
485+
self.operation_model,
486+
'building-argument-table.foo.bar',
487+
self.session,
488+
)
489+
page_size_arg = argument_table['page-size']
490+
self.assertEqual(page_size_arg.argument_model.metadata.get('min'), 1)
491+
self.assertNotIn('max', page_size_arg.argument_model.metadata)
492+
493+
440494
class TestNonPositiveMaxItems:
441495
def test_positive_integer_does_not_raise_warning(
442496
self, max_items_page_arg, capsys

0 commit comments

Comments
 (0)