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,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.
@@ -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_PULL</CLSNAME>
7
- <LANGU>E</LANGU>
8
- <DESCRIPT>Pull 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>