Skip to content

Commit

Permalink
Added command-line option for creating new packages. On-demand loadin…
Browse files Browse the repository at this point in the history
…g of package.json.
  • Loading branch information
josip committed Apr 12, 2010
1 parent 75a2af2 commit 812bc87
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 58 deletions.
3 changes: 1 addition & 2 deletions README.textile
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ are used as a tool for switching between different versions.

h2. How to install

<pre><code>
$ git clone git://github.com/josip/eerie.git
<pre><code>$ git clone git://github.com/josip/eerie.git
$ cd eerie
$ io setup.io
# Close current terminal session and start a new one or reload your profile
Expand Down
46 changes: 39 additions & 7 deletions bin/eerie
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Namespaces Pkg := Namespace clone do(
pkg install
"Package #{pkg name} has been installed." interpolate println

readme := pkg config at("meta") ?at("readme")
readme := pkg info at("readme")
readmeFile := File with(pkg path .. "/" .. readme)
readmeFile exists ifTrue(
"Opening readme file..." println
Expand Down Expand Up @@ -88,9 +88,8 @@ Namespaces Pkg := Namespace clone do(
pkg := Eerie activeEnv packageNamed(name)
pkg isNil ifTrue(
Exception raise("No such package exists."))

meta := pkg config at("meta")
maxKeySize := meta keys map(size) max + 2

maxKeySize := pkg info keys map(size) max + 2

meta foreach(key, value,
value isKindOf(List) ifTrue(value = value join(", "))
Expand All @@ -101,9 +100,42 @@ Namespaces Pkg := Namespace clone do(
list := task(
"""Lists all packages installed within current env."""
Eerie activeEnv packages foreach(pkg,
meta := pkg config at("meta")
(pkg name .. " @" .. meta at("version")) println
(" " .. meta at("description")) println))
(pkg name .. " @" .. (pkg info at("version"))) println
(" " .. (pkg info at("description"))) println))

create := task(name, path,
"""Creates an empty package structure.
If <path> is omitted, new directory will be created in current working directory."""
name = name asMutable makeFirstCharacterUppercase
path isNil ifTrue(
path = Directory currentWorkingDirectory .. "/" .. name)

root := Directory with(path)
root exists ifTrue(
Exception raise("Destination directory already exists (#{path})" interpolate))

root create
Eerie PackageDownloader clone setPath(path) createSkeleton

pkgInfo := """|
|{
| "version": "0.1",
| "description": "My cool new project.",
| "author": "#{User name}",
| "protos": ["#{name}"],
| "dependencies": {
| "libs": [],
| "headers": [],
| "protos": [],
| "packages": []
| }
|}""" splitNoEmpties("\n") map(split("|") last) join("\n") strip interpolate

root fileNamed("package.json") create openForUpdating write(pkgInfo) close
root fileNamed("README") create openForUpdating write("=== " .. name .. " ===\nDon't forget to update this doc.\n") close
root directoryNamed("io") fileNamed(name .. ".io") create openForUpdating write(name .. " := Object clone do(\n\n)\n") close

"New package structure has been created in #{root path}." interpolate println)
)

Namespaces Default do(
Expand Down
11 changes: 11 additions & 0 deletions io/Eerie.io
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ Eerie := Object clone do(
"info", " - ",
"error", " ! ",
"console", " > ",
"debug", " # ",
"output", "")
//doc Eerie log(message, mode) Displays the message to the user, mode can be "info", "error", "console" or "output".
log := method(str, mode,
Expand Down Expand Up @@ -86,6 +87,16 @@ Eerie := Object clone do(
self setConfig(Yajl parseJson(self configBackup)))
)

# Fixing Yajl's not-printing of errors
Yajl do(
_parseJson := getSlot("parseJson")
parseJson = method(json,
result := Yajl _parseJson(json)
if(result type == "Error",
Exception raise("Yajl: " .. result message),
result))
)

Eerie clone = Eerie do(
//doc Eerie Package [[Pacakge]]
doRelativeFile("Eerie/Package.io")
Expand Down
2 changes: 1 addition & 1 deletion io/Eerie/Env.io
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ Env := Object clone do(
(pkgConfig type == "Map") ifFalse(
pkgConfig = Yajl parseJson(pkgConfig))

Eerie Package withConfig(pkgConfig)))
Eerie Package withConfig(pkgConfig, self)))

//doc Env packageNamed(name) Returns package with provided name if it exists, <code>nil</code> otherwise.
packageNamed := method(pkgName,
Expand Down
60 changes: 36 additions & 24 deletions io/Eerie/Package.io
Original file line number Diff line number Diff line change
Expand Up @@ -33,27 +33,36 @@ Package := Object clone do(
installer ::= nil
//doc Package downloader Instance of [[PackageDownloader]] for this package.
downloader ::= nil

//doc Package info Contains all the data provided in package.json
info ::= method(
self loadInfo)

//doc Package env Environment in which package is installed.
env ::= nil

init := method(
self config = Map with(
"name", nil,
"uri", nil,
"path", nil,
"meta", Map clone))
"path", nil))

//doc Package with(name, uri) Creates new package with provided name and URI.
with := method(name_, uri_,
//doc Package with(name, uri[, env]) Creates new package with provided name and URI.
with := method(name_, uri_, env_,
(uri_ exSlice(-1) == "/") ifTrue(
uri_ = uri_ exSlice(0, -1))

env_ = if(env_ isNil, Eerie usedEnv, env_)
self clone setConfig(Map with(
"name", name_,
"uri", uri_,
"path", (Eerie usedEnv path) .. "/addons/" .. name_)))
"path", (env_ path) .. "/addons/" .. name_)) setEnv(env_))

