Initial check-in.
This commit is contained in:
commit
dc8a82b42d
|
@ -0,0 +1,5 @@
|
|||
*#
|
||||
.#*
|
||||
*~
|
||||
npm-debug.log
|
||||
node_modules/*
|
|
@ -0,0 +1 @@
|
|||
/node_modules/
|
|
@ -0,0 +1,22 @@
|
|||
Copyright (c) 2012 Ken Elf Mathieu Sternberg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,80 @@
|
|||
# grunt-couchapp
|
||||
|
||||
A grunt plugin for building and installing couchapps
|
||||
|
||||
## Getting Started Install this grunt plugin next to your project's
|
||||
[grunt.js gruntfile][getting_started] with: `npm install
|
||||
grunt-couchapp`
|
||||
|
||||
Then add this line to your project's `grunt.js` gruntfile:
|
||||
|
||||
```javascript
|
||||
grunt.loadNpmTasks('grunt-couchapp');
|
||||
```
|
||||
|
||||
[grunt]: https://github.com/cowboy/grunt
|
||||
[getting_started]: https://github.com/cowboy/grunt/blob/master/docs/getting_started.md
|
||||
|
||||
## Documentation
|
||||
|
||||
You'll want to add some configuration for the plug-in. This plugin
|
||||
provides three tasks, *mkcouchdb* to create new databases, *rmcouchdb*
|
||||
to delete all data and drop an existing database, and *couchapp*,
|
||||
which installs a specified couchapp into the database.
|
||||
|
||||
mkcouchdb: {
|
||||
demo: {
|
||||
db: 'http://localhost:5984/grunt-couchapp-demo'
|
||||
}
|
||||
},
|
||||
|
||||
rmcouchdb: {
|
||||
demo: {
|
||||
db: 'http://localhost:5984/grunt-couchapp-demo',
|
||||
options: {
|
||||
okay_if_missing: true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
couchapp: {
|
||||
demo: {
|
||||
db: 'http://localhost:5984/grunt-couchapp-demo',
|
||||
app: './demo/app.js'
|
||||
}
|
||||
}
|
||||
|
||||
As a stylistic note, all of the commands take the same info, so it's
|
||||
possible to write in your configuration file:
|
||||
|
||||
couch_config = {
|
||||
demo: {
|
||||
db: 'http://localhost:5984/grunt-couchapp-demo',
|
||||
app: './demo/app.js',
|
||||
options: {
|
||||
okay_if_missing: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grunt.initConfig({
|
||||
...
|
||||
mkcouchdb: couch_config,
|
||||
rmcouchdb: couch_config,
|
||||
couchapp: couch_config,
|
||||
...
|
||||
});
|
||||
|
||||
|
||||
Note, however, that if you call 'rmcouchdb' without a sub-argument, in
|
||||
keeping with grunt's standards, it will drop *all* of your databases!
|
||||
|
||||
## Contributing
|
||||
|
||||
In lieu of a formal styleguide, take care to maintain the existing
|
||||
coding style. Add unit tests for any new or changed
|
||||
functionality. Lint and test your code using [grunt][grunt].
|
||||
|
||||
## License
|
||||
Copyright (c) 2012 Ken Elf Mathieu Sternberg
|
||||
Licensed under the MIT license.
|
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/env node
|
||||
require('grunt').npmTasks('grunt-couchapp').cli();
|
|
@ -0,0 +1,22 @@
|
|||
var couchapp, ddoc, path;
|
||||
|
||||
couchapp = require('couchapp');
|
||||
|
||||
path = require('path');
|
||||
|
||||
ddoc = {
|
||||
_id: '_design/app',
|
||||
rewrites: {},
|
||||
views: {},
|
||||
shows: {},
|
||||
lists: {},
|
||||
validate_doc_update: function(newDoc, oldDoc, userCtx) {
|
||||
if (newDoc._deleted === true && userCtx.roles.indexOf('_admin') === -1) {
|
||||
throw "Only admin can delete documents on this database.";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
couchapp.loadAttachments(ddoc, path.join(__dirname, 'attachments'));
|
||||
|
||||
module.exports = ddoc;
|
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
||||
<meta content="" name="keywords" />
|
||||
<meta content="" name="description" />
|
||||
<script language="javascript" src="js/client.js" type="text/javascript"></script>
|
||||
<title>Demo</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Demonstration</h1>
|
||||
<p id="working">Congratulations! You have installed
|
||||
grunt-couchapp correctly.</p>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,61 @@
|
|||
var DEMO_COUCH_DB = 'http://localhost:5984/grunt-couchapp-demo';
|
||||
|
||||
module.exports = function(grunt) {
|
||||
// Project configuration.
|
||||
|
||||
grunt.initConfig({
|
||||
|
||||
test: {
|
||||
files: ['test/**/*.js']
|
||||
},
|
||||
lint: {
|
||||
files: ['grunt.js', 'tasks/**/*.js', 'test/**/*.js']
|
||||
},
|
||||
watch: {
|
||||
files: '<config:lint.files>',
|
||||
tasks: 'default'
|
||||
},
|
||||
jshint: {
|
||||
options: {
|
||||
curly: true,
|
||||
eqeqeq: true,
|
||||
immed: true,
|
||||
latedef: true,
|
||||
newcap: true,
|
||||
noarg: true,
|
||||
sub: true,
|
||||
undef: true,
|
||||
boss: true,
|
||||
eqnull: true,
|
||||
node: true,
|
||||
es5: true
|
||||
},
|
||||
globals: {}
|
||||
},
|
||||
mkcouchdb: {
|
||||
demo: {
|
||||
db: DEMO_COUCH_DB
|
||||
}
|
||||
},
|
||||
rmcouchdb: {
|
||||
demo: {
|
||||
db: DEMO_COUCH_DB,
|
||||
options: {
|
||||
okay_if_missing: true
|
||||
}
|
||||
}
|
||||
},
|
||||
couchapp: {
|
||||
demo: {
|
||||
db: DEMO_COUCH_DB,
|
||||
app: './demo/app.js'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Load local tasks.
|
||||
grunt.loadTasks('tasks');
|
||||
|
||||
// Default task.
|
||||
grunt.registerTask('default', 'lint test');
|
||||
};
|
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"name": "grunt-couchapp",
|
||||
"description": "A grunt plugin for building and uploading couchapps",
|
||||
"version": "0.1.0",
|
||||
"homepage": "https://github.com/elf/grunt-couchapp",
|
||||
"author": {
|
||||
"name": "Ken Elf Mathieu Sternberg",
|
||||
"email": "elf.sternberg@gmail.com",
|
||||
"url": "http://elfsternberg.com"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/elf/grunt-couchapp.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/elf/grunt-couchapp/issues"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "https://github.com/elf/grunt-couchapp/blob/master/LICENSE-MIT"
|
||||
}
|
||||
],
|
||||
"main": "grunt.js",
|
||||
"bin": "bin/grunt-couchapp",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "grunt test"
|
||||
},
|
||||
"dependencies": {
|
||||
"couchapp": "0.9.1",
|
||||
"grunt": "~0.3.12",
|
||||
"nano": "3.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"grunt": "~0.3.12"
|
||||
},
|
||||
"keywords": [
|
||||
"gruntplugin"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* grunt-couchapp https://github.com/elf/grunt-couchapp
|
||||
*
|
||||
* Copyright (c) 2012 Ken "Elf" Mathieu Sternberg
|
||||
* Licensed under the MIT license.
|
||||
*/
|
||||
|
||||
var path, couchapp, nanolib, urls;
|
||||
|
||||
path = require('path');
|
||||
couchapp = require('couchapp');
|
||||
urls = require('url');
|
||||
|
||||
module.exports = function(grunt) {
|
||||
|
||||
// ==========================================================================
|
||||
// TASKS
|
||||
// ==========================================================================
|
||||
|
||||
grunt.registerMultiTask("couchapp", "Install Couchapp", function() {
|
||||
var appobj, done;
|
||||
done = this.async();
|
||||
appobj = require(path.join(process.cwd(), path.normalize(this.data.app)));
|
||||
return couchapp.createApp(appobj, this.data.db, function(app) {
|
||||
return app.push(done);
|
||||
});
|
||||
});
|
||||
|
||||
grunt.registerMultiTask("rmcouchdb", "Delete a Couch Database", function() {
|
||||
var done, parts, nano, dbname, _this;
|
||||
_this = this;
|
||||
done = this.async();
|
||||
parts = urls.parse(this.data.db);
|
||||
dbname = parts.pathname.replace(/^\//, '');
|
||||
try {
|
||||
nano = require('nano')(parts.protocol + '//' + parts.host);
|
||||
nano.db.destroy(dbname, function(err) {
|
||||
if (err) {
|
||||
if (err.status_code && err.status_code === 404) {
|
||||
if (_this.data.options && _this.data.options.okay_if_missing) {
|
||||
grunt.log.writeln("Database " + dbname + " not present... skipping.");
|
||||
return done(null, null) ;
|
||||
} else {
|
||||
grunt.warn("Database " + dbname + " does not exist.");
|
||||
}
|
||||
} else {
|
||||
grunt.warn(err);
|
||||
}
|
||||
}
|
||||
return done(err, null);
|
||||
});
|
||||
} catch (e) {
|
||||
grunt.warn(e);
|
||||
done(e, null);
|
||||
}
|
||||
});
|
||||
|
||||
grunt.registerMultiTask("mkcouchdb", "Delete a Couch Database", function() {
|
||||
var done, parts, nano, dbname;
|
||||
|
||||
done = this.async();
|
||||
parts = urls.parse(this.data.db);
|
||||
dbname = parts.pathname.replace(/^\//, '');
|
||||
try {
|
||||
nano = require('nano')(parts.protocol + '//' + parts.host);
|
||||
nano.db.create(dbname, function(err) {
|
||||
if (err) {
|
||||
grunt.warn(err);
|
||||
}
|
||||
return done(err, null);
|
||||
});
|
||||
} catch (e) {
|
||||
grunt.warn(e);
|
||||
done(e, null);
|
||||
}
|
||||
});
|
||||
|
||||
};
|
|
@ -0,0 +1,27 @@
|
|||
var grunt = require('grunt');
|
||||
|
||||
/*
|
||||
======== A Handy Little Nodeunit Reference ========
|
||||
https://github.com/caolan/nodeunit
|
||||
|
||||
Test methods:
|
||||
test.expect(numAssertions)
|
||||
test.done()
|
||||
Test assertions:
|
||||
test.ok(value, [message])
|
||||
test.equal(actual, expected, [message])
|
||||
test.notEqual(actual, expected, [message])
|
||||
test.deepEqual(actual, expected, [message])
|
||||
test.notDeepEqual(actual, expected, [message])
|
||||
test.strictEqual(actual, expected, [message])
|
||||
test.notStrictEqual(actual, expected, [message])
|
||||
test.throws(block, [error], [message])
|
||||
test.doesNotThrow(block, [error], [message])
|
||||
test.ifError(value)
|
||||
*/
|
||||
|
||||
exports.couchapp = {
|
||||
setUp: function(done) {
|
||||
done();
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue