cert_open_data_visualizer 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
data/README.md
CHANGED
@@ -39,10 +39,13 @@ $ cert_open_data_visualizer #=> prints help
|
|
39
39
|
#=> clean - cleanes cache
|
40
40
|
#=> fetch - fetches new data if neccessary
|
41
41
|
#=> app - launces web server for visualizations in http://127.0.0.1:4567
|
42
|
+
#=> city - `city hel` - list details for each city containing `hel`
|
42
43
|
#=>
|
43
|
-
#=>
|
44
|
+
#=> Commands may download and parse data when neccesary.
|
45
|
+
#=> Data is cached so running commands gest faster when repeating those.
|
44
46
|
#=>
|
45
|
-
|
47
|
+
|
48
|
+
#=> A file cache is utilised for faster results.
|
46
49
|
#=> ie. information is calculated only when necessary, and cached for
|
47
50
|
#=> further use. Cache may be cleared using `clean`
|
48
51
|
|
@@ -51,6 +54,10 @@ $ cert_open_data_visualizer first #=> Prints output specified by exercise descri
|
|
51
54
|
$ cert_open_data_visualizer second #=> Prints output specified by exercise description
|
52
55
|
|
53
56
|
$ cert_open_data_visualizer clean #=> Cleans cache
|
57
|
+
|
58
|
+
$ cert_open_data_visualizer city hel # Lists cities containing word given as parameter
|
59
|
+
# If multiple parameters are given, results are
|
60
|
+
# listed separately for each
|
54
61
|
```
|
55
62
|
|
56
63
|
#### Example using this as a library
|
@@ -26,6 +26,12 @@ class CertDataVisualizer
|
|
26
26
|
puts second_format
|
27
27
|
end
|
28
28
|
|
29
|
+
def filter_by_city(*citys)
|
30
|
+
citys.each do |city|
|
31
|
+
@formatter.filter_by_city(city)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
29
35
|
def clean_cache!
|
30
36
|
puts "Cleaning cache!"
|
31
37
|
CertOpenDataVisualizer::DummyCacher.new.clean!
|
@@ -14,17 +14,18 @@ module CertOpenDataVisualizer
|
|
14
14
|
first: "print_first_format",
|
15
15
|
second: "print_second_format",
|
16
16
|
app: "start-app",
|
17
|
+
city: "filter_by_city",
|
17
18
|
help: "print_help"}
|
18
19
|
|
19
20
|
return help if @argv[0].nil?
|
20
|
-
command = @argv
|
21
|
+
command = @argv.shift.to_sym
|
21
22
|
|
22
23
|
exec = commands[command]
|
23
24
|
|
24
25
|
return run_app if exec == "start-app"
|
25
26
|
|
26
27
|
return help if exec == "print_help"
|
27
|
-
return visualizer.send(exec) if exec
|
28
|
+
return visualizer.send(exec, *argv) if exec
|
28
29
|
puts "Invalid command #{command}"
|
29
30
|
end
|
30
31
|
|
@@ -39,10 +40,11 @@ Commands are:
|
|
39
40
|
clean - cleanes cache
|
40
41
|
fetch - fetches new data if neccessary
|
41
42
|
app - launces web server for visualizations in http://127.0.0.1:4567
|
43
|
+
city - `city hel` - list details for each city containing `hel`
|
42
44
|
|
43
|
-
|
45
|
+
Commands may download and parse data when neccesary.
|
44
46
|
|
45
|
-
|
47
|
+
A file cache is utilised for faster results.
|
46
48
|
ie. information is calculated only when necessary, and cached for
|
47
49
|
further use. Cache may be cleared using `clean`
|
48
50
|
EOF
|
@@ -46,6 +46,55 @@ module CertOpenDataVisualizer
|
|
46
46
|
incidents_str
|
47
47
|
end
|
48
48
|
|
49
|
+
def filter_by_city(name)
|
50
|
+
# get everything matching
|
51
|
+
load_data! if @data.nil?
|
52
|
+
filterd = @data.select do |line|
|
53
|
+
line[8].downcase.include? name
|
54
|
+
end
|
55
|
+
|
56
|
+
# create hash for formatting
|
57
|
+
results = generate_city_hash(filterd)
|
58
|
+
# print in nice format
|
59
|
+
print_city_results(results)
|
60
|
+
end
|
61
|
+
|
62
|
+
def generate_city_hash(list)
|
63
|
+
results = {}
|
64
|
+
list.each do |l|
|
65
|
+
country, city, main, sub = l[7], l[8], l[5], l[6]
|
66
|
+
if results[country].nil?
|
67
|
+
results[country] = { city => { main => { sub => 1 } }}
|
68
|
+
elsif results[country][city].nil?
|
69
|
+
results[country][city] = {main => { sub => 1 } }
|
70
|
+
elsif results[country][city][main].nil?
|
71
|
+
results[country][city][main] = { sub => 1 }
|
72
|
+
elsif results[country][city][main][sub].nil?
|
73
|
+
results[country][city][main][sub] = 1
|
74
|
+
else
|
75
|
+
results[country][city][main][sub] += 1
|
76
|
+
end
|
77
|
+
end
|
78
|
+
results
|
79
|
+
end
|
80
|
+
|
81
|
+
def print_city_results(results)
|
82
|
+
results.keys.each do |country|
|
83
|
+
puts "#{country}:"
|
84
|
+
next if results[country].nil?
|
85
|
+
results[country].keys.each do |city|
|
86
|
+
puts " #{city}:"
|
87
|
+
next if results[country][city].nil?
|
88
|
+
results[country][city].keys.each do |main|
|
89
|
+
puts " #{main}:"
|
90
|
+
next if results[country][city][main].nil?
|
91
|
+
results[country][city][main].keys.each do |sub|
|
92
|
+
puts " #{sub}: #{results[country][city][main][sub] }"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
49
98
|
|
50
99
|
private
|
51
100
|
def count_main_incidents
|
@@ -3,6 +3,7 @@ module CertOpenDataVisualizer
|
|
3
3
|
require 'httparty'
|
4
4
|
require 'tmpdir'
|
5
5
|
require 'csv'
|
6
|
+
require 'json'
|
6
7
|
|
7
8
|
class Visualize
|
8
9
|
attr_accessor :all_data, :cacher
|
@@ -14,15 +15,14 @@ module CertOpenDataVisualizer
|
|
14
15
|
|
15
16
|
def parse
|
16
17
|
maybe_download
|
17
|
-
files =
|
18
|
-
|
18
|
+
files = maybe_extract_and_list_files
|
19
|
+
maybe_read_and_merge_files(files)
|
19
20
|
self
|
20
21
|
end
|
21
22
|
|
22
23
|
def maybe_download
|
23
24
|
if @cacher.file_exists?("cert.zip")
|
24
|
-
puts "
|
25
|
-
@cacher.get_from_cache("cert.zip")
|
25
|
+
puts "File found in cache, not downloading"
|
26
26
|
else
|
27
27
|
download
|
28
28
|
end
|
@@ -32,20 +32,28 @@ module CertOpenDataVisualizer
|
|
32
32
|
puts "Downloading, may take a while depending on your connection"
|
33
33
|
data = HTTParty.get(CSV_DATA_URL).body
|
34
34
|
puts "Done"
|
35
|
-
write_tmp_file(data)
|
35
|
+
write_tmp_file("cert.zip", data)
|
36
36
|
end
|
37
37
|
|
38
|
-
def write_tmp_file(contents)
|
39
|
-
@cacher.write_file_to_cache
|
38
|
+
def write_tmp_file(filename, contents)
|
39
|
+
@cacher.write_file_to_cache filename, contents
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
43
|
-
@cacher.
|
42
|
+
def maybe_extract_and_list_files
|
43
|
+
if @cacher.file_exists? "cert.zip" and not @cacher.file_exists? "certfi_autoreporter_opendata_2006.csv"
|
44
|
+
@cacher.unzip_file("cert.zip")
|
45
|
+
end
|
44
46
|
@cacher.find_files_matching("*.csv")
|
45
47
|
end
|
46
48
|
|
47
|
-
def
|
48
|
-
@all_data
|
49
|
+
def maybe_read_and_merge_files(files)
|
50
|
+
if @cacher.file_exists? "all_data.json"
|
51
|
+
@all_data = JSON.parse(File.read(@cacher.get_from_cache("all_data.json")))
|
52
|
+
else
|
53
|
+
@all_data = get_csvs(files)
|
54
|
+
write_tmp_file("all_data.json", @all_data.to_json)
|
55
|
+
end
|
56
|
+
@all_data
|
49
57
|
end
|
50
58
|
|
51
59
|
private
|