learn-test 3.2.4 → 3.3.0.pre.5

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
  SHA256:
3
- metadata.gz: 78b850c796efd54f383ea05c625ad8d5f6038d9dcf865b19fc21fd6dcad435fb
4
- data.tar.gz: 88336d0c6c787c1680b22453220a1046741f7ffaf06d97ce090b7fd4d02d4f25
3
+ metadata.gz: 8bcb52a7bdd3a25aa1938ba7d13b929bb52e2ecae2107810dd074ad400a04c1c
4
+ data.tar.gz: f5fbd110ec71a7be53ef29ee44debbfa5febff13d70cdd6633624bae7fd9ccd3
5
5
  SHA512:
6
- metadata.gz: ed0abed1a972742bdbd28e05ca20218109f3834267ef560bf884b358e237107f6c294ecbda9248d570fe88c8f4014efb7cdc44bd6779b246acc59d639a35e80c
7
- data.tar.gz: c36adeff838bf630cc640df29e38f7a82de8e65c5aeff5f20a1c107b93d277c4af07ceb2703306d4306a5295237aec822a1f3105bfebfd7a7d64998be5a69700
6
+ metadata.gz: 2ae93ca8deccd1c7879ba6b22aee84b64b92d85826ebfcf188c02bdccfb07935df88e661d75d4dfe0453bdbe02fbef4f0e2dcc15b020950191be07e9017c3b25
7
+ data.tar.gz: 4462b95bd0165cf7693b63aab7faab069e02a99f6c96ac47bea33d2a44d427a6b78b1c834abe5148732c1ff062ddc5e0959e282884dc8487a24d18659776f1c0
@@ -0,0 +1,27 @@
1
+ Layout/EmptyLinesAroundAttributeAccessor:
2
+ Enabled: true
3
+
4
+ Layout/FirstHashElementIndentation:
5
+ EnforcedStyle: consistent
6
+
7
+ Layout/SpaceAroundMethodCallOperator:
8
+ Enabled: true
9
+
10
+ Lint/RaiseException:
11
+ Enabled: true
12
+
13
+ Metrics/AbcSize:
14
+ Enabled: false
15
+
16
+ Metrics/BlockLength:
17
+ Enabled: false
18
+
19
+ Metrics/MethodLength:
20
+ Enabled: false
21
+
22
+ Metrics/PerceivedComplexity:
23
+ Enabled: false
24
+
25
+ # TODO: Add top-level module documentation
26
+ Style/Documentation:
27
+ Enabled: false
data/Gemfile CHANGED
@@ -3,7 +3,9 @@
3
3
  source 'https://rubygems.org'
4
4
 
5
5
  group :test do
6
+ gem 'aruba', '~> 1.0.3'
6
7
  gem 'rspec_junit_formatter', '~> 0.4.1'
8
+ gem 'simplecov', require: false
7
9
  end
8
10
 
9
11
  gemspec
@@ -29,4 +29,5 @@ Gem::Specification.new do |spec|
29
29
  spec.add_runtime_dependency "faraday", "~> 1.0"
30
30
  spec.add_runtime_dependency "crack", "~> 0.4.3"
31
31
  spec.add_runtime_dependency "colorize", "~> 0.8.1"
32
+ spec.add_runtime_dependency "zeitwerk", "~> 2.4.0"
32
33
  end
@@ -3,42 +3,23 @@
3
3
  require 'fileutils'
4
4
  require 'oj'
5
5
  require 'colorize'
6
+ require 'zeitwerk'
6
7
 
7
- require_relative 'learn_test/version'
8
- require_relative 'learn_test/netrc_interactor'
9
- require_relative 'learn_test/git_wip'
10
- require_relative 'learn_test/github_interactor'
11
- require_relative 'learn_test/user_id_parser'
12
- require_relative 'learn_test/username_parser'
13
- require_relative 'learn_test/learn_oauth_token_parser'
14
- require_relative 'learn_test/repo_parser'
15
- require_relative 'learn_test/file_finder'
16
- require_relative 'learn_test/runner'
17
-
18
- require_relative 'learn_test/dependency'
19
-
20
- require_relative 'learn_test/strategy'
21
- require_relative 'learn_test/js_strategy'
22
- require_relative 'learn_test/strategies/rspec'
23
- require_relative 'learn_test/strategies/karma'
24
- require_relative 'learn_test/strategies/protractor'
25
- require_relative 'learn_test/strategies/java_junit'
26
- require_relative 'learn_test/strategies/csharp_nunit'
27
- require_relative 'learn_test/strategies/mocha'
28
- require_relative 'learn_test/strategies/pytest'
29
- require_relative 'learn_test/strategies/none'
8
+ loader = Zeitwerk::Loader.for_gem
9
+ loader.inflector.inflect(
10
+ 'csharp' => 'CSharp',
11
+ 'csharp_nunit' => 'CSharpNunit',
12
+ 'nodejs' => 'NodeJS',
13
+ 'phantomjs' => 'PhantomJS'
14
+ )
15
+ loader.setup
30
16
 
