Merge remote-tracking branch 'refs/remotes/larshp/master'

This commit is contained in:
EduardoCopat 2017-01-19 09:43:05 +01:00
commit 4e5b762803
16 changed files with 1849 additions and 1168 deletions

View File

@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100.
* See http://www.abapgit.org * See http://www.abapgit.org
CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT
gc_abap_version TYPE string VALUE 'v1.24.13'. "#EC NOTEXT gc_abap_version TYPE string VALUE 'v1.25.0'. "#EC NOTEXT
******************************************************************************** ********************************************************************************
* The MIT License (MIT) * The MIT License (MIT)

View File

@ -37,7 +37,7 @@ form input:focus, textarea:focus {
.grey { color: lightgrey !important; } .grey { color: lightgrey !important; }
.darkgrey { color: #808080 !important; } .darkgrey { color: #808080 !important; }
.attention { color: red !important; } .attention { color: red !important; }
.blue { color: #5e8dc9; !important; } .blue { color: #5e8dc9 !important; }
.red { color: red !important; } .red { color: red !important; }
/* MODIFIERS */ /* MODIFIERS */
@ -111,9 +111,22 @@ div.menu .menu_end { border-right: 0px !important; }
div.menu a { div.menu a {
padding-left: 0.5em; padding-left: 0.5em;
padding-right: 0.5em; padding-right: 0.5em;
border-right: 1px solid lightgrey;
font-size: 12pt; font-size: 12pt;
} }
div.menu > a {
border-right: 1px solid lightgrey;
}
div.menu > div.dropdown > a {
border-right: 1px solid lightgrey;
}
div.menu > a:last-child {
border-right: 0px !important;
}
div.menu > div.dropdown:last-child > a {
border-right: 0px !important;
}
div.menu_vertical { display: inline; } div.menu_vertical { display: inline; }
div.menu_vertical a { div.menu_vertical a {
display: block; display: block;
@ -415,8 +428,8 @@ span.diff_banner {
padding-right: 0.3em; padding-right: 0.3em;
} }
.diff_ins { .diff_ins {
border-color: #7bea7b; border-color: #abf2ab;
background-color: #d3f8d3; background-color: #e0ffe0;
} }
.diff_del { .diff_del {
border-color: #ff667d; border-color: #ff667d;
@ -500,22 +513,36 @@ table.diff_tab thead.nav_line th {
color: #bbb; color: #bbb;
} }
table.diff_tab td.num, th.num { table.diff_tab td.num, th.num {
text-align: right; width: 1%;
min-width: 2em;
padding-right: 8px;
padding-left: 8px;
text-align: right !important;
color: #ccc; color: #ccc;
border-left: 1px solid #eee; border-left: 1px solid #eee;
border-right: 1px solid #eee; border-right: 1px solid #eee;
-ms-user-select: none;
user-select: none;
}
table.diff_tab td.num::before {
content: attr(line-num);
} }
table.diff_tab code { table.diff_tab code {
font-family: inherit; font-family: inherit;
white-space: pre; white-space: pre;
} }
table.diff_tab td.code {
word-wrap: break-word;
white-space: pre-wrap;
overflow: visible;
}
table.diff_tab code span.keyword { color: #0a69ce; } table.diff_tab .code span.keyword { color: #0a69ce; }
table.diff_tab code span.text { color: #48ce4f; } table.diff_tab .code span.text { color: #48ce4f; }
table.diff_tab code span.comment { color: #808080; font-style: italic; } table.diff_tab .code span.comment { color: #808080; font-style: italic; }
table.diff_tab code span.xml_tag { color: #3370e0; } table.diff_tab .code span.xml_tag { color: #457ce3; }
table.diff_tab code span.attr { color: #f20707; } table.diff_tab .code span.attr { color: #b777fb; }
table.diff_tab code span.attr_val { color: #7a02f9; } table.diff_tab .code span.attr_val { color: #7a02f9; }
table.diff_tab tbody tr:first-child td { padding-top: 0.5em; } table.diff_tab tbody tr:first-child td { padding-top: 0.5em; }
table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; } table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; }

View File

@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values> <asx:values>
<NAME>ZABAPGIT_CSS_COMMON</NAME> <NAME>ZABAPGIT_CSS_COMMON</NAME>
<TEXT>AbapGit common styles</TEXT> <TEXT/>
<PARAMS> <PARAMS>
<WWWPARAMS> <WWWPARAMS>
<RELID>MI</RELID> <RELID>MI</RELID>

View File

@ -111,7 +111,7 @@ CLASS lcl_git_branch_list DEFINITION FINAL.
tag TYPE ty_git_branch_type VALUE 'TG', tag TYPE ty_git_branch_type VALUE 'TG',
other TYPE ty_git_branch_type VALUE 'ZZ', other TYPE ty_git_branch_type VALUE 'ZZ',
END OF c_type. END OF c_type.
CONSTANTS head_name TYPE string VALUE 'HEAD'. CONSTANTS c_head_name TYPE string VALUE 'HEAD'.
METHODS constructor METHODS constructor
IMPORTING iv_data TYPE string IMPORTING iv_data TYPE string
@ -126,6 +126,9 @@ CLASS lcl_git_branch_list DEFINITION FINAL.
RETURNING VALUE(rs_branch) TYPE ty_git_branch RETURNING VALUE(rs_branch) TYPE ty_git_branch
RAISING lcx_exception. RAISING lcx_exception.
METHODS get_head_symref
RETURNING VALUE(rv_head_symref) TYPE string.
METHODS get_branches_only METHODS get_branches_only
RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt
RAISING lcx_exception. RAISING lcx_exception.
@ -150,6 +153,10 @@ CLASS lcl_git_branch_list DEFINITION FINAL.
IMPORTING iv_branch_name TYPE clike IMPORTING iv_branch_name TYPE clike
RETURNING VALUE(rv_name) TYPE string. RETURNING VALUE(rv_name) TYPE string.
CLASS-METHODS normalize_branch_name
IMPORTING iv_branch_name TYPE clike
RETURNING VALUE(rv_name) TYPE string.
PRIVATE SECTION. PRIVATE SECTION.
DATA mt_branches TYPE ty_git_branch_list_tt. DATA mt_branches TYPE ty_git_branch_list_tt.
DATA mv_head_symref TYPE string. DATA mv_head_symref TYPE string.
@ -178,6 +185,10 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
ev_head_symref = me->mv_head_symref ). ev_head_symref = me->mv_head_symref ).
ENDMETHOD. "create ENDMETHOD. "create
METHOD get_head_symref.
rv_head_symref = mv_head_symref.
ENDMETHOD. " get_head_symref.
METHOD find_by_name. METHOD find_by_name.
IF iv_branch_name IS INITIAL. IF iv_branch_name IS INITIAL.
@ -197,7 +208,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
IF mv_head_symref IS NOT INITIAL. IF mv_head_symref IS NOT INITIAL.
rs_branch = find_by_name( mv_head_symref ). rs_branch = find_by_name( mv_head_symref ).
ELSE. ELSE.
rs_branch = find_by_name( head_name ). rs_branch = find_by_name( c_head_name ).
ENDIF. ENDIF.
ENDMETHOD. "get_head ENDMETHOD. "get_head
@ -246,7 +257,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
<ls_branch>-name = lv_name. <ls_branch>-name = lv_name.
<ls_branch>-display_name = get_display_name( lv_name ). <ls_branch>-display_name = get_display_name( lv_name ).
<ls_branch>-type = get_type( lv_name ). <ls_branch>-type = get_type( lv_name ).
IF <ls_branch>-name = head_name OR <ls_branch>-name = ev_head_symref. IF <ls_branch>-name = c_head_name OR <ls_branch>-name = ev_head_symref.
<ls_branch>-is_head = abap_true. <ls_branch>-is_head = abap_true.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
@ -295,7 +306,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
METHOD get_type. METHOD get_type.
rv_type = c_type-other. rv_type = c_type-other.
IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = head_name. IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = c_head_name.
rv_type = c_type-branch. rv_type = c_type-branch.
RETURN. RETURN.
ENDIF. ENDIF.
@ -334,4 +345,11 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
ENDLOOP. ENDLOOP.
ENDMETHOD. "get_tags_only ENDMETHOD. "get_tags_only
METHOD normalize_branch_name.
rv_name = iv_branch_name. " Force convert to string
REPLACE ALL OCCURRENCES OF ` ` IN rv_name WITH '-'. " Disallow space in branch name
ENDMETHOD. " normalize_branch_name.
ENDCLASS. "lcl_git_branch_list ENDCLASS. "lcl_git_branch_list

View File

@ -332,8 +332,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
METHOD render. "TODO refactor METHOD render. "TODO refactor
DATA: lv_class TYPE string, DATA: lv_class TYPE string,
lv_is_drop TYPE abap_bool, lv_is_drop TYPE abap_bool.
lv_last TYPE abap_bool.
FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items. FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items.
@ -359,13 +358,8 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
IF iv_as_angle = abap_true. IF iv_as_angle = abap_true.
ro_html->add( '<div class="dropbtn_angle"></div>' ). ro_html->add( '<div class="dropbtn_angle"></div>' ).
ELSE. ELSE.
lv_class = 'dropbtn'.
IF iv_no_separator = abap_true.
lv_class = lv_class && ' menu_end' ##NO_TEXT.
ENDIF.
ro_html->add_a( iv_txt = iv_as_droplist_with_label ro_html->add_a( iv_txt = iv_as_droplist_with_label
iv_class = lv_class iv_class = 'dropbtn'
iv_act = '' ). iv_act = '' ).
ENDIF. ENDIF.
@ -386,15 +380,8 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ENDIF. ENDIF.
LOOP AT mt_items ASSIGNING <ls_item>. LOOP AT mt_items ASSIGNING <ls_item>.
lv_last = boolc( sy-tabix = lines( mt_items ) ).
IF <ls_item>-sub IS INITIAL. IF <ls_item>-sub IS INITIAL.
CLEAR lv_class.
IF iv_no_separator = abap_true
OR lv_last = abap_true
AND iv_as_droplist_with_label IS INITIAL.
lv_class = 'menu_end'.
ENDIF.
IF iv_with_icons = abap_true. IF iv_with_icons = abap_true.
ro_html->add( '<tr>' ). ro_html->add( '<tr>' ).
@ -405,8 +392,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ro_html->add_a( iv_txt = <ls_item>-txt ro_html->add_a( iv_txt = <ls_item>-txt
iv_act = <ls_item>-act iv_act = <ls_item>-act
iv_opt = <ls_item>-opt iv_opt = <ls_item>-opt
iv_typ = <ls_item>-typ iv_typ = <ls_item>-typ ).
iv_class = lv_class ).
IF iv_with_icons = abap_true. IF iv_with_icons = abap_true.
ro_html->add( '</td>' ). ro_html->add( '</td>' ).
@ -414,9 +400,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ENDIF. ENDIF.
ELSE. ELSE.
ro_html->add( <ls_item>-sub->render( ro_html->add( <ls_item>-sub->render( iv_as_droplist_with_label = <ls_item>-txt ) ).
iv_as_droplist_with_label = <ls_item>-txt
iv_no_separator = lv_last ) ).
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
@ -426,7 +410,8 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ENDIF. ENDIF.
IF lv_is_drop = abap_true. " Dropdown IF lv_is_drop = abap_true. " Dropdown
ro_html->add( '</div></div>' ). ro_html->add( '</div>' ).
ro_html->add( '</div>' ).
ENDIF. ENDIF.
ro_html->add( '</div>' ). ro_html->add( '</div>' ).

View File

@ -162,7 +162,8 @@ CLASS lcl_gui_chunk_lib IMPLEMENTATION.
lv_text = lcl_git_branch_list=>get_display_name( iv_branch ). lv_text = lcl_git_branch_list=>get_display_name( iv_branch ).
IF iv_branch = io_repo->get_head_branch_name( ) OR iv_branch = lcl_git_branch_list=>head_name. IF iv_branch = io_repo->get_head_branch_name( )
OR iv_branch = lcl_git_branch_list=>c_head_name.
lv_class = 'branch branch_head'. lv_class = 'branch branch_head'.
ELSEIF lcl_git_branch_list=>get_type( iv_branch ) = lcl_git_branch_list=>c_type-branch. ELSEIF lcl_git_branch_list=>get_type( iv_branch ) = lcl_git_branch_list=>c_type-branch.
lv_class = 'branch branch_branch'. lv_class = 'branch branch_branch'.

View File

@ -8,6 +8,11 @@
* *
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
INTERFACE lif_object_oriented_object. INTERFACE lif_object_oriented_object.
TYPES: BEGIN OF ty_includes,
programm TYPE programm,
END OF ty_includes,
ty_includes_tt TYPE STANDARD TABLE OF ty_includes WITH DEFAULT KEY.
METHODS: METHODS:
create create
IMPORTING IMPORTING
@ -62,7 +67,12 @@ INTERFACE lif_object_oriented_object.
iv_object_name TYPE dokhl-object iv_object_name TYPE dokhl-object
iv_language TYPE spras iv_language TYPE spras
RAISING RAISING
lcx_exception. lcx_exception,
get_includes
IMPORTING
iv_object_name TYPE sobj_name
RETURNING
VALUE(rt_includes) TYPE ty_includes_tt.
ENDINTERFACE. ENDINTERFACE.
CLASS lcl_object_oriented_base DEFINITION ABSTRACT. CLASS lcl_object_oriented_base DEFINITION ABSTRACT.
@ -85,7 +95,7 @@ CLASS lcl_object_oriented_base IMPLEMENTATION.
METHOD lif_object_oriented_object~create. METHOD lif_object_oriented_object~create.
"Subclass responsibility "Subclass responsibility
RETURN. ASSERT 0 = 1.
ENDMETHOD. ENDMETHOD.
METHOD lif_object_oriented_object~deserialize_source. METHOD lif_object_oriented_object~deserialize_source.
@ -102,7 +112,7 @@ CLASS lcl_object_oriented_base IMPLEMENTATION.
METHOD lif_object_oriented_object~generate_locals. METHOD lif_object_oriented_object~generate_locals.
"Subclass responsibility "Subclass responsibility
RETURN. ASSERT 0 = 1.
ENDMETHOD. ENDMETHOD.
METHOD deserialize_abap_source_old. METHOD deserialize_abap_source_old.
@ -172,12 +182,12 @@ CLASS lcl_object_oriented_base IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD lif_object_oriented_object~insert_text_pool. METHOD lif_object_oriented_object~insert_text_pool.
"Subclass responsibility "Subclass responsibility
RETURN. ASSERT 0 = 1.
ENDMETHOD. ENDMETHOD.
METHOD lif_object_oriented_object~create_sotr. METHOD lif_object_oriented_object~create_sotr.
"Subclass responsibility "Subclass responsibility
RETURN. ASSERT 0 = 1.
ENDMETHOD. ENDMETHOD.
METHOD lif_object_oriented_object~create_documentation. METHOD lif_object_oriented_object~create_documentation.
@ -196,6 +206,11 @@ CLASS lcl_object_oriented_base IMPLEMENTATION.
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD lif_object_oriented_object~get_includes.
"Subclass responsibility
ASSERT 0 = 1.
ENDMETHOD.
ENDCLASS. ENDCLASS.
@ -206,7 +221,8 @@ CLASS lcl_object_oriented_class DEFINITION
lif_object_oriented_object~create REDEFINITION, lif_object_oriented_object~create REDEFINITION,
lif_object_oriented_object~generate_locals REDEFINITION, lif_object_oriented_object~generate_locals REDEFINITION,
lif_object_oriented_object~insert_text_pool REDEFINITION, lif_object_oriented_object~insert_text_pool REDEFINITION,
lif_object_oriented_object~create_sotr REDEFINITION. lif_object_oriented_object~create_sotr REDEFINITION,
lif_object_oriented_object~get_includes REDEFINITION.
ENDCLASS. ENDCLASS.
CLASS lcl_object_oriented_class IMPLEMENTATION. CLASS lcl_object_oriented_class IMPLEMENTATION.
@ -325,13 +341,44 @@ CLASS lcl_object_oriented_class IMPLEMENTATION.
ENDLOOP. ENDLOOP.
ENDMETHOD. ENDMETHOD.
METHOD lif_object_oriented_object~get_includes.
* note: includes returned might not exist
* method cl_oo_classname_service=>GET_ALL_CLASS_INCLUDES does not exist in 702
DATA: lv_class_name TYPE seoclsname,
lt_methods TYPE seop_methods_w_include.
FIELD-SYMBOLS: <ls_method> LIKE LINE OF lt_methods.
lv_class_name = iv_object_name.
APPEND cl_oo_classname_service=>get_ccdef_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_ccmac_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_ccimp_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_cl_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_ccau_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_pubsec_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_prosec_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_prisec_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_classpool_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_ct_name( lv_class_name ) TO rt_includes.
APPEND cl_oo_classname_service=>get_cs_name( lv_class_name ) TO rt_includes.
lt_methods = cl_oo_classname_service=>get_all_method_includes( lv_class_name ).
LOOP AT lt_methods ASSIGNING <ls_method>.
APPEND <ls_method>-incname TO rt_includes.
ENDLOOP.
ENDMETHOD.
ENDCLASS. ENDCLASS.
CLASS lcl_object_oriented_interface DEFINITION CLASS lcl_object_oriented_interface DEFINITION
INHERITING FROM lcl_object_oriented_base. INHERITING FROM lcl_object_oriented_base.
PUBLIC SECTION. PUBLIC SECTION.
METHODS: METHODS:
lif_object_oriented_object~create REDEFINITION. lif_object_oriented_object~create REDEFINITION,
lif_object_oriented_object~get_includes REDEFINITION.
ENDCLASS. ENDCLASS.
CLASS lcl_object_oriented_interface IMPLEMENTATION. CLASS lcl_object_oriented_interface IMPLEMENTATION.
@ -354,6 +401,12 @@ CLASS lcl_object_oriented_interface IMPLEMENTATION.
lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ). lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ).
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD lif_object_oriented_object~get_includes.
DATA lv_interface_name TYPE seoclsname.
lv_interface_name = iv_object_name.
APPEND cl_oo_classname_service=>get_interfacepool_name( lv_interface_name ) TO rt_includes.
ENDMETHOD.
ENDCLASS. ENDCLASS.
CLASS lth_oo_factory_injector DEFINITION DEFERRED. CLASS lth_oo_factory_injector DEFINITION DEFERRED.
@ -403,6 +456,11 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES lif_object. INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files. ALIASES mo_files FOR lif_object~mo_files.
METHODS constructor
IMPORTING
is_item TYPE ty_item
iv_language TYPE spras.
PROTECTED SECTION. PROTECTED SECTION.
METHODS deserialize_abap METHODS deserialize_abap
IMPORTING io_xml TYPE REF TO lcl_xml_input IMPORTING io_xml TYPE REF TO lcl_xml_input
@ -474,10 +532,6 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
METHODS reduce METHODS reduce
CHANGING ct_source TYPE ty_string_tt. CHANGING ct_source TYPE ty_string_tt.
METHODS get_all_class_includes
RETURNING VALUE(rt_includes) TYPE seoincl_t.
ENDCLASS. "lcl_object_dtel DEFINITION ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -487,60 +541,14 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_clas IMPLEMENTATION. CLASS lcl_object_clas IMPLEMENTATION.
METHOD get_all_class_includes.
* note: includes returned might not exist
* method cl_oo_classname_service=>GET_ALL_CLASS_INCLUDES does not exist in 702
DATA: lv_clsname TYPE seoclsname,
lt_methods TYPE seop_methods_w_include.
FIELD-SYMBOLS: <ls_method> LIKE LINE OF lt_methods.
lv_clsname = ms_item-obj_name.
APPEND cl_oo_classname_service=>get_ccdef_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_ccmac_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_ccimp_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_cl_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_ccau_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_pubsec_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_prosec_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_prisec_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_classpool_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_ct_name( lv_clsname ) TO rt_includes.
APPEND cl_oo_classname_service=>get_cs_name( lv_clsname ) TO rt_includes.
lt_methods = cl_oo_classname_service=>get_all_method_includes( lv_clsname ).
LOOP AT lt_methods ASSIGNING <ls_method>.
APPEND <ls_method>-incname TO rt_includes.
ENDLOOP.
ENDMETHOD.
METHOD lif_object~has_changed_since. METHOD lif_object~has_changed_since.
DATA:
lt_includes TYPE seoincl_t.
DATA: lv_clsname TYPE seoclsname, FIELD-SYMBOLS <incl> LIKE LINE OF lt_includes.
lv_program TYPE program,
lt_incl TYPE seoincl_t.
FIELD-SYMBOLS <incl> LIKE LINE OF lt_incl. lt_includes = mo_object_oriented_object->get_includes( ms_item-obj_name ).
LOOP AT lt_includes ASSIGNING <incl>.
lv_clsname = ms_item-obj_name.
CASE ms_item-obj_type.
WHEN 'CLAS'.
TRY.
CALL METHOD cl_oo_classname_service=>('GET_ALL_CLASS_INCLUDES')
EXPORTING
class_name = lv_clsname
RECEIVING
result = lt_incl.
CATCH cx_sy_dyn_call_illegal_method.
* method does not exist in 702, just report everything as changed
rv_changed = abap_true.
ENDTRY.
LOOP AT lt_incl ASSIGNING <incl>.
rv_changed = check_prog_changed_since( rv_changed = check_prog_changed_since(
iv_program = <incl> iv_program = <incl>
iv_timestamp = iv_timestamp iv_timestamp = iv_timestamp
@ -549,16 +557,6 @@ CLASS lcl_object_clas IMPLEMENTATION.
RETURN. RETURN.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
WHEN 'INTF'.
lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ).
rv_changed = check_prog_changed_since(
iv_program = lv_program
iv_timestamp = iv_timestamp
iv_skip_gui = abap_true ).
WHEN OTHERS.
lcx_exception=>raise( 'class delete, unknown type' ).
ENDCASE.
ENDMETHOD. "lif_object~has_changed_since ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
@ -579,21 +577,10 @@ CLASS lcl_object_clas IMPLEMENTATION.
DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc, DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc,
ls_reposrc LIKE LINE OF lt_reposrc, ls_reposrc LIKE LINE OF lt_reposrc,
lt_includes TYPE STANDARD TABLE OF ty_includes, lt_includes TYPE STANDARD TABLE OF ty_includes.
lv_clsname TYPE seoclsname.
lt_includes = mo_object_oriented_object->get_includes( ms_item-obj_name ).
lv_clsname = ms_item-obj_name.
CASE ms_item-obj_type.
WHEN 'CLAS'.
lt_includes = get_all_class_includes( ).
ASSERT lines( lt_includes ) > 0. ASSERT lines( lt_includes ) > 0.
WHEN 'INTF'.
APPEND cl_oo_classname_service=>get_interfacepool_name( lv_clsname ) TO lt_includes.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
SELECT unam udat utime FROM reposrc SELECT unam udat utime FROM reposrc
INTO TABLE lt_reposrc INTO TABLE lt_reposrc
@ -1099,9 +1086,6 @@ CLASS lcl_object_clas IMPLEMENTATION.
ENDMETHOD. "serialize_xml ENDMETHOD. "serialize_xml
METHOD lif_object~deserialize. METHOD lif_object~deserialize.
mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ).
deserialize_abap( io_xml = io_xml deserialize_abap( io_xml = io_xml
iv_package = iv_package ). iv_package = iv_package ).
@ -1237,6 +1221,13 @@ CLASS lcl_object_clas IMPLEMENTATION.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD. ENDMETHOD.
METHOD constructor.
super->constructor(
is_item = is_item
iv_language = iv_language ).
mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ).
ENDMETHOD.
ENDCLASS. "lcl_object_CLAS IMPLEMENTATION ENDCLASS. "lcl_object_CLAS IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -1249,15 +1240,14 @@ CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL.
* https://github.com/larshp/abapGit/issues/21 * https://github.com/larshp/abapGit/issues/21
PUBLIC SECTION. PUBLIC SECTION.
METHODS: METHODS:
lif_object~deserialize REDEFINITION. lif_object~deserialize REDEFINITION,
lif_object~has_changed_since REDEFINITION.
PROTECTED SECTION. PROTECTED SECTION.
METHODS: METHODS:
deserialize_abap REDEFINITION. deserialize_abap REDEFINITION.
ENDCLASS. "lcl_object_intf DEFINITION ENDCLASS. "lcl_object_intf DEFINITION
CLASS lcl_object_intf IMPLEMENTATION. CLASS lcl_object_intf IMPLEMENTATION.
METHOD lif_object~deserialize. METHOD lif_object~deserialize.
mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ).
deserialize_abap( io_xml = io_xml deserialize_abap( io_xml = io_xml
iv_package = iv_package ). iv_package = iv_package ).
@ -1294,4 +1284,18 @@ CLASS lcl_object_intf IMPLEMENTATION.
mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). mo_object_oriented_object->add_to_activation_list( is_item = ms_item ).
ENDMETHOD. ENDMETHOD.
METHOD lif_object~has_changed_since.
DATA:
lv_program TYPE program,
lt_includes TYPE seoincl_t.
lt_includes = mo_object_oriented_object->get_includes( ms_item-obj_name ).
READ TABLE lt_includes INDEX 1 INTO lv_program.
"lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ).
rv_changed = check_prog_changed_since(
iv_program = lv_program
iv_timestamp = iv_timestamp
iv_skip_gui = abap_true ).
ENDMETHOD.
ENDCLASS. ENDCLASS.

File diff suppressed because it is too large Load Diff

View File

@ -7,32 +7,40 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page.
PUBLIC SECTION. PUBLIC SECTION.
CONSTANTS: CONSTANTS:
BEGIN OF c_mod, BEGIN OF c_fstate,
local TYPE char1 VALUE 'L', local TYPE char1 VALUE 'L',
remote TYPE char1 VALUE 'R', remote TYPE char1 VALUE 'R',
both TYPE char1 VALUE 'B', both TYPE char1 VALUE 'B',
END OF c_mod. END OF c_fstate.
TYPES: BEGIN OF ty_file_diff, TYPES: BEGIN OF ty_file_diff,
filename TYPE string, filename TYPE string,
lstate TYPE char1, lstate TYPE char1,
rstate TYPE char1, rstate TYPE char1,
mod TYPE char1, " Abstraction for shorter ifs fstate TYPE char1, " FILE state - Abstraction for shorter ifs
o_diff TYPE REF TO lcl_diff, o_diff TYPE REF TO lcl_diff,
END OF ty_file_diff, END OF ty_file_diff,
tt_file_diff TYPE STANDARD TABLE OF ty_file_diff. tt_file_diff TYPE STANDARD TABLE OF ty_file_diff.
METHODS: constructor METHODS:
constructor
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
is_file TYPE ty_file OPTIONAL is_file TYPE ty_file OPTIONAL
is_object TYPE ty_item OPTIONAL is_object TYPE ty_item OPTIONAL
RAISING lcx_exception. RAISING lcx_exception,
lif_gui_page~on_event REDEFINITION.
PROTECTED SECTION. PROTECTED SECTION.
METHODS render_content REDEFINITION. METHODS render_content REDEFINITION.
PRIVATE SECTION. PRIVATE SECTION.
DATA: mt_diff_files TYPE tt_file_diff. CONSTANTS: BEGIN OF c_actions,
toggle_unified TYPE string VALUE 'toggle_unified',
END OF c_actions.
DATA: mt_diff_files TYPE tt_file_diff,
mt_delayed_lines TYPE lcl_diff=>ty_diffs_tt,
mv_unified TYPE abap_bool VALUE abap_true.
METHODS render_diff METHODS render_diff
IMPORTING is_diff TYPE ty_file_diff IMPORTING is_diff TYPE ty_file_diff
@ -49,16 +57,20 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page.
IMPORTING is_diff_line TYPE lcl_diff=>ty_diff IMPORTING is_diff_line TYPE lcl_diff=>ty_diff
is_diff TYPE ty_file_diff is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html. RETURNING VALUE(ro_html) TYPE REF TO lcl_html.
METHODS get_line_hl METHODS render_line_split
IMPORTING iv_mod TYPE char1 IMPORTING is_diff_line TYPE lcl_diff=>ty_diff
iv_result TYPE lcl_diff=>ty_diff-result iv_fstate TYPE char1
EXPORTING ev_lattr TYPE string RETURNING VALUE(ro_html) TYPE REF TO lcl_html.
ev_rattr TYPE string. METHODS render_line_unified
IMPORTING is_diff_line TYPE lcl_diff=>ty_diff OPTIONAL
RETURNING VALUE(ro_html) TYPE REF TO lcl_html.
METHODS append_diff METHODS append_diff
IMPORTING it_remote TYPE ty_files_tt IMPORTING it_remote TYPE ty_files_tt
it_local TYPE ty_files_item_tt it_local TYPE ty_files_item_tt
is_status TYPE ty_result is_status TYPE ty_result
RAISING lcx_exception. RAISING lcx_exception.
METHODS build_menu
RETURNING VALUE(ro_menu) TYPE REF TO lcl_html_toolbar.
ENDCLASS. "lcl_gui_page_diff ENDCLASS. "lcl_gui_page_diff
@ -75,6 +87,8 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
super->constructor( ). super->constructor( ).
ms_control-page_title = 'DIFF'. ms_control-page_title = 'DIFF'.
ms_control-page_menu = build_menu( ).
mv_unified = lcl_app=>user( )->get_diff_unified( ).
ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed
@ -154,14 +168,14 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
<ls_diff>-rstate = is_status-rstate. <ls_diff>-rstate = is_status-rstate.
IF <ls_diff>-lstate IS NOT INITIAL AND <ls_diff>-rstate IS NOT INITIAL. IF <ls_diff>-lstate IS NOT INITIAL AND <ls_diff>-rstate IS NOT INITIAL.
<ls_diff>-mod = c_mod-both. <ls_diff>-fstate = c_fstate-both.
ELSEIF <ls_diff>-lstate IS NOT INITIAL. ELSEIF <ls_diff>-lstate IS NOT INITIAL.
<ls_diff>-mod = c_mod-local. <ls_diff>-fstate = c_fstate-local.
ELSE. "rstate IS NOT INITIAL, lstate = empty. ELSE. "rstate IS NOT INITIAL, lstate = empty.
<ls_diff>-mod = c_mod-remote. <ls_diff>-fstate = c_fstate-remote.
ENDIF. ENDIF.
IF <ls_diff>-mod = c_mod-remote. " Remote file leading changes IF <ls_diff>-fstate = c_fstate-remote. " Remote file leading changes
CREATE OBJECT <ls_diff>-o_diff CREATE OBJECT <ls_diff>-o_diff
EXPORTING EXPORTING
iv_new = <ls_remote>-data iv_new = <ls_remote>-data
@ -175,45 +189,46 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDMETHOD. "append_diff ENDMETHOD. "append_diff
METHOD render_diff_head. METHOD build_menu.
DATA: lo_html TYPE REF TO lcl_html, CREATE OBJECT ro_menu.
ls_stats TYPE lcl_diff=>ty_count. ro_menu->add( iv_txt = 'Split/Unified view'
iv_act = c_actions-toggle_unified ) ##NO_TEXT.
ENDMETHOD. " build_menu.
CREATE OBJECT lo_html. **********************************************************************
* EVENT HANDLING
**********************************************************************
ls_stats = is_diff-o_diff->stats( ). METHOD lif_gui_page~on_event.
IF is_diff-mod = c_mod-both. " Merge stats into 'update' if both were changed CASE iv_action.
ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete. WHEN c_actions-toggle_unified. " Toggle file diplay
CLEAR: ls_stats-insert, ls_stats-delete. mv_unified = lcl_app=>user( )->toggle_diff_unified( ).
ENDIF. ev_state = gc_event_state-re_render.
ENDCASE.
lo_html->add( '<div class="diff_head">' ). "#EC NOTEXT ENDMETHOD. "lif_gui_page~on_event
lo_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
lo_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
lo_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
lo_html->add( |<span class="diff_name">{ is_diff-filename }</span>| ). "#EC NOTEXT
lo_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_diff-lstate
iv2 = is_diff-rstate ) ).
lo_html->add( '</div>' ). "#EC NOTEXT
ro_html = lo_html. **********************************************************************
ENDMETHOD. * RENDER LOGIC
**********************************************************************
METHOD render_table_head. METHOD render_content.
DATA ls_diff_file LIKE LINE OF mt_diff_files.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( '<thead class="header">' ). "#EC NOTEXT LOOP AT mt_diff_files INTO ls_diff_file.
ro_html->add( '<tr>' ). "#EC NOTEXT lcl_progress=>show( iv_key = 'Diff'
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT iv_current = sy-tabix
ro_html->add( '<th>LOCAL</th>' ). "#EC NOTEXT iv_total = lines( mt_diff_files )
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT iv_text = |Render Diff - { ls_diff_file-filename }| ).
ro_html->add( '<th>REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( '</thead>' ). "#EC NOTEXT
ENDMETHOD. " render_table_head. ro_html->add( render_diff( ls_diff_file ) ).
ENDLOOP.
ENDMETHOD. "render_content
METHOD render_diff. METHOD render_diff.
@ -232,8 +247,67 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ro_html->add( '</div>' ). "#EC NOTEXT ro_html->add( '</div>' ). "#EC NOTEXT
ENDMETHOD. " render_diff
**********************************************************************
* CHUNKS
**********************************************************************
METHOD render_diff_head.
DATA: ls_stats TYPE lcl_diff=>ty_count.
CREATE OBJECT ro_html.
ls_stats = is_diff-o_diff->stats( ).
IF is_diff-fstate = c_fstate-both. " Merge stats into 'update' if both were changed
ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete.
CLEAR: ls_stats-insert, ls_stats-delete.
ENDIF.
ro_html->add( '<div class="diff_head">' ). "#EC NOTEXT
ro_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
ro_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
ro_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
ro_html->add( |<span class="diff_name">{ is_diff-filename }</span>| ). "#EC NOTEXT
ro_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_diff-lstate
iv2 = is_diff-rstate ) ).
IF is_diff-fstate = c_fstate-both AND mv_unified = abap_true.
ro_html->add( '<span class="attention pad-sides">Attention: Unified mode'
&& ' highlighting for MM assumes local file is newer ! </span>' ). "#EC NOTEXT
ENDIF.
ro_html->add( '</div>' ). "#EC NOTEXT
ENDMETHOD. ENDMETHOD.
METHOD render_table_head.
CREATE OBJECT ro_html.
IF mv_unified = abap_true.
ro_html->add( '<thead class="header">' ). "#EC NOTEXT
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( '<th class="num">old</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num">new</th>' ). "#EC NOTEXT
ro_html->add( '<th>code</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( '</thead>' ). "#EC NOTEXT
ELSE.
ro_html->add( '<thead class="header">' ). "#EC NOTEXT
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>LOCAL</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( '</thead>' ). "#EC NOTEXT
ENDIF.
ENDMETHOD. " render_table_head.
METHOD render_beacon. METHOD render_beacon.
DATA: lv_beacon TYPE string. DATA: lv_beacon TYPE string.
@ -246,10 +320,19 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
lv_beacon = '---'. lv_beacon = '---'.
ENDIF. ENDIF.
ro_html->add( '<thead class="nav_line">' ). ro_html->add( '<thead class="nav_line">' ).
ro_html->add( '<tr>' ). ro_html->add( '<tr>' ).
IF mv_unified = abap_true.
ro_html->add( '<th class="num"></th>' ). ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th colspan="3">@@ { is_diff_line-new_line } @@ { lv_beacon }</th>| ). ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th>@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
ELSE.
ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th colspan="3">@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
ENDIF.
ro_html->add( '</tr>' ). ro_html->add( '</tr>' ).
ro_html->add( '</thead>' ). ro_html->add( '</thead>' ).
@ -259,10 +342,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
DATA: lo_highlighter TYPE REF TO lcl_syntax_highlighter, DATA: lo_highlighter TYPE REF TO lcl_syntax_highlighter,
lt_diffs TYPE lcl_diff=>ty_diffs_tt, lt_diffs TYPE lcl_diff=>ty_diffs_tt,
lv_local TYPE string,
lv_remote TYPE string,
lv_lattr TYPE string,
lv_rattr TYPE string,
lv_insert_nav TYPE abap_bool. lv_insert_nav TYPE abap_bool.
FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs. FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs.
@ -283,83 +362,125 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
lv_insert_nav = abap_false. lv_insert_nav = abap_false.
ENDIF. ENDIF.
IF is_diff-mod = c_mod-remote. " Remote file leading changes
lv_local = <ls_diff>-old.
lv_remote = <ls_diff>-new.
ELSE. " Local leading changes or both were modified
lv_local = <ls_diff>-new.
lv_remote = <ls_diff>-old.
ENDIF.
IF lo_highlighter IS BOUND. IF lo_highlighter IS BOUND.
lv_local = lo_highlighter->process_line( lv_local ). <ls_diff>-new = lo_highlighter->process_line( <ls_diff>-new ).
lv_remote = lo_highlighter->process_line( lv_remote ). <ls_diff>-old = lo_highlighter->process_line( <ls_diff>-old ).
ELSE. ELSE.
lv_local = escape( val = lv_local format = cl_abap_format=>e_html_attr ). <ls_diff>-new = escape( val = <ls_diff>-new format = cl_abap_format=>e_html_attr ).
lv_remote = escape( val = lv_remote format = cl_abap_format=>e_html_attr ). <ls_diff>-old = escape( val = <ls_diff>-old format = cl_abap_format=>e_html_attr ).
ENDIF. ENDIF.
get_line_hl( EXPORTING iv_mod = is_diff-mod CONDENSE <ls_diff>-new_num. "get rid of leading spaces
iv_result = <ls_diff>-result CONDENSE <ls_diff>-old_num.
IMPORTING ev_lattr = lv_lattr
ev_rattr = lv_rattr ).
ro_html->add( '<tr>' ). "#EC NOTEXT IF mv_unified = abap_true.
ro_html->add( |<td class="num">{ <ls_diff>-new_line }</td>| ). "#EC NOTEXT ro_html->add( render_line_unified( is_diff_line = <ls_diff> ) ).
ro_html->add( |<td{ lv_lattr }><code>{ lv_local }</code></td>| ). "#EC NOTEXT ELSE.
ro_html->add( |<td class="num">{ <ls_diff>-old_line }</td>| ). "#EC NOTEXT ro_html->add( render_line_split( is_diff_line = <ls_diff>
ro_html->add( |<td{ lv_rattr }><code>{ lv_remote }</code></td>| ). "#EC NOTEXT iv_fstate = is_diff-fstate ) ).
ro_html->add( '</tr>' ). "#EC NOTEXT ENDIF.
ENDLOOP. ENDLOOP.
ENDMETHOD. IF mv_unified = abap_true.
ro_html->add( render_line_unified( ) ). " Release delayed lines
METHOD get_line_hl.
CLEAR: ev_lattr, ev_rattr. " Class for changed lines
IF iv_result IS INITIAL.
RETURN.
ENDIF. ENDIF.
" Both file changed ? Or line updated ? - All yellow ENDMETHOD. "render_lines
IF iv_mod = c_mod-both OR iv_result = lcl_diff=>c_diff-update.
ev_lattr = ' class="diff_upd"'. "#EC NOTEXT
ev_rattr = ' class="diff_upd"'. "#EC NOTEXT
ELSEIF iv_mod = c_mod-local. " Changed locally
CASE iv_result.
WHEN lcl_diff=>c_diff-insert.
ev_lattr = ' class="diff_ins"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete.
ev_rattr = ' class="diff_del"'. "#EC NOTEXT
ENDCASE.
ELSEIF iv_mod = c_mod-remote. " Changed remotely - invert sides
CASE iv_result.
WHEN lcl_diff=>c_diff-insert.
ev_rattr = ' class="diff_ins"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete.
ev_lattr = ' class="diff_del"'. "#EC NOTEXT
ENDCASE.
ENDIF.
ENDMETHOD. " get_line_hl. METHOD render_line_split.
METHOD render_content. DATA: lv_new TYPE string,
lv_old TYPE string,
DATA ls_diff_file LIKE LINE OF mt_diff_files. lv_mark TYPE string,
lv_bg TYPE string.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
LOOP AT mt_diff_files INTO ls_diff_file. " New line
lcl_progress=>show( iv_key = 'Diff' lv_mark = ` `.
iv_current = sy-tabix IF iv_fstate = c_fstate-both OR is_diff_line-result = lcl_diff=>c_diff-update.
iv_total = lines( mt_diff_files ) lv_bg = ' diff_upd'.
iv_text = |Render Diff - { ls_diff_file-filename }| ). lv_mark = `~`.
ELSEIF is_diff_line-result = lcl_diff=>c_diff-insert.
lv_bg = ' diff_ins'.
lv_mark = `+`.
ENDIF.
lv_new = |<td class="num" line-num="{ is_diff_line-new_num }"></td>|
&& |<td class="code{ lv_bg }">{ lv_mark }{ is_diff_line-new }</td>|.
ro_html->add( render_diff( ls_diff_file ) ). " Old line
CLEAR lv_bg.
lv_mark = ` `.
IF iv_fstate = c_fstate-both OR is_diff_line-result = lcl_diff=>c_diff-update.
lv_bg = ' diff_upd'.
lv_mark = `~`.
ELSEIF is_diff_line-result = lcl_diff=>c_diff-delete.
lv_bg = ' diff_del'.
lv_mark = `-`.
ENDIF.
lv_old = |<td class="num" line-num="{ is_diff_line-old_num }"></td>|
&& |<td class="code{ lv_bg }">{ lv_mark }{ is_diff_line-old }</td>|.
" render line, inverse sides if remote is newer
ro_html->add( '<tr>' ). "#EC NOTEXT
IF iv_fstate = c_fstate-remote. " Remote file leading changes
ro_html->add( lv_old ). " local
ro_html->add( lv_new ). " remote
ELSE. " Local leading changes or both were modified
ro_html->add( lv_new ). " local
ro_html->add( lv_old ). " remote
ENDIF.
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDMETHOD. "render_line_split
METHOD render_line_unified.
DATA lv_line TYPE string.
FIELD-SYMBOLS <diff_line> LIKE LINE OF mt_delayed_lines.
CREATE OBJECT ro_html.
" Release delayed subsequent update lines
IF is_diff_line-result <> lcl_diff=>c_diff-update.
LOOP AT mt_delayed_lines ASSIGNING <diff_line>.
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( |<td class="num" line-num="{ <diff_line>-old_num }"></td>|
&& |<td class="num" line-num=""></td>|
&& |<td class="code diff_del">-{ <diff_line>-old }</td>| ).
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDLOOP. ENDLOOP.
LOOP AT mt_delayed_lines ASSIGNING <diff_line>.
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( |<td class="num" line-num=""></td>|
&& |<td class="num" line-num="{ <diff_line>-new_num }"></td>|
&& |<td class="code diff_ins">+{ <diff_line>-new }</td>| ).
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDLOOP.
CLEAR mt_delayed_lines.
ENDIF.
ENDMETHOD. "render_content ro_html->add( '<tr>' ). "#EC NOTEXT
CASE is_diff_line-result.
WHEN lcl_diff=>c_diff-update.
APPEND is_diff_line TO mt_delayed_lines. " Delay output of subsequent updates
WHEN lcl_diff=>c_diff-insert.
ro_html->add( |<td class="num" line-num=""></td>|
&& |<td class="num" line-num="{ is_diff_line-new_num }"></td>|
&& |<td class="code diff_ins">+{ is_diff_line-new }</td>| ).
WHEN lcl_diff=>c_diff-delete.
ro_html->add( |<td class="num" line-num="{ is_diff_line-old_num }"></td>|
&& |<td class="num" line-num=""></td>|
&& |<td class="code diff_del">-{ is_diff_line-old }</td>| ).
WHEN OTHERS. "none
ro_html->add( |<td class="num" line-num="{ is_diff_line-old_num }"></td>|
&& |<td class="num" line-num="{ is_diff_line-new_num }"></td>|
&& |<td class="code"> { is_diff_line-old }</td>| ).
ENDCASE.
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDMETHOD. "render_line_unified
ENDCLASS. "lcl_gui_page_diff ENDCLASS. "lcl_gui_page_diff

