learn-test 1.2.26 → 2.0.0.pre

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/bin/learn-test +37 -63
  3. data/lib/learn_test.rb +12 -18
  4. data/lib/learn_test/runner.rb +71 -0
  5. data/lib/learn_test/strategies/jasmine.rb +153 -0
  6. data/lib/learn_test/{jasmine → strategies/jasmine}/boot.js +0 -0
  7. data/lib/learn_test/{jasmine → strategies/jasmine}/console.js +0 -0
  8. data/lib/learn_test/{jasmine → strategies/jasmine}/formatters/jasmine2-junit.js +0 -0
  9. data/lib/learn_test/{jasmine → strategies/jasmine}/helpers/ConsoleHelper.js +0 -0
  10. data/lib/learn_test/{jasmine → strategies/jasmine}/helpers/ConsoleHelperNoColor.js +0 -0
  11. data/lib/learn_test/{jasmine → strategies/jasmine}/initializer.rb +0 -0
  12. data/lib/learn_test/{jasmine → strategies/jasmine}/jasmine-html.js +0 -0
  13. data/lib/learn_test/{jasmine → strategies/jasmine}/jasmine-jquery.js +0 -0
  14. data/lib/learn_test/{jasmine → strategies/jasmine}/jasmine.css +0 -0
  15. data/lib/learn_test/{jasmine → strategies/jasmine}/jasmine.js +0 -0
  16. data/lib/learn_test/{jasmine → strategies/jasmine}/jasmine_favicon.png +0 -0
  17. data/lib/learn_test/{jasmine → strategies/jasmine}/jquery-1.8.0.min.js +0 -0
  18. data/lib/learn_test/{jasmine → strategies/jasmine}/jquery-ui-1.8.23.custom.min.js +0 -0
  19. data/lib/learn_test/{jasmine → strategies/jasmine}/phantom_checker.rb +0 -0
  20. data/lib/learn_test/{jasmine → strategies/jasmine}/runners/SpecRunner.html +0 -0
  21. data/lib/learn_test/{jasmine → strategies/jasmine}/runners/run-jasmine.js +0 -0
  22. data/lib/learn_test/{jasmine → strategies/jasmine}/templates/SpecRunnerTemplate.html.erb +0 -0
  23. data/lib/learn_test/{jasmine → strategies/jasmine}/templates/SpecRunnerTemplateNoColor.html.erb +0 -0
  24. data/lib/learn_test/{jasmine → strategies/jasmine}/templates/requires.yml.example +0 -0
  25. data/lib/learn_test/{jasmine → strategies/jasmine}/vendor/require.js +0 -0
  26. data/lib/learn_test/strategies/python_unittest.rb +67 -0
  27. data/lib/learn_test/{python_unittest → strategies/python_unittest}/nose_installer.rb +1 -1
  28. data/lib/learn_test/{python_unittest → strategies/python_unittest}/requirements_checker.rb +0 -0
  29. data/lib/learn_test/strategies/rspec.rb +89 -0
  30. data/lib/learn_test/strategy.rb +51 -0
  31. data/lib/learn_test/version.rb +1 -1
  32. data/spec/repo_parser_spec.rb +1 -1
  33. data/spec/spec_helper.rb +1 -1
  34. metadata +32 -31
  35. data/lib/learn_test/jasmine/runner.rb +0 -130
  36. data/lib/learn_test/python_unittest/runner.rb +0 -94
  37. data/lib/learn_test/rspec/runner.rb +0 -127
  38. data/lib/learn_test/spec_type_parser.rb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 34bfbc3b76dddc66031d2b5cd1219a412f490354
4
- data.tar.gz: d5a26157552218763f27cdee4d12dac7e38e7dd8
3
+ metadata.gz: a6ae3752afc279ded7a92162c8b13be7698ee389
4
+ data.tar.gz: 15838447f7a5a92fea7d5357bfa27825c106f0cd
5
5
  SHA512:
6
- metadata.gz: ab0ce891184c8c0e20f3ab3b35fce1feda5cb57d11e62ac6e4351e3ddfc0e949e5a565177d7b6f2d89d495c632fb14d0ff58bb1cee86695062f912df7a93a767
7
- data.tar.gz: 9bf5c0067ad6eeae26f94cc13dee01e22872c78fdd852ae53bebb5d9c71ae74c2ab9505e23952a4ce6e72699f8ca3e8da3faad73bac3d9b8c162ca3223a57373
6
+ metadata.gz: 28390cd306ac2969375021e59c41438d4d47bcabf9fec9c44ac00ea15412ac9b8108f34a610ef63bd50d84b8493161c07333e50fcbe6299b776da17442821fd2
7
+ data.tar.gz: 380ba0400f08644d9be52f2118e79d2b13b24726b56d578db06a0c829c3baf9f5600af034c408de0c0a09a2108eaa8e899a8465d368325aa51320fa9d0c53c32
data/bin/learn-test CHANGED
@@ -1,82 +1,56 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'optparse'
4
- require 'learn_test'
4
+ require_relative '../lib/learn_test'
5
5
 
6
- SERVICE_URL = 'http://ironbroker.flatironschool.com'
6
+ options = {}
7
7
 
8
- spec_type = LearnTest::SpecTypeParser.new.spec_type
8
+ OptionParser.new do |opts|
9
+ opts.banner = "Usage: learn [options]"
9
10
 