31
17
  module LearnTest
32
- module Dependencies
33
- autoload :NodeJS, 'learn_test/dependencies/nodejs'
34
- autoload :PhantomJS, 'learn_test/dependencies/phantomjs'
35
- autoload :Karma, 'learn_test/dependencies/karma'
36
- autoload :Protractor, 'learn_test/dependencies/protractor'
37
- autoload :Java, 'learn_test/dependencies/java'
38
- autoload :CSharp, 'learn_test/dependencies/csharp'
39
- autoload :Ant, 'learn_test/dependencies/ant'
40
- autoload :Imagemagick, 'learn_test/dependencies/imagemagick'
41
- autoload :SeleniumServer, 'learn_test/dependencies/selenium_server'
42
- autoload :Pytest, 'learn_test/dependencies/pytest'
18
+ def self.root
19
+ File.dirname __dir__
20
+ end
21
+
22
+ def self.bin
23
+ File.join root, 'bin'
43
24
  end
44
25
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git'
4
+
5
+ module LearnTest
6
+ module Git
7
+ def self.open(directory: './', options: {})
8
+ Base.open(directory, options)
9
+ end
10
+
11
+ class Base < ::Git::Base
12
+ def wip(message:)
13
+ wip = Wip::Base.new(base: self, message: message)
14
+ wip.process!
15
+ wip
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require 'git'
5
+ require 'logger'
6
+ require 'tempfile'
7
+
8
+ module LearnTest
9
+ module Git
10
+ module Wip
11
+ class Base < ::Git::Path
12
+ TEMPFILE = '.wip'
13
+
14
+ attr_reader :working_branch, :wip_branch
15
+
16
+ def initialize(base:, message:)
17
+ @base = base
18
+ @message = message
19
+ @success = nil
20
+
21
+ current_branch = @base.current_branch
22
+
23
+ raise NoCommitsError, 'master' if current_branch.nil? # TODO: Swap to `main`?
24
+
25
+ @tmp = Tempfile.new(TEMPFILE)
26
+ @working_branch = Branch.new(base: @base, name: current_branch)
27
+ @wip_branch = Reference.new(base: @base, name: current_branch)
28
+ end
29
+
30
+ def process!
31
+ if @wip_branch.last_revision
32
+ merge = @base.merge_base(@wip_branch.last_revision, @working_branch.last_revision)
33
+
34
+ @wip_branch.parent = if merge == @working_branch.last_revision
35
+ @wip_branch.last_revision
36
+ else
37
+ @working_branch.last_revision
38
+ end
39
+ else
40
+ @wip_branch.parent = @working_branch.last_revision
41
+ end
42
+
43
+ new_tree = build_new_tree(@wip_branch.parent)
44
+ @base.diff(new_tree, @wip_branch.parent)
45
+
46
+ commit = @base.commit_tree(new_tree, parent: @wip_branch.parent)
47
+
48
+ @base.lib.send(:command, 'update-ref', ['-m', @message, @wip_branch, commit.objectish])
49
+
50
+ @success = true
51
+ ensure
52
+ cleanup
53
+ end
54
+
55
+ def success?
56
+ @success
57
+ end
58
+
59
+ private
60
+
61
+ def build_new_tree(wip_parent)
62
+ index = "#{@tmp.path}-index"
63
+
64
+ FileUtils.rm(index, force: true)
65
+ FileUtils.cp("#{@base.dir.path}/.git/index", index)
66
+
67
+ @base.read_tree(wip_parent)
68
+ @base.lib.send(:command, 'add', ['--update', '--', '.'])
69
+ @base.add(all: true)
70
+
71
+ new_tree_obj = @base.write_tree
72
+
73
+ FileUtils.rm(index, force: true)
74
+
75
+ new_tree_obj
76
+ end
77
+
78
+ def cleanup
79
+ FileUtils.rm("#{@tmp.path}-*", force: true)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LearnTest
4
+ module Git
5
+ module Wip
6
+ class Branch
7
+ attr_accessor :parent
8
+
9
+ def initialize(base:, name:)
10
+ @base = base
11
+ @name = name
12
+ end
13
+
14
+ def last_revision(raise_no_commits: false)
15
+ @last_revision ||= begin
16
+ begin
17
+ @base.revparse(@name)
18
+ rescue ::Git::GitExecuteError => e
19
+ regex = LearnTest::Git::Wip::NoCommitsError::REGEX
20
+
21
+ if raise_no_commits
22
+ raise e.message.match(regex) ? LearnTest::Git::Wip::NoCommitsError.new(@name) : e
23
+ end
24
+
25
+ raise unless e.message.match(regex)
26
+
27
+ false
28
+ end
29
+ end
30
+ end
31
+
32
+ def to_s
33
+ @name
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LearnTest
4
+ module Git
5
+ module Wip
6
+ class Error < StandardError; end
7
+
8
+ class NoChangesError < Error
9
+ def initialize(branch)
10
+ super "No changes found on `#{branch}`"
11
+ end
12
+ end
13
+
14
+ class NoCommitsError < Error
15
+ REGEX = /unknown revision or path not in the working tree/i.freeze
16
+
17
+ def initialize(branch)
18
+ super "Branch `#{branch}` doesn't have any commits. Please commit and try again."
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LearnTest
4
+ module Git
5
+ module Wip
6
+ class Reference < Branch
7
+ attr_accessor :parent
8
+
9
+ PREFIX = 'refs/wip/'
10
+
11
+ def initialize(base:, name:)
12
+ dir = File.join(base.repo.path, PREFIX)
13
+ Dir.mkdir(dir, 0755) unless Dir.exist?(dir)
14
+
15
+ super(base: base, name: "#{PREFIX}#{name}")
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -6,7 +6,7 @@ module LearnTest
6
6
  class RepoParser
