Comparing version 0.0.5 to 0.1.0
28
index.js
@@ -1,2 +0,26 @@ | ||
require('./dagre.js'); | ||
module.exports = dagre; | ||
/* | ||
Copyright (c) 2012-2013 Chris Pettitt | ||
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. | ||
*/ | ||
exports.dot = require("./lib/dot"); | ||
exports.Graph = require("./lib/Graph"); | ||
exports.layout = require("./lib/layout/layout"); | ||
exports.util = require("./lib/util"); | ||
exports.version = require("./lib/version"); |
{ | ||
"name": "dagre", | ||
"version": "0.0.5", | ||
"version": "0.1.0", | ||
"description": "Directed graph rendering", | ||
@@ -17,5 +17,7 @@ "main": "index.js", | ||
"devDependencies": { | ||
"browserify": "2.28.x", | ||
"chai": "1.7.x", | ||
"mocha": "1.12.x", | ||
"pegjs": "0.7.x", | ||
"mocha": "1.5.x", | ||
"chai": "1.3.x" | ||
"uglify-js": "1.2.3" | ||
}, | ||
@@ -27,3 +29,22 @@ "author": "Chris Pettitt <chris@samsarin.com>", | ||
}, | ||
"license": "MIT" | ||
"license": "MIT", | ||
"testling": { | ||
"files": [ | ||
"test/**/*.js" | ||
], | ||
"browsers": [ | ||
"ie/8..latest", | ||
"firefox/17..latest", | ||
"firefox/nightly", | ||
"chrome/22..latest", | ||
"chrome/canary", | ||
"opera/12..latest", | ||
"opera/next", | ||
"safari/5.1..latest", | ||
"ipad/6.0..latest", | ||
"iphone/6.0..latest", | ||
"android-browser/4.2..latest" | ||
], | ||
"harness": "mocha" | ||
} | ||
} |
# dagre - Directed graph rendering | ||
[![Build Status](https://secure.travis-ci.org/cpettitt/dagre.png)](http://travis-ci.org/cpettitt/dagre) | ||
[![browser support](https://ci.testling.com/cpettitt/dagre.png)](https://ci.testling.com/cpettitt/dagre) | ||
Dagre is a JavaScript library that makes it easy to lay out directed graphs on | ||
@@ -23,3 +27,3 @@ the client-side. | ||
Try our [interactive demo](http://cpettitt.github.com/project/dagre/latest/demo.html)! | ||
Try our [interactive demo](http://cpettitt.github.com/project/dagre/latest/demo/demo.html)! | ||
@@ -32,4 +36,2 @@ If you've checked out the project, you can build the Dagre library and then try | ||
[![Build Status](https://secure.travis-ci.org/cpettitt/dagre.png)](http://travis-ci.org/cpettitt/dagre) | ||
Before building this library you need to install the [npm package manager]. | ||
@@ -45,2 +47,26 @@ | ||
## Contact | ||
We've been manging bugs and enhancement request through our [issue | ||
tracker](https://github.com/cpettitt/dagre/issues). | ||
We also have a [google group](https://groups.google.com/group/dagre) for | ||
questions and discussion. | ||
## Third Party Examples | ||
Dagre has been included as a part of some very cool projects. Here are just a | ||
couple that stand out: | ||
[JointJS](http://www.daviddurman.com/automatic-graph-layout-with-jointjs-and-dagre.html) | ||
has a plugin that uses dagre for layout. JointJS focuses on rendering and | ||
interaction with diagrams, which synergizes well with Dagre. If you want the | ||
ability to move nodes and manipulate edges interactively, this is a good place | ||
to start! | ||
Jonathan Mace has a | ||
[demo](http://cs.brown.edu/people/jcmace/d3/graph.html?id=small.json) that | ||
makes it possible to interactively explore graphs. In his demo, you can | ||
highlight paths, collapse subgraphs, via detailed node information, and more! | ||
## References | ||
@@ -47,0 +73,0 @@ |
@@ -1,1 +0,3 @@ | ||
dagre.version = "0.0.5"; | ||
var fs = require("fs"); | ||
var package = JSON.parse(fs.readFileSync(__dirname + "/../package.json", "utf8")); | ||
console.log("module.exports = '" + package.version + "';"); |
@@ -1,5 +0,2 @@ | ||
chai = require("chai"), | ||
assert = chai.assert, | ||
dagre = require("../index"); | ||
var chai = require("chai"); | ||
chai.Assertion.includeStack = true; |
@@ -1,6 +0,9 @@ | ||
require("../common"); | ||
var common = require("../common"), | ||
assert = require("chai").assert, | ||
Graph = require("../../lib/Graph"), | ||
layout = require("../../lib/layout/layout"); | ||
describe("dagre.layout", function() { | ||
describe("layout", function() { | ||
it("preserves edge ids for graphs with edges spanning multiple ranks", function() { | ||
var g = dagre.graph(); | ||
var g = new Graph(); | ||
g.addNode(1); | ||
@@ -12,5 +15,20 @@ g.addNode(2); | ||
g.addEdge("1->3", 1, 3); | ||
dagre.layout.apply(g); | ||
layout.apply(g); | ||
assert.include(g.edges(), "1->3"); | ||
}); | ||
it("preforms simple layout without error", function() { | ||
var nodes = [{width: 10, height: 10}, {width: 10, height: 10}]; | ||
var edges = [{source: nodes[0], target: nodes[1]}]; | ||
layout() | ||
.nodes(nodes) | ||
.edges(edges) | ||
.run(); | ||
// Simple check. nodes[0] should be above nodes[1]. | ||
var n0y = nodes[0].dagre.y; | ||
var n1y = nodes[1].dagre.y; | ||
assert.isTrue(n0y < n1y, "nodes[0] (" + n0y + ") should be above nodes[1] (" + n1y + ")"); | ||
}); | ||
}); |
@@ -1,8 +0,11 @@ | ||
require("../common"); | ||
var common = require("../common"), | ||
assert = require("chai").assert, | ||
dot = require("../../lib/dot"), | ||
order = require("../../lib/layout/order"); | ||
describe("dagre.layout", function() { | ||
describe("order", function() { | ||
it("sets order = 0 for a single node", function() { | ||
var g = dagre.dot.toGraph("digraph { A [rank=0] }"); | ||
var g = dot.toGraph("digraph { A [rank=0] }"); | ||
dagre.layout.order().run(g); | ||
order().run(g); | ||
@@ -13,5 +16,5 @@ assert.equal(g.node("A").order, 0); | ||
it("sets order = 0 for 2 connected nodes on different ranks", function() { | ||
var g = dagre.dot.toGraph("digraph { A [rank=0]; B [rank=1]; A -> B }"); | ||
var g = dot.toGraph("digraph { A [rank=0]; B [rank=1]; A -> B }"); | ||
dagre.layout.order().run(g); | ||
order().run(g); | ||
@@ -23,5 +26,5 @@ assert.equal(g.node("A").order, 0); | ||
it("sets order = 0 for 2 unconnected nodes on different ranks", function() { | ||
var g = dagre.dot.toGraph("digraph { A [rank=0]; B [rank=1]; }"); | ||
var g = dot.toGraph("digraph { A [rank=0]; B [rank=1]; }"); | ||
dagre.layout.order().run(g); | ||
order().run(g); | ||
@@ -33,5 +36,5 @@ assert.equal(g.node("A").order, 0); | ||
it("sets order = 0, 1 for 2 nodes on the same rank", function() { | ||
var g = dagre.dot.toGraph("digraph { A [rank=0]; B [rank=0]; }"); | ||
var g = dot.toGraph("digraph { A [rank=0]; B [rank=0]; }"); | ||
dagre.layout.order().run(g); | ||
order().run(g); | ||
@@ -46,28 +49,52 @@ if (g.node("A").order === 0) { | ||
it("finds minimal crossings", function() { | ||
var str = "digraph { A [rank=0]; B [rank=0]; C [rank=0]; D [rank=1]; E [rank=1]; " + | ||
"A -> D; B -> D; B -> E; C -> D; C -> E }"; | ||
var g = dagre.dot.toGraph(str); | ||
describe("finds minimial crossings", function() { | ||
it("graph1", function() { | ||
var str = "digraph { A [rank=0]; B [rank=0]; C [rank=1]; D [rank=1]; " + | ||
"A -> D; B -> C; }"; | ||
var g = dot.toGraph(str); | ||
var layering = dagre.layout.order().run(g); | ||
var layering = order().run(g); | ||
assert.equal(dagre.layout.order.crossCount(g, layering), 1); | ||
assert.equal(order().crossCount(g, layering), 0); | ||
}); | ||
it("graph2", function() { | ||
var str = "digraph { A [rank=0]; B [rank=0]; C [rank=0]; D [rank=1]; E [rank=1]; " + | ||
"A -> D; B -> D; B -> E; C -> D; C -> E }"; | ||
var g = dot.toGraph(str); | ||
var layering = order().run(g); | ||
assert.equal(order().crossCount(g, layering), 1); | ||
}); | ||
it("graph3", function() { | ||
var str = "digraph { A [rank=0]; B [rank=0]; C [rank=0];" + | ||
"D [rank=1]; E [rank=1]; F [rank=1];" + | ||
"G [rank=2]; H [rank=2]; I [rank=2];" + | ||
"A -> E; B -> D; C -> F; D -> I; E -> H; F -> G }"; | ||
var g = dot.toGraph(str); | ||
var layering = order().run(g); | ||
assert.equal(order().crossCount(g, layering), 0); | ||
}); | ||
}); | ||
}); | ||
describe("dagre.layout.bilayerCrossCount", function() { | ||
describe("order().bilayerCrossCount", function() { | ||
it("calculates 0 crossings for an empty graph", function() { | ||
var g = dagre.dot.toGraph("digraph {}"); | ||
var g = dot.toGraph("digraph {}"); | ||
var layer1 = []; | ||
var layer2 = []; | ||
assert.equal(dagre.layout.order.bilayerCrossCount(g, layer1, layer2), 0); | ||
assert.equal(order().bilayerCrossCount(g, layer1, layer2), 0); | ||
}); | ||
it("calculates 0 crossings for 2 layers with no crossings", function() { | ||
var g = dagre.dot.toGraph("digraph {11 -> 21; 12 -> 22; 13 -> 23}"); | ||
var g = dot.toGraph("digraph {11 -> 21; 12 -> 22; 13 -> 23}"); | ||
var layer1 = [11, 12, 13]; | ||
var layer2 = [21, 22, 23]; | ||
assert.equal(dagre.layout.order.bilayerCrossCount(g, layer1, layer2), 0); | ||
assert.equal(order().bilayerCrossCount(g, layer1, layer2), 0); | ||
}); | ||
@@ -77,7 +104,7 @@ | ||
// Here we have 12 -> 22 crossing 13 -> 21 | ||
var g = dagre.dot.toGraph("digraph {11 -> 21; 12 -> 21; 12 -> 22; 13 -> 21; 13 -> 22}"); | ||
var g = dot.toGraph("digraph {11 -> 21; 12 -> 21; 12 -> 22; 13 -> 21; 13 -> 22}"); | ||
var layer1 = [11, 12, 13]; | ||
var layer2 = [21, 22]; | ||
assert.equal(dagre.layout.order.bilayerCrossCount(g, layer1, layer2), 1); | ||
assert.equal(order().bilayerCrossCount(g, layer1, layer2), 1); | ||
}); | ||
@@ -87,18 +114,8 @@ | ||
// Here we have 11 -> 22 crossing 12 -> 21 and 13 -> 21, and we have 12 -> 22 crossing 13 -> 21 | ||
var g = dagre.dot.toGraph("digraph {11 -> 22; 12 -> 21; 12 -> 22; 13 -> 21; 13 -> 22}"); | ||
var g = dot.toGraph("digraph {11 -> 22; 12 -> 21; 12 -> 22; 13 -> 21; 13 -> 22}"); | ||
var layer1 = [11, 12, 13]; | ||
var layer2 = [21, 22]; | ||
assert.equal(dagre.layout.order.bilayerCrossCount(g, layer1, layer2), 3); | ||
assert.equal(order().bilayerCrossCount(g, layer1, layer2), 3); | ||
}); | ||
it("calculates the correct weight of crossings with edge weights", function() { | ||
var g = dagre.dot.toGraph("digraph {11 -> 22 [weight=2]; 12 -> 21 [weight=3]; }"); | ||
var layer1 = [11, 12]; | ||
var layer2 = [21, 22]; | ||
function edgeWeight(e) { return g.edge(e).weight; } | ||
assert.equal(dagre.layout.order.bilayerCrossCount(g, layer1, layer2, edgeWeight), 6); | ||
}); | ||
}); |
@@ -1,8 +0,11 @@ | ||
require("../common"); | ||
var common = require("../common"), | ||
assert = require("chai").assert, | ||
dot = require("../../lib/dot"), | ||
rank = require("../../lib/layout/rank"); | ||
describe("dagre.layout.rank", function() { | ||
describe("layout/rank", function() { | ||
it("assigns rank 0 to a node in a singleton graph", function() { | ||
var g = dagre.dot.toGraph("digraph { A }"); | ||
var g = dot.toGraph("digraph { A }"); | ||
dagre.layout.rank().run(g); | ||
rank(g); | ||
@@ -13,5 +16,5 @@ assert.equal(g.node("A").rank, 0); | ||
it("assigns successive ranks to succesors", function() { | ||
var g = dagre.dot.toGraph("digraph { A -> B }"); | ||
var g = dot.toGraph("digraph { A -> B }"); | ||
dagre.layout.rank().run(g); | ||
rank(g); | ||
@@ -25,5 +28,5 @@ assert.equal(g.node("A").rank, 0); | ||
// below both of them. | ||
var g = dagre.dot.toGraph("digraph { A -> B; B -> C; A -> C }"); | ||
var g = dot.toGraph("digraph { A -> B; B -> C; A -> C }"); | ||
dagre.layout.rank().run(g); | ||
rank(g); | ||
@@ -36,5 +39,5 @@ assert.equal(g.node("A").rank, 0); | ||
it("uses an edge's minLen attribute to determine rank", function() { | ||
var g = dagre.dot.toGraph("digraph { A -> B [minLen=2] }"); | ||
var g = dot.toGraph("digraph { A -> B [minLen=2] }"); | ||
dagre.layout.rank().run(g); | ||
rank(g); | ||
@@ -41,0 +44,0 @@ assert.equal(g.node("A").rank, 0); |
@@ -1,49 +0,14 @@ | ||
require("./common"); | ||
var common = require("./common"), | ||
assert = require("chai").assert, | ||
util = require("../lib/util"), | ||
graph = require("../lib/Graph"); | ||
var assert2 = require("assert"); | ||
describe("dagre.util.components", function() { | ||
it("returns all nodes in a connected graph", function() { | ||
var g = dagre.graph(); | ||
[1, 2, 3].forEach(function(u) { g.addNode(u); }); | ||
g.addEdge("A", 1, 2); | ||
g.addEdge("B", 2, 3); | ||
var cmpts = dagre.util.components(g); | ||
assert.deepEqual(cmpts.map(function(cmpt) { return cmpt.sort(); }), | ||
[[1, 2, 3]]); | ||
describe("util.sum", function() { | ||
it("returns the sum of all elements in the array", function() { | ||
assert.equal(util.sum([1,2,3,4]), 10); | ||
}); | ||
it("returns maximal subsets of connected nodes", function() { | ||
var g = dagre.graph(); | ||
[1, 2, 3, 4, 5, 6].forEach(function(u) { g.addNode(u); }); | ||
g.addEdge("A", 1, 2); | ||
g.addEdge("B", 2, 3); | ||
g.addEdge("C", 4, 5); | ||
var cmpts = dagre.util.components(g).sort(function(x, y) { return y.length - x.length; }); | ||
assert2.deepEqual(cmpts.map(function(cmpt) { return cmpt.sort(); }), | ||
[[1, 2, 3], [4, 5], [6]]); | ||
it("returns 0 if there are no elements in the array", function() { | ||
assert.equal(util.sum([]), 0); | ||
}); | ||
}); | ||
describe("dagre.util.prim", function() { | ||
it("returns a deterministic minimal spanning tree", function() { | ||
var g = dagre.graph(); | ||
[1, 2, 3, 4].forEach(function(u) { g.addNode(u); }); | ||
g.addEdge("12", 1, 2); | ||
g.addEdge("13", 1, 3); | ||
g.addEdge("24", 2, 4); | ||
g.addEdge("34", 3, 4); | ||
var weights = { 12: 1, 13: 2, 24: 3, 34: 4 }; | ||
var st = dagre.util.prim(g, function(u, v) { return weights[[u,v].sort().join("")]; }); | ||
Object.keys(st).forEach(function(x) { st[x].sort(); }); | ||
assert.deepEqual({1: [2, 3], 2: [1, 4], 3: [1], 4: [2]}, st); | ||
}); | ||
it("returns a single field for a single node graph", function() { | ||
var g = dagre.graph(); | ||
g.addNode(1); | ||
assert.deepEqual({1: []}, dagre.util.prim(g)); | ||
}); | ||
}); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Non-existent author
Supply chain riskThe package was published by an npm account that no longer exists.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
332247
151
5189
102
0
5
2
2