From f264f33b7e313ef07468fc3a3c4eed1bd087c31f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 18 Apr 2021 11:36:07 +0200 Subject: [PATCH] ajson, Automatic Update (#4708) * [create-pull-request] automated change * Update ajson_mirror.yaml Co-authored-by: larshp Co-authored-by: Lars Hvam --- .github/workflows/ajson_mirror.yaml | 2 + src/json/zcl_abapgit_ajson.clas.abap | 23 +++++ .../zcl_abapgit_ajson.clas.locals_imp.abap | 86 +++++++++++++++++++ .../zcl_abapgit_ajson.clas.testclasses.abap | 64 +++++++++++--- src/json/zif_abapgit_ajson_reader.intf.abap | 5 ++ 5 files changed, 166 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ajson_mirror.yaml b/.github/workflows/ajson_mirror.yaml index e4cd0a78c..1fa8154cd 100644 --- a/.github/workflows/ajson_mirror.yaml +++ b/.github/workflows/ajson_mirror.yaml @@ -29,3 +29,5 @@ jobs: body: | Automatic update from mirror https://github.com/abapGit/ajson_mirror + + Manually close and reopen the pull request to trigger CI diff --git a/src/json/zcl_abapgit_ajson.clas.abap b/src/json/zcl_abapgit_ajson.clas.abap index 6d7533645..3033e2959 100644 --- a/src/json/zcl_abapgit_ajson.clas.abap +++ b/src/json/zcl_abapgit_ajson.clas.abap @@ -16,6 +16,7 @@ CLASS zcl_abapgit_ajson DEFINITION get_integer FOR zif_abapgit_ajson_reader~get_integer, get_number FOR zif_abapgit_ajson_reader~get_number, get_date FOR zif_abapgit_ajson_reader~get_date, + get_timestamp FOR zif_abapgit_ajson_reader~get_timestamp, get_string FOR zif_abapgit_ajson_reader~get_string, slice FOR zif_abapgit_ajson_reader~slice, to_abap FOR zif_abapgit_ajson_reader~to_abap, @@ -356,6 +357,28 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_ajson_reader~get_timestamp. + + DATA lo_to_abap TYPE REF TO lcl_json_to_abap. + DATA lr_item TYPE REF TO zif_abapgit_ajson=>ty_node. + + lr_item = get_item( iv_path ). + + IF lr_item IS INITIAL. + RETURN. + ENDIF. + + CREATE OBJECT lo_to_abap. + + TRY. + rv_value = lo_to_abap->to_timestamp( is_path = lr_item->* ). + CATCH zcx_abapgit_ajson_error. + RETURN. + ENDTRY. + + ENDMETHOD. + + METHOD zif_abapgit_ajson_reader~members. DATA lv_normalized_path TYPE string. diff --git a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap index ae3939d03..e25628f6f 100644 --- a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap +++ b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap @@ -516,6 +516,14 @@ CLASS lcl_json_to_abap DEFINITION FINAL. RAISING zcx_abapgit_ajson_error. + METHODS to_timestamp + IMPORTING + is_path TYPE zif_abapgit_ajson=>ty_node + RETURNING + VALUE(rv_result) TYPE timestamp + RAISING + zcx_abapgit_ajson_error. + PRIVATE SECTION. DATA mr_obj TYPE REF TO data. DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping. @@ -570,6 +578,8 @@ CLASS lcl_json_to_abap IMPLEMENTATION. iv_location = -path && -name ). ENDIF. CONCATENATE lv_y lv_m lv_d INTO . + ELSEIF lv_type = 'P' AND -value IS NOT INITIAL. + = to_timestamp( is_path = ). ELSE. = -value. ENDIF. @@ -686,6 +696,82 @@ CLASS lcl_json_to_abap IMPLEMENTATION. ENDMETHOD. + METHOD to_timestamp. + + CONSTANTS lc_tzone_utc TYPE tznzone VALUE `UTC`. + CONSTANTS lc_regex_ts_with_hour TYPE string + VALUE `^(\d{4})-(\d{2})-(\d{2})(T)(\d{2}):(\d{2}):(\d{2})(\+)(\d{2}):(\d{2})`. + CONSTANTS lc_regex_ts_utc TYPE string + VALUE `^(\d{4})-(\d{2})-(\d{2})(T)(\d{2}):(\d{2}):(\d{2})(Z|$)`. + + DATA: + BEGIN OF ls_timestamp, + year TYPE c LENGTH 4, + month TYPE c LENGTH 2, + day TYPE c LENGTH 2, + t TYPE c LENGTH 1, + hour TYPE c LENGTH 2, + minute TYPE c LENGTH 2, + second TYPE c LENGTH 2, + local_sign TYPE c LENGTH 1, + local_hour TYPE c LENGTH 2, + local_minute TYPE c LENGTH 2, + END OF ls_timestamp. + + DATA lv_date TYPE d. + DATA lv_time TYPE t. + DATA lv_seconds_conv TYPE i. + DATA lv_timestamp TYPE timestamp. + + FIND FIRST OCCURRENCE OF REGEX lc_regex_ts_with_hour + IN is_path-value SUBMATCHES ls_timestamp-year ls_timestamp-month ls_timestamp-day ls_timestamp-t + ls_timestamp-hour ls_timestamp-minute ls_timestamp-second + ls_timestamp-local_sign ls_timestamp-local_hour ls_timestamp-local_minute. + + IF sy-subrc = 0. + + lv_seconds_conv = ( ls_timestamp-local_hour * 3600 ) + ( ls_timestamp-local_minute * 60 ). + + ELSE. + + FIND FIRST OCCURRENCE OF REGEX lc_regex_ts_utc + IN is_path-value SUBMATCHES ls_timestamp-year ls_timestamp-month ls_timestamp-day ls_timestamp-t + ls_timestamp-hour ls_timestamp-minute ls_timestamp-second. + + IF sy-subrc <> 0. + zcx_abapgit_ajson_error=>raise( + iv_msg = 'Unexpected timestamp format' + iv_location = is_path-path && is_path-name ). + ENDIF. + + ENDIF. + + CONCATENATE ls_timestamp-year ls_timestamp-month ls_timestamp-day INTO lv_date. + CONCATENATE ls_timestamp-hour ls_timestamp-minute ls_timestamp-second INTO lv_time. + + CONVERT DATE lv_date TIME lv_time INTO TIME STAMP lv_timestamp TIME ZONE lc_tzone_utc. + + TRY. + + CASE ls_timestamp-local_sign. + WHEN '-'. + lv_timestamp = cl_abap_tstmp=>add( tstmp = lv_timestamp + secs = lv_seconds_conv ). + WHEN '+'. + lv_timestamp = cl_abap_tstmp=>subtractsecs( tstmp = lv_timestamp + secs = lv_seconds_conv ). + ENDCASE. + + CATCH cx_parameter_invalid_range cx_parameter_invalid_type. + zcx_abapgit_ajson_error=>raise( + iv_msg = 'Unexpected error calculating timestamp' + iv_location = is_path-path && is_path-name ). + ENDTRY. + + rv_result = lv_timestamp. + + ENDMETHOD. + ENDCLASS. ********************************************************************** diff --git a/src/json/zcl_abapgit_ajson.clas.testclasses.abap b/src/json/zcl_abapgit_ajson.clas.testclasses.abap index 437a71233..ec3d1c0a0 100644 --- a/src/json/zcl_abapgit_ajson.clas.testclasses.abap +++ b/src/json/zcl_abapgit_ajson.clas.testclasses.abap @@ -766,6 +766,7 @@ CLASS ltcl_reader_test DEFINITION FINAL METHODS slice FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS array_to_string_table FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS get_date FOR TESTING RAISING zcx_abapgit_ajson_error. + METHODS get_timestamp FOR TESTING RAISING zcx_abapgit_ajson_error. ENDCLASS. @@ -958,6 +959,25 @@ CLASS ltcl_reader_test IMPLEMENTATION. ENDMETHOD. + METHOD get_timestamp. + + DATA lo_cut TYPE REF TO zcl_abapgit_ajson. + DATA lo_nodes TYPE REF TO lcl_nodes_helper. + DATA lv_exp TYPE timestamp VALUE `20200728000000`. + + CREATE OBJECT lo_cut. + + CREATE OBJECT lo_nodes. + lo_nodes->add( ' | |object | | |1' ). + lo_nodes->add( '/ |timestamp|str |2020-07-28T00:00:00Z | |0' ). + lo_cut->mt_json_tree = lo_nodes->mt_nodes. + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->zif_abapgit_ajson_reader~get_timestamp( '/timestamp' ) + exp = lv_exp ). + + ENDMETHOD. + METHOD exists. DATA lo_cut TYPE REF TO zif_abapgit_ajson_reader. @@ -1201,6 +1221,9 @@ CLASS ltcl_json_to_abap DEFINITION oref TYPE REF TO object, date1 TYPE d, date2 TYPE d, + timestamp1 TYPE timestamp, + timestamp2 TYPE timestamp, + timestamp3 TYPE timestamp, END OF ty_complex. METHODS find_loc FOR TESTING RAISING zcx_abapgit_ajson_error. @@ -1420,6 +1443,7 @@ CLASS ltcl_json_to_abap IMPLEMENTATION. DATA lo_cut TYPE REF TO lcl_json_to_abap. DATA ls_mock TYPE ty_complex. DATA lv_exp_date TYPE d VALUE '20200728'. + DATA lv_exp_timestamp TYPE timestamp VALUE '20200728000000'. lcl_json_to_abap=>bind( CHANGING c_obj = ls_mock @@ -1427,20 +1451,23 @@ CLASS ltcl_json_to_abap IMPLEMENTATION. DATA lo_nodes TYPE REF TO lcl_nodes_helper. CREATE OBJECT lo_nodes. - lo_nodes->add( '/ | |object | | ' ). - lo_nodes->add( '/ |str |str |hello | ' ). - lo_nodes->add( '/ |int |num |5 | ' ). - lo_nodes->add( '/ |float |num |5.5 | ' ). - lo_nodes->add( '/ |bool |bool |true | ' ). - lo_nodes->add( '/ |obj |object | | ' ). - lo_nodes->add( '/obj |a |str |world | ' ). - lo_nodes->add( '/ |tab |array | | ' ). - lo_nodes->add( '/tab |1 |object | |1' ). - lo_nodes->add( '/tab/1 |a |str | One | ' ). - lo_nodes->add( '/tab |2 |object | |2' ). - lo_nodes->add( '/tab/2 |a |str | Two | ' ). - lo_nodes->add( '/ |date1 |str |2020-07-28 | ' ). - lo_nodes->add( '/ |date2 |str |2020-07-28T00:00:00Z | ' ). + lo_nodes->add( '/ | |object | | ' ). + lo_nodes->add( '/ |str |str |hello | ' ). + lo_nodes->add( '/ |int |num |5 | ' ). + lo_nodes->add( '/ |float |num |5.5 | ' ). + lo_nodes->add( '/ |bool |bool |true | ' ). + lo_nodes->add( '/ |obj |object | | ' ). + lo_nodes->add( '/obj |a |str |world | ' ). + lo_nodes->add( '/ |tab |array | | ' ). + lo_nodes->add( '/tab |1 |object | |1' ). + lo_nodes->add( '/tab/1 |a |str | One | ' ). + lo_nodes->add( '/tab |2 |object | |2' ). + lo_nodes->add( '/tab/2 |a |str | Two | ' ). + lo_nodes->add( '/ |date1 |str |2020-07-28 | ' ). + lo_nodes->add( '/ |date2 |str |2020-07-28T00:00:00Z | ' ). + lo_nodes->add( '/ |timestamp1 |str |2020-07-28T00:00:00 | ' ). + lo_nodes->add( '/ |timestamp2 |str |2020-07-28T00:00:00Z | ' ). + lo_nodes->add( '/ |timestamp3 |str |2020-07-28T01:00:00+01:00 | ' ). lo_cut->to_abap( lo_nodes->sorted( ) ). @@ -1465,6 +1492,15 @@ CLASS ltcl_json_to_abap IMPLEMENTATION. cl_abap_unit_assert=>assert_equals( act = ls_mock-date2 exp = lv_exp_date ). + cl_abap_unit_assert=>assert_equals( + act = ls_mock-timestamp1 + exp = lv_exp_timestamp ). + cl_abap_unit_assert=>assert_equals( + act = ls_mock-timestamp2 + exp = lv_exp_timestamp ). + cl_abap_unit_assert=>assert_equals( + act = ls_mock-timestamp3 + exp = lv_exp_timestamp ). DATA ls_elem LIKE LINE OF ls_mock-tab. cl_abap_unit_assert=>assert_equals( diff --git a/src/json/zif_abapgit_ajson_reader.intf.abap b/src/json/zif_abapgit_ajson_reader.intf.abap index 9102c4e0a..64cfeb8a1 100644 --- a/src/json/zif_abapgit_ajson_reader.intf.abap +++ b/src/json/zif_abapgit_ajson_reader.intf.abap @@ -41,6 +41,11 @@ INTERFACE zif_abapgit_ajson_reader iv_path TYPE string RETURNING VALUE(rv_value) TYPE d. + METHODS get_timestamp + IMPORTING + iv_path TYPE string + RETURNING + VALUE(rv_value) TYPE timestamp. METHODS get_string IMPORTING iv_path TYPE string