@@ -193,7 +193,8 @@ def parse(self, example, concerns):
193193 input_prefix_len_range = options ['input_prefix_range' ]
194194 expected_regexs , charnos , rcounts , tags_by_idx , input_list = self .expected_as_regexs (
195195 example .expected_str , options ['tags' ], options ['capture' ],
196- options ['type' ], options ['norm_ws' ], input_prefix_len_range
196+ options ['type' ], options ['norm_ws' ], input_prefix_len_range ,
197+ options ['ignore_first_empty_lines' ]
197198 )
198199
199200 ExpectedClass = _LinearExpected
@@ -230,8 +231,14 @@ def parse(self, example, concerns):
230231
231232 @profile
232233 def expected_as_regexs (
233- self , expected , tags_enabled , capture_enabled , input_enabled ,
234- normalize_whitespace , input_prefix_len_range
234+ self ,
235+ expected ,
236+ tags_enabled ,
237+ capture_enabled ,
238+ input_enabled ,
239+ normalize_whitespace ,
240+ input_prefix_len_range ,
241+ ignore_first_empty_lines = True
235242 ):
236243 r'''
237244 From the expected string create a list of regular expressions that
@@ -262,8 +269,8 @@ def expected_as_regexs(
262269
263270 We return the regexs
264271
265- >>> regexs
266- ('\\A', 'a', '(?P<foo>.*?)', 'b', '(?P<bar>.*?)', 'c', '\\n*\\Z')
272+ >>> regexs # byexample: +norm-ws
273+ ('\\A(?:[ \\t]*\\n)*? ', 'a', '(?P<foo>.*?)', 'b', '(?P<bar>.*?)', 'c', '\\n*\\Z')
267274
268275 >>> m = re.compile(''.join(regexs), re.MULTILINE | re.DOTALL)
269276 >>> m.match('axxbyyyc').groups()
@@ -300,7 +307,7 @@ def expected_as_regexs(
300307 >>> regexs, _, _, tags_by_idx, _ = _as_regexs(expected, normalize_whitespace=True)
301308
302309 >>> regexs # byexample: +norm-ws
303- ('\\A', 'a', '(?:.*?)(?<!\\s)', '\\s+(?!\\s)', '(?P<foo_bar>.*?)', 'c', '\\s*\\Z')
310+ ('\\A\\s*? ', 'a', '(?:.*?)(?<!\\s)', '\\s+(?!\\s)', '(?P<foo_bar>.*?)', 'c', '\\s*\\Z')
304311
305312 >>> tags_by_idx
306313 {2: None, 4: 'foo-bar'}
@@ -315,7 +322,7 @@ def expected_as_regexs(
315322 >>> regexs, _, _, tags_by_idx, _ = _as_regexs(expected)
316323
317324 >>> regexs
318- ('\\A', 'a<foo>b<bar>c', '\\n*\\Z')
325+ ('\\A(?:[ \\t]*\\n)*? ', 'a<foo>b<bar>c', '\\n*\\Z')
319326
320327 >>> tags_by_idx
321328 {}
@@ -324,11 +331,24 @@ def expected_as_regexs(
324331 >>> regexs, _, _, tags_by_idx, _ = _as_regexs(expected)
325332
326333 >>> regexs
327- ('\\A', 'a', '(?:.*?)', 'b<bar>c', '\\n*\\Z')
334+ ('\\A(?:[ \\t]*\\n)*? ', 'a', '(?:.*?)', 'b<bar>c', '\\n*\\Z')
328335
329336 >>> tags_by_idx
330337 {2: None}
331338
339+ When ignore_first_empty_lines is False the begin anchor is a plain \\A,
340+ so the got string must start exactly at the first expected character.
341+
342+ >>> regexs, _, _, _, _ = _as_regexs('foo', ignore_first_empty_lines=False)
343+
344+ >>> regexs
345+ ('\\A', 'foo', '\\n*\\Z')
346+
347+ >>> regexs, _, _, _, _ = _as_regexs('foo', normalize_whitespace=True, ignore_first_empty_lines=False)
348+
349+ >>> regexs
350+ ('\\A', 'foo', '\\s*\\Z')
351+
332352 '''
333353 if capture_enabled :
334354 tag_regexs = self .tag_regexs ()
@@ -338,12 +358,12 @@ def expected_as_regexs(
338358 if normalize_whitespace :
339359 sm = SM_NormWS (
340360 tag_regexs , self .input_regexs (), self .ellipsis_marker (),
341- input_prefix_len_range
361+ input_prefix_len_range , ignore_first_empty_lines
342362 )
343363 else :
344364 sm = SM_NotNormWS (
345365 tag_regexs , self .input_regexs (), self .ellipsis_marker (),
346- input_prefix_len_range
366+ input_prefix_len_range , ignore_first_empty_lines
347367 )
348368
349369 return sm .parse (expected , tags_enabled , input_enabled )
@@ -433,7 +453,7 @@ def _extend_parser_and_parse_options_strictly_and_cache(self, optlist):
433453>>> regexs, _, _, _, _ = _as_regexs(expected, normalize_whitespace=True)
434454
435455>>> regexs
436- ('\\A',
456+ ('\\A\\s*? ',
437457 'ex',
438458 '\\s',
439459 '(?:\\s*(?!\\s)(?:.+)(?<!\\s))?',
@@ -450,7 +470,7 @@ def _extend_parser_and_parse_options_strictly_and_cache(self, optlist):
450470>>> regexs, _, _, _, _ = _as_regexs(expected, normalize_whitespace=True)
451471
452472>>> regexs
453- ('\\A',
473+ ('\\A\\s*? ',
454474 'ex',
455475 '\\s',
456476 '(?:\\s*(?!\\s)(?P<foo>.+?)(?<!\\s))?',
0 commit comments