ENHO: Split code into separate files (#4951)

* ENHO: Split code into separate files

Similarly to class enhancements where enhanced methods are stored as individual files, this change separates the code for implicit enhancements (type `HOOK_IMPL`) into abap-files.

This makes the code more readable (instead of being embedded and escaped into XML) and allows for linting.

* Switch to filenames with hash

* CI

* Filenames in XML

* Lint

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2021-09-24 00:34:01 -04:00 committed by GitHub
parent 6761998a5d
commit 9038b31921
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 141 additions and 18 deletions

View File

@ -10,20 +10,44 @@ CLASS zcl_abapgit_object_enho_hook DEFINITION PUBLIC.
PROTECTED SECTION.
PRIVATE SECTION.
TYPES: BEGIN OF ty_spaces,
full_name TYPE string.
TYPES: spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
full_name TYPE string,
spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
END OF ty_spaces.
TYPES: ty_spaces_tt TYPE STANDARD TABLE OF ty_spaces WITH DEFAULT KEY.
TYPES: BEGIN OF ty_file,
name TYPE string,
file TYPE string,
END OF ty_file.
TYPES: ty_files TYPE HASHED TABLE OF ty_file WITH UNIQUE KEY name.
CONSTANTS c_enhancement TYPE string VALUE 'ENHANCEMENT 0 *.' ##NO_TEXT.
CONSTANTS c_endenhancement TYPE string VALUE 'ENDENHANCEMENT.' ##NO_TEXT.
DATA: ms_item TYPE zif_abapgit_definitions=>ty_item.
DATA: mo_files TYPE REF TO zcl_abapgit_objects_files.
METHODS add_sources
CHANGING
!ct_enhancements TYPE enh_hook_impl_it
!ct_files TYPE ty_files
RAISING
zcx_abapgit_exception .
METHODS read_sources
CHANGING
!ct_enhancements TYPE enh_hook_impl_it
!ct_files TYPE ty_files
RAISING
zcx_abapgit_exception .
METHODS hook_impl_deserialize
IMPORTING it_spaces TYPE ty_spaces_tt
CHANGING ct_impl TYPE enh_hook_impl_it
RAISING zcx_abapgit_exception.
IMPORTING
!it_spaces TYPE ty_spaces_tt
CHANGING
!ct_impl TYPE enh_hook_impl_it
RAISING
zcx_abapgit_exception .
ENDCLASS.
@ -31,6 +55,41 @@ ENDCLASS.
CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION.
METHOD add_sources.
DATA lv_source TYPE string.
DATA ls_file LIKE LINE OF ct_files.
FIELD-SYMBOLS <ls_enhancement> LIKE LINE OF ct_enhancements.
LOOP AT ct_enhancements ASSIGNING <ls_enhancement>.
" Use hash as filename since full_name is very long
CLEAR ls_file.
ls_file-name = <ls_enhancement>-full_name.
ls_file-file = substring(
val = zcl_abapgit_hash=>sha1_string( <ls_enhancement>-full_name )
len = 8 ).
INSERT ls_file INTO TABLE ct_files.
" Add full name as comment and put code between enhancement statements
lv_source = c_enhancement.
REPLACE '*' IN lv_source WITH ms_item-obj_name.
INSERT lv_source INTO <ls_enhancement>-source INDEX 1.
lv_source = |"Name: { <ls_enhancement>-full_name }|.
INSERT lv_source INTO <ls_enhancement>-source INDEX 1.
APPEND c_endenhancement TO <ls_enhancement>-source.
mo_files->add_abap( iv_extra = ls_file-file
it_abap = <ls_enhancement>-source ).
CLEAR <ls_enhancement>-source.
ENDLOOP.
ENDMETHOD.
METHOD constructor.
ms_item = is_item.
mo_files = io_files.
@ -62,6 +121,36 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION.
ENDMETHOD.
METHOD read_sources.
DATA lv_source TYPE string.
DATA ls_file LIKE LINE OF ct_files.
DATA lv_from TYPE i.
DATA lv_to TYPE i.
FIELD-SYMBOLS <ls_enhancement> LIKE LINE OF ct_enhancements.
LOOP AT ct_enhancements ASSIGNING <ls_enhancement>.
READ TABLE ct_files INTO ls_file WITH TABLE KEY name = <ls_enhancement>-full_name.
IF sy-subrc = 0.
<ls_enhancement>-source = mo_files->read_abap( iv_extra = ls_file-file ).
" Get code between enhancement statements
LOOP AT <ls_enhancement>-source INTO lv_source.
IF lv_source CP c_enhancement.
lv_from = sy-tabix.
ENDIF.
IF lv_source CP c_endenhancement.
lv_to = sy-tabix.
ENDIF.
ENDLOOP.
DELETE <ls_enhancement>-source FROM lv_to.
DELETE <ls_enhancement>-source TO lv_from.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_object_enho~deserialize.
DATA: lv_shorttext TYPE string,
@ -71,6 +160,7 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION.
lv_package TYPE devclass,
ls_original_object TYPE enh_hook_admin,
lt_spaces TYPE ty_spaces_tt,
lt_files TYPE ty_files,
lt_enhancements TYPE enh_hook_impl_it,
lx_enh_root TYPE REF TO cx_enh_root.
@ -83,6 +173,8 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION.
CHANGING cg_data = ls_original_object ).
ii_xml->read( EXPORTING iv_name = 'ENHANCEMENTS'
CHANGING cg_data = lt_enhancements ).
ii_xml->read( EXPORTING iv_name = 'FILES'
CHANGING cg_data = lt_files ).
ii_xml->read( EXPORTING iv_name = 'SPACES'
CHANGING cg_data = lt_spaces ).
@ -90,6 +182,9 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION.
hook_impl_deserialize( EXPORTING it_spaces = lt_spaces
CHANGING ct_impl = lt_enhancements ).
read_sources( CHANGING ct_enhancements = lt_enhancements
ct_files = lt_files ).
lv_enhname = ms_item-obj_name.
lv_package = iv_package.
TRY.
@ -139,11 +234,11 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION.
lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl,
ls_original_object TYPE enh_hook_admin,
lt_spaces TYPE ty_spaces_tt,
lt_files TYPE ty_files,
lt_enhancements TYPE enh_hook_impl_it.
FIELD-SYMBOLS: <ls_enhancement> LIKE LINE OF lt_enhancements.
lo_hook_impl ?= ii_enh_tool.
lv_shorttext = lo_hook_impl->if_enh_object_docu~get_shorttext( ).
@ -163,14 +258,19 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION.
<ls_enhancement>-id.
ENDLOOP.
add_sources( CHANGING ct_enhancements = lt_enhancements
ct_files = lt_files ).
ii_xml->add( iv_name = 'TOOL'
ig_data = ii_enh_tool->get_tool( ) ).
ii_xml->add( ig_data = lv_shorttext
iv_name = 'SHORTTEXT' ).
ii_xml->add( ig_data = ls_original_object
iv_name = 'ORIGINAL_OBJECT' ).
ii_xml->add( iv_name = 'SHORTTEXT'
ig_data = lv_shorttext ).
ii_xml->add( iv_name = 'ORIGINAL_OBJECT'
ig_data = ls_original_object ).
ii_xml->add( iv_name = 'ENHANCEMENTS'
ig_data = lt_enhancements ).
ii_xml->add( iv_name = 'FILES'
ig_data = lt_files ).
ii_xml->add( iv_name = 'SPACES'
ig_data = lt_spaces ).

