From d7c412b3533fb8b434c33b3aedb953de53b6f36b Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Sun, 2 Dec 2012 12:47:52 +0000 Subject: [PATCH] Library structure finalised. Structure is also enforced. Main file is optional for now. --- babel.babel | 5 +++-- babel.nim | 28 +++++++++++++++++++++++++--- readme.markdown | 39 ++++++++++++++++++++++++++++++++++----- 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/babel.babel b/babel.babel index 96783a5..ce512ce 100644 --- a/babel.babel +++ b/babel.babel @@ -1,10 +1,11 @@ ; Example babel file [Package] -name = "babel" +name = "jester" version = "0.1.0" author = "Dominik Picheta" description = """Jester is a web framework inspired by Sinatra.""" [Library] -SkipDirs = "tests" +;SkipDirs = "dir" +;SkipFiles = "file.txt" diff --git a/babel.nim b/babel.nim index dff64bc..9b2457a 100644 --- a/babel.nim +++ b/babel.nim @@ -63,6 +63,17 @@ proc parseCmdLine(): TAction = if result.typ == ActionNil: writeHelp() +proc prompt(question: string): bool = + echo(question & " [y/N]") + let yn = stdin.readLine() + case yn.normalize + of "y", "yes": + return true + of "n", "no": + return false + else: + return false + proc update(url: string = defaultPackageURL) = echo("Downloading package list from " & url) downloadFile(url, getHomeDir() / ".babel" / "packages.json") @@ -134,9 +145,18 @@ proc installFromDir(dir: string) = if babelFile == "": quit("Specified directory does not contain a .babel file.", QuitFailure) var pkgInfo = readPackageInfo(babelFile) + + if not existsDir(dir / pkgInfo.name): + quit("Package modules should be placed in a " & pkgInfo.name & dirSep & + " directory.", QuitFailure) + if not existsDir(getLibsDir() / pkgInfo.name): createDir(getLibsDir() / pkgInfo.name) - else: echo("Warning: Package already exists.") + else: + if not prompt("Package already exists. Overwrite?"): + quit(QuitSuccess) + removeDir(getLibsDir() / pkgInfo.name) + createDir(getLibsDir() / pkgInfo.name) # Find main project file. let nimFile = dir / pkgInfo.name.addFileExt("nim") @@ -149,9 +169,11 @@ proc installFromDir(dir: string) = copyFileD(nimrodFile, changeRoot(dir, getLibsDir(), nimrodFile)) pkgInfo.skipFiles.add(changeRoot(dir, "", nimrodFile)) else: - quit("Could not find main package file.", QuitFailure) + # TODO: Make this an error? Which can be overriden in .babel file? + echo("Warning: Could not find main package file.") - copyFilesRec(dir, dir, pkgInfo) + copyFilesRec(dir / pkgInfo.name, dir / pkgInfo.name, pkgInfo) + echo(pkgInfo.name & " installed successfully.") proc install(packages: seq[String]) = if packages == @[]: diff --git a/readme.markdown b/readme.markdown index 32a4b40..216c3f6 100644 --- a/readme.markdown +++ b/readme.markdown @@ -3,14 +3,43 @@ Babel is a work in progress package manager for Nimrod. ## Babel's folder structure Babel stores everything that has been installed in ~/.babel on Unix systems and -in your $home/babel on Windows. Libraries are stored in ~/.babel/libs. +in your $home/babel on Windows. Libraries are stored in $babelDir/libs. ## Libraries -Libraries should contain a ``ProjectName.nim`` file, this file will be copied +Libraries may contain a ``ProjectName.nim`` file, this file will be copied to ~/.babel/libs/ProjectName.nim allowing anyone to import it by doing -``import ProjectName``. Any private files should be placed, by convention, in -a ``private`` folder, these are files which the user of your library should not -be using. Every other file and folder will be copied to ~/.babel/libs/ProjectName/. +``import ProjectName``, it is recommended to include such a file, however +it's not a requirement. + +All public modules should be placed in a ``ProjectName/`` folder. The reason for +this is that the main project file can then import the modules that it needs +and the import filename will work before the installation and after. + +Any private modules should be placed, by convention, in +a ``private`` folder inside the ``ProjectName/`` folder, these are modules which +the user of your library should not be importing. All files and folders in +``ProjectName/`` will be copied as-is, you can however specify to skip some +directories or files in your .babel file. + +## Example .babel file + +```ini +; Example babel file +[Package] +name = "ProjectName" +version = "0.1.0" +author = "Dominik Picheta" +description = """Example .babel file.""" + +[Library] +SkipDirs = "SomeDir" ; ./ProjectName/SomeDir will be skipped. +SkipFiles = "file.txt,file2.txt" ; ./ProjectName/{file.txt, file2.txt} will be skipped. +``` + +## Submitting your package to the package list. +Babel's packages list is stored on github and everyone is encouraged to add +their own packages to it! Take a look at +[nimrod-code/packages](https://github.com/nimrod-code/packages) to learn more. ## Contribution If you would like to help, feel free to fork and make any additions you see