Skip to content

Commit bcb1c60

Browse files
committed
Update to 7.5.0
1 parent 2ea1a88 commit bcb1c60

7 files changed

+169
-61
lines changed

src/classes/zcl_semver.clas.abap

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ CLASS zcl_semver DEFINITION
8181
IMPORTING
8282
release TYPE string
8383
identifier TYPE string OPTIONAL
84-
identifier_base TYPE i DEFAULT 0
84+
identifier_base TYPE string OPTIONAL
8585
RETURNING
8686
VALUE(result) TYPE REF TO zcl_semver
8787
RAISING
@@ -219,7 +219,7 @@ CLASS zcl_semver IMPLEMENTATION.
219219
DATA(m) = r->create_matcher( text = zcl_semver_utils=>version_trim( version ) ).
220220

221221
IF NOT m->match( ).
222-
zcx_semver_error=>raise( |Invalid version { version }| ).
222+
zcx_semver_error=>raise( |Invalid version: { version }| ).
223223
ENDIF.
224224

225225
raw = version.
@@ -232,19 +232,19 @@ CLASS zcl_semver IMPLEMENTATION.
232232
IF major_num BETWEEN 0 AND zif_semver_constants=>max_safe_integer.
233233
major = major_num.
234234
ELSE.
235-
zcx_semver_error=>raise( |Invalid major version { major_num }| ).
235+
zcx_semver_error=>raise( |Invalid major version: { major_num }| ).
236236
ENDIF.
237237

238238
IF minor_num BETWEEN 0 AND zif_semver_constants=>max_safe_integer.
239239
minor = minor_num.
240240
ELSE.
241-
zcx_semver_error=>raise( |Invalid minor version { minor_num }| ).
241+
zcx_semver_error=>raise( |Invalid minor version: { minor_num }| ).
242242
ENDIF.
243243

244244
IF patch_num BETWEEN 0 AND zif_semver_constants=>max_safe_integer.
245245
patch = patch_num.
246246
ELSE.
247-
zcx_semver_error=>raise( |Invalid patch version { patch_num }| ).
247+
zcx_semver_error=>raise( |Invalid patch version: { patch_num }| ).
248248
ENDIF.
249249

250250
DATA(m4) = m->get_submatch( 4 ).
@@ -315,6 +315,10 @@ CLASS zcl_semver IMPLEMENTATION.
315315

316316
METHOD inc.
317317

