abapgit-agent 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/abap/guidelines/00_index.md +35 -0
- package/abap/guidelines/01_sql.md +72 -0
- package/abap/guidelines/02_exceptions.md +108 -0
- package/abap/guidelines/03_testing.md +252 -0
- package/abap/guidelines/04_cds.md +120 -0
- package/abap/guidelines/05_classes.md +50 -0
- package/abap/guidelines/06_objects.md +103 -0
- package/abap/guidelines/07_json.md +22 -0
- package/abap/guidelines/08_abapgit.md +193 -0
- package/bin/abapgit-agent +467 -30
- package/bin/abgagt +24 -0
- package/package.json +8 -2
- package/src/abap-client.js +65 -2
- package/src/agent.js +57 -3
- package/src/ref-search.js +989 -0
- package/.abapGitAgent.example +0 -11
- package/.github/workflows/release.yml +0 -60
- package/API.md +0 -710
- package/CLAUDE.md +0 -1058
- package/CLAUDE_MEM.md +0 -88
- package/ERROR_HANDLING.md +0 -30
- package/INSTALL.md +0 -155
- package/RELEASE_NOTES.md +0 -143
- package/abap/CLAUDE.md +0 -1010
- package/abap/copilot-instructions.md +0 -79
- package/abap/package.devc.xml +0 -10
- package/abap/zcl_abgagt_agent.clas.abap +0 -420
- package/abap/zcl_abgagt_agent.clas.xml +0 -15
- package/abap/zcl_abgagt_cmd_factory.clas.abap +0 -48
- package/abap/zcl_abgagt_cmd_factory.clas.xml +0 -15
- package/abap/zcl_abgagt_command_create.clas.abap +0 -95
- package/abap/zcl_abgagt_command_create.clas.xml +0 -15
- package/abap/zcl_abgagt_command_import.clas.abap +0 -138
- package/abap/zcl_abgagt_command_import.clas.xml +0 -15
- package/abap/zcl_abgagt_command_inspect.clas.abap +0 -456
- package/abap/zcl_abgagt_command_inspect.clas.testclasses.abap +0 -121
- package/abap/zcl_abgagt_command_inspect.clas.xml +0 -16
- package/abap/zcl_abgagt_command_preview.clas.abap +0 -386
- package/abap/zcl_abgagt_command_preview.clas.xml +0 -15
- package/abap/zcl_abgagt_command_pull.clas.abap +0 -80
- package/abap/zcl_abgagt_command_pull.clas.testclasses.abap +0 -87
- package/abap/zcl_abgagt_command_pull.clas.xml +0 -16
- package/abap/zcl_abgagt_command_tree.clas.abap +0 -237
- package/abap/zcl_abgagt_command_tree.clas.xml +0 -15
- package/abap/zcl_abgagt_command_unit.clas.abap +0 -297
- package/abap/zcl_abgagt_command_unit.clas.xml +0 -15
- package/abap/zcl_abgagt_command_view.clas.abap +0 -240
- package/abap/zcl_abgagt_command_view.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_create.clas.abap +0 -71
- package/abap/zcl_abgagt_resource_create.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_health.clas.abap +0 -25
- package/abap/zcl_abgagt_resource_health.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_import.clas.abap +0 -66
- package/abap/zcl_abgagt_resource_import.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_inspect.clas.abap +0 -63
- package/abap/zcl_abgagt_resource_inspect.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_preview.clas.abap +0 -67
- package/abap/zcl_abgagt_resource_preview.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_pull.clas.abap +0 -71
- package/abap/zcl_abgagt_resource_pull.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_tree.clas.abap +0 -70
- package/abap/zcl_abgagt_resource_tree.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_unit.clas.abap +0 -64
- package/abap/zcl_abgagt_resource_unit.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_view.clas.abap +0 -68
- package/abap/zcl_abgagt_resource_view.clas.xml +0 -15
- package/abap/zcl_abgagt_rest_handler.clas.abap +0 -32
- package/abap/zcl_abgagt_rest_handler.clas.xml +0 -15
- package/abap/zcl_abgagt_util.clas.abap +0 -93
- package/abap/zcl_abgagt_util.clas.testclasses.abap +0 -84
- package/abap/zcl_abgagt_util.clas.xml +0 -16
- package/abap/zcl_abgagt_viewer_clas.clas.abap +0 -58
- package/abap/zcl_abgagt_viewer_clas.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_ddls.clas.abap +0 -83
- package/abap/zcl_abgagt_viewer_ddls.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_dtel.clas.abap +0 -98
- package/abap/zcl_abgagt_viewer_dtel.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_factory.clas.abap +0 -41
- package/abap/zcl_abgagt_viewer_factory.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_intf.clas.abap +0 -58
- package/abap/zcl_abgagt_viewer_intf.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_stru.clas.abap +0 -59
- package/abap/zcl_abgagt_viewer_stru.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_tabl.clas.abap +0 -59
- package/abap/zcl_abgagt_viewer_tabl.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_ttyp.clas.abap +0 -93
- package/abap/zcl_abgagt_viewer_ttyp.clas.xml +0 -15
- package/abap/zif_abgagt_agent.intf.abap +0 -53
- package/abap/zif_abgagt_agent.intf.xml +0 -15
- package/abap/zif_abgagt_cmd_factory.intf.abap +0 -7
- package/abap/zif_abgagt_cmd_factory.intf.xml +0 -15
- package/abap/zif_abgagt_command.intf.abap +0 -26
- package/abap/zif_abgagt_command.intf.xml +0 -15
- package/abap/zif_abgagt_util.intf.abap +0 -28
- package/abap/zif_abgagt_util.intf.xml +0 -15
- package/abap/zif_abgagt_viewer.intf.abap +0 -12
- package/abap/zif_abgagt_viewer.intf.xml +0 -15
- package/docs/commands.md +0 -142
- package/docs/create-command.md +0 -129
- package/docs/health-command.md +0 -89
- package/docs/import-command.md +0 -195
- package/docs/init-command.md +0 -189
- package/docs/inspect-command.md +0 -169
- package/docs/list-command.md +0 -289
- package/docs/preview-command.md +0 -528
- package/docs/pull-command.md +0 -202
- package/docs/status-command.md +0 -68
- package/docs/tree-command.md +0 -303
- package/docs/unit-command.md +0 -167
- package/docs/view-command.md +0 -501
- package/img/claude.png +0 -0
- package/scripts/claude-integration.js +0 -351
- package/scripts/release.js +0 -298
- package/scripts/release.sh +0 -60
- package/scripts/test-integration.js +0 -139
- package/scripts/unrelease.js +0 -277
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
*"* use this source file for your test class implementation
|
|
2
|
-
*"* local test class
|
|
3
|
-
CLASS ltcl_cmd_inspect DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
|
4
|
-
PRIVATE SECTION.
|
|
5
|
-
DATA mo_cut TYPE REF TO zcl_abgagt_command_inspect.
|
|
6
|
-
|
|
7
|
-
METHODS setup.
|
|
8
|
-
METHODS test_get_name FOR TESTING.
|
|
9
|
-
METHODS test_interface FOR TESTING.
|
|
10
|
-
METHODS test_exec_no_files FOR TESTING.
|
|
11
|
-
METHODS test_exec_single_file FOR TESTING.
|
|
12
|
-
METHODS test_exec_multi_files FOR TESTING.
|
|
13
|
-
ENDCLASS.
|
|
14
|
-
|
|
15
|
-
CLASS ltcl_cmd_inspect IMPLEMENTATION.
|
|
16
|
-
|
|
17
|
-
METHOD setup.
|
|
18
|
-
CREATE OBJECT mo_cut.
|
|
19
|
-
ENDMETHOD.
|
|
20
|
-
|
|
21
|
-
METHOD test_get_name.
|
|
22
|
-
" Test that get_name returns the correct command name
|
|
23
|
-
DATA(lv_name) = mo_cut->zif_abgagt_command~get_name( ).
|
|
24
|
-
cl_abap_unit_assert=>assert_equals(
|
|
25
|
-
act = lv_name
|
|
26
|
-
exp = zif_abgagt_command=>gc_inspect
|
|
27
|
-
msg = 'Command name should be INSPECT' ).
|
|
28
|
-
ENDMETHOD.
|
|
29
|
-
|
|
30
|
-
METHOD test_interface.
|
|
31
|
-
" Test that the class implements the command interface
|
|
32
|
-
DATA lo_interface TYPE REF TO zif_abgagt_command.
|
|
33
|
-
CREATE OBJECT mo_cut TYPE zcl_abgagt_command_inspect.
|
|
34
|
-
lo_interface = mo_cut.
|
|
35
|
-
cl_abap_unit_assert=>assert_bound(
|
|
36
|
-
act = lo_interface
|
|
37
|
-
msg = 'Object should implement zif_abgagt_command interface' ).
|
|
38
|
-
ENDMETHOD.
|
|
39
|
-
|
|
40
|
-
METHOD test_exec_no_files.
|
|
41
|
-
" Test execute with no files - should return error
|
|
42
|
-
DATA: BEGIN OF ls_param,
|
|
43
|
-
files TYPE string_table,
|
|
44
|
-
END OF ls_param.
|
|
45
|
-
|
|
46
|
-
DATA(lv_result) = mo_cut->zif_abgagt_command~execute( is_param = ls_param ).
|
|
47
|
-
|
|
48
|
-
cl_abap_unit_assert=>assert_not_initial(
|
|
49
|
-
act = lv_result
|
|
50
|
-
msg = 'Result should not be initial' ).
|
|
51
|
-
|
|
52
|
-
" Result should be valid JSON (starts with { and ends with })
|
|
53
|
-
cl_abap_unit_assert=>assert_char_cp(
|
|
54
|
-
act = lv_result
|
|
55
|
-
exp = '*{*'
|
|
56
|
-
msg = 'Result should be valid JSON object' ).
|
|
57
|
-
|
|
58
|
-
" Result should contain ERROR_COUNT or error_count
|
|
59
|
-
cl_abap_unit_assert=>assert_char_cp(
|
|
60
|
-
act = lv_result
|
|
61
|
-
exp = '*ERROR_COUNT*'
|
|
62
|
-
msg = 'Result should contain error_count field' ).
|
|
63
|
-
ENDMETHOD.
|
|
64
|
-
|
|
65
|
-
METHOD test_exec_single_file.
|
|
66
|
-
" Test execute with a single file
|
|
67
|
-
DATA: BEGIN OF ls_param,
|
|
68
|
-
files TYPE string_table,
|
|
69
|
-
END OF ls_param.
|
|
70
|
-
|
|
71
|
-
APPEND 'zcl_my_class.clas.abap' TO ls_param-files.
|
|
72
|
-
|
|
73
|
-
DATA(lv_result) = mo_cut->zif_abgagt_command~execute( is_param = ls_param ).
|
|
74
|
-
|
|
75
|
-
cl_abap_unit_assert=>assert_not_initial(
|
|
76
|
-
act = lv_result
|
|
77
|
-
msg = 'Result should not be initial' ).
|
|
78
|
-
|
|
79
|
-
" Result should be valid JSON
|
|
80
|
-
cl_abap_unit_assert=>assert_char_cp(
|
|
81
|
-
act = lv_result
|
|
82
|
-
exp = '*{*'
|
|
83
|
-
msg = 'Result should be valid JSON object' ).
|
|
84
|
-
|
|
85
|
-
" Result should contain SUCCESS or success field
|
|
86
|
-
cl_abap_unit_assert=>assert_char_cp(
|
|
87
|
-
act = lv_result
|
|
88
|
-
exp = '*SUCCESS*'
|
|
89
|
-
msg = 'Result should contain success field' ).
|
|
90
|
-
ENDMETHOD.
|
|
91
|
-
|
|
92
|
-
METHOD test_exec_multi_files.
|
|
93
|
-
" Test execute with multiple files
|
|
94
|
-
DATA: BEGIN OF ls_param,
|
|
95
|
-
files TYPE string_table,
|
|
96
|
-
END OF ls_param.
|
|
97
|
-
|
|
98
|
-
APPEND 'zcl_my_class.clas.abap' TO ls_param-files.
|
|
99
|
-
APPEND 'zif_my_intf.intf.abap' TO ls_param-files.
|
|
100
|
-
APPEND 'zcl_another.clas.abap' TO ls_param-files.
|
|
101
|
-
|
|
102
|
-
DATA(lv_result) = mo_cut->zif_abgagt_command~execute( is_param = ls_param ).
|
|
103
|
-
|
|
104
|
-
cl_abap_unit_assert=>assert_not_initial(
|
|
105
|
-
act = lv_result
|
|
106
|
-
msg = 'Result should not be initial' ).
|
|
107
|
-
|
|
108
|
-
" Result should be valid JSON
|
|
109
|
-
cl_abap_unit_assert=>assert_char_cp(
|
|
110
|
-
act = lv_result
|
|
111
|
-
exp = '*{*'
|
|
112
|
-
msg = 'Result should be valid JSON object' ).
|
|
113
|
-
|
|
114
|
-
" Result should contain ERROR_COUNT or error_count
|
|
115
|
-
cl_abap_unit_assert=>assert_char_cp(
|
|
116
|
-
act = lv_result
|
|
117
|
-
exp = '*ERROR_COUNT*'
|
|
118
|
-
msg = 'Result should contain error_count field' ).
|
|
119
|
-
ENDMETHOD.
|
|
120
|
-
|
|
121
|
-
ENDCLASS.
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
-
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
|
3
|
-
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
4
|
-
<asx:values>
|
|
5
|
-
<VSEOCLASS>
|
|
6
|
-
<CLSNAME>ZCL_ABGAGT_COMMAND_INSPECT</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>Inspect Command for ABAP Git Agent</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
|
|
13
|
-
</VSEOCLASS>
|
|
14
|
-
</asx:values>
|
|
15
|
-
</asx:abap>
|
|
16
|
-
</abapGit>
|
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
*"*"use source
|
|
2
|
-
*"*"Local Interface:
|
|
3
|
-
*"**********************************************************************
|
|
4
|
-
CLASS zcl_abgagt_command_preview DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
5
|
-
|
|
6
|
-
PUBLIC SECTION.
|
|
7
|
-
INTERFACES zif_abgagt_command.
|
|
8
|
-
|
|
9
|
-
" Parameter types matching CLI request
|
|
10
|
-
TYPES: BEGIN OF ty_preview_params,
|
|
11
|
-
objects TYPE string_table,
|
|
12
|
-
type TYPE string,
|
|
13
|
-
limit TYPE i,
|
|
14
|
-
where TYPE string,
|
|
15
|
-
columns TYPE string_table,
|
|
16
|
-
END OF ty_preview_params.
|
|
17
|
-
|
|
18
|
-
" Field metadata
|
|
19
|
-
TYPES: BEGIN OF ty_field,
|
|
20
|
-
field TYPE string,
|
|
21
|
-
type TYPE string,
|
|
22
|
-
length TYPE int4,
|
|
23
|
-
decimals TYPE int4,
|
|
24
|
-
END OF ty_field.
|
|
25
|
-
|
|
26
|
-
TYPES ty_fields TYPE STANDARD TABLE OF ty_field WITH DEFAULT KEY.
|
|
27
|
-
|
|
28
|
-
" Row data (dynamic)
|
|
29
|
-
TYPES: BEGIN OF ty_row_data,
|
|
30
|
-
row_index TYPE i,
|
|
31
|
-
data TYPE REF TO data,
|
|
32
|
-
END OF ty_row_data.
|
|
33
|
-
|
|
34
|
-
" Table/CVS view data result
|
|
35
|
-
TYPES: BEGIN OF ty_preview_object,
|
|
36
|
-
name TYPE string,
|
|
37
|
-
type TYPE string,
|
|
38
|
-
type_text TYPE string,
|
|
39
|
-
row_count TYPE i,
|
|
40
|
-
total_rows TYPE i,
|
|
41
|
-
rows TYPE string, " JSON string of rows
|
|
42
|
-
fields TYPE ty_fields,
|
|
43
|
-
columns_displayed TYPE i,
|
|
44
|
-
columns_hidden TYPE string_table,
|
|
45
|
-
error TYPE string,
|
|
46
|
-
END OF ty_preview_object.
|
|
47
|
-
|
|
48
|
-
TYPES ty_preview_objects TYPE STANDARD TABLE OF ty_preview_object WITH DEFAULT KEY.
|
|
49
|
-
|
|
50
|
-
TYPES: BEGIN OF ty_summary,
|
|
51
|
-
total_objects TYPE i,
|
|
52
|
-
total_rows TYPE i,
|
|
53
|
-
END OF ty_summary.
|
|
54
|
-
|
|
55
|
-
TYPES: BEGIN OF ty_preview_result,
|
|
56
|
-
success TYPE abap_bool,
|
|
57
|
-
command TYPE string,
|
|
58
|
-
message TYPE string,
|
|
59
|
-
objects TYPE ty_preview_objects,
|
|
60
|
-
summary TYPE ty_summary,
|
|
61
|
-
error TYPE string,
|
|
62
|
-
END OF ty_preview_result.
|
|
63
|
-
|
|
64
|
-
" Method declarations
|
|
65
|
-
METHODS get_table_data
|
|
66
|
-
IMPORTING
|
|
67
|
-
iv_name TYPE string
|
|
68
|
-
iv_type TYPE string
|
|
69
|
-
iv_limit TYPE i
|
|
70
|
-
iv_where TYPE string
|
|
71
|
-
it_columns TYPE string_table
|
|
72
|
-
RETURNING
|
|
73
|
-
VALUE(rs_result) TYPE ty_preview_object.
|
|
74
|
-
|
|
75
|
-
METHODS detect_object_type
|
|
76
|
-
IMPORTING
|
|
77
|
-
iv_name TYPE string
|
|
78
|
-
RETURNING
|
|
79
|
-
VALUE(rv_type) TYPE string.
|
|
80
|
-
|
|
81
|
-
METHODS fetch_table_data
|
|
82
|
-
IMPORTING
|
|
83
|
-
iv_tabname TYPE string
|
|
84
|
-
iv_limit TYPE i
|
|
85
|
-
iv_where TYPE string
|
|
86
|
-
it_columns TYPE string_table
|
|
87
|
-
CHANGING
|
|
88
|
-
cs_result TYPE ty_preview_object.
|
|
89
|
-
|
|
90
|
-
METHODS get_field_metadata
|
|
91
|
-
IMPORTING
|
|
92
|
-
it_components TYPE abap_component_tab
|
|
93
|
-
RETURNING
|
|
94
|
-
VALUE(rt_fields) TYPE ty_fields.
|
|
95
|
-
|
|
96
|
-
METHODS get_field_metadata_for_columns
|
|
97
|
-
IMPORTING
|
|
98
|
-
it_components TYPE abap_component_tab
|
|
99
|
-
it_columns TYPE string_table
|
|
100
|
-
RETURNING
|
|
101
|
-
VALUE(rt_fields) TYPE ty_fields.
|
|
102
|
-
|
|
103
|
-
ENDCLASS.
|
|
104
|
-
|
|
105
|
-
CLASS zcl_abgagt_command_preview IMPLEMENTATION.
|
|
106
|
-
|
|
107
|
-
METHOD zif_abgagt_command~get_name.
|
|
108
|
-
rv_name = zif_abgagt_command=>gc_preview.
|
|
109
|
-
ENDMETHOD.
|
|
110
|
-
|
|
111
|
-
METHOD zif_abgagt_command~execute.
|
|
112
|
-
" Parse parameters
|
|
113
|
-
DATA: ls_params TYPE ty_preview_params,
|
|
114
|
-
ls_result TYPE ty_preview_result.
|
|
115
|
-
|
|
116
|
-
ls_result-command = zif_abgagt_command=>gc_preview.
|
|
117
|
-
|
|
118
|
-
IF is_param IS SUPPLIED.
|
|
119
|
-
ls_params = CORRESPONDING #( is_param ).
|
|
120
|
-
ENDIF.
|
|
121
|
-
|
|
122
|
-
IF ls_params-objects IS INITIAL.
|
|
123
|
-
ls_result-success = abap_false.
|
|
124
|
-
ls_result-error = 'Objects parameter is required'.
|
|
125
|
-
rv_result = /ui2/cl_json=>serialize( data = ls_result ).
|
|
126
|
-
RETURN.
|
|
127
|
-
ENDIF.
|
|
128
|
-
|
|
129
|
-
" Process each object
|
|
130
|
-
DATA lt_objects TYPE ty_preview_objects.
|
|
131
|
-
DATA lv_object TYPE string.
|
|
132
|
-
DATA lv_total_rows TYPE i.
|
|
133
|
-
|
|
134
|
-
LOOP AT ls_params-objects INTO lv_object.
|
|
135
|
-
DATA(ls_obj) = get_table_data(
|
|
136
|
-
iv_name = lv_object
|
|
137
|
-
iv_type = ls_params-type
|
|
138
|
-
iv_limit = ls_params-limit
|
|
139
|
-
iv_where = ls_params-where
|
|
140
|
-
it_columns = ls_params-columns ).
|
|
141
|
-
|
|
142
|
-
APPEND ls_obj TO lt_objects.
|
|
143
|
-
lv_total_rows = lv_total_rows + ls_obj-row_count.
|
|
144
|
-
ENDLOOP.
|
|
145
|
-
|
|
146
|
-
" Build result
|
|
147
|
-
ls_result-success = abap_true.
|
|
148
|
-
ls_result-message = 'Retrieved data'.
|
|
149
|
-
ls_result-objects = lt_objects.
|
|
150
|
-
|
|
151
|
-
" Build summary
|
|
152
|
-
DATA ls_summary TYPE ty_summary.
|
|
153
|
-
ls_summary-total_objects = lines( lt_objects ).
|
|
154
|
-
ls_summary-total_rows = lv_total_rows.
|
|
155
|
-
|
|
156
|
-
" We need to serialize with summary inline
|
|
157
|
-
DATA: BEGIN OF ls_final,
|
|
158
|
-
success TYPE abap_bool,
|
|
159
|
-
command TYPE string,
|
|
160
|
-
message TYPE string,
|
|
161
|
-
objects TYPE ty_preview_objects,
|
|
162
|
-
summary TYPE ty_summary,
|
|
163
|
-
error TYPE string,
|
|
164
|
-
END OF ls_final.
|
|
165
|
-
|
|
166
|
-
ls_final = CORRESPONDING #( ls_result ).
|
|
167
|
-
ls_final-summary = ls_summary.
|
|
168
|
-
|
|
169
|
-
rv_result = /ui2/cl_json=>serialize( data = ls_final ).
|
|
170
|
-
ENDMETHOD.
|
|
171
|
-
|
|
172
|
-
METHOD get_table_data.
|
|
173
|
-
DATA: ls_result TYPE ty_preview_object,
|
|
174
|
-
lv_tabname TYPE string,
|
|
175
|
-
lv_type TYPE string.
|
|
176
|
-
|
|
177
|
-
ls_result-name = iv_name.
|
|
178
|
-
lv_tabname = to_upper( iv_name ).
|
|
179
|
-
lv_type = to_upper( iv_type ).
|
|
180
|
-
|
|
181
|
-
IF lv_tabname IS INITIAL.
|
|
182
|
-
lv_tabname = iv_name.
|
|
183
|
-
ENDIF.
|
|
184
|
-
IF lv_type IS INITIAL.
|
|
185
|
-
lv_type = iv_type.
|
|
186
|
-
ENDIF.
|
|
187
|
-
|
|
188
|
-
" Auto-detect type if not specified
|
|
189
|
-
IF lv_type IS INITIAL.
|
|
190
|
-
lv_type = detect_object_type( lv_tabname ).
|
|
191
|
-
ENDIF.
|
|
192
|
-
|
|
193
|
-
ls_result-type = lv_type.
|
|
194
|
-
|
|
195
|
-
CASE lv_type.
|
|
196
|
-
WHEN 'TABL' OR 'DDLS' OR ''.
|
|
197
|
-
ls_result-type_text = COND #( WHEN lv_type = 'DDLS' THEN 'CDS View' ELSE 'Table' ).
|
|
198
|
-
|
|
199
|
-
" Get table metadata and data
|
|
200
|
-
fetch_table_data(
|
|
201
|
-
EXPORTING
|
|
202
|
-
iv_tabname = lv_tabname
|
|
203
|
-
iv_limit = iv_limit
|
|
204
|
-
iv_where = iv_where
|
|
205
|
-
it_columns = it_columns
|
|
206
|
-
CHANGING
|
|
207
|
-
cs_result = ls_result ).
|
|
208
|
-
|
|
209
|
-
IF ls_result-error IS NOT INITIAL.
|
|
210
|
-
ls_result-type_text = lv_type.
|
|
211
|
-
ENDIF.
|
|
212
|
-
|
|
213
|
-
WHEN OTHERS.
|
|
214
|
-
ls_result-type_text = lv_type.
|
|
215
|
-
ls_result-row_count = 0.
|
|
216
|
-
ENDCASE.
|
|
217
|
-
|
|
218
|
-
rs_result = ls_result.
|
|
219
|
-
ENDMETHOD.
|
|
220
|
-
|
|
221
|
-
METHOD detect_object_type.
|
|
222
|
-
DATA lv_name TYPE string.
|
|
223
|
-
lv_name = to_upper( iv_name ).
|
|
224
|
-
|
|
225
|
-
" Check if table or CDS view exists in TADIR
|
|
226
|
-
SELECT SINGLE object FROM tadir
|
|
227
|
-
INTO rv_type
|
|
228
|
-
WHERE obj_name = lv_name
|
|
229
|
-
AND object IN ('TABL', 'DDLS').
|
|
230
|
-
|
|
231
|
-
IF sy-subrc <> 0.
|
|
232
|
-
" Default to table if not found in TADIR
|
|
233
|
-
rv_type = 'TABL'.
|
|
234
|
-
ENDIF.
|
|
235
|
-
ENDMETHOD.
|
|
236
|
-
|
|
237
|
-
METHOD fetch_table_data.
|
|
238
|
-
DATA: lv_error TYPE string,
|
|
239
|
-
lr_data TYPE REF TO data,
|
|
240
|
-
lo_tabdescr TYPE REF TO cl_abap_tabledescr,
|
|
241
|
-
lo_strucdescr TYPE REF TO cl_abap_structdescr,
|
|
242
|
-
lt_components TYPE abap_component_tab,
|
|
243
|
-
lv_field_list TYPE string,
|
|
244
|
-
lv_limit TYPE i.
|
|
245
|
-
|
|
246
|
-
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
|
|
247
|
-
|
|
248
|
-
lv_limit = iv_limit.
|
|
249
|
-
IF lv_limit <= 0.
|
|
250
|
-
lv_limit = 10.
|
|
251
|
-
ENDIF.
|
|
252
|
-
|
|
253
|
-
" Check if table/view exists in DD02L
|
|
254
|
-
DATA lv_tabname_check TYPE dd02l-tabname.
|
|
255
|
-
SELECT SINGLE tabname FROM dd02l
|
|
256
|
-
INTO lv_tabname_check
|
|
257
|
-
WHERE tabname = iv_tabname
|
|
258
|
-
AND as4local = 'A'
|
|
259
|
-
AND tabclass IN ('TRANSP', 'VIEW').
|
|
260
|
-
|
|
261
|
-
IF sy-subrc <> 0.
|
|
262
|
-
cs_result-error = |Table or view not found: { iv_tabname }|.
|
|
263
|
-
cs_result-row_count = 0.
|
|
264
|
-
RETURN.
|
|
265
|
-
ENDIF.
|
|
266
|
-
|
|
267
|
-
TRY.
|
|
268
|
-
" Get structure descriptor first (describe_by_name returns struct descr for table lines)
|
|
269
|
-
lo_strucdescr ?= cl_abap_structdescr=>describe_by_name( iv_tabname ).
|
|
270
|
-
" Create table descriptor from structure
|
|
271
|
-
lo_tabdescr = cl_abap_tabledescr=>create( lo_strucdescr ).
|
|
272
|
-
lt_components = lo_strucdescr->get_components( ).
|
|
273
|
-
|
|
274
|
-
" Handle column selection
|
|
275
|
-
DATA lt_cols TYPE string_table.
|
|
276
|
-
lt_cols = it_columns.
|
|
277
|
-
|
|
278
|
-
IF lt_cols IS NOT INITIAL.
|
|
279
|
-
" Build field list from specified columns
|
|
280
|
-
LOOP AT lt_components INTO DATA(ls_comp).
|
|
281
|
-
READ TABLE lt_cols WITH KEY table_line = ls_comp-name TRANSPORTING NO FIELDS.
|
|
282
|
-
IF sy-subrc = 0.
|
|
283
|
-
IF lv_field_list IS INITIAL.
|
|
284
|
-
lv_field_list = ls_comp-name.
|
|
285
|
-
ELSE.
|
|
286
|
-
lv_field_list = lv_field_list && ',' && ls_comp-name.
|
|
287
|
-
ENDIF.
|
|
288
|
-
ELSE.
|
|
289
|
-
" Track hidden columns
|
|
290
|
-
APPEND ls_comp-name TO cs_result-columns_hidden.
|
|
291
|
-
ENDIF.
|
|
292
|
-
ENDLOOP.
|
|
293
|
-
ELSE.
|
|
294
|
-
" All columns
|
|
295
|
-
LOOP AT lt_components INTO ls_comp.
|
|
296
|
-
IF lv_field_list IS INITIAL.
|
|
297
|
-
lv_field_list = ls_comp-name.
|
|
298
|
-
ELSE.
|
|
299
|
-
lv_field_list = lv_field_list && ',' && ls_comp-name.
|
|
300
|
-
ENDIF.
|
|
301
|
-
ENDLOOP.
|
|
302
|
-
ENDIF.
|
|
303
|
-
|
|
304
|
-
" Create data reference for the internal table
|
|
305
|
-
CREATE DATA lr_data TYPE HANDLE lo_tabdescr.
|
|
306
|
-
ASSIGN lr_data->* TO <lt_data>.
|
|
307
|
-
|
|
308
|
-
" Use SELECT * - dynamic field list has parser issues
|
|
309
|
-
" Column filtering will be done in the response
|
|
310
|
-
IF iv_where IS INITIAL.
|
|
311
|
-
SELECT * FROM (iv_tabname)
|
|
312
|
-
INTO TABLE <lt_data>
|
|
313
|
-
UP TO lv_limit ROWS.
|
|
314
|
-
ELSE.
|
|
315
|
-
SELECT * FROM (iv_tabname)
|
|
316
|
-
INTO TABLE <lt_data>
|
|
317
|
-
UP TO lv_limit ROWS
|
|
318
|
-
WHERE (iv_where).
|
|
319
|
-
ENDIF.
|
|
320
|
-
|
|
321
|
-
" Get row count
|
|
322
|
-
cs_result-row_count = lines( <lt_data> ).
|
|
323
|
-
cs_result-total_rows = cs_result-row_count.
|
|
324
|
-
|
|
325
|
-
" Get field metadata for selected columns only
|
|
326
|
-
cs_result-fields = get_field_metadata_for_columns(
|
|
327
|
-
it_components = lt_components
|
|
328
|
-
it_columns = lt_cols ).
|
|
329
|
-
|
|
330
|
-
" Serialize data to JSON
|
|
331
|
-
cs_result-rows = /ui2/cl_json=>serialize( data = <lt_data> ).
|
|
332
|
-
|
|
333
|
-
" Set column info
|
|
334
|
-
cs_result-columns_displayed = lines( cs_result-fields ).
|
|
335
|
-
|
|
336
|
-
CATCH cx_root INTO DATA(lx_error).
|
|
337
|
-
lv_error = lx_error->get_text( ).
|
|
338
|
-
cs_result-error = lv_error.
|
|
339
|
-
cs_result-row_count = 0.
|
|
340
|
-
ENDTRY.
|
|
341
|
-
ENDMETHOD.
|
|
342
|
-
|
|
343
|
-
METHOD get_field_metadata.
|
|
344
|
-
DATA ls_field TYPE ty_field.
|
|
345
|
-
|
|
346
|
-
LOOP AT it_components ASSIGNING FIELD-SYMBOL(<comp>).
|
|
347
|
-
ls_field-field = <comp>-name.
|
|
348
|
-
|
|
349
|
-
" Get type info from the component
|
|
350
|
-
IF <comp>-type IS BOUND.
|
|
351
|
-
DATA(lo_type) = <comp>-type.
|
|
352
|
-
ls_field-type = lo_type->type_kind.
|
|
353
|
-
ls_field-length = lo_type->length.
|
|
354
|
-
ls_field-decimals = lo_type->decimals.
|
|
355
|
-
ENDIF.
|
|
356
|
-
|
|
357
|
-
APPEND ls_field TO rt_fields.
|
|
358
|
-
ENDLOOP.
|
|
359
|
-
ENDMETHOD.
|
|
360
|
-
|
|
361
|
-
METHOD get_field_metadata_for_columns.
|
|
362
|
-
DATA ls_field TYPE ty_field.
|
|
363
|
-
|
|
364
|
-
" If no columns specified, return all
|
|
365
|
-
IF it_columns IS INITIAL.
|
|
366
|
-
rt_fields = get_field_metadata( it_components ).
|
|
367
|
-
RETURN.
|
|
368
|
-
ENDIF.
|
|
369
|
-
|
|
370
|
-
" Filter to selected columns only
|
|
371
|
-
LOOP AT it_components ASSIGNING FIELD-SYMBOL(<comp>).
|
|
372
|
-
READ TABLE it_columns WITH KEY table_line = <comp>-name TRANSPORTING NO FIELDS.
|
|
373
|
-
IF sy-subrc = 0.
|
|
374
|
-
ls_field-field = <comp>-name.
|
|
375
|
-
IF <comp>-type IS BOUND.
|
|
376
|
-
DATA(lo_type) = <comp>-type.
|
|
377
|
-
ls_field-type = lo_type->type_kind.
|
|
378
|
-
ls_field-length = lo_type->length.
|
|
379
|
-
ls_field-decimals = lo_type->decimals.
|
|
380
|
-
ENDIF.
|
|
381
|
-
APPEND ls_field TO rt_fields.
|
|
382
|
-
ENDIF.
|
|
383
|
-
ENDLOOP.
|
|
384
|
-
ENDMETHOD.
|
|
385
|
-
|
|
386
|
-
ENDCLASS.
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
-
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
|
3
|
-
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
4
|
-
<asx:values>
|
|
5
|
-
<VSEOCLASS>
|
|
6
|
-
<CLSNAME>ZCL_ABGAGT_COMMAND_PREVIEW</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>PREVIEW command - preview table/CDS view data</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
</VSEOCLASS>
|
|
13
|
-
</asx:values>
|
|
14
|
-
</asx:abap>
|
|
15
|
-
</abapGit>
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
*"*"use source
|
|
2
|
-
*"*"Local Interface:
|
|
3
|
-
*"**********************************************************************
|
|
4
|
-
CLASS zcl_abgagt_command_pull DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
5
|
-
PUBLIC SECTION.
|
|
6
|
-
INTERFACES zif_abgagt_command.
|
|
7
|
-
|
|
8
|
-
TYPES: BEGIN OF ty_pull_params,
|
|
9
|
-
url TYPE string,
|
|
10
|
-
branch TYPE string,
|
|
11
|
-
username TYPE string,
|
|
12
|
-
password TYPE string,
|
|
13
|
-
transport_request TYPE string,
|
|
14
|
-
files TYPE string_table,
|
|
15
|
-
END OF ty_pull_params.
|
|
16
|
-
|
|
17
|
-
ENDCLASS.
|
|
18
|
-
|
|
19
|
-
CLASS zcl_abgagt_command_pull IMPLEMENTATION.
|
|
20
|
-
|
|
21
|
-
METHOD zif_abgagt_command~get_name.
|
|
22
|
-
rv_name = zif_abgagt_command=>gc_pull.
|
|
23
|
-
ENDMETHOD.
|
|
24
|
-
|
|
25
|
-
METHOD zif_abgagt_command~execute.
|
|
26
|
-
DATA: ls_params TYPE ty_pull_params,
|
|
27
|
-
lo_agent TYPE REF TO zcl_abgagt_agent,
|
|
28
|
-
ls_pull_result TYPE zif_abgagt_agent=>ty_result,
|
|
29
|
-
lx_error TYPE REF TO zcx_abapgit_exception.
|
|
30
|
-
|
|
31
|
-
" Parse parameters from is_param
|
|
32
|
-
IF is_param IS SUPPLIED.
|
|
33
|
-
ls_params = CORRESPONDING #( is_param ).
|
|
34
|
-
ENDIF.
|
|
35
|
-
|
|
36
|
-
" Get agent instance and execute pull
|
|
37
|
-
lo_agent = NEW zcl_abgagt_agent( ).
|
|
38
|
-
|
|
39
|
-
TRY.
|
|
40
|
-
ls_pull_result = lo_agent->zif_abgagt_agent~pull(
|
|
41
|
-
iv_url = ls_params-url
|
|
42
|
-
iv_branch = ls_params-branch
|
|
43
|
-
iv_username = ls_params-username
|
|
44
|
-
iv_password = ls_params-password
|
|
45
|
-
iv_transport_request = ls_params-transport_request
|
|
46
|
-
it_files = ls_params-files ).
|
|
47
|
-
CATCH zcx_abapgit_exception INTO lx_error.
|
|
48
|
-
ls_pull_result-success = abap_false.
|
|
49
|
-
ls_pull_result-message = lx_error->get_text( ).
|
|
50
|
-
ENDTRY.
|
|
51
|
-
|
|
52
|
-
" Convert result to JSON string using /ui2/cl_json
|
|
53
|
-
DATA: BEGIN OF ls_response,
|
|
54
|
-
success TYPE string,
|
|
55
|
-
job_id TYPE string,
|
|
56
|
-
message TYPE string,
|
|
57
|
-
error_detail TYPE string,
|
|
58
|
-
transport_request TYPE string,
|
|
59
|
-
activated_count TYPE i,
|
|
60
|
-
failed_count TYPE i,
|
|
61
|
-
log_messages TYPE zif_abgagt_agent=>ty_object_list,
|
|
62
|
-
activated_objects TYPE zif_abgagt_agent=>ty_object_list,
|
|
63
|
-
failed_objects TYPE zif_abgagt_agent=>ty_object_list,
|
|
64
|
-
END OF ls_response.
|
|
65
|
-
|
|
66
|
-
ls_response-success = COND string( WHEN ls_pull_result-success = abap_true THEN 'X' ELSE '' ).
|
|
67
|
-
ls_response-job_id = ls_pull_result-job_id.
|
|
68
|
-
ls_response-message = ls_pull_result-message.
|
|
69
|
-
ls_response-error_detail = ls_pull_result-error_detail.
|
|
70
|
-
ls_response-transport_request = ls_pull_result-transport_request.
|
|
71
|
-
ls_response-activated_count = ls_pull_result-activated_count.
|
|
72
|
-
ls_response-failed_count = ls_pull_result-failed_count.
|
|
73
|
-
ls_response-log_messages = ls_pull_result-log_messages.
|
|
74
|
-
ls_response-activated_objects = ls_pull_result-activated_objects.
|
|
75
|
-
ls_response-failed_objects = ls_pull_result-failed_objects.
|
|
76
|
-
|
|
77
|
-
rv_result = /ui2/cl_json=>serialize( data = ls_response ).
|
|
78
|
-
ENDMETHOD.
|
|
79
|
-
|
|
80
|
-
ENDCLASS.
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
*"* use this source file for your test class implementation
|
|
2
|
-
*"* local test class
|
|
3
|
-
CLASS ltcl_zcl_abgagt_command_pull DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
|
4
|
-
PRIVATE SECTION.
|
|
5
|
-
DATA mo_cut TYPE REF TO zcl_abgagt_command_pull.
|
|
6
|
-
|
|
7
|
-
METHODS setup.
|
|
8
|
-
METHODS test_get_name FOR TESTING.
|
|
9
|
-
METHODS test_exec_minimal FOR TESTING.
|
|
10
|
-
METHODS test_exec_files FOR TESTING.
|
|
11
|
-
METHODS test_interface FOR TESTING.
|
|
12
|
-
ENDCLASS.
|
|
13
|
-
|
|
14
|
-
CLASS ltcl_zcl_abgagt_command_pull IMPLEMENTATION.
|
|
15
|
-
|
|
16
|
-
METHOD setup.
|
|
17
|
-
CREATE OBJECT mo_cut.
|
|
18
|
-
ENDMETHOD.
|
|
19
|
-
|
|
20
|
-
METHOD test_get_name.
|
|
21
|
-
" Test that get_name returns the correct command name
|
|
22
|
-
DATA(lv_name) = mo_cut->zif_abgagt_command~get_name( ).
|
|
23
|
-
cl_abap_unit_assert=>assert_equals(
|
|
24
|
-
act = lv_name
|
|
25
|
-
exp = zif_abgagt_command=>gc_pull
|
|
26
|
-
msg = 'Command name should be PULL' ).
|
|
27
|
-
ENDMETHOD.
|
|
28
|
-
|
|
29
|
-
METHOD test_interface.
|
|
30
|
-
" Test that the class implements the command interface
|
|
31
|
-
DATA lo_interface TYPE REF TO zif_abgagt_command.
|
|
32
|
-
CREATE OBJECT mo_cut TYPE zcl_abgagt_command_pull.
|
|
33
|
-
lo_interface = mo_cut.
|
|
34
|
-
cl_abap_unit_assert=>assert_bound(
|
|
35
|
-
act = lo_interface
|
|
36
|
-
msg = 'Object should implement zif_abgagt_command interface' ).
|
|
37
|
-
ENDMETHOD.
|
|
38
|
-
|
|
39
|
-
METHOD test_exec_minimal.
|
|
40
|
-
" Test execute with minimal parameters (url only)
|
|
41
|
-
DATA: BEGIN OF ls_param,
|
|
42
|
-
url TYPE string,
|
|
43
|
-
END OF ls_param.
|
|
44
|
-
|
|
45
|
-
ls_param-url = 'https://github.test/repo.git'.
|
|
46
|
-
|
|
47
|
-
" Execute should return a JSON string
|
|
48
|
-
DATA(lv_result) = mo_cut->zif_abgagt_command~execute( is_param = ls_param ).
|
|
49
|
-
|
|
50
|
-
cl_abap_unit_assert=>assert_not_initial(
|
|
51
|
-
act = lv_result
|
|
52
|
-
msg = 'Result should not be initial' ).
|
|
53
|
-
|
|
54
|
-
" Result should be valid JSON (starts with { and ends with })
|
|
55
|
-
cl_abap_unit_assert=>assert_char_cp(
|
|
56
|
-
act = lv_result
|
|
57
|
-
exp = '*{*'
|
|
58
|
-
msg = 'Result should be valid JSON object' ).
|
|
59
|
-
ENDMETHOD.
|
|
60
|
-
|
|
61
|
-
METHOD test_exec_files.
|
|
62
|
-
" Test execute with files parameter
|
|
63
|
-
DATA: BEGIN OF ls_param,
|
|
64
|
-
url TYPE string,
|
|
65
|
-
files TYPE string_table,
|
|
66
|
-
END OF ls_param.
|
|
67
|
-
|
|
68
|
-
ls_param-url = 'https://github.test/repo.git'.
|
|
69
|
-
APPEND 'zcl_test.clas.abap' TO ls_param-files.
|
|
70
|
-
APPEND 'zif_test.intf.abap' TO ls_param-files.
|
|
71
|
-
|
|
72
|
-
DATA(lv_result) = mo_cut->zif_abgagt_command~execute( is_param = ls_param ).
|
|
73
|
-
|
|
74
|
-
cl_abap_unit_assert=>assert_not_initial(
|
|
75
|
-
act = lv_result
|
|
76
|
-
msg = 'Result should not be initial' ).
|
|
77
|
-
|
|
78
|
-
" Result should be valid JSON
|
|
79
|
-
DATA lv_json TYPE string.
|
|
80
|
-
lv_json = lv_result.
|
|
81
|
-
cl_abap_unit_assert=>assert_char_cp(
|
|
82
|
-
act = lv_json
|
|
83
|
-
exp = '*{"success"*' " JSON-like structure
|
|
84
|
-
msg = 'Result should be valid JSON' ).
|
|
85
|
-
ENDMETHOD.
|
|
86
|
-
|
|
87
|
-
ENDCLASS.
|