sleet 0.3.8 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6185cafbb39081fc597d39b44cbbcb75a6d7905cb8dad73d828c4e6df3caf42d
4
- data.tar.gz: 0cb2f783a6d99ad920797ca94421f6384b28bc2e2f56cb96b8d6ce262f8d640f
3
+ metadata.gz: b394aa63feaea3c3def2bd2ab1fcedc94311c8a0cd1bca488d5e89106110a07f
4
+ data.tar.gz: 9f450c4b7efa54b1d58abd92bb54e265f012fc6ca7830d7d2f9f20896b4fb07c
5
5
  SHA512:
6
- metadata.gz: 6bfaae166533c1ec74bb88722bef09444fbff5a7aeb6132bba0fb208f1d74920d190f10c1ab86529a8aeaef5b30e6acfd4424eff9de85da3a3b0b0ef09564c75
7
- data.tar.gz: 30585dcdb08d6612c1fdc536d79dd2cf64774c8802e358b03522fd57371b1940931a761ea89c1cf0dd32c973336c1807217cde46f985c23ad96b2ee352045c50
6
+ metadata.gz: 7a9e20fa664683bc37695cb3b57191f3baa111e03f9c89febf073af2a7fcbbcb09a5050a10bb64d82d8aae7b9cd02bb4503a89aefae43bf00b60254a16bd4c98
7
+ data.tar.gz: b9699434ad49685fc96c506075f7b855e4d9f5e7bca3ce15511afb28a0bb53d9acf83ff9b3360dc80e0b044c76329ecd7dcd587d41425b6eecf2ee782223bc66
data/.circleci/config.yml CHANGED
@@ -19,7 +19,7 @@ jobs:
19
19
  - gem-cache-{{ checksum "ruby-version.txt" }}-
20
20
  - gem-cache-
21
21
  # Install
22
- - run: bundle check || sudo apt-get install cmake && bundle install --path vendor/bundle
22
+ - run: bundle check --path vendor/bundle || sudo apt-get install cmake && bundle install --path vendor/bundle
23
23
  # Store Cache
24
24
  - save_cache:
25
25
  key: gem-cache-{{ checksum "ruby-version.txt" }}-{{ checksum "sleet.gemspec" }}-{{ checksum "date-cache-key.txt" }}
data/.rubocop.yml CHANGED
@@ -1,3 +1,5 @@
1
+ require: rubocop-rspec
2
+
1
3
  inherit_from: .rubocop_todo.yml
2
4
 
3
5
  AllCops:
@@ -7,8 +9,6 @@ AllCops:
7
9
 
8
10
  Metrics/LineLength:
9
11
  Max: 120
10
- Exclude:
11
- - 'spec/**/*'
12
12
 
13
13
  Metrics/ClassLength:
14
14
  Exclude:
@@ -30,3 +30,13 @@ Style/StringLiterals:
30
30
  SupportedStyles:
31
31
  - single_quotes
32
32
  - double_quotes
33
+
34
+ RSpec/MultipleExpectations:
35
+ Enabled: false
36
+
37
+ RSpec/DescribeClass:
38
+ Exclude:
39
+ - 'spec/cli/**/*.rb'
40
+
41
+ RSpec/ExampleLength:
42
+ Max: 10
data/.rubocop_todo.yml CHANGED
@@ -1,41 +1,13 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2018-01-16 22:17:20 -0500 using RuboCop version 0.52.1.
3
+ # on 2018-03-04 17:57:32 -0500 using RuboCop version 0.52.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
9
  # Offense count: 1
10
- # Cop supports --auto-correct.
11
- # Configuration parameters: AllowAdjacentOneLineDefs, NumberOfEmptyLines.
12
- Layout/EmptyLineBetweenDefs:
10
+ # Configuration parameters: Max.
11
+ RSpec/NestedGroups:
13
12
  Exclude:
14
- - 'lib/sleet/fetcher.rb'
15
-
16
- # Offense count: 1
17
- # Cop supports --auto-correct.
18
- Layout/EmptyLines:
19
- Exclude:
20
- - 'lib/sleet/fetcher.rb'
21
-
22
- # Offense count: 1
23
- # Configuration parameters: CountComments.
24
- Metrics/ClassLength:
25
- Max: 107
26
-
27
- # Offense count: 1
28
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
29
- # URISchemes: http, https
30
- Metrics/LineLength:
31
- Max: 128
32
-
33
- # Offense count: 2
34
- # Configuration parameters: CountComments.
35
- Metrics/MethodLength:
36
- Max: 15
37
-
38
- # Offense count: 1
39
- # Configuration parameters: CountKeywordArgs.
40
- Metrics/ParameterLists:
41
- Max: 7
13
+ - 'spec/cli/fetch_spec.rb'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.3.9](https://github.com/coreyja/sleet/tree/v0.3.9) (2018-03-04)
4
+ [Full Changelog](https://github.com/coreyja/sleet/compare/v0.3.8...v0.3.9)
5
+
6
+ **Closed issues:**
7
+
8
+ - There are No Specs [\#6](https://github.com/coreyja/sleet/issues/6)
9
+
10
+ **Merged pull requests:**
11
+
12
+ - Refactor [\#18](https://github.com/coreyja/sleet/pull/18) ([coreyja](https://github.com/coreyja))
13
+ - Update rake requirement to ~\> 12.3 [\#17](https://github.com/coreyja/sleet/pull/17) ([dependabot[bot]](https://github.com/apps/dependabot))
14
+ - Update faraday requirement to \>= 0.13.1, \< 0.15.0 [\#16](https://github.com/coreyja/sleet/pull/16) ([dependabot[bot]](https://github.com/apps/dependabot))
15
+
3
16
  ## [v0.3.8](https://github.com/coreyja/sleet/tree/v0.3.8) (2018-02-25)
4
17
  [Full Changelog](https://github.com/coreyja/sleet/compare/v0.3.7...v0.3.8)
5
18
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sleet
4
- class CircleCiBranch
4
+ class Branch
5
5
  def initialize(github_user:, github_repo:, branch:)
6
6
  @github_user = github_user
7
7
  @github_repo = github_repo
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sleet
4
- class CircleCiBuild
4
+ class Build
5
5
  attr_reader :build_num
6
6
 
7
7
  def initialize(github_user:, github_repo:, build_num:)
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sleet
4
+ class BuildSelector
5
+ def initialize(repo:, job_name:)
6
+ @repo = repo
7
+ @job_name = job_name
8
+ end
9
+
10
+ def build
11
+ @_build ||= repo.build_for(chosen_build_num)
12
+ end
13
+
14
+ def validate!
15
+ must_find_a_build_with_artifacts!
16
+ chosen_build_must_have_input_file!
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :repo, :job_name
22
+
23
+ def branch
24
+ repo.branch
25
+ end
26
+
27
+ def chosen_build_num
28
+ chosen_build_json['build_num']
29
+ end
30
+
31
+ def chosen_build_json
32
+ branch.builds_with_artificats.find do |b|
33
+ b.fetch('workflows', nil)&.fetch('job_name', nil) == job_name
34
+ end
35
+ end
36
+
37
+ def must_find_a_build_with_artifacts!
38
+ !chosen_build_json.nil? ||
39
+ raise(Error, "No builds with artifcats found#{" for job name [#{job_name}]" if job_name}")
40
+ end
41
+
42
+ def chosen_build_must_have_input_file!
43
+ build.artifacts.any? ||
44
+ raise(Error, "No Rspec example file found in the latest build (##{chosen_build_num}) with artifacts")
45
+ end
46
+ end
47
+ end
@@ -14,6 +14,10 @@ module Sleet
14
14
  Faraday.get(url, 'circle-token' => token)
15
15
  end
16
16
 
17
+ def reset!
18
+ @_token = nil
19
+ end
20
+
17
21
  def self.get(url)
18
22
  instance.get(url)
19
23
  end
data/lib/sleet/cli.rb CHANGED
@@ -23,18 +23,14 @@ module Sleet
23
23
  option :workflows, type: :hash, aliases: [:w], desc: <<~DESC
24
24
  To use Sleet with CircleCI Workflows you need to tell Sleet which build(s) to look in, and where each output should be saved. The input is a hash, where the key is the build name and the value is the output_file for that build. Sleet supports saving the artifacts to multiple builds, meaning it can support a mono-repo setup.
25
25
  DESC
26
+ option :print_config, type: :boolean, default: false
26
27
  def fetch
27
- must_be_on_branch!
28
- must_have_an_upstream_branch!
29
- upstream_remote_must_be_github!
30
- if options[:workflows]
31
- workflow_fetch
32
- else
33
- single_fetch
28
+ sleet_config = Sleet::Config.new(cli_hash: options, dir: Dir.pwd)
29
+ if options[:print_config]
30
+ sleet_config.print!
31
+ exit
34
32
  end
35
- rescue Sleet::Error => e
36
- error(e.message)
37
- exit 1
33
+ Sleet::FetchCommand.new(sleet_config).do!
38
34
  end
39
35
 
40
36
  desc 'version', 'Display the version'
@@ -42,86 +38,9 @@ module Sleet
42
38
  puts "Sleet v#{Sleet::VERSION}"
43
39
  end
44
40
 
45
- private
46
-
47
- def single_fetch
48
- Sleet::Fetcher.new(
49
- base_fetcher_params.merge(
50
- output_filename: options.fetch(:output_file, '.rspec_example_statuses')
51
- )
52
- ).do!
53
- rescue Sleet::Error => e
54
- error(e.message)
55
- exit 1
56
- end
57
-
58
- def workflow_fetch
59
- failed = false
60
- options[:workflows].each do |job_name, output_filename|
61
- begin
62
- Sleet::Fetcher.new(
63
- base_fetcher_params.merge(
64
- output_filename: output_filename,
65
- job_name: job_name
66
- )
67
- ).do!
68
- rescue Sleet::Error => e
69
- failed = true
70
- error(e.message)
71
- end
72
- end
73
- exit 1 if failed
74
- end
75
-
76
- def circle_ci_branch
77
- @_circle_ci_branch ||= Sleet::CircleCiBranch.new(
78
- github_user: repo.github_user,
79
- github_repo: repo.github_repo,
80
- branch: repo.remote_branch
81
- )
82
- end
83
-
84
- def must_be_on_branch!
85
- repo.on_branch? ||
86
- error('Not on a branch')
87
- end
88
-
89
- def must_have_an_upstream_branch!
90
- repo.remote? ||
91
- error("No upstream branch set for the current branch of #{repo.current_branch_name}")
92
- end
93
-
94
- def upstream_remote_must_be_github!
95
- repo.github? ||
96
- error('Upstream remote is not GitHub')
97
- end
98
-
99
- def repo
100
- @_repo ||= Sleet::Repo.from_dir(options.fetch(:source_dir, default_dir))
101
- end
102
-
103
- def base_fetcher_params
104
- {
105
- source_dir: options.fetch(:source_dir, default_dir),
106
- circle_ci_branch: circle_ci_branch,
107
- input_filename: options.fetch(:input_file, '.rspec_example_statuses'),
108
- github_user: repo.github_user,
109
- github_repo: repo.github_repo
110
- }
111
- end
112
-
113
- def error(message)
114
- puts "ERROR: #{message}".red
115
- end
116
-
117
- def default_dir
118
- Rugged::Repository.discover(Dir.pwd).path + '..'
119
- end
120
-
121
- def options
122
- original_options = super
123
- defaults = Sleet::OptionDefaults.new(Dir.pwd).defaults
124
- Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
41
+ desc 'config', 'Print the config'
42
+ def config
43
+ Sleet::Config.new(cli_hash: options, dir: Dir.pwd).print!
125
44
  end
126
45
  end
127
46
  end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sleet
4
+ class Config
5
+ OPTION_FILENAME = '.sleet.yml'
6
+ ConfigOption = Struct.new(:value, :source)
7
+
8
+ def initialize(dir:, cli_hash: {})
9
+ @dir = dir
10
+ @cli_hash = cli_hash
11
+ end
12
+
13
+ def source_dir
14
+ options_hash[:source_dir]
15
+ end
16
+
17
+ def input_file
18
+ options_hash[:input_file]
19
+ end
20
+
21
+ def output_file
22
+ options_hash[:output_file]
23
+ end
24
+
25
+ def workflows
26
+ options_hash[:workflows]
27
+ end
28
+
29
+ def print!
30
+ puts Terminal::Table.new headings: %w[Option Value Source], rows: table_rows
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :cli_hash, :dir
36
+
37
+ def options
38
+ @_options ||= default_options.merge(file_options).merge(cli_options)
39
+ end
40
+
41
+ def options_hash
42
+ @_options_hash ||= Thor::CoreExt::HashWithIndifferentAccess.new(options.map { |k, o| [k, o.value] }.to_h)
43
+ end
44
+
45
+ def table_rows
46
+ options.map do |key, option|
47
+ if key.to_sym == :workflows
48
+ [key, Terminal::Table.new(headings: ['Job Name', 'Output File'], rows: option.value.to_a), option.source]
49
+ else
50
+ [key, option.value, option.source]
51
+ end
52
+ end
53
+ end
54
+
55
+ def cli_options
56
+ build_option_hash('CLI', cli_hash)
57
+ end
58
+
59
+ def file_options
60
+ file_hashes.map do |file, options|
61
+ build_option_hash(file, options)
62
+ end.reduce({}, :merge)
63
+ end
64
+
65
+ def file_hashes
66
+ files.map { |f| [f, ::YAML.load_file(f) || {}] }
67
+ end
68
+
69
+ def files
70
+ paths_to_search.select { |f| File.file?(f) }
71
+ end
72
+
73
+ def paths_to_search
74
+ directories.each_index.map do |i|
75
+ (directories[0..i] + [OPTION_FILENAME]).join('/')
76
+ end
77
+ end
78
+
79
+ def directories
80
+ @_directories ||= dir.split('/')
81
+ end
82
+
83
+ def default_options
84
+ build_option_hash 'default', default_hash
85
+ end
86
+
87
+ def default_hash
88
+ {
89
+ 'source_dir' => File.expand_path(default_dir),
90
+ 'input_file' => '.rspec_example_statuses',
91
+ 'output_file' => '.rspec_example_statuses'
92
+ }
93
+ end
94
+
95
+ def default_dir
96
+ Rugged::Repository.discover(Dir.pwd).path + '..'
97
+ rescue Rugged::RepositoryError
98
+ '.'
99
+ end
100
+
101
+ def build_option_hash(source, options)
102
+ options.map do |key, value|
103
+ [key, ConfigOption.new(value, source)]
104
+ end.to_h
105
+ end
106
+ end
107
+ end
data/lib/sleet/error.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sleet
4
- class Error < ::StandardError
4
+ class Error < ::Thor::Error
5
+ def message
6
+ "ERROR: #{super}".red
7
+ end
5
8
  end
6
9
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sleet
4
+ class FetchCommand
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ def do!
10
+ repo.validate!
11
+ error_messages = []
12
+ fetchers.map do |fetcher|
13
+ begin
14
+ fetcher.do!
15
+ rescue Sleet::Error => e
16
+ error_messages << e.message
17
+ end
18
+ end
19
+ raise Thor::Error, error_messages.join("\n") unless error_messages.empty?
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :config
25
+
26
+ def fetchers
27
+ job_name_to_output_files.map do |job_name, output_filename|
28
+ Sleet::JobFetcher.new(
29
+ source_dir: config.source_dir,
30
+ input_filename: config.input_file,
31
+ output_filename: output_filename,
32
+ repo: repo,
33
+ job_name: job_name
34
+ )
35
+ end
36
+ end
37
+
38
+ def job_name_to_output_files
39
+ config.workflows || { nil => config.output_file }
40
+ end
41
+
42
+ def repo
43
+ @_repo ||= Sleet::Repo.from_dir(config.source_dir)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sleet
4
+ class JobFetcher
5
+ def initialize(source_dir:, input_filename:, output_filename:, job_name:, repo:)
6
+ @source_dir = source_dir
7
+ @input_filename = input_filename
8
+ @output_filename = output_filename
9
+ @job_name = job_name
10
+ @repo = repo
11
+ end
12
+
13
+ def do!
14
+ validate!
15
+ create_output_file!
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :input_filename, :output_filename, :job_name, :source_dir, :repo
21
+
22
+ def validate!
23
+ build_selector.validate!
24
+ end
25
+
26
+ def create_output_file!
27
+ File.write(File.join(source_dir, output_filename), combined_file)
28
+ puts "Created file (#{output_filename}) from build (##{build.build_num})".green
29
+ end
30
+
31
+ def combined_file
32
+ Sleet::RspecFileMerger.new(build_persistance_artifacts).output
33
+ end
34
+
35
+ def build_persistance_artifacts
36
+ @_build_persistance_artifacts ||= Sleet::ArtifactDownloader.new(
37
+ file_name: input_filename,
38
+ artifacts: build.artifacts
39
+ ).files
40
+ end
41
+
42
+ def branch
43
+ repo.branch
44
+ end
45
+
46
+ def build
47
+ build_selector.build
48
+ end
49
+
50
+ def build_selector
51
+ @_build_selector ||= Sleet::BuildSelector.new(job_name: job_name, repo: repo)
52
+ end
53
+ end
54
+ end
data/lib/sleet/repo.rb CHANGED
@@ -14,18 +14,32 @@ module Sleet
14
14
  @repo = repo
15
15
  end
16
16
 
17
- def remote?
18
- !current_branch.remote.nil?
17
+ def validate!
18
+ must_be_on_branch!
19
+ must_have_an_upstream_branch!
20
+ upstream_remote_must_be_github!
19
21
  end
20
22
 
21
- def github?
22
- !github_match.nil?
23
+ def branch
24
+ @_branch ||= Sleet::Branch.new(
25
+ github_user: github_user,
26
+ github_repo: github_repo,
27
+ branch: remote_branch
28
+ )
23
29
  end
24
30
 
25
- def on_branch?
26
- !current_branch.nil?
31
+ def build_for(build_num)
32
+ Sleet::Build.new(
33
+ github_user: github_user,
34
+ github_repo: github_repo,
35
+ build_num: build_num
36
+ )
27
37
  end
28
38
 
39
+ private
40
+
41
+ attr_reader :repo
42
+
29
43
  def remote_branch
30
44
  current_branch.upstream.name.match(REMOTE_BRANCH_REGEX)[2]
31
45
  end
@@ -42,10 +56,6 @@ module Sleet
42
56
  repo.head.name.sub(CURRENT_BRANCH_REGEX, '')
43
57
  end
44
58
 
45
- private
46
-
47
- attr_reader :repo
48
-
49
59
  def current_branch
50
60
  repo.branches[current_branch_name]
51
61
  end
@@ -53,5 +63,20 @@ module Sleet
53
63
  def github_match
54
64
  @_github_match ||= GITHUB_MATCH_REGEX.match(current_branch.remote.url)
55
65
  end
66
+
67
+ def must_be_on_branch!
68
+ !current_branch.nil? ||
69
+ raise(Error, 'Not on a branch')
70
+ end
71
+
72
+ def must_have_an_upstream_branch!
73
+ !current_branch.remote.nil? ||
74
+ raise(Error, "No upstream branch set for the current branch of #{repo.current_branch_name}")
75
+ end
76
+
77
+ def upstream_remote_must_be_github!
78
+ !github_match.nil? ||
79
+ raise(Error, 'Upstream remote is not GitHub')
80
+ end
56
81
  end
57
82
  end
data/lib/sleet/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sleet
4
- VERSION = '0.3.8'
4
+ VERSION = '0.3.9'
5
5
  end
data/lib/sleet.rb CHANGED
@@ -2,24 +2,29 @@
2
2
 
3
3
  require 'colorize'
4
4
  require 'faraday'
5
+ require 'forwardable'
5
6
  require 'json'
6
7
  require 'rspec'
7
8
  require 'rugged'
9
+ require 'terminal-table'
8
10
  require 'thor'
9
11
  require 'yaml'
10
12
 
11
13
  # This is to load the classes that are defined in the same file as this one
14
+ # We are most definitely relying on Private API here
12
15
  begin
13
16
  RSpec::Core::ExampleStatusPersister
14
17
  end
15
18
 
16
19
  require 'sleet/artifact_downloader'
20
+ require 'sleet/branch'
21
+ require 'sleet/build'
22
+ require 'sleet/build_selector'
17
23
  require 'sleet/circle_ci'
18
- require 'sleet/circle_ci_branch'
19
- require 'sleet/circle_ci_build'
24
+ require 'sleet/config'
20
25
  require 'sleet/error'
21
- require 'sleet/fetcher'
22
- require 'sleet/option_defaults'
26
+ require 'sleet/fetch_command'
27
+ require 'sleet/job_fetcher'
23
28
  require 'sleet/repo'
24
29
  require 'sleet/rspec_file_merger'
25
30
  require 'sleet/version'
data/sleet.gemspec CHANGED
@@ -27,14 +27,16 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ['lib']
28
28
 
29
29
  spec.add_dependency 'colorize', '~> 0.8.1'
30
- spec.add_dependency 'faraday', '~> 0.13.1'
30
+ spec.add_dependency 'faraday', '>= 0.13.1', '< 0.15.0'
31
31
  spec.add_dependency 'rspec', '~> 3.0'
32
32
  spec.add_dependency 'rugged', '~> 0.26.0'
33
+ spec.add_dependency 'terminal-table', '~> 1.8'
33
34
  spec.add_dependency 'thor', '~> 0.20.0'
34
35
 
35
36
  spec.add_development_dependency 'bundler', '~> 1.13'
36
37
  spec.add_development_dependency 'pry', '~> 0.10'
37
- spec.add_development_dependency 'rake', '~> 10.0'
38
+ spec.add_development_dependency 'rake', '~> 12.3'
38
39
  spec.add_development_dependency 'rubocop', '~> 0.52.1'
40
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.22'
39
41
  spec.add_development_dependency 'webmock', '~> 3.3.0'
40
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sleet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Corey Alexander
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-25 00:00:00.000000000 Z
11
+ date: 2018-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -28,16 +28,22 @@ dependencies:
28
28
  name: faraday
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.13.1
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: 0.15.0
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: 0.13.1
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.15.0
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: rspec
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +72,20 @@ dependencies:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
74
  version: 0.26.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: terminal-table
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.8'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.8'
69
89
  - !ruby/object:Gem::Dependency
70
90
  name: thor
71
91
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +134,14 @@ dependencies:
114
134
  requirements:
115
135
  - - "~>"
116
136
  - !ruby/object:Gem::Version
117
- version: '10.0'
137
+ version: '12.3'
118
138
  type: :development
119
139
  prerelease: false
120
140
  version_requirements: !ruby/object:Gem::Requirement
121
141
  requirements:
122
142
  - - "~>"
123
143
  - !ruby/object:Gem::Version
124
- version: '10.0'
144
+ version: '12.3'
125
145
  - !ruby/object:Gem::Dependency
126
146
  name: rubocop
127
147
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +156,20 @@ dependencies:
136
156
  - - "~>"
137
157
  - !ruby/object:Gem::Version
138
158
  version: 0.52.1
159
+ - !ruby/object:Gem::Dependency
160
+ name: rubocop-rspec
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '1.22'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1.22'
139
173
  - !ruby/object:Gem::Dependency
140
174
  name: webmock
141
175
  requirement: !ruby/object:Gem::Requirement
@@ -178,13 +212,15 @@ files:
178
212
  - exe/sleet
179
213
  - lib/sleet.rb
180
214
  - lib/sleet/artifact_downloader.rb
215
+ - lib/sleet/branch.rb
216
+ - lib/sleet/build.rb
217
+ - lib/sleet/build_selector.rb
181
218
  - lib/sleet/circle_ci.rb
182
- - lib/sleet/circle_ci_branch.rb
183
- - lib/sleet/circle_ci_build.rb
184
219
  - lib/sleet/cli.rb
220
+ - lib/sleet/config.rb
185
221
  - lib/sleet/error.rb
186
- - lib/sleet/fetcher.rb
187
- - lib/sleet/option_defaults.rb
222
+ - lib/sleet/fetch_command.rb
223
+ - lib/sleet/job_fetcher.rb
188
224
  - lib/sleet/repo.rb
189
225
  - lib/sleet/rspec_file_merger.rb
190
226
  - lib/sleet/version.rb
data/lib/sleet/fetcher.rb DELETED
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sleet
4
- class Fetcher
5
- class Error < ::Sleet::Error; end
6
-
7
- def initialize(source_dir:, circle_ci_branch:, input_filename:, output_filename:, github_user:, github_repo:, job_name: nil) # rubocop:disable Metrics/LineLength
8
- @source_dir = source_dir
9
- @circle_ci_branch = circle_ci_branch
10
- @input_filename = input_filename
11
- @output_filename = output_filename
12
- @job_name = job_name
13
- @github_user = github_user
14
- @github_repo = github_repo
15
- end
16
-
17
- def do!
18
- validate!
19
- create_output_file!
20
- end
21
-
22
- def validate!
23
- must_find_a_build_with_artifacts!
24
- chosen_build_must_have_input_file!
25
- true
26
- end
27
-
28
- def create_output_file!
29
- Dir.chdir(source_dir) do
30
- File.write(output_filename, combined_file)
31
- end
32
- puts "Created file (#{output_filename}) from build (##{circle_ci_build.build_num})".green
33
- end
34
-
35
- private
36
-
37
- attr_reader :input_filename, :output_filename, :job_name, :circle_ci_branch, :github_user, :github_repo, :source_dir
38
-
39
- def error(msg)
40
- raise Error, msg
41
- end
42
-
43
- def combined_file
44
- @_combined_file ||= Sleet::RspecFileMerger.new(build_persistance_artifacts).output
45
- end
46
-
47
- def build_persistance_artifacts
48
- @_build_persistance_artifacts ||= Sleet::ArtifactDownloader.new(
49
- file_name: input_filename,
50
- artifacts: circle_ci_build.artifacts
51
- ).files
52
- end
53
-
54
- def circle_ci_build
55
- @_circle_ci_build ||= Sleet::CircleCiBuild.new(
56
- github_user: github_user,
57
- github_repo: github_repo,
58
- build_num: chosen_build_json['build_num']
59
- )
60
- end
61
-
62
- def chosen_build_json
63
- if job_name
64
- circle_ci_branch.builds_with_artificats.find { |b| b.fetch('workflows', {})&.fetch('job_name', {}) == job_name }
65
- else
66
- circle_ci_branch.builds_with_artificats.first
67
- end
68
- end
69
-
70
-
71
- def must_find_a_build_with_artifacts!
72
- !chosen_build_json.nil? ||
73
- error("No builds with artifcats found #{"for job name [#{job_name}]" if job_name}")
74
- end
75
-
76
- def chosen_build_must_have_input_file!
77
- circle_ci_build.artifacts.any? ||
78
- error("No Rspec example file found in the latest build (##{circle_ci_build.build_num}) with artifacts")
79
- end
80
- end
81
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sleet
4
- class OptionDefaults
5
- OPTION_FILENAME = '.sleet.yml'
6
-
7
- def initialize(dir)
8
- @dir = dir
9
- end
10
-
11
- def defaults
12
- defaults_hashes.reduce({}, :merge)
13
- end
14
-
15
- private
16
-
17
- attr_reader :dir
18
-
19
- def defaults_hashes
20
- files.map { |f| ::YAML.load_file(f) || {} }
21
- end
22
-
23
- def files
24
- files_to_search.select { |f| File.file?(f) }
25
- end
26
-
27
- def files_to_search
28
- x.each_index.map do |i|
29
- (x[0..i] + [OPTION_FILENAME]).join('/')
30
- end
31
- end
32
-
33
- def x
34
- @_x ||= dir.split('/')
35
- end
36
- end
37
- end