summaryrefslogtreecommitdiffstats
path: root/azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py
diff options
context:
space:
mode:
Diffstat (limited to 'azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py')
-rw-r--r--azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py
new file mode 100644
index 0000000..4f452b8
--- /dev/null
+++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py
@@ -0,0 +1,69 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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
+#
+# http://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.
+
+"""
+Utilities for cross-referencing code with specification documents.
+"""
+
+import re
+
+from ..extension import parser
+from ..utils.collections import OrderedDict
+from ..utils.specification import (DSL_SPECIFICATIONS, implements_specification) # pylint: disable=unused-import
+
+
+def iter_specifications():
+ """
+ Iterates all specification assignments in the codebase.
+ """
+ def iter_sections(spec, sections):
+ for k in sorted(sections.keys(), key=_section_key):
+ details = OrderedDict()
+ details['code'] = sections[k]['code']
+ yield k, _fix_details(sections[k], spec)
+
+ for spec, sections in DSL_SPECIFICATIONS.iteritems():
+ yield spec, iter_sections(spec, sections)
+
+
+def _section_key(value):
+ try:
+ parts = value.split('-', 1)
+ first = (int(v) for v in parts[0].split('.'))
+ second = parts[1] if len(parts) > 1 else None
+ return (first, second)
+ except ValueError:
+ return value
+
+
+def _fix_details(details, spec):
+ code = details.get('code')
+ doc = details.get('doc')
+ url = parser.specification_url().get(spec)
+
+ if (url is not None) and (doc is not None):
+ # Look for a URL in ReST docstring that begins with our url
+ pattern = r'<?('
+ for char in url:
+ pattern += r'\s*'
+ pattern += re.escape(char)
+ pattern += r'[^>]+)>'
+ match = re.search(pattern, doc)
+ if match:
+ url = re.sub(r'\s+', '', match.group(1))
+
+ return OrderedDict((
+ ('code', code),
+ ('url', url)))