//doc Package withConfig(config[, env]) Creates new package from provided config Map.
withConfig := method(config, env_,
env_ = if(env_ isNil, Eerie usedEnv, env_)
klone := self clone setConfig(config) setEnv(env_)

//doc Package withConfig(config) Creates new package from provided config Map.
withConfig := method(config,
klone := self clone setConfig(config)
klone config at("installer") isNil ifFalse(
klone installer = Eerie PackageInstaller instances getSlot(klone config at("installer"))
klone installer = klone installer with(klone config at("path")))
Expand All @@ -63,9 +72,9 @@ Package := Object clone do(

klone)

//doc Package fromUri(uri) Creates new package from provided uri. Name is determined with [[Package guessName]].
fromUri := method(uri_,
self with(self guessName(uri_), uri_))
//doc Package fromUri(uri[, env]) Creates new package from provided uri. Name is determined with [[Package guessName]].
fromUri := method(uri_, env_,
self with(self guessName(uri_), uri_, env_))

//doc Package guessName(uri) Guesses name from provide URI. Usually it is just file's basename.
guessName := method(uri_,
Expand Down Expand Up @@ -106,13 +115,13 @@ Package := Object clone do(

self setInstaller(Eerie PackageInstaller detect(self path))
self installer loadConfig
self loadMetadata
self loadInfo

self installDependencies
self installer install

self loadMetadata
Eerie usedEnv appendPackage(self)
self loadInfo
self env appendPackage(self)

self runHook("after" .. event)
self)
Expand All @@ -136,11 +145,11 @@ Package := Object clone do(
self runHook("beforeRemove")

Directory with(self path .. "/bin") files foreach(f,
File with("#{Eerie usedEnv path}/bin/#{f name}" interpolate) remove)
File with("#{self env path}/bin/#{f name}" interpolate) remove)

#Directory with(self path) remove
Eerie sh("rm -rf #{self path}" interpolate)
Eerie usedEnv removePackage(self)
self env removePackage(self)

true)

Expand All @@ -152,21 +161,24 @@ Package := Object clone do(
try(Thread createThread(f contents))
f close))

//doc Package loadMetadata Loads package.json file.
loadMetadata := method(
meta := File with((self path) .. "/package.json")
meta exists ifTrue(
self config atPut("meta", Yajl parseJson(meta openForReading contents))
meta close))
//doc Package loadInfo Loads package.json file.
loadInfo := method(
pkgInfo := File with((self path) .. "/package.json")
self info = if(pkgInfo exists,
Yajl parseJson(pkgInfo openForReading contents),
Map clone)

pkgInfo close
self info)

//doc Package providesProtos Returns list of protos this package provides.
providesProtos := method(
p := self config at("meta") ?at("protos")
p := self info at("protos")
if(p isNil, list(), p))

//doc Package dependencies([category]) Returns list of dependencies this package has. <code>category</code> can be <code>protos</code>, <code>packages</code>, <code>headers</code> or <code>libs</code>.
dependencies := method(category,
d := self config at("meta") ?at("dependencies")
d := self info at("dependencies")
if(category and d and d isEmpty not, d = d at(category))
if(d isNil, list(), d))

Expand Down
3 changes: 2 additions & 1 deletion io/Eerie/PackageDownloader.io
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ PackageDownloader := Object clone do(
createSkeleton := method(
self root createSubdirectory("io")
self root createSubdirectory("bin")
self root createSubdirectory("hooks"))
self root createSubdirectory("hooks")
self root createSubdirectory("source"))
)

