mongo3 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.bnignore +3 -0
- data/.bnsignore +16 -0
- data/.gitignore +1 -0
- data/HISTORY +2 -0
- data/README.rdoc +78 -0
- data/Rakefile +31 -0
- data/bin/mongo3 +29 -0
- data/config/mongo3.yml +33 -0
- data/lib/controllers/collections.rb +7 -0
- data/lib/controllers/databases.rb +7 -0
- data/lib/controllers/explore.rb +46 -0
- data/lib/helpers/crumb_helper.rb +46 -0
- data/lib/helpers/main_helper.rb +43 -0
- data/lib/main.rb +41 -0
- data/lib/mongo3/connection.rb +191 -0
- data/lib/mongo3/node.rb +80 -0
- data/lib/mongo3.rb +57 -0
- data/lib/public/images/c292199_a.jpg +0 -0
- data/lib/public/images/close.png +0 -0
- data/lib/public/images/close.psd +0 -0
- data/lib/public/images/cluster.png +0 -0
- data/lib/public/images/cluster.psd +0 -0
- data/lib/public/images/db.jpg +0 -0
- data/lib/public/images/db.png +0 -0
- data/lib/public/images/db.psd +0 -0
- data/lib/public/images/delete.png +0 -0
- data/lib/public/images/header.png +0 -0
- data/lib/public/images/header.psd +0 -0
- data/lib/public/images/li_select.png +0 -0
- data/lib/public/images/li_select.psd +0 -0
- data/lib/public/images/lock.png +0 -0
- data/lib/public/images/lock.psd +0 -0
- data/lib/public/images/mongo.png +0 -0
- data/lib/public/images/mongo.psd +0 -0
- data/lib/public/images/mongo3.png +0 -0
- data/lib/public/images/mongo3.psd +0 -0
- data/lib/public/images/mongo3_db.png +0 -0
- data/lib/public/images/mongo3_db.psd +0 -0
- data/lib/public/images/mongo_10.psd +0 -0
- data/lib/public/images/mongo_db.jpg +0 -0
- data/lib/public/images/mongo_db.png +0 -0
- data/lib/public/images/mongo_db.psd +0 -0
- data/lib/public/images/mongo_db_1.jpg +0 -0
- data/lib/public/images/mongo_db_2 +0 -0
- data/lib/public/images/mongo_db_4 +0 -0
- data/lib/public/images/monkey.jpg +0 -0
- data/lib/public/images/monkey.png +0 -0
- data/lib/public/images/monkey.psd +0 -0
- data/lib/public/images/monkey_1.jpg +8 -0
- data/lib/public/images/monkey_10.jpg +8 -0
- data/lib/public/javascripts/Jit/Examples/Hypertree/example1.html +57 -0
- data/lib/public/javascripts/Jit/Examples/Hypertree/example1.js +427 -0
- data/lib/public/javascripts/Jit/Examples/Hypertree/example2.html +58 -0
- data/lib/public/javascripts/Jit/Examples/Hypertree/example2.js +310 -0
- data/lib/public/javascripts/Jit/Examples/Hypertree/example3.html +199 -0
- data/lib/public/javascripts/Jit/Examples/Hypertree/example3.js +615 -0
- data/lib/public/javascripts/Jit/Examples/Other/example1.html +58 -0
- data/lib/public/javascripts/Jit/Examples/Other/example1.js +566 -0
- data/lib/public/javascripts/Jit/Examples/Other/example2.html +58 -0
- data/lib/public/javascripts/Jit/Examples/Other/example2.js +304 -0
- data/lib/public/javascripts/Jit/Examples/Other/example3.html +58 -0
- data/lib/public/javascripts/Jit/Examples/Other/example3.js +304 -0
- data/lib/public/javascripts/Jit/Examples/RGraph/example1.html +57 -0
- data/lib/public/javascripts/Jit/Examples/RGraph/example1.js +475 -0
- data/lib/public/javascripts/Jit/Examples/RGraph/example2.html +58 -0
- data/lib/public/javascripts/Jit/Examples/RGraph/example2.js +356 -0
- data/lib/public/javascripts/Jit/Examples/RGraph/example3.html +199 -0
- data/lib/public/javascripts/Jit/Examples/RGraph/example3.js +622 -0
- data/lib/public/javascripts/Jit/Examples/Spacetree/example1.html +91 -0
- data/lib/public/javascripts/Jit/Examples/Spacetree/example1.js +890 -0
- data/lib/public/javascripts/Jit/Examples/Spacetree/example2.html +90 -0
- data/lib/public/javascripts/Jit/Examples/Spacetree/example2.js +213 -0
- data/lib/public/javascripts/Jit/Examples/Spacetree/example3.html +75 -0
- data/lib/public/javascripts/Jit/Examples/Spacetree/example3.js +863 -0
- data/lib/public/javascripts/Jit/Examples/Treemap/example1.html +56 -0
- data/lib/public/javascripts/Jit/Examples/Treemap/example1.js +95 -0
- data/lib/public/javascripts/Jit/Examples/Treemap/example2.html +61 -0
- data/lib/public/javascripts/Jit/Examples/Treemap/example2.js +750 -0
- data/lib/public/javascripts/Jit/Examples/Treemap/example3.html +62 -0
- data/lib/public/javascripts/Jit/Examples/Treemap/example3.js +775 -0
- data/lib/public/javascripts/Jit/Examples/css/Hypertree.css +0 -0
- data/lib/public/javascripts/Jit/Examples/css/Other.css +8 -0
- data/lib/public/javascripts/Jit/Examples/css/RGraph.css +0 -0
- data/lib/public/javascripts/Jit/Examples/css/Spacetree.css +0 -0
- data/lib/public/javascripts/Jit/Examples/css/Treemap.css +78 -0
- data/lib/public/javascripts/Jit/Examples/css/base.css +106 -0
- data/lib/public/javascripts/Jit/Examples/css/col1.png +0 -0
- data/lib/public/javascripts/Jit/Examples/css/col2.png +0 -0
- data/lib/public/javascripts/Jit/Examples/css/gradient.png +0 -0
- data/lib/public/javascripts/Jit/Extras/excanvas.js +35 -0
- data/lib/public/javascripts/Jit/jit-yc.js +1 -0
- data/lib/public/javascripts/Jit/jit.js +9052 -0
- data/lib/public/javascripts/Jit-1.1.3.zip +0 -0
- data/lib/public/javascripts/application.js +28 -0
- data/lib/public/javascripts/jit.min.js +1 -0
- data/lib/public/javascripts/jquery.tools.min.js +38 -0
- data/lib/public/javascripts/jquery_min.js +19 -0
- data/lib/public/javascripts/jquery_ui_min.js +298 -0
- data/lib/public/stylesheets/mongo3.css +275 -0
- data/lib/utils.rb +3 -0
- data/lib/views/_cltn_info.erb +95 -0
- data/lib/views/_collection.erb +5 -0
- data/lib/views/_crumbs.erb +13 -0
- data/lib/views/_dump_array.erb +5 -0
- data/lib/views/_dump_hash.erb +14 -0
- data/lib/views/_info.erb +15 -0
- data/lib/views/center_js.erb +3 -0
- data/lib/views/cltn_show.erb +1 -0
- data/lib/views/collection.erb +44 -0
- data/lib/views/database.erb +37 -0
- data/lib/views/db_show.erb +1 -0
- data/lib/views/explore.erb +250 -0
- data/lib/views/landscape.erb +45 -0
- data/lib/views/layout.erb +28 -0
- data/lib/views/more_data_js.erb +3 -0
- data/lib/views/show_cltn.erb +1 -0
- data/lib/views/update_crumb_js.erb +1 -0
- data/spec/mongo3/node_spec.rb +84 -0
- data/spec/spec_helper.rb +8 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +32 -0
- data/tasks/rdoc.rake +56 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +292 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/tasks/zentest.rake +36 -0
- metadata +213 -0
@@ -0,0 +1,250 @@
|
|
1
|
+
<div id="crumbs"><%= partial 'crumbs' %></div>
|
2
|
+
|
3
|
+
<div id="landscape"></div>
|
4
|
+
|
5
|
+
<div id="right">
|
6
|
+
<span id="log"></span>
|
7
|
+
<div id="info"></div>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div id="details" class="overlay">
|
11
|
+
<div id="wrap"></div>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<script>
|
15
|
+
|
16
|
+
function center( node_id ) {
|
17
|
+
ht.onClick( node_id, {
|
18
|
+
Move: { enable: true, offsetX: 30, offsetY: 5 },
|
19
|
+
onComplete: function() { update_info( node_id ); } });
|
20
|
+
}
|
21
|
+
|
22
|
+
function morphit( id, json ) {
|
23
|
+
ht.op.sum( eval( "(" + json + ")" ),
|
24
|
+
{
|
25
|
+
type: 'fade:con',
|
26
|
+
delay: 10,
|
27
|
+
hideLabels: false,
|
28
|
+
transition: Trans.Quart.easeOut,
|
29
|
+
onComplete: function() { update_info(id); }
|
30
|
+
});
|
31
|
+
Log.write( "plotting..." );
|
32
|
+
}
|
33
|
+
|
34
|
+
$( function() {
|
35
|
+
init_landscape();
|
36
|
+
});
|
37
|
+
|
38
|
+
var Log = {
|
39
|
+
log: false,
|
40
|
+
write: function(text) {
|
41
|
+
if ( ! this.log )
|
42
|
+
this.log = $('span#log');
|
43
|
+
this.log.show();
|
44
|
+
this.log.html( text );
|
45
|
+
this.log.css('left', ((500 - this.log.offsetWidth / 2) + 'px') );
|
46
|
+
this.log.fadeOut( 5000 );
|
47
|
+
}
|
48
|
+
};
|
49
|
+
|
50
|
+
function addEvent(obj, type, fn) {
|
51
|
+
if (obj.addEventListener) obj.addEventListener(type, fn, false);
|
52
|
+
else obj.attachEvent('on' + type, fn);
|
53
|
+
};
|
54
|
+
|
55
|
+
|
56
|
+
function init_landscape() {
|
57
|
+
var tree = document.getElementById('landscape');
|
58
|
+
var w = tree.offsetWidth - 100, h = tree.offsetHeight - 40;
|
59
|
+
|
60
|
+
var canvas = new Canvas( 'tree', {
|
61
|
+
'injectInto': 'landscape',
|
62
|
+
'width': w,
|
63
|
+
'height': h
|
64
|
+
});
|
65
|
+
|
66
|
+
var style = document.getElementById('tree').style;
|
67
|
+
style.marginLeft = "50px";
|
68
|
+
style.marginTop = "10px";
|
69
|
+
//init Hypertree
|
70
|
+
ht = new Hypertree( canvas, {
|
71
|
+
Node: {
|
72
|
+
type: 'circle',
|
73
|
+
overridable: true,
|
74
|
+
dim: 10,
|
75
|
+
color: "#7c8a61"
|
76
|
+
},
|
77
|
+
Edge: {
|
78
|
+
overridable: true,
|
79
|
+
lineWidth: 1,
|
80
|
+
color: " #9a4c4c"
|
81
|
+
},
|
82
|
+
|
83
|
+
onBeforeCompute: function(node) {
|
84
|
+
Log.write( "plotting..." );
|
85
|
+
},
|
86
|
+
|
87
|
+
onCreateLabel: function(domElement, node){
|
88
|
+
domElement.innerHTML = truncate( unescape(node.name), 15 );
|
89
|
+
|
90
|
+
addEvent(domElement, 'click', function () {
|
91
|
+
var children_count = 0;
|
92
|
+
for( var i in node.adjacencies )
|
93
|
+
children_count += 1;
|
94
|
+
|
95
|
+
if ( node.data && children_count == 1 && node.data.dyna )
|
96
|
+
{
|
97
|
+
Log.write( "fetching new data..." );
|
98
|
+
var url = "/explore/more_data/";
|
99
|
+
url += node.data.path + "/" + node.data.crumbs + "/";
|
100
|
+
$.ajax( {
|
101
|
+
dataType: 'script',
|
102
|
+
type: 'GET',
|
103
|
+
url: url
|
104
|
+
});
|
105
|
+
}
|
106
|
+
else
|
107
|
+
{
|
108
|
+
if( node.data.path.split( '|' ).length < 4 ) {
|
109
|
+
Log.write( "centering..." );
|
110
|
+
ht.onClick( node.id, {
|
111
|
+
Move: { enable: true, offsetX: 30, offsetY: 5 },
|
112
|
+
onComplete: function() {
|
113
|
+
update_info( node.id );
|
114
|
+
$.ajax( {
|
115
|
+
dataType: 'script',
|
116
|
+
type: 'GET',
|
117
|
+
url: "/explore/update_crumb/" + node.data.path + "/" + node.data.crumbs });
|
118
|
+
} });
|
119
|
+
}
|
120
|
+
else {
|
121
|
+
Log.write( "no more data" );
|
122
|
+
}
|
123
|
+
}
|
124
|
+
});
|
125
|
+
},
|
126
|
+
|
127
|
+
onPlaceLabel: function(domElement, node){
|
128
|
+
var item = $(domElement);
|
129
|
+
|
130
|
+
item.css( 'class', "node level_#{node._depth}" );
|
131
|
+
|
132
|
+
if (node._depth <= 1 ) {
|
133
|
+
item.css('top', (parseInt(item.css('top')) + 10) + 'px' );
|
134
|
+
}
|
135
|
+
else if(node._depth == 2) {
|
136
|
+
item.css('top', (parseInt(item.css('top')) + 10) + 'px' );
|
137
|
+
}
|
138
|
+
else {
|
139
|
+
}
|
140
|
+
item.css( "left", (parseInt(item.css( 'left' )) - domElement.offsetWidth/2) + 'px');
|
141
|
+
},
|
142
|
+
|
143
|
+
onBeforePlotNode: function( node ) {
|
144
|
+
level = node.data.path.split("|").length;
|
145
|
+
|
146
|
+
if( level == 1 )
|
147
|
+
{
|
148
|
+
node.data.$dim = 10;
|
149
|
+
node.data.$color = "#ff8a00";
|
150
|
+
}
|
151
|
+
else if( level == 2 ) {
|
152
|
+
node.data.$dim = 15;
|
153
|
+
node.data.$color = "#d200ff"
|
154
|
+
}
|
155
|
+
else if( level == 3 ) {
|
156
|
+
node.data.$dim = 10;
|
157
|
+
node.data.$color = "#7891ff"
|
158
|
+
}
|
159
|
+
else {
|
160
|
+
node.data.$dim = 10;
|
161
|
+
node.data.$color = "#7da241";
|
162
|
+
}
|
163
|
+
},
|
164
|
+
|
165
|
+
onAfterCompute: function() {
|
166
|
+
Log.write("loaded");
|
167
|
+
}
|
168
|
+
});
|
169
|
+
|
170
|
+
|
171
|
+
ht.loadJSON( eval( <%=@root.to_json%> ) );
|
172
|
+
ht.controller.onAfterCompute();
|
173
|
+
ht.refresh();
|
174
|
+
update_info( 'home' );
|
175
|
+
}
|
176
|
+
|
177
|
+
function update_info(node_id)
|
178
|
+
{
|
179
|
+
var node = null;
|
180
|
+
if( node_id )
|
181
|
+
node = Graph.Util.getNode(ht.graph, node_id);
|
182
|
+
else
|
183
|
+
node = Graph.Util.getClosestNodeToOrigin(ht.graph, "pos");
|
184
|
+
|
185
|
+
// var parents = Graph.Util.getParents( node );
|
186
|
+
// var parent = parents[0];
|
187
|
+
var html = "";
|
188
|
+
var depth = node.data.path.split( '|' ).length
|
189
|
+
var legends = ['', 'environments', 'databases', 'collections']
|
190
|
+
|
191
|
+
var children = [];
|
192
|
+
var children_hash = {};
|
193
|
+
Graph.Util.eachAdjacency( node, function(adj) {
|
194
|
+
child = adj.nodeTo;
|
195
|
+
if( parent ) {
|
196
|
+
if( child.name != parent.name ) {
|
197
|
+
children_hash[child.name] = child;
|
198
|
+
children.push( child.name );
|
199
|
+
}
|
200
|
+
}
|
201
|
+
else {
|
202
|
+
children_hash[child.name] = child;
|
203
|
+
children.push( child.name );
|
204
|
+
}
|
205
|
+
});
|
206
|
+
children = children.sort();
|
207
|
+
|
208
|
+
html += "<span class=\"what\">" + legends[depth] + "(" + children.length + ")</span>";
|
209
|
+
html += "<p style='padding:5px 10px;text-align:left;color:#c1c1c1'>";
|
210
|
+
|
211
|
+
var buff = "<ul style='font-size:0.4em'>";
|
212
|
+
for( var i in children ) {
|
213
|
+
var node = children_hash[children[i]];
|
214
|
+
buff += "<li>";
|
215
|
+
buff += make_link( node );
|
216
|
+
buff += "</li>";
|
217
|
+
}
|
218
|
+
html += "</ul>" + buff;
|
219
|
+
html += "</p>";
|
220
|
+
$('div#info').html( html );
|
221
|
+
|
222
|
+
$('a.info[rel]').overlay(
|
223
|
+
{ top: '15%',
|
224
|
+
expose: '#1c1c1c',
|
225
|
+
onBeforeLoad: function() {
|
226
|
+
var wrap = this.getContent().find( 'div#wrap' );
|
227
|
+
wrap.load( this.getTrigger().attr( 'href' ) );
|
228
|
+
// $.ajax( {
|
229
|
+
// url: this.getTrigger().attr( 'href' ),
|
230
|
+
// dataType: 'script',
|
231
|
+
// success: function(data) { $('div#details').html( data ); },
|
232
|
+
// type: 'GET' } );
|
233
|
+
}
|
234
|
+
});
|
235
|
+
}
|
236
|
+
|
237
|
+
function make_link( node )
|
238
|
+
{
|
239
|
+
return "<a rel=\"div#details\" class=\"info\" href=\"/explore/show/" + node.data.path + "/" + node.data.crumbs + "\">" + node.name + "</a>";
|
240
|
+
}
|
241
|
+
|
242
|
+
function refresh_data( url, path, name )
|
243
|
+
{
|
244
|
+
$.ajax( {
|
245
|
+
dataType: 'script',
|
246
|
+
type: 'GET',
|
247
|
+
url: url + "/" + path + "/" + name
|
248
|
+
});
|
249
|
+
}
|
250
|
+
</script>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<%= partial :crumbs %>
|
2
|
+
|
3
|
+
<div id="actions">
|
4
|
+
<a class="prevPage">« back</a>
|
5
|
+
<a class="nextPage">more »</a>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="scrollable vertical">
|
9
|
+
<div class="items">
|
10
|
+
<% @landscape.keys.sort{ |a,b| a <=> b }.each do |name|%>
|
11
|
+
<% config = @landscape[name] %>
|
12
|
+
<div id="<%=name%>" class="item host">
|
13
|
+
<img class="tag" src="/images/monkey.png"/>
|
14
|
+
<p class="heading">
|
15
|
+
<%= name %>
|
16
|
+
</p>
|
17
|
+
<% if config.has_key?(:user) %>
|
18
|
+
<img class="lock" src="/images/lock.png"/>
|
19
|
+
<% end %>
|
20
|
+
<ul class="host_info">
|
21
|
+
<li><%=config[:host]%></li>
|
22
|
+
<li><%=config[:port]%></li>
|
23
|
+
</ul>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<script>
|
30
|
+
$("div.scrollable").scrollable({
|
31
|
+
vertical:true,
|
32
|
+
size: 5
|
33
|
+
}).mousewheel();
|
34
|
+
|
35
|
+
$( function() {
|
36
|
+
$("div.item").click( function() {
|
37
|
+
window.location.href = "/db/" + this.id;
|
38
|
+
});
|
39
|
+
|
40
|
+
$("div.item").hover(
|
41
|
+
function() { $(this).addClass( "selected" ) },
|
42
|
+
function() { $(this).removeClass( "selected" ) }
|
43
|
+
);
|
44
|
+
})
|
45
|
+
</script>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
3
|
+
<head>
|
4
|
+
<title>M O N G O 3</title>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
6
|
+
<link rel="icon" href="/favicon.ico" type="image/x-icon"/>
|
7
|
+
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
|
8
|
+
<link rel="stylesheet" href="/stylesheets/mongo3.css" type="text/css" media="screen" />
|
9
|
+
<script src="/javascripts/jquery_min.js" type="text/javascript"></script>
|
10
|
+
<script src="/javascripts/jquery_ui_min.js" type="text/javascript"></script>
|
11
|
+
<script src="/javascripts/jquery.tools.min.js" type="text/javascript"></script>
|
12
|
+
<script src="/javascripts/application.js" type="text/javascript"></script>
|
13
|
+
<script src="/javascripts/jit.min.js" type="text/javascript"></script>
|
14
|
+
</head>
|
15
|
+
|
16
|
+
<body id="body">
|
17
|
+
<div id="overall">
|
18
|
+
<div id="logo">
|
19
|
+
<a href="/">
|
20
|
+
<img src='/images/mongo3.png' style="border:none"/>
|
21
|
+
</a>
|
22
|
+
</div>
|
23
|
+
<div id="main">
|
24
|
+
<%= yield %>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</body>
|
28
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
$('div.content').html( "<%= escape_javascript( partial :cltn_info )%>")
|
@@ -0,0 +1 @@
|
|
1
|
+
$('div#crumbs').html( "<%=escape_javascript(partial(:crumbs))%>" );
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
describe Mongo3::Node do
|
5
|
+
|
6
|
+
before( :all ) do
|
7
|
+
@root = Mongo3::Node.new( 0, "root", :blee => 'duh', :fred => 10 )
|
8
|
+
id = 100
|
9
|
+
|
10
|
+
@envs = []
|
11
|
+
2.times do |i|
|
12
|
+
node = Mongo3::Node.new( id, "env_#{i}" )
|
13
|
+
@envs << node
|
14
|
+
@root << node
|
15
|
+
id += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
@dbs = []
|
19
|
+
@cltns = []
|
20
|
+
4.times do |i|
|
21
|
+
db = Mongo3::Node.new( id, "db_#{i}" )
|
22
|
+
@dbs << db
|
23
|
+
4.times do |j|
|
24
|
+
cltn = Mongo3::Node.new( id, "cltn_#{j}" )
|
25
|
+
@cltns << cltn
|
26
|
+
db << cltn
|
27
|
+
id += 1
|
28
|
+
end
|
29
|
+
if i % 2 == 0
|
30
|
+
@root.children.first << db
|
31
|
+
else
|
32
|
+
@root.children.last << db
|
33
|
+
end
|
34
|
+
id += 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should create a node correctly" do
|
39
|
+
@root.oid.should == 0
|
40
|
+
@root.name.should == "root"
|
41
|
+
@root.children.should have(2).items
|
42
|
+
@root.data.should_not be_nil
|
43
|
+
@root.data[:blee].should == 'duh'
|
44
|
+
@root.data[:fred].should == 10
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should add children correctly" do
|
48
|
+
@root.children.should have(2).items
|
49
|
+
@root.children.first.name.should == "env_0"
|
50
|
+
@root.children.last.name.should == "env_1"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should set the parent correctly" do
|
54
|
+
@root.parent.should be_nil
|
55
|
+
@envs.each do |env|
|
56
|
+
env.parent.should == @root
|
57
|
+
end
|
58
|
+
|
59
|
+
@dbs.each do |db|
|
60
|
+
db.parent.name.should match(/^env_/)
|
61
|
+
end
|
62
|
+
|
63
|
+
@cltns.each do |cltn|
|
64
|
+
cltn.parent.name.should match(/^db_/)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should set the path correctly" do
|
69
|
+
@cltns.first.data[:path].should == "root|env_0|db_0|cltn_0"
|
70
|
+
@dbs.last.data[:path].should == "root|env_1|db_3"
|
71
|
+
@envs.first.data[:path].should == "root|env_0"
|
72
|
+
@root.data[:path].should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should dump to json correctly" do
|
76
|
+
@cltns.first.to_json.should == "{\"name\":\"cltn_0\",\"id\":102,\"children\":[],\"data\":{\"path\":\"root|env_0|db_0|cltn_0\"}}"
|
77
|
+
@dbs.first.to_json.should == "{\"name\":\"db_0\",\"id\":102,\"children\":[{\"name\":\"cltn_0\",\"id\":102,\"children\":[],\"data\":{\"path\":\"root|env_0|db_0|cltn_0\"}},{\"name\":\"cltn_1\",\"id\":103,\"children\":[],\"data\":{\"path\":\"root|env_0|db_0|cltn_1\"}},{\"name\":\"cltn_2\",\"id\":104,\"children\":[],\"data\":{\"path\":\"root|env_0|db_0|cltn_2\"}},{\"name\":\"cltn_3\",\"id\":105,\"children\":[],\"data\":{\"path\":\"root|env_0|db_0|cltn_3\"}}],\"data\":{\"path\":\"root|env_0|db_0\"}}"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should dump adjacencies correctly" do
|
81
|
+
@cltns.first.to_adjacencies.should == [{:adjacencies=>[], :name=>"cltn_0", :data=>{:path=>"root|env_0|db_0|cltn_0"}, :id=>102}]
|
82
|
+
@dbs.first.to_adjacencies.should == [{:name=>"db_0", :adjacencies=>[102, 103, 104, 105], :data=>{:path=>"root|env_0|db_0"}, :id=>102}, {:name=>"cltn_0", :adjacencies=>[], :data=>{:path=>"root|env_0|db_0|cltn_0"}, :id=>102}, {:name=>"cltn_1", :adjacencies=>[], :data=>{:path=>"root|env_0|db_0|cltn_1"}, :id=>103}, {:name=>"cltn_2", :adjacencies=>[], :data=>{:path=>"root|env_0|db_0|cltn_2"}, :id=>104}, {:name=>"cltn_3", :adjacencies=>[], :data=>{:path=>"root|env_0|db_0|cltn_3"}, :id=>105}]
|
83
|
+
end
|
84
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/tasks/bones.rake
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
if HAVE_BONES
|
3
|
+
|
4
|
+
namespace :bones do
|
5
|
+
|
6
|
+
desc 'Show the PROJ open struct'
|
7
|
+
task :debug do |t|
|
8
|
+
atr = if t.application.top_level_tasks.length == 2
|
9
|
+
t.application.top_level_tasks.pop
|
10
|
+
end
|
11
|
+
|
12
|
+
if atr then Bones::Debug.show_attr(PROJ, atr)
|
13
|
+
else Bones::Debug.show PROJ end
|
14
|
+
end
|
15
|
+
|
16
|
+
end # namespace :bones
|
17
|
+
|
18
|
+
end # HAVE_BONES
|
19
|
+
|
20
|
+
# EOF
|
data/tasks/gem.rake
ADDED
@@ -0,0 +1,201 @@
|
|
1
|
+
|
2
|
+
require 'find'
|
3
|
+
require 'rake/packagetask'
|
4
|
+
require 'rubygems/user_interaction'
|
5
|
+
require 'rubygems/builder'
|
6
|
+
|
7
|
+
module Bones
|
8
|
+
class GemPackageTask < Rake::PackageTask
|
9
|
+
# Ruby GEM spec containing the metadata for this package. The
|
10
|
+
# name, version and package_files are automatically determined
|
11
|
+
# from the GEM spec and don't need to be explicitly provided.
|
12
|
+
#
|
13
|
+
attr_accessor :gem_spec
|
14
|
+
|
15
|
+
# Tasks from the Bones gem directory
|
16
|
+
attr_reader :bones_files
|
17
|
+
|
18
|
+
# Create a GEM Package task library. Automatically define the gem
|
19
|
+
# if a block is given. If no block is supplied, then +define+
|
20
|
+
# needs to be called to define the task.
|
21
|
+
#
|
22
|
+
def initialize(gem_spec)
|
23
|
+
init(gem_spec)
|
24
|
+
yield self if block_given?
|
25
|
+
define if block_given?
|
26
|
+
end
|
27
|
+
|
28
|
+
# Initialization tasks without the "yield self" or define
|
29
|
+
# operations.
|
30
|
+
#
|
31
|
+
def init(gem)
|
32
|
+
super(gem.name, gem.version)
|
33
|
+
@gem_spec = gem
|
34
|
+
@package_files += gem_spec.files if gem_spec.files
|
35
|
+
@bones_files = []
|
36
|
+
|
37
|
+
local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
|
38
|
+
if !test(?e, local_setup)
|
39
|
+
Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Create the Rake tasks and actions specified by this
|
44
|
+
# GemPackageTask. (+define+ is automatically called if a block is
|
45
|
+
# given to +new+).
|
46
|
+
#
|
47
|
+
def define
|
48
|
+
super
|
49
|
+
task :prereqs
|
50
|
+
task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
|
51
|
+
file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
|
52
|
+
when_writing("Creating GEM") {
|
53
|
+
chdir(package_dir_path) do
|
54
|
+
Gem::Builder.new(gem_spec).build
|
55
|
+
verbose(true) {
|
56
|
+
mv gem_file, "../#{gem_file}"
|
57
|
+
}
|
58
|
+
end
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
file package_dir_path => bones_files do
|
63
|
+
mkdir_p package_dir rescue nil
|
64
|
+
|
65
|
+
gem_spec.files = (gem_spec.files +
|
66
|
+
bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
|
67
|
+
|
68
|
+
bones_files.each do |fn|
|
69
|
+
base_fn = File.join('tasks', File.basename(fn))
|
70
|
+
f = File.join(package_dir_path, base_fn)
|
71
|
+
fdir = File.dirname(f)
|
72
|
+
mkdir_p(fdir) if !File.exist?(fdir)
|
73
|
+
if File.directory?(fn)
|
74
|
+
mkdir_p(f)
|
75
|
+
else
|
76
|
+
raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
|
77
|
+
safe_ln(fn, f)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def gem_file
|
84
|
+
if @gem_spec.platform == Gem::Platform::RUBY
|
85
|
+
"#{package_name}.gem"
|
86
|
+
else
|
87
|
+
"#{package_name}-#{@gem_spec.platform}.gem"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end # class GemPackageTask
|
91
|
+
end # module Bones
|
92
|
+
|
93
|
+
namespace :gem do
|
94
|
+
|
95
|
+
PROJ.gem._spec = Gem::Specification.new do |s|
|
96
|
+
s.name = PROJ.name
|
97
|
+
s.version = PROJ.version
|
98
|
+
s.summary = PROJ.summary
|
99
|
+
s.authors = Array(PROJ.authors)
|
100
|
+
s.email = PROJ.email
|
101
|
+
s.homepage = Array(PROJ.url).first
|
102
|
+
s.rubyforge_project = PROJ.rubyforge.name
|
103
|
+
|
104
|
+
s.description = PROJ.description
|
105
|
+
|
106
|
+
PROJ.gem.dependencies.each do |dep|
|
107
|
+
s.add_dependency(*dep)
|
108
|
+
end
|
109
|
+
|
110
|
+
PROJ.gem.development_dependencies.each do |dep|
|
111
|
+
s.add_development_dependency(*dep)
|
112
|
+
end
|
113
|
+
|
114
|
+
s.files = PROJ.gem.files
|
115
|
+
s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
|
116
|
+
s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
|
117
|
+
|
118
|
+
s.bindir = 'bin'
|
119
|
+
dirs = Dir["{#{PROJ.libs.join(',')}}"]
|
120
|
+
s.require_paths = dirs unless dirs.empty?
|
121
|
+
|
122
|
+
incl = Regexp.new(PROJ.rdoc.include.join('|'))
|
123
|
+
excl = PROJ.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
|
124
|
+
excl = Regexp.new(excl.join('|'))
|
125
|
+
rdoc_files = PROJ.gem.files.find_all do |fn|
|
126
|
+
case fn
|
127
|
+
when excl; false
|
128
|
+
when incl; true
|
129
|
+
else false end
|
130
|
+
end
|
131
|
+
s.rdoc_options = PROJ.rdoc.opts + ['--main', PROJ.rdoc.main]
|
132
|
+
s.extra_rdoc_files = rdoc_files
|
133
|
+
s.has_rdoc = true
|
134
|
+
|
135
|
+
if test ?f, PROJ.test.file
|
136
|
+
s.test_file = PROJ.test.file
|
137
|
+
else
|
138
|
+
s.test_files = PROJ.test.files.to_a
|
139
|
+
end
|
140
|
+
|
141
|
+
# Do any extra stuff the user wants
|
142
|
+
PROJ.gem.extras.each do |msg, val|
|
143
|
+
case val
|
144
|
+
when Proc
|
145
|
+
val.call(s.send(msg))
|
146
|
+
else
|
147
|
+
s.send "#{msg}=", val
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end # Gem::Specification.new
|
151
|
+
|
152
|
+
Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
|
153
|
+
pkg.need_tar = PROJ.gem.need_tar
|
154
|
+
pkg.need_zip = PROJ.gem.need_zip
|
155
|
+
end
|
156
|
+
|
157
|
+
desc 'Show information about the gem'
|
158
|
+
task :debug => 'gem:prereqs' do
|
159
|
+
puts PROJ.gem._spec.to_ruby
|
160
|
+
end
|
161
|
+
|
162
|
+
desc 'Write the gemspec '
|
163
|
+
task :spec => 'gem:prereqs' do
|
164
|
+
File.open("#{PROJ.name}.gemspec", 'w') do |f|
|
165
|
+
f.write PROJ.gem._spec.to_ruby
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
desc 'Install the gem'
|
170
|
+
task :install => [:clobber, 'gem:package'] do
|
171
|
+
sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
|
172
|
+
|
173
|
+
# use this version of the command for rubygems > 1.0.0
|
174
|
+
#sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
|
175
|
+
end
|
176
|
+
|
177
|
+
desc 'Uninstall the gem'
|
178
|
+
task :uninstall do
|
179
|
+
installed_list = Gem.source_index.find_name(PROJ.name)
|
180
|
+
if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
|
181
|
+
sh "#{SUDO} #{GEM} uninstall --version '#{PROJ.version}' --ignore-dependencies --executables #{PROJ.name}"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
desc 'Reinstall the gem'
|
186
|
+
task :reinstall => [:uninstall, :install]
|
187
|
+
|
188
|
+
desc 'Cleanup the gem'
|
189
|
+
task :cleanup do
|
190
|
+
sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
|
191
|
+
end
|
192
|
+
end # namespace :gem
|
193
|
+
|
194
|
+
|
195
|
+
desc 'Alias to gem:package'
|
196
|
+
task :gem => 'gem:package'
|
197
|
+
|
198
|
+
task :clobber => 'gem:clobber_package'
|
199
|
+
remove_desc_for_task 'gem:clobber_package'
|
200
|
+
|
201
|
+
# EOF
|
data/tasks/git.rake
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
if HAVE_GIT
|
3
|
+
|
4
|
+
namespace :git do
|
5
|
+
|
6
|
+
# A prerequisites task that all other tasks depend upon
|
7
|
+
task :prereqs
|
8
|
+
|
9
|
+
desc 'Show tags from the Git repository'
|
10
|
+
task :show_tags => 'git:prereqs' do |t|
|
11
|
+
puts %x/git tag/
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Create a new tag in the Git repository'
|
15
|
+
task :create_tag => 'git:prereqs' do |t|
|
16
|
+
v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
|
17
|
+
abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
|
18
|
+
|
19
|
+
tag = "%s-%s" % [PROJ.name, PROJ.version]
|
20
|
+
msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
|
21
|
+
|
22
|
+
puts "Creating Git tag '#{tag}'"
|
23
|
+
unless system "git tag -a -m '#{msg}' #{tag}"
|
24
|
+
abort "Tag creation failed"
|
25
|
+
end
|
26
|
+
|
27
|
+
if %x/git remote/ =~ %r/^origin\s*$/
|
28
|
+
unless system "git push origin #{tag}"
|
29
|
+
abort "Could not push tag to remote Git repository"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end # namespace :git
|
35
|
+
|
36
|
+
task 'gem:release' => 'git:create_tag'
|
37
|
+
|
38
|
+
end # if HAVE_GIT
|
39
|
+
|
40
|
+
# EOF
|