From 85b432ec98cd1b4b5ed796fde882ca4d56469bdc Mon Sep 17 00:00:00 2001 From: Jeremy Schoemaker Date: Tue, 25 Aug 2026 15:52:58 -0500 Subject: [PATCH 1/3] fix(beam): guard jinja_variable_flags collision with pipeline options Fix verified RED->GREEN. Yaml jinja variable exact-name collision steals pipeline option at main.py:64 --- sdks/python/apache_beam/yaml/main.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sdks/python/apache_beam/yaml/main.py b/sdks/python/apache_beam/yaml/main.py index 804798b82e02..4a36c9da59e4 100644 --- a/sdks/python/apache_beam/yaml/main.py +++ b/sdks/python/apache_beam/yaml/main.py @@ -61,7 +61,17 @@ def _preparse_jinja_flags(argv): return argv jinja_variable_parser = argparse.ArgumentParser(allow_abbrev=False) + # Guard against jinja_variable_flags colliding with pipeline options. + # If a flag collides with a known pipeline option, skip it and require + # the variable to be provided via --jinja_variables JSON instead. + try: + from apache_beam.options.pipeline_options import PipelineOptions + _pipeline_option_names = set(PipelineOptions([]).get_all_options().keys()) + except Exception: + _pipeline_option_names = set() for flag_name in jinja_args.jinja_variable_flags: + if flag_name.replace('-', '_') in _pipeline_option_names: + continue jinja_variable_parser.add_argument('--' + flag_name) jinja_flag_variables, pipeline_args = jinja_variable_parser.parse_known_args( other_args) From ecb8abc1bc07b065dcbcc0801998733e70d4e334 Mon Sep 17 00:00:00 2001 From: Jeremy Schoemaker Date: Thu, 27 Aug 2026 15:38:44 -0500 Subject: [PATCH 2/3] test(beam): cover jinja_variable_flags pipeline option collision --- sdks/python/apache_beam/yaml/main_test.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sdks/python/apache_beam/yaml/main_test.py b/sdks/python/apache_beam/yaml/main_test.py index 43b8caa1853b..c22d5e8b98e0 100644 --- a/sdks/python/apache_beam/yaml/main_test.py +++ b/sdks/python/apache_beam/yaml/main_test.py @@ -145,6 +145,21 @@ def test_preparse_jinja_flags(self): 'pos_arg', ]) + def test_preparse_jinja_flags_pipeline_option_collision(self): + # A jinja_variable_flags entry that collides with a known pipeline + # option (e.g. runner) must not swallow the pipeline flag. + argv = [ + '--jinja_variable_flags=runner,var', + '--runner=DirectRunner', + '--var=my_line', + ] + self.assertCountEqual( + main._preparse_jinja_flags(argv), + [ + '--runner=DirectRunner', + '--jinja_variables=' + '{"var": "my_line"}', + ]) + def test_jinja_datetime(self): with tempfile.TemporaryDirectory() as tmpdir: out_path = os.path.join(tmpdir, 'out.txt') From 91111bf45066f21be5f635fad0403bf409d2b22f Mon Sep 17 00:00:00 2001 From: Jeremy Schoemaker Date: Thu, 27 Aug 2026 20:10:33 -0500 Subject: [PATCH 3/3] fix(beam): apply yapf formatting to main_test.py --- sdks/python/apache_beam/yaml/main_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdks/python/apache_beam/yaml/main_test.py b/sdks/python/apache_beam/yaml/main_test.py index c22d5e8b98e0..3ef4feef11d1 100644 --- a/sdks/python/apache_beam/yaml/main_test.py +++ b/sdks/python/apache_beam/yaml/main_test.py @@ -154,8 +154,7 @@ def test_preparse_jinja_flags_pipeline_option_collision(self): '--var=my_line', ] self.assertCountEqual( - main._preparse_jinja_flags(argv), - [ + main._preparse_jinja_flags(argv), [ '--runner=DirectRunner', '--jinja_variables=' + '{"var": "my_line"}', ])