View File

@ -17,7 +17,6 @@ CLASS zcl_abapgit_hash DEFINITION
VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1
RAISING
zcx_abapgit_exception .
CLASS-METHODS sha1_commit
IMPORTING
!iv_data TYPE xstring
@ -25,7 +24,6 @@ CLASS zcl_abapgit_hash DEFINITION
VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1
RAISING
zcx_abapgit_exception .
CLASS-METHODS sha1_tree
IMPORTING
!iv_data TYPE xstring
@ -33,7 +31,6 @@ CLASS zcl_abapgit_hash DEFINITION
VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1
RAISING
zcx_abapgit_exception .
CLASS-METHODS sha1_tag
IMPORTING
!iv_data TYPE xstring
@ -41,7 +38,6 @@ CLASS zcl_abapgit_hash DEFINITION
VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1
RAISING
zcx_abapgit_exception .
CLASS-METHODS sha1_blob
IMPORTING
!iv_data TYPE xstring
@ -49,8 +45,6 @@ CLASS zcl_abapgit_hash DEFINITION
VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1
RAISING
zcx_abapgit_exception .
CLASS-METHODS sha1_raw
IMPORTING
!iv_data TYPE xstring
@ -58,13 +52,20 @@ CLASS zcl_abapgit_hash DEFINITION
VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1
RAISING
zcx_abapgit_exception .
CLASS-METHODS sha1_string
IMPORTING
!iv_data TYPE string
RETURNING
VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_ABAPGIT_HASH IMPLEMENTATION.
CLASS zcl_abapgit_hash IMPLEMENTATION.
METHOD adler32.
@ -172,6 +173,28 @@ CLASS ZCL_ABAPGIT_HASH IMPLEMENTATION.
ENDMETHOD.
METHOD sha1_string.
DATA: lv_hash TYPE string,
lv_key TYPE xstring,
lx_error TYPE REF TO cx_abap_message_digest.
TRY.
cl_abap_hmac=>calculate_hmac_for_char(
EXPORTING
if_key = lv_key
if_data = iv_data
IMPORTING
ef_hmacstring = lv_hash ).
CATCH cx_abap_message_digest INTO lx_error.
zcx_abapgit_exception=>raise_with_text( lx_error ).
ENDTRY.
rv_sha1 = lv_hash.
TRANSLATE rv_sha1 TO LOWER CASE.
ENDMETHOD.
METHOD sha1_tag.
rv_sha1 = sha1( iv_type = zif_abapgit_definitions=>c_type-tag
iv_data = iv_data ).