rrd-ffi 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  *.png
3
3
  pkg
4
4
  doc
5
+ coverage
@@ -1,15 +1,26 @@
1
1
  = Changelog
2
2
 
3
- == 2010-02-25
3
+ == TODO: version 0.2.2
4
+
5
+ * TODO: bang methods to base
6
+ * TODO: Improve documentation
7
+ * TODO: add more rrd functions (dump, tune, xport, resize)
8
+
9
+ == 2010-03-01 version 0.2.1
10
+
11
+ * Added bang methods to wrapper
12
+ * Added error method to wrapper
13
+
14
+ == 2010-02-25 version 0.2.0
4
15
 
5
16
  * Fixed error message to be cleared before every call to wrapper. It was causing problems when doing a valid call after an invalid one
6
17
  * Added advanced DSL for graphic building
7
18
  * Added DSL for creating RRD file
8
19
  * Added to RRD::Base methods create, update, fetch, info
20
+ * Released
9
21
 
10
- == 2010-02-24
22
+ == 2010-02-24 version 0.1.0
11
23
 
12
- * Released version 0.1.0
13
24
  * Basic DSL for graphic building
14
25
  * Added to RRD::Base methods first, last, restore
15
26
  * Added bindings to librrd through RRD::Wrapper - create, update, fetch, info, first, last, restore, graph
@@ -4,7 +4,9 @@ rrd-ffi is a gem for using rrd actions in your ruby code.
4
4
 
5
5
  You may use it in the raw format, as many rrd libs in languages like perl or python, or you can use it through the dsl we provide.
6
6
 
7
- rrd-ffi uses ffi to wrap the librrd C bindings, not system calls
7
+ rrd-ffi uses ffi to wrap the librrd C bindings, not system calls.
8
+
9
+ IMPORTANT: You need librrd installed in your system for this gem to work
8
10
 
9
11
  = Basics
10
12
 
@@ -12,11 +14,13 @@ Here's what you need to know before starting.
12
14
 
13
15
  == Installation
14
16
 
17
+ === Notes
18
+
15
19
  To install rrd-ffi, you will need to have librrd in your system.
16
20
 
17
21
  Then, run <tt>sudo gem install rrd-ffi</tt>
18
22
 
19
- If you are using Mac Ports you will have problems, so add the following to your .profile/.bashrc/.bash_profile file:
23
+ If you are using Mac Ports you will have problems, so add the following to your .profile|.bashrc|.bash_profile file:
20
24
 
21
25
  export RRD_LIB=/opt/local/lib/librrd.dylib
22
26
 
@@ -26,11 +30,19 @@ or
26
30
 
27
31
  If you are not using MAC OS and still have problems, export the RRD_PATH variable with the path to your librrd file.
28
32
 
33
+ === Installing librrd
34
+
35
+ Debian/Ubuntu: <tt>apt-get install librrd-dev</tt>
36
+
37
+ Fedora/Red Hat: <tt>yum install rrdtool-devel</tt>
38
+
39
+ Mac: <tt>port install rrdtool</tt>
40
+
29
41
  == Example Usage
30
42
  require "rrd"
31
43
  rrd = RRD::Base.new("myrrd.rrd")
32
44
  # Restoring a rrd file from xml
33
- rrd.restore("myrrd.xml")
45
+ rrd.restore("myrrd.xml", :overwrite => true)
34
46
 
35
47
  # Fetching data from rrd
36
48
  rrd.fetch(:average).each {|line| puts line.inspect}
@@ -45,6 +57,10 @@ If you are not using MAC OS and still have problems, export the RRD_PATH variabl
45
57
  puts rrd.starts_at
46
58
  puts rrd.ends_at
47
59
 
60
+ # Error handling
61
+ rrd.fetch(:unknown_function) # should return false
62
+ puts rrd.error
63
+
48
64
  === DSLs
49
65
 
50
66
  # Creating a new rrd
@@ -74,11 +90,31 @@ If you are not using MAC OS and still have problems, export the RRD_PATH variabl
74
90
 
75
91
  == Raw API Usage
76
92
 
