# geddy **Repository Path**: mirrors_leecade/geddy ## Basic Information - **Project Name**: geddy - **Description**: Web framework for Node.js - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-09 - **Last Updated**: 2026-02-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Geddy web framework for Node.js - - - ### Goals * Easy to use * Modular * Fast Geddy should make things easy for the most basic applications, but still let you get under the hood and tinker if you want. ### Features * Powerful, flexible router * Easy resource-based routing * App and resource generators * Content-negotiation * Session support (in-memory, cookie) * Templating (EJS), partials support * Fully non-blocking ### License Apache License, Version 2 ### Prerequisites Geddy requires version 0.4.x of Node.js or higher, and the [Jake](https://github.com/mde/jake) JavaScript build-tool. ### Installing To get Geddy from GitHub and install it: git clone git://github.com/mde/geddy.git cd geddy make && sudo make install By default Geddy is installed in "/usr/local." To install it into a different directory (e.g., one that doesn't require super-user privilege), pass the PREFIX variable to the `make install` command. For example, to install it into a "geddy" directory in your home directory, you could use this: make && make install PREFIX=~/geddy If you do install Geddy somewhere special, you'll need to add the "bin" directory in the install target to your PATH to get access to the `geddy` executable. ### Installing with [NPM](http://npmjs.org/) npm install -g geddy Note that Geddy (specifically, the generators) is a system-level tool, and wants to be installed globally. ### Routes Routes are similar to Merb or Rails routes. **Basic routes** router.match('/moving/pictures/:id').to( {controller: 'Moving', action: 'pictures'}); router.match('/farewells/:farewelltype/kings/:kingid').to( {controller: 'Farewells', action: 'kings'}); //Can also match specific HTTP methods only router.match('/xandadu', 'get').to( {controller: 'Xandadu', action: 'specialHandler'}); **Resource-based routes** router.resource('hemispheres'); ### Creating a Geddy app You can use Geddy to create an app. Run `geddy app [app-name]` to create an app. Then Run `geddy` inside the app-directory to start the server. mde@localhost:~/work$ geddy app bytor Created app bytor. mde@localhost:~/work$ cd bytor mde@localhost:~/work/bytor$ geddy Server running at http://127.0.0.1:4000/ Go to http://localhost:4000/, and you should see: Attention all planets of the Solar Federation ### Adding resources Use `geddy resource` in your app directory to add a resource. The route will be set up automatically for you. mde@localhost:~/work/bytor$ geddy resource snow_dog [ADDED] app/models/snow_dog.js [ADDED] app/controllers/snow_dogs.js Resource snow_dogs route added to config/router.js Created view templates. Restart Geddy, and you'll see the new route working. Hit your new route -- for example, http://localhost:4000/snow_dogs.json, and you should see something like this: {"method":"index","params":{"extension":"json"}} The geddy generator utility also handles fancy pluralization between model and controller. Specify your resource-name as a singular naun, and the generator will do the right thing -- changing 'person' to 'people,' etc. ### App layout After adding a resource, a Geddy app is laid out like this: mde@localhost:~/work/bytor$ find . . ./config ./config/config.js ./config/router.js ./app ./app/models ./app/models/snow_dog.js ./app/controllers ./app/controllers/snow_dogs.js ./app/controllers/main.js ./app/controllers/application.js ./app/views ./app/views/snow_dogs ./app/views/snow_dogs/edit.html.ejs ./app/views/snow_dogs/show.html.ejs ./app/views/snow_dogs/index.html.ejs ./app/views/snow_dogs/add.html.ejs ./public ### Resources and controllers Geddy's resource-based routes create url/request-method mappings for easy CRUD operations like this: GET */snow_dogs[.extension]
(SnowDogs controller, index action) GET */snow_dogs/add[.extension]
(SnowDogs controller, add action, for any new-resource template -- "new" is not usable as a JavaScript action name) POST */snow_dogs[.extension]
(SnowDogs controller, create action) GET */snow_dogs/:id[.extension]
(SnowDogs controller, show action) GET */snow_dogs/:id/edit[.extension]
(SnowDogs controller, edit action) PUT */snow_dogs/:id[.extension]
(SnowDogs controller, update action) DELETE */snow_dogs/:id[.extension]
(SnowDogs controller, remove action) A simple controller that just responds with any form-post/query-string params looks like this: var SnowDogs = function () { this.respondsWith = ['text', 'json', 'html']; this.index = function (params) { this.respond({params: params}); }; this.add = function (params) { this.respond({params: params}); }; this.create = function (params) { this.respond({params: params}); }; this.show = function (params) { this.respond({params: params}); }; this.update = function (params) { this.respond({params: params}); }; this.remove = function (params) { this.respond({params: params}); }; }; exports.SnowDogs = SnowDogs; ## Content-negotiation Geddy can perform content-negotiation, and respond with with the correct format based on the requested filename-extension. If you have a JSON-serializable JavaScript object you want to return in JSON format, pass your JavaScript object to the `respond` method in the action on that controller. this.respondsWith = ['text', 'json']; this.show = function (params) { // (Fetch some item by params.id) item = {foo: 'FOO', bar: 1, baz: false}; this.respond(item); }; ## Models and validations Geddy has a simple way of defining models, with a full-featured set of data validations. The syntax is very similar to models in Ruby's ActiveRecord or DataMapper. Here is an example of a model with some validations: var User = function () { this.property('login', 'string', {required: true}); this.property('password', 'string', {required: true}); this.property('lastName', 'string'); this.property('firstName', 'string'); this.validatesPresent('login'); this.validatesFormat('login', /[a-z]+/, {message: 'Subdivisions!'}); this.validatesLength('login', {min: 3}); this.validatesConfirmed('password', 'confirmPassword'); this.validatesWithFunction('password', function (s) { // Something that returns true or false return s.length > 0; }); // Can define methods for instances like this this.someMethod = function () { // Do some stuff }; }; // Can also define them on the prototype User.prototype.someOtherMethod = function () { // Do some other stuff }; User = geddy.model.registerModel('User', User); Alternatively, you can use the `defineProperties` method to lay out your model: var User = function () { this.defineProperties({ login: {type: 'string', required: true} , password: {type: 'string', required: true} , lastName: {type: 'string'} , firstName: {type: 'string'} }); } Creating an instance of one of these models is easy: var params = { login: 'alex' , password: 'lerxst' , lastName: 'Lifeson' , firstName: 'Alex' }; var user = User.create(params); Data-validation happens on the call to `create`, and any validation errors show up inside an `errors` property on the instance, keyed by field name. Instances have a `valid` method that returns a Boolean indicating whether the instance is valid. // Leaving out the required password field var params = { login: 'alex' }; var user = User.create(params); // Prints 'false' sys.puts(user.valid()); // Prints 'Field "password" is required' sys.puts(user.errors.password); ## Running the tests In the geddy project directory, run `jake test`. The tests simply use NodeJS's `assert` library, which throws an error on failure. If there are no errors, the tests all ran successfully. ## API Docs API docs [can be found here](http://mde.github.com/geddy/doc/). - - - Geddy Web-app development framework copyright 2112 mde@fleegix.org.