diff --git a/abaplint.json b/abaplint.json index 4c8ae1666..81b28fff8 100644 --- a/abaplint.json +++ b/abaplint.json @@ -365,37 +365,8 @@ "shlp": "^Z", "xslt": "^Z" }, - "obsolete_statement": { - "refresh": true, - "compute": true, - "add": true, - "clientSpecified": true, - "occurences": true, - "selectWithoutInto": true, - "ranges": true, - "callTransformation": true, - "regex": true, - "sortByFS": true, - "subtract": true, - "formDefinition": true, - "formImplementation": true, - "freeMemory": true, - "exitFromSQL": true, - "multiply": true, - "communication": true, - "typePools": true, - "load": true, - "move": true, - "divide": true, - "fieldSymbolStructure": true, - "requested": true, - "pack": true, - "setExtended": true, - "withHeaderLine": true, - "occurs": true, - "parameter": true - }, - "parser_error": {}, + "obsolete_statement": true, + "parser_error": true, "preferred_compare_operator": { "badOperators": [ "EQ", diff --git a/package.json b/package.json index 975da84ff..f631ad031 100644 --- a/package.json +++ b/package.json @@ -25,12 +25,12 @@ ] }, "devDependencies": { - "@abaplint/cli": "^2.92.0", - "@abaplint/database-sqlite": "^2.1.40", - "@abaplint/runtime": "^2.1.40", - "@abaplint/transpiler-cli": "^2.1.40", + "@abaplint/cli": "^2.93.9", + "@abaplint/database-sqlite": "^2.1.45", + "@abaplint/runtime": "^2.1.49", + "@abaplint/transpiler-cli": "^2.1.49", "abapmerge": "^0.14.7", "c8": "^7.12.0", - "eslint": "^8.22.0" + "eslint": "^8.23.0" } } diff --git a/src/json/zcl_abapgit_ajson.clas.abap b/src/json/zcl_abapgit_ajson.clas.abap index 1cd20f1be..c5727d04b 100644 --- a/src/json/zcl_abapgit_ajson.clas.abap +++ b/src/json/zcl_abapgit_ajson.clas.abap @@ -77,6 +77,7 @@ CLASS zcl_abapgit_ajson DEFINITION DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping. DATA mv_keep_item_order TYPE abap_bool. DATA mv_format_datetime TYPE abap_bool. + " TODO restructure into zif_ajson=>ty_opts METHODS get_item IMPORTING @@ -106,6 +107,11 @@ ENDCLASS. CLASS zcl_abapgit_ajson IMPLEMENTATION. + METHOD zif_abapgit_ajson~opts. + rs_opts-read_only = mv_read_only. + rs_opts-format_datetime = mv_format_datetime. + rs_opts-keep_item_order = mv_keep_item_order. + ENDMETHOD. METHOD constructor. format_datetime( abap_true ). diff --git a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap index 3c54e1c47..b6470c3ea 100644 --- a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap +++ b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap @@ -1034,11 +1034,7 @@ CLASS lcl_json_to_abap IMPLEMENTATION. zcx_abapgit_ajson_error=>raise( 'Unexpected error calculating timestamp' ). ENDTRY. - cl_abap_tstmp=>move( - EXPORTING - tstmp_src = lv_timestamp - IMPORTING - tstmp_tgt = rv_result ). + rv_result = lv_timestamp. ENDMETHOD. @@ -1335,20 +1331,13 @@ CLASS lcl_abap_to_json IMPLEMENTATION. DATA lv_date TYPE d. DATA lv_time TYPE t. - IF iv_ts IS INITIAL. - " The zero value is January 1, year 1, 00:00:00.000000000 UTC. - lv_date = '00010101'. - ELSE. - - CONVERT TIME STAMP iv_ts TIME ZONE lc_utc - INTO DATE lv_date TIME lv_time. - - ENDIF. + CONVERT TIME STAMP iv_ts TIME ZONE lc_utc + INTO DATE lv_date TIME lv_time. rv_str = lv_date+0(4) && '-' && lv_date+4(2) && '-' && lv_date+6(2) && 'T' && - lv_time+0(2) && '-' && lv_time+2(2) && '-' && lv_time+4(2) && + lv_time+0(2) && ':' && lv_time+2(2) && ':' && lv_time+4(2) && 'Z'. ENDMETHOD. diff --git a/src/json/zcl_abapgit_ajson.clas.testclasses.abap b/src/json/zcl_abapgit_ajson.clas.testclasses.abap index 2e5afd16d..4154acb3f 100644 --- a/src/json/zcl_abapgit_ajson.clas.testclasses.abap +++ b/src/json/zcl_abapgit_ajson.clas.testclasses.abap @@ -1343,6 +1343,9 @@ CLASS ltcl_json_to_abap DEFINITION METHODS to_abap_struc FOR TESTING RAISING zcx_abapgit_ajson_error. + METHODS to_abap_timestamp_initial + FOR TESTING + RAISING zcx_abapgit_ajson_error. METHODS to_abap_value FOR TESTING RAISING zcx_abapgit_ajson_error. @@ -1423,6 +1426,28 @@ CLASS ltcl_json_to_abap IMPLEMENTATION. ENDMETHOD. + METHOD to_abap_timestamp_initial. + + DATA lo_cut TYPE REF TO lcl_json_to_abap. + DATA lv_mock TYPE timestamp. + DATA lo_nodes TYPE REF TO lcl_nodes_helper. + + CREATE OBJECT lo_nodes. + lo_nodes->add( ' | |str |0000-00-00T00:00:00Z| ' ). + + CREATE OBJECT lo_cut. + lo_cut->to_abap( + EXPORTING + it_nodes = lo_nodes->sorted( ) + CHANGING + c_container = lv_mock ). + + cl_abap_unit_assert=>assert_equals( + act = lv_mock + exp = 0 ). + + ENDMETHOD. + METHOD to_abap_value. DATA lo_cut TYPE REF TO lcl_json_to_abap. @@ -2201,7 +2226,7 @@ CLASS ltcl_writer_test IMPLEMENTATION. lo_nodes->add( '/ |d_empty |str | ||0' ). lo_nodes->add( '/ |t |str |20:01:03 ||0' ). lo_nodes->add( '/ |t_empty |str | ||0' ). - lo_nodes->add( '/ |ts |str |2022-04-01T20-01-03Z ||0' ). + lo_nodes->add( '/ |ts |str |2022-04-01T20:01:03Z ||0' ). lo_nodes->add( '/ |p |num |123.45 ||0' ). li_writer->set( @@ -2752,7 +2777,7 @@ CLASS ltcl_writer_test IMPLEMENTATION. li_writer = lo_cut. CREATE OBJECT lo_nodes_exp. lo_nodes_exp->add( ' | |object | ||1' ). - lo_nodes_exp->add( '/ |a |str |2021-05-05T12-00-00Z ||0' ). + lo_nodes_exp->add( '/ |a |str |2021-05-05T12:00:00Z ||0' ). lv_timestamp = '20210505120000'. li_writer->set_timestamp( @@ -3393,6 +3418,8 @@ CLASS ltcl_abap_to_json DEFINITION METHODS set_value_true FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_value_false FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_value_xsdboolean FOR TESTING RAISING zcx_abapgit_ajson_error. + METHODS set_value_timestamp FOR TESTING RAISING zcx_abapgit_ajson_error. + METHODS set_value_timestamp_initial FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_null FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_obj FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_array FOR TESTING RAISING zcx_abapgit_ajson_error. @@ -3531,6 +3558,43 @@ CLASS ltcl_abap_to_json IMPLEMENTATION. ENDMETHOD. + METHOD set_value_timestamp. + + DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper. + DATA lt_nodes TYPE zif_abapgit_ajson=>ty_nodes_tt. + + DATA lv_timestamp TYPE timestamp. + CREATE OBJECT lo_nodes_exp. + lo_nodes_exp->add( ' | |str |2022-08-31T00:00:00Z||' ). + + CONVERT DATE '20220831' TIME '000000' + INTO TIME STAMP lv_timestamp TIME ZONE ''. + lt_nodes = lcl_abap_to_json=>convert( lcl_abap_to_json=>format_timestamp( lv_timestamp ) ). + + cl_abap_unit_assert=>assert_equals( + act = lt_nodes + exp = lo_nodes_exp->mt_nodes ). + + ENDMETHOD. + + METHOD set_value_timestamp_initial. + + DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper. + DATA lt_nodes TYPE zif_abapgit_ajson=>ty_nodes_tt. + + DATA lv_timestamp TYPE timestamp. + CREATE OBJECT lo_nodes_exp. + lo_nodes_exp->add( ' | |str |0000-00-00T00:00:00Z||' ). + + lv_timestamp = 0. + lt_nodes = lcl_abap_to_json=>convert( lcl_abap_to_json=>format_timestamp( lv_timestamp ) ). + + cl_abap_unit_assert=>assert_equals( + act = lt_nodes + exp = lo_nodes_exp->mt_nodes ). + + ENDMETHOD. + METHOD prefix. DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper. diff --git a/src/json/zcl_abapgit_ajson_filter_lib.clas.abap b/src/json/zcl_abapgit_ajson_filter_lib.clas.abap index 5b3f3a9a5..275768640 100644 --- a/src/json/zcl_abapgit_ajson_filter_lib.clas.abap +++ b/src/json/zcl_abapgit_ajson_filter_lib.clas.abap @@ -14,6 +14,7 @@ CLASS zcl_abapgit_ajson_filter_lib DEFINITION IMPORTING !it_skip_paths TYPE string_table OPTIONAL !iv_skip_paths TYPE string OPTIONAL + !iv_pattern_search TYPE abap_bool DEFAULT abap_false RETURNING VALUE(ri_filter) TYPE REF TO zif_abapgit_ajson_filter RAISING @@ -50,6 +51,7 @@ CLASS zcl_abapgit_ajson_filter_lib IMPLEMENTATION. METHOD create_path_filter. CREATE OBJECT ri_filter TYPE lcl_paths_filter EXPORTING + iv_pattern_search = iv_pattern_search it_skip_paths = it_skip_paths iv_skip_paths = iv_skip_paths. ENDMETHOD. 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 98239177e..20458079e 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 @@ -29,21 +29,35 @@ CLASS lcl_paths_filter DEFINITION FINAL. IMPORTING it_skip_paths TYPE string_table OPTIONAL iv_skip_paths TYPE string OPTIONAL + iv_pattern_search TYPE abap_bool RAISING zcx_abapgit_ajson_error. PRIVATE SECTION. DATA mt_skip_paths TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line. + DATA mv_pattern_search TYPE abap_bool. ENDCLASS. CLASS lcl_paths_filter IMPLEMENTATION. METHOD zif_abapgit_ajson_filter~keep_node. - DATA lv_path TYPE string. + DATA lv_full_path TYPE string. + FIELD-SYMBOLS

LIKE LINE OF mt_skip_paths. - lv_path = is_node-path && is_node-name. - READ TABLE mt_skip_paths WITH KEY table_line = lv_path TRANSPORTING NO FIELDS. - rv_keep = boolc( sy-subrc <> 0 ). + lv_full_path = is_node-path && is_node-name. + + IF mv_pattern_search = abap_true. + rv_keep = abap_true. + LOOP AT mt_skip_paths ASSIGNING

. + IF lv_full_path CP

. + rv_keep = abap_false. + EXIT. + ENDIF. + ENDLOOP. + ELSE. + READ TABLE mt_skip_paths WITH KEY table_line = lv_full_path TRANSPORTING NO FIELDS. + rv_keep = boolc( sy-subrc <> 0 ). + ENDIF. ENDMETHOD. @@ -77,6 +91,7 @@ CLASS lcl_paths_filter IMPLEMENTATION. DELETE ADJACENT DUPLICATES FROM lt_tab. mt_skip_paths = lt_tab. + mv_pattern_search = iv_pattern_search. ENDMETHOD. 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 d055dab26..8c129303f 100644 --- a/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap +++ b/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap @@ -6,6 +6,8 @@ CLASS ltcl_filters_test DEFINITION FINAL METHODS empty_filter_simple FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS empty_filter_deep FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS path_filter FOR TESTING RAISING zcx_abapgit_ajson_error. + METHODS path_filter_string FOR TESTING RAISING zcx_abapgit_ajson_error. + 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. ENDCLASS. @@ -100,6 +102,66 @@ CLASS ltcl_filters_test IMPLEMENTATION. ENDMETHOD. + METHOD path_filter_string. + + 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 = '/b/c' + iv_val = '2' ). + li_json->set( + iv_path = '/c/d' + iv_val = '3' ). + + 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 = '/b/c,/c/d' ) ). + + cl_abap_unit_assert=>assert_equals( + act = li_json_filtered->stringify( ) + exp = '{"a":"1","b":{},"c":{}}' ). + + ENDMETHOD. + + METHOD path_filter_w_patterns. + + 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 = '/@meta' + iv_val = 'meta' ). + li_json->set( + iv_path = '/a' + iv_val = '1' ). + li_json->set( + iv_path = '/b/c' + iv_val = '2' ). + li_json->set( + iv_path = '/c/d' + iv_val = '3' ). + li_json->set( + iv_path = '/c/@meta2' + iv_val = 'meta2' ). + + 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 = '/*/c,*/@*' + iv_pattern_search = abap_true ) ). + + cl_abap_unit_assert=>assert_equals( + act = li_json_filtered->stringify( ) + exp = '{"a":"1","b":{},"c":{"d":"3"}}' ). + + ENDMETHOD. + METHOD path_filter_deep. DATA li_json TYPE REF TO zif_abapgit_ajson. diff --git a/src/json/zif_abapgit_ajson.intf.abap b/src/json/zif_abapgit_ajson.intf.abap index 1b2f6af08..99afb847a 100644 --- a/src/json/zif_abapgit_ajson.intf.abap +++ b/src/json/zif_abapgit_ajson.intf.abap @@ -37,6 +37,12 @@ INTERFACE zif_abapgit_ajson path TYPE string, name TYPE string, END OF ty_path_name. + TYPES: + BEGIN OF ty_opts, + read_only TYPE abap_bool, + keep_item_order TYPE abap_bool, + format_datetime TYPE abap_bool, + END OF ty_opts. " DATA @@ -53,6 +59,9 @@ INTERFACE zif_abapgit_ajson iv_use_iso TYPE abap_bool DEFAULT abap_true RETURNING VALUE(ri_json) TYPE REF TO zif_abapgit_ajson. + METHODS opts + RETURNING + VALUE(rs_opts) TYPE ty_opts. " METHODS ex.reader