jqplot-rails 0.1 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/lib/jqplot-rails.rb +6 -4
  2. data/lib/jqplot-rails/railtie.rb +9 -0
  3. data/lib/jqplot-rails/view_helpers.rb +11 -0
  4. data/vendor/assets/javascripts/jqplot/excanvas.js +1438 -0
  5. data/vendor/assets/javascripts/jqplot/index.js +66 -0
  6. data/vendor/assets/javascripts/{jqplot.1.0.0b2_r792.js → jqplot/jquery.jqplot.js} +3458 -793
  7. data/vendor/assets/javascripts/jqplot/plugins/BezierCurveRenderer.js +313 -0
  8. data/vendor/assets/javascripts/jqplot/plugins/barRenderer.js +797 -0
  9. data/vendor/assets/javascripts/jqplot/plugins/blockRenderer.js +235 -0
  10. data/vendor/assets/javascripts/jqplot/plugins/bubbleRenderer.js +759 -0
  11. data/vendor/assets/javascripts/jqplot/plugins/canvasAxisLabelRenderer.js +203 -0
  12. data/vendor/assets/javascripts/jqplot/plugins/canvasAxisTickRenderer.js +243 -0
  13. data/vendor/assets/javascripts/jqplot/plugins/canvasOverlay.js +865 -0
  14. data/vendor/assets/javascripts/jqplot/plugins/canvasTextRenderer.js +449 -0
  15. data/vendor/assets/javascripts/jqplot/plugins/categoryAxisRenderer.js +673 -0
  16. data/vendor/assets/javascripts/jqplot/plugins/ciParser.js +116 -0
  17. data/vendor/assets/javascripts/jqplot/plugins/cursor.js +1108 -0
  18. data/vendor/assets/javascripts/jqplot/plugins/dateAxisRenderer.js +737 -0
  19. data/vendor/assets/javascripts/jqplot/plugins/donutRenderer.js +805 -0
  20. data/vendor/assets/javascripts/jqplot/plugins/dragable.js +225 -0
  21. data/vendor/assets/javascripts/jqplot/plugins/enhancedLegendRenderer.js +305 -0
  22. data/vendor/assets/javascripts/jqplot/plugins/funnelRenderer.js +943 -0
  23. data/vendor/assets/javascripts/jqplot/plugins/highlighter.js +465 -0
  24. data/vendor/assets/javascripts/jqplot/plugins/json2.js +475 -0
  25. data/vendor/assets/javascripts/jqplot/plugins/logAxisRenderer.js +529 -0
  26. data/vendor/assets/javascripts/jqplot/plugins/mekkoAxisRenderer.js +611 -0
  27. data/vendor/assets/javascripts/jqplot/plugins/mekkoRenderer.js +437 -0
  28. data/vendor/assets/javascripts/jqplot/plugins/meterGaugeRenderer.js +1030 -0
  29. data/vendor/assets/javascripts/jqplot/plugins/mobile.js +45 -0
  30. data/vendor/assets/javascripts/jqplot/plugins/ohlcRenderer.js +373 -0
  31. data/vendor/assets/javascripts/jqplot/plugins/pieRenderer.js +904 -0
  32. data/vendor/assets/javascripts/jqplot/plugins/pointLabels.js +379 -0
  33. data/vendor/assets/javascripts/jqplot/plugins/pyramidAxisRenderer.js +728 -0
  34. data/vendor/assets/javascripts/jqplot/plugins/pyramidGridRenderer.js +429 -0
  35. data/vendor/assets/javascripts/jqplot/plugins/pyramidRenderer.js +514 -0
  36. data/vendor/assets/javascripts/jqplot/plugins/trendline.js +223 -0
  37. data/vendor/assets/stylesheets/{jqplot.1.0.0b2_r792.css → jqplot.css} +48 -15
  38. metadata +64 -25
