lwes 0.1.2 → 0.2.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/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ Version 0.2.1 (erik-s-chang)
2
+ * Emitter#<< for structs
3
+ * fix full installs OSX
4
+ * check arguments for invalid structs due to code errors
5
+
1
6
  Version 0.1.2 (erik-s-chang)
2
7
  * TypeDB.new raises ArgumentError on non-String args
3
8
  * extra test for empty Event definitions (MetaEventInfo-only)
data/README CHANGED
@@ -63,7 +63,7 @@ gem.
63
63
  my_event.field2 = value2
64
64
  my_event.field3 = value3
65
65
  my_event.finished = Time.now.to_i
66
- emitter.emit my_event
66
+ emitter << my_event
67
67
 
68
68
  # Alternatively, if you know ahead of time all the fields you want to
69
69
  # set for an event, you can emit an event in one step:
data/Rakefile CHANGED
@@ -9,3 +9,10 @@ Rake::TestTask.new('test:unit') do |t|
9
9
  t.test_files = FileList['test/unit/test_*.rb']
10
10
  t.verbose = true if ENV["VERBOSE"].to_i > 0
11
11
  end
12
+
13
+ gem 'rdoc', '>= 2.4.3'
14
+ require 'rdoc/task'
15
+ RDoc::Task.new do |rd|
16
+ rd.main = "README"
17
+ rd.rdoc_files.include("README", "lib/**/*.rb", "ext/lwes/*.c")
18
+ end
data/ext/lwes/emitter.c CHANGED
@@ -1,7 +1,7 @@
1
1
  #include "lwes_ruby.h"
2
2
 
3
3
  static VALUE cLWES_Emitter;
4
- static ID sym_TYPE_DB, sym_TYPE_LIST, sym_NAME;
4
+ static ID id_TYPE_DB, id_TYPE_LIST, id_NAME;
5
5
  static ID id_new;
6
6
 
7
7
  /* the underlying struct for LWES::Emitter */
@@ -132,10 +132,14 @@ static VALUE _emit_struct(VALUE _argv)
132
132
  VALUE self = argv[0];
133
133
  VALUE _event = argv[1];
134
134
  struct lwes_event *event = (struct lwes_event *)argv[2];
135
- VALUE type_list = rb_const_get(CLASS_OF(_event), SYM2ID(sym_TYPE_LIST));
136
- long i = RARRAY_LEN(type_list);
135
+ VALUE type_list = argv[3];
136
+ long i;
137
137
  VALUE *tmp;
138
138
 
139
+ if (TYPE(type_list) != T_ARRAY)
140
+ rb_raise(rb_eArgError, "could not get TYPE_LIST const");
141
+
142
+ i = RARRAY_LEN(type_list);
139
143
  for (tmp = RARRAY_PTR(type_list); --i >= 0; tmp++) {
140
144
  /* inner: [ :field_sym, "field_name", type ] */
141
145
  VALUE *inner = RARRAY_PTR(*tmp);
@@ -191,30 +195,60 @@ static VALUE emit_hash(VALUE self, VALUE name, VALUE _event)
191
195
  return _event;
192
196
  }
193
197
 
194
- static struct lwes_event_type_db * get_type_db(VALUE event)
198
+ static struct lwes_event_type_db * get_type_db(VALUE event_class)
195
199
  {
196
- VALUE type_db = rb_const_get(CLASS_OF(event), SYM2ID(sym_TYPE_DB));
200
+ VALUE type_db = rb_const_get(event_class, id_TYPE_DB);
201
+
202
+ if (CLASS_OF(type_db) != cLWES_TypeDB)
203
+ rb_raise(rb_eArgError, "class does not have valid TYPE_DB");
197
204
 
198
205
  return lwesrb_get_type_db(type_db);
199
206
  }
200
207
 
201
- static VALUE emit_struct(VALUE self, VALUE name, VALUE _event)
208
+ static VALUE emit_struct(VALUE self, VALUE _event)
202
209
  {
203
- VALUE argv[3];
204
- struct lwes_event_type_db *db = get_type_db(_event);
205
- struct lwes_event *event = lwes_event_create(db, RSTRING_PTR(name));
210
+ VALUE argv[4];
211
+ VALUE event_class = CLASS_OF(_event);
212
+ struct lwes_event_type_db *db = get_type_db(event_class);
213
+ struct lwes_event *event;
214
+ VALUE name = rb_const_get(event_class, id_NAME);
215
+ VALUE type_list = rb_const_get(event_class, id_TYPE_LIST);
216
+
217
+ if (TYPE(name) != T_STRING || TYPE(type_list) != T_ARRAY)
218
+ rb_raise(rb_eArgError,
219
+ "could not get class NAME or TYPE_LIST from: %s",
220
+ RSTRING_PTR(rb_inspect(_event)));
206
221
 
222
+ event = lwes_event_create(db, RSTRING_PTR(name));
207
223
  if (!event)
208
224
  rb_raise(rb_eRuntimeError, "failed to create lwes_event");
209
225
 
210
226
  argv[0] = self;
211
227
  argv[1] = _event;
212
228
  argv[2] = (VALUE)event;
229
+ argv[3] = type_list;
213
230
  rb_ensure(_emit_struct, (VALUE)&argv, _destroy_event, (VALUE)event);
214
231
 
215
232
  return _event;
216
233
  }