93
+ Normal methods return false on error, or the expected result otherwise.
94
+
95
+ Bang methods raise exception on error.
96
+
97
+ # Restoring a rrd file from xml
98
+ RRD::Wrapper.restore "myrrd.xml", "myrrd.rrd"
99
+
77
100
  # Creating a rrd file
78
101
  RRD::Wrapper.create "myrrd.rrd", "--step", "300", "DS:ifOutOctets:COUNTER:1800:0:4294967295", "RRA:AVERAGE:0.5:1:2016"
79
102
 
80
103
  # Updating rrd with a new value
81
104
  RRD::Wrapper.update "myrrd.rrd", "N:500000000"
82
105
 
106
+ # Fetching average data
107
+ RRD::Wrapper.fetch "myrrd.rrd", "AVERAGE"
108
+
109
+ # Looking for the first and last entered dates
110
+ RRD::Wrapper.first "myrrd.rrd"
111
+ RRD::Wrapper.last "myrrd.rrd"
112
+
83
113
  # Creating a graph
84
- RRD::Wrapper.graph("graph.png", "DEF:data=myrrd.rrd:ifOutOctets:AVERAGE", "LINE1:data#0000FF:Output bytes")
114
+ RRD::Wrapper.graph("graph.png", "DEF:data=myrrd.rrd:ifOutOctets:AVERAGE", "LINE1:data#0000FF:Output bytes")
115
+
116
+ # Getting the error happened
117
+ puts RRD::Wrapper.error
118
+
119
+ # Throwing the error if happens
120
+ RRD::Wrapper.fetch! "myrrd.rrd", "WRONG FUNCTION"
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ $:.unshift(File.dirname(__FILE__) + "/lib")
2
+
1
3
  require "rake"
2
4
  require "spec/rake/spectask"
3
- require "lib/rrd/version"
5
+ require "rrd/version"
4
6
 
5
7
  begin
6
8
  require "hanna/rdoctask"
@@ -32,6 +34,13 @@ Spec::Rake::SpecTask.new(:spec) do |t|
32
34
  t.spec_files = FileList['spec/**/*_spec.rb']
33
35
  end
34
36
 
37
+ desc "Rspec : run all with RCov"
38
+ Spec::Rake::SpecTask.new('spec:rcov') do |t|
39
+ t.spec_files = FileList['spec/**/*.rb']
40
+ t.rcov = true
41
+ t.rcov_opts = ['--exclude', 'gems', '--exclude', 'spec']
42
+ end
43
+
35
44
  Rake::RDocTask.new do |rdoc|
36
45
  rdoc.main = "README.rdoc"
37
46
  rdoc.rdoc_dir = "doc"
data/lib/rrd.rb CHANGED
@@ -9,7 +9,7 @@ require "rrd/ext/fixnum"
9
9
  module RRD
10
10
  extend self
11
11
 
12
- def graph(image_file, options, &block)
12
+ def graph(image_file, options = {}, &block)
13
13
  graph = Graph.new(image_file, options)
14
14
  graph.instance_eval(&block)
15
15
  graph.save
@@ -1,4 +1,5 @@
1
1
  module RRD
2
+ # TODO: add bang methods
2
3
  class Base
3
4
  attr_accessor :rrd_file
4
5
 
@@ -6,6 +7,10 @@ module RRD
6
7
  @rrd_file = rrd_file
7
8
  end
8
9
 
10
+ def error
11
+ Wrapper.error
12
+ end
13
+
9
14
  def create(options = {}, &block)
10
15
  builder = RRD::Builder.new(rrd_file, options)
11
16
  builder.instance_eval(&block)
@@ -52,8 +57,10 @@ module RRD
52
57
  alias :last :ends_at
53
58
 
54
59
  # See RRD::Wrapper.restore
55
- def restore(xml_file)
56
- Wrapper.restore(xml_file, rrd_file)
60
+ def restore(xml_file, options = {})
61
+ line_params = []
62
+ line_params << "--force-overwrite" if options[:overwrite]
63
+ Wrapper.restore(xml_file, rrd_file, *line_params)
57
64
  end
58
65
 
59
66
  end
@@ -8,7 +8,7 @@ module RRD
8
8
  def initialize(output, parameters = {})
9
9
  @output = output
10
10
 
