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 +20 -19
- data/bin/csv_merge +1 -1
- data/bin/show_geoptima +10 -8
- data/examples/csv_chart.rb +20 -19
- data/examples/csv_merge.rb +1 -1
- data/examples/show_geoptima.rb +10 -8
- data/lib/geoptima/data.rb +30 -14
- data/lib/geoptima/options.rb +2 -0
- data/lib/geoptima/version.rb +1 -1
- metadata +4 -4
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.
|
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 <-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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(
|
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|
|
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(
|
237
|
+
def vals_for(all_values,filter={})
|
237
238
|
if @indices
|
238
|
-
prepare_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(
|
250
|
-
if vals = vals_for(
|
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
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.
|
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[
|
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}
|
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/examples/csv_chart.rb
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.
|
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 <-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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(
|
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|
|
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(
|
237
|
+
def vals_for(all_values,filter={})
|
237
238
|
if @indices
|
238
|
-
prepare_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(
|
250
|
-
if vals = vals_for(
|
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/examples/csv_merge.rb
CHANGED
data/examples/show_geoptima.rb
CHANGED
@@ -8,7 +8,7 @@ require 'date'
|
|
8
8
|
require 'geoptima'
|
9
9
|
require 'geoptima/options'
|
10
10
|
|
11
|
-
Geoptima::assert_version("0.1.
|
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[
|
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}
|
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 :
|
242
|
+
attr_reader :name, :options
|
243
243
|
|
244
|
-
def initialize(
|
245
|
-
@
|
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 ||=
|
267
|
-
|
268
|
-
|
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
|
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
|
319
|
+
@fields[key.downcase] ||= @data.map{|d| d[key]}.compact.uniq
|
308
320
|
end
|
309
321
|
|
310
|
-
def
|
322
|
+
def platforms
|
311
323
|
self['Platform']
|
312
324
|
end
|
313
325
|
|
314
|
-
def
|
326
|
+
def models
|
315
327
|
self['Model']
|
316
328
|
end
|
317
329
|
|
318
|
-
def
|
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 |
|
349
|
-
[(s=sorted(
|
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
|
-
|
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={})
|
data/lib/geoptima/options.rb
CHANGED
@@ -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
|
|
data/lib/geoptima/version.rb
CHANGED
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:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
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-
|
18
|
+
date: 2012-04-23 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|