spout 0.13.0.beta1 → 0.13.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 +5 -5
- data/CHANGELOG.md +4 -0
- data/LICENSE +1 -1
- data/README.md +0 -1
- data/lib/spout/commands/importer.rb +5 -7
- data/lib/spout/helpers/csv_reader.rb +19 -0
- data/lib/spout/helpers/number_helper.rb +4 -1
- data/lib/spout/helpers/subject_loader.rb +4 -5
- data/lib/spout/helpers/table_formatting.rb +8 -9
- data/lib/spout/templates/ruby-version +1 -1
- data/lib/spout/templates/travis.yml +1 -1
- data/lib/spout/version.rb +1 -1
- data/lib/spout/views/index.html.erb +1 -1
- data/spout.gemspec +6 -2
- metadata +9 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 3dd7789cc6b44bff70a193ce395bbf6a4c9433c89d6b37e021339a7146e13bf2
|
|
4
|
+
data.tar.gz: f80de69bb6dee9708bcb93d62ea3a79bbb419f5743c2b47d850cec5aa6d99da6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8e23b63fc17ec344fe40eff73fdb22e743059301a33d16f64a46ca834efa8d4ce5d6dc17dbcf2f0c39ad67df47a56dc2c83565660242b05023594b93d16feb65
|
|
7
|
+
data.tar.gz: f65680444341dedcdb8390277d9f615f1ed0b69a9741a8face225053f90c72026ab204e44288fb68e141a5cc2791f9e22dc7a50e69f64e99b81ce70810b57bb6
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
## 0.13.0
|
|
2
2
|
|
|
3
3
|
### Enhancements
|
|
4
|
+
- **General Changes**
|
|
5
|
+
- Updated to ruby 2.5.1
|
|
6
|
+
- Updated to simplecov 0.16.1
|
|
7
|
+
- Improved memory management reading large CSVs
|
|
4
8
|
- **Importer Changes**
|
|
5
9
|
- Added option to preserve case of input using the `--preserve-case` flag
|
|
6
10
|
- `spout import <variables.csv> --preserve-case`
|
data/LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Spout
|
|
2
2
|
|
|
3
3
|
[](https://travis-ci.org/sleepepi/spout)
|
|
4
|
-
[](https://gemnasium.com/sleepepi/spout)
|
|
5
4
|
[](https://codeclimate.com/github/sleepepi/spout)
|
|
6
5
|
|
|
7
6
|
Turn your CSV data dictionary into a JSON repository. Collaborate with others to
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "csv"
|
|
4
3
|
require "json"
|
|
5
4
|
require "fileutils"
|
|
6
5
|
require "colorize"
|
|
7
6
|
|
|
7
|
+
require "spout/helpers/csv_reader"
|
|
8
|
+
|
|
8
9
|
module Spout
|
|
9
10
|
module Commands
|
|
10
11
|
class Importer
|
|
@@ -38,8 +39,7 @@ EOT
|
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
def import_variables
|
|
41
|
-
|
|
42
|
-
row = line.to_hash
|
|
42
|
+
Spout::Helpers::CSVReader.read_csv(@csv_file) do |row|
|
|
43
43
|
if not row.keys.include?("id")
|
|
44
44
|
puts "\nMissing column header `".colorize( :red ) + "id".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info
|
|
45
45
|
exit(1)
|
|
@@ -77,8 +77,7 @@ EOT
|
|
|
77
77
|
def import_domains
|
|
78
78
|
domains = {}
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
row = line.to_hash
|
|
80
|
+
Spout::Helpers::CSVReader.read_csv(@csv_file) do |row|
|
|
82
81
|
if not row.keys.include?("domain_id")
|
|
83
82
|
puts "\nMissing column header `".colorize( :red ) + "domain_id".colorize( :light_cyan ) + "` in data dictionary.".colorize( :red ) + additional_csv_info
|
|
84
83
|
exit(1)
|
|
@@ -122,8 +121,7 @@ EOT
|
|
|
122
121
|
end
|
|
123
122
|
|
|
124
123
|
def import_forms
|
|
125
|
-
|
|
126
|
-
row = line.to_hash
|
|
124
|
+
Spout::Helpers::CSVReader.read_csv(@csv_file) do |row|
|
|
127
125
|
unless row.keys.include?("id")
|
|
128
126
|
puts "\nMissing column header `".colorize(:red) +
|
|
129
127
|
"id".colorize(:light_cyan) +
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "csv"
|
|
4
|
+
|
|
5
|
+
module Spout
|
|
6
|
+
module Helpers
|
|
7
|
+
# Reads CSVs and handles conversion of characters into UTF-8 format.
|
|
8
|
+
class CSVReader
|
|
9
|
+
def self.read_csv(csv_file)
|
|
10
|
+
File.open(csv_file, "r:iso-8859-1:utf-8") do |file|
|
|
11
|
+
csv = CSV.new(file, headers: true, header_converters: ->(h) { h.to_s.downcase })
|
|
12
|
+
while line = csv.shift # rubocop:disable Lint/AssignmentInCondition
|
|
13
|
+
yield line.to_hash
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
module Spout
|
|
4
4
|
module Helpers
|
|
5
|
+
# Provides method to format large numbers with delimiters.
|
|
5
6
|
module NumberHelper
|
|
6
7
|
def number_with_delimiter(number, delimiter = ",")
|
|
7
|
-
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(
|
|
8
|
+
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(delimiter).reverse
|
|
8
9
|
end
|
|
10
|
+
|
|
11
|
+
module_function :number_with_delimiter
|
|
9
12
|
end
|
|
10
13
|
end
|
|
11
14
|
end
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "colorize"
|
|
4
|
-
require "csv"
|
|
5
4
|
require "json"
|
|
6
5
|
|
|
7
|
-
require "spout/
|
|
6
|
+
require "spout/helpers/csv_reader"
|
|
8
7
|
require "spout/helpers/semantic"
|
|
8
|
+
require "spout/models/subject"
|
|
9
9
|
require "spout/models/empty"
|
|
10
10
|
|
|
11
11
|
module Spout
|
|
@@ -59,8 +59,8 @@ module Spout
|
|
|
59
59
|
puts " #{current_folder}".colorize(:white) if current_folder.to_s != "" && current_folder != last_folder
|
|
60
60
|
print " #{current_file}"
|
|
61
61
|
last_folder = current_folder
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
|
|
63
|
+
Spout::Helpers::CSVReader.read_csv(csv_file) do |row|
|
|
64
64
|
count += 1
|
|
65
65
|
print "\r #{current_file} " + "##{count}".colorize(:yellow) if (count % 10 == 0)
|
|
66
66
|
@subjects << Spout::Models::Subject.create do |t|
|
|
@@ -87,7 +87,6 @@ module Spout
|
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
89
|
end
|
|
90
|
-
|
|
91
90
|
# puts "Memory Used: " + (`ps -o rss -p #{$$}`.strip.split.last.to_i / 1024).to_s + " MB" if count % 1000 == 0
|
|
92
91
|
break if !@number_of_rows.nil? && count - 1 >= @number_of_rows
|
|
93
92
|
end
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "spout/helpers/number_helper"
|
|
4
|
+
|
|
3
5
|
module Spout
|
|
4
6
|
module Helpers
|
|
7
|
+
# Formats numbers in coverage and outlier tables.
|
|
5
8
|
class TableFormatting
|
|
6
9
|
# def initialize(number)
|
|
7
10
|
# @number = number
|
|
8
11
|
# end
|
|
9
12
|
|
|
10
|
-
def self.number_with_delimiter(number, delimiter = ",")
|
|
11
|
-
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(",").reverse
|
|
12
|
-
end
|
|
13
|
-
|
|
14
13
|
# type: :count or :decimal
|
|
15
14
|
def self.format_number(number, type, format = nil)
|
|
16
15
|
if number.nil?
|
|
17
|
-
format_nil
|
|
16
|
+
format_nil
|
|
18
17
|
elsif type == :count
|
|
19
18
|
format_count(number)
|
|
20
19
|
else
|
|
@@ -22,7 +21,7 @@ module Spout
|
|
|
22
21
|
end
|
|
23
22
|
end
|
|
24
23
|
|
|
25
|
-
def self.format_nil
|
|
24
|
+
def self.format_nil
|
|
26
25
|
"-"
|
|
27
26
|
end
|
|
28
27
|
|
|
@@ -32,7 +31,7 @@ module Spout
|
|
|
32
31
|
# 1000 -> "1,000"
|
|
33
32
|
# Input (Numeric) -> Output (String)
|
|
34
33
|
def self.format_count(number)
|
|
35
|
-
|
|
34
|
+
number.zero? || number.nil? ? "-" : Spout::Helpers::NumberHelper.number_with_delimiter(number)
|
|
36
35
|
end
|
|
37
36
|
|
|
38
37
|
# decimal:
|
|
@@ -44,9 +43,9 @@ module Spout
|
|
|
44
43
|
# Input (Numeric) -> Output (String)
|
|
45
44
|
def self.format_decimal(number, format)
|
|
46
45
|
precision = 1
|
|
47
|
-
precision = -Math.log10(number.abs).floor if number.abs < 1.0 && number
|
|
46
|
+
precision = -Math.log10(number.abs).floor if number.abs < 1.0 && !number.zero?
|
|
48
47
|
|
|
49
|
-
number = number_with_delimiter(number.round(precision))
|
|
48
|
+
number = Spout::Helpers::NumberHelper.number_with_delimiter(number.to_f.round(precision))
|
|
50
49
|
number = format % number if format
|
|
51
50
|
number
|
|
52
51
|
end
|
|
@@ -1 +1 @@
|
|
|
1
|
-
ruby-2.
|
|
1
|
+
ruby-2.5.1
|
data/lib/spout/version.rb
CHANGED
|
@@ -121,7 +121,7 @@ tfoot td {
|
|
|
121
121
|
<td><%= csv %></td>
|
|
122
122
|
<td>
|
|
123
123
|
<% if total_column_count.to_i > 0 %>
|
|
124
|
-
<%= "%0.02f
|
|
124
|
+
<%= "%0.02f %%" % (mapped_column_count * 100.0 / total_column_count) %>
|
|
125
125
|
<% else %>
|
|
126
126
|
<span class="text-muted">---</span>
|
|
127
127
|
<% end %>
|
data/spout.gemspec
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# gem list -r spout
|
|
9
9
|
# gem install spout
|
|
10
10
|
|
|
11
|
-
lib = File.expand_path("
|
|
11
|
+
lib = File.expand_path("lib", __dir__)
|
|
12
12
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
13
13
|
require "spout/version"
|
|
14
14
|
|
|
@@ -25,6 +25,10 @@ Gem::Specification.new do |spec|
|
|
|
25
25
|
"dictionary using built-in tests, or add your own for "\
|
|
26
26
|
"further validations."
|
|
27
27
|
spec.homepage = "https://github.com/sleepepi/spout"
|
|
28
|
+
|
|
29
|
+
spec.required_ruby_version = ">= 2.5.1"
|
|
30
|
+
spec.required_rubygems_version = ">= 2.7.6"
|
|
31
|
+
|
|
28
32
|
spec.license = "MIT"
|
|
29
33
|
|
|
30
34
|
spec.files = Dir["{bin,lib}/**/*"] + ["CHANGELOG.md", "LICENSE", "Rakefile", "README.md", "spout.gemspec"]
|
|
@@ -32,7 +36,7 @@ Gem::Specification.new do |spec|
|
|
|
32
36
|
spec.test_files = spec.files.grep(%r{^(test)/})
|
|
33
37
|
spec.require_paths = ["lib"]
|
|
34
38
|
|
|
35
|
-
spec.add_dependency "bundler", "~> 1.
|
|
39
|
+
spec.add_dependency "bundler", "~> 1.16"
|
|
36
40
|
spec.add_dependency "rake"
|
|
37
41
|
spec.add_dependency "minitest"
|
|
38
42
|
spec.add_dependency "minitest-reporters"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: spout
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.13.0.
|
|
4
|
+
version: 0.13.0.beta2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Remo Mueller
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2018-06-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '1.
|
|
19
|
+
version: '1.16'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '1.
|
|
26
|
+
version: '1.16'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -121,6 +121,7 @@ files:
|
|
|
121
121
|
- lib/spout/helpers/array_statistics.rb
|
|
122
122
|
- lib/spout/helpers/chart_types.rb
|
|
123
123
|
- lib/spout/helpers/config_reader.rb
|
|
124
|
+
- lib/spout/helpers/csv_reader.rb
|
|
124
125
|
- lib/spout/helpers/framework.rb
|
|
125
126
|
- lib/spout/helpers/iterators.rb
|
|
126
127
|
- lib/spout/helpers/json_loader.rb
|
|
@@ -202,15 +203,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
202
203
|
requirements:
|
|
203
204
|
- - ">="
|
|
204
205
|
- !ruby/object:Gem::Version
|
|
205
|
-
version:
|
|
206
|
+
version: 2.5.1
|
|
206
207
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
208
|
requirements:
|
|
208
|
-
- - "
|
|
209
|
+
- - ">="
|
|
209
210
|
- !ruby/object:Gem::Version
|
|
210
|
-
version:
|
|
211
|
+
version: 2.7.6
|
|
211
212
|
requirements: []
|
|
212
213
|
rubyforge_project:
|
|
213
|
-
rubygems_version: 2.6
|
|
214
|
+
rubygems_version: 2.7.6
|
|
214
215
|
signing_key:
|
|
215
216
|
specification_version: 4
|
|
216
217
|
summary: Turn your CSV data dictionary into a JSON repository. Collaborate with others
|