10
- unless spec_type == 'jasmine'
11
- username = LearnTest::UsernameParser.get_username
12
- user_id = LearnTest::UserIdParser.get_user_id
13
- end
14
-
15
- repo = ARGV.include?("--test") ? "git@github.com:flatiron-school/a-sample-repo.git" : LearnTest::RepoParser.get_repo
16
-
17
- if spec_type == "jasmine"
18
- SERVICE_ENDPOINT = '/e/flatiron_jasmine/build/ironboard'
11
+ opts.on("-n", "--[no-]color", "Turn off color output") do |c|
12
+ options[:color] = c
13
+ end
19
14
 
20
- options = {}
21
- OptionParser.new do |opts|
22
- opts.banner = "Usage: learn [options]"
15
+ opts.on("-f", "--format") do |f|
16
+ options[:format] = f
17
+ end
23
18
 
24
- opts.on("-n", "--[no-]color", "Turn off color output") do |c|
25
- options[:color] = c
26
- end
19
+ opts.on("-l", "--local", "Don't push results to Flatiron LMS") do |l|
20
+ options[:local] = l
21
+ end
27
22
 
28
- opts.on("-l", "--local", "Don't push results to Flatiron LMS") do |l|
29
- options[:local] = l
30
- end
23
+ opts.on("-b", "--browser", "Run tests in browser") do |b|
24
+ options[:browser] = b
25
+ end
31
26
 
32
- opts.on("-b", "--browser", "Run tests in browser") do |b|
33
- options[:browser] = b
34
- end
27
+ opts.on("-o", "--out FILE") do |o|
28
+ options[:out] = o
29
+ end
35
30
 
36
- opts.on("-o", "--out FILE") do |o|
37
- options[:out] = o
38
- end
31
+ opts.on("-s", "--skip") do |s|
32
+ options[:skip] = s
33
+ end
39
34
 
40
- opts.on("-s", "--skip") do |s|
41
- options[:skip] = s
42
- end
35
+ opts.on("-t", "--test") do |t|
36
+ options[:test] = t
37
+ end
43
38
 
44
- opts.on("-t", "--test") do |t|
45
- options[:test] = t
46
- end
39
+ opts.on("-v", "--version") do |v|
40
+ puts LearnTest::VERSION
41
+ exit
42
+ end
47
43
 
48
- opts.on('--keep', "Don't delete test output files") do |k|
49
- options[:keep] = true
50
- end
51
- end.parse!
44
+ opts.on('--keep', "Don't delete test output files") do |k|
45
+ options[:keep] = true
46
+ end
52
47
 
53
48
  if ARGV.any? { |arg| arg == "init" }
54
- LearnTest::Jasmine::Initializer.run
55
- else
56
- if !options[:skip]
57
- LearnTest::Jasmine::PhantomChecker.check_installation
58
- username = LearnTest::UsernameParser.get_username
59
- user_id = LearnTest::UserIdParser.get_user_id
60
- else
61
- username = "jasmine-flatiron"
62
- user_id = "none"
63
- end
64
-
65
- LearnTest::Jasmine::Runner.run(username, user_id, repo, options)
49
+ options[:init] = true
66
50
  end
67
- elsif spec_type == "rspec"
68
- SERVICE_ENDPOINT = '/e/flatiron_rspec/build/ironboard'
69
-
70
- runner = LearnTest::RSpec::Runner.new(username, user_id, repo, ARGV)
71
- runner.run
72
- elsif spec_type == 'python_unittest'
73
- SERVICE_ENDPOINT = '/e/flatiron_unittest/build/ironboard'
74
51
 
75
- LearnTest::PythonUnittest::RequirementsChecker.check_installation
76
- LearnTest::PythonUnittest::NoseInstaller.install
52
+ options[:argv] = ARGV
53
+ end.parse!
77
54
 
78
- runner = LearnTest::PythonUnittest::Runner.new(username, user_id, repo, ARGV)
79
- runner.run
80
- else
81
- puts "This directory doesn't appear to have any specs in it."
82
- end
55
+ repo = options[:test] ? "git@github.com:flatiron-school/a-sample-repo.git" : LearnTest::RepoParser.get_repo
56
+ LearnTest::Runner.new(repo, options).run
data/lib/learn_test.rb CHANGED
@@ -2,25 +2,19 @@ require 'fileutils'
2
2
  require 'faraday'
3
3
  require 'oj'
4
4
 
5
- require 'learn_test/version'
6
- require 'learn_test/netrc_interactor'
7
- require 'learn_test/github_interactor'
8
- require 'learn_test/user_id_parser'
9
- require 'learn_test/username_parser'
10
- require 'learn_test/repo_parser'
11
- require 'learn_test/file_finder'
12
- require 'learn_test/spec_type_parser'
5
+ require_relative 'learn_test/version'
6
+ require_relative 'learn_test/netrc_interactor'
7
+ require_relative 'learn_test/github_interactor'
8
+ require_relative 'learn_test/user_id_parser'
9
+ require_relative 'learn_test/username_parser'
10
+ require_relative 'learn_test/repo_parser'
11
+ require_relative 'learn_test/file_finder'
12
+ require_relative 'learn_test/runner'
13
+ require_relative 'learn_test/strategy'
13
14
 
14
- require 'learn_test/rspec/runner'
15
-
16
- require 'learn_test/jasmine/phantom_checker'
17
- require 'learn_test/jasmine/initializer'
18
- require 'learn_test/jasmine/runner'
19
-
20
- require 'learn_test/python_unittest/requirements_checker'
21
- require 'learn_test/python_unittest/nose_installer'
22
- require 'learn_test/python_unittest/runner'
15
+ require_relative 'learn_test/strategies/jasmine'
16
+ require_relative 'learn_test/strategies/python_unittest'
17
+ require_relative 'learn_test/strategies/rspec'
23
18
 