View File

@ -422,6 +422,14 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
RETURNING VALUE(rv_changes_only) TYPE abap_bool RETURNING VALUE(rv_changes_only) TYPE abap_bool
RAISING lcx_exception. RAISING lcx_exception.
METHODS toggle_diff_unified
RETURNING VALUE(rv_diff_unified) TYPE abap_bool
RAISING lcx_exception.
METHODS get_diff_unified
RETURNING VALUE(rv_diff_unified) TYPE abap_bool
RAISING lcx_exception.
METHODS get_favorites METHODS get_favorites
RETURNING VALUE(rt_favorites) TYPE tt_favorites RETURNING VALUE(rt_favorites) TYPE tt_favorites
RAISING lcx_exception. RAISING lcx_exception.
@ -454,6 +462,7 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
repo_config TYPE ty_repo_config_tt, repo_config TYPE ty_repo_config_tt,
hide_files TYPE abap_bool, hide_files TYPE abap_bool,
changes_only TYPE abap_bool, changes_only TYPE abap_bool,
diff_unified TYPE abap_bool,
favorites TYPE tt_favorites, favorites TYPE tt_favorites,
END OF ty_user. END OF ty_user.
@ -698,6 +707,24 @@ CLASS lcl_persistence_user IMPLEMENTATION.
ENDMETHOD. "get_changes_only ENDMETHOD. "get_changes_only
METHOD toggle_diff_unified.
DATA ls_user TYPE ty_user.
ls_user = read( ).
ls_user-diff_unified = boolc( ls_user-diff_unified = abap_false ).
update( ls_user ).
rv_diff_unified = ls_user-diff_unified.
ENDMETHOD. "toggle_diff_unified
METHOD get_diff_unified.
rv_diff_unified = read( )-diff_unified.
ENDMETHOD. "get_diff_unified
METHOD get_favorites. METHOD get_favorites.
rt_favorites = read( )-favorites. rt_favorites = read( )-favorites.