7
7
  def self.get_repo
8
8
  begin
9
- repo = Git.open(FileUtils.pwd)
9
+ repo = ::Git.open(FileUtils.pwd)
10
10
  rescue
11
11
  puts "You don't appear to be in a Learn lesson's directory. Please enter 'learn open' or cd to an appropriate directory and try again."
12
12
  die
@@ -3,9 +3,6 @@
3
3
  require 'fileutils'
4
4
  require 'json'
5
5
 
6
- require_relative 'client'
7
- require_relative 'git_wip'
8
-
9
6
  module LearnTest
10
7
  class Reporter
11
8
  attr_accessor :output_path, :debug
@@ -50,16 +47,30 @@ module LearnTest
50
47
  endpoint = strategy.service_endpoint
51
48
  augment_results!(results)
52
49
 
53
- if client.post_results(endpoint, results)
54
- if !LearnTest::GitWip.run! && @debug
55
- puts 'There was a problem connecting to Github. Not pushing current branch state.'.red
56
- end
57
- else
58
- if @debug
59
- puts 'There was a problem connecting to Learn. Not pushing test results.'.red
60
- end
50
+ unless client.post_results(endpoint, results)
51
+ puts 'There was a problem connecting to Learn. Not pushing test results.'.red if @debug
61
52
 
62
53
  save_failed_attempt(endpoint, results)
54
+ return
55
+ end
56
+
57
+ logger = @debug ? Logger.new(STDOUT, level: Logger::DEBUG) : false
58
+ repo = LearnTest::Git.open(options: { log: logger })
59
+
60
+ res = repo.wip(message: 'Automatic test submission')
61
+
62
+ unless res.success?
63
+ puts 'There was a problem creating your WIP branch. Not pushing current branch state.'.red if @debug
64
+ return
65
+ end
66
+
67
+ begin
68
+ repo.push('origin', "#{res.wip_branch}:refs/heads/fis-wip", { force: true })
69
+ rescue ::Git::GitExecuteError => e
70
+ if @debug
71
+ puts 'There was a problem connecting to GitHub. Not pushing current branch state.'.red
72
+ puts e.message
73
+ end
63
74
  end
