Check for ABAP language version during serialize (#6681)

This commit is contained in:
Marc Bernard 2023-12-05 15:10:24 -05:00 committed by GitHub
parent 8fc84426a7
commit 61cb8175d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 148 additions and 37 deletions

View File

@ -84,10 +84,14 @@ CLASS zcl_abapgit_objects_super DEFINITION
zcx_abapgit_exception .
METHODS set_abap_language_version
CHANGING
!cv_abap_language_version TYPE uccheck.
!cv_abap_language_version TYPE uccheck
RAISING
zcx_abapgit_exception .
METHODS clear_abap_language_version
CHANGING
!cv_abap_language_version TYPE uccheck.
!cv_abap_language_version TYPE uccheck
RAISING
zcx_abapgit_exception .
PRIVATE SECTION.
ENDCLASS.
@ -99,9 +103,14 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION.
METHOD clear_abap_language_version.
" Used during serializing of objects
IF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version.
" ABAP language version is defined in repo setting so there's no need to serialize it
IF ms_item-abap_language_version = zcl_abapgit_abap_language_vers=>c_no_abap_language_version.
" Ignore ABAP language version
CLEAR cv_abap_language_version.
ELSEIF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version.
" Check if ABAP language version matches repository setting
zcl_abapgit_abap_language_vers=>check_abap_language_version(
iv_abap_language_version = cv_abap_language_version
is_item = ms_item ).
ENDIF.
ENDMETHOD.
@ -301,9 +310,14 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION.
METHOD set_abap_language_version.
" Used during deserializing of objects
IF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version.
" ABAP language version is defined in repo setting so set it accordingly
IF ms_item-abap_language_version = zcl_abapgit_abap_language_vers=>c_no_abap_language_version.
" ABAP language version is derived from object type and target package (see zcl_abapgit_objects->deserialize)
cv_abap_language_version = ms_item-abap_language_version.
ELSEIF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version.
" Check if ABAP language version matches repository setting
zcl_abapgit_abap_language_vers=>check_abap_language_version(
iv_abap_language_version = cv_abap_language_version
is_item = ms_item ).
ENDIF.
ENDMETHOD.

View File

@ -31,6 +31,13 @@ CLASS zcl_abapgit_abap_language_vers DEFINITION
RETURNING
VALUE(rv_allowed) TYPE abap_bool.
CLASS-METHODS check_abap_language_version
IMPORTING
!iv_abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version
!is_item TYPE zif_abapgit_definitions=>ty_item
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
PRIVATE SECTION.
@ -55,6 +62,12 @@ CLASS zcl_abapgit_abap_language_vers DEFINITION
RETURNING
VALUE(rv_abap_language_version) TYPE string.
CLASS-METHODS get_description
IMPORTING
!iv_abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version
RETURNING
VALUE(rv_description) TYPE string.
ENDCLASS.
@ -62,14 +75,27 @@ ENDCLASS.
CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION.
METHOD check_abap_language_version.
" Check if ABAP language version matches repository setting
IF iv_abap_language_version <> is_item-abap_language_version.
zcx_abapgit_exception=>raise(
|Object { is_item-obj_type } { is_item-obj_name } has { get_description( iv_abap_language_version ) }| &&
| but repository is set to { get_description( is_item-abap_language_version ) }| ).
ENDIF.
ENDMETHOD.
METHOD constructor.
mo_dot_abapgit = io_dot_abapgit.
IF zcl_abapgit_feature=>is_enabled( c_feature_flag ) = abap_false.
mv_has_abap_language_vers = abap_false.
ELSEIF get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined
OR get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
mv_has_abap_language_vers = abap_undefined.
ELSEIF get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
mv_has_abap_language_vers = abap_undefined.
ELSEIF get_abap_language_vers_by_repo( ) = zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
mv_has_abap_language_vers = abap_false.
ELSE.
mv_has_abap_language_vers = abap_true.
@ -87,7 +113,6 @@ CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION.
lv_class = 'CL_ABAP_LANGUAGE_VERSION_CFG'.
TRY.
CALL METHOD (lv_class)=>('GET_INSTANCE')
RECEIVING
ro_instance = lo_abap_language_version_cfg.
@ -114,6 +139,7 @@ CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION.
WHEN OTHERS.
rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
ENDCASE.
CATCH cx_root.
rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
ENDTRY.
@ -126,30 +152,32 @@ CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION.
DATA lv_class TYPE string.
DATA lo_abap_language_version TYPE REF TO object.
IF mv_has_abap_language_vers = abap_false.
IF mv_has_abap_language_vers = abap_undefined.
rv_allowed_abap_langu_version = c_any_abap_language_version.
RETURN. ">>>
ELSEIF mv_has_abap_language_vers = abap_false.
rv_allowed_abap_langu_version = c_no_abap_language_version.
ELSE. " abap_true
lv_class = 'CL_ABAP_LANGUAGE_VERSION'.
TRY.
CALL METHOD (lv_class)=>('GET_INSTANCE')
RECEIVING
ro_version_handler = lo_abap_language_version.
CALL METHOD lo_abap_language_version->('IF_ABAP_LANGUAGE_VERSION~GET_DEFAULT_VERSION')
EXPORTING
iv_object_type = iv_object_type
iv_package = iv_package
RECEIVING
rv_default_version = rv_allowed_abap_langu_version.
CATCH cx_root.
rv_allowed_abap_langu_version = get_default_abap_language_vers( iv_object_type ).
ENDTRY.
ENDIF.
lv_class = 'CL_ABAP_LANGUAGE_VERSION'.
TRY.
CALL METHOD (lv_class)=>('GET_INSTANCE')
RECEIVING
ro_version_handler = lo_abap_language_version.
CALL METHOD lo_abap_language_version->('IF_ABAP_LANGUAGE_VERSION~GET_DEFAULT_VERSION')
EXPORTING
iv_object_type = iv_object_type
iv_package = iv_package
RECEIVING
rv_default_version = rv_allowed_abap_langu_version.
CATCH cx_root.
rv_allowed_abap_langu_version = get_default_abap_language_vers( iv_object_type ).
ENDTRY.
ENDMETHOD.
@ -179,11 +207,32 @@ CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION.
ENDMETHOD.
METHOD get_description.
CASE iv_abap_language_version.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-standard
OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
rv_description = 'Standard ABAP'.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-key_user
OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-key_user.
rv_description = 'ABAP for Key Users'.
WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development
OR zif_abapgit_aff_types_v1=>co_abap_language_version_src-cloud_development.
rv_description = 'ABAP for Cloud Development'.
WHEN OTHERS.
rv_description = 'Undefined'.
ENDCASE.
rv_description = |ABAP language version "{ rv_description }"|.
ENDMETHOD.
METHOD get_repo_abap_language_version.
DATA lv_abap_language_version TYPE string.
IF mv_has_abap_language_vers = abap_true.
IF mv_has_abap_language_vers <> abap_undefined. " abap_true or abap_false
lv_abap_language_version = mo_dot_abapgit->get_abap_language_version( ).
ENDIF.

View File

@ -120,7 +120,9 @@ CLASS ltcl_abap_language_version DEFINITION FOR TESTING RISK LEVEL HARMLESS
repo_setting_feature_on FOR TESTING,
object_type_feature_off FOR TESTING,
object_type_feature_on FOR TESTING,
is_import_allowed FOR TESTING.
is_import_allowed FOR TESTING,
check_abap_language_vers_same FOR TESTING RAISING zcx_abapgit_exception,
check_abap_language_vers_diff FOR TESTING.
ENDCLASS.
@ -208,13 +210,18 @@ CLASS ltcl_abap_language_version IMPLEMENTATION.
LOOP AT mt_versions INTO lv_version.
CASE lv_version.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined
OR zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
repo_setting_test(
iv_version = lv_version
iv_exp = zcl_abapgit_abap_language_vers=>c_any_abap_language_version ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
repo_setting_test(
iv_version = lv_version
iv_exp = zcl_abapgit_abap_language_vers=>c_no_abap_language_version ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
repo_setting_test(
@ -317,8 +324,7 @@ CLASS ltcl_abap_language_version IMPLEMENTATION.
LOOP AT mt_versions INTO lv_version.
CASE lv_version.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined
OR zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
object_type_test(
iv_version = lv_version
@ -327,6 +333,15 @@ CLASS ltcl_abap_language_version IMPLEMENTATION.
iv_cloud = zcl_abapgit_abap_language_vers=>c_any_abap_language_version
iv_cloud_src = zcl_abapgit_abap_language_vers=>c_any_abap_language_version ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-ignore.
object_type_test(
iv_version = lv_version
iv_standard = zcl_abapgit_abap_language_vers=>c_no_abap_language_version
iv_standard_src = zcl_abapgit_abap_language_vers=>c_no_abap_language_version
iv_cloud = zcl_abapgit_abap_language_vers=>c_no_abap_language_version
iv_cloud_src = zcl_abapgit_abap_language_vers=>c_no_abap_language_version ).
WHEN OTHERS.
object_type_test(
@ -429,4 +444,37 @@ CLASS ltcl_abap_language_version IMPLEMENTATION.
ENDMETHOD.
METHOD check_abap_language_vers_same.
DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
ls_item-obj_type = 'CLAS'.
ls_item-obj_name = 'ZCL_FOO_BAR'.
ls_item-abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
" Does not throw
zcl_abapgit_abap_language_vers=>check_abap_language_version(
iv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard
is_item = ls_item ).
ENDMETHOD.
METHOD check_abap_language_vers_diff.
DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
ls_item-obj_type = 'CLAS'.
ls_item-obj_name = 'ZCL_FOO_BAR'.
ls_item-abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
TRY.
zcl_abapgit_abap_language_vers=>check_abap_language_version(
iv_abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development
is_item = ls_item ).
cl_abap_unit_assert=>fail( ).
CATCH zcx_abapgit_exception ##NO_HANDLER.
ENDTRY.
ENDMETHOD.
ENDCLASS.