Skip to content

Commit bf28d04

Browse files
authored
Implements the dev feature (#1362)
* Implements the dev feature ```nim dev: requires unittest2 ``` Notice `dev` is just an alias to `feature "dev"`. It will be activated when working in a package by default (only for the root package) * Fixes test * fixes test * fix test
1 parent d9f7374 commit bf28d04

7 files changed

+51
-12
lines changed

src/nimble.nim

+5-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,11 @@ proc processFreeDependenciesSAT(rootPkgInfo: PackageInfo, options: Options): Has
111111
rootPkgInfo.requires &= rootPkgInfo.features[feature]
112112
for pkgName, activeFeatures in rootPkgInfo.activeFeatures:
113113
appendGloballyActiveFeatures(pkgName[0], activeFeatures)
114-
114+
115+
#If root is a development package, we need to activate it as well:
116+
if rootPkgInfo.isDevelopment(options) and "dev" in rootPkgInfo.features:
117+
rootPkgInfo.requires &= rootPkgInfo.features["dev"]
118+
appendGloballyActiveFeatures(rootPkgInfo.basicInfo.name, @["dev"])
115119
rootPkgInfo.requires &= options.extraRequires
116120

117121
var pkgList = initPkgList(rootPkgInfo, options)

src/nimblepkg/declarativeparser.nim

+16-7
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ proc extractSeqLiteral(n: PNode, conf: ConfigRef, varName: string): seq[string]
4646
else:
4747
localError(conf, n.info, &"'{varName}' must be assigned a sequence with @ prefix")
4848

49+
proc extractFeatures(featureNode: PNode, conf: ConfigRef, hasErrors: var bool): seq[string] =
50+
## Extracts requirements from a feature declaration
51+
if featureNode.kind in {nkStmtList, nkStmtListExpr}:
52+
for stmt in featureNode:
53+
if stmt.kind in nkCallKinds and stmt[0].kind == nkIdent and
54+
stmt[0].ident.s == "requires":
55+
var requires: seq[string]
56+
extractRequires(stmt, conf, requires, hasErrors)
57+
result.add requires
58+
4959
proc extract(n: PNode, conf: ConfigRef, result: var NimbleFileInfo) =
5060
case n.kind
5161
of nkStmtList, nkStmtListExpr:
@@ -61,13 +71,12 @@ proc extract(n: PNode, conf: ConfigRef, result: var NimbleFileInfo) =
6171
let featureName = n[1].strVal
6272
if not result.features.hasKey(featureName):
6373
result.features[featureName] = @[]
64-
if n[2].kind in {nkStmtList, nkStmtListExpr}:
65-
for stmt in n[2]:
66-
if stmt.kind in nkCallKinds and stmt[0].kind == nkIdent and
67-
stmt[0].ident.s == "requires":
68-
var requires: seq[string]
69-
extractRequires(stmt, conf, requires, result.hasErrors)
70-
result.features[featureName].add requires
74+
result.features[featureName] = extractFeatures(n[2], conf, result.hasErrors)
75+
of "dev":
76+
let featureName = "dev"
77+
if not result.features.hasKey(featureName):
78+
result.features[featureName] = @[]
79+
result.features[featureName] = extractFeatures(n[1], conf, result.hasErrors)
7180
of "task":
7281
if n.len >= 3 and n[1].kind == nkIdent and
7382
n[2].kind in {nkStrLit .. nkTripleStrLit}:

src/nimblepkg/nimscriptapi.nim

+4-1
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,7 @@ proc getPathsClause*(): string =
257257
return getPaths().mapIt("--path:" & it).join(" ")
258258
259259
template feature*(name: string, body: untyped): untyped =
260-
discard
260+
discard
261+
262+
template dev*(body: untyped): untyped =
263+
discard

src/nimblepkg/options.nim

+5
Original file line numberDiff line numberDiff line change
@@ -983,3 +983,8 @@ proc isSubdirOf*(subdir, baseDir: string): bool =
983983
normalizedSubdir.toLower.startsWith(normalizedBaseDir.toLower)
984984
else:
985985
normalizedSubdir.startsWith(normalizedBaseDir)
986+
987+
proc isDevelopment*(pkg: PackageInfo, options: Options): bool =
988+
### Returns true if the package is a development package.
989+
### A development package is a root package that is not installed.
990+
not pkg.myPath.parentDir.startsWith(options.getPkgsDir())

tests/features/features.nimble

+3
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ requires "nim", "result[resultfeature]"
1313

1414
feature "feature1":
1515
requires "stew"
16+
17+
dev:
18+
requires "unittest2"

tests/features/src/features.nim

+9-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,12 @@ else:
2323
echo "resultfeature is disabled"
2424

2525

26-
echo ""
26+
when defined(features.features.dev):
27+
echo "dev is enabled"
28+
import unittest
29+
else:
30+
echo "dev is disabled"
31+
32+
33+
34+
echo ""

tests/tdeclarativeparser.nim

+9-2
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ suite "Declarative parser features":
8787
let nimbleFile = "./features/features.nimble"
8888
let nimbleFileInfo = extractRequiresInfo(nimbleFile)
8989
let features = nimbleFileInfo.features
90-
check features.len == 1
90+
check features.len == 2 #we need to account for the default 'dev' feature
9191
check features["feature1"] == @["stew"]
9292

9393
test "should be able to install a package using the declarative parser with a feature":
@@ -131,11 +131,18 @@ suite "Declarative parser features":
131131
check output.processOutput.inLines("Feature ver2 activated")
132132
check output.processOutput.inLines("Feature1 deactivated")
133133

134+
test "should activate dev feature if the root package is a development package":
135+
cd "features":
136+
let (output, exitCode) = execNimble("--parser:declarative", "run")
137+
check exitCode == QuitSuccess
138+
check output.processOutput.inLines("dev is enabled")
139+
140+
134141
#[NEXT Tests:
135142
136143
TODO:
137144
- compile time nimble parser detection so we can warn when using the vm parser with features
138-
- add enable features to nimble.paths
139145
140146
]#
141147

148+
echo ""

0 commit comments

Comments
 (0)