View File

@ -174,7 +174,7 @@ CLASS lcl_popups IMPLEMENTATION.
CLEAR: ev_name, ev_cancel. CLEAR: ev_name, ev_cancel.
* TAB FLD LABEL DEF ATTR * TAB FLD LABEL DEF ATTR
_add_dialog_fld 'TEXTL' 'LINE' 'Name' 'new_branch_name' ''. _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'new-branch-name' ''.
CALL FUNCTION 'POPUP_GET_VALUES' CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING EXPORTING
@ -195,7 +195,8 @@ CLASS lcl_popups IMPLEMENTATION.
ELSE. ELSE.
READ TABLE lt_fields INDEX 1 ASSIGNING <ls_field>. READ TABLE lt_fields INDEX 1 ASSIGNING <ls_field>.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
ev_name = lcl_git_branch_list=>complete_heads_branch_name( <ls_field>-value ). ev_name = lcl_git_branch_list=>complete_heads_branch_name(
lcl_git_branch_list=>normalize_branch_name( <ls_field>-value ) ).
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
@ -284,6 +285,7 @@ CLASS lcl_popups IMPLEMENTATION.
DATA: lo_branches TYPE REF TO lcl_git_branch_list, DATA: lo_branches TYPE REF TO lcl_git_branch_list,
lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt,
lv_head_suffix TYPE string,
lv_answer TYPE c LENGTH 1, lv_answer TYPE c LENGTH 1,
lv_default TYPE i VALUE 1, "Default cursor position lv_default TYPE i VALUE 1, "Default cursor position
lt_selection TYPE TABLE OF spopli. lt_selection TYPE TABLE OF spopli.
@ -293,15 +295,30 @@ CLASS lcl_popups IMPLEMENTATION.
lo_branches = lcl_git_transport=>branches( iv_url ). lo_branches = lcl_git_transport=>branches( iv_url ).
lt_branches = lo_branches->get_branches_only( ). lt_branches = lo_branches->get_branches_only( ).
LOOP AT lt_branches ASSIGNING <ls_branch>. lv_head_suffix = | ({ lcl_git_branch_list=>c_head_name })|.
APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
<ls_sel>-varoption = <ls_branch>-name.
LOOP AT lt_branches ASSIGNING <ls_branch>.
IF <ls_branch>-name = lcl_git_branch_list=>c_head_name
AND <ls_branch>-name <> lo_branches->get_head_symref( ).
" HEAD but other HEAD symref exist
CONTINUE.
ENDIF.
APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
IF iv_default_branch IS NOT INITIAL AND iv_default_branch = <ls_branch>-name. IF iv_default_branch IS NOT INITIAL AND iv_default_branch = <ls_branch>-name.
lv_default = sy-tabix. lv_default = sy-tabix.
ENDIF. ENDIF.
IF <ls_branch>-name = lo_branches->get_head_symref( )
AND <ls_branch>-name <> lcl_git_branch_list=>c_head_name.
" HEAD symref but not HEAD itself
<ls_sel>-varoption = <ls_branch>-display_name && lv_head_suffix.
ELSE.
<ls_sel>-varoption = <ls_branch>-display_name.
ENDIF.
ENDLOOP. ENDLOOP.
IF iv_show_new_option = abap_true. IF iv_show_new_option = abap_true.
@ -339,7 +356,10 @@ CLASS lcl_popups IMPLEMENTATION.
IF iv_show_new_option = abap_true AND <ls_sel>-varoption = c_new_branch_label. IF iv_show_new_option = abap_true AND <ls_sel>-varoption = c_new_branch_label.
rs_branch-name = c_new_branch_label. rs_branch-name = c_new_branch_label.
ELSE. ELSE.
rs_branch = lo_branches->find_by_name( <ls_sel>-varoption ). REPLACE FIRST OCCURRENCE OF lv_head_suffix IN <ls_sel>-varoption WITH ''.
READ TABLE lt_branches WITH KEY display_name = <ls_sel>-varoption ASSIGNING <ls_branch>.
ASSERT sy-subrc = 0.
rs_branch = lo_branches->find_by_name( <ls_branch>-name ).
ENDIF. ENDIF.