//doc PackageDownloader instances Contains all PackageDownloader clones
Expand Down
15 changes: 8 additions & 7 deletions io/Eerie/PackageInstaller.io
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ PackageInstaller := Object clone do(
self setConfig(Yajl parseJson(configFile openForReading contents))
configFile close))

//doc PackageInstaller extractDataFromPackageJson
/*doc PackageInstaller extractDataFromPackageJson
Creates <code>protos</code>, <code>deps</code> and <code>build.io</code> files from <code>package.json</code>*/
extractDataFromPackageJson := method(
providedProtos := self config at("protos") ?join(" ")
providedProtos isNil ifTrue(
Expand All @@ -72,14 +73,14 @@ PackageInstaller := Object clone do(
headerDeps := deps ?at("headers")
libDeps := deps ?at("libs")

buildIo := "AddonBuilder clone do(\n" asMutable
buildIo := list("AddonBuilder clone do(")
libDeps ?foreach(lib,
buildIo appendSeq(" dependsOnLib(\"#{lib}\")\n"))
buildIo append(""" dependsOnLib("#{lib}")"""))
headerDeps ?foreach(header,
buildIo appendSeq(" dependsOnHeader(\"#{header}\")\n"))
buildIo appendSeq(")\n")
buildIo append(""" dependsOnHeader("#{header}")"""))
buildIo append(")\n")

self fileNamed("build.io") create openForUpdating write(buildIo interpolate) close))
self fileNamed("build.io") remove create openForUpdating write(buildIo join("\n") interpolate) close))

//doc PackageInstaller buildPackageJson
buildPackageJson := method(
Expand All @@ -98,7 +99,7 @@ PackageInstaller := Object clone do(
protoDeps openForReading contents split(" ") foreach(pd, package at("dependencies") append(pd strip)))
protoDeps close

self fileNamed("package.json") create openForUpdating write(package asJson) close
self fileNamed("package.json") remove create openForUpdating write(package asJson) close

self)

Expand Down
21 changes: 13 additions & 8 deletions io/Eerie/PackageInstaller/Directory.io
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,18 @@ DirectoryInstaller := Eerie PackageInstaller clone do(
Eerie sh("mv #{self path}/*.io #{ioDir path}" interpolate))

buildPackageJson := method(
self fileNamed("package.json") remove create openForUpdating write(Map with(
"author", User name,
"dependencies", list(),
"protos", self protosList
) asJson) close)

pkgInfo := self fileNamed("package.json")
pkgInfo exists ifFalse(
pkgInfo create openForUpdating write(Map with(
"author", User name,
"dependencies", list(),
"protos", self protosList
) asJson) close))

extractDataFromPackageJson := method(
self fileNamed("depends") remove create openForUpdating write("\n") close
self fileNamed("protos") remove create openForUpdating write(self protosList join(" ") .. "\n") close)
deps := self fileNamed("depends")
deps exists ifFalse(deps create openForUpdating write("\n") close)

pprotos := self fileNamed("protos")
pprotos exists ifFalse(deps create openForUpdating write(self protosList join(" ") .. "\n") close))
)
12 changes: 4 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
{
"version": 0.2,
"author": "Josip Lisec",
"description": "Package manager for Io.",
"author": "Josip Lisec",
"readme": "README.textile",
"category": "Utility",

"protos": ["Eerie"],
"dependencies": {
"headers": [],
"protos": [],
"packages": ["git://github.com/josip/kano.git"]
},
"protos": ["Eerie"]
}
}
}
2 changes: 2 additions & 0 deletions setup.io
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ AddonLoader appendSearchPath(System getEnvironmentVariable("EERIEDIR") .. "/acti
baseEnv := Eerie Env with("_base") create activate use
Eerie sh("ln -s #{baseEnv path} #{eeriePath}/base" interpolate)

Eerie Env with("_plugins") create

# This allows Eerie to perform self-update.
Eerie Package fromUri("git://github.com/josip/eerie.git") install
#Eerie Package fromUri(Directory currentWorkingDirectory) install
Expand Down

0 comments on commit 812bc87

Please sign in to comment.