@@ -0,0 +1,223 @@
1
+ /**
2
+ * jqPlot
3
+ * Pure JavaScript plotting plugin using jQuery
4
+ *
5
+ * Version: 1.0.5
6
+ * Revision: 1122+
7
+ *
8
+ * Copyright (c) 2009-2013 Chris Leonello
9
+ * jqPlot is currently available for use in all personal or commercial projects
10
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
11
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
12
+ * choose the license that best suits your project and use it accordingly.
13
+ *
14
+ * Although not required, the author would appreciate an email letting him
15
+ * know of any substantial use of jqPlot. You can reach the author at:
16
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
17
+ *
18
+ * If you are feeling kind and generous, consider supporting the project by
19
+ * making a donation at: http://www.jqplot.com/donate.php .
20
+ *
21
+ * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
22
+ *
23
+ * version 2007.04.27
24
+ * author Ash Searle
25
+ * http://hexmen.com/blog/2007/03/printf-sprintf/
26
+ * http://hexmen.com/js/sprintf.js
27
+ * The author (Ash Searle) has placed this code in the public domain:
28
+ * "This code is unrestricted: you are free to use it however you like."
29
+ *
30
+ */
31
+ (function($) {
32
+
33
+ /**
34
+ * Class: $.jqplot.Trendline
35
+ * Plugin which will automatically compute and draw trendlines for plotted data.
36
+ */
37
+ $.jqplot.Trendline = function() {
38
+ // Group: Properties
39
+
40
+ // prop: show
41
+ // Wether or not to show the trend line.
42
+ this.show = $.jqplot.config.enablePlugins;
43
+ // prop: color
44
+ // CSS color spec for the trend line.
45
+ // By default this wil be the same color as the primary line.
46
+ this.color = '#666666';
47
+ // prop: renderer
48
+ // Renderer to use to draw the trend line.
49
+ // The data series that is plotted may not be rendered as a line.
50
+ // Therefore, we use our own line renderer here to draw a trend line.
51
+ this.renderer = new $.jqplot.LineRenderer();
52
+ // prop: rendererOptions
53
+ // Options to pass to the line renderer.
54
+ // By default, markers are not shown on trend lines.
55
+ this.rendererOptions = {marker:{show:false}};
56
+ // prop: label
57
+ // Label for the trend line to use in the legend.
58
+ this.label = '';
59
+ // prop: type
60
+ // Either 'exponential', 'exp', or 'linear'.
61
+ this.type = 'linear';
62
+ // prop: shadow
63
+ // true or false, wether or not to show the shadow.
64
+ this.shadow = true;
65
+ // prop: markerRenderer
66
+ // Renderer to use to draw markers on the line.
67
+ // I think this is wrong.
68
+ this.markerRenderer = {show:false};
69
+ // prop: lineWidth
70
+ // Width of the trend line.
71
+ this.lineWidth = 1.5;
72
+ // prop: shadowAngle
73
+ // Angle of the shadow on the trend line.
74
+ this.shadowAngle = 45;
75
+ // prop: shadowOffset
76
+ // pixel offset for each stroke of the shadow.
77
+ this.shadowOffset = 1.0;
78
+ // prop: shadowAlpha
79
+ // Alpha transparency of the shadow.
80
+ this.shadowAlpha = 0.07;
81
+ // prop: shadowDepth
82
+ // number of strokes to make of the shadow.
83
+ this.shadowDepth = 3;
84
+ this.isTrendline = true;
85
+
86
+ };
87
+
88
+ $.jqplot.postSeriesInitHooks.push(parseTrendLineOptions);
89
+ $.jqplot.postDrawSeriesHooks.push(drawTrendline);
90
+ $.jqplot.addLegendRowHooks.push(addTrendlineLegend);
91
+
92
+ // called witin scope of the legend object
93
+ // current series passed in
94
+ // must return null or an object {label:label, color:color}
95
+ function addTrendlineLegend(series) {
96
+ var ret = null;
97
+ if (series.trendline && series.trendline.show) {
98
+ var lt = series.trendline.label.toString();
99
+ if (lt) {
100
+ ret = {label:lt, color:series.trendline.color};
101
+ }
102
+ }
103
+ return ret;
104
+ }
105
+
106
+ // called within scope of a series
107
+ function parseTrendLineOptions (target, data, seriesDefaults, options, plot) {
108
+ if (this._type && (this._type === 'line' || this._type == 'bar')) {
109
+ this.trendline = new $.jqplot.Trendline();
110
+ options = options || {};
111
+ $.extend(true, this.trendline, {color:this.color}, seriesDefaults.trendline, options.trendline);
112
+ this.trendline.renderer.init.call(this.trendline, null);
113
+ }
114
+ }
115
+
116
+ // called within scope of series object
117
+ function drawTrendline(sctx, options) {
118
+ // if we have options, merge trendline options in with precedence
119
+ options = $.extend(true, {}, this.trendline, options);
120
+
121
+ if (this.trendline && options.show) {
122
+ var fit;
123
+ // this.renderer.setGridData.call(this);
124
+ var data = options.data || this.data;
125
+ fit = fitData(data, this.trendline.type);
126
+ var gridData = options.gridData || this.renderer.makeGridData.call(this, fit.data);
127
+ this.trendline.renderer.draw.call(this.trendline, sctx, gridData, {showLine:true, shadow:this.trendline.shadow});
128
+ }
129
+ }
130
+
131
+ function regression(x, y, typ) {
132
+ var type = (typ == null) ? 'linear' : typ;
133
+ var N = x.length;
134
+ var slope;
135
+ var intercept;
136
+ var SX = 0;
137
+ var SY = 0;
138
+ var SXX = 0;
139
+ var SXY = 0;
140
+ var SYY = 0;
141
+ var Y = [];
142
+ var X = [];
143
+
144
+ if (type == 'linear') {
145
+ X = x;
146
+ Y = y;
147
+ }
148
+ else if (type == 'exp' || type == 'exponential') {
149
+ for ( var i=0; i<y.length; i++) {
150
+ // ignore points <= 0, log undefined.
151
+ if (y[i] <= 0) {
152
+ N--;
153
+ }
154
+ else {
155
+ X.push(x[i]);
156
+ Y.push(Math.log(y[i]));
157
+ }
158
+ }
159
+ }
160
+
161
+ for ( var i = 0; i < N; i++) {
162
+ SX = SX + X[i];
163
+ SY = SY + Y[i];
164
+ SXY = SXY + X[i]* Y[i];
165
+ SXX = SXX + X[i]* X[i];
166
+ SYY = SYY + Y[i]* Y[i];
167
+ }
168
+
169
+ slope = (N*SXY - SX*SY)/(N*SXX - SX*SX);
170
+ intercept = (SY - slope*SX)/N;
171
+
172
+ return [slope, intercept];
173
+ }
174
+
175
+ function linearRegression(X,Y) {
176
+ var ret;
177
+ ret = regression(X,Y,'linear');
178
+ return [ret[0],ret[1]];
179
+ }
180
+
181
+ function expRegression(X,Y) {
182
+ var ret;
183
+ var x = X;
184
+ var y = Y;
185
+ ret = regression(x, y,'exp');
186
+ var base = Math.exp(ret[0]);
187
+ var coeff = Math.exp(ret[1]);
188
+ return [base, coeff];
189
+ }
190
+
191
+ function fitData(data, typ) {
192
+ var type = (typ == null) ? 'linear' : typ;
193
+ var ret;
194
+ var res;
195
+ var x = [];
196
+ var y = [];
197
+ var ypred = [];
198
+
199
+ for (i=0; i<data.length; i++){
200
+ if (data[i] != null && data[i][0] != null && data[i][1] != null) {
201
+ x.push(data[i][0]);
202
+ y.push(data[i][1]);
203
+ }
204
+ }
205
+
206
+ if (type == 'linear') {
207
+ ret = linearRegression(x,y);
208
+ for ( var i=0; i<x.length; i++){
209
+ res = ret[0]*x[i] + ret[1];
210
+ ypred.push([x[i], res]);
211
+ }
212
+ }
213
+ else if (type == 'exp' || type == 'exponential') {
214
+ ret = expRegression(x,y);
215
+ for ( var i=0; i<x.length; i++){
216
+ res = ret[1]*Math.pow(ret[0],x[i]);
217
+ ypred.push([x[i], res]);
218
+ }
219
+ }
220
+ return {data: ypred, slope: ret[0], intercept: ret[1]};
221
+ }
222
+
223
+ })(jQuery);
@@ -25,14 +25,15 @@
25
25
  margin-right: 10px;
26
26
  }
27
27
 
28
- .jqplot-y2axis, .jqplot-y3axis, .jqplot-y4axis, .jqplot-y5axis, .jqplot-y6axis, .jqplot-y7axis, .jqplot-y8axis, .jqplot-y9axis {
28
+ .jqplot-y2axis, .jqplot-y3axis, .jqplot-y4axis, .jqplot-y5axis, .jqplot-y6axis, .jqplot-y7axis, .jqplot-y8axis, .jqplot-y9axis, .jqplot-yMidAxis {
29
29
  margin-left: 10px;
30
30
  margin-right: 10px;
31
31
  }
32
32
 
33
33
  /*rules applied to all axis tick divs*/
34
- .jqplot-axis-tick, .jqplot-xaxis-tick, .jqplot-yaxis-tick, .jqplot-x2axis-tick, .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick {
34
+ .jqplot-axis-tick, .jqplot-xaxis-tick, .jqplot-yaxis-tick, .jqplot-x2axis-tick, .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick, .jqplot-yMidAxis-tick {
35
35
  position: absolute;
36
+ white-space: pre;
36
37
  }
37
38
 
38
39
 
@@ -78,15 +79,11 @@
78
79
  text-align: left;
79
80
  }
80
81
 
81
- .jqplot-meterGauge-tick {
82
- font-size: 0.75em;
83
- color: #999999;
82
+ .jqplot-yMidAxis-tick {
83
+ text-align: center;
84
+ white-space: nowrap;
84
85
  }
85
86
 
86
- .jqplot-meterGauge-label {
87
- font-size: 1em;
88
- color: #999999;
89
- }
90
87
  .jqplot-xaxis-label {
91
88
  margin-top: 10px;
92
89
  font-size: 11pt;
@@ -106,12 +103,28 @@
106
103
  position: absolute;
107
104
  }
108
105
 
106
+ .jqplot-yMidAxis-label {
107
+ font-size: 11pt;
108
+ position: absolute;
109
+ }
110
+
109
111
  .jqplot-y2axis-label, .jqplot-y3axis-label, .jqplot-y4axis-label, .jqplot-y5axis-label, .jqplot-y6axis-label, .jqplot-y7axis-label, .jqplot-y8axis-label, .jqplot-y9axis-label {
110
112
  /* text-align: center;*/
111
113
  font-size: 11pt;
114
+ margin-left: 10px;
112
115
  position: absolute;
113
116
  }
114
117
 
118
+ .jqplot-meterGauge-tick {
119
+ font-size: 0.75em;
120
+ color: #999999;
121
+ }
122
+
123
+ .jqplot-meterGauge-label {
124
+ font-size: 1em;
125
+ color: #999999;
126
+ }
127
+
115
128
  table.jqplot-table-legend {
116
129
  margin-top: 12px;
117
130
  margin-bottom: 12px;
@@ -130,11 +143,31 @@ td.jqplot-table-legend {
130
143
  vertical-align:middle;
131
144
  }
132
145
 
146
+ /*
147
+ These rules could be used instead of assigning
148
+ element styles and relying on js object properties.
149
+ */
150
+
151
+ /*
152
+ td.jqplot-table-legend-swatch {
153
+ padding-top: 0.5em;
154
+ text-align: center;
155
+ }
156
+
157
+ tr.jqplot-table-legend:first td.jqplot-table-legend-swatch {
158
+ padding-top: 0px;
159
+ }
160
+ */
161
+
133
162
  td.jqplot-seriesToggle:hover, td.jqplot-seriesToggle:active {
134
163
  cursor: pointer;
135
164
  }
136
165
 
137
- td.jqplot-table-legend > div {
166
+ .jqplot-table-legend .jqplot-series-hidden {
167
+ text-decoration: line-through;
168
+ }
169
+
170
+ div.jqplot-table-legend-swatch-outline {
138
171
  border: 1px solid #cccccc;
139
172
  padding:1px;
140
173
  }
@@ -173,7 +206,7 @@ table.jqplot-cursor-tooltip {
173
206
  padding: 1px;
174
207
  }
175
208
 
176
- .jqplot-highlighter-tooltip {
209
+ .jqplot-highlighter-tooltip, .jqplot-canvasOverlay-tooltip {
177
210
  border: 1px solid #cccccc;
178
211
  font-size: 0.75em;
179
212
  white-space: nowrap;
@@ -187,13 +220,13 @@ table.jqplot-cursor-tooltip {
187
220
  }
188
221
 
189
222
  td.jqplot-cursor-legend-swatch {
190
- vertical-align:middle;
191
- text-align:center;
223
+ vertical-align: middle;
224
+ text-align: center;
192
225
  }
193
226
 
194
227
  div.jqplot-cursor-legend-swatch {
195
- width:1.2em;
196
- height:0.7em;
228
+ width: 1.2em;
229
+ height: 0.7em;
197
230
  }
198
231
 
199
232
  .jqplot-error {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jqplot-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.3'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,52 +9,56 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-13 00:00:00.000000000Z
12
+ date: 2013-02-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
16
- requirement: &70262076144820 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: '3.0'
21
+ version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70262076144820
25
- - !ruby/object:Gem::Dependency
26
- name: thor
27
- requirement: &70262076144240 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
28
25
  none: false
29
26
  requirements:
30
- - - ~>
27
+ - - ! '>='
31
28
  - !ruby/object:Gem::Version
32
- version: '0.14'
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: *70262076144240
29
+ version: '0'
36
30
  - !ruby/object:Gem::Dependency
37
31
  name: bundler
38
- requirement: &70262076143240 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
39
33
  none: false
40
34
  requirements:
41
- - - ~>
35
+ - - ! '>='
42
36
  - !ruby/object:Gem::Version
43
- version: 1.0.0
37
+ version: '0'
44
38
  type: :development
45
39
  prerelease: false
46
- version_requirements: *70262076143240
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
47
46
  - !ruby/object:Gem::Dependency
48
47
  name: rails
49
- requirement: &70262076142060 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
50
49
  none: false
51
50
  requirements:
52
- - - ~>
51
+ - - ! '>='
53
52
  - !ruby/object:Gem::Version
54
- version: '3.0'
53
+ version: '0'
55
54
  type: :development
56
55
  prerelease: false
57
- version_requirements: *70262076142060
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
58
62
  description: JqPlot for Rails 3.1 asset pipeline
59
63
  email:
60
64
  - matt@eightbitraptor.com
@@ -62,9 +66,43 @@ executables: []
62
66
  extensions: []
63
67
  extra_rdoc_files: []
64
68
  files:
65
- - vendor/assets/javascripts/jqplot.1.0.0b2_r792.js
66
- - vendor/assets/stylesheets/jqplot.1.0.0b2_r792.css
69
+ - vendor/assets/stylesheets/jqplot.css
70
+ - vendor/assets/javascripts/jqplot/index.js
71
+ - vendor/assets/javascripts/jqplot/jquery.jqplot.js
72
+ - vendor/assets/javascripts/jqplot/excanvas.js
73
+ - vendor/assets/javascripts/jqplot/plugins/trendline.js
74
+ - vendor/assets/javascripts/jqplot/plugins/dragable.js
75
+ - vendor/assets/javascripts/jqplot/plugins/mobile.js
76
+ - vendor/assets/javascripts/jqplot/plugins/canvasOverlay.js
77
+ - vendor/assets/javascripts/jqplot/plugins/BezierCurveRenderer.js
78
+ - vendor/assets/javascripts/jqplot/plugins/dateAxisRenderer.js
79
+ - vendor/assets/javascripts/jqplot/plugins/json2.js
80
+ - vendor/assets/javascripts/jqplot/plugins/cursor.js
81
+ - vendor/assets/javascripts/jqplot/plugins/barRenderer.js
82
+ - vendor/assets/javascripts/jqplot/plugins/categoryAxisRenderer.js
83
+ - vendor/assets/javascripts/jqplot/plugins/canvasAxisLabelRenderer.js
84
+ - vendor/assets/javascripts/jqplot/plugins/mekkoRenderer.js
85
+ - vendor/assets/javascripts/jqplot/plugins/canvasTextRenderer.js
86
+ - vendor/assets/javascripts/jqplot/plugins/funnelRenderer.js
87
+ - vendor/assets/javascripts/jqplot/plugins/blockRenderer.js
88
+ - vendor/assets/javascripts/jqplot/plugins/meterGaugeRenderer.js
89
+ - vendor/assets/javascripts/jqplot/plugins/enhancedLegendRenderer.js
90
+ - vendor/assets/javascripts/jqplot/plugins/mekkoAxisRenderer.js
91
+ - vendor/assets/javascripts/jqplot/plugins/pointLabels.js
92
+ - vendor/assets/javascripts/jqplot/plugins/logAxisRenderer.js
93
+ - vendor/assets/javascripts/jqplot/plugins/pyramidAxisRenderer.js
94
+ - vendor/assets/javascripts/jqplot/plugins/pyramidGridRenderer.js
95
+ - vendor/assets/javascripts/jqplot/plugins/ohlcRenderer.js
96
+ - vendor/assets/javascripts/jqplot/plugins/pyramidRenderer.js
97
+ - vendor/assets/javascripts/jqplot/plugins/highlighter.js
98
+ - vendor/assets/javascripts/jqplot/plugins/pieRenderer.js
99
+ - vendor/assets/javascripts/jqplot/plugins/donutRenderer.js
100
+ - vendor/assets/javascripts/jqplot/plugins/ciParser.js
101
+ - vendor/assets/javascripts/jqplot/plugins/canvasAxisTickRenderer.js
102
+ - vendor/assets/javascripts/jqplot/plugins/bubbleRenderer.js
67
103
  - lib/jqplot-rails.rb
104
+ - lib/jqplot-rails/view_helpers.rb
105
+ - lib/jqplot-rails/railtie.rb
68
106
  homepage:
69
107
  licenses: []
70
108
  post_install_message:
@@ -85,8 +123,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
123
  version: '0'
86
124
  requirements: []
87
125
  rubyforge_project:
88
- rubygems_version: 1.8.10
126
+ rubygems_version: 1.8.24
89
127
  signing_key:
90
128
  specification_version: 3
91
129
  summary: JqPlot for Rails 3.1 asset pipeline
92
130
  test_files: []
131
+ has_rdoc: