flakie 1.0.0 → 2.0.1

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: 75a64b188fc68b39cab7b3aabff3dfbd63300475f2d0d185a0577b251c91160e
4
- data.tar.gz: 2d1df7b06d7bf31d67b97008cf0439de8bf69ef98735d922973430e4a064126f
3
+ metadata.gz: 9547b581d0d35fd344f0b289bb0c4acd43198fb967d861dd4f934447e5529323
4
+ data.tar.gz: e21954bf1272f817b56761ca247f17057463c53011916d3c10a4d1701fefe1e2
5
5
  SHA512:
6
- metadata.gz: 77220c649e9b013180760cee5306b0abd1db9cf047f1c684e92cd85127e06f11dc77f60c52f76b4f6ecd7ea7f54c285e3876b614f2c374e85fe4924d42ca231f
7
- data.tar.gz: 5e2314d28ae93bfb3123cd0c49491801756178280bb001caef0f4d96691127b2fc1b7c21552a751fd7750030723e670a48eae766b6f7a94f6f8e52179477a25d
6
+ metadata.gz: ab3633180ea705c586dcfc3f30a54807c08a4090b97c26771703fe12c7bc6127e721b3fea921e445d1812d1a8cf090dd2fc10a95bcfe01d529aa177aafec539c
7
+ data.tar.gz: 4d1968ae5fe66c92ebac24f4967a963065010aec5f69e0898478c1c78e4ef7f5ac50fe8bc716dc4b44323b6485f62c5a931d8a9b5f1a4acdb0f5f31e67b5ec3b
data/.rubocop.yml CHANGED
@@ -25,6 +25,9 @@ Metrics/AbcSize:
25
25
  Metrics/MethodLength:
26
26
  Enabled: false
27
27
 
28
+ RSpec/MultipleExpectations:
29
+ Enabled: false
30
+
28
31
  Style/Documentation:
29
32
  Enabled: false
30
33
 
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-3.2.2
1
+ ruby-3.3.0
data/lefthook.yml CHANGED
@@ -10,8 +10,10 @@ pre-commit:
10
10
  rspec:
11
11
  run: bundle exec rspec
12
12
  rubocop:
13
- files: git ls-files **/*.rb
14
- run: bundle exec rubocop --fail-fast {files}
13
+ files: "git diff --name-only --staged"
14
+ glob: "{Gemfile,Rakefile,*.gemspec,*.rb}"
15
+ run: bundle exec rubocop --parallel {files}
15
16
  stree:
16
- files: git ls-files **/*.rb
17
+ files: "git diff --name-only --staged"
18
+ glob: "{Rakefile,*.gemspec,*.rb}"
17
19
  run: bundle exec stree check {files}
@@ -3,26 +3,11 @@
3
3
  module Flakie
4
4
  module CLI
5
5
  Options =
6
- Struct.new(:count, :env, :format, :output, :help, :version) do
7
- def self.default = new(count: 5, env: {}, format: :tictactoe, output: $stdout, help: false, version: false)
6
+ Struct.new(:count, :format, :output, :help, :version) do
7
+ def self.default = new(count: 5, format: :tictactoe, output: $stdout, help: false, version: false)
8
8
  def self.from(args) = default.tap { |options| Parser.parse!(args, into: options) }
9
9
 
10
- def []=(key, value)
11
- if key == :env
12
- add_env(value)
13
- else
14
- super
15
- end
16
- end
17
-
18
- def add_env(raw)
19
- name, value = raw.split("=")
20
- CLI.exit_with_error("Bad env variable format: #{raw}") if name.nil? || value.nil?
21
-
22
- env[name] = value
23
- end
24
-
25
- def formatter = Formatters::ALL.fetch(format)
10
+ def reporter = Reporters::ALL.fetch(format)
26
11
 
27
12
  def help? = help
28
13
  def version? = version
@@ -4,22 +4,20 @@ module Flakie
4
4
  module CLI
5
5
  Parser =
