From ed316864df66f305caf4c051fbdf51b0e2557224 Mon Sep 17 00:00:00 2001 From: Steve Goldhaber Date: Sat, 15 Feb 2025 21:11:57 +0100 Subject: [PATCH 1/3] Add an option for pre-registered DDT names Add ccpp_constituent_prop_ptr_t as default DDT Add test for 'unknown' DDT variables --- scripts/ccpp_fortran_to_metadata.py | 10 ++++++++++ scripts/parse_tools/__init__.py | 4 +++- scripts/parse_tools/parse_checkers.py | 2 +- test/test_fortran_to_metadata.F90 | 28 +++++++++++++++++++++++++++ test/test_fortran_to_metadata.sh | 15 ++++++++++++++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 test/test_fortran_to_metadata.F90 create mode 100755 test/test_fortran_to_metadata.sh diff --git a/scripts/ccpp_fortran_to_metadata.py b/scripts/ccpp_fortran_to_metadata.py index 4c301d1d..afb3597d 100755 --- a/scripts/ccpp_fortran_to_metadata.py +++ b/scripts/ccpp_fortran_to_metadata.py @@ -39,6 +39,7 @@ from parse_tools import init_log, set_log_level from parse_tools import CCPPError, ParseInternalError from parse_tools import reset_standard_name_counter, unique_standard_name +from parse_tools import register_fortran_ddt_name from fortran_tools import parse_fortran_file from file_utils import create_file_list from metadata_table import blank_metadata_line @@ -67,6 +68,10 @@ def parse_command_line(args, description): metavar='VARDEF1[,VARDEF2 ...]', type=str, default='', help="Proprocessor directives used to correctly parse source files") + parser.add_argument("--ddt-names", + metavar='DDT_NAME1[,DDT_NAME2 ...]', type=str, default='', + help="Comma-separated DDT names that may be used in the parsed Fortran files") + parser.add_argument("--output-root", type=str, metavar='', default=os.getcwd(), @@ -198,6 +203,11 @@ def _main_func(): elif verbosity > 0: set_log_level(_LOGGER, logging.INFO) # end if + if args.ddt_names: + for dname in args.ddt_names.split(','): + register_fortran_ddt_name(dname) + # end for + # end if # Make sure we know where output is going output_dir = os.path.abspath(args.output_root) # Optional table separator comment diff --git a/scripts/parse_tools/__init__.py b/scripts/parse_tools/__init__.py index 309bbda0..bfd2cfbf 100644 --- a/scripts/parse_tools/__init__.py +++ b/scripts/parse_tools/__init__.py @@ -21,6 +21,7 @@ from parse_checkers import fortran_list_match from parse_checkers import registered_fortran_ddt_name from parse_checkers import register_fortran_ddt_name +from parse_checkers import registered_fortran_ddt_names from parse_checkers import check_units, check_dimensions, check_cf_standard_name from parse_checkers import check_default_value, check_valid_values, check_molar_mass from parse_log import init_log, set_log_level, flush_log @@ -65,9 +66,10 @@ 'ParseObject', 'PreprocStack', 'PrettyElementTree', - 'register_fortran_ddt_name', 'read_xml_file', + 'register_fortran_ddt_name', 'registered_fortran_ddt_name', + 'registered_fortran_ddt_names', 'reset_standard_name_counter', 'set_log_level', 'set_log_to_file', diff --git a/scripts/parse_tools/parse_checkers.py b/scripts/parse_tools/parse_checkers.py index 469bf1d0..70d44c92 100755 --- a/scripts/parse_tools/parse_checkers.py +++ b/scripts/parse_tools/parse_checkers.py @@ -229,7 +229,7 @@ def check_cf_standard_name(test_val, prop_dict, error): FORTRAN_DP_RE = re.compile(r"(?i)double\s*precision") FORTRAN_TYPE_RE = re.compile(r"(?i)type\s*\(\s*("+FORTRAN_ID+r")\s*\)") -_REGISTERED_FORTRAN_DDT_NAMES = [] +_REGISTERED_FORTRAN_DDT_NAMES = ["ccpp_constituent_prop_ptr_t"] ######################################################################## diff --git a/test/test_fortran_to_metadata.F90 b/test/test_fortran_to_metadata.F90 new file mode 100644 index 00000000..ff4542c4 --- /dev/null +++ b/test/test_fortran_to_metadata.F90 @@ -0,0 +1,28 @@ +module dme_adjust + + use ccpp_kinds, only: kind_phys + + implicit none + +contains +!=============================================================================== +!> \section arg_table_do_stuff_run Argument Table +!! \htmlinclude do_stuff_run.html +!! + subroutine do_stuff_run(const_props, twilight_zone, errmsg, errflg) + ! + ! Arguments + ! + type(ccpp_constituent_prop_ptr_t), intent(in) :: const_props(:) + type(serling_t), intent(inout) :: twilight_zone + + character(len=512), intent(out) :: errmsg + integer, intent(out) :: errflg + + errmsg = ' ' + errflg = 0 + twilight_zone('adjust_set') + + end subroutine dme_adjust_run + +end module dme_adjust diff --git a/test/test_fortran_to_metadata.sh b/test/test_fortran_to_metadata.sh new file mode 100755 index 00000000..a06b5b43 --- /dev/null +++ b/test/test_fortran_to_metadata.sh @@ -0,0 +1,15 @@ +#! /bin/bash + +## Relevant directories and file paths +test_dir="$(dirname ${0})" +script_dir="$(dirname ${test_dir})/scripts" +f2m_script="${script_dir}/ccpp_fortran_to_metadata.py" +filename="test_fortran_to_metadata" +test_input="${test_dir}/${filename}.F90" +tmp_dir="${test_dir}/unit_tests/tmp" +sample_files="${test_dir}/unit_tests/sample_files" +sample_meta="${sample_files}/check_fortran_to_metadata.meta" + +# Run the script +opts="--ddt-names serling_t" +${f2m_script} --output-root "${tmp_dir}" ${opts} "${test_input}" From ac67b47f38c0a938e6f90b4b6cfcccad70b18797 Mon Sep 17 00:00:00 2001 From: Steve Goldhaber Date: Sat, 15 Feb 2025 21:32:23 +0100 Subject: [PATCH 2/3] Add (and check) check metadata file --- test/test_fortran_to_metadata.sh | 22 +++++++++++++ .../check_fortran_to_metadata.meta | 31 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 test/unit_tests/sample_files/check_fortran_to_metadata.meta diff --git a/test/test_fortran_to_metadata.sh b/test/test_fortran_to_metadata.sh index a06b5b43..ac475994 100755 --- a/test/test_fortran_to_metadata.sh +++ b/test/test_fortran_to_metadata.sh @@ -13,3 +13,25 @@ sample_meta="${sample_files}/check_fortran_to_metadata.meta" # Run the script opts="--ddt-names serling_t" ${f2m_script} --output-root "${tmp_dir}" ${opts} "${test_input}" +res=$? + +retval=0 +if [ ${res} -ne 0 ]; then + echo "FAIL: ccpp_fortran_to_metadata.py exited with error ${res}" + retval=${res} +elif [ ! -f "${tmp_dir}/${filename}.meta" ]; then + echo "FAIL: metadata file, '${tmp_dir}/${filename}.meta', not created" + retval=1 +else + cmp --quiet "${sample_meta}" "${tmp_dir}/${filename}.meta" + res=$? + if [ ${res} -ne 0 ]; then + echo "FAIL: Comparison with correct metadata file failed" + retval=${res} + else + echo "PASS" + # Cleanup + rm "${tmp_dir}/${filename}.meta" + fi +fi +exit ${retval} diff --git a/test/unit_tests/sample_files/check_fortran_to_metadata.meta b/test/unit_tests/sample_files/check_fortran_to_metadata.meta new file mode 100644 index 00000000..7d84546b --- /dev/null +++ b/test/unit_tests/sample_files/check_fortran_to_metadata.meta @@ -0,0 +1,31 @@ +[ccpp-table-properties] + name = do_stuff + type = scheme + +[ccpp-arg-table] + name = do_stuff_run + type = scheme +[ const_props ] + standard_name = enter_standard_name_1 + units = enter_units + type = ccpp_constituent_prop_ptr_t + dimensions = (enter_standard_name_5:enter_standard_name_6) + intent = in +[ twilight_zone ] + standard_name = enter_standard_name_2 + units = enter_units + type = serling_t + dimensions = () + intent = inout +[ errmsg ] + standard_name = enter_standard_name_3 + units = enter_units + type = character | kind = len=512 + dimensions = () + intent = out +[ errflg ] + standard_name = enter_standard_name_4 + units = enter_units + type = integer + dimensions = () + intent = out From cf6f3670a3b0466c1f929bb96d21700dbb347b5d Mon Sep 17 00:00:00 2001 From: Steve Goldhaber Date: Wed, 19 Feb 2025 11:34:59 +0100 Subject: [PATCH 3/3] Clean test, add to workflow --- .github/workflows/capgen_unit_tests.yaml | 3 ++- test/test_fortran_to_metadata.sh | 8 ++++---- .../sample_files}/test_fortran_to_metadata.F90 | 0 3 files changed, 6 insertions(+), 5 deletions(-) rename test/{ => unit_tests/sample_files}/test_fortran_to_metadata.F90 (100%) diff --git a/.github/workflows/capgen_unit_tests.yaml b/.github/workflows/capgen_unit_tests.yaml index 820553af..4d871a52 100644 --- a/.github/workflows/capgen_unit_tests.yaml +++ b/.github/workflows/capgen_unit_tests.yaml @@ -18,4 +18,5 @@ jobs: run: sudo apt-get update && sudo apt-get install -y build-essential ${{matrix.fortran-compiler}} cmake python3 git libxml2-utils - name: Run unit tests run: cd test && ./run_fortran_tests.sh - + - name: Run Fortran to metadata test + run: cd test && ./test_fortran_to_metadata.sh diff --git a/test/test_fortran_to_metadata.sh b/test/test_fortran_to_metadata.sh index ac475994..adedaac6 100755 --- a/test/test_fortran_to_metadata.sh +++ b/test/test_fortran_to_metadata.sh @@ -1,14 +1,14 @@ #! /bin/bash ## Relevant directories and file paths -test_dir="$(dirname ${0})" +test_dir="$(cd $(dirname ${0}); pwd -P)" script_dir="$(dirname ${test_dir})/scripts" +sample_files_dir="${test_dir}/unit_tests/sample_files" f2m_script="${script_dir}/ccpp_fortran_to_metadata.py" filename="test_fortran_to_metadata" -test_input="${test_dir}/${filename}.F90" +test_input="${sample_files_dir}/${filename}.F90" tmp_dir="${test_dir}/unit_tests/tmp" -sample_files="${test_dir}/unit_tests/sample_files" -sample_meta="${sample_files}/check_fortran_to_metadata.meta" +sample_meta="${sample_files_dir}/check_fortran_to_metadata.meta" # Run the script opts="--ddt-names serling_t" diff --git a/test/test_fortran_to_metadata.F90 b/test/unit_tests/sample_files/test_fortran_to_metadata.F90 similarity index 100% rename from test/test_fortran_to_metadata.F90 rename to test/unit_tests/sample_files/test_fortran_to_metadata.F90