errand 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -47,10 +47,16 @@ Otherwise, simply run:
47
47
  This should build a library named `rrd.so` in the current directory. If it
48
48
  doesn't, please report bugs at [http://github.com/eric/rubyrrdtool/issues](http://github.com/eric/rubyrrdtool/issues)!
49
49
 
50
- Building gem
51
- ============
50
+ Building the gem
51
+ ================
52
+
53
+ Errand is managed by Jeweller, which generates the gemspec for you:
54
+
55
+ rake gemspec
56
+
57
+ Once the gemspec is generated, build the gem:
52
58
 
53
- gem build errand.gemspec
59
+ gem build errand.gemspec
54
60
 
55
61
  Testing
56
62
  =======
data/Rakefile CHANGED
@@ -9,7 +9,6 @@ begin
9
9
  gemspec.email = "lindsay@holmwood.id.au"
10
10
  gemspec.homepage = "http://auxesis.github.com/errand"
11
11
  gemspec.authors = ["Lindsay Holmwood"]
12
- gemspec.extensions = ["extconf.rb"]
13
12
  end
14
13
  rescue LoadError
15
14
  puts "Jeweler not available. Install it with: gem install jeweler"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.7.1
@@ -1,13 +1,36 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $: << File.expand_path(File.join(File.dirname(__FILE__), '..'))
4
- require 'errand_backend'
3
+ # Attempt to load the native RRD library provided by the operating system.
4
+ begin
5
+ # Ruby Enterprise Edition will try to load everything from /usr/local/lib/ruby.
6
+ # As the distribution generally installs the RRD bindings in /usr/lib/ruby, we
7
+ # have to explicitly hack the load path so REE knows where to find the Ruby
8
+ # RRD bindings.
9
+ case RUBY_VERSION[/^1\.\d/]
10
+ when /^1\.8/
11
+ version = "1.8"
12
+ when /^1\.9/
13
+ version = RUBY_VERSION
14
+ end
15
+
16
+ %w(i386 i486).each do |arch|
17
+ $: << "/usr/lib/ruby/#{version}/#{arch}-linux"
18
+ end
19
+
20
+ require 'RRD'
21
+ rescue LoadError
22
+ exit 1
23
+ end
24
+
25
+ # Errand:
26
+ # Wraps the RRD Ruby library provided by your distribution's package manager,
27
+ # exposing a more Ruby-like and accessible interface.
5
28
 
6
29
  class Errand
7
30
  def initialize(opts={})
8
31
  raise ArgumentError unless opts[:filename]
9
32
  @filename = opts[:filename]
10
- @backend = ::ErrandBackend
33
+ @backend = ::RRD
11
34
  end
12
35
 
13
36
  def dump(opts={})
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: errand
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lindsay Holmwood
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-22 00:00:00 +13:00
12
+ date: 2010-02-22 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -17,8 +17,8 @@ description: Errand provides Ruby bindings for RRD functions (via librrd), and a
17
17
  email: lindsay@holmwood.id.au
18
18
  executables: []
19
19
 
20
- extensions:
21
- - extconf.rb
20
+ extensions: []
21
+
22
22
  extra_rdoc_files:
23
23
  - README.md
24
24
  files:
@@ -28,11 +28,7 @@ files:
28
28
  - README.md
29
29
  - Rakefile
30
30
  - VERSION
31
- - extconf.rb
32
31
  - lib/errand.rb
33
- - lib/graph.rb
34
- - rrd_info.h
35
- - rrdtool_main.c
36
32
  - spec/errand_spec.rb
37
33
  - spec/spec.opts
38
34
  - test/test_rrdtool.rb
data/extconf.rb DELETED
@@ -1,30 +0,0 @@
1
- # $Id: extconf.rb,v 1.4 2008/03/11 22:47:06 dbach Exp $
2
-
3
- require 'mkmf'
4
-
5
- # If there are build errors, be sure to say where your rrdtool lives:
6
- #
7
- # ruby ./extconf.rb --with-rrd-dir=/usr/local/rrdtool-1.2.12
8
-
9
- libpaths=%w(/lib /usr/lib /usr/local/lib /sw/lib /opt/local/lib)
10
- %w(art_lgpl_2 freetype png z).sort.reverse.each do |lib|
11
- find_library(lib, nil, *libpaths)
12
- end
13
-
14
- dir_config("rrd")
15
- # rrd_first is only defined rrdtool >= 1.2.x
16
- have_library("rrd", "rrd_first")
17
-
18
- # rrd_dump_r has 2nd arg in rrdtool >= 1.2.14
19
- if try_link(<<EOF)
20
- #include <rrd.h>
21
- main()
22
- {
23
- rrd_dump_r("/dev/null", NULL);
24
- }
25
- EOF
26
- $CFLAGS += " -DHAVE_RRD_DUMP_R_2"
27
- end
28
-
29
- create_makefile("errand_backend")
30
-
@@ -1,75 +0,0 @@
1
- #
2
- # ideas for a graphing DSL
3
- #
4
-
5
- module RRDtool
6
-
7
- # Simple Ruby object to generate the RRD graph parameters
8
- #
9
- class Graph
10
-
11
- # Graph attributes can appear in any order
12
- attr :image_file, :image_format
13
- attr :title
14
- attr :vertical_label
15
-
16
- attr :width, :height
17
- attr :start, :duration, :step
18
- attr :upper_limit, :lower_limit
19
-
20
- # LATER: there are lots of other RRDtool graph attributes
21
-
22
- def initialize
23
- @graph_command = []
24
- end
25
-
26
- #
27
- # The graph commands must be preserved in order
28
- #
29
-
30
- # Create a DEF
31
- def fetch(name, rrd_file, value, type)
32
- # format: DEF:name=rrd_file:value:type
33
- @graph_command << "DEF:#{name}=#{rrd_file}:#{value}:#{type}"
34
- end
35
-
36
- # Create a CDEF
37
- def compute(name, expr)
38
- # format: CDEF:name=expr
39
- @graph_command << "CDEF:#{name}=#{expr}"
40
- end
41
-
42
- # Create GPRINT
43
- def gprint(name, type, print_expr)
44
- # format: GPRINTF:name:type:print_expr
45
- @graph_command << "GPRINTF:#{name}:#{type}:#{print_expr}"
46
- end
47
-
48
- # Create a LINE(1,2,...)
49
- def line(name, width, color, label)
50
- # format: LINEwidth:name#color:label
51
- @graph_command << "LINE#{width}:#{name}##{color}:#{label}"
52
- end
53
-
54
- # Create a AREA
55
- def area(name, color)
56
- # format: AREA:name#color
57
- @graph_command << "AREA:#{name}##{color}"
58
- end
59
-
60
- # Create a STACK
61
- def stack(name, color)
62
- # format: STACK:name#color
63
- @graph_command << "STACK:#{name}##{color}"
64
- end
65
-
66
- # Turn the graph definition into a real image
67
- def publish
68
- # LATER: add in the graph attributes --
69
- # i.e., turn the graph attribute hash into an array of [ '--key', 'value', ...]
70
- RRDtool.graph @graph_command
71
- end
72
-
73
- end
74
-
75
- end
data/rrd_info.h DELETED
@@ -1,47 +0,0 @@
1
- /* -*- C -*-
2
- * file: rrd_info.h
3
- * date: $Date: 2008/03/11 22:47:06 $
4
- * init: 2005-07-26
5
- * vers: $Version$
6
- * auth: $Author: dbach $
7
- * -----
8
- *
9
- * Support file to add rrd_info() to rrd.h
10
- *
11
- */
12
- #ifndef __RRD_INFO_H
13
- #define __RRD_INFO_H
14
-
15
- #if defined(__cplusplus) || defined(c_plusplus)
16
- extern "C" {
17
- #endif
18
-
19
- /* rrd info interface
20
- enum info_type { RD_I_VAL=0,
21
- RD_I_CNT,
22
- RD_I_STR,
23
- RD_I_INT };
24
- */
25
-
26
- typedef union infoval {
27
- unsigned long u_cnt;
28
- rrd_value_t u_val;
29
- char *u_str;
30
- int u_int;
31
- } infoval;
32
-
33
- typedef struct info_t {
34
- char *key;
35
- rrd_info_type_t type;
36
- union infoval value;
37
- struct info_t *next;
38
- } info_t;
39
-
40
- //info_t *rrd_info(int, char **);
41
-
42
-
43
-
44
- #if defined(__cplusplus) || defined(c_plusplus)
45
- }
46
- #endif
47
- #endif /* __RRD_INFO_H */
@@ -1,260 +0,0 @@
1
- /* $Id: rrdtool_main.c,v 1.1 2008/03/11 22:47:06 dbach Exp $
2
- * Substantial penalty for early withdrawal.
3
- */
4
-
5
- #include <unistd.h>
6
- #include <math.h> /* for isnan */
7
- #include <ruby.h>
8
- #include <rrd.h>
9
- #include "rrd_info.h"
10
-
11
- typedef struct string_arr_t {
12
- int len;
13
- char **strings;
14
- } string_arr;
15
-
16
- VALUE mRRD;
17
- VALUE rb_eRRDError;
18
-
19
- typedef int (*RRDFUNC)(int argc, char ** argv);
20
- #define RRD_CHECK_ERROR \
21
- if (rrd_test_error()) \
22
- rb_raise(rb_eRRDError, rrd_get_error()); \
23
- rrd_clear_error();
24
-
25
- string_arr string_arr_new(VALUE rb_strings)
26
- {
27
- string_arr a;
28
- char buf[64];
29
- int i;
30
-
31
- Check_Type(rb_strings, T_ARRAY);
32
- a.len = RARRAY_LEN(rb_strings) + 1;
33
-
34
- a.strings = malloc(a.len * sizeof(char *));
35
- a.strings[0] = "dummy"; /* first element is a dummy element */
36
-
37
- for (i = 0; i < a.len - 1; i++) {
38
- VALUE v = rb_ary_entry(rb_strings, i);
39
- switch (TYPE(v)) {
40
- case T_STRING:
41
- a.strings[i + 1] = strdup(STR2CSTR(v));
42
- break;
43
- case T_FIXNUM:
44
- snprintf(buf, 63, "%d", FIX2INT(v));
45
- a.strings[i + 1] = strdup(buf);
46
- break;
47
- default:
48
- rb_raise(rb_eTypeError, "invalid argument - %s, expected T_STRING or T_FIXNUM on index %d", rb_class2name(CLASS_OF(v)), i);
49
- break;
50
- }
51
- }
52
-
53
- return a;
54
- }
55
-
56
- void string_arr_delete(string_arr a)
57
- {
58
- int i;
59
-
60
- /* skip dummy first entry */
61
- for (i = 1; i < a.len; i++) {
62
- free(a.strings[i]);
63
- }
64
-
65
- free(a.strings);
66
- }
67
-
68
- void reset_rrd_state()
69
- {
70
- optind = 0;
71
- opterr = 0;
72
- rrd_clear_error();
73
- }
74
-
75
- VALUE rrd_call(RRDFUNC func, VALUE args)
76
- {
77
- string_arr a;
78
-
79
- a = string_arr_new(args);
80
- reset_rrd_state();
81
- func(a.len, a.strings);
82
- string_arr_delete(a);
83
-
84
- RRD_CHECK_ERROR
85
-
86
- return Qnil;
87
- }
88
-
89
- VALUE rb_rrd_create(VALUE self, VALUE args)
90
- {
91
- return rrd_call(rrd_create, args);
92
- }
93
-
94
- VALUE rb_rrd_dump(VALUE self, VALUE args)
95
- {
96
- return rrd_call(rrd_dump, args);
97
- }
98
-
99
- VALUE rb_rrd_fetch(VALUE self, VALUE args)
100
- {
101
- string_arr a;
102
- unsigned long i, j, k, step, ds_cnt;
103
- rrd_value_t *raw_data;
104
- char **raw_names;
105
- VALUE data, names, result;
106
- time_t start, end;
107
-
108
- a = string_arr_new(args);
109
- reset_rrd_state();
110
- rrd_fetch(a.len, a.strings, &start, &end, &step, &ds_cnt, &raw_names, &raw_data);
111
- string_arr_delete(a);
112
-
113
- RRD_CHECK_ERROR
114
-
115
- names = rb_ary_new();
116
- for (i = 0; i < ds_cnt; i++) {
117
- rb_ary_push(names, rb_str_new2(raw_names[i]));
118
- free(raw_names[i]);
119
- }
120
- free(raw_names);
121
-
122
- k = 0;
123
- data = rb_ary_new();
124
- for (i = start; i < end; i += step) {
125
- VALUE line = rb_ary_new2(ds_cnt);
126
- for (j = 0; j < ds_cnt; j++) {
127
- rb_ary_store(line, j, rb_float_new(raw_data[k]));
128
- k++;
129
- }
130
- rb_ary_push(data, line);
131
- }
132
- free(raw_data);
133
-
134
- result = rb_ary_new2(4);
135
- rb_ary_store(result, 0, INT2NUM(start));
136
- rb_ary_store(result, 1, INT2NUM(end));
137
- rb_ary_store(result, 2, names);
138
- rb_ary_store(result, 3, data);
139
- return result;
140
- }
141
-
142
- VALUE rb_rrd_graph(VALUE self, VALUE args)
143
- {
144
- string_arr a;
145
- char **calcpr, **p;
146
- VALUE result, print_results;
147
- int xsize, ysize;
148
- double ymin, ymax;
149
-
150
- a = string_arr_new(args);
151
- reset_rrd_state();
152
- rrd_graph(a.len, a.strings, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax);
153
- string_arr_delete(a);
154
-
155
- RRD_CHECK_ERROR
156
-
157
- result = rb_ary_new2(3);
158
- print_results = rb_ary_new();
159
- p = calcpr;
160
- for (p = calcpr; p && *p; p++) {
161
- rb_ary_push(print_results, rb_str_new2(*p));
162
- free(*p);
163
- }
164
- free(calcpr);
165
- rb_ary_store(result, 0, print_results);
166
- rb_ary_store(result, 1, INT2FIX(xsize));
167
- rb_ary_store(result, 2, INT2FIX(ysize));
168
- return result;
169
- }
170
-
171
- VALUE rb_rrd_info(VALUE self, VALUE args)
172
- {
173
- string_arr a;
174
- info_t *p, *data;
175
- VALUE result;
176
-
177
- a = string_arr_new(args);
178
- data = rrd_info(a.len, a.strings);
179
- string_arr_delete(a);
180
-
181
- RRD_CHECK_ERROR
182
-
183
- result = rb_hash_new();
184
- while (data) {
185
- VALUE key = rb_str_new2(data->key);
186
- switch (data->type) {
187
- case RD_I_VAL:
188
- if (isnan(data->value.u_val)) {
189
- rb_hash_aset(result, key, Qnil);
190
- }
191
- else {
192
- rb_hash_aset(result, key, rb_float_new(data->value.u_val));
193
- }
194
- break;
195
- case RD_I_CNT:
196
- rb_hash_aset(result, key, INT2FIX(data->value.u_cnt));
197
- break;
198
- case RD_I_STR:
199
- rb_hash_aset(result, key, rb_str_new2(data->value.u_str));
200
- free(data->value.u_str);
201
- break;
202
- }
203
- p = data;
204
- data = data->next;
205
- free(p);
206
- }
207
- return result;
208
- }
209
-
210
- VALUE rb_rrd_last(VALUE self, VALUE args)
211
- {
212
- string_arr a;
213
- time_t last;
214
-
215
- a = string_arr_new(args);
216
- reset_rrd_state();
217
- last = rrd_last(a.len, a.strings);
218
- string_arr_delete(a);
219
-
220
- RRD_CHECK_ERROR
221
-
222
- return rb_funcall(rb_cTime, rb_intern("at"), 1, INT2FIX(last));
223
- }
224
-
225
- VALUE rb_rrd_resize(VALUE self, VALUE args)
226
- {
227
- return rrd_call(rrd_resize, args);
228
- }
229
-
230
- VALUE rb_rrd_restore(VALUE self, VALUE args)
231
- {
232
- return rrd_call(rrd_restore, args);
233
- }
234
-
235
- VALUE rb_rrd_tune(VALUE self, VALUE args)
236
- {
237
- return rrd_call(rrd_tune, args);
238
- }
239
-
240
- VALUE rb_rrd_update(VALUE self, VALUE args)
241
- {
242
- return rrd_call(rrd_update, args);
243
- }
244
-
245
- void Init_errand_backend()
246
- {
247
- mRRD = rb_define_module("ErrandBackend");
248
- rb_eRRDError = rb_define_class("ErrandError", rb_eStandardError);
249
-
250
- rb_define_module_function(mRRD, "create", rb_rrd_create, -2);
251
- rb_define_module_function(mRRD, "dump", rb_rrd_dump, -2);
252
- rb_define_module_function(mRRD, "fetch", rb_rrd_fetch, -2);
253
- rb_define_module_function(mRRD, "graph", rb_rrd_graph, -2);
254
- rb_define_module_function(mRRD, "last", rb_rrd_last, -2);
255
- rb_define_module_function(mRRD, "resize", rb_rrd_resize, -2);
256
- rb_define_module_function(mRRD, "restore", rb_rrd_restore, -2);
257
- rb_define_module_function(mRRD, "tune", rb_rrd_tune, -2);
258
- rb_define_module_function(mRRD, "update", rb_rrd_update, -2);
259
- rb_define_module_function(mRRD, "info", rb_rrd_info, -2);
260
- }