radiant-fabulator_exhibit-extension 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.6 2010-11-08
2
+ * 1 bug fix
3
+ * Database items are selected correctly now
4
+
1
5
  === 0.0.5 2010-11-06
2
6
  * 1 major enhancement
3
7
  * Progress bar while loading items
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ begin
8
8
  gem.homepage = "http://github.com/jgsmith/radiant-fabulator-exhibit"
9
9
  gem.authors = ["James Smith"]
10
10
  gem.add_dependency('radiant-fabulator-extension', '>= 0.0.7')
11
- gem.add_dependency('fabulator-exhibit', '>= 0.0.6')
11
+ gem.add_dependency('fabulator-exhibit', '>= 0.0.7')
12
12
  gem.add_dependency('json', '>= 1.4.3')
13
13
  gem.add_dependency('uuid', '>= 2.3.1')
14
14
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -2,7 +2,7 @@ require 'fabulator/exhibit'
2
2
  require 'json'
3
3
 
4
4
  class FabulatorExhibitExtension < Radiant::Extension
5
- version "0.0.5"
5
+ version "0.0.6"
6
6
  description "Exhibit extension to the Fabulator extension"
7
7
  url "http://github.com/jgsmith/radiant-fabulator-exhibit"
8
8
 
@@ -2,33 +2,50 @@ class FabulatorExhibitExtension
2
2
  class Database
3
3
  def initialize(db)
4
4
  @db = db
5
+ @info = {
6
+ :items => ItemCollection.new(@db),
7
+ :properties => PropertyCollection.new(@db),
8
+ :types => TypeCollection.new(@db)
9
+ }
5
10
  end
6
11
 
7
12
  def to_json
8
- '{ "items":' + self[:items].to_json + ', ' +
9
- ' "types":' + self[:types].to_json + ', ' +
10
- ' "properties":' + self[:properties].to_json +
13
+ '{ "items":' + @info[:items].to_json + ', ' +
14
+ ' "types":' + @info[:types].to_json + ', ' +
15
+ ' "properties":' + @info[:properties].to_json +
11
16
  '}'
12
17
  end
13
18
 
14
19
  def [](t)
15
- case t.to_sym
16
- when :items
17
- return ItemCollection.new(@db)
18
- when :properties
19
- return PropertyCollection.new(@db)
20
- when :types
21
- return TypeCollection.new(@db)
22
- end
20
+ @info[t.to_sym]
23
21
  end
24
22
  end
25
23
 
26
24
  class ItemCollection
27
25
  def initialize(db)
28
26
  @db = db
27
+ @items = { }
28
+ end
29
+
30
+ def delete_if(&block)
31
+ self.each do |i|
32
+ r = yield i['id'], i
33
+ if r
34
+ @items.delete(i['id'])
35
+ i.delete
36
+ end
37
+ end
38
+ end
39
+
40
+ def each(&block)
41
+ @db.fabulator_exhibit_items.find(:all).each do |i|
42
+ @items[i.id.to_s] ||= Item.new(i)
43
+ yield @items[i.id.to_s]
44
+ end
29
45
  end
30
46
 
31
47
  def [](nom)
48
+ return @items[nom] if @items.include?(nom)
32
49
  ob = nil
33
50
  begin
34
51
  ob = @db.fabulator_exhibit_items.find(:first, [ 'uuid = ?', nom ])
@@ -41,13 +58,13 @@ class FabulatorExhibitExtension
41
58
  :fabulator_exhibit_id => @db.id
42
59
  })
43
60
  end
44
- Item.new(ob)
61
+ @items[nom] = Item.new(ob)
45
62
  end
46
63
 
47
64
  def include?(nom)
48
65
  ob = nil
49
66
  begin
50
- ob = @db.fabulator_exhibit_items.find(:first, [ 'uuid = ?', nom ])
67
+ ob = @db.fabulator_exhibit_items.find(:first, :conditions => [ 'uuid = ?', nom ])
51
68
  rescue
52
69
  ob = nil
53
70
  end
@@ -72,12 +89,14 @@ class FabulatorExhibitExtension
72
89
  class PropertyCollection
73
90
  def initialize(db)
74
91
  @db = db
92
+ @properties = { }
75
93
  end
76
94
 
77
95
  def [](nom)
96
+ return @properties[nom] if @properties.include?(nom)
78
97
  ob = nil
79
98
  begin
80
- ob = @db.fabulator_exhibit_properties.find(:first, [ 'name = ?', nom ])
99
+ ob = @db.fabulator_exhibit_properties.find(:first, :conditions => [ 'name = ?', nom ])
81
100
  rescue
82
101
  ob = nil
83
102
  end
@@ -87,7 +106,7 @@ class FabulatorExhibitExtension
87
106
  :fabulator_exhibit_id => @db.id
88
107
  })
89
108
  end
90
- Property.new(ob)
109
+ @properties[nom] ||= Property.new(ob)
91
110
  end
92
111
 
93
112
  def []=(nom, hash)
@@ -110,12 +129,14 @@ class FabulatorExhibitExtension
110
129
  class TypeCollection
111
130
  def initialize(db)
112
131
  @db = db
132
+ @types = { }
113
133
  end
114
134
 
115
135
  def [](nom)
136
+ return @types[nom] if @types.include?(nom)
116
137
  ob = nil
117
138
  begin
118
- ob = @db.fabulator_exhibit_types.find(:first, [ 'name = ?', nom ])
139
+ ob = @db.fabulator_exhibit_types.find(:first, :conditions => [ 'name = ?', nom ])
119
140
  rescue
120
141
  ob = nil
121
142
  end
@@ -125,7 +146,7 @@ class FabulatorExhibitExtension
125
146
  :fabulator_exhibit_id => @db.id
126
147
  })
127
148
  end
128
- Type.new(ob)
149
+ @types[nom] ||= Type.new(ob)
129
150
  end
130
151
 
131
152
  def []=(nom, hash)
@@ -151,6 +172,10 @@ class FabulatorExhibitExtension
151
172
  @raw_data = ( JSON.parse(i.data) rescue {} )
152
173
  end
153
174
 
175
+ def delete
176
+ @item.delete
177
+ end
178
+
154
179
  def [](k)
155
180
  @raw_data[k]
156
181
  end
@@ -37,8 +37,11 @@ Fabulator.namespace('Exhibit');
37
37
 
38
38
  var sources = { };
39
39
 
40
+ var data_view_counter = 1;
41
+
40
42
  Exhibit.DataView = function(options) {
41
43
  var that = { },
44
+ progress,
42
45
  set = Exhibit.Set();
43
46
  that.options = options;
44
47
 
@@ -53,12 +56,25 @@ Fabulator.namespace('Exhibit');
53
56
  ob.events.onFilterChange.addListener(that.eventFilterChange);
54
57
  };
55
58
 
59
+ $("<div id='data-source-progress-" + data_view_counter + "'>" +
60
+ "<div class='flc-progress progress-pop-up exhibit-progress-pop-up ui-corner-all'><h3>Filtering...</h3>" +
61
+ "<div class='flc-progress-indicator progress-indicator'></div>" +
62
+ "<p class='flc-progress-label progress-label'>0% Complete</p>" +
63
+ "</div></div>").appendTo($("html > body"));
64
+
65
+ progress = fluid.progress("#data-source-progress-" + data_view_counter);
66
+
67
+ progress.hide();
68
+
69
+ data_view_counter += 1;
70
+
71
+
56
72
  that.items = set.items;
57
73
 
58
74
  that.size = set.size;
59
75
 
60
- that.filterItems = function() {
61
- var id, fres, ids;
76
+ that.filterItems = function(endFn) {
77
+ var id, fres, ids, percent, old_percent, n, chunk_size, f;
62
78
 
63
79
  set = Exhibit.Set();
64
80
 
@@ -68,30 +84,68 @@ Fabulator.namespace('Exhibit');
68
84
 
69
85
  ids = that.dataSource.items();
70
86
 
71
- $(ids).each(function(idx, id) {
72
- /* do filtering here */
73
- // id = ids[id];
74
- fres = that.events.onFilterItem.fire(that.dataSource, id);
75
- if(fres !== false) {
76
- set.add(id);
87
+ old_percent = 0;
88
+ n = ids.length;
89
+
90
+ if(n > 100) {
91
+ progress.show();
92
+ }
93
+
94
+ chunk_size = parseInt(n / 100);
95
+
96
+ if(chunk_size > 200) {
97
+ chunk_size = 200;
98
+ }
99
+
100
+ f = function(start) {
101
+ var i, end;
102
+ end = start + chunk_size;
103
+ if( end > n ) {
104
+ end = n;
77
105
  }
78
- });
106
+ for(i = start; i < end; i += 1) {
107
+ id = ids[i];
108
+ fres = that.events.onFilterItem.fire(that.dataSource, id);
109
+ if(fres !== false) {
110
+ set.add(id);
111
+ }
112
+ }
113
+ if(n > 100 ) {
114
+ percent = parseInt(end * 100 / n);
115
+ if( percent > old_percent ) {
116
+ progress.update(percent, percent + "% Complete");
117
+ }
118
+ }
119
+ if(end < n) {
120
+ setTimeout(function() {
121
+ f(end);
122
+ }, 0);
123
+ }
124
+ else {
125
+ if(n > 100 ) {
126
+ progress.update(100, "100% Complete");
127
+ progress.hide();
128
+ }
129
+ if(endFn) { setTimeout(endFn, 0); }
130
+ }
131
+ };
132
+ f(0);
79
133
  };
80
134
 
81
135
  that.eventModelChange = function(model) {
82
136
  var id;
83
137
 
84
- that.filterItems();
85
-
86
- that.events.onModelChange.fire(that);
138
+ that.filterItems(function() {
139
+ that.events.onModelChange.fire(that);
140
+ });
87
141
  };
88
142
 
89
143
  that.eventFilterChange = function() {
90
144
  var id;
91
145
 
92
- that.filterItems();
93
-
94
- that.events.onModelChange.fire(that);
146
+ that.filterItems(function() {
147
+ that.events.onModelChange.fire(that);
148
+ });
95
149
  };
96
150
 
97
151
  that.getItem = function(id) {
@@ -108,10 +162,32 @@ Fabulator.namespace('Exhibit');
108
162
  var separator = ", ",
109
163
  last_separator = ", and ",
110
164
  pair_separator = " and ",
111
- values, value, lens,
165
+ values, value, lens, popupFn,
112
166
  valueType, lensElmt, lensRender,
113
167
  i, n;
114
168
 
169
+ popupFn = function(container, trigger, lens, itemID) {
170
+ var lensRender;
171
+
172
+ trigger.bind("click", function() {
173
+ var t, id;
174
+
175
+ if( !lensRender ) {
176
+ lensRender = lens.render(view, view.options.viewPanel.dataView, itemID);
177
+ /* TODO: make id more universally unique */
178
+ id = itemID;
179
+ id = id.replace('.', '-');
180
+ $(lensRender).attr('id', 'facet-item-lens-' + id);
181
+ $(lensRender).addClass('facets-overlay');
182
+ $("<a class='close ui-icon ui-icon-circle-close'></a>").prependTo($(lensRender));
183
+ $(lensRender).addClass('ui-corner-all');
184
+ $(lensRender).appendTo($(container));
185
+ $(trigger).attr('rel', '#facet-item-lens-' + id);
186
+ $(trigger).overlay({ load: true });
187
+ }
188
+ });
189
+ };
190
+
115
191
  if( "separator" in templateNode ) {
116
192
  separator = templateNode.separator;
117
193
  }
@@ -150,18 +226,10 @@ Fabulator.namespace('Exhibit');
150
226
  else {
151
227
  /* construct a clickable link that will pop up the lens content */
152
228
  lensElmt = $("<div></div>");
153
- lensRender = lens.render(view, model, values[i]);
154
- /* TODO: make id more universally unique */
155
- $(lensRender).attr('id', 'facet-item-lens-' + values[i]);
156
- $(lensRender).addClass('facets-overlay');
157
- $("<a class='close ui-icon ui-icon-circle-close'></a>").prependTo($(lensRender));
158
- $(lensRender).addClass('ui-corner-all');
159
- trigger = $("<span rel='#facet-item-lens-'" + values[i] + "'>" + value.label[0] + "</span>")
160
- trigger.appendTo(lensElmt);
161
- $(lensRender).appendTo(lensElmt);
162
229
  lensElmt.appendTo($(parentElmt));
163
- $(lensRender).hide();
164
- trigger.overlay();
230
+ trigger = $("<span rel='#facet-item-lens-" + values[i] + "'>" + value.label[0] + "</span>")
231
+ trigger.appendTo(lensElmt);
232
+ popupFn(lensElmt, trigger, lens, values[i]);
165
233
  }
166
234
  }
167
235
  else {
@@ -416,7 +484,7 @@ Fabulator.namespace('Exhibit');
416
484
  that.name = p;
417
485
 
418
486
  that.getValueType = function() {
419
- that.valueType;
487
+ return that.valueType;
420
488
  };
421
489
 
422
490
  return that;
@@ -509,19 +577,17 @@ Fabulator.namespace('Exhibit');
509
577
  baseURI = location.href;
510
578
  }
511
579
 
512
- if("types" in data) {
513
- that.loadTypes(data.types, baseURI);
514
- }
515
-
516
- if("properties" in data) {
517
- that.loadProperties(data.properties, baseURI);
518
- }
519
-
520
- if("items" in data) {
521
- that.loadItems(data.items, baseURI);
522
- }
580
+ data.types = data.types || { };
581
+ data.properties = data.properties || { };
582
+ data.items = data.items || [ ];
523
583
 
524
- that.events.onModelChange.fire(that);
584
+ that.loadTypes(data.types, baseURI, function() {
585
+ that.loadProperties(data.properties, baseURI, function() {
586
+ that.loadItems(data.items, baseURI, function() {
587
+ that.events.onModelChange.fire(that);
588
+ });
589
+ });
590
+ });
525
591
  };
526
592
 
527
593
  var canonicalBaseURI = function(baseURI) {
@@ -535,7 +601,7 @@ Fabulator.namespace('Exhibit');
535
601
  return baseURI;
536
602
  };
537
603
 
538
- that.loadTypes = function(types, baseURI) {
604
+ that.loadTypes = function(types, baseURI, fn) {
539
605
  var typeID, typeEntry, type, p;
540
606
 
541
607
  that.events.onBeforeLoadingTypes.fire(that);
@@ -570,9 +636,11 @@ Fabulator.namespace('Exhibit');
570
636
  catch(e) {
571
637
  Exhibit.debug("loadTypes failed:", e);
572
638
  }
639
+
640
+ setTimeout(fn, 0);
573
641
  };
574
642
 
575
- that.loadProperties = function(properties, baseURI) {
643
+ that.loadProperties = function(properties, baseURI, fn) {
576
644
  var propertyID, propertyEntry, property;
577
645
 
578
646
  that.events.onBeforeLoadingProperties.fire(that);
@@ -612,10 +680,11 @@ Fabulator.namespace('Exhibit');
612
680
  catch(e) {
613
681
  Exhibit.debug("loadProperties failed: ", e);
614
682
  }
683
+ setTimeout(fn, 0);
615
684
  };
616
685
 
617
- that.loadItems = function(items, baseURI) {
618
- var spo, ops, indexTriple, i, entry, n, progress, percent, old_percent;
686
+ that.loadItems = function(items, baseURI, fn) {
687
+ var spo, ops, indexTriple, entry, n, progress, percent, old_percent, f;
619
688
 
620
689
  var indexPut = function(index, x, y, z) {
621
690
  var hash = index[x],
@@ -643,7 +712,7 @@ Fabulator.namespace('Exhibit');
643
712
 
644
713
  that.events.onBeforeLoadingItems.fire(that);
645
714
  $("<div id='progress-items-" + options.source + "'>" +
646
- "<div class='flc-progress progress-pop-up exhibit-progress-pop-up'><h3>Loading " + items.length + " Item" + (items.length == 1 ? "" : "s") + "</h3>" +
715
+ "<div class='flc-progress progress-pop-up exhibit-progress-pop-up ui-corner-all'><h3>Loading " + items.length + " Item" + (items.length == 1 ? "" : "s") + "</h3>" +
647
716
  "<div class='flc-progress-bar progress-bar'>" +
648
717
  "<div class='flc-progress-indicator progress-indicator'></div>" +
649
718
  "</div>" +
@@ -662,24 +731,54 @@ Fabulator.namespace('Exhibit');
662
731
  indexPut(that.ops, o, p, s);
663
732
  };
664
733
 
665
- for(i = 0, n = items.length; i < n; i++) {
666
- percent = (i * 100 / n);
734
+ n = items.length;
735
+ chunk_size = parseInt( n / 100 );
736
+ if(chunk_size > 200) {
737
+ chunk_size = 200;
738
+ }
739
+
740
+ f = function(start) {
741
+ var end, i;
742
+
743
+ end = start + chunk_size;
744
+ if( end > n ) { end = n; }
745
+
746
+ try {
747
+ for(i = start; i < end; i += 1 ) {
748
+ entry = items[i];
749
+ if( typeof(entry) == "object" ) {
750
+ that.loadItem(entry, indexTriple, baseURI);
751
+ }
752
+ }
753
+ }
754
+ catch(e) {
755
+ Exhibit.debug("loadItems failed: ", e);
756
+ }
757
+
758
+ percent = parseInt(i * 100 / n);
667
759
  if( percent > old_percent ) {
668
760
  old_percent = percent;
669
761
  progress.update(percent, percent + "% Complete");
670
762
  }
671
- entry = items[i];
672
- if( typeof(entry) == "object" ) {
673
- that.loadItem(entry, indexTriple, baseURI);
763
+ if( end < n ) {
764
+ setTimeout(function() {
765
+ f(end);
766
+ }, 0);
767
+ }
768
+ else {
769
+ progress.update(100, "100% Complete");
770
+ progress.hide();
771
+ setTimeout(function() {
772
+ that.events.onAfterLoadingItems.fire(that);
773
+ setTimeout(fn, 0);
774
+ }, 0);
674
775
  }
675
776
  }
676
- that.events.onAfterLoadingItems.fire(that);
777
+ f(0);
677
778
  }
678
779
  catch(e) {
679
780
  Exhibit.debug("loadItems failed: ", e);
680
781
  }
681
- progress.update(100, "100% Complete");
682
- progress.hide();
683
782
  };
684
783
 
685
784
  that.loadItem = function(item, indexFn, baseURI) {
@@ -53,6 +53,9 @@ Fabulator.namespace('Exhibit');
53
53
  var initDataView = function(that) {
54
54
  that.dataView = Exhibit.DataView({ source: that.options.source });
55
55
  that.dataView.events.onModelChange.addListener(that.eventModelChange);
56
+ if( "collection" in that ) {
57
+ that.dataView.events.onFilterItem.addListener( function(s,i) { return that.collection(s,i); } );
58
+ }
56
59
  that.registerFilter = function(filter) {
57
60
  that.dataView.registerFilter(filter);
58
61
  };
@@ -72,6 +75,74 @@ Fabulator.namespace('Exhibit');
72
75
  });
73
76
  };
74
77
 
78
+ var initCollections = function(that) {
79
+ that.collections = { };
80
+
81
+ $(that.container).children().each(function(idx, el) {
82
+ var id, filterFn, priorFilterFn, n;
83
+
84
+ if( $(el).attr('ex:role') == "exhibit-collection" ) {
85
+ id = $(el).attr('id');
86
+ types = $(el).attr('ex:itemTypes');
87
+ if(types) {
88
+ types = types.split(/,\s*/);
89
+
90
+ n = types.length;
91
+
92
+ filterFn = function(dataSource, itemID) {
93
+ var i, j, m, item = dataSource.getItem(itemID);
94
+ if( typeof(item.type) == "undefined" ) {
95
+ item.type = "Item";
96
+ }
97
+ if(typeof(item.type) == "string") {
98
+ for(i = 0; i < n; i += 1 ) {
99
+ if( item.type == types[i] ) {
100
+ return;
101
+ }
102
+ }
103
+ }
104
+ else {
105
+ m = item.type.length;
106
+ for( i = 0; i < n; i += 1 ) {
107
+ for( j = 0; j < m; j += 1 ) {
108
+ if( item.type[j] == types[i] ) {
109
+ return;
110
+ }
111
+ }
112
+ }
113
+ }
114
+ return false;
115
+ };
116
+
117
+ if( id != null && id != "" ) {
118
+ if( id in that.collections ) {
119
+ priorFilterFn = that.collections[id];
120
+ that.collections[id] = function(dataSource, itemID) {
121
+ if( filterFn(dataSource, itemID) !== false ) { return; }
122
+ return priorFilterFn(dataSource, itemID);
123
+ };
124
+ }
125
+ else {
126
+ that.collections[id] = filterFn;
127
+ }
128
+ }
129
+ else {
130
+ if( "collection" in that ) {
131
+ priorFilterFn = that.collection;
132
+ that.collection = function(dataSource, itemID) {
133
+ if( filterFn(dataSource, itemID) !== false ) { return; }
134
+ return priorFilterFn(dataSource, itemID);
135
+ };
136
+ }
137
+ else {
138
+ that.collection = filterFn;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ });
144
+ };
145
+
75
146
  Exhibit.ViewPanel = function(container, options) {
76
147
  var that = fluid.initView("Fabulator.Exhibit.ViewPanel", container, options),
77
148
  lenses = new Array(),
@@ -124,6 +195,8 @@ Fabulator.namespace('Exhibit');
124
195
  }
125
196
  }
126
197
 
198
+ initCollections(that);
199
+
127
200
  initDataView(that);
128
201
 
129
202
  initPresentationViews(that);
@@ -132,7 +205,6 @@ Fabulator.namespace('Exhibit');
132
205
 
133
206
  that.dataView.dataSource.fetchData();
134
207
 
135
-
136
208
  return that;
137
209
  };
138
210
  })(jQuery, Fabulator.Exhibit);
@@ -190,7 +190,7 @@
190
190
  };
191
191
 
192
192
  Exhibit.Expression.Collection = function(values, valueType) {
193
- var that = { };
193
+ var that = { valueType: valueType };
194
194
 
195
195
  if( values instanceof Array ) {
196
196
 
@@ -251,15 +251,23 @@
251
251
  */
252
252
 
253
253
  that.eventModelChange = function(model) {
254
- var template, cutpoints, tree, lens, i, n, item;
254
+ var template, cutpoints, tree, lens, i, n, item, start, end, items;
255
255
 
256
256
  $(body_container).empty();
257
- $(model.items()).each(function(idx, id) {
258
- item = model.getItem(id);
257
+
258
+ items = model.items();
259
+ n = items.length;
260
+ start = 0;
261
+ end = 20;
262
+ if( end > n ) {
263
+ end = n;
264
+ }
265
+ for( i = start; i < end; i += 1 ) {
266
+ item = model.getItem(items[i]);
259
267
  lens = that.getLens(item);
260
268
 
261
- $(lens.render(that, model, id)).appendTo($(body_container));
262
- });
269
+ $(lens.render(that, model, items[i])).appendTo($(body_container));
270
+ };
263
271
 
264
272
  $("<div class='clear'></div>").appendTo($(body_container));
265
273
  };
@@ -111,6 +111,17 @@
111
111
 
112
112
  .exhibit-progress-pop-up {
113
113
  position: absolute;
114
+ padding: 5px;
114
115
  right: 40%;
115
116
  top: 40%;
117
+ background: rgb(255,255,253);
118
+ background: rgba(255,255,253, 0.95);
119
+
120
+ border: 1px solid #cccccc;
121
+ }
122
+
123
+ .exhibit-lens-title {
124
+ background-color: #eeeeee;
125
+ font-weight: bold;
126
+ font-size: 110%;
116
127
  }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: radiant-fabulator_exhibit-extension
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - James Smith
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-06 00:00:00 +00:00
18
+ date: 2010-11-08 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -42,12 +42,12 @@ dependencies:
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- hash: 19
45
+ hash: 17
46
46
  segments:
47
47
  - 0
48
48
  - 0
49
- - 6
50
- version: 0.0.6
49
+ - 7
50
+ version: 0.0.7
51
51
  type: :runtime
52
52
  version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency