geoptima 0.1.4 → 0.1.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.
data/bin/csv_chart CHANGED
@@ -10,7 +10,7 @@ require 'geoptima/options'
10
10
  require 'fileutils'
11
11
  require 'geoptima/daterange'
12
12
 
13
- Geoptima::assert_version("0.1.4")
13
+ Geoptima::assert_version("0.1.6")
14
14
  Geoptima::Chart.available? || puts("No charting libraries available") || exit(-1)
15
15
 
16
16
  $export_dir = '.'
@@ -37,18 +37,19 @@ $merge_all = true if($time_split)
37
37
  $help = true unless($files.length>0)
38
38
  if $help
39
39
  puts <<EOHELP
40
- Usage: csv_chart <-dhamt> <-S specfile> <-N name> <-D dir> <-T range> <-P diversity> files...
41
- -d debug mode #{cw $debug}
42
- -h print this help #{cw $help}
43
- -a automatically create charts for all properties #{cw $create_all}
44
- -m merge all files into single stats #{cw $merge_all}
45
- -t merge and split by time (days) #{cw $time_split}
46
- -N use specified name for merged dataset: #{$merged_name}
47
- -D export charts to specified directory: #{$export_dir}
48
- -S use chart specification in specified file: #{$specfile}
49
- -P diversity threshold in percentage for automatic reports: #{$diversity}
50
- -T set time-range filter: #{$time_range}
51
- -W set default chart-width: #{$chart_width}
40
+ Usage: csv_chart <-dhamtf> <-S specfile> <-N name> <-D dir> <-T range> <-P diversity> files...
41
+ -d debug mode #{cw $debug}
42
+ -h print this help #{cw $help}
43
+ -a automatically create charts for all properties #{cw $create_all}
44
+ -m merge all files into single stats #{cw $merge_all}
45
+ -t merge and split by time (days) #{cw $time_split}
46
+ -f flush stdout #{cw $flush_stdout}
47
+ -N use specified name for merged dataset: #{$merged_name}
48
+ -D export charts to specified directory: #{$export_dir}
49
+ -S use chart specification in specified file: #{$specfile}
50
+ -P diversity threshold in percentage for automatic reports: #{$diversity}
51
+ -T set time-range filter: #{$time_range}
52
+ -W set default chart-width: #{$chart_width}
52
53
  Files to import: #{$files.join(', ')}
53
54
  EOHELP
54
55
  exit
@@ -224,18 +225,18 @@ module Geoptima
224
225
  val
225
226
  end
226
227
  end
227
- def prepare_values(values)
228
+ def prepare_values(all_values)
228
229
  @values = []
229
230
  if @indices
230
231
  puts "StatSpec[#{self}]: #{options.inspect}" if($debug)
231
- @values = @indices.map{|i| values[i]}
232
+ @values = @indices.map{|i| all_values[i]}
232
233
  puts "\tVALUES: #{values.inspect}" if($debug)
233
234
  end
234
235
  @values
235
236
  end
236
- def vals_for(values,filter={})
237
+ def vals_for(all_values,filter={})
237
238
  if @indices
238
- prepare_values(values)
239
+ prepare_values(all_values)
239
240
  (options[:filter] || filter).each do |field,expected|
240
241
  puts "\t\tChecking if field #{field} is #{expected}" if($debug)
241
242
  puts "\t\tLooking for #{field} or #{event}.#{field} in #{@fields.inspect}" if($debug)
@@ -246,8 +247,8 @@ module Geoptima
246
247
  values
247
248
  end
248
249
  end
249
- def map_fields(values,filter={})
250
- if vals = vals_for(values,filter)
250
+ def map_fields(all_values,filter={})
251
+ if vals = vals_for(all_values,filter)
251
252
  val = proc.nil? ? vals[0] : proc.call(*vals)
252
253
  puts "\tBLOCK MAP: #{vals.inspect} --> #{val.inspect}" if($debug)
253
254
  if options[:div]
data/bin/csv_merge CHANGED
@@ -9,7 +9,7 @@ require 'geoptima/options'
9
9
  require 'fileutils'
10
10
  require 'geoptima/daterange'
11
11
 
12
- Geoptima::assert_version("0.1.4")
12
+ Geoptima::assert_version("0.1.6")
13
13
 
14
14
  $export_dir = '.'
15
15
  $export_name = 'merged.csv'
data/bin/show_geoptima CHANGED
@@ -8,7 +8,7 @@ require 'date'
8
8
  require 'geoptima'
9
9
  require 'geoptima/options'
10
10
 
11
- Geoptima::assert_version("0.1.4")
11
+ Geoptima::assert_version("0.1.6")
12
12
 
13
13
  $debug=false
14
14
 
