spout 0.12.1 → 0.13.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +5 -5
- data/Rakefile +4 -4
- data/bin/spout +1 -1
- data/lib/spout/commands/coverage.rb +18 -18
- data/lib/spout/commands/deploy.rb +89 -89
- data/lib/spout/commands/exporter.rb +16 -16
- data/lib/spout/commands/graphs.rb +37 -37
- data/lib/spout/commands/help.rb +1 -1
- data/lib/spout/commands/importer.rb +59 -57
- data/lib/spout/commands/outliers.rb +17 -17
- data/lib/spout/commands/project_generator.rb +25 -25
- data/lib/spout/commands/update.rb +38 -38
- data/lib/spout/helpers/array_statistics.rb +7 -7
- data/lib/spout/helpers/chart_types.rb +2 -2
- data/lib/spout/helpers/config_reader.rb +21 -20
- data/lib/spout/helpers/framework.rb +11 -11
- data/lib/spout/helpers/iterators.rb +1 -3
- data/lib/spout/helpers/json_loader.rb +2 -4
- data/lib/spout/helpers/json_request.rb +11 -11
- data/lib/spout/helpers/number_helper.rb +1 -1
- data/lib/spout/helpers/quietly.rb +1 -1
- data/lib/spout/helpers/semantic.rb +1 -1
- data/lib/spout/helpers/send_file.rb +14 -14
- data/lib/spout/helpers/subject_loader.rb +24 -24
- data/lib/spout/helpers/table_formatting.rb +12 -12
- data/lib/spout/models/coverage_result.rb +8 -8
- data/lib/spout/models/dictionary.rb +10 -10
- data/lib/spout/models/domain.rb +7 -7
- data/lib/spout/models/empty.rb +1 -1
- data/lib/spout/models/form.rb +6 -6
- data/lib/spout/models/graphables/choices_vs_choices.rb +3 -5
- data/lib/spout/models/graphables/choices_vs_numeric.rb +4 -6
- data/lib/spout/models/graphables/default.rb +6 -6
- data/lib/spout/models/graphables/histogram.rb +4 -4
- data/lib/spout/models/graphables/numeric_vs_choices.rb +1 -1
- data/lib/spout/models/graphables/numeric_vs_numeric.rb +6 -6
- data/lib/spout/models/graphables.rb +14 -14
- data/lib/spout/models/outlier_result.rb +16 -18
- data/lib/spout/models/record.rb +3 -3
- data/lib/spout/models/tables/choices_vs_choices.rb +11 -11
- data/lib/spout/models/tables/choices_vs_numeric.rb +8 -8
- data/lib/spout/models/tables/default.rb +5 -5
- data/lib/spout/models/tables/numeric_vs_choices.rb +7 -7
- data/lib/spout/models/tables/numeric_vs_numeric.rb +7 -7
- data/lib/spout/models/tables.rb +11 -11
- data/lib/spout/models/variable.rb +14 -14
- data/lib/spout/tasks/engine.rake +4 -4
- data/lib/spout/templates/CHANGELOG.md.erb +1 -1
- data/lib/spout/templates/Gemfile +2 -2
- data/lib/spout/templates/Rakefile +1 -1
- data/lib/spout/templates/test/dictionary_test.rb +3 -3
- data/lib/spout/templates/test/test_helper.rb +1 -1
- data/lib/spout/tests/domain_existence_validation.rb +6 -6
- data/lib/spout/tests/domain_format.rb +1 -1
- data/lib/spout/tests/domain_name_format.rb +3 -3
- data/lib/spout/tests/domain_name_uniqueness.rb +2 -2
- data/lib/spout/tests/domain_specified.rb +1 -3
- data/lib/spout/tests/form_existence_validation.rb +2 -4
- data/lib/spout/tests/form_name_format.rb +3 -3
- data/lib/spout/tests/form_name_match.rb +1 -1
- data/lib/spout/tests/json_helper.rb +1 -1
- data/lib/spout/tests/json_validation.rb +0 -2
- data/lib/spout/tests/variable_name_format.rb +3 -3
- data/lib/spout/tests/variable_name_match.rb +1 -3
- data/lib/spout/tests/variable_name_uniqueness.rb +2 -2
- data/lib/spout/tests/variable_type_validation.rb +2 -2
- data/lib/spout/tests.rb +30 -30
- data/lib/spout/version.rb +4 -4
- data/lib/spout/views/index.html.erb +15 -15
- data/lib/spout/views/outliers.html.erb +8 -8
- data/lib/spout.rb +26 -26
- data/spout.gemspec +22 -22
- metadata +5 -5
@@ -1,40 +1,40 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
3
|
+
require "csv"
|
4
|
+
require "fileutils"
|
5
|
+
require "rubygems"
|
6
|
+
require "json"
|
7
|
+
require "yaml"
|
8
|
+
require "colorize"
|
9
|
+
|
10
|
+
require "spout/helpers/subject_loader"
|
11
|
+
require "spout/helpers/chart_types"
|
12
|
+
require "spout/models/variable"
|
13
|
+
require "spout/models/graphables"
|
14
|
+
require "spout/models/tables"
|
15
|
+
require "spout/helpers/config_reader"
|
16
|
+
require "spout/helpers/send_file"
|
17
|
+
require "spout/helpers/json_request"
|
18
|
+
require "spout/version"
|
19
19
|
|
20
20
|
module Spout
|
21
21
|
module Commands
|
22
22
|
class Graphs
|
23
|
-
def initialize(argv, standard_version, deploy_mode = false, url =
|
23
|
+
def initialize(argv, standard_version, deploy_mode = false, url = "", slug = "", token = "", webserver_name = "", subjects = nil)
|
24
24
|
@deploy_mode = deploy_mode
|
25
25
|
@url = url
|
26
26
|
@standard_version = standard_version
|
27
27
|
@slug = slug
|
28
28
|
@token = token
|
29
29
|
@webserver_name = webserver_name
|
30
|
-
@clean = !(argv.delete(
|
30
|
+
@clean = !(argv.delete("--no-resume").nil? && argv.delete("--clean").nil?)
|
31
31
|
|
32
32
|
@config = Spout::Helpers::ConfigReader.new
|
33
33
|
|
34
34
|
@stratification_variable = Spout::Models::Variable.find_by_id @config.visit
|
35
35
|
|
36
36
|
if @stratification_variable.nil?
|
37
|
-
if @config.visit ==
|
37
|
+
if @config.visit == ""
|
38
38
|
puts "The visit variable in .spout.yml can't be blank."
|
39
39
|
else
|
40
40
|
puts "Could not find the following visit variable: #{@config.visit}"
|
@@ -42,7 +42,7 @@ module Spout
|
|
42
42
|
return self
|
43
43
|
end
|
44
44
|
|
45
|
-
missing_variables = @config.charts.select { |c| Spout::Models::Variable.find_by_id(c[
|
45
|
+
missing_variables = @config.charts.select { |c| Spout::Models::Variable.find_by_id(c["chart"]).nil? }
|
46
46
|
if missing_variables.count > 0
|
47
47
|
puts "Could not find the following chart variable#{'s' unless missing_variables.size == 1}: #{missing_variables.join(', ')}"
|
48
48
|
return self
|
@@ -50,17 +50,17 @@ module Spout
|
|
50
50
|
|
51
51
|
rows_arg = argv.find { |arg| /^--rows=(\d*)/ =~ arg }
|
52
52
|
argv.delete(rows_arg)
|
53
|
-
@number_of_rows = rows_arg.gsub(/--rows=/,
|
53
|
+
@number_of_rows = rows_arg.gsub(/--rows=/, "").to_i if rows_arg
|
54
54
|
|
55
|
-
@valid_ids = argv.collect { |s| s.to_s.downcase }.compact.reject { |s| s ==
|
55
|
+
@valid_ids = argv.collect { |s| s.to_s.downcase }.compact.reject { |s| s == "" }
|
56
56
|
|
57
|
-
@chart_variables = @config.charts.unshift(
|
57
|
+
@chart_variables = @config.charts.unshift("chart" => @config.visit, "title" => "Histogram")
|
58
58
|
|
59
59
|
@dictionary_root = Dir.pwd
|
60
|
-
@variable_files = Dir.glob(File.join(@dictionary_root,
|
60
|
+
@variable_files = Dir.glob(File.join(@dictionary_root, "variables", "**", "*.json"))
|
61
61
|
|
62
62
|
t = Time.now
|
63
|
-
@graphs_folder = File.join(
|
63
|
+
@graphs_folder = File.join("graphs", @standard_version)
|
64
64
|
FileUtils.mkpath @graphs_folder
|
65
65
|
|
66
66
|
@subjects = if subjects
|
@@ -79,14 +79,14 @@ module Spout
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def load_current_progress
|
82
|
-
@progress_file = File.join(@graphs_folder,
|
82
|
+
@progress_file = File.join(@graphs_folder, ".progress.json")
|
83
83
|
@progress = JSON.parse(File.read(@progress_file)) rescue @progress = {}
|
84
|
-
@progress = {} if !@progress.is_a?(Hash) || @clean || @progress[
|
85
|
-
@progress[
|
84
|
+
@progress = {} if !@progress.is_a?(Hash) || @clean || @progress["SPOUT_VERSION"] != Spout::VERSION::STRING
|
85
|
+
@progress["SPOUT_VERSION"] = Spout::VERSION::STRING
|
86
86
|
end
|
87
87
|
|
88
88
|
def save_current_progress
|
89
|
-
File.open(@progress_file,
|
89
|
+
File.open(@progress_file, "w") do |f|
|
90
90
|
f.write(JSON.pretty_generate(@progress) + "\n")
|
91
91
|
end
|
92
92
|
end
|
@@ -115,12 +115,12 @@ module Spout
|
|
115
115
|
end
|
116
116
|
|
117
117
|
@progress[variable.id] ||= {}
|
118
|
-
@progress[variable.id][
|
119
|
-
next if (!@deploy_mode && @progress[variable.id][
|
118
|
+
@progress[variable.id]["uploaded"] ||= []
|
119
|
+
next if (!@deploy_mode && @progress[variable.id]["generated"] == true) || (@deploy_mode && @progress[variable.id]["uploaded"].include?(@webserver_name))
|
120
120
|
|
121
121
|
stats = compute_stats(variable)
|
122
122
|
|
123
|
-
if @deploy_mode && !@progress[variable.id][
|
123
|
+
if @deploy_mode && !@progress[variable.id]["uploaded"].include?(@webserver_name)
|
124
124
|
values = @subjects.collect(&variable.id.to_sym).compact_empty
|
125
125
|
variable.n = values.n
|
126
126
|
variable.unknown = values.unknown
|
@@ -142,8 +142,8 @@ module Spout
|
|
142
142
|
return stats unless %w(numeric integer choices).include?(variable.type)
|
143
143
|
|
144
144
|
@chart_variables.each do |chart_type_hash|
|
145
|
-
chart_type = chart_type_hash[
|
146
|
-
chart_title = chart_type_hash[
|
145
|
+
chart_type = chart_type_hash["chart"]
|
146
|
+
chart_title = chart_type_hash["title"].downcase.tr(" ", "-")
|
147
147
|
chart_variable = Spout::Models::Variable.find_by_id(chart_type)
|
148
148
|
|
149
149
|
filtered_subjects = @subjects.reject { |s| s.send(chart_type).nil? || s.send(variable.id).nil? }
|
@@ -165,8 +165,8 @@ module Spout
|
|
165
165
|
end
|
166
166
|
|
167
167
|
chart_json_file = File.join(@graphs_folder, "#{variable.id}.json")
|
168
|
-
File.open(chart_json_file,
|
169
|
-
@progress[variable.id][
|
168
|
+
File.open(chart_json_file, "w") { |file| file.write(JSON.pretty_generate(stats) + "\n") }
|
169
|
+
@progress[variable.id]["generated"] = true
|
170
170
|
stats
|
171
171
|
end
|
172
172
|
|
@@ -178,7 +178,7 @@ module Spout
|
|
178
178
|
params[:variable][:spout_stats] = stats.to_json
|
179
179
|
(json, status) = Spout::Helpers::JsonRequest.post("#{@url}/api/v1/variables/create_or_update.json", params)
|
180
180
|
if json.is_a?(Hash) && status.is_a?(Net::HTTPSuccess)
|
181
|
-
@progress[variable.id][
|
181
|
+
@progress[variable.id]["uploaded"] << @webserver_name
|
182
182
|
else
|
183
183
|
puts "\nUPLOAD FAILED: ".colorize(:red) + variable.id
|
184
184
|
puts "- Error: #{json.inspect}"
|
data/lib/spout/commands/help.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
3
|
+
require "csv"
|
4
|
+
require "json"
|
5
|
+
require "fileutils"
|
6
|
+
require "colorize"
|
7
7
|
|
8
8
|
module Spout
|
9
9
|
module Commands
|
10
10
|
class Importer
|
11
11
|
def initialize(argv)
|
12
|
-
use_domains = !argv.delete(
|
13
|
-
use_forms = !argv.delete(
|
12
|
+
use_domains = !argv.delete("--domains").nil?
|
13
|
+
use_forms = !argv.delete("--forms").nil?
|
14
|
+
@preserve_case = !argv.delete("--preserve-case").nil?
|
14
15
|
@csv_file = argv[1].to_s
|
15
16
|
unless File.exist?(@csv_file)
|
16
17
|
puts csv_usage
|
@@ -37,36 +38,36 @@ EOT
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def import_variables
|
40
|
-
CSV.parse(File.open(@csv_file,
|
41
|
+
CSV.parse(File.open(@csv_file, "r:iso-8859-1:utf-8", &:read), headers: true) do |line|
|
41
42
|
row = line.to_hash
|
42
|
-
if not row.keys.include?(
|
43
|
+
if not row.keys.include?("id")
|
43
44
|
puts "\nMissing column header `".colorize( :red ) + "id".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info
|
44
45
|
exit(1)
|
45
46
|
end
|
46
|
-
next if row[
|
47
|
-
folder = File.join(
|
47
|
+
next if row["id"] == ""
|
48
|
+
folder = File.join("variables", row.delete("folder").to_s)
|
48
49
|
FileUtils.mkpath folder
|
49
50
|
hash = {}
|
50
|
-
id = row.delete(
|
51
|
-
hash[
|
52
|
-
hash[
|
53
|
-
hash[
|
54
|
-
hash[
|
55
|
-
domain = row.delete(
|
56
|
-
hash[
|
57
|
-
units = row.delete(
|
58
|
-
hash[
|
59
|
-
calculation = row.delete(
|
60
|
-
hash[
|
61
|
-
labels = row.delete(
|
62
|
-
hash[
|
63
|
-
hash[
|
64
|
-
forms = row.delete(
|
65
|
-
hash[
|
66
|
-
hash[
|
51
|
+
id = row.delete("id").to_s.downcase
|
52
|
+
hash["id"] = id
|
53
|
+
hash["display_name"] = tenderize(row.delete("display_name").to_s)
|
54
|
+
hash["description"] = row.delete("description").to_s
|
55
|
+
hash["type"] = row.delete("type")
|
56
|
+
domain = row.delete("domain").to_s.downcase
|
57
|
+
hash["domain"] = domain if domain != ""
|
58
|
+
units = row.delete("units").to_s
|
59
|
+
hash["units"] = units if units != ""
|
60
|
+
calculation = row.delete("calculation").to_s
|
61
|
+
hash["calculation"] = calculation if calculation != ""
|
62
|
+
labels = row.delete("labels").to_s.split(";")
|
63
|
+
hash["labels"] = labels unless labels.empty?
|
64
|
+
hash["commonly_used"] = true if row.delete("commonly_used").to_s.casecmp("true").zero?
|
65
|
+
forms = row.delete("forms").to_s.split(";")
|
66
|
+
hash["forms"] = forms unless forms.empty?
|
67
|
+
hash["other"] = row unless row.empty?
|
67
68
|
|
68
69
|
file_name = File.join(folder, "#{id}.json")
|
69
|
-
File.open(file_name,
|
70
|
+
File.open(file_name, "w") do |file|
|
70
71
|
file.write(JSON.pretty_generate(hash) + "\n")
|
71
72
|
end
|
72
73
|
puts " create".colorize( :green ) + " #{file_name}"
|
@@ -76,33 +77,33 @@ EOT
|
|
76
77
|
def import_domains
|
77
78
|
domains = {}
|
78
79
|
|
79
|
-
CSV.parse(File.open(@csv_file,
|
80
|
+
CSV.parse(File.open(@csv_file, "r:iso-8859-1:utf-8", &:read), headers: true) do |line|
|
80
81
|
row = line.to_hash
|
81
|
-
if not row.keys.include?(
|
82
|
+
if not row.keys.include?("domain_id")
|
82
83
|
puts "\nMissing column header `".colorize( :red ) + "domain_id".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info
|
83
84
|
exit(1)
|
84
85
|
end
|
85
|
-
if not row.keys.include?(
|
86
|
+
if not row.keys.include?("value")
|
86
87
|
puts "\nMissing column header `".colorize( :red ) + "value".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info
|
87
88
|
exit(1)
|
88
89
|
end
|
89
|
-
if not row.keys.include?(
|
90
|
+
if not row.keys.include?("display_name")
|
90
91
|
puts "\nMissing column header `".colorize( :red ) + "display_name".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info
|
91
92
|
exit(1)
|
92
93
|
end
|
93
94
|
|
94
|
-
next if row[
|
95
|
-
folder = File.join(
|
96
|
-
domain_name = row[
|
95
|
+
next if row["domain_id"].to_s == "" or row["value"].to_s == "" or row["display_name"].to_s == ""
|
96
|
+
folder = File.join("domains", row["folder"].to_s).gsub(/[^a-zA-Z0-9_\/\.-]/, "_")
|
97
|
+
domain_name = row["domain_id"].to_s.gsub(/[^a-zA-Z0-9_\/\.-]/, "_").downcase
|
97
98
|
domains[domain_name] ||= {}
|
98
99
|
domains[domain_name]["folder"] = folder
|
99
100
|
domains[domain_name]["options"] ||= []
|
100
101
|
|
101
102
|
hash = {}
|
102
|
-
hash[
|
103
|
-
hash[
|
104
|
-
hash[
|
105
|
-
hash[
|
103
|
+
hash["value"] = row.delete("value").to_s
|
104
|
+
hash["display_name"] = tenderize(row.delete("display_name").to_s)
|
105
|
+
hash["description"] = row.delete("description").to_s
|
106
|
+
hash["missing"] = true if hash["value"].match(/^[\.-]/)
|
106
107
|
|
107
108
|
domains[domain_name]["options"] << hash
|
108
109
|
end
|
@@ -111,9 +112,9 @@ EOT
|
|
111
112
|
folder = domain_hash["folder"]
|
112
113
|
FileUtils.mkpath folder
|
113
114
|
|
114
|
-
file_name = File.join(folder, domain_name
|
115
|
+
file_name = File.join(folder, "#{domain_name}.json")
|
115
116
|
|
116
|
-
File.open(file_name,
|
117
|
+
File.open(file_name, "w") do |file|
|
117
118
|
file.write(JSON.pretty_generate(domain_hash["options"]) + "\n")
|
118
119
|
end
|
119
120
|
puts " create".colorize( :green ) + " #{file_name}"
|
@@ -121,36 +122,36 @@ EOT
|
|
121
122
|
end
|
122
123
|
|
123
124
|
def import_forms
|
124
|
-
CSV.parse(File.open(@csv_file,
|
125
|
+
CSV.parse(File.open(@csv_file, "r:iso-8859-1:utf-8", &:read), headers: true) do |line|
|
125
126
|
row = line.to_hash
|
126
|
-
unless row.keys.include?(
|
127
|
+
unless row.keys.include?("id")
|
127
128
|
puts "\nMissing column header `".colorize(:red) +
|
128
|
-
|
129
|
-
|
129
|
+
"id".colorize(:light_cyan) +
|
130
|
+
"` in data dictionary.".colorize(:red) +
|
130
131
|
additional_csv_info
|
131
132
|
exit(1)
|
132
133
|
end
|
133
|
-
unless row.keys.include?(
|
134
|
+
unless row.keys.include?("display_name")
|
134
135
|
puts "\nMissing column header `".colorize(:red) +
|
135
|
-
|
136
|
-
|
136
|
+
"display_name".colorize(:light_cyan) +
|
137
|
+
"` in data dictionary.".colorize(:red) +
|
137
138
|
additional_csv_info
|
138
139
|
exit(1)
|
139
140
|
end
|
140
|
-
next if row[
|
141
|
-
folder = File.join(
|
141
|
+
next if row["id"] == ""
|
142
|
+
folder = File.join("forms", row.delete("folder").to_s)
|
142
143
|
FileUtils.mkpath folder
|
143
144
|
hash = {}
|
144
|
-
id = row.delete(
|
145
|
-
hash[
|
146
|
-
hash[
|
147
|
-
hash[
|
148
|
-
hash[
|
145
|
+
id = row.delete("id").to_s.downcase
|
146
|
+
hash["id"] = id
|
147
|
+
hash["display_name"] = tenderize(row.delete("display_name").to_s)
|
148
|
+
hash["code_book"] = row.delete("code_book").to_s
|
149
|
+
hash["other"] = row unless row.empty?
|
149
150
|
file_name = File.join(folder, "#{id}.json")
|
150
|
-
File.open(file_name,
|
151
|
+
File.open(file_name, "w") do |file|
|
151
152
|
file.write(JSON.pretty_generate(hash) + "\n")
|
152
153
|
end
|
153
|
-
puts
|
154
|
+
puts " create".colorize(:green) + " #{file_name}"
|
154
155
|
end
|
155
156
|
end
|
156
157
|
|
@@ -158,6 +159,7 @@ EOT
|
|
158
159
|
# Ex: BODY MASS INDEX changes to Body Mass Index
|
159
160
|
# Ex: Patient ID stays the same as Patient ID
|
160
161
|
def tenderize(text)
|
162
|
+
return text if @preserve_case
|
161
163
|
if /[a-z]/ =~ text
|
162
164
|
text
|
163
165
|
else
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "yaml"
|
4
|
+
require "erb"
|
5
|
+
require "fileutils"
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
7
|
+
require "spout/helpers/subject_loader"
|
8
|
+
require "spout/models/outlier_result"
|
9
|
+
require "spout/helpers/number_helper"
|
10
|
+
require "spout/helpers/config_reader"
|
11
11
|
|
12
12
|
module Spout
|
13
13
|
module Commands
|
@@ -16,9 +16,9 @@ module Spout
|
|
16
16
|
|
17
17
|
def initialize(standard_version, argv)
|
18
18
|
@standard_version = standard_version
|
19
|
-
@console = (argv.delete(
|
19
|
+
@console = (argv.delete("--console") != nil)
|
20
20
|
|
21
|
-
@variable_files = Dir.glob(
|
21
|
+
@variable_files = Dir.glob("variables/**/*.json")
|
22
22
|
@valid_ids = []
|
23
23
|
@number_of_rows = nil
|
24
24
|
|
@@ -37,7 +37,7 @@ module Spout
|
|
37
37
|
Spout::Models::OutlierResult.new(@subjects, method, csv_files)
|
38
38
|
end
|
39
39
|
|
40
|
-
@outlier_results.select!{|outlier_result| [
|
40
|
+
@outlier_results.select!{|outlier_result| ["numeric", "integer"].include?(outlier_result.variable_type) }
|
41
41
|
@outlier_results.sort!{|a,b| [a.weight, a.method] <=> [b.weight, b.method]}
|
42
42
|
|
43
43
|
@overall_results = @subject_loader.csv_files.collect do |csv_file|
|
@@ -47,20 +47,20 @@ module Spout
|
|
47
47
|
[ csv_file, major_outliers, minor_outliers, total_outliers ]
|
48
48
|
end
|
49
49
|
|
50
|
-
coverage_folder = File.join(Dir.pwd,
|
50
|
+
coverage_folder = File.join(Dir.pwd, "coverage")
|
51
51
|
FileUtils.mkpath coverage_folder
|
52
|
-
html_file = File.join(coverage_folder,
|
52
|
+
html_file = File.join(coverage_folder, "outliers.html")
|
53
53
|
|
54
|
-
File.open(html_file,
|
55
|
-
erb_location = File.join( File.dirname(__FILE__),
|
54
|
+
File.open(html_file, "w+") do |file|
|
55
|
+
erb_location = File.join( File.dirname(__FILE__), "../views/outliers.html.erb" )
|
56
56
|
file.puts ERB.new(File.read(erb_location)).result(binding)
|
57
57
|
end
|
58
58
|
|
59
59
|
unless @console
|
60
|
-
open_command =
|
61
|
-
open_command =
|
60
|
+
open_command = "open" if RUBY_PLATFORM.match(/darwin/) != nil
|
61
|
+
open_command = "start" if RUBY_PLATFORM.match(/mingw/) != nil
|
62
62
|
|
63
|
-
system "#{open_command} #{html_file}" if [
|
63
|
+
system "#{open_command} #{html_file}" if ["start", "open"].include?(open_command)
|
64
64
|
end
|
65
65
|
puts "#{html_file}\n\n"
|
66
66
|
return self
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "colorize"
|
4
|
+
require "fileutils"
|
5
5
|
|
6
|
-
require
|
6
|
+
require "spout/helpers/framework"
|
7
7
|
|
8
8
|
module Spout
|
9
9
|
module Commands
|
@@ -16,7 +16,7 @@ module Spout
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def generate_folder_structure!(argv)
|
19
|
-
skip_gemfile = !argv.delete(
|
19
|
+
skip_gemfile = !argv.delete("--skip-gemfile").nil?
|
20
20
|
@project_name = argv[1].to_s.strip
|
21
21
|
@full_path = File.join(@project_name)
|
22
22
|
usage = <<-EOT
|
@@ -26,33 +26,33 @@ Usage: spout new FOLDER
|
|
26
26
|
The FOLDER must be empty or new.
|
27
27
|
|
28
28
|
EOT
|
29
|
-
if @full_path ==
|
29
|
+
if @full_path == "" || (Dir.exist?(@full_path) && (Dir.entries(@full_path) & [".gitignore", ".ruby-version", ".travis.yml", "Gemfile", "Rakefile", "domains", "variables", "test"]).size > 0)
|
30
30
|
puts usage
|
31
31
|
exit(0)
|
32
32
|
end
|
33
33
|
FileUtils.mkpath(@full_path)
|
34
|
-
copy_file
|
35
|
-
copy_file
|
36
|
-
copy_file
|
37
|
-
evaluate_file
|
38
|
-
evaluate_file
|
39
|
-
copy_file
|
40
|
-
copy_file
|
41
|
-
evaluate_file
|
42
|
-
copy_file
|
43
|
-
directory
|
44
|
-
copy_file
|
45
|
-
directory
|
46
|
-
copy_file
|
47
|
-
directory
|
48
|
-
copy_file
|
49
|
-
directory
|
50
|
-
copy_file
|
51
|
-
copy_file
|
34
|
+
copy_file "gitignore", ".gitignore"
|
35
|
+
copy_file "ruby-version", ".ruby-version"
|
36
|
+
copy_file "travis.yml", ".travis.yml"
|
37
|
+
evaluate_file "spout.yml.erb", ".spout.yml"
|
38
|
+
evaluate_file "CHANGELOG.md.erb", "CHANGELOG.md"
|
39
|
+
copy_file "Gemfile"
|
40
|
+
copy_file "Rakefile"
|
41
|
+
evaluate_file "README.md.erb", "README.md"
|
42
|
+
copy_file "VERSION"
|
43
|
+
directory "domains"
|
44
|
+
copy_file "keep", "domains/.keep"
|
45
|
+
directory "variables"
|
46
|
+
copy_file "keep", "variables/.keep"
|
47
|
+
directory "forms"
|
48
|
+
copy_file "keep", "forms/.keep"
|
49
|
+
directory "test"
|
50
|
+
copy_file "test/dictionary_test.rb"
|
51
|
+
copy_file "test/test_helper.rb"
|
52
52
|
return if skip_gemfile
|
53
|
-
puts
|
53
|
+
puts " run".colorize(:green) + " bundle install".colorize(:light_cyan)
|
54
54
|
Dir.chdir(@full_path)
|
55
|
-
system
|
55
|
+
system "bundle install"
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|