diff --git a/src/nimble.nim b/src/nimble.nim index 22d7955..87b0996 100644 --- a/src/nimble.nim +++ b/src/nimble.nim @@ -14,7 +14,7 @@ import nimblepkg/packageinfo, nimblepkg/version, nimblepkg/tools, nimblepkg/download, nimblepkg/config, nimblepkg/common, nimblepkg/publish, nimblepkg/options, nimblepkg/packageparser, nimblepkg/cli, nimblepkg/packageinstaller, nimblepkg/reversedeps, - nimblepkg/nimscriptexecutor + nimblepkg/nimscriptexecutor, nimblepkg/init import nimblepkg/nimscriptsupport @@ -809,94 +809,19 @@ Please specify a valid SPDX identifier.""", $nimDepDef) validateVersion(pkgNimDep) - let pkgTestDir = "tests" - - # Create source directory - os.createDir(pkgRoot / pkgSrcDir) - - display("Success:", "Source directory created successfully", Success, - MediumPriority) - - # Create initial source file - cd pkgRoot / pkgSrcDir: - let pkgFile = pkgName.changeFileExt("nim") - try: - if pkgType == "bin": - pkgFile.writeFile "# Hello Nim!\necho \"Hello, World!\"\n" - else: - pkgFile.writeFile """# $# -# Copyright $# -# $# -""" % [pkgName, pkgAuthor, pkgDesc] - display("Success:", "Created initial source file successfully", Success, - MediumPriority) - except: - raise newException(NimbleError, "Unable to open file " & pkgFile & - " for writing: " & osErrorMsg(osLastError())) - - # Create test directory - os.createDir(pkgRoot / pkgTestDir) - - display("Success:", "Test directory created successfully", Success, - MediumPriority) - - cd pkgRoot / pkgTestDir: - try: - "test1.nims".writeFile("""switch("path", "$$projectDir/../$#")""" % - [pkgSrcDir]) - display("Success:", "Test config file created successfully", Success, - MediumPriority) - except: - raise newException(NimbleError, "Unable to open file " & "test1.nims" & - " for writing: " & osErrorMsg(osLastError())) - try: - "test1.nim".writeFile("doAssert(1 + 1 == 2)\n") - display("Success:", "Test file created successfully", Success, - MediumPriority) - except: - raise newException(NimbleError, "Unable to open file " & "test1.nim" & - " for writing: " & osErrorMsg(osLastError())) - - # Write the nimble file - try: - if pkgType == "lib": - nimbleFile.writeFile """# Package - -version = $# -author = $# -description = $# -license = $# -srcDir = $# - -# Dependencies - -requires "nim >= $#" -""" % [pkgVersion.escape(), pkgAuthor.escape(), pkgDesc.escape(), - pkgLicense.escape(), pkgSrcDir.escape(), pkgNimDep] - else: - nimbleFile.writeFile """# Package - -version = $# -author = $# -description = $# -license = $# -srcDir = $# -bin = @[$#] - -# Dependencies - -requires "nim >= $#" -""" % [pkgVersion.escape(), pkgAuthor.escape(), pkgDesc.escape(), - pkgLicense.escape(), pkgSrcDir.escape(), pkgName.escape(), pkgNimDep] - except: - raise newException( - NimbleError, - "Unable to open file " & nimbleFile & " for writing: " & - osErrorMsg(osLastError()) - ) - - display("Success:", "Nimble file created successfully", Success, - MediumPriority) + createPkgStructure( + ( + pkgName, + pkgVersion, + pkgAuthor, + pkgDesc, + pkgLicense, + pkgSrcDir, + pkgNimDep, + pkgType + ), + pkgRoot + ) display("Success:", "Package $# created successfully" % [pkgName], Success, HighPriority) diff --git a/src/nimblepkg/init.nim b/src/nimblepkg/init.nim new file mode 100644 index 0000000..42c7f4e --- /dev/null +++ b/src/nimblepkg/init.nim @@ -0,0 +1,171 @@ +import os, strutils + +import ./cli, ./tools + +type + PkgInitInfo* = tuple + pkgName: string + pkgVersion: string + pkgAuthor: string + pkgDesc: string + pkgLicense: string + pkgSrcDir: string + pkgNimDep: string + pkgType: string + +proc createPkgStructure*(info: PkgInitInfo, pkgRoot: string) = + # Create source directory + createDirD(pkgRoot / info.pkgSrcDir) + + # Initialise the source code directories and create some example code. + var nimbleFileOptions = "" + case info.pkgType + of "binary": + let mainFile = pkgRoot / info.pkgSrcDir / info.pkgName.changeFileExt("nim") + writeFile(mainFile, +""" +# This is just an example to get you started. A typical binary package +# uses this file as the main entry point of the application. + +when isMainModule: + echo("Hello, World!") +""" + ) + nimbleFileOptions.add("bin = @[\"$1\"]\n" % info.pkgName) + of "library": + let mainFile = pkgRoot / info.pkgSrcDir / info.pkgName.changeFileExt("nim") + writeFile(mainFile, +""" +# This is just an example to get you started. A typical library package +# exports the main API in this file. Note that you cannot rename this file +# but you can remove it if you wish. + +proc add*(x, y: int): int = + ## Adds two files together. + return x + y +""" + ) + + createDirD(pkgRoot / info.pkgSrcDir / info.pkgName) + let submodule = pkgRoot / info.pkgSrcDir / info.pkgName / + "submodule".addFileExt("nim") + writeFile(submodule, +""" +# This is just an example to get you started. Users of your library will +# import this file by writing ``import $1/submodule``. Feel free to rename or +# remove this file altogether. You may create additional modules alongside +# this file as required. + +type + Submodule* = object + name*: string + +proc initSubmodule*(): Submodule = + ## Initialises a new ``Submodule`` object. + Submodule(name: "Anonymous") +""" % info.pkgName + ) + of "hybrid": + let mainFile = pkgRoot / info.pkgSrcDir / info.pkgName.changeFileExt("nim") + writeFile(mainFile, +""" +# This is just an example to get you started. A typical hybrid package +# uses this file as the main entry point of the application. + +import $1pkg/submodule + +when isMainModule: + echo(getWelcomeMessage()) +""" % info.pkgName + ) + + let pkgSubDir = pkgRoot / info.pkgSrcDir / info.pkgName & "pkg" + createDirD(pkgSubDir) + let submodule = pkgSubDir / "submodule".addFileExt("nim") + writeFile(submodule, +""" +# This is just an example to get you started. Users of your hybrid library will +# import this file by writing ``import $1pkg/submodule``. Feel free to rename or +# remove this file altogether. You may create additional modules alongside +# this file as required. + +proc getWelcomeMessage*(): string = "Hello, World!" +""" % info.pkgName + ) + nimbleFileOptions.add("installExt = @[\"nim\"]\n") + nimbleFileOptions.add("bin = @[\"$1\"]\n" % info.pkgName) + else: + assert false, "Invalid package type specified." + + let pkgTestDir = "tests" + # Create test directory + case info.pkgType + of "binary": + discard + of "hybrid", "library": + let pkgTestPath = pkgRoot / pkgTestDir + createDirD(pkgTestPath) + + writeFile(pkgTestPath / "config".addFileExt("nims"), + "switch(\"path\", \"$$projectDir/../$#\")" % info.pkgSrcDir + ) + + if info.pkgType == "library": + writeFile(pkgTestPath / "test1".addFileExt("nim"), +""" +# This is just an example to get you started. You may wish to put all of your +# tests into a single file, or separate them into multiple `test1`, `test2` +# etc. files (better names are recommended, just make sure the name starts with +# the letter 't'). +# +# To run these tests, simply execute `nimble test`. + +import unittest + +import $1 +test "can add": + check add(5, 5) == 10 +""" % info.pkgName + ) + else: + writeFile(pkgTestPath / "test1".addFileExt("nim"), +""" +# This is just an example to get you started. You may wish to put all of your +# tests into a single file, or separate them into multiple `test1`, `test2` +# etc. files (better names are recommended, just make sure the name starts with +# the letter 't'). +# +# To run these tests, simply execute `nimble test`. + +import unittest + +import $1pkg/submodule +test "correct welcome": + check getWelcomeMessage() == "Hello, World!" +""" % info.pkgName + ) + else: + assert false, "Invalid package type specified." + + # Write the nimble file + let nimbleFile = pkgRoot / info.pkgName.changeFileExt("nimble") + writeFile(nimbleFile, """# Package + +version = $# +author = $# +description = $# +license = $# +srcDir = $# +$# + +# Dependencies + +requires "nim >= $#" +""" % [ + info.pkgVersion.escape(), info.pkgAuthor.escape(), info.pkgDesc.escape(), + info.pkgLicense.escape(), info.pkgSrcDir.escape(), nimbleFileOptions, + info.pkgNimDep + ] + ) + + display("Info:", "Nimble file created successfully", priority=MediumPriority) \ No newline at end of file diff --git a/src/nimblepkg/tools.nim b/src/nimblepkg/tools.nim index 5586cd1..8dc71e2 100644 --- a/src/nimblepkg/tools.nim +++ b/src/nimblepkg/tools.nim @@ -106,6 +106,10 @@ proc copyDirD*(fro, to: string): seq[string] = createDir(changeRoot(fro, to, path.splitFile.dir)) result.add copyFileD(path, changeRoot(fro, to, path)) +proc createDirD*(dir: string) = + display("Creating", "directory $#" % dir, priority = LowPriority) + createDir(dir) + proc getDownloadDirName*(uri: string, verRange: VersionRange): string = ## Creates a directory name based on the specified ``uri`` (url) result = ""