217
234
 
235
+ /*
236
+ * call-seq:
237
+ * emitter = LWES::Emitter.new
238
+ * event = EventStruct.new
239
+ * event.foo = "bar"
240
+ * emitter << event
241
+ */
242
+ static VALUE emitter_ltlt(VALUE self, VALUE event)
243
+ {
244
+ if (TYPE(event) != T_STRUCT)
245
+ rb_raise(rb_eArgError,
246
+ "Must be a Struct: %s",
247
+ RSTRING_PTR(rb_inspect(event)));
248
+
249
+ return emit_struct(self, event);
250
+ }
251
+
218
252
  /*
219
253
  * call-seq:
220
254
  * emitter = LWES::Emitter.new
@@ -246,8 +280,7 @@ static VALUE emitter_emit(int argc, VALUE *argv, VALUE self)
246
280
  "second argument not allowed when first"
247
281
  " is a Struct");
248
282
  event = name;
249
- name = rb_const_get(CLASS_OF(event), SYM2ID(sym_NAME));
250
- return emit_struct(self, name, event);
283
+ return emit_struct(self, event);
251
284
  case T_CLASS:
252
285
  if (TYPE(event) != T_HASH)
253
286
  rb_raise(rb_eArgError,
@@ -259,8 +292,7 @@ static VALUE emitter_emit(int argc, VALUE *argv, VALUE self)
259
292
  * struct created
260
293
  */
261
294
  event = rb_funcall(name, id_new, 1, event);
262
- name = rb_const_get(name, SYM2ID(sym_NAME));
263
- return emit_struct(self, name, event);
295
+ return emit_struct(self, event);
264
296
  default:
265
297
  rb_raise(rb_eArgError,
266
298
  "bad argument: %s, must be a String, Struct or Class",
@@ -355,12 +387,13 @@ void lwesrb_init_emitter(void)
355
387
  VALUE mLWES = rb_define_module("LWES");
356
388
  cLWES_Emitter = rb_define_class_under(mLWES, "Emitter", rb_cObject);
357
389
 
390
+ rb_define_method(cLWES_Emitter, "<<", emitter_ltlt, 1);
358
391
  rb_define_method(cLWES_Emitter, "emit", emitter_emit, -1);
359
392
  rb_define_method(cLWES_Emitter, "_create", _create, 1);
360
393
  rb_define_method(cLWES_Emitter, "close", emitter_close, 0);
361
394
  rb_define_alloc_func(cLWES_Emitter, rle_alloc);
362
- LWESRB_MKSYM(TYPE_DB);
363
- LWESRB_MKSYM(TYPE_LIST);
364
- LWESRB_MKSYM(NAME);
365
- id_new = rb_intern("new");
395
+ LWESRB_MKID(TYPE_DB);
396
+ LWESRB_MKID(TYPE_LIST);
397
+ LWESRB_MKID(NAME);
398
+ LWESRB_MKID(new);
366
399
  }
data/ext/lwes/extconf.rb CHANGED
@@ -37,7 +37,8 @@ unless have_library('lwes') && have_header('lwes.h')
37
37
  FileUtils.rm_rf(dir)
38
38
  system('tar', 'zxf', tgz) or abort "tar failed with #{$?}"
39
39
  Dir.chdir(dir) do
40
- system("./configure", "--prefix=#{inst}", "--disable-hardcore") or
40
+ args = %w(--disable-hardcore --with-pic --disable-dependency-tracking)
41
+ system("./configure", "--prefix=#{inst}", *args) or
41
42
  abort "configure failed with #{$?}"
42
43
  system("make") or abort "make failed with #{$?}"
43
44
  system("make", "install") or abort "make install failed with #{$?}"
@@ -46,7 +47,8 @@ unless have_library('lwes') && have_header('lwes.h')
46
47
  File.open("#{inst}/.ok", "wb") { }
47
48
  end
48
49
  $CFLAGS = "-I#{inst}/include/lwes-0 #{$CFLAGS}"
49
- $LDFLAGS = "-Wl,-rpath=#{inst}/lib -L#{inst}/lib #{$LDFLAGS}"
50
+ Dir.glob("#{inst}/lib/*") { |f| f =~ /\.l?a\z/ or FileUtils.rm_rf(f) }
51
+ $LDFLAGS = "-L#{inst}/lib #{$LDFLAGS}"
50
52
  have_library('lwes') && have_header('lwes.h') or
51
53
  abort "installation failed"
52
54
  end
data/ext/lwes/lwes_ruby.h CHANGED
@@ -7,6 +7,9 @@
7
7
  #include <stdint.h>
8
8
 
9
9
  #define LWESRB_MKSYM(SYM) sym_##SYM = ID2SYM(rb_intern(#SYM))
10
+ #define LWESRB_MKID(NAME) id_##NAME = rb_intern(#NAME)
11
+
12
+ extern VALUE cLWES_TypeDB;
10
13
 