24
19
  module LearnTest
25
20
  end
26
-
@@ -0,0 +1,71 @@
1
+ module LearnTest
2
+ class Runner
3
+ attr_reader :repo, :options
4
+ SERVICE_URL = 'http://ironbroker07.fe.flatironschool.com'
5
+
6
+ def initialize(repo, options = {})
7
+ @repo = repo
8
+ @options = options
9
+ die if !strategy
10
+ end
11
+
12
+ def run
13
+ strategy.check_dependencies
14
+ strategy.configure
15
+ strategy.run
16
+ if !help_option_present? && strategy.push_results?
17
+ push_results(strategy)
18
+ strategy.cleanup unless keep_results?
19
+ end
20
+ end
21
+
22
+ def files
23
+ @files ||= Dir.entries('.')
24
+ end
25
+
26
+ def keep_results?
27
+ @keep_results ||= options[:keep] || !!options.delete('--keep')
28
+ end
29
+
30
+ def strategy
31
+ @strategy ||= strategies.map{ |s| s.new(self) }.detect(&:detect)
32
+ end
33
+
34
+ private
35
+
36
+ def connection
37
+ @connection ||= Faraday.new(url: SERVICE_URL) do |faraday|
38
+ faraday.adapter Faraday.default_adapter
39
+ end
40
+ end
41
+
42
+ def strategies
43
+ [
44
+ LearnTest::Strategies::Rspec,
45
+ LearnTest::Strategies::Jasmine,
46
+ LearnTest::Strategies::PythonUnittest
47
+ ]
48
+ end
49
+
50
+ def push_results(strategy)
51
+ begin
52
+ connection.post do |req|
53
+ req.url(strategy.service_endpoint)
54
+ req.headers['Content-Type'] = 'application/json'
55
+ req.body = Oj.dump(strategy.results, mode: :compat)
56
+ end
57
+ rescue Faraday::ConnectionFailed
58
+ puts 'There was a problem connecting to Learn. Not pushing test results.'
59
+ end
60
+ end
61
+
62
+ def help_option_present?
63
+ options.include?('-h') || options.include?('--help')
64
+ end
65
+
66
+ def die
67
+ puts "This directory doesn't appear to have any specs in it."
68
+ exit
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,153 @@
1
+ require 'crack'
2
+ require 'erb'
3
+ require 'yaml'
4
+ require 'json'
5
+
6
+ require_relative 'jasmine/phantom_checker'
7
+ require_relative 'jasmine/initializer'
8
+
9
+ module LearnTest
10
+ module Strategies
11
+ class Jasmine < LearnTest::Strategy
12
+ def service_endpoint
13
+ '/e/flatiron_jasmine'
14
+ end
15
+
16
+ def detect
17
+ runner.files.include?('requires.yml')
18
+ end
19
+
20
+ def check_dependencies
21
+ LearnTest::Jasmine::PhantomChecker.check_installation unless options[:skip]
22
+ end
23
+
24
+ def run
25
+ if options[:init]
26
+ LearnTest::Jasmine::Initializer.run
27
+ else
28
+ set_up_runner
29
+ run_jasmine
30
+ make_json
31
+ end
32
+ end
33
+
34
+ def results
35
+ @results ||= {
36
+ username: username,
37
+ github_user_id: user_id,
38
+ repo_name: runner.repo,
39
+ build: {
40
+ test_suite: [{
41
+ framework: 'jasmine',
42
+ formatted_output: [],
43
+ duration: 0.0
44
+ }]
45
+ },
46
+ tests: 0,
47
+ errors: 0,
48
+ failures: 0
49
+ }
50
+ end
51
+
52
+ def push_results?
53
+ !local? && !browser?
54
+ end
55
+
56
+ def cleanup
57
+ test_xml_files.each do |file|
58
+ FileUtils.rm(file)
59
+ end
60
+ end
61
+
62
+ def username
63
+ options[:skip] ? "jasmine-flatiron" : super
64
+ end
65
+
66
+ def user_id
67
+ options[:skip] ? "none" : super
68
+ end
69
+
70
+ private
71
+
72
+ def set_up_runner
73
+ template = ERB.new(File.read("#{LearnTest::FileFinder.location_to_dir('strategies/jasmine/templates')}/SpecRunnerTemplate#{color_option}.html.erb"))
74
+
75
+ yaml = YAML.load(File.read('requires.yml'))["javascripts"]
76
+
77
+ required_files = yaml["files"]
78
+ required_specs = yaml["specs"]
79
+
80
+ @javascripts = []
81
+ @javascripts << (required_files && required_files.map {|f| "#{test_path}/#{f}"})
82
+ @javascripts << (required_specs && required_specs.map {|f| "#{test_path}/#{f}"} )
83
+ @javascripts.flatten!.compact!
84
+
85
+ File.open("#{LearnTest::FileFinder.location_to_dir('strategies/jasmine/runners')}/SpecRunner#{color_option}.html",
86
+ 'w+') do |f|
87
+ f << template.result(binding)
88
+ end
89
+ end
90
+
91
+ def run_jasmine
92
+ if browser?
93
+ # system("open #{LearnTest::FileFinder.location_to_dir('jasmine/runners')}/SpecRunner#{color_option}.html --args allow-file-access-from-files")
94
+ chrome_with_file_access_command = "\"/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome\" \"#{LearnTest::FileFinder.location_to_dir('strategies/jasmine/runners')}/SpecRunner#{color_option}.html\" --allow-file-access-from-files"
95
+ # This should give me back to the prompt - u can use & but a flag to send it to the background would be better.
96
+ system(chrome_with_file_access_command)
97
+ else
98
+ system("phantomjs #{LearnTest::FileFinder.location_to_dir('strategies/jasmine/runners')}/run-jasmine.js #{LearnTest::FileFinder.location_to_dir('strategies/jasmine/runners')}/SpecRunner#{color_option}.html")
99
+ end
100
+ end
101
+
102
+ def test_xml_files
103
+ Dir.entries(test_path).keep_if { |f| f.match(/TEST/) }
104
+ end
105
+
106
+ def make_json
107
+ if local? || !browser?
108
+ test_xml_files.each do |f|
109
+ parsed = JSON.parse(Crack::XML.parse(File.read(f)).to_json)["testsuites"]["testsuite"]
110
+ results[:build][:test_suite][0][:formatted_output] << parsed["testcase"]
111
+ results[:build][:test_suite][0][:formatted_output].flatten!
112
+ results[:tests] += parsed["tests"].to_i
113
+ results[:errors] += parsed["errors"].to_i
114
+ results[:failures] += parsed["failures"].to_i
115
+ results[:build][:test_suite][0][:duration] += parsed["time"].to_f
116
+ end
117
+ results[:passing_count] = results[:tests] - results[:failures] - results[:errors]
118
+ end
119
+
120
+ if out || runner.keep_results?
121
+ output_file = out ? out : '.results.json'
122
+ write_json_output(output_file: output_file)
123
+ end
124
+ end
125
+
126
+ def write_json_output(output_file:)
127
+ File.open(output_file, 'w+') do |f|
128
+ f.write(results.to_json)
129
+ end
130
+ end
131
+
132
+ def color_option
133
+ !options[:color] ? '' : 'NoColor'
134
+ end
135
+
136
+ def local?
137
+ !!options[:local]
138
+ end
139
+
140
+ def browser?
141
+ !!options[:browser]
142
+ end
143
+
144
+ def out
145
+ options[:out]
146
+ end
147
+
148
+ def test_path
149
+ @test_path ||= FileUtils.pwd
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,67 @@
1
+ require_relative 'python_unittest/requirements_checker'
2
+ require_relative 'python_unittest/nose_installer'
3
+
4
+ module LearnTest
5
+ module Strategies
6
+ class PythonUnittest < LearnTest::Strategy
7
+ def service_endpoint
8
+ '/e/flatiron_unittest'
9
+ end
10
+
11
+ def detect
12
+ runner.files.any? {|f| f.match(/.*.py$/) }
13
+ end
14
+
15
+ def check_dependencies
16
+ LearnTest::PythonUnittest::RequirementsChecker.check_installation
17
+ LearnTest::PythonUnittest::NoseInstaller.install
18
+ end
19
+
20
+ def run
21
+ system("nosetests #{options[:argv].join(' ')} --verbose --with-json --json-file='./.results.json'")
22
+ end
23
+
24
+ def output
25
+ @output ||= Oj.load(File.read('.results.json'), symbol_keys: true)
26
+ end
27
+
28
+ def results
29
+ {
30
+ username: username,
31
+ github_user_id: user_id,
32
+ repo_name: runner.repo,
33
+ build: {
34
+ test_suite: [{
35
+ framework: 'unittest',
36
+ formatted_output: output,
37
+ duration: calculate_duration
38
+ }]
39
+ },
40
+ examples: output[:stats][:total],
41
+ passing_count: output[:stats][:passes],
42
+ pending_count: output[:stats][:skipped],
43
+ failure_count: output[:stats][:errors],
44
+ failure_descriptions: concat_failure_descriptions
45
+ }
46
+ end
47
+
48
+ def cleanup
49
+ FileUtils.rm('.results.json')
50
+ end
51
+
52
+ private
53
+
54
+ def calculate_duration
55
+ output[:results].map do |example|
56
+ example[:time]
57
+ end.inject(:+)
58
+ end
59
+
60
+ def concat_failure_descriptions
61
+ output[:results].select do |example|
62
+ example[:type] == 'failure'
63
+ end.map { |ex| ex[:tb] }.join(';')
64
+ end
65
+ end
66
+ end
67
+ end
@@ -12,7 +12,7 @@ module LearnTest
12
12
 
