Skip to content

Commit 8fd1699

Browse files
gruebeljlhood
authored andcommitted
feat: support LicenseBody and ReadmeBody application metadata properties (amazon-archives#28)
1 parent 6292378 commit 8fd1699

File tree

6 files changed

+50
-7
lines changed

6 files changed

+50
-7
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ share_application_with_accounts(application_id, ['123456789013', '123456789014']
142142
* Pipenv will automatically update [Pipfile](./Pipfile) and [Pipfile.lock](./Pipfile.lock) for you.
143143
* Add new dependencies to [setup.py](./setup.py) install_requires if they are needed for consumers of this library.
144144
* Verify that everything works: `make build`
145-
* You can run `make tests` separately to verify that tests pass.
145+
* You can run `make test` separately to verify that tests pass.
146146
* Check code style with `make flake` and `make lint`.
147147
* Make code changes, run all verifications again before sending a Pull Request: `make pr`
148148

serverlessrepo/application_metadata.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ class ApplicationMetadata(object):
1111
DESCRIPTION = 'Description'
1212
AUTHOR = 'Author'
1313
SPDX_LICENSE_ID = 'SpdxLicenseId'
14+
LICENSE_BODY = 'LicenseBody'
1415
LICENSE_URL = 'LicenseUrl'
16+
README_BODY = 'ReadmeBody'
1517
README_URL = 'ReadmeUrl'
1618
LABELS = 'Labels'
1719
HOME_PAGE_URL = 'HomePageUrl'
@@ -30,7 +32,9 @@ def __init__(self, app_metadata):
3032
self.description = app_metadata.get(self.DESCRIPTION)
3133
self.author = app_metadata.get(self.AUTHOR)
3234
self.spdx_license_id = app_metadata.get(self.SPDX_LICENSE_ID)
35+
self.license_body = app_metadata.get(self.LICENSE_BODY)
3336
self.license_url = app_metadata.get(self.LICENSE_URL)
37+
self.readme_body = app_metadata.get(self.README_BODY)
3438
self.readme_url = app_metadata.get(self.README_URL)
3539
self.labels = app_metadata.get(self.LABELS)
3640
self.home_page_url = app_metadata.get(self.HOME_PAGE_URL)
@@ -52,6 +56,13 @@ def validate(self, required_props):
5256
"""
5357
missing_props = [p for p in required_props if not getattr(self, p)]
5458
if missing_props:
55-
missing_props_str = ', '.join(sorted(missing_props))
56-
raise InvalidApplicationMetadataError(properties=missing_props_str)
59+
raise InvalidApplicationMetadataError(
60+
error_message='{} properties not provided'.format(', '.join(sorted(missing_props))))
61+
62+
if self.license_body and self.license_url:
63+
raise InvalidApplicationMetadataError(error_message='provide either LicenseBody or LicenseUrl')
64+
65+
if self.readme_body and self.readme_url:
66+
raise InvalidApplicationMetadataError(error_message='provide either ReadmeBody or ReadmeUrl')
67+
5768
return True

serverlessrepo/exceptions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def __init__(self, **kwargs):
1414
class InvalidApplicationMetadataError(ServerlessRepoError):
1515
"""Raised when invalid application metadata is provided."""
1616

17-
MESSAGE = "Required application metadata properties not provided: '{properties}'"
17+
MESSAGE = "Invalid application metadata: '{error_message}'"
1818

1919

2020
class ApplicationMetadataNotFoundError(ServerlessRepoError):

serverlessrepo/publish.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,10 @@ def _create_application_request(app_metadata, template):
136136
'Description': app_metadata.description,
137137
'HomePageUrl': app_metadata.home_page_url,
138138
'Labels': app_metadata.labels,
139+
'LicenseBody': app_metadata.license_body,
139140
'LicenseUrl': app_metadata.license_url,
140141
'Name': app_metadata.name,
142+
'ReadmeBody': app_metadata.readme_body,
141143
'ReadmeUrl': app_metadata.readme_url,
142144
'SemanticVersion': app_metadata.semantic_version,
143145
'SourceCodeUrl': app_metadata.source_code_url,
@@ -165,6 +167,7 @@ def _update_application_request(app_metadata, application_id):
165167
'Description': app_metadata.description,
166168
'HomePageUrl': app_metadata.home_page_url,
167169
'Labels': app_metadata.labels,
170+
'ReadmeBody': app_metadata.readme_body,
168171
'ReadmeUrl': app_metadata.readme_url
169172
}
170173
return {k: v for k, v in request.items() if v}

tests/unit/test_application_metadata.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ def test_init(self):
1212
'Description': 'description',
1313
'Author': 'author',
1414
'SpdxLicenseId': '123456',
15+
'LicenseBody': 'license body',
1516
'LicenseUrl': 's3://bucket/license.txt',
17+
'ReadmeBody': 'readme body',
1618
'ReadmeUrl': 's3://bucket/README.md',
1719
'Labels': ['label1', 'label2', 'label3'],
1820
'HomePageUrl': 'https://github.com/my-id/my-repo/',
@@ -24,22 +26,49 @@ def test_init(self):
2426
self.assertEqual(app_metadata.description, app_metadata_dict['Description'])
2527
self.assertEqual(app_metadata.author, app_metadata_dict['Author'])
2628
self.assertEqual(app_metadata.spdx_license_id, app_metadata_dict['SpdxLicenseId'])
29+
self.assertEqual(app_metadata.license_body, app_metadata_dict['LicenseBody'])
2730
self.assertEqual(app_metadata.license_url, app_metadata_dict['LicenseUrl'])
31+
self.assertEqual(app_metadata.readme_body, app_metadata_dict['ReadmeBody'])
2832
self.assertEqual(app_metadata.readme_url, app_metadata_dict['ReadmeUrl'])
2933
self.assertEqual(app_metadata.labels, app_metadata_dict['Labels'])
3034
self.assertEqual(app_metadata.home_page_url, app_metadata_dict['HomePageUrl'])
3135
self.assertEqual(app_metadata.semantic_version, app_metadata_dict['SemanticVersion'])
3236
self.assertEqual(app_metadata.source_code_url, app_metadata_dict['SourceCodeUrl'])
3337

34-
def test_invalid_app_metadata(self):
38+
def test_required_properties_not_provided(self):
3539
app_metadata_dict = {'description': 'hello'}
3640
app_metadata = ApplicationMetadata(app_metadata_dict)
3741
required_props = ['author', 'name']
3842
with self.assertRaises(InvalidApplicationMetadataError) as context:
3943
app_metadata.validate(required_props)
4044

4145
message = str(context.exception)
42-
self.assertTrue(', '.join(required_props) in message)
46+
expected = 'author, name properties not provided'
47+
self.assertTrue(expected in message)
48+
49+
def test_both_license_parameters_provided(self):
50+
app_metadata_dict = {
51+
'LicenseBody': 'license body',
52+
'LicenseUrl': 's3://bucket/license.txt',
53+
}
54+
app_metadata = ApplicationMetadata(app_metadata_dict)
55+
with self.assertRaises(InvalidApplicationMetadataError) as context:
56+
app_metadata.validate([])
57+
58+
message = str(context.exception)
59+
self.assertTrue('provide either LicenseBody or LicenseUrl' in message)
60+
61+
def test_both_readme_parameters_provided(self):
62+
app_metadata_dict = {
63+
'ReadmeBody': 'Readme body',
64+
'ReadmeUrl': 's3://bucket/README.md',
65+
}
66+
app_metadata = ApplicationMetadata(app_metadata_dict)
67+
with self.assertRaises(InvalidApplicationMetadataError) as context:
68+
app_metadata.validate([])
69+
70+
message = str(context.exception)
71+
self.assertTrue('provide either ReadmeBody or ReadmeUrl' in message)
4372

4473
def test_valid_app_metadata(self):
4574
app_metadata = ApplicationMetadata({})

tests/unit/test_publish.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def test_publish_raise_metadata_error_for_invalid_create_application_request(sel
147147
publish_application(template_without_app_name)
148148

149149
message = str(context.exception)
150-
self.assertEqual("Required application metadata properties not provided: 'name'", message)
150+
self.assertEqual("Invalid application metadata: 'name properties not provided'", message)
151151
# create_application shouldn't be called if application metadata is invalid
152152
self.serverlessrepo_mock.create_application.assert_not_called()
153153

0 commit comments

Comments
 (0)