6
6
  OptionParser.new do |opts|
7
- opts.banner = "USAGE: #{PROGRAM_NAME} [OPTIONS] COMMAND"
7
+ opts.banner = "USAGE: #{NAME} [OPTIONS] COMMAND"
8
8
  opts.separator ""
9
9
 
10
- opts.version = "#{PROGRAM_NAME} #{VERSION}"
10
+ opts.version = "#{NAME} #{VERSION}"
11
11
 
12
12
  opts.separator "OPTIONS:"
13
13
  opts.on("-n", "--count COUNT", Integer, "Number of tries (default: #{Options.default.count})")
14
14
 
15
15
  opts.on("-f", "--format FORMATTER", "Output format. See FORMATTERS section below.") do |choice|
16
- Formatters::ALL.include?(choice.to_sym) ? choice.to_sym : CLI.exit_with_error("Invalid format: #{choice}")
16
+ Reporters::ALL.include?(choice.to_sym) ? choice.to_sym : CLI.fail("Invalid format: #{choice}")
17
17
  end
18
18
 
19
19
  opts.on("-o", "--output FILE", "File to output result. Defaults to STDOUT.") { |path| File.open(path, "w") }
20
20
 
21
- opts.on("-e", "--env KEY_VALUE", "Additional environment variables to set. Can be called multiple times.")
22
-
23
21
  opts.on("-v", "--version", "Show the version")
24
22
  opts.on("-h", "--help", "Show this help message")
25
23
  opts.separator ""
@@ -29,9 +27,11 @@ module Flakie
29
27
  opts.separator ""
30
28
 
31
29
  opts.separator "EXAMPLES:"
32
- opts.separator " #{PROGRAM_NAME} rails t test/foo_test.rb"
33
- opts.separator " #{PROGRAM_NAME} -n10 rails t test/foo_test.rb"
34
- opts.separator " #{PROGRAM_NAME} -count=10 rails t test/foo_test.rb"
30
+ opts.separator " #{NAME} rails t test/foo_test.rb"
31
+ opts.separator " #{NAME} -n10 rails t test/foo_test.rb"
32
+ opts.separator " #{NAME} --count=10 rails t test/foo_test.rb"
33
+ opts.separator " #{NAME} --format=tictactoe rails t test/foo_test.rb"
34
+ opts.separator " #{NAME} -f tictactoe -o result.txt rails t test/foo_test.rb"
35
35
  end
36
36
  end
37
37
  end
@@ -15,18 +15,19 @@ module Flakie
15
15
  in version: true
16
16
  Parser.version.display
17
17
  else
18
- Engine.new(
19
- args.join(" "),
20
- count: options.count,
21
- env: options.env,
22
- reporter: options.formatter.new(options.output),
23
- ).run
18
+ Engine.new(command, count: options.count, reporter: options.reporter.new(options.output)).run
24
19
  end
25
20
  end
26
21
 
27
22
  private
28
23
 
29
24
  attr_reader :options, :args
25
+
26
+ def command
27
+ CLI.fail("Command is a required argument") if args.empty?
28
+
29
+ args.join(" ")
30
+ end
30
31
  end
31
32
  end
32
33
  end
data/lib/flakie/cli.rb CHANGED
@@ -2,14 +2,20 @@
2
2
 
3
3
  module Flakie
4
4
  module CLI
5
- PROGRAM_NAME = "flakie"
5
+ extend self
6
6
 
7
- def self.run(args)
7
+ def run(args)
8
8
  Runner.new(args).call
9
9
  end
10
10
 
11
- def self.exit_with_error(msg)
12
- warn(msg)
11
+ def fail(msg, show_help: true)
12
+ warn("error: #{msg}")
13
+
14
+ if show_help
15
+ warn("")
16
+ warn(Parser.help)
17
+ end
18
+
13
19
  exit 1
14
20
  end
15
21
  end
data/lib/flakie/engine.rb CHANGED
@@ -2,18 +2,9 @@
2
2
 
3
3
  module Flakie
4
4
  class Engine
5
- Run =
6
- Data.define(:status, :duration, :number) do
7
- def success? = status == true
8
- def failure? = status == true
9
- end
10
-
11
- Report = Data.define(:runs) { def last_run = runs.last }
12
-
13
- def initialize(command, count:, env:, reporter:)
5
+ def initialize(command, count:, reporter:)
14
6
  @command = command
15
7
  @count = count
16
- @env = env
17
8
  @reporter = reporter
18
9
  @report = Report.new([])
19
10
  end
@@ -23,7 +14,7 @@ module Flakie
23
14
 
24
15
  count.times do |index|
25
16
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
26
- system(env, command, out: File::NULL, err: File::NULL)
17
+ system(command, out: File::NULL, err: File::NULL)
27
18
  end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
28
19
  duration = (end_time - start_time).round
29
20
  report.runs.append Run.new(status: $?.success?, duration: duration, number: index + 1)
@@ -35,6 +26,6 @@ module Flakie
35
26
 
36
27
  private
37
28
 
38
- attr_reader :command, :count, :env, :reporter, :report
29
+ attr_reader :command, :count, :reporter, :report
39
30
  end
40
31
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flakie
4
+ Report =
5
+ Data.define(:runs) do
6
+ def last_run = runs.last
7
+ def empty? = runs.empty?
8
+ end
9
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flakie
4
- module Formatters
4
+ module Reporters
5
5
  class Base
6
6
  def initialize(output)
7
7
  @output = output
@@ -16,7 +16,7 @@ module Flakie
16
16
  end
17
17
 
18
18
  def report(_report)
19
- raise NotImplementedError, "Base formatter class must implement this method"
19
+ raise NotImplementedError, "Base class must implement this method"
20
20
  end
21
21
 
22
22
  private
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flakie
4
- module Formatters
4
+ module Reporters
5
5
  class TicTacToe < Base
6
6
  CHARACTER_SUCCESS = "o"
7
7
  CHARACTER_FAILURE = "x"
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flakie
4
- module Formatters
4
+ module Reporters
5
5
  ALL = { tictactoe: TicTacToe }.freeze
6
6
  end
7
7
  end
data/lib/flakie/run.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flakie
4
+ Run =
5
+ Data.define(:status, :duration, :number) do
6
+ def success? = status == true
7
+ def failure? = !success?
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flakie
4
- VERSION = "1.0.0"
4
+ VERSION = "2.0.1"
5
5
  end
data/lib/flakie.rb CHANGED
@@ -9,4 +9,5 @@ Zeitwerk::Loader.for_gem.tap do |loader|
9
9
  end
10
10
 
11
11
  module Flakie
12
+ NAME = "flakie"
12
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flakie
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Khurram Raza
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-11 00:00:00.000000000 Z
11
+ date: 2024-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
@@ -48,9 +48,11 @@ files:
48
48
  - lib/flakie/cli/parser.rb
49
49
  - lib/flakie/cli/runner.rb
50
50
  - lib/flakie/engine.rb
51
- - lib/flakie/formatters.rb
52
- - lib/flakie/formatters/base.rb
53
- - lib/flakie/formatters/tic_tac_toe.rb
51
+ - lib/flakie/report.rb
52
+ - lib/flakie/reporters.rb
53
+ - lib/flakie/reporters/base.rb
54
+ - lib/flakie/reporters/tic_tac_toe.rb
55
+ - lib/flakie/run.rb
54
56
  - lib/flakie/version.rb
55
57
  homepage: https://github.com/ikhurramraza/flakie.git
56
58
  licenses:
@@ -74,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
76
  - !ruby/object:Gem::Version
75
77
  version: '0'
76
78
  requirements: []
77
- rubygems_version: 3.4.10
79
+ rubygems_version: 3.5.3
78
80
  signing_key:
79
81
  specification_version: 4
80
82
  summary: Test flakyness of commands