13
13
  def install_nose
14
14
  if !nose_installed?
15
- `pip install nose`
15
+ `easy_install nose`
16
16
  end
17
17
  end
18
18
 
@@ -0,0 +1,89 @@
1
+ module LearnTest
2
+ module Strategies
3
+ class Rspec < LearnTest::Strategy
4
+ def service_endpoint
5
+ '/e/flatiron_rspec'
6
+ end
7
+
8
+ def detect
9
+ runner.files.include?('spec') && (spec_files.include?('spec_helper.rb') || spec_files.include?('rails_helper.rb'))
10
+ end
11
+
12
+ def configure
13
+ if format_option_present?
14
+ if dot_rspec.any? {|dot_opt| dot_opt.match(/--format|-f/)}
15
+ argv << dot_rspec.reject {|dot_opt| dot_opt.match(/--format|-f/)}
16
+ else
17
+ argv << dot_rspec
18
+ end
19
+ argv.flatten!
20
+ else
21
+ argv.unshift('--format documentation')
22
+ end
23
+
24
+ # Don't pass the test/local flag from learn binary to rspec runner.
25
+ argv.delete("--test")
26
+ argv.delete("-t")
27
+ argv.delete("-l")
28
+ argv.delete("--local")
29
+ end
30
+
31
+ def run
32
+ system("rspec #{argv.join(' ')} --format j --out .results.json")
33
+ end
34
+
35
+ def output
36
+ File.exists?('.results.json') ? Oj.load(File.read('.results.json'), symbol_keys: true) : nil
37
+ end
38
+
39
+ def results
40
+ {
41
+ username: username,
42
+ github_user_id: user_id,
43
+ repo_name: runner.repo,
44
+ build: {
45
+ test_suite: [{
46
+ framework: 'rspec',
47
+ formatted_output: output,
48
+ duration: output ? output[:summary][:duration] : nil
49
+ }]
50
+ },
51
+ examples: output ? output[:summary][:example_count] : 1,
52
+ passing_count: output ? output[:summary][:example_count] - output[:summary][:failure_count] - output[:summary][:pending_count] : 0,
53
+ pending_count: output ? output[:summary][:pending_count] : 0,
54
+ failure_count: output ? output[:summary][:failure_count] : 1,
55
+ failure_descriptions: failures
56
+ }
57
+ end
58
+
59
+ def cleanup
60
+ FileUtils.rm('.results.json') unless !File.exist?('.results.json')
61
+ end
62
+
63
+ private
64
+
65
+ def spec_files
66
+ @spec_files ||= Dir.entries('./spec')
67
+ end
68
+
69
+ def format_option_present?
70
+ options[:format]
71
+ end
72
+
73
+ def dot_rspec
74
+ @dot_rspec ||= File.readlines('.rspec').map(&:strip) if File.exist?('.rspec')
75
+ end
76
+
77
+ def failures
78
+ if output
79
+ output[:examples].select do |example|
80
+ example[:status] == "failed"
81
+ end.map { |ex| ex[:full_description] }.join(";")
82
+ else
83
+ 'A syntax error prevented RSpec from running.'
84
+ end
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,51 @@
1
+ module LearnTest
2
+ class Strategy
3
+ attr_reader :runner, :options
4
+
5
+ def initialize(runner)
6
+ @runner = runner
7
+ @options = runner.options
8
+ end
9
+
10
+ def service_endpoint
11
+ raise NotImplementedError, 'you must add the service endpoint to the test strategy'
12
+ end
13
+
14
+ def check_dependencies
15
+ end
16
+
17
+ def configure
18
+ end
19
+
20
+ def run
21
+ raise NotImplementedError, 'you must implement how this strategy runs its tests'
22
+ end
23
+
24
+ def output
25
+ raise NotImplementedError, 'you must implement how the test gets its raw output'
26
+ end
27
+
28
+ def results
29
+ output
30
+ end
31
+
32
+ def push_results?
33
+ true
34
+ end
35
+
36
+ def cleanup
37
+ end
38
+
39
+ def username
40
+ @username ||= LearnTest::UsernameParser.get_username
41
+ end
42
+
43
+ def user_id
44
+ @user_id ||= LearnTest::UserIdParser.get_user_id
45
+ end
46
+
47
+ def argv
48
+ options[:argv]
49
+ end
50
+ end
51
+ end
@@ -1,3 +1,3 @@
1
1
  module LearnTest
