abapgit-agent 1.4.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.
Files changed (115) hide show
  1. package/README.md +2 -0
  2. package/abap/guidelines/00_index.md +35 -0
  3. package/abap/guidelines/01_sql.md +72 -0
  4. package/abap/guidelines/02_exceptions.md +108 -0
  5. package/abap/guidelines/03_testing.md +252 -0
  6. package/abap/guidelines/04_cds.md +120 -0
  7. package/abap/guidelines/05_classes.md +50 -0
  8. package/abap/guidelines/06_objects.md +103 -0
  9. package/abap/guidelines/07_json.md +22 -0
  10. package/abap/guidelines/08_abapgit.md +193 -0
  11. package/bin/abapgit-agent +597 -44
  12. package/bin/abgagt +24 -0
  13. package/package.json +11 -3
  14. package/src/abap-client.js +65 -2
  15. package/src/agent.js +58 -4
  16. package/src/config.js +9 -2
  17. package/src/ref-search.js +989 -0
  18. package/.abapGitAgent.example +0 -11
  19. package/.github/workflows/release.yml +0 -57
  20. package/API.md +0 -710
  21. package/CLAUDE.md +0 -1031
  22. package/CLAUDE_MEM.md +0 -88
  23. package/ERROR_HANDLING.md +0 -30
  24. package/INSTALL.md +0 -155
  25. package/RELEASE_NOTES.md +0 -143
  26. package/abap/CLAUDE.md +0 -898
  27. package/abap/copilot-instructions.md +0 -79
  28. package/abap/package.devc.xml +0 -10
  29. package/abap/zcl_abgagt_agent.clas.abap +0 -420
  30. package/abap/zcl_abgagt_agent.clas.xml +0 -15
  31. package/abap/zcl_abgagt_cmd_factory.clas.abap +0 -48
  32. package/abap/zcl_abgagt_cmd_factory.clas.xml +0 -15
  33. package/abap/zcl_abgagt_command_create.clas.abap +0 -95
  34. package/abap/zcl_abgagt_command_create.clas.xml +0 -15
  35. package/abap/zcl_abgagt_command_import.clas.abap +0 -138
  36. package/abap/zcl_abgagt_command_import.clas.xml +0 -15
  37. package/abap/zcl_abgagt_command_inspect.clas.abap +0 -411
  38. package/abap/zcl_abgagt_command_inspect.clas.testclasses.abap +0 -121
  39. package/abap/zcl_abgagt_command_inspect.clas.xml +0 -16
  40. package/abap/zcl_abgagt_command_preview.clas.abap +0 -386
  41. package/abap/zcl_abgagt_command_preview.clas.xml +0 -15
  42. package/abap/zcl_abgagt_command_pull.clas.abap +0 -80
  43. package/abap/zcl_abgagt_command_pull.clas.testclasses.abap +0 -87
  44. package/abap/zcl_abgagt_command_pull.clas.xml +0 -16
  45. package/abap/zcl_abgagt_command_tree.clas.abap +0 -237
  46. package/abap/zcl_abgagt_command_tree.clas.xml +0 -15
  47. package/abap/zcl_abgagt_command_unit.clas.abap +0 -297
  48. package/abap/zcl_abgagt_command_unit.clas.xml +0 -15
  49. package/abap/zcl_abgagt_command_view.clas.abap +0 -240
  50. package/abap/zcl_abgagt_command_view.clas.xml +0 -15
  51. package/abap/zcl_abgagt_resource_create.clas.abap +0 -71
  52. package/abap/zcl_abgagt_resource_create.clas.xml +0 -15
  53. package/abap/zcl_abgagt_resource_health.clas.abap +0 -25
  54. package/abap/zcl_abgagt_resource_health.clas.xml +0 -15
  55. package/abap/zcl_abgagt_resource_import.clas.abap +0 -66
  56. package/abap/zcl_abgagt_resource_import.clas.xml +0 -15
  57. package/abap/zcl_abgagt_resource_inspect.clas.abap +0 -62
  58. package/abap/zcl_abgagt_resource_inspect.clas.xml +0 -15
  59. package/abap/zcl_abgagt_resource_preview.clas.abap +0 -67
  60. package/abap/zcl_abgagt_resource_preview.clas.xml +0 -15
  61. package/abap/zcl_abgagt_resource_pull.clas.abap +0 -71
  62. package/abap/zcl_abgagt_resource_pull.clas.xml +0 -15
  63. package/abap/zcl_abgagt_resource_tree.clas.abap +0 -70
  64. package/abap/zcl_abgagt_resource_tree.clas.xml +0 -15
  65. package/abap/zcl_abgagt_resource_unit.clas.abap +0 -64
  66. package/abap/zcl_abgagt_resource_unit.clas.xml +0 -15
  67. package/abap/zcl_abgagt_resource_view.clas.abap +0 -68
  68. package/abap/zcl_abgagt_resource_view.clas.xml +0 -15
  69. package/abap/zcl_abgagt_rest_handler.clas.abap +0 -32
  70. package/abap/zcl_abgagt_rest_handler.clas.xml +0 -15
  71. package/abap/zcl_abgagt_util.clas.abap +0 -93
  72. package/abap/zcl_abgagt_util.clas.testclasses.abap +0 -84
  73. package/abap/zcl_abgagt_util.clas.xml +0 -16
  74. package/abap/zcl_abgagt_viewer_clas.clas.abap +0 -58
  75. package/abap/zcl_abgagt_viewer_clas.clas.xml +0 -15
  76. package/abap/zcl_abgagt_viewer_ddls.clas.abap +0 -83
  77. package/abap/zcl_abgagt_viewer_ddls.clas.xml +0 -15
  78. package/abap/zcl_abgagt_viewer_dtel.clas.abap +0 -98
  79. package/abap/zcl_abgagt_viewer_dtel.clas.xml +0 -15
  80. package/abap/zcl_abgagt_viewer_factory.clas.abap +0 -41
  81. package/abap/zcl_abgagt_viewer_factory.clas.xml +0 -15
  82. package/abap/zcl_abgagt_viewer_intf.clas.abap +0 -58
  83. package/abap/zcl_abgagt_viewer_intf.clas.xml +0 -15
  84. package/abap/zcl_abgagt_viewer_stru.clas.abap +0 -59
  85. package/abap/zcl_abgagt_viewer_stru.clas.xml +0 -15
  86. package/abap/zcl_abgagt_viewer_tabl.clas.abap +0 -59
  87. package/abap/zcl_abgagt_viewer_tabl.clas.xml +0 -15
  88. package/abap/zcl_abgagt_viewer_ttyp.clas.abap +0 -93
  89. package/abap/zcl_abgagt_viewer_ttyp.clas.xml +0 -15
  90. package/abap/zif_abgagt_agent.intf.abap +0 -53
  91. package/abap/zif_abgagt_agent.intf.xml +0 -15
  92. package/abap/zif_abgagt_cmd_factory.intf.abap +0 -7
  93. package/abap/zif_abgagt_cmd_factory.intf.xml +0 -15
  94. package/abap/zif_abgagt_command.intf.abap +0 -26
  95. package/abap/zif_abgagt_command.intf.xml +0 -15
  96. package/abap/zif_abgagt_util.intf.abap +0 -28
  97. package/abap/zif_abgagt_util.intf.xml +0 -15
  98. package/abap/zif_abgagt_viewer.intf.abap +0 -12
  99. package/abap/zif_abgagt_viewer.intf.xml +0 -15
  100. package/docs/commands.md +0 -142
  101. package/docs/create-command.md +0 -129
  102. package/docs/health-command.md +0 -89
  103. package/docs/import-command.md +0 -195
  104. package/docs/init-command.md +0 -189
  105. package/docs/inspect-command.md +0 -158
  106. package/docs/preview-command.md +0 -528
  107. package/docs/pull-command.md +0 -188
  108. package/docs/status-command.md +0 -68
  109. package/docs/tree-command.md +0 -303
  110. package/docs/unit-command.md +0 -167
  111. package/docs/view-command.md +0 -501
  112. package/img/claude.png +0 -0
  113. package/scripts/claude-integration.js +0 -351
  114. package/scripts/release.sh +0 -60
  115. package/scripts/test-integration.js +0 -139