64
75
  end
65
76
 
@@ -89,7 +100,7 @@ module LearnTest
89
100
 
90
101
  def augment_results!(results)
91
102
  if File.exist?("#{FileUtils.pwd}/.learn")
92
- dot_learn = YAML.load(File.read("#{FileUtils.pwd}/.learn"))
103
+ dot_learn = YAML.safe_load(File.read("#{FileUtils.pwd}/.learn"))
93
104
 
94
105
  unless dot_learn['github'].nil?
95
106
  results[:github] = dot_learn['github']
@@ -63,7 +63,7 @@ module LearnTest
63
63
  if npm_install
64
64
  system(command)
65
65
  else
66
- Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
66
+ Open3.popen3(command) do |_, stdout, stderr, wait_thr|
67
67
  while out = stdout.gets do
68
68
  puts out
69
69
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LearnTest
4
- VERSION = '3.2.4'
4
+ VERSION = '3.3.0.pre.5'
5
5
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe 'Running a RSpec Unit Test' do
4
- before(:all) do
3
+ describe 'Running a RSpec Unit Test', type: :aruba do
4
+ before :all do
5
5
  # While it doesn't cause these tests to fail, nasty messages occur (and more)
6
6
  # when either a ~/.netrc entry or file itself doesn't exist. This aims to correct that,
7
7
  # and will only ever be called once.
@@ -9,9 +9,23 @@ describe 'Running a RSpec Unit Test' do
9
9
  LearnTest::UsernameParser.get_username
10
10
  end
11
11
 
12
+ before :each do
13
+ copy '%/rspec-unit-spec', 'example'
14
+ cd 'example'
15
+
16
+ git_init
17
+ git_add
18
+ git_commit 'Initial Commit'
19
+ end
20
+
21
+ def run(flags = '')
22
+ run_command_and_stop("#{File.join(LearnTest.bin, 'learn-test')} #{flags}")
23
+ last_command_started.output
24
+ end
25
+
12
26
  context 'a basic rspec unit test' do
13
27
  it 'runs the spec with 0 failures' do
14
- output = `cd ./spec/fixtures/rspec-unit-spec && ./../../../bin/learn-test --local --test`
28
+ output = run('--local --test')
15
29
 
16
30
  expect(output).to include('3 examples, 0 failures')
17
31
  expect(output).to_not include('1 failures')
@@ -20,14 +34,14 @@ describe 'Running a RSpec Unit Test' do
20
34
 
21
35
  context 'with the --example flag' do
22
36
  it 'runs only the appropriate tests' do
23
- output = `cd ./spec/fixtures/rspec-unit-spec && ./../../../bin/learn-test --local --test --example multiple`
37
+ output = run('--local --test --example multiple')
24
38
 
25
39
  expect(output).to include('1 example, 0 failures')
26
40
  expect(output).to_not include('2 examples')
27
41
  end
28
42
 
29
- it 'accepts multiple examples' do
30
- output = `cd ./spec/fixtures/rspec-unit-spec && ./../../../bin/learn-test --local --test --example multiple --example accepts`
43
+ it 'accepts multiple examples' do
44
+ output = run(' --local --test --example multiple --example accepts')
31
45
 
32
46
  expect(output).to include('2 examples, 0 failures')
33
47
  expect(output).to_not include('3 examples')
@@ -0,0 +1 @@
1
+ {"version":"3.9.2","examples":[{"id":"./spec/dog_spec.rb[1:1]","description":"runs the spec spec correctly","full_description":"Dog runs the spec spec correctly","status":"passed","file_path":"./spec/dog_spec.rb","line_number":6,"run_time":0.000423,"pending_message":null},{"id":"./spec/dog_spec.rb[1:2]","description":"has multiple specs","full_description":"Dog has multiple specs","status":"passed","file_path":"./spec/dog_spec.rb","line_number":10,"run_time":4.8e-05,"pending_message":null},{"id":"./spec/dog_spec.rb[1:3]","description":"accepts more than one example","full_description":"Dog accepts more than one example","status":"passed","file_path":"./spec/dog_spec.rb","line_number":14,"run_time":3.6e-05,"pending_message":null}],"summary":{"duration":0.001252,"example_count":3,"failure_count":0,"pending_count":0,"errors_outside_of_examples_count":0},"summary_line":"3 examples, 0 failures"}