2
- VERSION = '1.2.26'
2
+ VERSION = '2.0.0.pre'
3
3
  end
@@ -1,5 +1,5 @@
1
1
  require 'spec_helper'
2
- RSpec.describe Learn::RepoParser do
2
+ RSpec.describe LearnTest::RepoParser do
3
3
  context "URLs from github" do
4
4
  let!(:remote) { OpenStruct.new(:url => nil)}
5
5
  let!(:repo) { OpenStruct.new(:remote => remote)}
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- require_relative '../lib/learn'
1
+ require_relative '../lib/learn_test'
2
2
  RSpec.configure do |config|
3
3
  config.expect_with :rspec do |expectations|
4
4
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: learn-test
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.26
4
+ version: 2.0.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Flatiron School
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-20 00:00:00.000000000 Z
11
+ date: 2016-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -155,34 +155,35 @@ files:
155
155
  - lib/learn_test.rb
156
156
  - lib/learn_test/file_finder.rb
157
157
  - lib/learn_test/github_interactor.rb
158
- - lib/learn_test/jasmine/boot.js
159
- - lib/learn_test/jasmine/console.js
160
- - lib/learn_test/jasmine/formatters/jasmine2-junit.js
161
- - lib/learn_test/jasmine/helpers/ConsoleHelper.js
162
- - lib/learn_test/jasmine/helpers/ConsoleHelperNoColor.js
163
- - lib/learn_test/jasmine/initializer.rb
164
- - lib/learn_test/jasmine/jasmine-html.js
165
- - lib/learn_test/jasmine/jasmine-jquery.js
166
- - lib/learn_test/jasmine/jasmine.css
167
- - lib/learn_test/jasmine/jasmine.js
168
- - lib/learn_test/jasmine/jasmine_favicon.png
169
- - lib/learn_test/jasmine/jquery-1.8.0.min.js
170
- - lib/learn_test/jasmine/jquery-ui-1.8.23.custom.min.js
171
- - lib/learn_test/jasmine/phantom_checker.rb
172
- - lib/learn_test/jasmine/runner.rb
173
- - lib/learn_test/jasmine/runners/SpecRunner.html
174
- - lib/learn_test/jasmine/runners/run-jasmine.js
175
- - lib/learn_test/jasmine/templates/SpecRunnerTemplate.html.erb
176
- - lib/learn_test/jasmine/templates/SpecRunnerTemplateNoColor.html.erb
177
- - lib/learn_test/jasmine/templates/requires.yml.example
178
- - lib/learn_test/jasmine/vendor/require.js
179
158
  - lib/learn_test/netrc_interactor.rb
