spout 0.12.1 → 0.13.0.beta1
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 +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
|