diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index 33a24386b..a3094ed5e 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -8,4 +8,4 @@ jobs: steps: - uses: actions/checkout@v4 - name: REUSE Compliance Check - uses: fsfe/reuse-action@v1 + uses: fsfe/reuse-action@v5 diff --git a/package.json b/package.json index 2296909d3..22ba5ee5a 100644 --- a/package.json +++ b/package.json @@ -23,14 +23,14 @@ ] }, "devDependencies": { - "@abaplint/cli": "^2.113.82", - "@abaplint/database-sqlite": "^2.10.20", - "@abaplint/runtime": "^2.10.23", + "@abaplint/cli": "^2.113.105", + "@abaplint/database-sqlite": "^2.10.24", + "@abaplint/runtime": "^2.10.26", "express": "^4.21.2", - "@abaplint/transpiler-cli": "^2.10.23", - "globals": "^15.13.0", + "@abaplint/transpiler-cli": "^2.10.26", + "globals": "^16.0.0", "abapmerge": "^0.16.6", "c8": "^10.1.3", - "eslint": "^9.17.0" + "eslint": "^9.22.0" } } diff --git a/src/background/zcl_abapgit_background_push_au.clas.abap b/src/background/zcl_abapgit_background_push_au.clas.abap index 97e9c65a7..377cc3f24 100644 --- a/src/background/zcl_abapgit_background_push_au.clas.abap +++ b/src/background/zcl_abapgit_background_push_au.clas.abap @@ -110,7 +110,7 @@ CLASS zcl_abapgit_background_push_au IMPLEMENTATION. LIKE LINE OF ls_files-local. - ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ). + ls_files = zcl_abapgit_stage_logic=>get_stage_logic( )->get( io_repo ). LOOP AT ls_files-local ASSIGNING . lv_changed_by = zcl_abapgit_objects=>changed_by( @@ -237,7 +237,7 @@ CLASS zcl_abapgit_background_push_au IMPLEMENTATION. DATA: ls_files TYPE zif_abapgit_definitions=>ty_stage_files. mi_log = ii_log. - ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ). + ls_files = zcl_abapgit_stage_logic=>get_stage_logic( )->get( io_repo ). IF lines( ls_files-local ) = 0 AND lines( ls_files-remote ) = 0. ii_log->add_info( 'Nothing to stage' ). diff --git a/src/background/zcl_abapgit_background_push_fi.clas.abap b/src/background/zcl_abapgit_background_push_fi.clas.abap index d1d49911e..1f4500fa4 100644 --- a/src/background/zcl_abapgit_background_push_fi.clas.abap +++ b/src/background/zcl_abapgit_background_push_fi.clas.abap @@ -73,7 +73,7 @@ CLASS zcl_abapgit_background_push_fi IMPLEMENTATION. LIKE LINE OF ls_files-remote. - ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ). + ls_files = zcl_abapgit_stage_logic=>get_stage_logic( )->get( io_repo ). ASSERT lines( ls_files-local ) > 0 OR lines( ls_files-remote ) > 0. @@ -142,7 +142,7 @@ CLASS zcl_abapgit_background_push_fi IMPLEMENTATION. lv_email TYPE string. mi_log = ii_log. - ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ). + ls_files = zcl_abapgit_stage_logic=>get_stage_logic( )->get( io_repo ). IF lines( ls_files-local ) = 0 AND lines( ls_files-remote ) = 0. ii_log->add_info( 'Nothing to stage' ). diff --git a/src/cts/zcl_abapgit_transport_2_branch.clas.abap b/src/cts/zcl_abapgit_transport_2_branch.clas.abap index 133cd3f05..0521ebc1e 100644 --- a/src/cts/zcl_abapgit_transport_2_branch.clas.abap +++ b/src/cts/zcl_abapgit_transport_2_branch.clas.abap @@ -50,7 +50,7 @@ CLASS zcl_abapgit_transport_2_branch IMPLEMENTATION. CREATE OBJECT lo_stage. - ls_stage_objects = zcl_abapgit_factory=>get_stage_logic( )->get( io_repository ). + ls_stage_objects = zcl_abapgit_stage_logic=>get_stage_logic( )->get( io_repository ). lt_object_statuses = zcl_abapgit_repo_status=>calculate( io_repository ). diff --git a/src/json/zcl_abapgit_ajson.clas.abap b/src/json/zcl_abapgit_ajson.clas.abap index f94bbadf9..fb9ac9e35 100644 --- a/src/json/zcl_abapgit_ajson.clas.abap +++ b/src/json/zcl_abapgit_ajson.clas.abap @@ -848,6 +848,8 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION. DATA lv_path_pattern TYPE string. CREATE OBJECT lo_section. + lo_section->mi_custom_mapping = mi_custom_mapping. + lv_normalized_path = lcl_utils=>normalize_path( iv_path ). lv_path_len = strlen( lv_normalized_path ). ls_path_parts = lcl_utils=>split_path( lv_normalized_path ). diff --git a/src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap b/src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap index 42f12e631..c2426e9e1 100644 --- a/src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap +++ b/src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap @@ -72,7 +72,7 @@ CLASS lcl_paths_filter IMPLEMENTATION. ENDIF. LOOP AT it_skip_paths INTO lv_s. - lv_s = to_lower( lv_s ). + lv_s = condense( lv_s ). APPEND lv_s TO lt_tab. ENDLOOP. @@ -83,7 +83,7 @@ CLASS lcl_paths_filter IMPLEMENTATION. DELETE lt_tab INDEX sy-tabix. CONTINUE. ENDIF. - = condense( to_lower( ) ). + = condense( ). ENDLOOP. ENDIF. diff --git a/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap b/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap index 8c129303f..2ae049120 100644 --- a/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap +++ b/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap @@ -10,6 +10,7 @@ CLASS ltcl_filters_test DEFINITION FINAL METHODS path_filter_w_patterns FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS path_filter_deep FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS and_filter FOR TESTING RAISING zcx_abapgit_ajson_error. + METHODS mixed_case_filter FOR TESTING RAISING zcx_abapgit_ajson_error. ENDCLASS. @@ -227,4 +228,36 @@ CLASS ltcl_filters_test IMPLEMENTATION. ENDMETHOD. + METHOD mixed_case_filter. + + DATA li_json TYPE REF TO zif_abapgit_ajson. + DATA li_json_filtered TYPE REF TO zif_abapgit_ajson. + + li_json = zcl_abapgit_ajson=>create_empty( ). + li_json->set( + iv_path = '/a' + iv_val = '1' ). + li_json->set( + iv_path = '/bB' + iv_val = '2' ). + li_json->set( + iv_path = '/CC' + iv_val = '3' ). + li_json->set( + iv_path = '/cc' + iv_val = '4' ). + li_json->set( + iv_path = '/d' + iv_val = 5 ). + + li_json_filtered = zcl_abapgit_ajson=>create_from( + ii_source_json = li_json + ii_filter = zcl_abapgit_ajson_filter_lib=>create_path_filter( iv_skip_paths = '/bB,/CC' ) ). + + cl_abap_unit_assert=>assert_equals( + act = li_json_filtered->stringify( ) + exp = '{"a":"1","cc":"4","d":5}' ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap b/src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap index 18ee6e1cb..dc789ec32 100644 --- a/src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap +++ b/src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap @@ -358,6 +358,7 @@ CLASS ltcl_fields DEFINITION FINAL FOR TESTING to_json_without_path FOR TESTING RAISING zcx_abapgit_ajson_error, to_json_with_path FOR TESTING RAISING zcx_abapgit_ajson_error, to_abap FOR TESTING RAISING zcx_abapgit_ajson_error, + to_abap_with_slice FOR TESTING RAISING zcx_abapgit_ajson_error, to_json IMPORTING iv_path TYPE string RETURNING VALUE(rv_result) TYPE string RAISING zcx_abapgit_ajson_error. @@ -403,6 +404,33 @@ CLASS ltcl_fields IMPLEMENTATION. ENDMETHOD. + METHOD to_abap_with_slice. + + DATA: BEGIN OF ls_act, + y TYPE i, + END OF ls_act. + + DATA lo_cut TYPE REF TO zif_abapgit_ajson. + DATA lt_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields. + DATA ls_mapping_field LIKE LINE OF lt_mapping_fields. + + CLEAR ls_mapping_field. + ls_mapping_field-abap = 'Y'. + ls_mapping_field-json = 'c'. + INSERT ls_mapping_field INTO TABLE lt_mapping_fields. + + lo_cut = zcl_abapgit_ajson=>parse( iv_json = '{"a":1,"b":{"c":2},"d":{"e":3}}' + ii_custom_mapping = zcl_abapgit_ajson_mapping=>create_field_mapping( lt_mapping_fields ) + )->slice( `/b` ). + + lo_cut->to_abap( IMPORTING ev_container = ls_act ). + + cl_abap_unit_assert=>assert_equals( + act = ls_act-y + exp = 2 ). + + ENDMETHOD. + METHOD to_json_without_path. diff --git a/src/json/zif_abapgit_ajson.intf.abap b/src/json/zif_abapgit_ajson.intf.abap index 9937a244f..da6950d40 100644 --- a/src/json/zif_abapgit_ajson.intf.abap +++ b/src/json/zif_abapgit_ajson.intf.abap @@ -1,7 +1,7 @@ INTERFACE zif_abapgit_ajson PUBLIC. - CONSTANTS version TYPE string VALUE 'v1.1.10'. "#EC NOTEXT + CONSTANTS version TYPE string VALUE 'v1.1.11'. "#EC NOTEXT CONSTANTS origin TYPE string VALUE 'https://github.com/sbcgua/ajson'. "#EC NOTEXT CONSTANTS license TYPE string VALUE 'MIT'. "#EC NOTEXT diff --git a/src/repo/stage/zcl_abapgit_stage_logic.clas.abap b/src/repo/stage/zcl_abapgit_stage_logic.clas.abap index 22a5871e9..efb10e6db 100644 --- a/src/repo/stage/zcl_abapgit_stage_logic.clas.abap +++ b/src/repo/stage/zcl_abapgit_stage_logic.clas.abap @@ -1,13 +1,24 @@ CLASS zcl_abapgit_stage_logic DEFINITION PUBLIC - CREATE PRIVATE - GLOBAL FRIENDS zcl_abapgit_factory . + CREATE PRIVATE. PUBLIC SECTION. - INTERFACES zif_abapgit_stage_logic . + INTERFACES zif_abapgit_stage_logic. + + CLASS-METHODS get_stage_logic + RETURNING + VALUE(ri_logic) TYPE REF TO zif_abapgit_stage_logic. + + CLASS-METHODS set_stage_logic + IMPORTING + ii_logic TYPE REF TO zif_abapgit_stage_logic. + PROTECTED SECTION. PRIVATE SECTION. + + CLASS-DATA gi_stage_logic TYPE REF TO zif_abapgit_stage_logic. + CLASS-METHODS: remove_ignored IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online @@ -22,6 +33,17 @@ ENDCLASS. CLASS zcl_abapgit_stage_logic IMPLEMENTATION. + METHOD get_stage_logic. + + IF gi_stage_logic IS INITIAL. + CREATE OBJECT gi_stage_logic TYPE zcl_abapgit_stage_logic. + ENDIF. + + ri_logic = gi_stage_logic. + + ENDMETHOD. + + METHOD remove_identical. DATA: lv_index TYPE i, @@ -85,6 +107,11 @@ CLASS zcl_abapgit_stage_logic IMPLEMENTATION. ENDMETHOD. + METHOD set_stage_logic. + gi_stage_logic = ii_logic. + ENDMETHOD. + + METHOD zif_abapgit_stage_logic~get. " Getting REMOTE before LOCAL is critical to ensure that DATA config is loaded first diff --git a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap index f8afdaebb..742fd3b05 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap @@ -376,8 +376,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. METHOD init_files. - ms_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo = mo_repo - ii_obj_filter = mi_obj_filter ). + ms_files = zcl_abapgit_stage_logic=>get_stage_logic( )->get( io_repo = mo_repo + ii_obj_filter = mi_obj_filter ). IF lines( ms_files-local ) = 0 AND lines( ms_files-remote ) = 0. mo_repo->refresh( ). diff --git a/src/utils/zcl_abapgit_convert.clas.testclasses.abap b/src/utils/zcl_abapgit_convert.clas.testclasses.abap index 5067fc5c4..4207a01d0 100644 --- a/src/utils/zcl_abapgit_convert.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_convert.clas.testclasses.abap @@ -284,6 +284,11 @@ CLASS ltcl_convert IMPLEMENTATION. DATA lv_result TYPE string. + " Test does not work on non-Unicode but is not important for real-world anyway + IF cl_abap_char_utilities=>charsize = 1. + RETURN. + ENDIF. + " 0xF8-0xFF are not valid in UTF-8 TRY. lv_result = zcl_abapgit_convert=>xstring_to_string_utf8( 'F8FF00' ). diff --git a/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap b/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap index 3c6b4ec44..98174d910 100644 --- a/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap +++ b/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap @@ -85,8 +85,11 @@ CLASS ltcl_xml_output IMPLEMENTATION. lv_xstring = lo_conv_out_string->get_buffer( ). - lv_bom = cl_abap_char_utilities=>byte_order_mark_little. "UTF-16LE, 4103 - CONCATENATE lv_bom lv_xstring INTO lv_xstring IN BYTE MODE. + " Add BOM for Unicode systems + IF cl_abap_char_utilities=>charsize > 1. + lv_bom = cl_abap_char_utilities=>byte_order_mark_little. "UTF-16LE, 4103 + CONCATENATE lv_bom lv_xstring INTO lv_xstring IN BYTE MODE. + ENDIF. lo_conv_in_string = cl_abap_conv_in_ce=>create( encoding = lv_encoding diff --git a/src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap b/src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap index 8bd3001c1..30677ff55 100644 --- a/src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap +++ b/src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap @@ -30,7 +30,11 @@ CLASS ltcl_test IMPLEMENTATION. DATA lv_result TYPE string. lv_result = mo_cut->print( '' ). - lv_result = lv_result+1. + + " Skip BOM for Unicode systems + IF cl_abap_char_utilities=>charsize > 1. + lv_result = lv_result+1. + ENDIF. cl_abap_unit_assert=>assert_equals( act = lv_result @@ -43,7 +47,11 @@ CLASS ltcl_test IMPLEMENTATION. DATA lv_result TYPE string. lv_result = mo_cut->print( '2' ). - lv_result = lv_result+1. + + " Skip BOM for Unicode systems + IF cl_abap_char_utilities=>charsize > 1. + lv_result = lv_result+1. + ENDIF. cl_abap_unit_assert=>assert_equals( act = lv_result @@ -56,7 +64,11 @@ CLASS ltcl_test IMPLEMENTATION. DATA lv_result TYPE string. lv_result = mo_cut->print( '2' ). - lv_result = lv_result+1. + + " Skip BOM for Unicode systems + IF cl_abap_char_utilities=>charsize > 1. + lv_result = lv_result+1. + ENDIF. cl_abap_unit_assert=>assert_equals( act = lv_result @@ -97,7 +109,10 @@ CLASS ltcl_test IMPLEMENTATION. iv_xml = |\n 2\n| iv_unpretty = abap_true ). - lv_result = lv_result+1. + " Skip BOM for Unicode systems + IF cl_abap_char_utilities=>charsize > 1. + lv_result = lv_result+1. + ENDIF. cl_abap_unit_assert=>assert_equals( act = lv_result diff --git a/src/zcl_abapgit_factory.clas.abap b/src/zcl_abapgit_factory.clas.abap index 6462be0f0..3ce5e27db 100644 --- a/src/zcl_abapgit_factory.clas.abap +++ b/src/zcl_abapgit_factory.clas.abap @@ -20,9 +20,6 @@ CLASS zcl_abapgit_factory DEFINITION VALUE(ri_code_inspector) TYPE REF TO zif_abapgit_code_inspector RAISING zcx_abapgit_exception . - CLASS-METHODS get_stage_logic - RETURNING - VALUE(ri_logic) TYPE REF TO zif_abapgit_stage_logic . CLASS-METHODS get_cts_api RETURNING VALUE(ri_cts_api) TYPE REF TO zif_abapgit_cts_api . @@ -75,7 +72,6 @@ CLASS zcl_abapgit_factory DEFINITION CLASS-DATA gi_tadir TYPE REF TO zif_abapgit_tadir . CLASS-DATA gt_sap_package TYPE ty_sap_packages . CLASS-DATA gt_code_inspector TYPE ty_code_inspector_packs . - CLASS-DATA gi_stage_logic TYPE REF TO zif_abapgit_stage_logic . CLASS-DATA gi_cts_api TYPE REF TO zif_abapgit_cts_api . CLASS-DATA gi_environment TYPE REF TO zif_abapgit_environment . CLASS-DATA gi_longtext TYPE REF TO zif_abapgit_longtexts . @@ -89,7 +85,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_FACTORY IMPLEMENTATION. +CLASS zcl_abapgit_factory IMPLEMENTATION. METHOD get_code_inspector. @@ -234,17 +230,6 @@ CLASS ZCL_ABAPGIT_FACTORY IMPLEMENTATION. ENDMETHOD. - METHOD get_stage_logic. - - IF gi_stage_logic IS INITIAL. - CREATE OBJECT gi_stage_logic TYPE zcl_abapgit_stage_logic. - ENDIF. - - ri_logic = gi_stage_logic. - - ENDMETHOD. - - METHOD get_tadir. IF gi_tadir IS INITIAL. diff --git a/src/zcl_abapgit_injector.clas.abap b/src/zcl_abapgit_injector.clas.abap index f2a619b99..ca20461a8 100644 --- a/src/zcl_abapgit_injector.clas.abap +++ b/src/zcl_abapgit_injector.clas.abap @@ -16,9 +16,6 @@ CLASS zcl_abapgit_injector DEFINITION IMPORTING !iv_package TYPE devclass !ii_code_inspector TYPE REF TO zif_abapgit_code_inspector . - CLASS-METHODS set_stage_logic - IMPORTING - !ii_logic TYPE REF TO zif_abapgit_stage_logic . CLASS-METHODS set_cts_api IMPORTING !ii_cts_api TYPE REF TO zif_abapgit_cts_api . @@ -146,13 +143,6 @@ CLASS zcl_abapgit_injector IMPLEMENTATION. ENDMETHOD. - METHOD set_stage_logic. - - zcl_abapgit_factory=>gi_stage_logic = ii_logic. - - ENDMETHOD. - - METHOD set_tadir. zcl_abapgit_factory=>gi_tadir = ii_tadir. ENDMETHOD.