Migrate to nitely/nim-regex away from std/nre.
This commit is contained in:
+1
-1
@@ -7,7 +7,7 @@ suite "update_version":
|
|||||||
check:
|
check:
|
||||||
incrementLastVersionPart("1.0.0") == "1.0.1"
|
incrementLastVersionPart("1.0.0") == "1.0.1"
|
||||||
incrementLastVersionPart("1.0.0-alpha.1") == "1.0.0-alpha.2"
|
incrementLastVersionPart("1.0.0-alpha.1") == "1.0.0-alpha.2"
|
||||||
incrementLastVersionPart("cicd_alphe.1-prerelease") == "cicd_alphe.2-prerelease"
|
incrementLastVersionPart("cicd_alpha.1-prerelease") == "cicd_alpha.2-prerelease"
|
||||||
incrementLastVersionPart("2024.04.1") == "2024.04.2"
|
incrementLastVersionPart("2024.04.1") == "2024.04.2"
|
||||||
|
|
||||||
test "incrementSemverPart":
|
test "incrementSemverPart":
|
||||||
|
|||||||
+31
-38
@@ -1,6 +1,5 @@
|
|||||||
import std/[dirs, json, paths, sequtils, strutils, syncio, tables]
|
import std/[dirs, json, paths, sequtils, strutils, syncio, tables]
|
||||||
import std/nre except toSeq
|
import docopt, regex, zero_functional
|
||||||
import docopt, zero_functional
|
|
||||||
|
|
||||||
const USAGE = """Usage:
|
const USAGE = """Usage:
|
||||||
update_nim_package_version bump [<src-file> ...] [options]
|
update_nim_package_version bump [<src-file> ...] [options]
|
||||||
@@ -85,7 +84,7 @@ Details:
|
|||||||
Node: ^\s*export\s+const\s+\S*VERSION\S*\s*=\s*"(<old-version>)"\s*;?$
|
Node: ^\s*export\s+const\s+\S*VERSION\S*\s*=\s*"(<old-version>)"\s*;?$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
const UV_VERSION = "1.2.1"
|
const UV_VERSION = "1.2.2"
|
||||||
|
|
||||||
type
|
type
|
||||||
LangType* = enum lNim, lNode
|
LangType* = enum lNim, lNode
|
||||||
@@ -110,8 +109,8 @@ type PackageVersion* = object
|
|||||||
# See also:
|
# See also:
|
||||||
# https://regex101.com/r/Ly7O1x/3/
|
# https://regex101.com/r/Ly7O1x/3/
|
||||||
#
|
#
|
||||||
let SemverRegex =
|
const SemverRegex =
|
||||||
re"^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"
|
re2"^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"
|
||||||
|
|
||||||
let NimConstPattern = "^\\s*const\\s+\\S*VERSION\\S*\\*?\\s*=\\s*\"($#)\"\\s*$"
|
let NimConstPattern = "^\\s*const\\s+\\S*VERSION\\S*\\*?\\s*=\\s*\"($#)\"\\s*$"
|
||||||
let NodeConstPattern =
|
let NodeConstPattern =
|
||||||
@@ -199,18 +198,17 @@ proc replaceVersionInSource*(
|
|||||||
|
|
||||||
let rgx =
|
let rgx =
|
||||||
case pkg.lang
|
case pkg.lang
|
||||||
of lNim: re(NimConstPattern % [vOld.replace(".", "\\.")])
|
of lNim: re2(NimConstPattern % [vOld.replace(".", "\\.")])
|
||||||
of lNode: re(NodeConstPattern % [vOld.replace(".", "\\.")])
|
of lNode: re2(NodeConstPattern % [vOld.replace(".", "\\.")])
|
||||||
|
|
||||||
var newLines = newSeq[string]()
|
var newLines = newSeq[string]()
|
||||||
for l in source.splitLines():
|
for l in source.splitLines():
|
||||||
let mOpt = l.match(rgx)
|
var m = RegexMatch2()
|
||||||
if mOpt.isSome:
|
if match(l, rgx, m):
|
||||||
let m = mOpt.get
|
|
||||||
newLines.add(
|
newLines.add(
|
||||||
l[0..<m.captureBounds[0].a] &
|
l[0..<m.group(0).a] &
|
||||||
pkg.version &
|
pkg.version &
|
||||||
l[m.captureBounds[0].b+1 .. ^1])
|
l[m.group(0).b+1 .. ^1])
|
||||||
else: newLines.add(l)
|
else: newLines.add(l)
|
||||||
|
|
||||||
return newLines.join("\p")
|
return newLines.join("\p")
|
||||||
@@ -232,12 +230,12 @@ proc fmtSemver*(semver: TableRef[SemverParts, string]): string =
|
|||||||
|
|
||||||
|
|
||||||
proc setLastVersionPart*(version: string, newVersion: string): string =
|
proc setLastVersionPart*(version: string, newVersion: string): string =
|
||||||
let versionParts = toSeq(findIter(version, re"([^\d.]+)?\.?(\d+)"))
|
let versionParts = findAll(version, re2"([^\d.]+)?\.?(\d+)")
|
||||||
let lastVersionPartMatch = versionParts[^1]
|
let lastVersionPart = versionParts[^1]
|
||||||
return
|
return
|
||||||
version[0..<lastVersionPartMatch.captureBounds[1].a] &
|
version[0..<lastVersionPart.group(1).a] &
|
||||||
newVersion &
|
newVersion &
|
||||||
version[lastVersionPartMatch.captureBounds[1].b+1 .. ^1]
|
version[lastVersionPart.group(1).b+1 .. ^1]
|
||||||
|
|
||||||
|
|
||||||
proc setSemverPart*(
|
proc setSemverPart*(
|
||||||
@@ -246,34 +244,32 @@ proc setSemverPart*(
|
|||||||
newVersionPart: string,
|
newVersionPart: string,
|
||||||
defaults = VERSION_DEFAULTS): string =
|
defaults = VERSION_DEFAULTS): string =
|
||||||
|
|
||||||
let matchOpt = match(version, SemverRegex)
|
var m: RegexMatch2
|
||||||
|
if not match(version, SemverRegex, m):
|
||||||
if matchOpt.isNone:
|
|
||||||
raise newException(ValueError,
|
raise newException(ValueError,
|
||||||
"Version [$#] is not a valid Semantic Version number" % version)
|
"Version [$#] is not a valid Semantic Version number" % version)
|
||||||
|
|
||||||
let m = matchOpt.get
|
|
||||||
|
|
||||||
let versionParts = newTable[SemverParts, string]()
|
let versionParts = newTable[SemverParts, string]()
|
||||||
for p in SemverParts.items:
|
for p in SemverParts.items:
|
||||||
if p == part: versionParts[p] = newVersionPart
|
if p == part: versionParts[p] = newVersionPart
|
||||||
elif not m.captures.contains($p) or p > part: versionParts[p] = defaults[p]
|
elif m.group($p).b < m.group($p).a or p > part: versionParts[p] = defaults[p]
|
||||||
else: versionParts[p] = m.captures[$p]
|
else: versionParts[p] = version[m.group($p)]
|
||||||
|
|
||||||
result = fmtSemver(versionParts)
|
result = fmtSemver(versionParts)
|
||||||
if match(result, SemverRegex).isNone:
|
if not match(result, SemverRegex):
|
||||||
raise newException(ValueError,
|
raise newException(ValueError,
|
||||||
"Refusing to update: Version [$#] would not be a valid Semantic Version number" % result)
|
"Refusing to update: Version [$#] would not be a valid Semantic Version number" % result)
|
||||||
|
|
||||||
|
|
||||||
proc incrementLastVersionPart*(version: string): string =
|
proc incrementLastVersionPart*(version: string): string =
|
||||||
let versionParts = toSeq(findIter(version, re"([^\d.]+)?\.?(\d+)"))
|
let versionParts = findAll(version, re2"([^\d.]+)?\.?(\d+)")
|
||||||
let lastVersionPartMatch = versionParts[^1]
|
let lastVersionPart = versionParts[^1]
|
||||||
let lastVersionPartInt = parseInt(lastVersionPartMatch.captures[1])
|
let lastVersionPartInt = parseInt(version[lastVersionPart.group(1)])
|
||||||
|
|
||||||
return
|
return
|
||||||
version[0..<lastVersionPartMatch.captureBounds[1].a] &
|
version[0..<lastVersionPart.group(1).a] &
|
||||||
$(lastVersionPartInt + 1) &
|
$(lastVersionPartInt + 1) &
|
||||||
version[lastVersionPartMatch.captureBounds[1].b+1 .. ^1]
|
version[lastVersionPart.group(1).b+1 .. ^1]
|
||||||
|
|
||||||
|
|
||||||
proc incrementSemverPart*(
|
proc incrementSemverPart*(
|
||||||
@@ -281,27 +277,24 @@ proc incrementSemverPart*(
|
|||||||
part: SemverParts,
|
part: SemverParts,
|
||||||
defaults = VERSION_DEFAULTS): string =
|
defaults = VERSION_DEFAULTS): string =
|
||||||
|
|
||||||
let matchOpt = match(version, SemverRegex)
|
var m: RegexMatch2
|
||||||
|
if not match(version, SemverRegex, m):
|
||||||
if matchOpt.isNone:
|
|
||||||
raise newException(ValueError,
|
raise newException(ValueError,
|
||||||
"Version [$#] is not a valid Semantic Version number" % version)
|
"Version [$#] is not a valid Semantic Version number" % version)
|
||||||
|
|
||||||
let m = matchOpt.get
|
|
||||||
|
|
||||||
let versionParts = newTable[SemverParts, string]()
|
let versionParts = newTable[SemverParts, string]()
|
||||||
for p in SemverParts.items:
|
for p in SemverParts.items:
|
||||||
if p == part:
|
if p == part:
|
||||||
if m.captures.contains($p):
|
if not m.group($p).b < m.group($p).a:
|
||||||
versionParts[p] = incrementLastVersionPart(m.captures[$p])
|
versionParts[p] = incrementLastVersionPart(version[m.group($p)])
|
||||||
elif p < prerelease or defaults[p].len > 0:
|
elif p < prerelease or defaults[p].len > 0:
|
||||||
versionParts[p] = defaults[p]
|
versionParts[p] = defaults[p]
|
||||||
# if this part specifically has been requested to be incremented but
|
# if this part specifically has been requested to be incremented but
|
||||||
# the default is empty, we are still going to give it *something*
|
# the default is empty, we are still going to give it *something*
|
||||||
elif p == prerelease: versionParts[p] = "prerelease.0"
|
elif p == prerelease: versionParts[p] = "prerelease.0"
|
||||||
elif p == buildmetadata: versionParts[p] = "build.0"
|
elif p == buildmetadata: versionParts[p] = "build.0"
|
||||||
elif not m.captures.contains($p) or p > part: versionParts[p] = defaults[p]
|
elif m.group($p).b < m.group($p).a or p > part: versionParts[p] = defaults[p]
|
||||||
else: versionParts[p] = m.captures[$p]
|
else: versionParts[p] = version[m.group($p)]
|
||||||
|
|
||||||
return fmtSemver(versionParts)
|
return fmtSemver(versionParts)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Package
|
# Package
|
||||||
|
|
||||||
version = "1.2.1"
|
version = "1.2.2"
|
||||||
author = "Jonathan Bernard"
|
author = "Jonathan Bernard"
|
||||||
description = "Small util to update version consistently for nim and node packages."
|
description = "Small util to update version consistently for nim and node packages."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
@@ -10,4 +10,4 @@ bin = @["update_version"]
|
|||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
|
|
||||||
requires @["nim >= 1.0.4", "docopt >= 0.7.1", "zero_functional"]
|
requires @["nim >= 1.0.4", "docopt >= 0.7.1", "regex", "zero_functional"]
|
||||||
|
|||||||
Reference in New Issue
Block a user