318+
CONSTANTS false TYPE string VALUE 'false'.
319+
320+
DATA prerelease_tab LIKE prerelease.
321+
318322
CASE release.
319323
WHEN 'premajor'.
320324
CLEAR prerelease.
@@ -374,8 +378,18 @@ CLASS zcl_semver IMPLEMENTATION.
374378
WHEN 'pre'.
375379
" This probably shouldn't be used publicly.
376380
" 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
381+
IF identifier_base IS INITIAL OR identifier_base = `0`.
382+
DATA(base) = `0`.
383+
ELSE.
384+
base = COND #( WHEN zcl_semver_utils=>is_numeric( identifier_base ) THEN `1` ELSE `0` ).
385+
ENDIF.
386+
387+
IF identifier IS INITIAL AND identifier_base = false.
388+
zcx_semver_error=>raise( 'Invalid increment argument: identifier is empty' ).
389+
ENDIF.
390+
377391
IF prerelease IS INITIAL.
378-
prerelease = VALUE #( ( `0` ) ).
392+
prerelease = VALUE #( ( base ) ).
379393
ELSE.
380394
DATA(i) = lines( prerelease ).
381395
WHILE i > 0.
@@ -388,19 +402,28 @@ CLASS zcl_semver IMPLEMENTATION.
388402
ENDWHILE.
389403
IF i = 0.
390404
" didn't increment anything
391-
INSERT `0` INTO TABLE prerelease.
405+
DATA(prerelease_string) = concat_lines_of( table = prerelease sep = '.' ).
406+
IF identifier = prerelease_string AND identifier_base = false.
407+
zcx_semver_error=>raise( 'Invalid increment argument: identifier already exists' ).
408+
ENDIF.
409+
410+
INSERT base INTO TABLE prerelease.
392411
ENDIF.
393412
ENDIF.
394413
IF identifier IS NOT INITIAL.
395-
DATA(base) = COND #( WHEN identifier_base <> 0 THEN `1` ELSE `0` ).
396414
" 1.2.0-beta.1 bumps to 1.2.0-beta.2,
397415
" 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
416+
prerelease_tab = VALUE #( ( identifier ) ( base ) ).
417+
IF identifier_base = false.
418+
prerelease_tab = VALUE #( ( identifier ) ).
419+
ENDIF.
420+
398421
IF zcl_semver_identifiers=>compare_identifiers( a = prerelease[ 1 ] b = identifier ) = 0.
399422
IF NOT zcl_semver_utils=>is_numeric( VALUE #( prerelease[ 2 ] DEFAULT `-` ) ).
400-
prerelease = VALUE #( ( identifier ) ( base ) ).
423+
prerelease = prerelease_tab.
401424
ENDIF.
402425
ELSE.
403-
prerelease = VALUE #( ( identifier ) ( base ) ).
426+
prerelease = prerelease_tab.
404427
ENDIF.
405428
ENDIF.
406429

src/cli/zcl_semver_cli.clas.abap

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ CLASS zcl_semver_cli DEFINITION
3939
ranges TYPE string_table,
4040
inc TYPE string,
4141
identifier TYPE string,
42-
identifier_base TYPE i,
42+
identifier_base TYPE string,
4343
loose TYPE abap_bool,
4444
incpre TYPE abap_bool,
4545
coerce TYPE abap_bool,
@@ -84,8 +84,10 @@ CLASS zcl_semver_cli IMPLEMENTATION.
8484
( `-l --loose` )
8585
( ` Interpret versions and ranges loosely` )
8686
( `` )
87-
( `-n <0|1>` )
88-
( ` This is the base to be used for the prerelease identifier.` )
87+
( `-n <base>` )
88+
( ` Base number to be used for the prerelease identifier.` )
89+
( ` Can be either 0 or 1, or false to omit the number altogether.` )
90+
( ` Defaults to 0.` )
8991
( `` )
9092
( `-p --include-prerelease` )
9193
( ` Always include prerelease versions in range matching` )

src/cli/zcl_semver_cli.clas.testclasses.abap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ CLASS ltcl_semver_cli IMPLEMENTATION.
9090
args = '-i premajor 1.0.0 --preid=beta -n 1'
9191
out = |2.0.0-beta.1\n| ).
9292

93+
test(
94+
args = '-i premajor 1.0.0 --preid=beta -n false'
95+
out = |2.0.0-beta\n| ).
96+
9397
test(
9498
args = '-i 1.2.3'
9599
out = |1.2.4\n| ).

src/functions/zcl_semver_functions.clas.abap

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ CLASS zcl_semver_functions DEFINITION
123123
version TYPE any
124124
release TYPE string
125125
identifier TYPE string OPTIONAL
126-
identifier_base TYPE i DEFAULT 0
126+
identifier_base TYPE string OPTIONAL
127127
loose TYPE abap_bool DEFAULT abap_false
128128
incpre TYPE abap_bool DEFAULT abap_false
129129
RETURNING
@@ -185,6 +185,7 @@ CLASS zcl_semver_functions DEFINITION
185185
version TYPE any
186186
loose TYPE abap_bool DEFAULT abap_false
187187
incpre TYPE abap_bool DEFAULT abap_false
188+
throw_errors TYPE abap_bool DEFAULT abap_false
188189
RETURNING
189190
VALUE(result) TYPE REF TO zcl_semver
190191
RAISING
@@ -426,40 +427,62 @@ CLASS zcl_semver_functions IMPLEMENTATION.
426427

427428
METHOD diff.
428429

429-
CHECK NOT eq( a = version_1 b = version_2 ).
430+
DATA(v1) = parse( version = version_1 throw_errors = abap_true ).
431+
DATA(v2) = parse( version = version_2 throw_errors = abap_true ).
430432