View File

@ -242,10 +242,10 @@ CLASS ltcl_diff IMPLEMENTATION.
DEFINE _expected. DEFINE _expected.
CLEAR ms_expected. CLEAR ms_expected.
ms_expected-new_line = &1. ms_expected-new_num = &1.
ms_expected-new = &2. ms_expected-new = &2.
ms_expected-result = &3. ms_expected-result = &3.
ms_expected-old_line = &4. ms_expected-old_num = &4.
ms_expected-old = &5. ms_expected-old = &5.
APPEND ms_expected TO mt_expected. APPEND ms_expected TO mt_expected.
END-OF-DEFINITION. END-OF-DEFINITION.
@ -2210,548 +2210,4 @@ CLASS ltcl_persistence_settings IMPLEMENTATION.
ENDCLASS. ENDCLASS.
INCLUDE ZABAPGIT_UNIT_TEST_CLAS_INTF.
CLASS ltd_spy_oo_object DEFINITION FOR TESTING.
PUBLIC SECTION.
INTERFACES: lif_object_oriented_object.
DATA:
mv_package TYPE devclass,
mv_overwrite TYPE seox_boolean,
ms_interface_properties TYPE vseointerf,
ms_class_properties TYPE vseoclass,
ms_locals_key TYPE seoclskey,
mt_local_definitions TYPE rswsourcet,
mt_local_implementations TYPE rswsourcet,
mt_local_macros TYPE rswsourcet,
mt_local_test_classes TYPE rswsourcet,
mv_force TYPE seoflag,
ms_deserialize_key TYPE seoclskey,
mt_source TYPE ty_string_tt,
ms_item_to_activate TYPE ty_item,
mt_descriptions TYPE ty_seocompotx_tt,
ms_description_key TYPE seoclskey,
mv_text_pool_class_name TYPE seoclsname,
mt_text_pool TYPE textpool_table,
mv_text_pool_inserted TYPE abap_bool,
mt_sotr TYPE ty_sotr_tt,
mt_sotr_package TYPE devclass,
mv_docu_object_name TYPE dokhl-object,
mv_docu_language TYPE spras,
mt_docu_lines TYPE tlinetab.
ENDCLASS.
CLASS ltd_spy_oo_object IMPLEMENTATION.
METHOD lif_object_oriented_object~create.
DATA lv_properties_structure_name TYPE string.
lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name.
IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name.
ms_interface_properties = is_properties.
ELSE.
ms_class_properties = is_properties.
ENDIF.
mv_package = iv_package.
mv_overwrite = iv_overwrite.
ENDMETHOD.
METHOD lif_object_oriented_object~generate_locals.
ms_locals_key = is_key.
mt_local_definitions = it_local_definitions.
mt_local_implementations = it_local_implementations.
mt_local_macros = it_local_macros.
mt_local_test_classes = it_local_test_classes.
mv_force = iv_force.
ENDMETHOD.
METHOD lif_object_oriented_object~deserialize_source.
ms_deserialize_key = is_key.
mt_source = it_source.
ENDMETHOD.
METHOD lif_object_oriented_object~add_to_activation_list.
ms_item_to_activate = is_item.
ENDMETHOD.
METHOD lif_object_oriented_object~update_descriptions.
ms_description_key = is_key.
mt_descriptions = it_descriptions.
ENDMETHOD.
METHOD lif_object_oriented_object~insert_text_pool.
mv_text_pool_inserted = abap_true.
mv_text_pool_class_name = iv_class_name.
mt_text_pool = it_text_pool.
cl_abap_unit_assert=>assert_equals(
act = iv_language
exp = sy-langu ).
ENDMETHOD.
METHOD lif_object_oriented_object~create_sotr.
mt_sotr = it_sotr.
mt_sotr_package = iv_package.
ENDMETHOD.
METHOD lif_object_oriented_object~create_documentation.
mv_docu_object_name = iv_object_name.
mv_docu_language = iv_language.
mt_docu_lines = it_lines.
ENDMETHOD.
ENDCLASS.
CLASS ltd_fake_object_files DEFINITION FOR TESTING
INHERITING FROM lcl_objects_files.
PUBLIC SECTION.
METHODS constructor.
METHODS read_abap REDEFINITION.
DATA:
mt_sources TYPE seop_source_string,
mt_local_definitions TYPE seop_source_string,
mt_local_implementations TYPE seop_source_string,
mt_local_macros TYPE seop_source_string,
mt_local_test_classes TYPE seop_source_string.
ENDCLASS.
CLASS ltd_fake_object_files IMPLEMENTATION.
METHOD read_abap.
CASE iv_extra.
WHEN 'locals_def'.
rt_abap = mt_local_definitions.
WHEN 'locals_imp'.
rt_abap = mt_local_implementations.
WHEN 'macros'.
rt_abap = mt_local_macros.
WHEN 'testclasses'.
rt_abap = mt_local_test_classes.
WHEN OTHERS.
rt_abap = mt_sources.
RETURN.
ENDCASE.
cl_abap_unit_assert=>assert_equals( act = iv_error
exp = abap_false ).
ENDMETHOD.
METHOD constructor.
DATA ls_empty_item TYPE ty_item.
super->constructor( ls_empty_item ).
APPEND 'source' TO me->mt_sources.
APPEND 'definition' TO me->mt_local_definitions.
APPEND 'implementation' TO me->mt_local_implementations.
APPEND 'macro' TO me->mt_local_macros.
APPEND 'test' TO me->mt_local_test_classes.
ENDMETHOD.
ENDCLASS.
CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
PROTECTED SECTION.
DATA:
mo_spy_oo_object TYPE REF TO ltd_spy_oo_object,
mo_fake_object_files TYPE REF TO ltd_fake_object_files,
mo_xml_input TYPE REF TO lcl_xml_input,
mo_xml_out TYPE REF TO lcl_xml_output,
mo_oo_object TYPE REF TO lif_object,
ms_item TYPE ty_item.
METHODS: when_deserializing
RAISING
lcx_exception,
then_should_deserialize_source,
given_the_descriptions
IMPORTING
it_descriptions TYPE ty_seocompotx_tt
RAISING
lcx_exception,
then_shuld_update_descriptions
IMPORTING
it_descriptions TYPE ty_seocompotx_tt,
then_it_should_add_activation,
given_documentation_in_xml_as
IMPORTING
it_lines TYPE tlinetab
RAISING
lcx_exception,
then_docu_should_be_created
IMPORTING
it_lines TYPE tlinetab.
ENDCLASS.
CLASS ltc_oo_test IMPLEMENTATION.
METHOD then_docu_should_be_created.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_docu_lines
exp = it_lines ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_docu_object_name
exp = ms_item-obj_name ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_docu_language
exp = sy-langu ).
ENDMETHOD.
METHOD given_documentation_in_xml_as.
mo_xml_out->add(
iv_name = 'LINES'
ig_data = it_lines ).
ENDMETHOD.
METHOD then_it_should_add_activation.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_item_to_activate
exp = ms_item ).
ENDMETHOD.
METHOD then_shuld_update_descriptions.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_descriptions
exp = it_descriptions ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_description_key
exp = ms_item-obj_name ).
ENDMETHOD.
METHOD given_the_descriptions.
mo_xml_out->add(
iv_name = 'DESCRIPTIONS'
ig_data = it_descriptions ).
ENDMETHOD.
METHOD then_should_deserialize_source.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_source
exp = mo_fake_object_files->mt_sources ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_deserialize_key
exp = ms_item-obj_name ).
ENDMETHOD.
METHOD when_deserializing.
CREATE OBJECT mo_xml_input
EXPORTING
iv_xml = mo_xml_out->render( ).
mo_oo_object->deserialize(
iv_package = 'package_name'
io_xml = mo_xml_input ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT
INHERITING FROM ltc_oo_test.
PRIVATE SECTION.
METHODS:
setup,
given_a_class_properties
RAISING
lcx_exception,
then_should_create_class,
then_it_should_generate_locals,
should_create_class FOR TESTING RAISING cx_static_check,
should_generate_locals FOR TESTING RAISING cx_static_check,
should_deserialize_source FOR TESTING RAISING cx_static_check,
should_update_descriptions FOR TESTING RAISING cx_static_check,
should_add_to_activation FOR TESTING RAISING cx_static_check,
no_text_pool_no_insert FOR TESTING RAISING cx_static_check,
insert_text_pool FOR TESTING RAISING cx_static_check,
create_stor_from_xml FOR TESTING RAISING cx_static_check,
create_documentation FOR TESTING RAISING cx_static_check.
DATA:
ms_class_properties TYPE vseoclass.
ENDCLASS.
CLASS ltcl_class_deserialization IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_fake_object_files.
CREATE OBJECT mo_spy_oo_object.
CREATE OBJECT mo_xml_out.
lth_oo_factory_injector=>inject( mo_spy_oo_object ).
ms_item-devclass = 'package_name'.
ms_item-obj_name = 'zcl_class'.
ms_item-obj_type = 'CLAS'.
CREATE OBJECT mo_oo_object TYPE lcl_object_clas
EXPORTING
is_item = ms_item
iv_language = sy-langu.
mo_oo_object->mo_files = mo_fake_object_files.
ENDMETHOD.
METHOD should_create_class.
ms_class_properties-clsname = ms_item-obj_name.
given_a_class_properties( ).
when_deserializing( ).
then_should_create_class( ).
ENDMETHOD.
METHOD should_generate_locals.
given_a_class_properties( ).
when_deserializing( ).
then_it_should_generate_locals( ).
ENDMETHOD.
METHOD should_deserialize_source.
given_a_class_properties( ).
when_deserializing( ).
then_should_deserialize_source( ).
ENDMETHOD.
METHOD should_update_descriptions.
DATA:
ls_description TYPE seocompotx,
lt_descriptions TYPE ty_seocompotx_tt.
given_a_class_properties( ).
ls_description-clsname = ms_item-obj_name.
ls_description-cmpname = 'a_method'.
APPEND ls_description TO lt_descriptions.
given_the_descriptions( lt_descriptions ).
when_deserializing( ).
then_shuld_update_descriptions( lt_descriptions ).
ENDMETHOD.
METHOD should_add_to_activation.
given_a_class_properties( ).
when_deserializing( ).
then_it_should_add_activation( ).
ENDMETHOD.
METHOD given_a_class_properties.
mo_xml_out->add(
iv_name = 'VSEOCLASS'
ig_data = ms_class_properties ).
ENDMETHOD.
METHOD then_should_create_class.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_class_properties
exp = ms_class_properties ).
cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_package
exp = 'package_name' ).
ENDMETHOD.
METHOD then_it_should_generate_locals.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_locals_key
exp = ms_item-obj_name ).
cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_force
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_local_definitions
exp = mo_fake_object_files->mt_local_definitions ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_local_implementations
exp = mo_fake_object_files->mt_local_implementations ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_local_macros
exp = mo_fake_object_files->mt_local_macros ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_local_test_classes
exp = mo_fake_object_files->mt_local_test_classes ).
ENDMETHOD.
METHOD no_text_pool_no_insert.
given_a_class_properties( ).
when_deserializing( ).
cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_text_pool_inserted
exp = abap_false ).
ENDMETHOD.
METHOD insert_text_pool.
DATA: lt_pool_external TYPE textpool_table,
ls_pool_external TYPE ty_tpool.
ls_pool_external-id = 'ID'.
ls_pool_external-key = 'KEY'.
APPEND ls_pool_external TO lt_pool_external.
given_a_class_properties( ).
mo_xml_out->add(
iv_name = 'TPOOL'
ig_data = lt_pool_external ).
when_deserializing( ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_text_pool
exp = lt_pool_external ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_text_pool_class_name
exp = 'zcl_class' ).
ENDMETHOD.
METHOD create_stor_from_xml.
DATA:
lt_sotr TYPE ty_sotr_tt,
ls_sotr LIKE LINE OF lt_sotr.
given_a_class_properties( ).
ls_sotr-header-concept = 'HEADER'.
APPEND ls_sotr TO lt_sotr.
mo_xml_out->add(
iv_name = 'SOTR'
ig_data = lt_sotr ).
when_deserializing( ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_sotr
exp = lt_sotr ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_sotr_package
exp = 'package_name' ).
ENDMETHOD.
METHOD create_documentation.
DATA: lt_lines TYPE tlinetab,
ls_line TYPE LINE OF tlinetab.
ls_line-tdline = 'Class Line Doc'.
APPEND ls_line TO lt_lines.
given_a_class_properties( ).
given_documentation_in_xml_as( lt_lines ).
when_deserializing( ).
then_docu_should_be_created( lt_lines ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT
INHERITING FROM ltc_oo_test.
PRIVATE SECTION.
METHODS:
setup,
given_an_interface_properties
RAISING
lcx_exception,
then_should_create_interface,
create_interface FOR TESTING RAISING cx_static_check,
update_descriptions FOR TESTING RAISING cx_static_check,
add_to_activation FOR TESTING RAISING cx_static_check,
deserialize_source FOR TESTING RAISING cx_static_check,
create_documentation FOR TESTING RAISING cx_static_check.
DATA:
ms_interface_properties TYPE vseointerf.
ENDCLASS.
CLASS ltcl_interface_deserialization IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_fake_object_files.
CREATE OBJECT mo_spy_oo_object.
CREATE OBJECT mo_xml_out.
lth_oo_factory_injector=>inject( mo_spy_oo_object ).
ms_item-devclass = 'package_name'.
ms_item-obj_name = 'zif_interface'.
ms_item-obj_type = 'INTF'.
CREATE OBJECT mo_oo_object TYPE lcl_object_intf
EXPORTING
is_item = ms_item
iv_language = sy-langu.
mo_oo_object->mo_files = mo_fake_object_files.
ENDMETHOD.
METHOD create_interface.
ms_interface_properties-clsname = ms_item-obj_name.
given_an_interface_properties( ).
when_deserializing( ).
then_should_create_interface( ).
ENDMETHOD.
METHOD update_descriptions.
DATA:
ls_description TYPE seocompotx,
lt_descriptions TYPE ty_seocompotx_tt.
given_an_interface_properties( ).
ls_description-clsname = ms_item-obj_name.
ls_description-cmpname = 'a_method'.
APPEND ls_description TO lt_descriptions.
given_the_descriptions( lt_descriptions ).
when_deserializing( ).
then_shuld_update_descriptions( lt_descriptions ).
ENDMETHOD.
METHOD add_to_activation.
given_an_interface_properties( ).
when_deserializing( ).
then_it_should_add_activation( ).
ENDMETHOD.
METHOD deserialize_source.
given_an_interface_properties( ).
when_deserializing( ).
then_should_deserialize_source( ).
ENDMETHOD.
METHOD given_an_interface_properties.
mo_xml_out->add(
iv_name = 'VSEOINTERF'
ig_data = ms_interface_properties ).
ENDMETHOD.
METHOD then_should_create_interface.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_interface_properties
exp = ms_interface_properties ).
cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_package
exp = 'package_name' ).
ENDMETHOD.
METHOD create_documentation.
DATA: lt_lines TYPE tlinetab,
ls_line TYPE LINE OF tlinetab.
ls_line-tdline = 'Interface Line Doc'.
APPEND ls_line TO lt_lines.
given_an_interface_properties( ).
given_documentation_in_xml_as( lt_lines ).
when_deserializing( ).
then_docu_should_be_created( lt_lines ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,646 @@
CLASS ltd_spy_oo_object DEFINITION FOR TESTING.
PUBLIC SECTION.
INTERFACES: lif_object_oriented_object.
DATA:
mv_package TYPE devclass,
mv_overwrite TYPE seox_boolean,
ms_interface_properties TYPE vseointerf,
ms_class_properties TYPE vseoclass,
ms_locals_key TYPE seoclskey,
mt_local_definitions TYPE rswsourcet,
mt_local_implementations TYPE rswsourcet,
mt_local_macros TYPE rswsourcet,
mt_local_test_classes TYPE rswsourcet,
mv_force TYPE seoflag,
ms_deserialize_key TYPE seoclskey,
mt_source TYPE ty_string_tt,
ms_item_to_activate TYPE ty_item,
mt_descriptions TYPE ty_seocompotx_tt,
ms_description_key TYPE seoclskey,
mv_text_pool_class_name TYPE seoclsname,
mt_text_pool TYPE textpool_table,
mv_text_pool_inserted TYPE abap_bool,
mt_sotr TYPE ty_sotr_tt,
mt_sotr_package TYPE devclass,
mv_docu_object_name TYPE dokhl-object,
mv_docu_language TYPE spras,
mt_docu_lines TYPE tlinetab,
mv_get_includes_called TYPE abap_bool.
ENDCLASS.
CLASS ltd_spy_oo_object IMPLEMENTATION.
METHOD lif_object_oriented_object~create.
DATA lv_properties_structure_name TYPE string.
lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name.
IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name.
ms_interface_properties = is_properties.
ELSE.
ms_class_properties = is_properties.
ENDIF.
mv_package = iv_package.
mv_overwrite = iv_overwrite.
ENDMETHOD.
METHOD lif_object_oriented_object~generate_locals.
ms_locals_key = is_key.
mt_local_definitions = it_local_definitions.
mt_local_implementations = it_local_implementations.
mt_local_macros = it_local_macros.
mt_local_test_classes = it_local_test_classes.
mv_force = iv_force.
ENDMETHOD.
METHOD lif_object_oriented_object~deserialize_source.
ms_deserialize_key = is_key.
mt_source = it_source.
ENDMETHOD.
METHOD lif_object_oriented_object~add_to_activation_list.
ms_item_to_activate = is_item.
ENDMETHOD.
METHOD lif_object_oriented_object~update_descriptions.
ms_description_key = is_key.
mt_descriptions = it_descriptions.
ENDMETHOD.
METHOD lif_object_oriented_object~insert_text_pool.
mv_text_pool_inserted = abap_true.
mv_text_pool_class_name = iv_class_name.
mt_text_pool = it_text_pool.
cl_abap_unit_assert=>assert_equals(
act = iv_language
exp = sy-langu ).
ENDMETHOD.
METHOD lif_object_oriented_object~create_sotr.
mt_sotr = it_sotr.
mt_sotr_package = iv_package.
ENDMETHOD.
METHOD lif_object_oriented_object~create_documentation.
mv_docu_object_name = iv_object_name.
mv_docu_language = iv_language.
mt_docu_lines = it_lines.
ENDMETHOD.
METHOD lif_object_oriented_object~get_includes.
APPEND 'dummy' TO rt_includes.
mv_get_includes_called = abap_true.
ENDMETHOD.
ENDCLASS.
CLASS ltd_fake_object_files DEFINITION FOR TESTING
INHERITING FROM lcl_objects_files.
PUBLIC SECTION.
METHODS constructor.
METHODS read_abap REDEFINITION.
DATA:
mt_sources TYPE seop_source_string,
mt_local_definitions TYPE seop_source_string,
mt_local_implementations TYPE seop_source_string,
mt_local_macros TYPE seop_source_string,
mt_local_test_classes TYPE seop_source_string.
ENDCLASS.
CLASS ltd_fake_object_files IMPLEMENTATION.
METHOD read_abap.
CASE iv_extra.
WHEN 'locals_def'.
rt_abap = mt_local_definitions.
WHEN 'locals_imp'.
rt_abap = mt_local_implementations.
WHEN 'macros'.
rt_abap = mt_local_macros.
WHEN 'testclasses'.
rt_abap = mt_local_test_classes.
WHEN OTHERS.
rt_abap = mt_sources.
RETURN.
ENDCASE.
cl_abap_unit_assert=>assert_equals( act = iv_error
exp = abap_false ).
ENDMETHOD.
METHOD constructor.
DATA ls_empty_item TYPE ty_item.
super->constructor( ls_empty_item ).
APPEND 'source' TO me->mt_sources.
APPEND 'definition' TO me->mt_local_definitions.
APPEND 'implementation' TO me->mt_local_implementations.
APPEND 'macro' TO me->mt_local_macros.
APPEND 'test' TO me->mt_local_test_classes.
ENDMETHOD.
ENDCLASS.
CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
PROTECTED SECTION.
DATA:
mo_spy_oo_object TYPE REF TO ltd_spy_oo_object,
mo_fake_object_files TYPE REF TO ltd_fake_object_files,
mo_xml_input TYPE REF TO lcl_xml_input,
mo_xml_out TYPE REF TO lcl_xml_output,
mo_oo_object TYPE REF TO lif_object,
ms_item TYPE ty_item.
METHODS: when_deserializing
RAISING
lcx_exception,
then_should_deserialize_source,
given_the_descriptions
IMPORTING
it_descriptions TYPE ty_seocompotx_tt
RAISING
lcx_exception,
then_shuld_update_descriptions
IMPORTING
it_descriptions TYPE ty_seocompotx_tt,
then_it_should_add_activation,
given_documentation_in_xml_as
IMPORTING
it_lines TYPE tlinetab
RAISING
lcx_exception,
then_docu_should_be_created
IMPORTING
it_lines TYPE tlinetab.
ENDCLASS.
CLASS ltc_oo_test IMPLEMENTATION.
METHOD then_docu_should_be_created.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_docu_lines
exp = it_lines ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_docu_object_name
exp = ms_item-obj_name ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_docu_language
exp = sy-langu ).
ENDMETHOD.
METHOD given_documentation_in_xml_as.
mo_xml_out->add(
iv_name = 'LINES'
ig_data = it_lines ).
ENDMETHOD.
METHOD then_it_should_add_activation.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_item_to_activate
exp = ms_item ).
ENDMETHOD.
METHOD then_shuld_update_descriptions.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_descriptions
exp = it_descriptions ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_description_key
exp = ms_item-obj_name ).
ENDMETHOD.
METHOD given_the_descriptions.
mo_xml_out->add(
iv_name = 'DESCRIPTIONS'
ig_data = it_descriptions ).
ENDMETHOD.
METHOD then_should_deserialize_source.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_source
exp = mo_fake_object_files->mt_sources ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_deserialize_key
exp = ms_item-obj_name ).
ENDMETHOD.
METHOD when_deserializing.
CREATE OBJECT mo_xml_input
EXPORTING
iv_xml = mo_xml_out->render( ).
mo_oo_object->deserialize(
iv_package = 'package_name'
io_xml = mo_xml_input ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT
INHERITING FROM ltc_oo_test.
PRIVATE SECTION.
METHODS:
setup,
given_a_class_properties
RAISING
lcx_exception,
then_should_create_class,
then_it_should_generate_locals,
should_create_class FOR TESTING RAISING cx_static_check,
should_generate_locals FOR TESTING RAISING cx_static_check,
should_deserialize_source FOR TESTING RAISING cx_static_check,
should_update_descriptions FOR TESTING RAISING cx_static_check,
should_add_to_activation FOR TESTING RAISING cx_static_check,
no_text_pool_no_insert FOR TESTING RAISING cx_static_check,
insert_text_pool FOR TESTING RAISING cx_static_check,
create_stor_from_xml FOR TESTING RAISING cx_static_check,
create_documentation FOR TESTING RAISING cx_static_check.
DATA:
ms_class_properties TYPE vseoclass.
ENDCLASS.
CLASS ltcl_class_deserialization IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_fake_object_files.
CREATE OBJECT mo_spy_oo_object.
CREATE OBJECT mo_xml_out.
lth_oo_factory_injector=>inject( mo_spy_oo_object ).
ms_item-devclass = 'package_name'.
ms_item-obj_name = 'zcl_class'.
ms_item-obj_type = 'CLAS'.
CREATE OBJECT mo_oo_object TYPE lcl_object_clas
EXPORTING
is_item = ms_item
iv_language = sy-langu.
mo_oo_object->mo_files = mo_fake_object_files.
ENDMETHOD.
METHOD should_create_class.
ms_class_properties-clsname = ms_item-obj_name.
given_a_class_properties( ).
when_deserializing( ).
then_should_create_class( ).
ENDMETHOD.
METHOD should_generate_locals.
given_a_class_properties( ).
when_deserializing( ).
then_it_should_generate_locals( ).
ENDMETHOD.
METHOD should_deserialize_source.
given_a_class_properties( ).
when_deserializing( ).
then_should_deserialize_source( ).
ENDMETHOD.
METHOD should_update_descriptions.
DATA:
ls_description TYPE seocompotx,
lt_descriptions TYPE ty_seocompotx_tt.
given_a_class_properties( ).
ls_description-clsname = ms_item-obj_name.
ls_description-cmpname = 'a_method'.
APPEND ls_description TO lt_descriptions.
given_the_descriptions( lt_descriptions ).
when_deserializing( ).
then_shuld_update_descriptions( lt_descriptions ).
ENDMETHOD.
METHOD should_add_to_activation.
given_a_class_properties( ).
when_deserializing( ).
then_it_should_add_activation( ).
ENDMETHOD.
METHOD given_a_class_properties.
mo_xml_out->add(
iv_name = 'VSEOCLASS'
ig_data = ms_class_properties ).
ENDMETHOD.
METHOD then_should_create_class.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_class_properties
exp = ms_class_properties ).
cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_package
exp = 'package_name' ).
ENDMETHOD.
METHOD then_it_should_generate_locals.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_locals_key
exp = ms_item-obj_name ).
cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_force
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_local_definitions
exp = mo_fake_object_files->mt_local_definitions ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_local_implementations
exp = mo_fake_object_files->mt_local_implementations ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_local_macros
exp = mo_fake_object_files->mt_local_macros ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_local_test_classes
exp = mo_fake_object_files->mt_local_test_classes ).
ENDMETHOD.
METHOD no_text_pool_no_insert.
given_a_class_properties( ).
when_deserializing( ).
cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_text_pool_inserted
exp = abap_false ).
ENDMETHOD.
METHOD insert_text_pool.
DATA: lt_pool_external TYPE textpool_table,
ls_pool_external TYPE ty_tpool.
ls_pool_external-id = 'ID'.
ls_pool_external-key = 'KEY'.
APPEND ls_pool_external TO lt_pool_external.
given_a_class_properties( ).
mo_xml_out->add(
iv_name = 'TPOOL'
ig_data = lt_pool_external ).
when_deserializing( ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_text_pool
exp = lt_pool_external ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_text_pool_class_name
exp = 'zcl_class' ).
ENDMETHOD.
METHOD create_stor_from_xml.
DATA:
lt_sotr TYPE ty_sotr_tt,
ls_sotr LIKE LINE OF lt_sotr.
given_a_class_properties( ).
ls_sotr-header-concept = 'HEADER'.
APPEND ls_sotr TO lt_sotr.
mo_xml_out->add(
iv_name = 'SOTR'
ig_data = lt_sotr ).
when_deserializing( ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_sotr
exp = lt_sotr ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mt_sotr_package
exp = 'package_name' ).
ENDMETHOD.
METHOD create_documentation.
DATA: lt_lines TYPE tlinetab,
ls_line TYPE LINE OF tlinetab.
ls_line-tdline = 'Class Line Doc'.
APPEND ls_line TO lt_lines.
given_a_class_properties( ).
given_documentation_in_xml_as( lt_lines ).
when_deserializing( ).
then_docu_should_be_created( lt_lines ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT
INHERITING FROM ltc_oo_test.
PRIVATE SECTION.
METHODS:
setup,
given_an_interface_properties
RAISING
lcx_exception,
then_should_create_interface,
create_interface FOR TESTING RAISING cx_static_check,
update_descriptions FOR TESTING RAISING cx_static_check,
add_to_activation FOR TESTING RAISING cx_static_check,
deserialize_source FOR TESTING RAISING cx_static_check,
create_documentation FOR TESTING RAISING cx_static_check.
DATA:
ms_interface_properties TYPE vseointerf.
ENDCLASS.
CLASS ltcl_interface_deserialization IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_fake_object_files.
CREATE OBJECT mo_spy_oo_object.
CREATE OBJECT mo_xml_out.
lth_oo_factory_injector=>inject( mo_spy_oo_object ).
ms_item-devclass = 'package_name'.
ms_item-obj_name = 'zif_interface'.
ms_item-obj_type = 'INTF'.
CREATE OBJECT mo_oo_object TYPE lcl_object_intf
EXPORTING
is_item = ms_item
iv_language = sy-langu.
mo_oo_object->mo_files = mo_fake_object_files.
ENDMETHOD.
METHOD create_interface.
ms_interface_properties-clsname = ms_item-obj_name.
given_an_interface_properties( ).
when_deserializing( ).
then_should_create_interface( ).
ENDMETHOD.
METHOD update_descriptions.
DATA:
ls_description TYPE seocompotx,
lt_descriptions TYPE ty_seocompotx_tt.
given_an_interface_properties( ).
ls_description-clsname = ms_item-obj_name.
ls_description-cmpname = 'a_method'.
APPEND ls_description TO lt_descriptions.
given_the_descriptions( lt_descriptions ).
when_deserializing( ).
then_shuld_update_descriptions( lt_descriptions ).
ENDMETHOD.
METHOD add_to_activation.
given_an_interface_properties( ).
when_deserializing( ).
then_it_should_add_activation( ).
ENDMETHOD.
METHOD deserialize_source.
given_an_interface_properties( ).
when_deserializing( ).
then_should_deserialize_source( ).
ENDMETHOD.
METHOD given_an_interface_properties.
mo_xml_out->add(
iv_name = 'VSEOINTERF'
ig_data = ms_interface_properties ).
ENDMETHOD.
METHOD then_should_create_interface.
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->ms_interface_properties
exp = ms_interface_properties ).
cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_package
exp = 'package_name' ).
ENDMETHOD.
METHOD create_documentation.
DATA: lt_lines TYPE tlinetab,
ls_line TYPE LINE OF tlinetab.
ls_line-tdline = 'Interface Line Doc'.
APPEND ls_line TO lt_lines.
given_an_interface_properties( ).
given_documentation_in_xml_as( lt_lines ).
when_deserializing( ).
then_docu_should_be_created( lt_lines ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_class_changed DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT
INHERITING FROM ltc_oo_test.
PRIVATE SECTION.
METHODS:
setup,
changed_by_call_get_includes FOR TESTING RAISING cx_static_check,
changed_since_call_get_include FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_class_changed IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_fake_object_files.
CREATE OBJECT mo_spy_oo_object.
CREATE OBJECT mo_xml_out.
lth_oo_factory_injector=>inject( mo_spy_oo_object ).
ms_item-devclass = 'package_name'.
ms_item-obj_name = 'zcl_class'.
ms_item-obj_type = 'CLAS'.
CREATE OBJECT mo_oo_object TYPE lcl_object_clas
EXPORTING
is_item = ms_item
iv_language = sy-langu.
mo_oo_object->mo_files = mo_fake_object_files.
ENDMETHOD.
METHOD changed_by_call_get_includes.
DATA lv_username TYPE xubname.
lv_username = mo_oo_object->changed_by( ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_get_includes_called
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = lv_username
exp = lcl_objects_super=>c_user_unknown ).
ENDMETHOD.
METHOD changed_since_call_get_include.
DATA lv_timestamp TYPE timestamp.
GET TIME STAMP FIELD lv_timestamp.
mo_oo_object->has_changed_since( lv_timestamp ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_get_includes_called
exp = abap_true ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_interface_changed DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT
INHERITING FROM ltc_oo_test.
PRIVATE SECTION.
METHODS:
setup,
changed_by_call_get_includes FOR TESTING RAISING cx_static_check,
changed_since_call_get_include FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_interface_changed IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_fake_object_files.
CREATE OBJECT mo_spy_oo_object.
CREATE OBJECT mo_xml_out.
lth_oo_factory_injector=>inject( mo_spy_oo_object ).
ms_item-devclass = 'package_name'.
ms_item-obj_name = 'zif_interface'.
ms_item-obj_type = 'INTF'.
CREATE OBJECT mo_oo_object TYPE lcl_object_intf
EXPORTING
is_item = ms_item
iv_language = sy-langu.
mo_oo_object->mo_files = mo_fake_object_files.
ENDMETHOD.
METHOD changed_by_call_get_includes.
DATA lv_username TYPE xubname.
lv_username = mo_oo_object->changed_by( ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_get_includes_called
exp = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = lv_username
exp = lcl_objects_super=>c_user_unknown ).
ENDMETHOD.
METHOD changed_since_call_get_include.
DATA lv_timestamp TYPE timestamp.
GET TIME STAMP FIELD lv_timestamp.
mo_oo_object->has_changed_since( lv_timestamp ).
cl_abap_unit_assert=>assert_equals(
act = mo_spy_oo_object->mv_get_includes_called
exp = abap_true ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_UNIT_TEST_CLAS_INTF</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL>S</DBAPL>
<DBNA>D$</DBNA>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD/>
<FIXPT>X</FIXPT>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Unit tests for classes and interfaces objecst</ENTRY>
<LENGTH>45</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -547,10 +547,10 @@ CLASS lcl_diff DEFINITION FINAL.
END OF c_diff. END OF c_diff.
TYPES: BEGIN OF ty_diff, TYPES: BEGIN OF ty_diff,
new_line TYPE c LENGTH 6, new_num TYPE c LENGTH 6,
new TYPE string, new TYPE string,
result TYPE c LENGTH 1, result TYPE c LENGTH 1,
old_line TYPE c LENGTH 6, old_num TYPE c LENGTH 6,
old TYPE string, old TYPE string,
short TYPE abap_bool, short TYPE abap_bool,
beacon TYPE i, beacon TYPE i,
@ -697,16 +697,16 @@ CLASS lcl_diff IMPLEMENTATION.
LOOP AT mt_diff ASSIGNING <ls_diff>. LOOP AT mt_diff ASSIGNING <ls_diff>.
<ls_diff>-new_line = lv_new. <ls_diff>-new_num = lv_new.
<ls_diff>-old_line = lv_old. <ls_diff>-old_num = lv_old.
CASE <ls_diff>-result. " Line nums CASE <ls_diff>-result. " Line nums
WHEN c_diff-delete. WHEN c_diff-delete.
lv_old = lv_old + 1. lv_old = lv_old + 1.
CLEAR <ls_diff>-new_line. CLEAR <ls_diff>-new_num.
WHEN c_diff-insert. WHEN c_diff-insert.
lv_new = lv_new + 1. lv_new = lv_new + 1.
CLEAR <ls_diff>-old_line. CLEAR <ls_diff>-old_num.
WHEN OTHERS. WHEN OTHERS.
lv_new = lv_new + 1. lv_new = lv_new + 1.
lv_old = lv_old + 1. lv_old = lv_old + 1.

View File

@ -27,12 +27,12 @@ CLASS lcl_zip DEFINITION FINAL.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-METHODS file_upload CLASS-METHODS file_upload
RETURNING value(rv_xstr) TYPE xstring RETURNING VALUE(rv_xstr) TYPE xstring
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS unzip_file CLASS-METHODS unzip_file
IMPORTING iv_xstr TYPE xstring IMPORTING iv_xstr TYPE xstring
RETURNING value(rt_files) TYPE ty_files_tt RETURNING VALUE(rt_files) TYPE ty_files_tt
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS normalize_path CLASS-METHODS normalize_path
@ -52,11 +52,11 @@ CLASS lcl_zip DEFINITION FINAL.
CLASS-METHODS encode_files CLASS-METHODS encode_files
IMPORTING it_files TYPE ty_files_item_tt IMPORTING it_files TYPE ty_files_item_tt
RETURNING value(rv_xstr) TYPE xstring RETURNING VALUE(rv_xstr) TYPE xstring
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS get_message CLASS-METHODS get_message
RETURNING value(rv_message) TYPE string RETURNING VALUE(rv_message) TYPE string
RAISING lcx_exception. RAISING lcx_exception.
ENDCLASS. "lcl_zip DEFINITION ENDCLASS. "lcl_zip DEFINITION
@ -342,10 +342,9 @@ CLASS lcl_zip IMPLEMENTATION.
METHOD unzip_file. METHOD unzip_file.
DATA: lo_zip TYPE REF TO cl_abap_zip, DATA: lo_zip TYPE REF TO cl_abap_zip,
lv_xstr TYPE xstring, lv_data TYPE xstring.
lt_splice TYPE cl_abap_zip=>t_splice_entries.
FIELD-SYMBOLS: <ls_splice> LIKE LINE OF lt_splice, FIELD-SYMBOLS: <ls_zipfile> TYPE cl_abap_zip=>t_file,
<ls_file> LIKE LINE OF rt_files. <ls_file> LIKE LINE OF rt_files.
@ -359,14 +358,13 @@ CLASS lcl_zip IMPLEMENTATION.
lcx_exception=>raise( 'error from zip' ). lcx_exception=>raise( 'error from zip' ).
ENDIF. ENDIF.
lt_splice = cl_abap_zip=>splice( iv_xstr ). LOOP AT lo_zip->files ASSIGNING <ls_zipfile>.
LOOP AT lt_splice ASSIGNING <ls_splice>.
lo_zip->get( lo_zip->get(
EXPORTING EXPORTING
name = <ls_splice>-name name = <ls_zipfile>-name
IMPORTING IMPORTING
content = lv_xstr content = lv_data
EXCEPTIONS EXCEPTIONS
zip_index_error = 1 zip_index_error = 1
zip_decompression_error = 2 zip_decompression_error = 2
@ -379,12 +377,12 @@ CLASS lcl_zip IMPLEMENTATION.
filename( filename(
EXPORTING EXPORTING
iv_str = <ls_splice>-name iv_str = <ls_zipfile>-name
IMPORTING IMPORTING
ev_path = <ls_file>-path ev_path = <ls_file>-path
ev_filename = <ls_file>-filename ). ev_filename = <ls_file>-filename ).
<ls_file>-data = lv_xstr. <ls_file>-data = lv_data.
<ls_file>-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob <ls_file>-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob
iv_data = <ls_file>-data ). iv_data = <ls_file>-data ).