11
- @parameters = {:start => Time.now - 1.day, :end => Time.now, :title => ""}
11
+ @parameters = {:start => Time.now - 1.day, :end => Time.now, :title => ""}.merge parameters
12
12
  @parameters[:start] = @parameters[:start].to_i
13
13
  @parameters[:end] = @parameters[:end].to_i
14
14
 
@@ -2,7 +2,7 @@ module RRD
2
2
  module Version #:nodoc: all
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- PATCH = 0
5
+ PATCH = 1
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
8
8
  end
@@ -4,6 +4,19 @@ module RRD
4
4
  # See http://oss.oetiker.ch/rrdtool/doc/rrdtool.en.html for details on the parameters
5
5
  class Wrapper
6
6
 
7
+ INFO_TYPE = { 0 => :u_val, 1 => :u_cnt, 2 => :u_str, 3 => :u_int, 4 => :u_blob}
8
+ BANG_METHODS = [:info!, :fetch!, :first!, :last!, :restore!, :graph!, :create!, :update!]
9
+
10
+ def self.detect_rrd_lib
11
+ if defined?(RRD_LIB)
12
+ RRD_LIB
13
+ elsif ENV["RRD_LIB"]
14
+ ENV["RRD_LIB"]
15
+ else
16
+ "rrd"
17
+ end
18
+ end
19
+
7
20
  class RRDBlob < FFI::Struct
8
21
  layout :size, :ulong,
9
22
  :ptr, :pointer
@@ -26,20 +39,8 @@ module RRD
26
39
 
27
40
  class << self
28
41
  extend FFI::Library
29
-
30
- INFO_TYPE = { 0 => :u_val, 1 => :u_cnt, 2 => :u_str, 3 => :u_int, 4 => :u_blob}
31
-
32
- def self.rrd_lib
33
- if defined?(RRD_LIB)
34
- RRD_LIB
35
- elsif ENV["RRD_LIB"]
36
- ENV["RRD_LIB"]
37
- else
38
- "rrd"
39
- end
40
- end
41
42
 
42
- ffi_lib rrd_lib
43
+ ffi_lib RRD::Wrapper.detect_rrd_lib
43
44
  attach_function :rrd_create, [:int, :pointer], :int
44
45
  attach_function :rrd_update, [:int, :pointer], :int
45
46
  attach_function :rrd_info, [:int, :pointer], :pointer
@@ -54,20 +55,24 @@ module RRD
54
55
  # Set up a new Round Robin Database (RRD).
55
56
  def create(*args)
56
57
  argv = to_pointer(["create"] + args)
57
- raise rrd_get_error unless rrd_create(args.size+1, argv) == 0
58
+ rrd_create(args.size+1, argv) == 0
58
59
  true
59
60
  end
60
61
 
61
62
  # Store new data values into an RRD.
62
63
  def update(*args)
63
64
  argv = to_pointer(["update"] + args)
64
- raise rrd_get_error unless rrd_update(args.size+1, argv) == 0
65
- true
65
+ rrd_update(args.size+1, argv) == 0
66
66
  end
67
67
 
68
68
  # Get data for a certain time period from a RRD.
69
69
  #
70
- # Returns an array of arrays (which contains the date and values for all datasources)
70
+ # Returns an array of arrays (which contains the date and values for all datasources):
71
+ #
72
+ # [["time" , "cpu", "memory"],
73
+ # [1266933600, "0.5", "511" ],
74
+ # [1266933900, "0.9", "253" ]]
75
+ #
71
76
  def fetch(*args)
72
77
  #FIXME: Refactor this
73
78
  start_time_ptr = empty_pointer
@@ -76,9 +81,9 @@ module RRD
76
81
  ds_count_ptr = empty_pointer
77
82
  ds_names_ptr = empty_pointer
78
83
 
79
- values = FFI::MemoryPointer.new(:pointer)
84
+ values_ptr = FFI::MemoryPointer.new(:pointer)
80
85
  argv = to_pointer(["fetch"] + args)
81
- raise rrd_get_error unless rrd_fetch(args.size+1, argv, start_time_ptr, end_time_ptr, step_ptr, ds_count_ptr, ds_names_ptr, values) == 0
86
+ return false unless rrd_fetch(args.size+1, argv, start_time_ptr, end_time_ptr, step_ptr, ds_count_ptr, ds_names_ptr, values_ptr) == 0
82
87
 
83
88
  ds_count = ds_count_ptr.get_int(0)
84
89
  start_time = start_time_ptr.get_int(0)
@@ -86,14 +91,17 @@ module RRD
86
91
  step = step_ptr.get_int(0)
87
92
 
88
93
  result_lines = (end_time-start_time)/step
94
+
95
+ ds_names = ds_names_ptr.get_pointer(0).get_array_of_string(0, ds_count)
96
+ values = values_ptr.get_pointer(0).get_array_of_double(0, result_lines * ds_count)
97
+
89
98
  result = []
90
- (0..result_lines-1).each do |i|
91
- data = []
92
- data << start_time + i*step
93
- (0..ds_count-1).each do |j|
94
- data << values.get_pointer(0)[8*(ds_count*i+j)].get_double(0)
95
- end
96
- result << data
99
+ result << ["time"] + ds_names
100
+ (0..result_lines-1).each do |line|
101
+ date = start_time + line*step
102
+ first = ds_count*line
103
+ last = ds_count*line + ds_count - 1
104
+ result << [date] + values[first..last]
97
105
  end
98
106
 
99
107
  result
@@ -113,6 +121,7 @@ module RRD
113
121
  result = item[:next]
114
122
  end
115
123
 
124
+ return false if info.empty?
116
125
  info
117
126
  end
118
127
 
@@ -122,7 +131,7 @@ module RRD
122
131
  def first(*args)
123
132
  argv = to_pointer(["first"] + args)
124
133
  date = rrd_first(args.size+1, argv)
125
- raise rrd_get_error if date == -1
134
+ return false if date == -1
126
135
  date
127
136
  end
128
137
 
@@ -132,31 +141,61 @@ module RRD
132
141
  def last(*args)
133
142
  argv = to_pointer(["last"] + args)
134
143
  date = rrd_last(args.size+1, argv)
135
- raise rrd_get_error if date == -1
144
+ return false if date == -1
136
145
  date
137
146
  end
138
147
 
139
148
  # Restore an RRD in XML format to a binary RRD.
140
149
  def restore(*args)
141
150
  argv = to_pointer(["restore"] + args)
142
- raise rrd_get_error unless rrd_restore(args.size+1, argv) == 0
143
- true
151
+ rrd_restore(args.size+1, argv) == 0
144
152
  end
145
153
 
146
154
  # Create a graph from data stored in one or several RRDs.
147
155
  def graph(*args)
148
156
  argv = to_pointer(["graph"] + args)
149
- raise rrd_get_error unless rrd_graph(args.size+1, argv, *Array.new(6, empty_pointer)) == 0
150
- true
157
+ xsize_ptr = empty_pointer
158
+ ysize_ptr = empty_pointer
159
+ ymin_ptr = empty_pointer
160
+ ymax_ptr = empty_pointer
161
+ rrd_graph(args.size+1, argv, empty_pointer, xsize_ptr, ysize_ptr, empty_pointer, ymin_ptr, ymax_ptr) == 0
162
+ end
163
+
164
+ def error
165
+ rrd_get_error
166
+ end
167
+
168
+ def clear_error
169
+ rrd_clear_error
170
+ end
171
+
172
+ def methods
173
+ super + BANG_METHODS
174
+ end
175
+
176
+ def respond_to?(method, include_private = false)
177
+ super || BANG_METHODS.include?(method.to_sym)
178
+ end
179
+
180
+ def method_missing(method, *args)
181
+ return bang($1, *args) if method.to_s =~ /^(.+)!$/ && BANG_METHODS.include?(method.to_sym)
182
+ super
151
183
  end
152
184
 
185
+ def bang(method, *args)
186
+ result = send(method, *args)
187
+ raise error unless result
188
+ result
189
+ end
190
+
153
191
  private
154
192
  def empty_pointer
155
193
  FFI::MemoryPointer.new(:pointer)
156
194
  end
157
195
 
196
+ # FIXME: remove clear_error from here
158
197
  def to_pointer(array_of_strings)