431-
DATA(semver_1) = parse( version_1 ).
432-
DATA(semver_2) = parse( version_2 ).
433+
DATA(comparison) = v1->compare( v2 ).
433434

434-
CHECK semver_1 IS BOUND AND semver_2 IS BOUND.
435+
IF comparison = 0.
436+
RETURN.
437+
ENDIF.
435438

436-
DATA(has_pre) = xsdbool( semver_1->prerelease IS NOT INITIAL OR semver_2->prerelease IS NOT INITIAL ).
439+
DATA(v1_higher) = xsdbool( comparison > 0 ).
440+
DATA(high_version) = COND #( WHEN v1_higher = abap_true THEN v1 ELSE v2 ).
441+
DATA(low_version) = COND #( WHEN v1_higher = abap_true THEN v2 ELSE v1 ).
442+
DATA(high_has_pre) = xsdbool( high_version->prerelease IS NOT INITIAL ).
437443

438-
IF has_pre = abap_true.
439-
DATA(prefix) = 'pre'.
440-
DATA(default_result) = 'prerelease'.
441-
ENDIF.
444+
" add the `pre` prefix if we are going to a prerelease version
445+
DATA(prefix) = COND #( WHEN high_has_pre = abap_true THEN 'pre' ELSE '' ).
442446

443-
IF semver_1->major <> semver_2->major.
447+
IF v1->major <> v2->major.
444448
result = prefix && 'major'.
445-
ELSEIF semver_1->minor <> semver_2->minor.
449+
RETURN.
450+
ENDIF.
451+
452+
IF v1->minor <> v2->minor.
446453
result = prefix && 'minor'.
447-
ELSEIF semver_1->patch <> semver_2->patch.
454+
RETURN.
455+
ENDIF.
456+
457+
IF v1->patch <> v2->patch.
448458
result = prefix && 'patch'.
449-
ELSEIF semver_1->prerelease IS INITIAL OR semver_2->prerelease IS INITIAL.
450-
IF semver_1->patch IS NOT INITIAL.
451-
result = 'patch'.
452-
ELSEIF semver_1->minor IS NOT INITIAL.
453-
result = 'minor'.
454-
ELSEIF semver_1->major IS NOT INITIAL.
455-
result = 'major'.
456-
ELSE.
457-
result = default_result. " may be undefined
458-
ENDIF.
459-
ELSE.
460-
result = default_result. " may be undefined
459+
RETURN.
460+
ENDIF.
461+
462+
" at this point we know stable versions match but overall versions are not equal,
463+
" so either they are both prereleases, or the lower version is a prerelease
464+
465+
IF high_has_pre = abap_true.
466+
" high and low are preleases
467+
result = 'prerelease'.
468+
RETURN.
469+
ENDIF.
470+
471+
IF low_version->patch IS NOT INITIAL.
472+
" anything higher than a patch bump would result in the wrong version
473+
result = 'patch'.
474+
RETURN.
475+
ENDIF.
476+
477+
IF low_version->minor IS NOT INITIAL.
478+
" anything higher than a minor bump would result in the wrong version
479+
result = 'minor'.
480+
RETURN.
461481
ENDIF.
462482

483+
" bumping major/minor/patch all have same result
484+
result = 'major'.
485+
463486
ENDMETHOD.
464487

465488

@@ -565,13 +588,14 @@ CLASS zcl_semver_functions IMPLEMENTATION.
565588
RETURN.
566589
ENDIF.
567590

568-
CHECK kind = cl_abap_typedescr=>typekind_char OR kind = cl_abap_typedescr=>typekind_string.
569-
570-
CHECK strlen( version ) <= zif_semver_constants=>max_length.
571-
572591
TRY.
573592
result = zcl_semver=>create( version = version loose = loose incpre = incpre ).
574-
CATCH zcx_semver_error ##NO_HANDLER.
593+
CATCH zcx_semver_error INTO DATA(error).
594+
IF throw_errors = abap_false.
595+
RETURN.
596+
ENDIF.
597+
598+
RAISE EXCEPTION error.
575599
ENDTRY.
576600

577601
ENDMETHOD.

src/functions/zcl_semver_functions.clas.testclasses.abap

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,10 +499,19 @@ CLASS ltcl_semver_functions IMPLEMENTATION.
499499
( v1 = '1.1.0' v2 = '1.1.0-pre' res = 'minor' )
500500
( v1 = '1.1.0-pre-1' v2 = '1.1.0-pre-2' res = 'prerelease' )
501501
( v1 = '1.0.0' v2 = '1.0.0' res = '' )
502+
( v1 = '1.0.0-1' v2 = '1.0.0-1' res = '' )
502503
( v1 = '0.0.2-1' v2 = '0.0.2' res = 'patch' )
504+
( v1 = '0.0.2-1' v2 = '0.0.3' res = 'patch' )
505+
( v1 = '0.0.2-1' v2 = '0.1.0' res = 'minor' )
506+
( v1 = '0.0.2-1' v2 = '1.0.0' res = 'major' )
503507
( v1 = '0.1.0-1' v2 = '0.1.0' res = 'minor' )
504508
( v1 = '1.0.0-1' v2 = '1.0.0' res = 'major' )
505-
( v1 = '0.0.0-1' v2 = '0.0.0' res = 'prerelease' ) ).
509+
( v1 = '1.0.1-1' v2 = '1.0.1' res = 'patch' )
510+
( v1 = '0.0.0-1' v2 = '0.0.0' res = 'major' )
511+
( v1 = '1.0.0-1' v2 = '2.0.0' res = 'major' )
512+
( v1 = '1.0.0-1' v2 = '2.0.0-1' res = 'premajor' )
513+
( v1 = '1.0.0-1' v2 = '1.1.0-1' res = 'preminor' )
514+
( v1 = '1.0.0-1' v2 = '1.0.1-1' res = 'prepatch' ) ).
506515

507516
LOOP AT tests INTO DATA(test).
508517
DATA(msg) = |{ test-v1 } { test-v2 } { test-res } |.
@@ -513,6 +522,18 @@ CLASS ltcl_semver_functions IMPLEMENTATION.
513522
msg = msg ).
514523
ENDLOOP.
515524

525+
" throws on bad version
526+
TRY.
527+
zcl_semver_functions=>diff(
528+
version_1 = 'bad'
529+
version_2 = '1.2.3' ).
530+
cl_abap_unit_assert=>fail( ).
531+
CATCH zcx_semver_error INTO DATA(error).
532+
cl_abap_unit_assert=>assert_equals(
533+
act = error->get_text( )
534+
exp = 'Invalid version: bad' ).
535+
ENDTRY.
536+
516537
ENDMETHOD.
517538

518539
METHOD eq.
@@ -903,6 +924,18 @@ CLASS ltcl_semver_functions IMPLEMENTATION.
903924
msg = msg ).
904925
ENDLOOP.
905926

927+
" throw errors if asked to
928+
TRY.
929+
zcl_semver_functions=>parse(
930+
version = 'bad'
931+
throw_errors = abap_true ).
932+
cl_abap_unit_assert=>fail( ).
933+
CATCH zcx_semver_error INTO DATA(error).
934+
cl_abap_unit_assert=>assert_equals(
935+
act = error->get_text( )
936+
exp = 'Invalid version: bad' ).
937+
ENDTRY.
938+
906939
" parse a version into a SemVer object
907940
cl_abap_unit_assert=>assert_equals(
908941
act = zcl_semver_functions=>parse( '1.2.3' )->version

src/internal/zcl_semver_fixtures.clas.abap

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ CLASS zcl_semver_fixtures DEFINITION
5656
loose TYPE abap_bool,
5757
incpre TYPE abap_bool,
5858
identifier TYPE string,
59-
identifier_base TYPE i,
59+
identifier_base TYPE string,
6060
END OF ty_increment,
6161
ty_increments TYPE STANDARD TABLE OF ty_increment WITH DEFAULT KEY.
6262

@@ -368,6 +368,7 @@ CLASS zcl_semver_fixtures IMPLEMENTATION.
368368
( version = '1.2.3-1' release = 'preminor' res = '1.3.0-dev.0' identifier = 'dev' )
369369
( version = '1.2.0' release = 'premajor' res = '2.0.0-dev.0' identifier = 'dev' )
370370
( version = '1.2.3-1' release = 'premajor' res = '2.0.0-dev.0' identifier = 'dev' )
371+
( version = '1.2.3-1' release = 'premajor' res = '2.0.0-dev.1' identifier = 'dev' identifier_base = '1' )
371372
( version = '1.2.0-1' release = 'minor' res = '1.2.0' identifier = 'dev' )
372373
( version = '1.0.0-1' release = 'major' res = '1.0.0' identifier = 'dev' )
373374
( version = '1.2.3-dev.bar' release = 'prerelease' res = '1.2.3-dev.0' identifier = 'dev' )
@@ -377,19 +378,40 @@ CLASS zcl_semver_fixtures IMPLEMENTATION.
377378
( version = '1.2.3-1.1' release = 'prerelease' res = '1.2.3-1.2' identifier = '1' )
378379
( version = '1.2.3-1.1' release = 'prerelease' res = '1.2.3-2.0' identifier = '2' )
379380

380-
( version = '1.2.0-1' release = 'prerelease' res = '1.2.0-alpha.0' identifier = 'alpha' identifier_base = 0 )
381-
( version = '1.2.1' release = 'prerelease' res = '1.2.2-alpha.0' identifier = 'alpha' identifier_base = 0 )
382-
( version = '0.2.0' release = 'prerelease' res = '0.2.1-alpha.0' identifier = 'alpha' identifier_base = 0 )
383-
( version = '1.2.2' release = 'prerelease' res = '1.2.3-alpha.1' identifier = 'alpha' identifier_base = 1 )
384-
( version = '1.2.3' release = 'prerelease' res = '1.2.4-alpha.1' identifier = 'alpha' identifier_base = 1 )
385-
( version = '1.2.4' release = 'prerelease' res = '1.2.5-alpha.1' identifier = 'alpha' identifier_base = 1 )
386-
( version = '1.2.0' release = 'prepatch' res = '1.2.1-dev.1' identifier = 'dev' identifier_base = 1 )
387-
( version = '1.2.0-1' release = 'prepatch' res = '1.2.1-dev.1' identifier = 'dev' identifier_base = 1 )
388-
( version = '1.2.0' release = 'premajor' res = '2.0.0-dev.0' identifier = 'dev' identifier_base = 0 )
389-
( version = '1.2.3-1' release = 'premajor' res = '2.0.0-dev.0' identifier = 'dev' identifier_base = 0 )
390-
( version = '1.2.3-dev.bar' release = 'prerelease' res = '1.2.3-dev.0' identifier = 'dev' identifier_base = 0 )
391-
( version = '1.2.0' release = 'preminor' res = '1.3.0-dev.1' identifier = 'dev' identifier_base = 1 )
392-
( version = '1.2.3-1' release = 'preminor' res = '1.3.0-dev.0' identifier = 'dev' ) ).
381+
( version = '1.2.0-1' release = 'prerelease' res = '1.2.0-alpha.0' identifier = 'alpha' identifier_base = '0' )
382+
( version = '1.2.1' release = 'prerelease' res = '1.2.2-alpha.0' identifier = 'alpha' identifier_base = '0' )
383+
( version = '0.2.0' release = 'prerelease' res = '0.2.1-alpha.0' identifier = 'alpha' identifier_base = '0' )
384+
( version = '1.2.2' release = 'prerelease' res = '1.2.3-alpha.1' identifier = 'alpha' identifier_base = '1' )
385+
( version = '1.2.3' release = 'prerelease' res = '1.2.4-alpha.1' identifier = 'alpha' identifier_base = '1' )
386+
( version = '1.2.4' release = 'prerelease' res = '1.2.5-alpha.1' identifier = 'alpha' identifier_base = '1' )
387+
( version = '1.2.0' release = 'prepatch' res = '1.2.1-dev.1' identifier = 'dev' identifier_base = '1' )
388+
( version = '1.2.0-1' release = 'prepatch' res = '1.2.1-dev.1' identifier = 'dev' identifier_base = '1' )
389+
( version = '1.2.0' release = 'premajor' res = '2.0.0-dev.0' identifier = 'dev' identifier_base = '0' )
390+
( version = '1.2.3-1' release = 'premajor' res = '2.0.0-dev.0' identifier = 'dev' identifier_base = '0' )
391+
( version = '1.2.3-dev.bar' release = 'prerelease' res = '1.2.3-dev.0' identifier = 'dev' identifier_base = '0' )
392+
( version = '1.2.3-dev.bar' release = 'prerelease' res = '1.2.3-dev.1' identifier = 'dev' identifier_base = '1' )
393+
( version = '1.2.3-dev.bar' release = 'prerelease' res = '1.2.3-dev.bar.0' identifier = '' identifier_base = '0' )
394+
( version = '1.2.3-dev.bar' release = 'prerelease' res = '1.2.3-dev.bar.1' identifier = '' identifier_base = '1' )
395+
( version = '1.2.0' release = 'preminor' res = '1.3.0-dev.1' identifier = 'dev' identifier_base = '1' )
396+
( version = '1.2.3-1' release = 'preminor' res = '1.3.0-dev.0' identifier = 'dev' )
397+
( version = '1.2.0' release = 'prerelease' res = '1.2.1-1' identifier = '' identifier_base = '1' )
398+
399+
( version = '1.2.0-1' release = 'prerelease' res = '1.2.0-alpha' identifier = 'alpha' identifier_base = 'false' )
400+
( version = '1.2.1' release = 'prerelease' res = '1.2.2-alpha' identifier = 'alpha' identifier_base = 'false' )
401+
( version = '1.2.2' release = 'prerelease' res = '1.2.3-alpha' identifier = 'alpha' identifier_base = 'false' )
402+
( version = '1.2.0' release = 'prepatch' res = '1.2.1-dev' identifier = 'dev' identifier_base = 'false' )
403+
( version = '1.2.0-1' release = 'prepatch' res = '1.2.1-dev' identifier = 'dev' identifier_base = 'false' )
404+
( version = '1.2.0' release = 'premajor' res = '2.0.0-dev' identifier = 'dev' identifier_base = 'false' )
405+
( version = '1.2.3-1' release = 'premajor' res = '2.0.0-dev' identifier = 'dev' identifier_base = 'false' )
406+
( version = '1.2.3-dev.bar' release = 'prerelease' res = '1.2.3-dev' identifier = 'dev' identifier_base = 'false' )
407+
( version = '1.2.3-dev.bar' release = 'prerelease' res = '1.2.3-dev.baz' identifier = 'dev.baz' identifier_base = 'false' )
408+
( version = '1.2.0' release = 'preminor' res = '1.3.0-dev' identifier = 'dev' identifier_base = 'false' )
409+
( version = '1.2.3-1' release = 'preminor' res = '1.3.0-dev' identifier = 'dev' identifier_base = 'false' )
410+
( version = '1.2.3-dev' release = 'prerelease' res = '' identifier = 'dev' identifier_base = 'false' )
411+
( version = '1.2.0-dev' release = 'premajor' res = '2.0.0-dev' identifier = 'dev' identifier_base = 'false' )
412+
( version = '1.2.0-dev' release = 'preminor' res = '1.3.0-beta' identifier = 'beta' identifier_base = 'false' )
413+
( version = '1.2.0-dev' release = 'prepatch' res = '1.2.1-dev' identifier = 'dev' identifier_base = 'false' )
414+
( version = '1.2.0' release = 'prerelease' res = '' identifier = '' identifier_base = 'false' ) ).
393415

394416
ENDMETHOD.
395417

0 commit comments

Comments
 (0)