spout 0.8.0.beta13 → 0.8.0.beta14

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f8fa45a4222ddcbf78606e4f3e36aad831162ce3
4
- data.tar.gz: 134a7e8590e72a7be9067504cd680a91e564516d
3
+ metadata.gz: 44da8a99f11bf9cf6c779e891428be644ed2caf8
4
+ data.tar.gz: 1880dbb0521218e67434e10912c0802c4b64b836
5
5
  SHA512:
6
- metadata.gz: 2d74fa1bf7c3d79da5900a485961d574f07b4031ec0b39c62c62938b85cf3499d46c8bab9f570849604c2b51aaadd79e1dfaa761d8eedf26af090727a3d0abc8
7
- data.tar.gz: c5bf687c4da5159804b1746bfa7580a8eb4030ed0034a72191b29b9bc3141165fd0e9ecadf0688c78a16c18d074b822a8c3a61012d18160127cda7a7d44db3b4
6
+ metadata.gz: 9ab9390da28670115f571beec8d1a266398a0e41906668aa926e200277b115e2f267ad2a52ed07fd492b4053590bec1effb9767aabcecc779a9bb4029243e69b
7
+ data.tar.gz: 246aeeec4351aa0558e10d00320d3e1317d9801f942d9a8677742b4c9be5af16596cb9da5f669d445d6b8ed4d9bb875f5c819916652fbe3be7d584e50dd549b5
data/CHANGELOG.md CHANGED
@@ -14,8 +14,10 @@
14
14
  - The `spout coverage` command now lists domains that are defined in the data dictionary and not referenced by any variable
15
15
  - Added `spout outliers` command that returns a list of integer or numeric variables that contain major and minor outliers
16
16
  - Removed the deprecated `spout hybrid` command
17
+ - Spout tests are now run using minitest in favor of test unit
17
18
  - **Gem Changes**
18
19
  - Updated to colorize 0.7.2
20
+ - Updated to minitest
19
21
  - Use of Ruby 2.1.2 is now recommended
20
22
 
21
23
  ### Bug Fix
data/README.md CHANGED
@@ -104,7 +104,7 @@ If not, you can add the following to your `test` directory to include all Spout
104
104
  ```
105
105
  require 'spout/tests'
106
106
 
107
- class DictionaryTest < Test::Unit::TestCase
107
+ class DictionaryTest < Minitest::Test
108
108
  include Spout::Tests
109
109
  end
110
110
  ```
@@ -112,7 +112,7 @@ end
112
112
  ```
113
113
  require 'spout/tests'
114
114
 
115
- class DictionaryTest < Test::Unit::TestCase
115
+ class DictionaryTest < Minitest::Test
116
116
  # Or only include certain tests
117
117
  include Spout::Tests::JsonValidation
118
118
  include Spout::Tests::VariableTypeValidation
@@ -23,7 +23,7 @@ module Spout
23
23
  CSV.open("#{folder}/#{variables_export_file}", "wb") do |csv|
24
24
  keys = %w(id display_name description type units domain labels calculation)
25
25
  csv << ['folder'] + keys
26
- Dir.glob("variables/**/*.json").each do |file|
26
+ Dir.glob("variables/**/*.json").sort.each do |file|
27
27
  if json = JSON.parse(File.read(file)) rescue false
28
28
  variable_folder = variable_folder_path(file)
29
29
  csv << [variable_folder] + keys.collect{|key| json[key].kind_of?(Array) ? json[key].join(';') : json[key].to_s}
@@ -35,7 +35,7 @@ module Spout
35
35
  CSV.open("#{folder}/#{domains_export_file}", "wb") do |csv|
36
36
  keys = %w(value display_name description)
37
37
  csv << ['folder', 'domain_id'] + keys
38
- Dir.glob("domains/**/*.json").each do |file|
38
+ Dir.glob("domains/**/*.json").sort.each do |file|
39
39
  if json = JSON.parse(File.read(file)) rescue false
40
40
  domain_folder = domain_folder_path(file)
41
41
  domain_name = extract_domain_name(file)
@@ -1,5 +1,6 @@
1
1
  require 'csv'
2
2
  require 'json'
3
+ require 'fileutils'
3
4
 
4
5
  module Spout
5
6
  module Commands
@@ -0,0 +1,35 @@
1
+ # module Spout
2
+ # module Commands
3
+ # class TestRunner
4
+ # def initialize(argv)
5
+ # verbose = (argv.delete('--verbose') != nil)
6
+
7
+ # puts "Loaded Suite test"
8
+
9
+ # files_loaded = []
10
+
11
+
12
+ # Dir.chdir("test") do
13
+ # $:.unshift(Dir.pwd)
14
+ # Dir.glob(File.join("**", "*_test.rb")).each do |test_file|
15
+ # files_loaded << test_file
16
+ # require 'spout/tests'
17
+ # Spout::Tests.class_eval File.read(test_file)
18
+ # # load test_file #.gsub(/\.rb$/, '')
19
+ # end
20
+ # end
21
+
22
+ # puts files_loaded.inspect
23
+ # puts Spout::Tests.constants
24
+
25
+ # Spout::Tests.constants.select{|c| Spout::Tests.const_get(c).is_a? Class}.each do |klass|
26
+ # puts "KLASS: #{klass}"
27
+ # my_instance = Spout::Tests.const_get(klass).new
28
+ # puts my_instance.methods.select{|m| m.to_s =~ /^test\_/}.inspect
29
+ # end
30
+ # # puts Spout::Tests::JsonValidation.methods
31
+
32
+ # end
33
+ # end
34
+ # end
35
+ # end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class DictionaryTest < Test::Unit::TestCase
3
+ class DictionaryTest < Minitest::Test
4
4
  include Spout::Tests
5
5
 
6
6
  # You may add additional tests here
@@ -2,7 +2,7 @@ module Spout
2
2
  module Tests
3
3
  module DomainExistenceValidation
4
4
 
5
- def assert_domain_existence(item, msg = nil)
5
+ def assert_domain_existence(item)
6
6
  domain_names = Dir.glob("domains/**/*.json").collect{|file| file.split('/').last.to_s.downcase.split('.json').first}
7
7
 
8
8
  result = begin
@@ -13,10 +13,9 @@ module Spout
13
13
  false
14
14
  end
15
15
 
16
- full_message = build_message(msg, "The domain #{domain_name} referenced by ? does not exist.", item)
17
- assert_block(full_message) do
18
- result
19
- end
16
+ message = "The domain #{domain_name} referenced by #{item} does not exist."
17
+
18
+ assert result, message
20
19
  end
21
20
 
22
21
  Dir.glob("variables/**/*.json").each do |file|
@@ -2,7 +2,7 @@ module Spout
2
2
  module Tests
3
3
  module DomainFormat
4
4
 
5
- def assert_domain_format(item, msg = nil)
5
+ def assert_domain_format(item)
6
6
  result = begin
7
7
  json = JSON.parse(File.read(item))
8
8
  if json.kind_of?(Array)
@@ -14,10 +14,9 @@ module Spout
14
14
  false
15
15
  end
16
16
 
17
- full_message = build_message(msg, "Must be an array of choice hashes. Ex:\n[\n {\n \"value\": \"1\",\n \"display_name\": \"Option 1\",\n \"description\": \"...\"\n },\n { ... },\n ...\n]")
18
- assert_block(full_message) do
19
- result
20
- end
17
+ message = "Must be an array of choice hashes. Ex:\n[\n {\n \"value\": \"1\",\n \"display_name\": \"Option 1\",\n \"description\": \"...\"\n },\n { ... },\n ...\n]"
18
+
19
+ assert result, message
21
20
  end
22
21
 
23
22
  Dir.glob("domains/**/*.json").each do |file|
@@ -4,17 +4,11 @@ module Spout
4
4
  module Tests
5
5
  module DomainSpecified
6
6
 
7
- def assert_domain_specified(domain_name, msg = nil)
8
- full_message = build_message(msg, "Variables of type choices need to specify a domain.")
9
- assert_block(full_message) do
10
- domain_name != nil
11
- end
12
- end
13
-
14
7
  Dir.glob("variables/**/*.json").each do |file|
15
8
  if json_value(file, :type) == "choices"
16
9
  define_method("test_domain_specified:"+file) do
17
- assert_domain_specified json_value(file, :domain)
10
+ domain_name = json_value(file, :domain)
11
+ assert domain_name != nil, "Variables of type choices need to specify a domain."
18
12
  end
19
13
  end
20
14
  end
@@ -2,7 +2,7 @@ module Spout
2
2
  module Tests
3
3
  module FormExistenceValidation
4
4
 
5
- def assert_form_existence(item, msg = nil)
5
+ def assert_form_existence(item)
6
6
  form_names = Dir.glob("forms/**/*.json").collect{|file| file.split('/').last.to_s.downcase.split('.json').first}
7
7
 
8
8
  result = begin
@@ -11,10 +11,9 @@ module Spout
11
11
  false
12
12
  end
13
13
 
14
- full_message = build_message(msg, "One or more forms referenced by ? does not exist.", item)
15
- assert_block(full_message) do
16
- result
17
- end
14
+ message = "One or more forms referenced by #{item} does not exist."
15
+
16
+ assert result, message
18
17
  end
19
18
 
20
19
  Dir.glob("variables/**/*.json").each do |file|
@@ -9,10 +9,9 @@ module Spout
9
9
  error = e
10
10
  false
11
11
  end
12
- full_message = build_message(msg, "?", error)
13
- assert_block(full_message) do
14
- result
15
- end
12
+
13
+ message = error.to_s
14
+ assert result, message
16
15
  end
17
16
 
18
17
  Dir.glob("variables/**/*.json").each do |file|
@@ -3,11 +3,9 @@ module Spout
3
3
  module VariableTypeValidation
4
4
  VALID_VARIABLE_TYPES = ['identifier', 'choices', 'integer', 'numeric', 'string', 'text', 'date', 'time', 'file', 'datetime'].sort
5
5
 
6
- def assert_variable_type(item, msg = nil)
7
- full_message = build_message(msg, "? invalid variable type. Valid types: #{VALID_VARIABLE_TYPES.join(', ')}", item)
8
- assert_block(full_message) do
9
- VALID_VARIABLE_TYPES.include?(item)
10
- end
6
+ def assert_variable_type(item)
7
+ message = "#{item} invalid variable type. Valid types: #{VALID_VARIABLE_TYPES.join(', ')}"
8
+ assert VALID_VARIABLE_TYPES.include?(item), message
11
9
  end
12
10
 
13
11
  Dir.glob("variables/**/*.json").each do |file|
data/lib/spout/tests.rb CHANGED
@@ -1,8 +1,68 @@
1
- require 'turn/autorun'
2
- require 'test/unit'
3
1
  require 'rubygems'
4
2
  require 'json'
5
3
 
4
+ require 'minitest/autorun'
5
+ require 'minitest/reporters'
6
+ require 'ansi/code'
7
+
8
+ module Minitest
9
+ module Reporters
10
+ class SpoutReporter < BaseReporter
11
+ include ANSI::Code
12
+ include RelativePosition
13
+
14
+ def start
15
+ super
16
+ print(white { 'Loaded Suite test' })
17
+ puts
18
+ puts
19
+ puts 'Started'
20
+ puts
21
+ end
22
+
23
+ def report
24
+ super
25
+ puts 'Finished in %.5f seconds.' % total_time
26
+ puts
27
+ print(white { '%d tests' } % count)
28
+ print(', %d assertions, ' % assertions)
29
+ color = failures.zero? && errors.zero? ? :green : :red
30
+ print(send(color) { '%d failures, %d errors, ' } % [failures, errors])
31
+ print(yellow { '%d skips' } % skips)
32
+ puts
33
+ puts
34
+ end
35
+
36
+ def record(test)
37
+ super
38
+ if !test.skipped? && test.failure
39
+ print " "
40
+ print_colored_status(test)
41
+ print " #{test.name}"
42
+ puts
43
+ print " "
44
+ print test.failure
45
+ puts
46
+ puts
47
+ end
48
+ end
49
+
50
+ protected
51
+
52
+ def before_suite(suite)
53
+ puts suite
54
+ end
55
+
56
+ def after_suite(suite)
57
+ puts
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ Minitest::Reporters.use! Minitest::Reporters::SpoutReporter.new
64
+
65
+
6
66
  require 'spout/tests/json_validation'
7
67
  require 'spout/tests/variable_type_validation'
8
68
  require 'spout/tests/variable_name_uniqueness'
@@ -28,17 +88,5 @@ module Spout
28
88
  include Spout::Tests::FormExistenceValidation
29
89
  include Spout::Tests::FormNameUniqueness
30
90
  include Spout::Tests::FormNameMatch
31
-
32
- Turn.config.trace = 1
33
- end
34
- end
35
-
36
- require 'spout/hidden_reporter'
37
-
38
- module Turn
39
- class Configuration
40
- def reporter
41
- @reporter ||= Spout::HiddenReporter.new(ENV['HIDE_PASSING_TESTS'] == 'true')
42
- end
43
91
  end
44
92
  end
data/lib/spout/version.rb CHANGED
@@ -3,7 +3,7 @@ module Spout
3
3
  MAJOR = 0
4
4
  MINOR = 8
5
5
  TINY = 0
6
- BUILD = "beta13" # nil, "pre", "rc", "rc2"
6
+ BUILD = "beta14" # nil, "pre", "rc", "rc2"
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, BUILD].compact.join('.')
9
9
  end
data/lib/spout.rb CHANGED
@@ -60,8 +60,6 @@ The most common spout commands are:
60
60
  `spout new <project_name>` creates a new
61
61
  data dictionary in `./<project_name>`
62
62
  [t]est Run tests and show failing tests
63
- [t] --verbose Run the tests and show passing and failing
64
- tests
65
63
  [i]mport Import a CSV file into the JSON dictionary
66
64
  [e]xport [1.0.0] Export the JSON dictionary to CSV format
67
65
  [c]overage Coverage report, requires dataset CSVs
@@ -93,8 +91,9 @@ EOT
93
91
  end
94
92
 
95
93
  def self.test(argv)
96
- hide_passing_tests = (argv.delete('--verbose') == nil)
97
- system "bundle exec rake#{' HIDE_PASSING_TESTS=true' if hide_passing_tests}"
94
+ system "bundle exec rake"
95
+ # require 'spout/commands/test_runner'
96
+ # Spout::Commands::TestRunner.new(argv)
98
97
  end
99
98
 
100
99
  def self.version(argv)
data/spout.gemspec CHANGED
@@ -27,7 +27,8 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
 
29
29
  spec.add_dependency "rake"
30
- spec.add_dependency "turn"
30
+ spec.add_dependency "minitest"
31
+ spec.add_dependency "minitest-reporters"
31
32
  spec.add_dependency "json"
32
33
  spec.add_dependency "colorize", "~> 0.7.2"
33
34
 
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.8.0.beta13
4
+ version: 0.8.0.beta14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Remo Mueller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-04 00:00:00.000000000 Z
11
+ date: 2014-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -25,7 +25,21 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: turn
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-reporters
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
@@ -103,13 +117,13 @@ files:
103
117
  - lib/spout/commands/importer.rb
104
118
  - lib/spout/commands/outliers.rb
105
119
  - lib/spout/commands/project_generator.rb
120
+ - lib/spout/commands/test_runner.rb
106
121
  - lib/spout/helpers/array_statistics.rb
107
122
  - lib/spout/helpers/chart_types.rb
108
123
  - lib/spout/helpers/json_loader.rb
109
124
  - lib/spout/helpers/number_helper.rb
110
125
  - lib/spout/helpers/subject_loader.rb
111
126
  - lib/spout/helpers/table_formatting.rb
112
- - lib/spout/hidden_reporter.rb
113
127
  - lib/spout/models/coverage_result.rb
114
128
  - lib/spout/models/outlier_result.rb
115
129
  - lib/spout/models/subject.rb
@@ -1,175 +0,0 @@
1
- require 'turn/reporter'
2
-
3
- module Spout
4
- # = Based on Pretty Reporter (by Paydro)
5
- # = Modified to hide passing tests
6
- #
7
- # Example output:
8
- # TestCaseName:
9
- # PASS test: Succesful test case. (0:00:02:059)
10
- # ERROR test: Bogus test case. (0:00:02:059)
11
- # FAIL test: Failed test case. (0:00:02:059)
12
- #
13
- class HiddenReporter < Turn::Reporter
14
- # Second column left padding in chars.
15
- TAB_SIZE = 10
16
-
17
- # Character to put in front of backtrace.
18
- TRACE_MARK = '@ '
19
-
20
- def initialize(hide_passing_tests)
21
- @io = $stdout
22
- @trace = nil
23
- @natural = nil
24
- @verbose = nil
25
- @mark = 0
26
- @hide_passing_tests = hide_passing_tests
27
- end
28
-
29
- # At the very start, before any testcases are run, this is called.
30
- def start_suite(suite)
31
- @suite = suite
32
- @time = Time.now
33
-
34
- io.puts Turn::Colorize.bold("Loaded Suite #{suite.name}")
35
- io.puts
36
- if suite.seed
37
- io.puts "Started at #{Time.now} w/ seed #{suite.seed}."
38
- else
39
- io.puts "Started at #{Time.now}."
40
- end
41
- io.puts
42
- end
43
-
44
- # Invoked before a testcase is run.
45
- def start_case(kase)
46
- # Print case name if there any tests in suite
47
- # TODO: Add option which will show all test cases, even without tests?
48
- io.puts kase.name if kase.size > 0
49
- end
50
-
51
- # Invoked before a test is run.
52
- def start_test(test)
53
- @test_time = Time.now
54
- @test = test
55
- end
56
-
57
- # Invoked when a test passes.
58
- def pass(message=nil)
59
- unless @hide_passing_tests
60
- banner PASS
61
-
62
- if message
63
- message = Turn::Colorize.magenta(message)
64
- message = message.to_s.tabto(TAB_SIZE)
65
-
66
- io.puts(message)
67
- end
68
- end
69
- end
70
-
71
- # Invoked when a test raises an assertion.
72
- def fail(assertion, message=nil)
73
- banner FAIL
74
-
75
- prettify(assertion, message)
76
- end
77
-
78
- # Invoked when a test raises an exception.
79
- def error(exception, message=nil)
80
- banner ERROR
81
-
82
- prettify(exception, message)
83
- end
84
-
85
- # Invoked when a test is skipped.
86
- def skip(exception, message=nil)
87
- banner SKIP
88
-
89
- prettify(exception, message)
90
- end
91
-
92
- # Invoked after all tests in a testcase have ben run.
93
- def finish_case(kase)
94
- # Print newline is there any tests in suite
95
- io.puts if kase.size > 0
96
- end
97
-
98
- # After all tests are run, this is the last observable action.
99
- def finish_suite(suite)
100
- total = colorize_count("%d tests", suite.count_tests, :bold)
101
- passes = colorize_count("%d passed", suite.count_passes, :pass)
102
- assertions = colorize_count("%d assertions", suite.count_assertions, nil)
103
- failures = colorize_count("%d failures", suite.count_failures, :fail)
104
- errors = colorize_count("%d errors", suite.count_errors, :error)
105
- skips = colorize_count("%d skips", suite.count_skips, :skip)
106
-
107
- io.puts "Finished in %.6f seconds." % (Time.now - @time)
108
- io.puts
109
-
110
- io.puts [ total, passes, failures, errors, skips, assertions ].join(", ")
111
-
112
- # Please keep this newline, since it will be useful when after test case
113
- # there will be other lines. For example "rake aborted!" or kind of.
114
- io.puts
115
- end
116
-
117
- private
118
- # Creates an optionally-colorized string describing the number of occurances an event occurred.
119
- #
120
- # @param [String] str A printf-style string that expects an integer argument (i.e. the count)
121
- # @param [Integer] count The number of occurances of the event being described.
122
- # @param [nil, Symbol] colorize_method The method on Turn::Colorize to call in order to apply color to the result, or nil
123
- # to not apply any coloring at all.
124
- def colorize_count(str, count, colorize_method)
125
- str= str % [count]
126
- str= Turn::Colorize.send(colorize_method, str) if colorize_method and count != 0
127
- str
128
- end
129
-
130
- # TODO: Could also provide % done with time info. But it's already taking up
131
- # a lot of screen realestate. Maybe use --verbose flag to offer two forms.
132
-
133
- # Outputs test case header for given event (error, fail & etc)
134
- #
135
- # Example:
136
- # PASS test: Test decription. (0.15s 0:00:02:059)
137
- def banner(event)
138
- name = naturalized_name(@test)
139
- delta = Time.now - @test_time # test runtime
140
- if @verbose
141
- out = "%18s (%0.5fs) (%s) %s" % [event, delta, ticktock, name]
142
- else
143
- out = "%18s (%s) %s" % [event, ticktock, name]
144
- end
145
- if @mark > 0 && delta > @mark
146
- out[1] = Turn::Colorize.mark('*')
147
- end
148
- io.puts out
149
- end
150
-
151
- # Cleanups and prints test payload
152
- #
153
- # Example:
154
- # fail is not 1
155
- # @ test/test_runners.rb:46:in `test_autorun_with_trace'
156
- # bin/turn:4:in `<main>'
157
- def prettify(raised, message=nil)
158
- # Get message from raised, if not given
159
- message ||= raised.message
160
-
161
- backtrace = raised.respond_to?(:backtrace) ? raised.backtrace : raised.location
162
-
163
- # Filter and clean backtrace
164
- backtrace = clean_backtrace(backtrace)
165
-
166
- # Add trace mark to first line.
167
- backtrace.first.insert(0, TRACE_MARK)
168
-
169
- io.puts Turn::Colorize.bold(message.tabto(TAB_SIZE))
170
- io.puts backtrace.shift.tabto(TAB_SIZE - TRACE_MARK.length)
171
- io.puts backtrace.join("\n").tabto(TAB_SIZE)
172
- io.puts
173
- end
174
- end
175
- end