180
- - lib/learn_test/python_unittest/nose_installer.rb
181
- - lib/learn_test/python_unittest/requirements_checker.rb
182
- - lib/learn_test/python_unittest/runner.rb
183
159
  - lib/learn_test/repo_parser.rb
184
- - lib/learn_test/rspec/runner.rb
185
- - lib/learn_test/spec_type_parser.rb
160
+ - lib/learn_test/runner.rb
161
+ - lib/learn_test/strategies/jasmine.rb
162
+ - lib/learn_test/strategies/jasmine/boot.js
163
+ - lib/learn_test/strategies/jasmine/console.js
164
+ - lib/learn_test/strategies/jasmine/formatters/jasmine2-junit.js
165
+ - lib/learn_test/strategies/jasmine/helpers/ConsoleHelper.js
166
+ - lib/learn_test/strategies/jasmine/helpers/ConsoleHelperNoColor.js
167
+ - lib/learn_test/strategies/jasmine/initializer.rb
168
+ - lib/learn_test/strategies/jasmine/jasmine-html.js
169
+ - lib/learn_test/strategies/jasmine/jasmine-jquery.js
170
+ - lib/learn_test/strategies/jasmine/jasmine.css
171
+ - lib/learn_test/strategies/jasmine/jasmine.js
172
+ - lib/learn_test/strategies/jasmine/jasmine_favicon.png
173
+ - lib/learn_test/strategies/jasmine/jquery-1.8.0.min.js
174
+ - lib/learn_test/strategies/jasmine/jquery-ui-1.8.23.custom.min.js
175
+ - lib/learn_test/strategies/jasmine/phantom_checker.rb
176
+ - lib/learn_test/strategies/jasmine/runners/SpecRunner.html
177
+ - lib/learn_test/strategies/jasmine/runners/run-jasmine.js
178
+ - lib/learn_test/strategies/jasmine/templates/SpecRunnerTemplate.html.erb
179
+ - lib/learn_test/strategies/jasmine/templates/SpecRunnerTemplateNoColor.html.erb
180
+ - lib/learn_test/strategies/jasmine/templates/requires.yml.example
181
+ - lib/learn_test/strategies/jasmine/vendor/require.js
182
+ - lib/learn_test/strategies/python_unittest.rb
183
+ - lib/learn_test/strategies/python_unittest/nose_installer.rb
184
+ - lib/learn_test/strategies/python_unittest/requirements_checker.rb
185
+ - lib/learn_test/strategies/rspec.rb
186
+ - lib/learn_test/strategy.rb
186
187
  - lib/learn_test/user_id_parser.rb
187
188
  - lib/learn_test/username_parser.rb
188
189
  - lib/learn_test/version.rb
@@ -213,12 +214,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
213
214
  version: '0'
214
215
  required_rubygems_version: !ruby/object:Gem::Requirement
215
216
  requirements:
216
- - - ">="
217
+ - - ">"
217
218
  - !ruby/object:Gem::Version
218
- version: '0'
219
+ version: 1.3.1
219
220
  requirements: []
220
221
  rubyforge_project:
221
- rubygems_version: 2.5.1
222
+ rubygems_version: 2.4.5
222
223
  signing_key:
223
224
  specification_version: 4
224
225
  summary: Runs RSpec, Jasmine, and Python Unit Test builds and pushes JSON output to
@@ -1,130 +0,0 @@
1
- require 'crack'
2
- require 'erb'
3
- require 'yaml'
4
- require 'json'
5
-
6
- module LearnTest
7
- module Jasmine
8
- class Runner
9
- attr_reader :no_color, :local, :browser, :conn, :color_opt, :out, :keep_results
10
- attr_accessor :json_results
11
-
12
- def self.run(username, user_id, repo_name, options)
13
- new(username, user_id, repo_name, options).run
14
- end
15
-
16
- def initialize(username, user_id, repo_name, options)
17
- @current_test_path = FileUtils.pwd
18
- @no_color = !!options[:color]
19
- @color_opt = !no_color ? "" : "NoColor"
20
- @local = !!options[:local]
21
- @browser = !!options[:browser]
22
- @out = options[:out]
23
- @keep_results = options[:keep]
24
- @json_results = {
25
- username: username,
26
- github_user_id:user_id,
27
- repo_name: repo_name,
28
- build: {
29
- test_suite: [{
30
- framework: 'jasmine',
31
- formatted_output: [],
32
- duration: 0.0
33
- }]
34
- },
35
- tests: 0,
36
- errors: 0,
37
- failures: 0
38
- }
39
- @conn = Faraday.new(url: SERVICE_URL) do |faraday|
40
- faraday.adapter Faraday.default_adapter
41
- end
42
- end
43
-
44
- def run
45
- make_runner_html
46
- run_jasmine
47
- make_json
48
- push_to_flatiron unless local || browser
49
- clean_up
50
- end
51
-
52
- def run_jasmine
53
- if browser
54
- # system("open #{LearnTest::FileFinder.location_to_dir('jasmine/runners')}/SpecRunner#{color_opt}.html --args allow-file-access-from-files")
55
- chrome_with_file_access_command = "\"/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome\" \"#{LearnTest::FileFinder.location_to_dir('jasmine/runners')}/SpecRunner#{color_opt}.html\" --allow-file-access-from-files"
56
- # This should give me back to the prompt - u can use & but a flag to send it to the background would be better.
57
- system(chrome_with_file_access_command)
58
- else
59
- system("phantomjs #{LearnTest::FileFinder.location_to_dir('jasmine/runners')}/run-jasmine.js #{LearnTest::FileFinder.location_to_dir('jasmine/runners')}/SpecRunner#{color_opt}.html")
60
- end
61
- end
62
-
63
- def make_json
64
- if local || !browser
65
- test_xml_files.each do |f|
66
- parsed = JSON.parse(Crack::XML.parse(File.read(f)).to_json)["testsuites"]["testsuite"]
67
- json_results[:build][:test_suite][0][:formatted_output] << parsed["testcase"]
68
- json_results[:build][:test_suite][0][:formatted_output].flatten!
69
- json_results[:tests] += parsed["tests"].to_i
70
- json_results[:errors] += parsed["errors"].to_i
71
- json_results[:failures] += parsed["failures"].to_i
72
- json_results[:build][:test_suite][0][:duration] += parsed["time"].to_f
73
- end
74
- set_passing_test_count
75
- end
76
-
77
- if out || keep_results
78
- output_file = out ? out : '.results.json'
79
- write_json_output(output_file: output_file)
80
- end
81
- end
82
-
83
- def set_passing_test_count
84
- json_results[:passing_count] = json_results[:tests] - json_results[:failures] - json_results[:errors]
85
- end
86
-
87
- def write_json_output(output_file:)
88
- File.open(output_file, 'w+') do |f|
89
- f.write(json_results.to_json)
90
- end
91
- end
92
-
93
- def push_to_flatiron
94
- conn.post do |req|
95
- req.url SERVICE_ENDPOINT
96
- req.headers['Content-Type'] = 'application/json'
97
- req.body = json_results.to_json
98
- end
99
- end
100
-
101
- def make_runner_html
102
- template = ERB.new(File.read("#{LearnTest::FileFinder.location_to_dir('jasmine/templates')}/SpecRunnerTemplate#{color_opt}.html.erb"))
103
-
104
- yaml = YAML.load(File.read('requires.yml'))["javascripts"]
105
-
106
- required_files = yaml["files"]
107
- required_specs = yaml["specs"]
108
-
109
- @javascripts = []
110
- @javascripts << (required_files && required_files.map {|f| "#{@current_test_path}/#{f}"})
111
- @javascripts << (required_specs && required_specs.map {|f| "#{@current_test_path}/#{f}"} )
112
- @javascripts.flatten!.compact!
113
-
114
- File.open("#{LearnTest::FileFinder.location_to_dir('jasmine/runners')}/SpecRunner#{color_opt}.html", 'w+') do |f|
115
- f << template.result(binding)
116
- end
117
- end
118
-
119
- def test_xml_files
120
- Dir.entries(@current_test_path).keep_if { |f| f.match(/TEST/) }
121
- end
122
-
123
- def clean_up
124
- test_xml_files.each do |file|
125
- FileUtils.rm(file)
126
- end
127
- end
128
- end
129
- end
130
- end
@@ -1,94 +0,0 @@
1
- module LearnTest
2
- module PythonUnittest
3
- class Runner
4
- attr_accessor :parsed_output, :json_output, :formatted_results
5
- attr_reader :username, :user_id, :repo_name, :options, :connection, :keep_results
6
-
7
- def initialize(username, user_id, repo_name, options)
8
- @username = username
9
- @user_id = user_id
10
- @repo_name = repo_name
11
- @options = options
12
- @json_output = ""
13
- @parsed_output = nil
14
- @formatted_results = {}
15
- @keep_results = !!options.delete('--keep')
16
- @connection = Faraday.new(url: SERVICE_URL) do |faraday|
17
- faraday.adapter Faraday.default_adapter
18
- end
19
- end
20
-
21
- def run
22
- run_nose
23
- if !options.include?('-h') && !options.include?('--help')
24
- set_json_output
25
- jsonify
26
- format_results
27
- push_results
28
- cleanup
29
- end
30
- end
31
-
32
- def keep_results?
33
- keep_results
34
- end
35
-
36
- def run_nose
37
- system("nosetests #{options.join(' ')} --verbose --with-json --json-file='./.results.json'")
38
- end
39
-
40
- def set_json_output
41
- self.json_output = File.read('.results.json')
42
- end
43
-
44
- def jsonify
45
- self.parsed_output = Oj.load(json_output, symbol_keys: true)
46
- end
47
-
48
- def format_results
49
- self.formatted_results.merge!({
50
- username: username,
51
- github_user_id: user_id,
52
- repo_name: repo_name,
53
- build: {
54
- test_suite: [{
55
- framework: 'unittest',
56
- formatted_output: parsed_output,
57
- duration: calculate_duration
58
- }]
59
- },
60
- examples: parsed_output[:stats][:total],
61
- passing_count: parsed_output[:stats][:passes],
62
- pending_count: parsed_output[:stats][:skipped],
63
- failure_count: parsed_output[:stats][:errors],
64
- failure_descriptions: concat_failure_descriptions
65
- })
66
- end
67
-
68
- def calculate_duration
69
- parsed_output[:results].map do |example|
70
- example[:time]
71
- end.inject(:+)
72
- end
73
-
74
- def concat_failure_descriptions
75
- parsed_output[:results].select do |example|
76
- example[:type] == 'failure'
77
- end.map { |ex| ex[:tb] }.join(';')
78
- end
79
-
80
- def push_results
81
- connection.post do |req|
82
- req.url SERVICE_ENDPOINT
83
- req.headers['Content-Type'] = 'application/json'
84
- req.body = Oj.dump(formatted_results, mode: :compat)
85
- end
86
- end
87
-
88
- def cleanup
89
- FileUtils.rm('.results.json') unless keep_results?
90
- end
91
- end
92
- end
93
- end
94
-
@@ -1,127 +0,0 @@
1
- module LearnTest
2
- module RSpec
3
- class Runner
4
- attr_accessor :parsed_output, :json_output, :formatted_results, :keep_results
5
- attr_reader :username, :user_id, :repo_name, :options, :connection
6
-
7
- def initialize(username, user_id, repo_name, options)
8
- @username = username
9
- @user_id = user_id
10
- @repo_name = repo_name
11
- @options = options
12
- @json_output = ""
13
- @parsed_output = nil
14
- @formatted_results = {}
15
- @connection = Faraday.new(url: SERVICE_URL) do |faraday|
16
- faraday.adapter Faraday.default_adapter
17
- end
18
- end
19
-
20
- def run
21
- check_options
22
- run_rspec
23
- if !options.include?('-h') && !options.include?('--help')
24
- set_json_output
25
- jsonify
26
- format_results
27
- push_results
28
- cleanup
29
- end
30
- end
31
-
32
- def check_options
33
- options_has_format = options.include?('--format') || options.include?('-f')
34
- if dot_rspec = read_dot_rspec
35
- if options_has_format
36
- if dot_rspec.any? {|dot_opt| dot_opt.match(/--format|-f/)}
37
- options << dot_rspec.reject {|dot_opt| dot_opt.match(/--format|-f/)}
38
- else
39
- options << dot_rspec
40
- end
41
- end
42
- end
43
-
44
- if options_has_format
45
- self.options.flatten!
46
- else
47
- options.unshift('--format documentation')
48
- end
49
-
50
- # Don't pass the test/local flag from learn binary to rspec runner.
51
- options.delete("--test")
52
- options.delete("-t")
53
- options.delete("-l")
54
- options.delete("--local")
55
-
56
- self.keep_results = !!options.delete('--keep')
57
- end
58
-
59
- def read_dot_rspec
60
- if File.exist?('.rspec')
61
- File.readlines('.rspec').map(&:strip)
62
- else
63
- nil
64
- end
65
- end
66
-
67
- def run_rspec
68
- system("rspec #{options.join(' ')} --format j --out .results.json")
69
- end
70
-
71
- def set_json_output
72
- self.json_output = File.exists?('.results.json') ? File.read('.results.json') : nil
73
- end
74
-
75
- def jsonify
76
- self.parsed_output = json_output ? Oj.load(json_output, symbol_keys: true) : nil
77
- end
78
-
79
- def format_results
80
- self.formatted_results.merge!({
81
- username: username,
82
- github_user_id: user_id,
83
- repo_name: repo_name,
84
- build: {
85
- test_suite: [{
86
- framework: 'rspec',
87
- formatted_output: parsed_output,
88
- duration: parsed_output ? parsed_output[:summary][:duration] : nil
89
- }]
90
- },
91
- examples: parsed_output ? parsed_output[:summary][:example_count] : 1,
92
- passing_count: parsed_output ? parsed_output[:summary][:example_count] - parsed_output[:summary][:failure_count] - parsed_output[:summary][:pending_count] : 0,
93
- pending_count: parsed_output ? parsed_output[:summary][:pending_count] : 0,
94
- failure_count: parsed_output ? parsed_output[:summary][:failure_count] : 1,
95
- failure_descriptions: if parsed_output
96
- parsed_output[:examples].select do |example|
97
- example[:status] == "failed"
98
- end.map { |ex| ex[:full_description] }.join(";")
99
- else
100
- 'A syntax error prevented RSpec from running.'
101
- end
102
- })
103
- end
104
-
105
- def push_results
106
- begin
107
- connection.post do |req|
108
- req.url SERVICE_ENDPOINT
109
- req.headers['Content-Type'] = 'application/json'
110
- req.body = Oj.dump(formatted_results, mode: :compat)
111
- end
112
- rescue Faraday::ConnectionFailed
113
- puts 'There was a problem connecting to Learn. Not pushing test results.'
114
- end
115
- end
116
-
117
- def cleanup
118
- FileUtils.rm('.results.json') unless keep_results? || !File.exist?('.results.json')
119
- end
120
-
121
- def keep_results?
122
- keep_results
123
- end
124
- end
125
- end
126
- end
127
-
@@ -1,26 +0,0 @@
1
- module LearnTest
2
- class SpecTypeParser
3
- attr_reader :spec_type
4
-
5
- def initialize
6
- @spec_type = parse_spec_type
7
- end
8
-
9
- private
10
-
11
- def parse_spec_type
12
- files = Dir.entries('.')
13
-
14
- if files.include?('requires.yml')
15
- 'jasmine'
16
- elsif files.any? {|f| f.match(/.*.py$/) }
17
- 'python_unittest'
18
- elsif files.include?('spec')
19
- spec_files = Dir.entries('./spec')
20
- if spec_files.include?('spec_helper.rb') || spec_files.include?('rails_helper.rb')
21
- 'rspec'
22
- end
23
- end
24
- end
25
- end
26
- end