@@ -117,6 +117,7 @@ Usage: show_geoptima <-dpvxomlsah> <-L limit> <-E types> <-T min,max> <-M mapfil
117
117
  -l longer header list (phone and operator fields) #{cw $more_headers}
118
118
  -s seperate the export files by event type #{cw $seperate}
119
119
  -a combine all IMEI's into a single dataset #{cw $combine_all}
120
+ -f flush stdout #{cw $flush_stdout}
120
121
  -h show this help
121
122
  -P prefix for exported files (default: ''; current: #{$export_prefix})
122
123
  -E comma-seperated list of event types to show and export (default: all; current: #{$event_names.join(',')})
@@ -202,15 +203,15 @@ class Export
202
203
  when 'LAC-CI'
203
204
  "#{dataset.recent(event,'service.lac')}-#{dataset.recent(event,'service.cell_id')}"
204
205
  when 'MCC'
205
- event.file[h] || dataset.recent(event,'service.mcc')
206
+ event.file[h] || dataset.recent(event,'service.mcc',3600)
206
207
  when 'MNC'
207
- event.file[h] || dataset.recent(event,'service.mnc')
208
+ event.file[h] || dataset.recent(event,'service.mnc',3600)
208
209
  when 'Battery'
209
210
  dataset.recent(event,'batteryState.state',600)
210
211
  when 'Operator'
211
- event.file['carrierName']
212
- when 'IMSI'
213
- event.file['imsi']
212
+ event.file['carrierName'] || dataset.recent(event,'carrierName',3600)
213
+ when 'IMSI', 'OS', 'Platform', 'IMSI', 'MSISDN', 'Model'
214
+ event.file[h] || dataset.recent(event,h,3600)
214
215
  else
215
216
  event.file[h]
216
217
  end
@@ -283,13 +284,14 @@ def if_le
283
284
  $count += 1
284
285
  end
285
286
 
286
- puts "Found #{$datasets.length} IMEIs"
287
+ puts "Found #{$datasets.length} datasets: #{$datasets.values.join('; ')}"
288
+
287
289
  $datasets.keys.sort.each do |imei|
288
290
  dataset = $datasets[imei]
289
291
  imsi = dataset.imsi
290
292
  events = dataset.sorted
291
293
  puts if($print)
292
- puts "Found #{dataset}"
294
+ puts "Found #{dataset.description}"
293
295
  if $verbose
294
296
  puts "\tFirst Event: #{dataset.first}"
295
297
  puts "\tLast Event: #{dataset.last}"
@@ -10,7 +10,7 @@ require 'geoptima/options'
10
10
  require 'fileutils'
11
11
  require 'geoptima/daterange'
12
12
 
13
- Geoptima::assert_version("0.1.4")
13
+ Geoptima::assert_version("0.1.6")
14
14
  Geoptima::Chart.available? || puts("No charting libraries available") || exit(-1)
15
15
 
16
16
  $export_dir = '.'
@@ -37,18 +37,19 @@ $merge_all = true if($time_split)
37
37
  $help = true unless($files.length>0)
38
38
  if $help
39
39
  puts <<EOHELP
40
- Usage: csv_chart <-dhamt> <-S specfile> <-N name> <-D dir> <-T range> <-P diversity> files...
41
- -d debug mode #{cw $debug}
42
- -h print this help #{cw $help}
43
- -a automatically create charts for all properties #{cw $create_all}
44
- -m merge all files into single stats #{cw $merge_all}
45
- -t merge and split by time (days) #{cw $time_split}
46
- -N use specified name for merged dataset: #{$merged_name}
47
- -D export charts to specified directory: #{$export_dir}
48
- -S use chart specification in specified file: #{$specfile}
49
- -P diversity threshold in percentage for automatic reports: #{$diversity}
50
- -T set time-range filter: #{$time_range}
51
- -W set default chart-width: #{$chart_width}
40
+ Usage: csv_chart <-dhamtf> <-S specfile> <-N name> <-D dir> <-T range> <-P diversity> files...
41
+ -d debug mode #{cw $debug}
42
+ -h print this help #{cw $help}
43
+ -a automatically create charts for all properties #{cw $create_all}
44
+ -m merge all files into single stats #{cw $merge_all}
45
+ -t merge and split by time (days) #{cw $time_split}
46
+ -f flush stdout #{cw $flush_stdout}
47
+ -N use specified name for merged dataset: #{$merged_name}
48
+ -D export charts to specified directory: #{$export_dir}
49
+ -S use chart specification in specified file: #{$specfile}
50
+ -P diversity threshold in percentage for automatic reports: #{$diversity}
51
+ -T set time-range filter: #{$time_range}
52
+ -W set default chart-width: #{$chart_width}
52
53
  Files to import: #{$files.join(', ')}
53
54
  EOHELP
54
55
  exit
@@ -224,18 +225,18 @@ module Geoptima
224
225
  val
225
226
  end
226
227
  end
227
- def prepare_values(values)
228
+ def prepare_values(all_values)
228
229
  @values = []
229
230
  if @indices
230
231
  puts "StatSpec[#{self}]: #{options.inspect}" if($debug)
231
- @values = @indices.map{|i| values[i]}
232
+ @values = @indices.map{|i| all_values[i]}
232
233
  puts "\tVALUES: #{values.inspect}" if($debug)
233
234
  end
234
235
  @values
235
236
  end
236
- def vals_for(values,filter={})
237
+ def vals_for(all_values,filter={})
237
238
  if @indices
238
- prepare_values(values)
239
+ prepare_values(all_values)
239
240
  (options[:filter] || filter).each do |field,expected|
240
241
  puts "\t\tChecking if field #{field} is #{expected}" if($debug)
241
242
  puts "\t\tLooking for #{field} or #{event}.#{field} in #{@fields.inspect}" if($debug)
@@ -246,8 +247,8 @@ module Geoptima
246
247
  values
247
248
  end
248
249
  end
249
- def map_fields(values,filter={})
250
- if vals = vals_for(values,filter)
250
+ def map_fields(all_values,filter={})
251
+ if vals = vals_for(all_values,filter)
251
252
  val = proc.nil? ? vals[0] : proc.call(*vals)
252
253
  puts "\tBLOCK MAP: #{vals.inspect} --> #{val.inspect}" if($debug)
253
254
  if options[:div]
@@ -9,7 +9,7 @@ require 'geoptima/options'
9
9
  require 'fileutils'
10
10
  require 'geoptima/daterange'
11
11
 
12
- Geoptima::assert_version("0.1.4")
12
+ Geoptima::assert_version("0.1.6")
13
13
 
14
14
  $export_dir = '.'
15
15
  $export_name = 'merged.csv'
@@ -8,7 +8,7 @@ require 'date'
8
8
  require 'geoptima'
9
9
  require 'geoptima/options'
10
10
 
11
- Geoptima::assert_version("0.1.4")
11
+ Geoptima::assert_version("0.1.6")
12
12
 
13
13
  $debug=false
14
14
 
@@ -117,6 +117,7 @@ Usage: show_geoptima <-dpvxomlsah> <-L limit> <-E types> <-T min,max> <-M mapfil
117
117
  -l longer header list (phone and operator fields) #{cw $more_headers}
118
118
  -s seperate the export files by event type #{cw $seperate}
119
119
  -a combine all IMEI's into a single dataset #{cw $combine_all}
120
+ -f flush stdout #{cw $flush_stdout}
120
121
  -h show this help
121
122
  -P prefix for exported files (default: ''; current: #{$export_prefix})
122
123
  -E comma-seperated list of event types to show and export (default: all; current: #{$event_names.join(',')})
@@ -202,15 +203,15 @@ class Export
202
203
  when 'LAC-CI'
203
204
  "#{dataset.recent(event,'service.lac')}-#{dataset.recent(event,'service.cell_id')}"
204
205
  when 'MCC'
205
- event.file[h] || dataset.recent(event,'service.mcc')
206
+ event.file[h] || dataset.recent(event,'service.mcc',3600)
206
207
  when 'MNC'
207
- event.file[h] || dataset.recent(event,'service.mnc')
208
+ event.file[h] || dataset.recent(event,'service.mnc',3600)
208
209
  when 'Battery'
209
210
  dataset.recent(event,'batteryState.state',600)
210
211
  when 'Operator'
211
- event.file['carrierName']
212
- when 'IMSI'
213
- event.file['imsi']
212
+ event.file['carrierName'] || dataset.recent(event,'carrierName',3600)
213
+ when 'IMSI', 'OS', 'Platform', 'IMSI', 'MSISDN', 'Model'
214
+ event.file[h] || dataset.recent(event,h,3600)
214
215
  else
215
216
  event.file[h]
216
217
  end
@@ -283,13 +284,14 @@ def if_le
283
284
  $count += 1
284
285
  end
285
286
 
286
- puts "Found #{$datasets.length} IMEIs"
287
+ puts "Found #{$datasets.length} datasets: #{$datasets.values.join('; ')}"
288
+
287
289
  $datasets.keys.sort.each do |imei|
288
290
  dataset = $datasets[imei]
289
291
  imsi = dataset.imsi
290
292
  events = dataset.sorted
291
293
  puts if($print)
292
- puts "Found #{dataset}"
294
+ puts "Found #{dataset.description}"
293
295
  if $verbose
294
296
  puts "\tFirst Event: #{dataset.first}"
295
297
  puts "\tLast Event: #{dataset.last}"
data/lib/geoptima/data.rb CHANGED
@@ -239,10 +239,10 @@ module Geoptima
239
239
 
240
240
  class Dataset
241
241
 
242
- attr_reader :imei, :options
242
+ attr_reader :name, :options
243
243
 
244
- def initialize(imei,options={})
245
- @imei = imei
244
+ def initialize(name,options={})
245
+ @name = name
246
246
  @data = []
247
247
  @options = options
248
248
  @time_range = options[:time_range] || DateRange.new(Config[:min_datetime],Config[:max_datetime])
@@ -263,14 +263,26 @@ module Geoptima
263
263
  end
264
264
 
265
265
  def imsis
266
- @imsis ||= @data.inject({}) do |a,d|
267
- a[d['imsi']] ||= 0
268
- a[d['imsi']] += d.count.to_i
266
+ @imsis ||= make_all_from_metadata('imsi')
267
+ end
268
+
269
+ def imei
270
+ imeis[0]
271
+ end
272
+
273
+ def imeis
274
+ @imeis ||= make_all_from_metadata('imei')
275
+ end
276
+
277
+ def make_all_from_metadata(field_name)
278
+ @data.inject({}) do |a,d|
279
+ a[d[field_name]] ||= 0
280
+ a[d[field_name]] += d.count.to_i
269
281
  a
270
282
  end.to_a.sort do |a,b|
271
283
  b[1]<=>a[1]
272
284
  end.map do |x|
273
- #puts "Have IMSI: #{x.join('=')}"
285
+ #puts "Have #{field_name}: #{x.join('=')}"
274
286
  x[0]
275
287
  end.compact.uniq
276
288
  end
@@ -304,18 +316,18 @@ module Geoptima
304
316
  end
305
317
 
306
318
  def [](key)
307
- @fields[key.downcase] ||= @data.map{|d| d[key]}.compact.uniq[0]
319
+ @fields[key.downcase] ||= @data.map{|d| d[key]}.compact.uniq
308
320
  end
309
321
 
310
- def platform
322
+ def platforms
311
323
  self['Platform']
312
324
  end
313
325
 
314
- def model
326
+ def models
315
327
  self['Model']
316
328
  end
317
329
 
318
- def os
330
+ def oses
319
331
  self['OS']
320
332
  end
321
333
 
@@ -345,8 +357,8 @@ module Geoptima
345
357
 
346
358
  def header(names=nil)
347
359
  merge_events unless @sorted
348
- (names || events_names).map do |name|
349
- [(s=sorted(name)[0]) && s.header]
360
+ (names || events_names).map do |event_type|
361
+ [(s=sorted(event_type)[0]) && s.header]
350
362
  end.flatten
351
363
  end
352
364
 
@@ -420,7 +432,11 @@ module Geoptima
420
432
  end
421
433
 
422
434
  def to_s
423
- "IMEI:#{imei}, IMSI:#{imsis.join(',')}, Platform:#{platform}, Model:#{model}, OS:#{os}, Files:#{file_count}, Events:#{sorted && sorted.length}"
435
+ (imei.to_s.length < 1 || name == imei) ? name : imeis.join(',')
436
+ end
437
+
438
+ def description
439
+ "Dataset:#{name}, IMEI:#{imeis.join(',')}, IMSI:#{imsis.join(',')}, Platform:#{platforms.join(',')}, Model:#{models.join(',')}, OS:#{oses.join(',')}, Files:#{file_count}, Events:#{sorted && sorted.length}"
424
440
  end
425
441
 
426
442
  def self.make_datasets(files, options={})
@@ -45,6 +45,7 @@ module Geoptima
45
45
 
46
46
  def self.process_args(debug=nil)
47
47
  options = Options.new(debug)
48
+ options.add('f') {$flush_stdout = true}
48
49
  options.add('v') {$print_version = true}
49
50
  options.add('d') {$debug = true}
50
51
  options.add('h') {$help = true}
@@ -60,6 +61,7 @@ module Geoptima
60
61
  end
61
62
  end
62
63
  puts "Geoptima Gem Version: #{Geoptima::VERSION}" if($print_version)
64
+ STDOUT.sync if($flush_stdout)
63
65
  options.args
64
66
  end
65
67
 
@@ -1,6 +1,6 @@
1
1
  module Geoptima
2
2
 
3
- VERSION = "0.1.4"
3
+ VERSION = "0.1.6"
4
4
 
5
5
  def self.version_as_int(ver)
6
6
  base = 1
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoptima
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 4
10
- version: 0.1.4
9
+ - 6
10
+ version: 0.1.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Craig Taverner
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-17 00:00:00 +02:00
18
+ date: 2012-04-23 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency