learn-test 1.2.26 → 2.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
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