aboutsummaryrefslogtreecommitdiff
path: root/mmi2grpc/_helpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'mmi2grpc/_helpers.py')
-rw-r--r--mmi2grpc/_helpers.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/mmi2grpc/_helpers.py b/mmi2grpc/_helpers.py
new file mode 100644
index 0000000..4e34d59
--- /dev/null
+++ b/mmi2grpc/_helpers.py
@@ -0,0 +1,94 @@
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Helper functions.
+
+Facilitates the implementation of a new profile proxy or a PTS MMI.
+"""
+
+import functools
+import textwrap
+import unittest
+
+DOCSTRING_WIDTH = 80 - 8 # 80 cols - 8 indentation spaces
+
+
+def assert_description(f):
+ """Decorator which verifies the description of a PTS MMI implementation.
+
+ Asserts that the docstring of a function implementing a PTS MMI is the same
+ as the corresponding official MMI description.
+
+ Args:
+ f: function implementing a PTS MMI.
+
+ Raises:
+ AssertionError: the docstring of the function does not match the MMI
+ description.
+ """
+ @functools.wraps(f)
+ def wrapper(*args, **kwargs):
+ description = textwrap.fill(
+ kwargs['description'], DOCSTRING_WIDTH, replace_whitespace=False)
+ docstring = textwrap.dedent(f.__doc__ or '')
+
+ if docstring.strip() != description.strip():
+ print(f'Expected description of {f.__name__}:')
+ print(description)
+
+ # Generate AssertionError.
+ test = unittest.TestCase()
+ test.maxDiff = None
+ test.assertMultiLineEqual(
+ docstring.strip(),
+ description.strip(),
+ f'description does not match with function docstring of'
+ f'{f.__name__}')
+
+ return f(*args, **kwargs)
+ return wrapper
+
+
+def format_function(mmi_name, mmi_description):
+ """Returns the base format of a function implementing a PTS MMI."""
+ wrapped_description = textwrap.fill(
+ mmi_description, DOCSTRING_WIDTH, replace_whitespace=False)
+ return (
+ f'@assert_description\n'
+ f'def {mmi_name}(self, **kwargs):\n'
+ f' """\n'
+ f'{textwrap.indent(wrapped_description, " ")}\n'
+ f' """\n'
+ f'\n'
+ f' return "OK"\n')
+
+
+def format_proxy(profile, mmi_name, mmi_description):
+ """Returns the base format of a profile proxy including a given MMI."""
+ wrapped_function = textwrap.indent(
+ format_function(mmi_name, mmi_description), ' ')
+ return (
+ f'from mmi2grpc._helpers import assert_description\n'
+ f'from mmi2grpc._proxy import ProfileProxy\n'
+ f'\n'
+ f'from pandora.{profile.lower()}_grpc import {profile}\n'
+ f'\n'
+ f'\n'
+ f'class {profile}Proxy(ProfileProxy):\n'
+ f'\n'
+ f' def __init__(self, channel):\n'
+ f' super().__init__()\n'
+ f' self.{profile.lower()} = {profile}(channel)\n'
+ f'\n'
+ f'{wrapped_function}')