11"""Handle registration and publication of supported protocols."""
22
33import logging
4+ import re
45
56from typing import Mapping , Sequence
67
78from ..config .injection_context import InjectionContext
89from ..utils .classloader import ClassLoader
910
10- from .error import ProtocolMinorVersionNotSupported
11+ from .error import ProtocolMinorVersionNotSupported , ProtocolDefinitionValidationError
1112
1213LOGGER = logging .getLogger (__name__ )
1314
@@ -74,6 +75,79 @@ def parse_type_string(self, message_type):
7475 "minor_version" : int (version_string_tokens [1 ]),
7576 }
7677
78+ def create_msg_types_for_minor_version (self , typesets , version_definition ):
79+ """
80+ Return mapping of message type to module path for minor versions.
81+
82+ Args:
83+ typesets: Mappings of message types to register
84+ version_definition: Optional version definition dict
85+
86+ Returns:
87+ Typesets mapping
88+
89+ """
90+ updated_typeset = {}
91+ curr_minor_version = version_definition ["current_minor_version" ]
92+ min_minor_version = version_definition ["minimum_minor_version" ]
93+ major_version = version_definition ["major_version" ]
94+ if curr_minor_version >= min_minor_version :
95+ for version_index in range (min_minor_version , curr_minor_version + 1 ):
96+ to_check = f"{ str (major_version )} .{ str (version_index )} "
97+ updated_typeset .update (
98+ self ._get_updated_typeset_dict (typesets , to_check , updated_typeset )
99+ )
100+ else :
101+ raise ProtocolDefinitionValidationError (
102+ "min_minor_version is greater than curr_minor_version for the"
103+ f" following typeset: { str (typesets )} "
104+ )
105+ return (updated_typeset ,)
106+
107+ def _get_updated_typeset_dict (self , typesets , to_check , updated_typeset ) -> dict :
108+ for typeset in typesets :
109+ for msg_type_string , module_path in typeset .items ():
110+ updated_msg_type_string = re .sub (
111+ r"(\d+\.)?(\*|\d+)" , to_check , msg_type_string
112+ )
113+ updated_typeset [updated_msg_type_string ] = module_path
114+ return updated_typeset
115+
116+ def _message_type_check_for_minor_verssion (self , version_definition ) -> bool :
117+ if not version_definition :
118+ return False
119+ curr_minor_version = version_definition ["current_minor_version" ]
120+ min_minor_version = version_definition ["minimum_minor_version" ]
121+ return bool (curr_minor_version >= 1 and curr_minor_version >= min_minor_version )
122+
123+ def _create_and_register_updated_typesets (self , typesets , version_definition ):
124+ updated_typesets = self .create_msg_types_for_minor_version (
125+ typesets , version_definition
126+ )
127+ update_flag = False
128+ for typeset in updated_typesets :
129+ if typeset :
130+ self ._typemap .update (typeset )
131+ update_flag = True
132+ if update_flag :
133+ return updated_typesets
134+ else :
135+ return None
136+
137+ def _update_version_map (self , message_type_string , module_path , version_definition ):
138+ parsed_type_string = self .parse_type_string (message_type_string )
139+
140+ if version_definition ["major_version" ] not in self ._versionmap :
141+ self ._versionmap [version_definition ["major_version" ]] = []
142+
143+ self ._versionmap [version_definition ["major_version" ]].append (
144+ {
145+ "parsed_type_string" : parsed_type_string ,
146+ "version_definition" : version_definition ,
147+ "message_module" : module_path ,
148+ }
149+ )
150+
77151 def register_message_types (self , * typesets , version_definition = None ):
78152 """
79153 Add new supported message types.
@@ -85,24 +159,27 @@ def register_message_types(self, *typesets, version_definition=None):
85159 """
86160
87161 # Maintain support for versionless protocol modules
88- for typeset in typesets :
89- self ._typemap .update (typeset )
162+ updated_typesets = None
163+ minor_versions_supported = self ._message_type_check_for_minor_verssion (
164+ version_definition
165+ )
166+ if not minor_versions_supported :
167+ for typeset in typesets :
168+ self ._typemap .update (typeset )
90169
91170 # Track versioned modules for version routing
92171 if version_definition :
172+ # create updated typesets for minor versions and register them
173+ if minor_versions_supported :
174+ updated_typesets = self ._create_and_register_updated_typesets (
175+ typesets , version_definition
176+ )
177+ if updated_typesets :
178+ typesets = updated_typesets
93179 for typeset in typesets :
94180 for message_type_string , module_path in typeset .items ():
95- parsed_type_string = self .parse_type_string (message_type_string )
96-
97- if version_definition ["major_version" ] not in self ._versionmap :
98- self ._versionmap [version_definition ["major_version" ]] = []
99-
100- self ._versionmap [version_definition ["major_version" ]].append (
101- {
102- "parsed_type_string" : parsed_type_string ,
103- "version_definition" : version_definition ,
104- "message_module" : module_path ,
105- }
181+ self ._update_version_map (
182+ message_type_string , module_path , version_definition
106183 )
107184
108185 def register_controllers (self , * controller_sets , version_definition = None ):
0 commit comments