@@ -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_CREATE</CLSNAME>
7
- <LANGU>E</LANGU>
8
- <DESCRIPT>ABAP Git Agent - Create Command</DESCRIPT>
9
- <EXPOSURE>2</EXPOSURE>
10
- <STATE>1</STATE>
11
- <UNICODE>X</UNICODE>
12
- </VSEOCLASS>
13
- </asx:values>
14
- </asx:abap>
15
- </abapGit>
@@ -1,138 +0,0 @@
1
- *"*"use source
2
- *"*"Local Interface:
3
- *"**********************************************************************
4
- CLASS zcl_abgagt_command_import DEFINITION PUBLIC FINAL CREATE PUBLIC.
5
-
6
- PUBLIC SECTION.
7
- INTERFACES zif_abgagt_command.
8
-
9
- TYPES: BEGIN OF ty_import_params,
10
- url TYPE string,
11
- message TYPE string,
12
- username TYPE string,
13
- password TYPE string,
14
- END OF ty_import_params.
15
-
16
- ENDCLASS.
17
-
18
- CLASS zcl_abgagt_command_import IMPLEMENTATION.
19
-
20
- METHOD zif_abgagt_command~get_name.
21
- rv_name = 'IMPORT'.
22
- ENDMETHOD.
23
-
24
- METHOD zif_abgagt_command~execute.
25
- DATA: ls_params TYPE ty_import_params,
26
- li_repo TYPE REF TO zif_abapgit_repo,
27
- li_repo_online TYPE REF TO zif_abapgit_repo_online,
28
- lo_stage TYPE REF TO zcl_abapgit_stage,
29
- lt_files TYPE zif_abapgit_definitions=>ty_files_item_tt,
30
- lv_package TYPE devclass,
31
- lv_message TYPE string,
32
- lv_files_staged TYPE i.
33
-
34
- " Use separate variables to avoid inline DATA issues
35
- DATA: li_user TYPE REF TO zif_abapgit_persist_user,
36
- lv_committer_name TYPE string,
37
- lv_committer_email TYPE string.
38
-
39
- TRY.
40
- IF is_param IS SUPPLIED.
41
- ls_params = CORRESPONDING #( is_param ).
42
- ENDIF.
43
-
44
- " Validate URL
45
- IF ls_params-url IS INITIAL.
46
- rv_result = '{"success":"","error":"URL is required"}'.
47
- RETURN.
48
- ENDIF.
49
-
50
- " Configure credentials if provided
51
- IF ls_params-username IS NOT INITIAL AND ls_params-password IS NOT INITIAL.
52
- zcl_abapgit_persist_factory=>get_user( )->set_repo_git_user_name(
53
- iv_url = ls_params-url iv_username = ls_params-username ).
54
- zcl_abapgit_persist_factory=>get_user( )->set_repo_login(
55
- iv_url = ls_params-url iv_login = ls_params-username ).
56
- zcl_abapgit_login_manager=>set_basic(
57
- iv_uri = ls_params-url
58
- iv_username = ls_params-username
59
- iv_password = ls_params-password ).
60
- ENDIF.
61
-
62
- " Find repository by URL
63
- zcl_abapgit_repo_srv=>get_instance( )->get_repo_from_url(
64
- EXPORTING iv_url = ls_params-url
65
- IMPORTING ei_repo = li_repo ).
66
-
67
- IF li_repo IS NOT BOUND.
68
- rv_result = '{"success":"","error":"Repository not found"}'.
69
- RETURN.
70
- ENDIF.
71
-
72
- " Cast to online repo for push operations
73
- li_repo_online ?= li_repo.
74
-
75
- " Get package from repository
76
- lv_package = li_repo->get_package( ).
77
-
78
- " Build commit message if not provided
79
- IF ls_params-message IS INITIAL.
80
- lv_message = |feat: initial import from ABAP package { lv_package }|.
81
- ELSE.
82
- lv_message = ls_params-message.
83
- ENDIF.
84
-
85
- " Refresh repository
86
- li_repo->refresh( ).
87
-
88
- " Get local files
89
- lt_files = li_repo->get_files_local( ).
90
-
91
- " Count files
92
- lv_files_staged = lines( lt_files ).
93
-
94
- " Check if there are files to import
95
- IF lv_files_staged = 0.
96
- rv_result = '{"success":"","error":"No objects found in package"}'.
97
- RETURN.
98
- ENDIF.
99
-
100
- " Create stage
101
- CREATE OBJECT lo_stage.
102
-
103
- " Add all files to stage
104
- LOOP AT lt_files ASSIGNING FIELD-SYMBOL(<ls_file>).
105
- lo_stage->add(
106
- iv_path = <ls_file>-file-path
107
- iv_filename = <ls_file>-file-filename
108
- iv_data = <ls_file>-file-data ).
109
- ENDLOOP.
110
-
111
- " Get user details for committer
112
- li_user = zcl_abapgit_persist_factory=>get_user( ).
113
- lv_committer_name = li_user->get_default_git_user_name( ).
114
- lv_committer_email = li_user->get_default_git_user_email( ).
115
-
116
- " Prepare commit
117
- DATA: ls_comment TYPE zif_abapgit_git_definitions=>ty_comment.
118
- ls_comment-committer-name = lv_committer_name.
119
- ls_comment-committer-email = lv_committer_email.
120
- ls_comment-comment = lv_message.
121
-
122
- " Commit and push
123
- li_repo_online->push(
124
- is_comment = ls_comment
125
- io_stage = lo_stage ).
126
-
127
- COMMIT WORK.
128
-
129
- rv_result = '{"success":"X","files_staged":"' && lv_files_staged && '","commit_message":"' && lv_message && '"}'.
130
-
131
- CATCH zcx_abapgit_exception INTO DATA(lx_error).
132
- rv_result = '{"success":"","error":"' && lx_error->get_text( ) && '"}'.
133
- CATCH cx_root INTO DATA(lx_other).
134
- rv_result = '{"success":"","error":"' && lx_other->get_text( ) && '"}'.
135
- ENDTRY.
136
- ENDMETHOD.
137
-
138
- 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_IMPORT</CLSNAME>
7
- <LANGU>E</LANGU>
8
- <DESCRIPT>Import command for ABAP Git Agent</DESCRIPT>
9
- <EXPOSURE>2</EXPOSURE>
10
- <STATE>1</STATE>
11
- <UNICODE>X</UNICODE>
12
- </VSEOCLASS>
13
- </asx:values>
14
- </asx:abap>
15
- </abapGit>
@@ -1,411 +0,0 @@
1
- *"*"use source
2
- *"*"Local Interface:
3
- *"**********************************************************************
4
- " INSPECT command implementation - uses SCI/SCIC for syntax check
5
- CLASS zcl_abgagt_command_inspect DEFINITION PUBLIC FINAL CREATE PUBLIC.
6
- PUBLIC SECTION.
7
- INTERFACES zif_abgagt_command.
8
-
9
- " Error structure for syntax check results
10
- TYPES: BEGIN OF ty_error,
11
- line TYPE string,
12
- column TYPE string,
13
- text TYPE string,
14
- word TYPE string,
15
- END OF ty_error.
16
-
17
- TYPES ty_errors TYPE STANDARD TABLE OF ty_error WITH NON-UNIQUE DEFAULT KEY.
18
-
19
- " Generic warning structure (for DDLS and other objects)
20
- TYPES: BEGIN OF ty_warning,
21
- type TYPE string,
22
- line TYPE string,
23
- column TYPE string,
24
- severity TYPE string,
25
- message TYPE string,
26
- object_type TYPE string,
27
- object_name TYPE string,
28
- END OF ty_warning.
29
-
30
- TYPES ty_warnings TYPE STANDARD TABLE OF ty_warning WITH NON-UNIQUE DEFAULT KEY.
31
-
32
- " Result for each individual object
33
- TYPES: BEGIN OF ty_inspect_result,
34
- object_type TYPE string,
35
- object_name TYPE string,
36
- success TYPE abap_bool,
37
- error_count TYPE i,
38
- errors TYPE ty_errors,
39
- warnings TYPE ty_warnings,
40
- END OF ty_inspect_result.
41
-
42
- " Table to hold results for multiple objects
43
- TYPES ty_inspect_results TYPE STANDARD TABLE OF ty_inspect_result WITH NON-UNIQUE DEFAULT KEY.
44
-
45
- TYPES: BEGIN OF ty_inspect_params,
46
- files TYPE string_table,
47
- END OF ty_inspect_params.
48
-
49
- TYPES ty_object_keys TYPE TABLE OF scir_objs WITH NON-UNIQUE DEFAULT KEY.
50
-
51
- " Type for DDLS object names
52
- TYPES ty_ddls_names TYPE STANDARD TABLE OF tadir-obj_name WITH NON-UNIQUE DEFAULT KEY.
53
-
54
- METHODS run_syntax_check
55
- IMPORTING it_objects TYPE ty_object_keys
56
- RETURNING VALUE(rt_results) TYPE ty_inspect_results.
57
-
58
- " Validate DDLS (CDS views)
59
- METHODS validate_ddls
60
- IMPORTING it_ddls_names TYPE ty_ddls_names
61
- RETURNING VALUE(rt_results) TYPE ty_inspect_results.
62
-
63
- ENDCLASS.
64
-
65
- CLASS zcl_abgagt_command_inspect IMPLEMENTATION.
66
-
67
- METHOD zif_abgagt_command~get_name.
68
- rv_name = zif_abgagt_command=>gc_inspect.
69
- ENDMETHOD.
70
-
71
- METHOD zif_abgagt_command~execute.
72
- DATA: ls_params TYPE ty_inspect_params,
73
- lv_file TYPE string,
74
- lv_obj_type TYPE string,
75
- lv_obj_name TYPE string,
76
- lo_util TYPE REF TO zcl_abgagt_util,
77
- lt_results TYPE ty_inspect_results,
78
- lt_objects TYPE ty_object_keys,
79
- lt_ddls_names TYPE ty_ddls_names,
80
- ls_obj TYPE scir_objs,
81
- ls_result TYPE ty_inspect_result.
82
-
83
- " Parse parameters from is_param
84
- IF is_param IS SUPPLIED.
85
- ls_params = CORRESPONDING #( is_param ).
86
- ENDIF.
87
-
88
- IF ls_params-files IS INITIAL.
89
- ls_result-success = abap_false.
90
- ls_result-error_count = 1.
91
- ls_result-object_name = 'N/A'.
92
- ls_result-object_type = 'N/A'.
93
- APPEND ls_result TO lt_results.
94
- rv_result = /ui2/cl_json=>serialize( data = lt_results ).
95
- RETURN.
96
- ENDIF.
97
-
98
- " Parse all files to objects
99
- lo_util = zcl_abgagt_util=>get_instance( ).
100
-
101
- LOOP AT ls_params-files INTO lv_file.
102
- CLEAR: lv_obj_type, lv_obj_name.
103
- lo_util->zif_abgagt_util~parse_file_to_object(
104
- EXPORTING iv_file = lv_file
105
- IMPORTING ev_obj_type = lv_obj_type
106
- ev_obj_name = lv_obj_name ).
107
-
108
- IF lv_obj_type IS NOT INITIAL AND lv_obj_name IS NOT INITIAL.
109
- " Separate DDLS from other objects
110
- IF lv_obj_type = 'DDLS'.
111
- APPEND lv_obj_name TO lt_ddls_names.
112
- ELSE.
113
- CLEAR ls_obj.
114
- ls_obj-objtype = lv_obj_type.
115
- ls_obj-objname = lv_obj_name.
116
- APPEND ls_obj TO lt_objects.
117
- ENDIF.
118
- ENDIF.
119
- ENDLOOP.
120
-
121
- " Run syntax check for non-DDLS objects
122
- IF lt_objects IS NOT INITIAL.
123
- DATA(lt_sci_results) = run_syntax_check( lt_objects ).
124
- INSERT LINES OF lt_sci_results INTO TABLE lt_results.
125
- ENDIF.
126
-
127
- " Run DDLS validation
128
- IF lt_ddls_names IS NOT INITIAL.
129
- DATA(lt_ddls_results) = validate_ddls( lt_ddls_names ).
130
- INSERT LINES OF lt_ddls_results INTO TABLE lt_results.
131
- ENDIF.
132
-
133
- " If no valid objects found
134
- IF lt_objects IS INITIAL AND lt_ddls_names IS INITIAL.
135
- ls_result-success = abap_false.
136
- ls_result-error_count = 1.
137
- ls_result-object_name = 'N/A'.
138
- ls_result-object_type = 'N/A'.
139
- APPEND ls_result TO lt_results.
140
- ENDIF.
141
-
142
- rv_result = /ui2/cl_json=>serialize( data = lt_results ).
143
- ENDMETHOD.
144
-
145
- METHOD validate_ddls.
146
- " Validate DDLS (CDS views) using CL_DD_DDL_HANDLER_FACTORY
147
- " First checks inactive version ('M'), falls back to active ('A')
148
- DATA: lv_ddls_name TYPE ddlname,
149
- lo_handler TYPE REF TO if_dd_ddl_handler,
150
- ls_ddlsrcv TYPE ddddlsrcv,
151
- ls_error TYPE ty_error,
152
- ls_warning TYPE ty_warning,
153
- lt_warnings TYPE ddl2ddicwarnings,
154
- lx_error TYPE REF TO cx_dd_ddl_check,
155
- lv_found TYPE abap_bool,
156
- ls_result TYPE ty_inspect_result,
157
- lv_err_msg TYPE string,
158
- lv_warn_msg TYPE string.
159
-
160
- rt_results = VALUE #( ).
161
-
162
- " Create DDL handler
163
- lo_handler = cl_dd_ddl_handler_factory=>create( ).
164
-
165
- " Check each DDLS object
166
- LOOP AT it_ddls_names INTO lv_ddls_name.
167
- CLEAR: ls_ddlsrcv, lt_warnings, lv_found, ls_result.
168
-
169
- ls_result-object_type = 'DDLS'.
170
- ls_result-object_name = lv_ddls_name.
171
- ls_result-success = abap_true.
172
-
173
- " First try to read inactive version (get_state = 'M')
174
- TRY.
175
- lo_handler->read(
176
- EXPORTING
177
- name = lv_ddls_name
178
- get_state = 'M'
179
- IMPORTING
180
- ddddlsrcv_wa = ls_ddlsrcv ).
181
-
182
- IF ls_ddlsrcv-source IS NOT INITIAL.
183
- lv_found = abap_true.
184
- ENDIF.
185
-
186
- CATCH cx_dd_ddl_check.
187
- " Ignore - will try active version
188
- ENDTRY.
189
-
190
- " If no inactive version, try active version
191
- IF lv_found = abap_false.
192
- TRY.
193
- lo_handler->read(
194
- EXPORTING
195
- name = lv_ddls_name
196
- get_state = 'A'
197
- IMPORTING
198
- ddddlsrcv_wa = ls_ddlsrcv ).
199
-
200
- IF ls_ddlsrcv-source IS NOT INITIAL.
201
- lv_found = abap_true.
202
- ENDIF.
203
- CATCH cx_dd_ddl_check.
204
- " Ignore
205
- ENDTRY.
206
- ENDIF.
207
-
208
- " If still not found, report error
209
- IF lv_found = abap_false.
210
- ls_error-line = '1'.
211
- ls_error-column = '1'.
212
- ls_error-text = |DDLS { lv_ddls_name } not found in repository|.
213
- APPEND ls_error TO ls_result-errors.
214
- ls_result-success = abap_false.
215
- ls_result-error_count = lines( ls_result-errors ).
216
- APPEND ls_result TO rt_results.
217
- CONTINUE.
218
- ENDIF.
219
-
220
- " Run validation check
221
- TRY.
222
- " Get warnings from check method
223
- lo_handler->check(
224
- EXPORTING
225
- name = lv_ddls_name
226
- IMPORTING
227
- warnings = lt_warnings
228
- CHANGING
229
- ddlsrcv_wa = ls_ddlsrcv ).
230
-
231
- " Parse warnings from check method
232
- LOOP AT lt_warnings INTO DATA(ls_warn_from_check).
233
- CLEAR ls_warning.
234
- ls_warning-type = ls_warn_from_check-type.
235
- ls_warning-line = ls_warn_from_check-line.
236
- ls_warning-column = ls_warn_from_check-column.
237
- ls_warning-severity = ls_warn_from_check-severity.
238
- ls_warning-object_type = 'DDLS'.
239
- ls_warning-object_name = lv_ddls_name.
240
- " Use MESSAGE statement to get real warning message
241
- MESSAGE ID ls_warn_from_check-arbgb TYPE 'E' NUMBER ls_warn_from_check-msgnr
242
- WITH ls_warn_from_check-var1 ls_warn_from_check-var2 ls_warn_from_check-var3 ls_warn_from_check-var4
243
- INTO lv_warn_msg.
244
- ls_warning-message = lv_warn_msg.
245
- APPEND ls_warning TO ls_result-warnings.
246
- ENDLOOP.
247
-
248
- " If no errors and no warnings, validation passed
249
- IF ls_result-warnings IS INITIAL.
250
- ls_result-success = abap_true.
251
- ELSE.
252
- ls_result-success = abap_false.
253
- ENDIF.
254
-
255
- CATCH cx_dd_ddl_check INTO lx_error.
256
- " Validation failed - get error details using get_errors method
257
- DATA(lt_errors) = lx_error->get_errors( ).
258
- LOOP AT lt_errors INTO DATA(ls_err).
259
- CLEAR ls_error.
260
- ls_error-line = ls_err-line.
261
- ls_error-column = ls_err-column.
262
- " Use MESSAGE statement to get real error message
263
- MESSAGE ID ls_err-arbgb TYPE 'E' NUMBER ls_err-msgnr
264
- WITH ls_err-var1 ls_err-var2 ls_err-var3 ls_err-var4
265
- INTO lv_err_msg.
266
- ls_error-text = lv_err_msg.
267
- APPEND ls_error TO ls_result-errors.
268
- ENDLOOP.
269
-
270
- " Also get warnings if any
271
- DATA(lt_warn) = lx_error->get_warnings( ).
272
- LOOP AT lt_warn INTO DATA(ls_warn2).
273
- CLEAR ls_warning.
274
- ls_warning-type = ls_warn2-type.
275
- ls_warning-line = ls_warn2-line.
276
- ls_warning-column = ls_warn2-column.
277
- ls_warning-severity = ls_warn2-severity.
278
- ls_warning-object_type = 'DDLS'.
279
- ls_warning-object_name = lv_ddls_name.
280
- " Use MESSAGE statement to get real warning message
281
- MESSAGE ID ls_warn2-arbgb TYPE 'E' NUMBER ls_warn2-msgnr
282
- WITH ls_warn2-var1 ls_warn2-var2 ls_warn2-var3 ls_warn2-var4
283
- INTO lv_warn_msg.
284
- ls_warning-message = lv_warn_msg.
285
- APPEND ls_warning TO ls_result-warnings.
286
- ENDLOOP.
287
-
288
- ls_result-success = abap_false.
289
- ENDTRY.
290
-
291
- ls_result-error_count = lines( ls_result-errors ).
292
- APPEND ls_result TO rt_results.
293
- ENDLOOP.
294
- ENDMETHOD.
295
-
296
- METHOD run_syntax_check.
297
- DATA: lv_name TYPE sci_objs,
298
- lo_objset TYPE REF TO cl_ci_objectset,
299
- lo_variant TYPE REF TO cl_ci_checkvariant,
300
- lo_inspection TYPE REF TO cl_ci_inspection,
301
- lt_list TYPE scit_alvlist,
302
- ls_error TYPE ty_error,
303
- ls_list TYPE scir_alvlist,
304
- lx_error TYPE REF TO cx_root,
305
- ls_result TYPE ty_inspect_result.
306
-
307
- rt_results = VALUE #( ).
308
-
309
- TRY.
310
- " Create unique name for inspection
311
- CONCATENATE 'SYNT_' sy-uname sy-datum sy-uzeit INTO lv_name.
312
-
313
- " Create object set
314
- lo_objset = cl_ci_objectset=>save_from_list(
315
- p_name = lv_name
316
- p_objects = it_objects ).
317
-
318
- " Get check variant for syntax check
319
- lo_variant = cl_ci_checkvariant=>get_ref(
320
- p_user = ''
321
- p_name = 'SYNTAX_CHECK' ).
322
-
323
- " Create inspection
324
- cl_ci_inspection=>create(
325
- EXPORTING
326
- p_user = sy-uname
327
- p_name = lv_name
328
- RECEIVING
329
- p_ref = lo_inspection ).
330
-
331
- " Set inspection with object set and variant
332
- lo_inspection->set(
333
- EXPORTING
334
- p_chkv = lo_variant
335
- p_objs = lo_objset ).
336
-
337
- " Save inspection
338
- lo_inspection->save( ).
339
-
340
- " Run inspection
341
- lo_inspection->run(
342
- EXPORTING
343
- p_howtorun = 'R'
344
- EXCEPTIONS
345
- invalid_check_version = 1
346
- OTHERS = 2 ).
347
-
348
- " Get results
349
- lo_inspection->plain_list( IMPORTING p_list = lt_list ).
350
-
351
- " Build result for each object
352
- LOOP AT it_objects INTO DATA(ls_obj).
353
- CLEAR ls_result.
354
- ls_result-object_type = ls_obj-objtype.
355
- ls_result-object_name = ls_obj-objname.
356
- ls_result-success = abap_true.
357
-
358
- " Get errors for this object
359
- LOOP AT lt_list INTO ls_list WHERE objname = ls_obj-objname.
360
- CLEAR ls_error.
361
- ls_error-line = ls_list-line.
362
- ls_error-column = ls_list-col.
363
- ls_error-text = ls_list-text.
364
- ls_error-word = ls_list-code.
365
- APPEND ls_error TO ls_result-errors.
366
- ENDLOOP.
367
-
368
- ls_result-error_count = lines( ls_result-errors ).
369
- IF ls_result-error_count > 0.
370
- ls_result-success = abap_false.
371
- ENDIF.
372
-
373
- APPEND ls_result TO rt_results.
374
- ENDLOOP.
375
-
376
- " Cleanup
377
- lo_inspection->delete(
378
- EXCEPTIONS
379
- locked = 1
380
- error_in_enqueue = 2
381
- not_authorized = 3
382
- exceptn_appl_exists = 4
383
- OTHERS = 5 ).
384
-
385
- lo_objset->delete(
386
- EXCEPTIONS
387
- exists_in_insp = 1
388
- locked = 2
389
- error_in_enqueue = 3
390
- not_authorized = 4
391
- exists_in_objs = 5
392
- OTHERS = 6 ).
393
-
394
- CATCH cx_root INTO lx_error.
395
- " Return error for all objects
396
- LOOP AT it_objects INTO ls_obj.
397
- CLEAR ls_result.
398
- ls_result-object_type = ls_obj-objtype.
399
- ls_result-object_name = ls_obj-objname.
400
- ls_result-success = abap_false.
401
- ls_error-line = '1'.
402
- ls_error-column = '1'.
403
- ls_error-text = lx_error->get_text( ).
404
- APPEND ls_error TO ls_result-errors.
405
- ls_result-error_count = 1.
406
- APPEND ls_result TO rt_results.
407
- ENDLOOP.
408
- ENDTRY.
409
- ENDMETHOD.
410
-
411
- ENDCLASS.
@@ -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.