mongo3 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|