spout 0.8.0.beta1 → 0.8.0.beta2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -9
- data/README.md +30 -13
- data/lib/spout/actions.rb +9 -6
- data/lib/spout/commands/coverage.rb +75 -0
- data/lib/spout/commands/graphs.rb +94 -146
- data/lib/spout/commands/images.rb +276 -0
- data/lib/spout/helpers/chart_types.rb +17 -6
- data/lib/spout/helpers/subject_loader.rb +71 -0
- data/lib/spout/models/coverage_result.rb +65 -0
- data/lib/spout/tasks/engine.rake +7 -139
- data/lib/spout/templates/gitignore +1 -1
- data/lib/spout/version.rb +1 -1
- metadata +6 -3
- data/lib/spout/commands/json_charts_and_tables.rb +0 -202
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e4150e7322cba034877fabe6e4a6cec8bdcd444
|
4
|
+
data.tar.gz: 25d7aba466f6667316378a3582f6625c1f541bf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04137f2579d7da8bf3bcc5ad4105d7ccfe78799656015bbdc0b3e0b34a2503522eb90312919969dad7ec0fbaa6f60231aec7f90bda1e8bbfd8817b28e06e6aea
|
7
|
+
data.tar.gz: 98fae07b2e79ee985c0ef849b6e0e2706c824d0f7d5c767ca2c97b24523fefd92da973b4ccb762273c814a2843f365dadbca5535a1d7f3f388aa1d5f9ead8336
|
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
## 0.8.0
|
2
2
|
|
3
3
|
### Enhancements
|
4
|
-
- Added `spout
|
4
|
+
- Added `spout graphs` command that generates JSON charts and tables of each variable in a dataset
|
5
5
|
- This command requires a .spout.yml file to be specified to identify the following variables:
|
6
6
|
- `visit`: This variable is used to separate subject encounters in a histogram
|
7
7
|
- `charts`: Array of choices, numeric, or integer variables for charts
|
8
|
+
- The `spout pngs` command now renders the histogram form for each variable
|
8
9
|
- **Gem Changes**
|
9
10
|
- Updated to colorize 0.7.2
|
10
11
|
- Use of Ruby 2.1.2 is now recommended
|
@@ -12,16 +13,16 @@
|
|
12
13
|
## 0.7.0 (April 16, 2014)
|
13
14
|
|
14
15
|
### Enhancements
|
15
|
-
- Added `spout
|
16
|
+
- Added `spout pngs` command that generates pie charts and histograms of each variable in a dataset
|
16
17
|
- The following flags are available:
|
17
|
-
- `spout
|
18
|
-
- `spout
|
19
|
-
- `spout
|
20
|
-
- `spout
|
21
|
-
- `spout
|
22
|
-
- `spout
|
18
|
+
- `spout p --type-numeric`
|
19
|
+
- `spout p --type-integer`
|
20
|
+
- `spout p --type-choices`
|
21
|
+
- `spout p --size-lg`
|
22
|
+
- `spout p --size-sm`
|
23
|
+
- `spout p --type-numeric --size-sm`
|
23
24
|
- For specific variables the following can be used:
|
24
|
-
- `spout
|
25
|
+
- `spout p --id-<variable_id>`
|
25
26
|
|
26
27
|
## 0.6.0 (March 7, 2014)
|
27
28
|
|
data/README.md
CHANGED
@@ -146,35 +146,35 @@ You can optionally provide a version string
|
|
146
146
|
spout export [1.0.0]
|
147
147
|
```
|
148
148
|
|
149
|
-
### Generate
|
149
|
+
### Generate images for data in your dataset
|
150
150
|
|
151
|
-
Spout lets you generate
|
151
|
+
Spout lets you generate images for each variable defined in your dataset. Make sure to run `spout coverage` first to validate that your data dictionary and dataset match.
|
152
152
|
|
153
153
|
This command will take some time, and requires [PhantomJS](http://phantomjs.org/) to be installed on your system.
|
154
154
|
|
155
155
|
```
|
156
|
-
spout
|
156
|
+
spout pngs
|
157
157
|
```
|
158
158
|
|
159
|
-
The following flags can be passed to the `spout
|
159
|
+
The following flags can be passed to the `spout pngs` command:
|
160
160
|
|
161
|
-
- `spout
|
162
|
-
- `spout
|
163
|
-
- `spout
|
164
|
-
- `spout
|
165
|
-
- `spout
|
166
|
-
- `spout
|
161
|
+
- `spout p --type-numeric`
|
162
|
+
- `spout p --type-integer`
|
163
|
+
- `spout p --type-choices`
|
164
|
+
- `spout p --size-lg`
|
165
|
+
- `spout p --size-sm`
|
166
|
+
- `spout p --type-numeric --size-sm`
|
167
167
|
|
168
168
|
For specific variables the following can be used:
|
169
|
-
- `spout
|
169
|
+
- `spout p --id-<variable_id>`
|
170
170
|
|
171
|
-
Generated
|
171
|
+
Generated images are placed in: `./images/`
|
172
172
|
|
173
173
|
|
174
174
|
### Generate charts and tables for data in your dataset
|
175
175
|
|
176
176
|
```
|
177
|
-
spout
|
177
|
+
spout graphs
|
178
178
|
```
|
179
179
|
|
180
180
|
This command generates JSON charts and tables of each variable in a dataset
|
@@ -194,6 +194,23 @@ charts:
|
|
194
194
|
- race
|
195
195
|
```
|
196
196
|
|
197
|
+
To only generate graphs for a few select variables, add the variable names after the `spout graphs` command.
|
198
|
+
|
199
|
+
For example, the command below will only generate graphs for the two variables `ahi` and `bmi`.
|
200
|
+
|
201
|
+
```
|
202
|
+
spout g ahi bmi
|
203
|
+
```
|
204
|
+
|
205
|
+
You can also specify a limit to the amount of rows to read in from the CSV files by specifying the `-rows` flag
|
206
|
+
|
207
|
+
```
|
208
|
+
spout -rows=10 ahi
|
209
|
+
```
|
210
|
+
|
211
|
+
This will generate a graph for ahi for the first 10 rows of each dataset CSV.
|
212
|
+
|
213
|
+
|
197
214
|
This will generate charts and tables for each variable in the dataset plotted against the variables listed under `charts`.
|
198
215
|
|
199
216
|
|
data/lib/spout/actions.rb
CHANGED
@@ -21,9 +21,9 @@ module Spout
|
|
21
21
|
new_data_dictionary_export(argv, 'hybrid')
|
22
22
|
when 'coverage', '-coverage', '--coverage', 'c', '-c'
|
23
23
|
coverage_report(argv)
|
24
|
+
when 'pngs', '-pngs', '--pngs', 'p', '-p'
|
25
|
+
generate_images(argv.last(argv.size - 1))
|
24
26
|
when 'graphs', '-graphs', '--graphs', 'g', '-g'
|
25
|
-
generate_graphs(argv.last(argv.size - 1))
|
26
|
-
when 'json', 'j'
|
27
27
|
generate_charts_and_tables(argv.last(argv.size - 1))
|
28
28
|
else
|
29
29
|
help
|
@@ -70,9 +70,12 @@ The most common spout commands are:
|
|
70
70
|
dictionary format
|
71
71
|
[c]overage Coverage report, requires dataset CSVs
|
72
72
|
in `<project_name>/csvs/`
|
73
|
-
[
|
73
|
+
[p]ngs Generates images for each variable in a
|
74
74
|
dataset and places them
|
75
|
-
in `<project_name>/
|
75
|
+
in `<project_name>/images/<version>/`
|
76
|
+
[g]raphs Generates JSON graphs for each variable
|
77
|
+
in a dataset and places them
|
78
|
+
in `<project_name>/graphs/<version>/`
|
76
79
|
[v]ersion Returns the version of Spout
|
77
80
|
|
78
81
|
Commands can be referenced by the first letter:
|
@@ -131,7 +134,7 @@ EOT
|
|
131
134
|
flags.select{|f| f[0..((param.size + 3) - 1)] == "--#{param}-" and f.length > param.size + 3}.collect{|f| f[(param.size + 3)..-1]}
|
132
135
|
end
|
133
136
|
|
134
|
-
def
|
137
|
+
def generate_images(flags)
|
135
138
|
params = {}
|
136
139
|
params['types'] = flag_values(flags, 'type')
|
137
140
|
params['variable_ids'] = flag_values(flags, 'id')
|
@@ -139,7 +142,7 @@ EOT
|
|
139
142
|
|
140
143
|
params_string = params.collect{|key, values| "#{key}=#{values.join(',')}"}.join(' ')
|
141
144
|
|
142
|
-
system "bundle exec rake spout:
|
145
|
+
system "bundle exec rake spout:images #{params_string}"
|
143
146
|
end
|
144
147
|
|
145
148
|
def generate_charts_and_tables(variables)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
require 'spout/helpers/subject_loader'
|
4
|
+
require 'spout/models/coverage_result'
|
5
|
+
|
6
|
+
module Spout
|
7
|
+
module Commands
|
8
|
+
class Coverage
|
9
|
+
def initialize(standard_version)
|
10
|
+
@standard_version = standard_version
|
11
|
+
|
12
|
+
@variable_files = []
|
13
|
+
@valid_ids = []
|
14
|
+
@number_of_rows = 100
|
15
|
+
|
16
|
+
spout_config = YAML.load_file('.spout.yml')
|
17
|
+
@visit = (spout_config.kind_of?(Hash) ? spout_config['visit'].to_s.strip : '')
|
18
|
+
|
19
|
+
@subject_loader = Spout::Helpers::SubjectLoader.new(@variable_files, @valid_ids, @standard_version, @number_of_rows, @visit)
|
20
|
+
@subject_loader.load_subjects_from_csvs_part_one! # Not Part Two which is essentially cleaning the data
|
21
|
+
@subjects = @subject_loader.subjects
|
22
|
+
|
23
|
+
run_coverage_report!
|
24
|
+
end
|
25
|
+
|
26
|
+
def run_coverage_report!
|
27
|
+
choice_variables = []
|
28
|
+
|
29
|
+
Dir.glob("variables/**/*.json").each do |file|
|
30
|
+
if json = JSON.parse(File.read(file)) rescue false
|
31
|
+
choice_variables << json['id'] if json['type'] == 'choices'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
@matching_results = []
|
36
|
+
csv_names = ['tmp_csv_file.csv']
|
37
|
+
|
38
|
+
all_column_headers = @subjects.size > 0 ? @subjects.first.class.instance_methods(false).select{|k| k != :_visit}.reject{|k| k.to_s[-1] == '='} : []
|
39
|
+
all_column_headers.each do |column|
|
40
|
+
csv = 'tmp_csv_file.csv'
|
41
|
+
scr = Spout::Models::CoverageResult.new(csv, column.to_s, @subjects.collect(&column))
|
42
|
+
@matching_results << [ csv, column, scr ]
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
@matching_results.sort!{|a,b| [b[2].number_of_errors, a[0].to_s, a[1].to_s] <=> [a[2].number_of_errors, b[0].to_s, b[1].to_s]}
|
47
|
+
|
48
|
+
@coverage_results = []
|
49
|
+
|
50
|
+
csv_names.each do |csv_name|
|
51
|
+
total_column_count = @matching_results.select{|mr| mr[0] == csv_name}.count
|
52
|
+
mapped_column_count = @matching_results.select{|mr| mr[0] == csv_name and mr[2].number_of_errors == 0}.count
|
53
|
+
@coverage_results << [ csv_name, total_column_count, mapped_column_count ]
|
54
|
+
end
|
55
|
+
|
56
|
+
coverage_folder = File.join(Dir.pwd, 'coverage')
|
57
|
+
FileUtils.mkpath coverage_folder
|
58
|
+
coverage_file = File.join(coverage_folder, 'index.html')
|
59
|
+
|
60
|
+
print "\nGenerating: index.html\n\n"
|
61
|
+
|
62
|
+
File.open(coverage_file, 'w+') do |file|
|
63
|
+
erb_location = File.join( File.dirname(__FILE__), '../views/index.html.erb' )
|
64
|
+
file.puts ERB.new(File.read(erb_location)).result(binding)
|
65
|
+
end
|
66
|
+
|
67
|
+
open_command = 'open' if RUBY_PLATFORM.match(/darwin/) != nil
|
68
|
+
open_command = 'start' if RUBY_PLATFORM.match(/mingw/) != nil
|
69
|
+
|
70
|
+
system "#{open_command} #{coverage_file}" if ['start', 'open'].include?(open_command)
|
71
|
+
puts "#{coverage_file}\n\n"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -2,179 +2,127 @@ require 'csv'
|
|
2
2
|
require 'fileutils'
|
3
3
|
require 'rubygems'
|
4
4
|
require 'json'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
require 'spout/helpers/subject_loader'
|
8
|
+
require 'spout/helpers/chart_types'
|
5
9
|
|
6
10
|
module Spout
|
7
11
|
module Commands
|
8
12
|
class Graphs
|
13
|
+
def initialize(variables, standard_version)
|
14
|
+
@standard_version = standard_version
|
9
15
|
|
10
|
-
|
11
|
-
|
12
|
-
total_index_count = Dir.glob("variables/**/*.json").count
|
13
|
-
|
14
|
-
last_completed = 0
|
15
|
-
|
16
|
-
options_folder = 'graphs'
|
17
|
-
FileUtils.mkpath( options_folder )
|
18
|
-
tmp_options_file = File.join( options_folder, 'options.json' )
|
19
|
-
|
20
|
-
Dir.glob("csvs/*.csv").each do |csv_file|
|
21
|
-
puts "Working on: #{csv_file}"
|
22
|
-
t = Time.now
|
23
|
-
csv_table = CSV.table(csv_file, encoding: 'iso-8859-1').by_col!
|
24
|
-
puts "Loaded #{csv_file} in #{Time.now - t} seconds."
|
25
|
-
|
26
|
-
total_header_count = csv_table.headers.count
|
27
|
-
csv_table.headers.each_with_index do |header, index|
|
28
|
-
puts "Column #{ index + 1 } of #{ total_header_count } for #{header} in #{csv_file}"
|
29
|
-
if variable_file = Dir.glob("variables/**/#{header.downcase}.json", File::FNM_CASEFOLD).first
|
30
|
-
json = JSON.parse(File.read(variable_file)) rescue json = nil
|
31
|
-
next unless json
|
32
|
-
next unless ["choices", "numeric", "integer"].include?(json["type"])
|
33
|
-
next unless types.size == 0 or types.include?(json['type'])
|
34
|
-
next unless variable_ids.size == 0 or variable_ids.include?(json['id'].to_s.downcase)
|
35
|
-
|
36
|
-
basename = File.basename(variable_file).gsub(/\.json$/, '').downcase
|
37
|
-
col_data = csv_table[header]
|
38
|
-
|
39
|
-
case json["type"] when "choices"
|
40
|
-
domain_file = Dir.glob("domains/**/#{json['domain']}.json").first
|
41
|
-
domain_json = JSON.parse(File.read(domain_file)) rescue domain_json = nil
|
42
|
-
next unless domain_json
|
43
|
-
|
44
|
-
create_pie_chart_options_file(col_data, tmp_options_file, domain_json)
|
45
|
-
when 'numeric', 'integer'
|
46
|
-
create_line_chart_options_file(col_data, tmp_options_file, json["units"])
|
47
|
-
else
|
48
|
-
next
|
49
|
-
end
|
50
|
-
|
51
|
-
run_phantom_js("#{basename}-lg.png", 600, tmp_options_file) if sizes.size == 0 or sizes.include?('lg')
|
52
|
-
run_phantom_js("#{basename}.png", 75, tmp_options_file) if sizes.size == 0 or sizes.include?('sm')
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
File.delete(tmp_options_file) if File.exists?(tmp_options_file)
|
57
|
-
end
|
16
|
+
spout_config = YAML.load_file('.spout.yml')
|
58
17
|
|
59
|
-
|
60
|
-
categories = []
|
18
|
+
@visit = ''
|
61
19
|
|
62
|
-
|
20
|
+
if spout_config.kind_of?(Hash)
|
21
|
+
@visit = spout_config['visit'].to_s.strip
|
63
22
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
(0..(max_buckets-1)).each do |bucket|
|
75
|
-
val_min = (bucket_size * bucket) + minimum
|
76
|
-
val_max = bucket_size * (bucket + 1) + minimum
|
77
|
-
# Greater or equal to val_min, less than val_max
|
78
|
-
# categories << "'#{val_min} to #{val_max}'"
|
79
|
-
categories << "#{all_integers || (maximum - minimum) > (default_max_buckets / 2) ? val_min.round : "%0.02f" % val_min}"
|
23
|
+
chart_variables = if spout_config['charts'].kind_of?(Array)
|
24
|
+
spout_config['charts'].select{|c| c.kind_of?(Hash)}
|
25
|
+
else
|
26
|
+
[]
|
27
|
+
end
|
28
|
+
else
|
29
|
+
puts "The YAML file needs to be in the following format:"
|
30
|
+
puts "---\nvisit: visit_variable_name\ncharts:\n- chart: age_variable_name\n title: Age\n- chart: gender_variable_name\n title: Gender\n- chart: race_variable_name\n title: Race\n"
|
31
|
+
exit
|
80
32
|
end
|
81
33
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
34
|
+
if Spout::Helpers::ChartTypes::get_json(@visit, 'variable') == nil
|
35
|
+
if @visit == ''
|
36
|
+
puts "The visit variable in .spout.yml can't be blank."
|
37
|
+
else
|
38
|
+
puts "Could not find the following visit variable: #{@visit}"
|
39
|
+
end
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
missing_variables = chart_variables.select{|c| Spout::Helpers::ChartTypes::get_json(c['chart'], 'variable') == nil}
|
43
|
+
if missing_variables.count > 0
|
44
|
+
puts "Could not find the following chart variable#{'s' unless missing_variables.size == 1}: #{missing_variables.join(', ')}"
|
45
|
+
exit
|
88
46
|
end
|
89
47
|
|
90
|
-
|
91
|
-
|
92
|
-
values << { name: '', data: new_values, showInLegend: false }
|
48
|
+
argv_string = variables.join(',')
|
49
|
+
@number_of_rows = nil
|
93
50
|
|
94
|
-
|
95
|
-
|
51
|
+
if match_data = argv_string.match(/-rows=(\d*)/)
|
52
|
+
@number_of_rows = match_data[1].to_i
|
53
|
+
argv_string.gsub!(match_data[0], '')
|
54
|
+
end
|
96
55
|
|
56
|
+
@valid_ids = argv_string.split(',').compact.reject{|s| s == ''}
|
97
57
|
|
98
|
-
|
58
|
+
@chart_variables = chart_variables.unshift( { "chart" => @visit, "title" => 'Histogram' } )
|
99
59
|
|
100
|
-
|
101
|
-
counts = values.group_by{|a| a}.collect{|k,v| [(domain_json.select{|h| h['value'] == k.to_s}.first['display_name'] rescue (k.to_s == '' ? 'NULL' : k)), v.count]}
|
60
|
+
@variable_files = Dir.glob('variables/**/*.json')
|
102
61
|
|
103
|
-
|
62
|
+
t = Time.now
|
63
|
+
FileUtils.mkpath "graphs/#{@standard_version}"
|
104
64
|
|
105
|
-
|
65
|
+
@subject_loader = Spout::Helpers::SubjectLoader.new(@variable_files, @valid_ids, @standard_version, @number_of_rows, @visit)
|
106
66
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
"title": {
|
111
|
-
"text": ""
|
112
|
-
},
|
67
|
+
@subject_loader.load_subjects_from_csvs!
|
68
|
+
@subjects = @subject_loader.subjects
|
69
|
+
compute_tables_and_charts
|
113
70
|
|
114
|
-
|
115
|
-
"enabled": false,
|
116
|
-
},
|
117
|
-
"series": [{
|
118
|
-
"type": "pie",
|
119
|
-
"name": "",
|
120
|
-
"data": #{data.to_json}
|
121
|
-
}]
|
122
|
-
}
|
123
|
-
eos
|
124
|
-
end
|
71
|
+
puts "Took #{Time.now - t} seconds."
|
125
72
|
end
|
126
73
|
|
74
|
+
def compute_tables_and_charts
|
75
|
+
variable_files_count = @variable_files.count
|
76
|
+
@variable_files.each_with_index do |variable_file, file_index|
|
77
|
+
json = JSON.parse(File.read(variable_file)) rescue json = nil
|
78
|
+
next unless json
|
79
|
+
next unless @valid_ids.include?(json["id"].to_s.downcase) or @valid_ids.size == 0
|
80
|
+
next unless ["numeric", "integer", "choices"].include?(json["type"])
|
81
|
+
variable_name = json['id'].to_s.downcase
|
82
|
+
next unless Spout::Models::Subject.method_defined?(variable_name)
|
83
|
+
|
84
|
+
puts "#{file_index+1} of #{variable_files_count}: #{variable_file.gsub(/(^variables\/|\.json$)/, '').gsub('/', ' / ')}"
|
85
|
+
|
86
|
+
|
87
|
+
stats = {
|
88
|
+
charts: {},
|
89
|
+
tables: {}
|
90
|
+
}
|
91
|
+
|
92
|
+
@chart_variables.each do |chart_type_hash|
|
93
|
+
chart_type = chart_type_hash["chart"]
|
94
|
+
chart_title = chart_type_hash["title"].downcase
|
95
|
+
|
96
|
+
if chart_type == @visit
|
97
|
+
filtered_subjects = @subjects.select{ |s| s.send(chart_type) != nil } # and s.send(variable_name) != nil
|
98
|
+
if filtered_subjects.count > 0
|
99
|
+
stats[:charts][chart_title] = Spout::Helpers::ChartTypes::chart_histogram(chart_type, filtered_subjects, json, variable_name)
|
100
|
+
stats[:tables][chart_title] = Spout::Helpers::ChartTypes::table_arbitrary(chart_type, filtered_subjects, json, variable_name)
|
101
|
+
end
|
102
|
+
else
|
103
|
+
filtered_subjects = @subjects.select{ |s| s.send(chart_type) != nil } # and s.send(variable_name) != nil
|
104
|
+
if filtered_subjects.count > 0
|
105
|
+
stats[:charts][chart_title] = Spout::Helpers::ChartTypes::chart_arbitrary(chart_type, filtered_subjects, json, variable_name, visits)
|
106
|
+
stats[:tables][chart_title] = visits.collect do |visit_display_name, visit_value|
|
107
|
+
visit_subjects = filtered_subjects.select{ |s| s._visit == visit_value }
|
108
|
+
unknown_subjects = visit_subjects.select{ |s| s.send(variable_name) == nil }
|
109
|
+
(visit_subjects.count > 0 && visit_subjects.count != unknown_subjects.count) ? Spout::Helpers::ChartTypes::table_arbitrary(chart_type, visit_subjects, json, variable_name, visit_display_name) : nil
|
110
|
+
end.compact
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
chart_json_file = File.join('graphs', @standard_version, "#{json['id']}.json")
|
116
|
+
File.open(chart_json_file, 'w') { |file| file.write( JSON.pretty_generate(stats) + "\n" ) }
|
127
117
|
|
128
|
-
def create_line_chart_options_file(values, options_file, units)
|
129
|
-
( series, categories ) = graph_values(values)
|
130
|
-
|
131
|
-
File.open(options_file, "w") do |outfile|
|
132
|
-
outfile.puts <<-eos
|
133
|
-
{
|
134
|
-
"chart": {
|
135
|
-
"type": "areaspline"
|
136
|
-
},
|
137
|
-
"title": {
|
138
|
-
"text": ""
|
139
|
-
},
|
140
|
-
"credits": {
|
141
|
-
"enabled": false,
|
142
|
-
},
|
143
|
-
"xAxis": {
|
144
|
-
"categories": #{categories.to_json},
|
145
|
-
"labels": {
|
146
|
-
"step": #{(categories.size.to_f / 12).ceil}
|
147
|
-
},
|
148
|
-
"title": {
|
149
|
-
"text": #{units.to_json}
|
150
|
-
}
|
151
|
-
},
|
152
|
-
"yAxis": {
|
153
|
-
"maxPadding": 0,
|
154
|
-
"minPadding": 0,
|
155
|
-
"title": {
|
156
|
-
"text": "Count"
|
157
|
-
}
|
158
|
-
},
|
159
|
-
"series": #{series.to_json}
|
160
|
-
}
|
161
|
-
eos
|
162
118
|
end
|
163
119
|
end
|
164
120
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
open_command = if RUBY_PLATFORM.match(/mingw/) != nil
|
170
|
-
'phantomjs.exe'
|
171
|
-
else
|
172
|
-
'phantomjs'
|
121
|
+
# [["Visit 1", "1"], ["Visit 2", "2"], ["CVD Outcomes", "3"]]
|
122
|
+
def visits
|
123
|
+
@visits ||= begin
|
124
|
+
Spout::Helpers::ChartTypes::domain_array(@visit)
|
173
125
|
end
|
174
|
-
|
175
|
-
phantomjs_command = "#{open_command} #{directory}/highcharts-convert.js -infile #{tmp_options_file} -outfile #{graph_path} -scale 2.5 -width #{width} -constr Chart"
|
176
|
-
# puts phantomjs_command
|
177
|
-
`#{phantomjs_command}`
|
178
126
|
end
|
179
127
|
|
180
128
|
end
|