@@ -123,7 +123,6 @@ class X12Segment(abc.ABC, BaseModel):
123123 X12BaseSegment serves as the abstract base class for all X12 segment models.
124124 """
125125
126- delimiters : X12Delimiters = X12Delimiters ()
127126 segment_name : X12SegmentName
128127
129128 class Config :
@@ -134,37 +133,55 @@ class Config:
134133 use_enum_values = True
135134 extra = "forbid"
136135
137- def _process_multivalue_field (self , field_name : str , field_value : List ) -> str :
136+ def _process_multivalue_field (
137+ self ,
138+ field_name : str ,
139+ field_value : List ,
140+ custom_delimiters : X12Delimiters = None ,
141+ ) -> str :
138142 """
139143 Converts a X12 multi-value (list) field into a a single delimited string.
140144
141145 A "multi-value" field is a field which contains sub-fields, or components, or allows repeats.
142146 The X12 specification uses separate delimiters for component and repeating fields.
143147
148+ By default the method will use default X12 delimiters. Custom delimiters may be specified if desired using
149+ the `custom_delimiters` parameter.
150+
144151 :param field_name: The field name used to lookup field metadata.
145152 :param field_value: The field's list values
153+ :param custom_delimiters: Used when custom delimiters are required. Defaults to None.
146154 """
147155
156+ delimiters = custom_delimiters or X12Delimiters ()
148157 is_component_field : bool = self .__fields__ [field_name ].field_info .extra .get (
149158 "is_component" , False
150159 )
151160 if is_component_field :
152- join_character = self . delimiters .component_separator
161+ join_character = delimiters .component_separator
153162 else :
154- join_character = self . delimiters .repetition_separator
163+ join_character = delimiters .repetition_separator
155164 return join_character .join (field_value )
156165
157- def x12 (self ) -> str :
166+ def x12 (self , custom_delimiters : X12Delimiters = None ) -> str :
158167 """
168+ Generates a X12 formatted string for the segment.
169+ By default the method will use default X12 delimiters. Custom delimiters may be specified if desired using
170+ the `custom_delimiters` parameter.
171+
172+ :param custom_delimiters: Used when custom delimiters are required. Defaults to None.
159173 :return: the X12 representation of the model instance
160174 """
161175
176+ delimiters = custom_delimiters or X12Delimiters ()
162177 x12_values = []
163- for k , v in self .dict (exclude = { "delimiters" } ).items ():
178+ for k , v in self .dict ().items ():
164179 if isinstance (v , str ):
165180 x12_values .append (v )
166181 elif isinstance (v , list ):
167- x12_values .append (self ._process_multivalue_field (k , v ))
182+ x12_values .append (
183+ self ._process_multivalue_field (k , v , custom_delimiters = delimiters )
184+ )
168185 elif isinstance (v , datetime .datetime ):
169186 x12_values .append (v .strftime ("%Y%m%d%H%M" ))
170187 elif isinstance (v , datetime .date ):
@@ -178,21 +195,31 @@ def x12(self) -> str:
178195 else :
179196 x12_values .append (str (v ))
180197
181- x12_str = self . delimiters .element_separator .join (x12_values ).rstrip (
182- self . delimiters .element_separator
198+ x12_str = delimiters .element_separator .join (x12_values ).rstrip (
199+ delimiters .element_separator
183200 )
184- return x12_str + self . delimiters .segment_terminator
201+ return x12_str + delimiters .segment_terminator
185202
186203
187204class X12SegmentGroup (abc .ABC , BaseModel ):
188205 """
189206 Abstract base class for a container, typically a loop or transaction, which groups x12 segments.
190207 """
191208
192- def x12 (self , use_new_lines = True ) -> str :
209+ def x12 (
210+ self , use_new_lines : bool = True , custom_delimiters : X12Delimiters = None
211+ ) -> str :
193212 """
213+ Generates a X12 formatted string for the segment.
214+
215+ By default the method will use default X12 delimiters. Custom delimiters may be specified if desired using
216+ the `custom_delimiters` parameter.
217+
218+ :param use_new_lines: Indicates if the X12 output includes newline characters. Defaults to True.
219+ :param custom_delimiters: Used when custom delimiters are required. Defaults to None.
194220 :return: Generates a X12 representation of the loop using its segments.
195221 """
222+ delimiters = custom_delimiters or X12Delimiters ()
196223 x12_segments : List [str ] = []
197224 fields = [f for f in self .__fields__ .values () if hasattr (f .type_ , "x12" )]
198225
@@ -204,14 +231,25 @@ def x12(self, use_new_lines=True) -> str:
204231 elif isinstance (field_instance , list ):
205232 for item in field_instance :
206233 if isinstance (item , X12Segment ):
207- x12_segments .append (item .x12 ())
234+ x12_segments .append (item .x12 (custom_delimiters = delimiters ))
208235 else :
209- x12_segments .append (item .x12 (use_new_lines = use_new_lines ))
236+ x12_segments .append (
237+ item .x12 (
238+ use_new_lines = use_new_lines ,
239+ custom_delimiters = delimiters ,
240+ )
241+ )
210242 else :
211243 if isinstance (field_instance , X12Segment ):
212- x12_segments .append (field_instance .x12 ())
244+ x12_segments .append (
245+ field_instance .x12 (custom_delimiters = delimiters )
246+ )
213247 else :
214- x12_segments .append (field_instance .x12 (use_new_lines = use_new_lines ))
248+ x12_segments .append (
249+ field_instance .x12 (
250+ use_new_lines = use_new_lines , custom_delimiters = delimiters
251+ )
252+ )
215253
216254 join_char : str = "\n " if use_new_lines else ""
217255 return join_char .join (x12_segments )
0 commit comments