spout 0.13.0.beta1 → 0.13.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/sleepepi/spout.svg?branch=master)](https://travis-ci.org/sleepepi/spout)
|
4
|
-
[![Dependency Status](https://gemnasium.com/sleepepi/spout.svg)](https://gemnasium.com/sleepepi/spout)
|
5
4
|
[![Code Climate](https://codeclimate.com/github/sleepepi/spout/badges/gpa.svg)](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
|