oml4r 2.9.5 → 2.9.6

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.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +8 -8
  3. data/lib/oml4r.rb +200 -71
  4. data/lib/oml4r/version.rb +1 -1
  5. metadata +27 -45
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d3d1eb545b9421f2879295e80e877f4f062c23d9
4
+ data.tar.gz: efdf663660b0bb02826371fe2a452b7a85575d99
5
+ SHA512:
6
+ metadata.gz: 3df9d5505c1d71b4f0f789a1159dbe8b42a736a393edc13f2e7d94e69c382d8e5d365822f0c4ba8cb07164b6e6dbe36989ef132ea61b599621b5cfef1025aa32
7
+ data.tar.gz: 22de82d382d2fc8559629a8fd015bc65684d76ae1937f6937a092a2d0ff1b872df744594d00df124a156876648fad9d6674d243d63fef3a435591f640277cbd6
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- OML4R: Native OML Implementation in Ruby {#oml4rdoc}
1
+ OML4R: Native OML Implementation in Ruby
2
2
  ========================================
3
3
 
4
4
  This is a simple client library for OML which does not use liboml2 and its
5
- filters, but connects directly to the server using the text protocol [oml-text].
5
+ filters, but connects directly to the server using the text protocol [omsp].
6
6
  User can use this library to create ruby applications which can send
7
7
  measurement to the OML collection server. A simple example on how to use
8
8
  this library is attached at the end of this file. Another example can be
@@ -31,9 +31,9 @@ Usage
31
31
 
32
32
  ### Initialisation, Injection and Tear-down
33
33
 
34
- OML4R::init(ARGV,
34
+ OML4R::init(ARGV,
35
35
  :appName => 'oml4rSimpleExample',
36
- :domain => 'foo',
36
+ :domain => 'foo',
37
37
  :nodeID => 'n1',
38
38
  )
39
39
  MyMP.inject("hello", 13, 37.1)
@@ -59,11 +59,11 @@ this with the 'channel' abstraction.
59
59
  param :b_val, :type => :int32
60
60
  end
61
61
 
62
- OML4R::init(ARGV,
62
+ OML4R::init(ARGV,
63
63
  :appName => 'doubleAgent',
64
- :domain => 'foo'
64
+ :domain => 'foo'
65
65
  )
66
- OML4R::create_channel(:archive, 'file:/tmp/archive.log')
66
+ OML4R::create_channel(:archive, 'file:/tmp/archive.log')
67
67
 
68
68
  Setting the command line flag '--oml-collect' will define a ':default' channel. Any additional channels
69
69
  need to be declared with 'OML4R::create_channel' which takes two arguments, the name of the channel
@@ -76,7 +76,7 @@ Please note that by declaring a specific channel, every MP needs at least one ch
76
76
 
77
77
  See examples files oml4r-simple-example.rb and oml4r-wlanconfig.rb.
78
78
 
79
- [oml-text]: http://oml.mytestbed.net/projects/oml/wiki/Description_of_Text_protocol
79
+ [omsp]: http://oml.mytestbed.net/projects/oml/wiki/OML_Measurement_Stream_Protocol_(OMSP)_Specification
80
80
  [oml4r-rubygem]: https://rubygems.org/gems/oml4r/
81
81
 
82
82
  License
data/lib/oml4r.rb CHANGED
@@ -13,6 +13,8 @@
13
13
  # User can use this library to create ruby applications which can send
14
14
  # measurement to the OML collection server.
15
15
  #
16
+
17
+ require 'set'
16
18
  require 'socket'
17
19
  require 'monitor'
18
20
  require 'thread'
@@ -20,6 +22,7 @@ require 'optparse'
20
22
 
21
23
  require 'oml4r/version'
22
24
 
25
+
23
26
  #
24
27
  # This is the OML4R module, which should be required by ruby applications
25
28
  # that want to collect measurements via OML
@@ -27,7 +30,7 @@ require 'oml4r/version'
27
30
  module OML4R
28
31
 
29
32
  DEF_SERVER_PORT = 3003
30
- DEF_PROTOCOL = 3
33
+ DEF_PROTOCOL = 4
31
34
 
32
35
  # Overwrite the default logger
33
36
  #
@@ -51,9 +54,11 @@ module OML4R
51
54
  # Some Class variables
52
55
  @@defs = {}
53
56
  @@channels = {}
57
+ @@channelNames = {}
54
58
  @@frozen = false
55
59
  @@useOML = false
56
60
  @@start_time = nil
61
+ @@newDefs = Set[]
57
62
 
58
63
  # Execute a block for each defined MP
59
64
  def self.each_mp(&block)
@@ -71,6 +76,7 @@ module OML4R
71
76
  defs = @@defs[self] = {}
72
77
  defs[:p_def] = []
73
78
  defs[:seq_no] = 0
79
+ defs[:meta_no] = 0
74
80
  end
75
81
  defs
76
82
  end
@@ -81,10 +87,18 @@ module OML4R
81
87
  # opts add_prefix Add app name as prefix to table. Default: true
82
88
  #
83
89
  def self.name(name, opts = {})
90
+
91
+ # ok, lets add it then
84
92
  if opts[:add_prefix].nil?
85
93
  opts[:add_prefix] = true
86
94
  end
87
95
  __def__()[:name] = {:name => name, :opts => opts}
96
+
97
+ # if we're frozen remember to inject schema before measurements
98
+ if @@frozen
99
+ @@newDefs.add self
100
+ end
101
+
88
102
  end
89
103
 
90
104
  # Set the channel these measurements should be sent out on.
@@ -92,23 +106,20 @@ module OML4R
92
106
  # the channel defined by the command line arguments or environment variables.
93
107
  #
94
108
  def self.channel(channel, domain = :default)
95
- (@@channels[self] ||= []) << [channel, domain]
109
+ (@@channelNames[self] ||= []) << [channel, domain]
96
110
  end
97
111
 
98
112
  # Set a metric for this MP
99
113
  # - name = name of the metric to set
100
114
  # - opts = a Hash with the options for this metric
101
- # Only supported option is :type = { :string | :int32 | :double }
115
+ # Only supported option is :type = { :string | :int32 | :double | :bool }
102
116
  def self.param(name, opts = {})
103
117
  o = opts.dup
104
118
  o[:name] = name
105
119
  o[:type] ||= :string
106
- case o[:type]
107
- when :long
120
+ if :long == o[:type]
108
121
  OML4R.logger.warn ":long is deprecated use, :int32 instead"
109
122
  o[:type] = :int32
110
- when :boolean
111
- o[:type] = :int32 # TODO: Hopefully we can remove this soon
112
123
  end
113
124
  __def__()[:p_def] << o
114
125
  nil
@@ -119,8 +130,41 @@ module OML4R
119
130
  # - args = a list of arguments (comma separated) which correspond to the
120
131
  # different values of the metrics for the measurement to inject
121
132
  def self.inject(*args)
133
+
122
134
  return unless @@useOML
123
135
 
136
+ # Do we need to send a schema update?
137
+ if @@newDefs.include? self
138
+ defs = @@defs[self]
139
+ mp_name_def = defs[:name]
140
+ mp_name = mp_name_def[:name]
141
+ pdefs = defs[:p_def]
142
+ defs[:types] = pdefs.map {|h| h[:type]}
143
+ # prepare the message header
144
+ a = []
145
+ a << Time.now - @@start_time
146
+ a << "0"
147
+ a << (defs[:meta_no] += 1)
148
+ a << "."
149
+ a << "schema"
150
+ msg = a.join("\t")
151
+ # Create the channels
152
+ names = @@channelNames[self] || []
153
+ chans = names.collect do |cname, domain|
154
+ [Channel[cname.to_sym, domain.to_sym]]
155
+ end
156
+ @@channels[self] = chans.empty? ? [[Channel[]]] : chans
157
+ # Now inject the schema
158
+ meta_ca = @@channels[OML4R::ExperimentMetadata][0]
159
+ channel = meta_ca[0]
160
+ schema_info = channel.build_schema(mp_name, mp_name_def[:opts][:add_prefix], pdefs)
161
+ channel.send_schema_update(msg + "\t" + schema_info[1])
162
+ @@channels[self].each do |ca|
163
+ ca << schema_info[0]
164
+ end
165
+ @@newDefs.delete self
166
+ end
167
+
124
168
  # Check that the list of values passed as argument matches the
125
169
  # definition of this Measurement Point
126
170
  defs = __def__()
@@ -138,10 +182,10 @@ module OML4R
138
182
  case types[i]
139
183
  when :string
140
184
  # Escape tabs and newlines
141
- arg = arg.to_s.gsub("\n", "\\n").gsub("\t", "\\t")
142
- when :boolean
143
- # boolean
144
- arg = arg ? 1 : 0
185
+ arg = arg.to_s.gsub("\\", "\\\\").gsub("\r", "\\r").gsub("\n", "\\n").gsub("\t", "\\t")
186
+ when :bool
187
+ # Convert boolean value to appropriate literal
188
+ arg = arg ? "True" : "False"
145
189
  when :blob
146
190
  arg = [arg].pack("m")
147
191
  end
@@ -157,6 +201,13 @@ module OML4R
157
201
  args
158
202
  end
159
203
 
204
+ # Inject measurement metadata from this Measurement Point to the
205
+ # OML Server.
206
+ #
207
+ # def self.inject_metadata(key, value, fname)
208
+ # MPBase::__inject_metadata__(@name, key, value, fname)
209
+ # end
210
+
160
211
  def self.start_time()
161
212
  @@start_time
162
213
  end
@@ -173,14 +224,14 @@ module OML4R
173
224
 
174
225
  # replace channel names with channel object
175
226
  self.each_mp do |klass, defs|
176
- cna = @@channels[klass] || []
177
- OML4R.logger.debug "'#{cna.inspect}', '#{klass}'"
178
- ca = cna.collect do |cname, domain|
227
+ names = @@channelNames[klass] || []
228
+ OML4R.logger.debug "'#{names.inspect}', '#{klass}'"
229
+ chans = names.collect do |cname, domain|
179
230
  # return it in an array as we need to add the channel specific index
180
231
  [Channel[cname.to_sym, domain.to_sym]]
181
232
  end
182
- OML4R.logger.debug "Using channels '#{ca.inspect}"
183
- @@channels[klass] = ca.empty? ? [[Channel[]]] : ca
233
+ OML4R.logger.debug "Using channels '#{chans.inspect}"
234
+ @@channels[klass] = chans.empty? ? [[Channel[]]] : chans
184
235
  end
185
236
  @@start_time = start_time
186
237
  end
@@ -204,21 +255,17 @@ module OML4R
204
255
  unless (mp_name_def = defs[:name])
205
256
  raise MissingArgumentException.new "Missing 'name' declaration for '#{self}'"
206
257
  end
207
- mp_name = mp_name_def[:name]
208
- if !name_prefix.nil? && mp_name_def[:opts][:add_prefix]
209
- mp_name = "#{name_prefix}_#{mp_name}"
210
- end
211
258
 
259
+ # Build the schema
260
+ mp_name = mp_name_def[:name]
212
261
  @@channels[self].each do |ca|
213
262
  OML4R.logger.debug "Setting up channel '#{ca.inspect}"
214
- index = ca[0].send_schema(mp_name, defs[:p_def])
215
- ca << index
263
+ schema_info = ca[0].build_schema(mp_name, mp_name_def[:opts][:add_prefix], defs[:p_def])
264
+ ca << schema_info[0]
216
265
  end
217
266
  end
218
267
  end # class MPBase
219
268
 
220
-
221
-
222
269
  #
223
270
  # The Init method of OML4R
224
271
  # Ruby applications should call this method to initialise the OML4R module
@@ -238,8 +285,7 @@ module OML4R
238
285
  # param block = a block which defines the additional application-specific arguments
239
286
  #
240
287
  def self.init(argv, opts = {}, &block)
241
- OML4R#{VERSION_STRING} [#{COPYRIGHT}")
242
-
288
+ OML4R.logger.info "V#{VERSION} #{COPYRIGHT}"
243
289
  if d = (ENV['OML_EXP_ID'] || opts[:expID])
244
290
  # NOTE: It is still too early to complain about that. We need to be sure
245
291
  # of the nomenclature before making user-visible changes.
@@ -270,6 +316,7 @@ module OML4R
270
316
  end
271
317
  opts[:collect] = ENV['OML_COLLECT'] || ENV['OML_SERVER'] || opts[:collect] || opts[:omlServer]
272
318
  noop = opts[:noop] || false
319
+ omlConfigFile = nil
273
320
 
274
321
  if argv
275
322
  # Create a new Parser for the command line
@@ -283,6 +330,7 @@ module OML4R
283
330
  op.on("--oml-protocol p", "Protocol number [#{OML4R::DEF_PROTOCOL}]") { |l| opts[:protocol] = l.to_i }
284
331
  op.on("--oml-log-level l", "Log level used (info: 1 .. debug: 0)") { |l| OML4R.logger.level = l.to_i }
285
332
  op.on("--oml-noop", "Do not collect measurements") { noop = true }
333
+ op.on("--oml-config file", "File holding OML configuration parameters") { |f| omlConfigFile = f }
286
334
  op.on("--oml-exp-id domain", "Obsolescent equivalent to --oml-domain domain") { |name|
287
335
  domain = name
288
336
  OML4R.logger.warn "Option --oml-exp-id is getting deprecated; please use '--oml-domain #{domain}' instead"
@@ -306,10 +354,25 @@ module OML4R
306
354
  # give the app a chance to fix missing parameters
307
355
  opts[:afterParse].call(opts)
308
356
  end
309
- return if noop
310
- end
311
-
312
- unless opts[:nodeID]
357
+ return if noop
358
+ # Parameters in OML config file takes precedence
359
+ unless omlConfigFile.nil?
360
+ f = File.open(omlConfigFile, 'r')
361
+ f.each_line do |l|
362
+ d = l[/.*experiment=["']([^["']]*)/,1]
363
+ opts[:domain] = d if d
364
+ d = l[/.*domain=["']([^["']]*)/,1]
365
+ opts[:domain] = d if d
366
+ i = l[/.*id=["']([^["']]*)/,1]
367
+ opts[:nodeID] = i if i
368
+ u = l[/.*url=["']([^["']]*)/,1]
369
+ opts[:omlCollectUri] = u if u
370
+ end
371
+ f.close
372
+ end
373
+ end
374
+
375
+ unless opts[:nodeID]
313
376
  begin
314
377
  # Create a default nodeID by concatinating the local hostname with the process ID
315
378
  hostname = nil
@@ -334,16 +397,12 @@ module OML4R
334
397
  raise MissingArgumentException.new 'OML4R: Missing values for parameters :domain (--oml-domain), :nodeID (--oml-id), or :appName (in code)!'
335
398
  end
336
399
 
337
- unless opts[:create_default_channel] == false
338
- # Set a default collection URI if nothing has been specified
339
- unless opts[:omlCollectUri]
340
- require 'time'
341
- opts[:omlCollectUri] = "file:#{opts[:appName]}_#{Time.now.iso8601}"
342
- #opts[:omlCollectUri] = "file:-"
343
- OML4R.logger.info "Collection URI is #{opts[:omlCollectUri]}"
344
- end
345
- create_channel(:default, opts[:omlCollectUri])
346
- end
400
+ # Set a default collection URI if nothing has been specified
401
+ opts[:omlCollectUri] ||= "file:#{opts[:appName]}_#{opts[:nodeID]}_#{opts[:domain]}_#{Time.now.strftime("%Y-%m-%dt%H.%M.%S%z")}"
402
+ opts[:omlCollectUri] = qualify_uri(opts[:omlCollectUri])
403
+ OML4R.logger.info "Collection URI is #{opts[:omlCollectUri]}"
404
+
405
+ create_channel(:default, opts[:omlCollectUri]) if opts[:omlCollectUri]
347
406
 
348
407
  # Handle the defined Measurement Points
349
408
  startTime = Time.now
@@ -351,6 +410,54 @@ module OML4R
351
410
  rest || []
352
411
  end
353
412
 
413
+ # Parse an underspecified URI into a fully-qualified one
414
+ # URIs are resolved as follows; the default is [tcp:]host[:port].
415
+ # hostname -> tcp:hostname:3003
416
+ # hostname:3004 -> tcp:hostname:3004
417
+ # tcp:hostname -> tcp:hostname:3003
418
+ # tcp:hostname:3004 -> tcp:hostname:3004
419
+ # file:/P/A/T/H -> file:/P/A/T/H
420
+ #
421
+ # @param uri [String] a potentially under-qualified collection URI
422
+ #
423
+ # @return [String] afully-qualified collection URI equivalent to uri
424
+ #
425
+ # @raise [OML4RException] in case of a parsing error
426
+ #
427
+ def self.qualify_uri(uri)
428
+ curi = uri.split(':')
429
+
430
+ # Defaults
431
+ scheme = 'tcp'
432
+ port = DEF_SERVER_PORT
433
+
434
+ if curi.length == 1
435
+ host = curi[0]
436
+
437
+ elsif curi.length == 2
438
+ if curi[0] == 'tcp'
439
+ scheme, host = curi
440
+
441
+ elsif curi[0] == 'file'
442
+ scheme, host = curi
443
+ port = nil
444
+
445
+ else
446
+ host, port = curi
447
+ end
448
+
449
+ elsif curi.length >= 3
450
+ if curi.length > 3
451
+ OML4R.logger.warn "Parsing URI '#{uri}' as a triplet, ignoring later components"
452
+ end
453
+ scheme, host, port = curi
454
+
455
+ else
456
+ raise OML4RException.new "OML4R: Unable to parse URI '#{url}"
457
+ end
458
+ "#{scheme}:#{host}#{":#{port}" if port}"
459
+ end
460
+
354
461
  def self.create_channel(name, url)
355
462
  Channel.create(name, url)
356
463
  end
@@ -363,19 +470,13 @@ module OML4R
363
470
  end
364
471
 
365
472
 
366
-
367
473
  #
368
- # Measurement Point Class
369
- # Ruby applications using this module should sub-class this MPBase class
370
- # to define their own Measurement Point (see the example at the end of
371
- # this file)
474
+ # Measurement Channel
372
475
  #
373
476
  class Channel
374
477
  @@channels = {}
375
478
  @@default_domain = nil
376
479
 
377
-
378
-
379
480
  def self.create(name, url, domain = :default)
380
481
  key = "#{name}:#{domain}"
381
482
  if channel = @@channels[key]
@@ -384,8 +485,36 @@ module OML4R
384
485
  end
385
486
  return channel
386
487
  end
387
- #return self._create(key, domain, url)
388
- return @@channels[key] = self.new(url, domain)
488
+ return self._create(key, domain, url)
489
+ end
490
+
491
+ def self._create(key, domain, url)
492
+ @@channels[key] = self.new(url, domain)
493
+ end
494
+
495
+ # Parse the given fully-qualified collection URI, and return a suitably connected objet
496
+ #
497
+ # Supported URIs are
498
+ # tcp:host:port
499
+ # file:/P/A/T/H
500
+ #
501
+ # @param fquri [String] a fully qualified collection URI
502
+ # @return [IO] an object suitably connected to the required URL
503
+ #
504
+ # @raise [OML4RException] in case of an unknown scheme
505
+ #
506
+ def self._connect(fquri)
507
+ scheme, host, port = fquri.split(':')
508
+ out = case scheme
509
+ when 'tcp'
510
+ out = TCPSocket.new(host, port)
511
+ when 'file'
512
+ # host is really a filename here
513
+ out = (host == '-' ? $stdout : File.open(host, "w+"))
514
+ else
515
+ raise OML4RException.new "OML4R: Unknown scheme '#{scheme}"
516
+ end
517
+ out
389
518
  end
390
519
 
391
520
  def self.[](name = :default, domain = :default)
@@ -438,22 +567,25 @@ module OML4R
438
567
  @url = url
439
568
  end
440
569
 
441
- def send_schema(mp_name, pdefs) # defs[:p_def]
442
- # Build the schema and send it
570
+ def build_schema(mp_name, add_prefix, pdefs)
443
571
  @index += 1
444
- #line = ['schema:', @index, mp_name]
445
- line = [@index, mp_name]
572
+ line = [@index, (!@@appName.nil? && add_prefix)? "#{@@appName}_#{mp_name}" : mp_name]
446
573
  pdefs.each do |d|
447
574
  line << "#{d[:name]}:#{d[:type]}"
448
575
  end
449
576
  msg = line.join(' ')
450
577
  @schemas << msg
451
- @index
578
+ [@index, msg]
452
579
  end
453
580
 
454
581
  def send(msg)
455
582
  @queue.push msg
456
583
  end
584
+
585
+ def send_schema_update(msg)
586
+ @header_sent = true
587
+ @queue.push msg
588
+ end
457
589
 
458
590
  def init(nodeID, appName, startTime, protocol)
459
591
  @nodeID, @appName, @startTime, @protocol = nodeID, appName, startTime, protocol
@@ -469,7 +601,7 @@ module OML4R
469
601
  def initialize(url, domain)
470
602
  @domain = domain
471
603
  @url = url
472
- @index = 0
604
+ @index = -1
473
605
  @schemas = []
474
606
  @header_sent = false
475
607
  @queue = Queue.new
@@ -499,26 +631,15 @@ module OML4R
499
631
  d = (@domain == :default) ? @@default_domain : @domain
500
632
  raise MissingArgumentException.new "Missing domain name" unless d
501
633
  case @protocol || OML4R::DEF_PROTOCOL
502
- when 3
503
- header << "experiment-id: #{d}"
504
- header << "start_time: #{@startTime.tv_sec}"
634
+ when 4
635
+ header << "domain: #{d}"
636
+ header << "start-time: #{@startTime.tv_sec}"
505
637
  header << "sender-id: #{@nodeID}"
506
638
  header << "app-name: #{@appName}"
507
639
  @schemas.each do |s|
508
640
  header << "schema: #{s}"
509
641
  end
510
642
  header << ""
511
- when 4
512
- i = 0
513
- header << ""
514
- header << "0\t0\t#{i += 1}\t.\texperiment-id\t#{d}"
515
- header << "0\t0\t#{i += 1}\t.\tstart_time\t#{@startTime.tv_sec}"
516
- header << "0\t0\t#{i += 1}\t.\tsender-id\t#{@nodeID}"
517
- header << "0\t0\t#{i += 1}\t.\tapp-name\t#{@appName}"
518
- @schemas.each do |s|
519
- header << "0\t0\t#{i += 1}\t.\tschema\t#{s}"
520
- end
521
-
522
643
  else
523
644
  raise OML4RException.new "Unsupported protocol #{@protocol}"
524
645
  end
@@ -526,7 +647,6 @@ module OML4R
526
647
  end
527
648
 
528
649
  def start_runner
529
- header_sent = false
530
650
  @runner = Thread.new do
531
651
  active = true
532
652
  begin
@@ -586,6 +706,16 @@ module OML4R
586
706
 
587
707
  end # Channel
588
708
 
709
+
710
+ # Hard-code "schema0" measurement point
711
+ class ExperimentMetadata < MPBase
712
+ name :_experiment_metadata, :add_prefix => false
713
+ param :subject, :type => :string
714
+ param :key, :type => :string
715
+ param :value, :type => :string
716
+ end
717
+
718
+
589
719
  require 'logger'
590
720
 
591
721
  class Logger < ::Logger
@@ -601,7 +731,6 @@ module OML4R
601
731
  @@logger
602
732
  end
603
733
 
604
-
605
734
  end # module OML4R
606
735
 
607
736
  # vim: sw=2
data/lib/oml4r/version.rb CHANGED
@@ -5,7 +5,7 @@
5
5
  # ------------------
6
6
 
7
7
  module OML4R
8
- VERSION = "2.9.5"
8
+ VERSION = "2.9.6"
9
9
  VERSION_STRING = "OML4R Client V#{VERSION}"
10
10
  COPYRIGHT = "Copyright 2009-2013, NICTA"
11
11
  end
metadata CHANGED
@@ -1,33 +1,22 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: oml4r
3
- version: !ruby/object:Gem::Version
4
- hash: 33
5
- prerelease:
6
- segments:
7
- - 2
8
- - 9
9
- - 5
10
- version: 2.9.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.9.6
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - NICTA
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-09-02 00:00:00 Z
11
+ date: 2013-10-09 00:00:00.000000000 Z
19
12
  dependencies: []
20
-
21
- description: Simple OML client library for Ruby
22
- email:
13
+ description: '["Simple OML client library for Ruby"]'
14
+ email:
23
15
  - oml-user@lists.nicta.com.au
24
16
  executables: []
25
-
26
17
  extensions: []
27
-
28
18
  extra_rdoc_files: []
29
-
30
- files:
19
+ files:
31
20
  - .gitignore
32
21
  - Gemfile
33
22
  - LICENSE.txt
@@ -47,38 +36,31 @@ files:
47
36
  - lib/oml4r/version.rb
48
37
  - oml4r.gemspec
49
38
  homepage: http://oml.mytestbed.net
50
- licenses:
39
+ licenses:
51
40
  - MIT
41
+ metadata: {}
52
42
  post_install_message:
53
43
  rdoc_options: []
54
-
55
- require_paths:
44
+ require_paths:
56
45
  - lib
57
- required_ruby_version: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- hash: 3
63
- segments:
64
- - 0
65
- version: "0"
66
- required_rubygems_version: !ruby/object:Gem::Requirement
67
- none: false
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
- version: "0"
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
75
56
  requirements: []
76
-
77
57
  rubyforge_project:
78
- rubygems_version: 1.8.25
58
+ rubygems_version: 2.0.3
79
59
  signing_key:
80
- specification_version: 3
81
- summary: This is a simple client library for OML which does not use liboml2 and its filters, but connects directly to the server using the +text+ protocol. User can use this library to create ruby applications which can send measurement to the OML collection server.
60
+ specification_version: 4
61
+ summary: '["This is a simple client library for OML which does not use liboml2 and
62
+ its filters, but connects directly to the server using the +text+ protocol. User
63
+ can use this library to create ruby applications which can send measurement to the
64
+ OML collection server."]'
82
65
  test_files: []
83
-
84
66
  has_rdoc: