Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/schema_salad/codegen_base.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
| author | shellac |
|---|---|
| date | Sat, 02 May 2020 07:14:21 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:26e78fe6e8c4 |
|---|---|
| 1 """Base class for the generation of loaders from schema-salad definitions.""" | |
| 2 import collections | |
| 3 from typing import Any, Dict, List, MutableSequence, Optional, Union | |
| 4 | |
| 5 from typing_extensions import Text # pylint: disable=unused-import | |
| 6 | |
| 7 from . import schema | |
| 8 | |
| 9 # move to a regular typing import when Python 3.3-3.6 is no longer supported | |
| 10 | |
| 11 | |
| 12 class TypeDef(object): # pylint: disable=too-few-public-methods | |
| 13 """Schema Salad type description.""" | |
| 14 | |
| 15 __slots__ = [ | |
| 16 "name", | |
| 17 "init", | |
| 18 "is_uri", | |
| 19 "scoped_id", | |
| 20 "ref_scope", | |
| 21 "loader_type", | |
| 22 "instance_type", | |
| 23 ] | |
| 24 | |
| 25 # switch to class-style typing.NamedTuple once support for Python < 3.6 | |
| 26 # is dropped | |
| 27 def __init__( | |
| 28 self, # pylint: disable=too-many-arguments | |
| 29 name, # type: Text | |
| 30 init, # type: Text | |
| 31 is_uri=False, # type: bool | |
| 32 scoped_id=False, # type: bool | |
| 33 ref_scope=0, # type: Optional[int] | |
| 34 loader_type=None, # type: Optional[Text] | |
| 35 instance_type=None, # type: Optional[Text] | |
| 36 ): # type: (...) -> None | |
| 37 self.name = name | |
| 38 self.init = init | |
| 39 self.is_uri = is_uri | |
| 40 self.scoped_id = scoped_id | |
| 41 self.ref_scope = ref_scope | |
| 42 # Follow attributes used by Java but not Python. | |
| 43 self.loader_type = loader_type | |
| 44 self.instance_type = instance_type | |
| 45 | |
| 46 | |
| 47 class CodeGenBase(object): | |
| 48 """Abstract base class for schema salad code generators.""" | |
| 49 | |
| 50 def __init__(self): # type: () -> None | |
| 51 self.collected_types = ( | |
| 52 collections.OrderedDict() | |
| 53 ) # type: collections.OrderedDict[Text, TypeDef] | |
| 54 self.vocab = {} # type: Dict[Text, Text] | |
| 55 | |
| 56 def declare_type(self, declared_type): # type: (TypeDef) -> TypeDef | |
| 57 """Add this type to our collection, if needed.""" | |
| 58 if declared_type not in self.collected_types: | |
| 59 self.collected_types[declared_type.name] = declared_type | |
| 60 return declared_type | |
| 61 | |
| 62 def add_vocab(self, name, uri): # type: (Text, Text) -> None | |
| 63 """Add the given name as an abbreviation for the given URI.""" | |
| 64 self.vocab[name] = uri | |
| 65 | |
| 66 def prologue(self): # type: () -> None | |
| 67 """Trigger to generate the prolouge code.""" | |
| 68 raise NotImplementedError() | |
| 69 | |
| 70 @staticmethod | |
| 71 def safe_name(name): # type: (Text) -> Text | |
| 72 """Generate a safe version of the given name.""" | |
| 73 return schema.avro_name(name) | |
| 74 | |
| 75 def begin_class( | |
| 76 self, # pylint: disable=too-many-arguments | |
| 77 classname, # type: Text | |
| 78 extends, # type: MutableSequence[Text] | |
| 79 doc, # type: Text | |
| 80 abstract, # type: bool | |
| 81 field_names, # type: MutableSequence[Text] | |
| 82 idfield, # type: Text | |
| 83 ): # type: (...) -> None | |
| 84 """Produce the header for the given class.""" | |
| 85 raise NotImplementedError() | |
| 86 | |
| 87 def end_class(self, classname, field_names): | |
| 88 # type: (Text, List[Text]) -> None | |
| 89 """Signal that we are done with this class.""" | |
| 90 raise NotImplementedError() | |
| 91 | |
| 92 def type_loader(self, type_declaration): | |
| 93 # type: (Union[List[Any], Dict[Text, Any]]) -> TypeDef | |
| 94 """Parse the given type declaration and declare its components.""" | |
| 95 raise NotImplementedError() | |
| 96 | |
| 97 def declare_field(self, name, fieldtype, doc, optional): | |
| 98 # type: (Text, TypeDef, Text, bool) -> None | |
| 99 """Output the code to load the given field.""" | |
| 100 raise NotImplementedError() | |
| 101 | |
| 102 def declare_id_field(self, name, fieldtype, doc, optional): | |
| 103 # type: (Text, TypeDef, Text, bool) -> None | |
| 104 """Output the code to handle the given ID field.""" | |
| 105 raise NotImplementedError() | |
| 106 | |
| 107 def uri_loader(self, inner, scoped_id, vocab_term, ref_scope): | |
| 108 # type: (TypeDef, bool, bool, Union[int, None]) -> TypeDef | |
| 109 """Construct the TypeDef for the given URI loader.""" | |
| 110 raise NotImplementedError() | |
| 111 | |
| 112 def idmap_loader(self, field, inner, map_subject, map_predicate): | |
| 113 # type: (Text, TypeDef, Text, Union[Text, None]) -> TypeDef | |
| 114 """Construct the TypeDef for the given mapped ID loader.""" | |
| 115 raise NotImplementedError() | |
| 116 | |
| 117 def typedsl_loader(self, inner, ref_scope): | |
| 118 # type: (TypeDef, Union[int, None]) -> TypeDef | |
| 119 """Construct the TypeDef for the given DSL loader.""" | |
| 120 raise NotImplementedError() | |
| 121 | |
| 122 def epilogue(self, root_loader): # type: (TypeDef) -> None | |
| 123 """Trigger to generate the epilouge code.""" | |
| 124 raise NotImplementedError() |