11
14
  struct lwes_event_type_db * lwesrb_get_type_db(VALUE self);
12
15
 
data/ext/lwes/type_db.c CHANGED
@@ -1,6 +1,6 @@
1
1
  #include "lwes_ruby.h"
2
2
 
3
- static VALUE cLWES_TypeDB;
3
+ VALUE cLWES_TypeDB;
4
4
 
5
5
  struct _tdb {
6
6
  struct lwes_event_type_db *db;
data/lib/lwes.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module LWES
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.1"
3
3
  autoload :TypeDB, "lwes/type_db"
4
4
  autoload :Struct, "lwes/struct"
5
5
  autoload :Emitter, "lwes/emitter"
data/lwes.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{lwes}
3
- s.version = "0.1.2"
3
+ s.version = "0.2.1"
4
4
  s.date = Time.now
5
5
  s.authors = ["Erik S. Chang", "Frank Maritato"]
6
6
  s.email = %q{lwes-devel@lists.sourceforge.net}
@@ -33,6 +33,8 @@ lib/lwes/struct.rb
33
33
  lib/lwes/type_db.rb
34
34
  lwes.gemspec
35
35
  test/test_helper.rb
36
+ test/unit/meta_only.esf
37
+ test/unit/namespaced.esf
36
38
  test/unit/test1.esf
37
39
  test/unit/test2.esf
38
40
  test/unit/test_emit_struct.rb
@@ -0,0 +1,8 @@
1
+ MetaEventInfo
2
+ {
3
+ ip_addr SenderIP;
4
+ }
5
+
6
+ Meta::Info::Only
7
+ {
8
+ }
@@ -0,0 +1,19 @@
1
+ MetaEventInfo
2
+ {
3
+ ip_addr SenderIP;
4
+ }
5
+
6
+ A::B::C::Event
7
+ {
8
+ boolean ok;
9
+ }
10
+
11
+ A::B::C::Event::Bool
12
+ {
13
+ boolean B;
14
+ }
15
+
16
+ A::B::C::Event::String
17
+ {
18
+ string S;
19
+ }
@@ -1,5 +1,9 @@
1
1
  require "#{File.dirname(__FILE__)}/../test_helper"
2
2
 
3
+ class InvalidStruct1 < Struct.new(:invalid)
4
+ TYPE_DB = []
5
+ end
6
+
3
7
  class TestEmitStruct < Test::Unit::TestCase
4
8
 
5
9
  def setup
@@ -8,6 +12,18 @@ class TestEmitStruct < Test::Unit::TestCase
8
12
  @options = LISTENER_DEFAULTS.dup
9
13
  end
10
14
 
15
+ def test_emit_non_lwes_struct
16
+ emitter = LWES::Emitter.new(@options)
17
+ assert_raise(ArgumentError) { emitter << InvalidStruct1.new }
18
+ end
19
+
20
+ def test_emit_crap
21
+ emitter = LWES::Emitter.new(@options)
22
+ assert_raise(ArgumentError) { emitter << "HHI" }
23
+ assert_raise(ArgumentError) { emitter << [] }
24
+ assert_raise(ArgumentError) { emitter << {} }
25
+ end
26
+
11
27
  def test_emit_struct_full
12
28
  s = nil
13
29
  out = lwes_listener do
@@ -35,6 +51,33 @@ class TestEmitStruct < Test::Unit::TestCase
35
51
  end
36
52
  end
37
53
 
54
+ def test_emit_struct_cplusplus
55
+ s = nil
56
+ out = lwes_listener do
57
+ assert_nothing_raised do
58
+ emitter = LWES::Emitter.new(@options)
59
+ s = Event1.new
60
+ s.t_bool = true
61
+ s.t_int16 = -1000
62
+ s.t_uint16 = 1000
63
+ s.t_int32 = -64444
64
+ s.t_uint32 = 64444
65
+ s.t_int64 = 10_000_000_000
66
+ s.t_uint64 = 10_000_000_000
67
+ s.t_ip_addr = '192.168.0.1'
68
+ s.t_string = "STRING"
69
+ emitter << s
70
+ end
71
+ end
72
+ out = out.readlines
73
+ s.members.each do |m|
74
+ value = s[m.to_sym] or next
75
+ regex = /\b#{m} = #{value};/
76
+ assert_equal 1, out.grep(regex).size,
77
+ "#{regex.inspect} didn't match #{out.inspect}"
78
+ end
79
+ end
80
+
38
81
  def test_emit_from_class
39
82
  opt = {
40
83
  :t_bool => true,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lwes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik S. Chang
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-12-01 00:00:00 +00:00
13
+ date: 2009-12-09 00:00:00 +00:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -46,6 +46,8 @@ files:
46
46
  - lib/lwes/type_db.rb
47
47
  - lwes.gemspec
48
48
  - test/test_helper.rb
49
+ - test/unit/meta_only.esf
50
+ - test/unit/namespaced.esf
49
51
  - test/unit/test1.esf
50
52
  - test/unit/test2.esf
51
53
  - test/unit/test_emit_struct.rb