diff options
Diffstat (limited to 'azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py')
-rw-r--r-- | azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py new file mode 100644 index 0000000..6fff2f6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py @@ -0,0 +1,59 @@ +# 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 +# +# 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. + +from ..loading import LiteralLocation, UriLocation +from .yaml import YamlReader +from .json import JsonReader +from .jinja import JinjaReader +from .exceptions import ReaderNotFoundError + + +EXTENSIONS = { + '.yaml': YamlReader, + '.json': JsonReader, + '.jinja': JinjaReader} + + +class ReaderSource(object): + """ + Base class for ARIA reader sources. + + Reader sources provide appropriate :class:`Reader` instances for locations. + """ + + @staticmethod + def get_reader(context, location, loader): # pylint: disable=unused-argument + raise ReaderNotFoundError('location: %s' % location) + + +class DefaultReaderSource(ReaderSource): + """ + The default ARIA reader source will generate a :class:`YamlReader` for + locations that end in ".yaml", a :class:`JsonReader` for locations that + end in ".json", and a :class:`JinjaReader` for locations that end in + ".jinja". + """ + + def __init__(self, literal_reader_class=YamlReader): + super(DefaultReaderSource, self).__init__() + self.literal_reader_class = literal_reader_class + + def get_reader(self, context, location, loader): + if isinstance(location, LiteralLocation): + return self.literal_reader_class(context, location, loader) + + elif isinstance(location, UriLocation): + for extension, reader_class in EXTENSIONS.iteritems(): + if location.uri.endswith(extension): + return reader_class(context, location, loader) + + return super(DefaultReaderSource, self).get_reader(context, location, loader) |