159
- rrd_clear_error
198
+ clear_error
160
199
  strptrs = []
161
200
  array_of_strings.each {|item| strptrs << FFI::MemoryPointer.from_string(item)}
162
201
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rrd-ffi}
8
- s.version = "0.2.0"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["morellon", "fnando", "rafaelrosafu", "dalcico"]
12
- s.date = %q{2010-02-25}
12
+ s.date = %q{2010-03-01}
13
13
  s.description = %q{Provides bindings for many RRD functions (using ffi gem and librrd), as well as DSLs for graphic and rrd building. You must have librrd in your system!}
14
14
  s.email = %q{morellon@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/../spec_helper"
1
+ require "spec_helper"
2
2
 
3
3
  describe RRD::Base do
4
4
 
@@ -41,8 +41,8 @@ describe RRD::Base do
41
41
  end
42
42
 
43
43
  it "should restore a rrd from xml" do
44
- RRD::Wrapper.should_receive(:restore).with(XML_FILE, RRD_FILE).and_return(true)
45
- @rrd.restore(XML_FILE).should be_true
44
+ RRD::Wrapper.should_receive(:restore).with(XML_FILE, RRD_FILE, "--force-overwrite").and_return(true)
45
+ @rrd.restore(XML_FILE, :overwrite => true).should be_true
46
46
  end
47
47
 
48
48
  it "should return the starting date" do
@@ -55,6 +55,12 @@ describe RRD::Base do
55
55
  @rrd.ends_at.should be_a(Time)
56
56
  end
57
57
 
58
+ it "should return the error" do
59
+ @rrd.error.should be_empty
60
+ @rrd.restore("unknown file").should be_false
61
+ @rrd.error.should_not be_empty
62
+ end
63
+
58
64
  it "should respond to first"
59
65
  it "should respond to last"
60
66
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/../spec_helper"
1
+ require "spec_helper"
2
2
 
3
3
  describe RRD::Builder do
4
4
 
@@ -1,10 +1,10 @@
1
- require File.dirname(__FILE__) + "/../spec_helper"
1
+ require "spec_helper"
2
2
 
3
3
  describe RRD::Graph do
4
4
 
5
5
  before do
6
6
  RRD::Base.new(RRD_FILE).restore(XML_FILE)
7
- @graph = RRD::Graph.new IMG_FILE
7
+ @graph = RRD::Graph.new IMG_FILE, :title => "Title", :width => 800, :height => 200
8
8
  end
9
9
 
10
10
  it "should store definition for rrd data" do
@@ -58,8 +58,10 @@ describe RRD::Graph do
58
58
  @graph.line RRD_FILE, :memory => :average, :color => "#0000FF", :label => "Memory Avg"
59
59
  RRD::Wrapper.should_receive(:graph).with(IMG_FILE,
60
60
  "--end", anything(),
61
+ "--height", "200",
61
62
  "--start", anything(),
62
- "--title", "",
63
+ "--title", "Title",
64
+ "--width", "800",
63
65
  "DEF:memory_average=#{RRD_FILE}:memory:AVERAGE",
64
66
  "LINE1:memory_average#0000FF:Memory Avg").and_return true
65
67
  @graph.save
@@ -1,8 +1,31 @@
1
- require File.dirname(__FILE__) + "/../spec_helper"
1
+ require "spec_helper"
2
2
 
3
3
  describe RRD::Wrapper do
4
4
 
5
+ context "when looking for librrd path" do
6
+ before :each do
7
+ Object.send(:remove_const, :RRD_LIB) if defined?(::RRD_LIB)
8
+ ENV["RRD_LIB"] = nil
9
+ end
10
+
11
+ it "should look on RRD_LIB constant first" do
12
+ ::RRD_LIB = "first"
13
+ ENV["RRD_LIB"] = "second"
14
+ RRD::Wrapper.detect_rrd_lib.should == "first"
15
+ end
16
+
17
+ it "should look on ENV if RRD_LIB is not defined" do
18
+ ENV["RRD_LIB"] = "second"
19
+ RRD::Wrapper.detect_rrd_lib.should == "second"
20
+ end
21
+
22
+ it "should return 'rrd' for FFI to look up if can't use RRD_LIB or ENV" do
23
+ RRD::Wrapper.detect_rrd_lib.should == "rrd"
24
+ end
25
+ end
26
+
5
27
  context "when no rrd file exists" do
28
+
6
29
  it "should restore a rrd from xml" do
7
30
  RRD::Wrapper.restore(XML_FILE, RRD_FILE).should be_true
8
31
  end
@@ -27,9 +50,11 @@ describe RRD::Wrapper do
27
50
 
28
51
  it "should fetch values" do
29
52
  values = RRD::Wrapper.fetch(RRD_FILE, "AVERAGE", "--start", "1266933600", "--end", "1267020000")
30
- values.should have(25).lines
31
- values[0][0].should == 1266933600
32
- values[0][1].should == 0.0008
53
+ values.should have(26).lines
54
+ values[0][0].should == "time"
55
+ values[1][0].should == 1266933600
56
+ values[1][1].should == 0.0008
57
+ values.last[0].should == 1267020000
33
58
  end
34
59
 
35
60
  it "should return info data about this file" do
@@ -46,9 +71,43 @@ describe RRD::Wrapper do
46
71
  end
47
72
 
48
73
  it "should create a graph correctly" do
49
- RRD::Wrapper.graph(IMG_FILE, "DEF:data=#{RRD_FILE}:memory:AVERAGE", "LINE1:data#0000FF:Memory Avg")
74
+ RRD::Wrapper.graph(IMG_FILE, "--width", "1000", "--height", "300", "DEF:data=#{RRD_FILE}:memory:AVERAGE", "LINE1:data#0000FF:Memory Avg")
50
75
  File.should be_file(IMG_FILE)
51
76
  end
77
+
78
+ it "should return the error correctly, cleaning the error var" do
79
+ RRD::Wrapper.error.should be_empty
80
+ RRD::Wrapper.fetch("error").should be_false
81
+ RRD::Wrapper.error.should_not be_empty
82
+ end
83
+ end
84
+
85
+ context "when using bang methods" do
86
+
87
+ it "should respond to them" do
88
+ RRD::Wrapper::BANG_METHODS.each do |method|
89
+ RRD::Wrapper.respond_to?(method).should be_true
90
+ end
91
+ end
92
+
93
+ it "should list them" do
94
+ (RRD::Wrapper.methods & RRD::Wrapper::BANG_METHODS).should == RRD::Wrapper::BANG_METHODS
95
+ end
96
+
97
+ it "should return the normal method result" do
98
+ RRD::Wrapper.restore!(XML_FILE, RRD_FILE).should be_true
99
+ end
100
+
101
+ it "should raise error if the normal method is not bangable" do
102
+ RRD::Wrapper.should_not_receive(:bang)
103
+ lambda{RRD::Wrapper.not_bangable}.should raise_error(NoMethodError)
104
+ end
105
+
106
+ it "should raise error if the normal method result is false" do
107
+ RRD::Wrapper.should_receive(:info).and_return(false)
108
+ RRD::Wrapper.should_receive(:error).and_return("error message")
109
+ lambda{RRD::Wrapper.bang(:info)}.should raise_error("error message")
110
+ end
52
111
  end
53
112
 
54
113
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/spec_helper"
1
+ require "spec_helper"
2
2
 
3
3
  describe RRD do
4
4
 
@@ -3,9 +3,11 @@ require "spec"
3
3
  $LOAD_PATH.unshift File.dirname(__FILE__) + "/../lib"
4
4
  require "rrd"
5
5
 
6
+ $VERBOSE = nil
6
7
  RRD_FILE = File.expand_path(File.dirname(__FILE__) + "/vm.rrd")
7
8
  IMG_FILE = File.expand_path(File.dirname(__FILE__) + "/vm.png")
8
9
  XML_FILE = File.expand_path(File.dirname(__FILE__) + "/vm.xml")
10
+ $VERBOSE = false
9
11
 
10
12
  Spec::Runner.configure do |config|
11
13
  config.append_before :each do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rrd-ffi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - morellon
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2010-02-25 00:00:00 -03:00
15
+ date: 2010-03-01 00:00:00 -03:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency