polishgeeks-dev-tools 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +3 -0
  4. data/Gemfile.lock +27 -30
  5. data/Rakefile +1 -1
  6. data/lib/polishgeeks-dev-tools.rb +26 -20
  7. data/lib/polishgeeks/dev-tools/{command → commands}/allowed_extensions.rb +1 -1
  8. data/lib/polishgeeks/dev-tools/{command → commands}/base.rb +15 -25
  9. data/lib/polishgeeks/dev-tools/{command → commands}/brakeman.rb +4 -2
  10. data/lib/polishgeeks/dev-tools/{command → commands}/empty_method.rb +1 -1
  11. data/lib/polishgeeks/dev-tools/{command → commands}/empty_method/file_parser.rb +1 -1
  12. data/lib/polishgeeks/dev-tools/{command → commands}/empty_method/string_refinements.rb +1 -1
  13. data/lib/polishgeeks/dev-tools/{command → commands}/examples_comparator.rb +1 -1
  14. data/lib/polishgeeks/dev-tools/{command → commands}/expires_in.rb +1 -1
  15. data/lib/polishgeeks/dev-tools/{command → commands}/final_blank_line.rb +1 -1
  16. data/lib/polishgeeks/dev-tools/{command → commands}/haml_lint.rb +1 -1
  17. data/lib/polishgeeks/dev-tools/{command → commands}/readme.rb +1 -1
  18. data/lib/polishgeeks/dev-tools/{command → commands}/rspec.rb +1 -1
  19. data/lib/polishgeeks/dev-tools/{command → commands}/rspec_files_names.rb +1 -1
  20. data/lib/polishgeeks/dev-tools/{command → commands}/rspec_files_structure.rb +1 -1
  21. data/lib/polishgeeks/dev-tools/{command → commands}/rubocop.rb +1 -1
  22. data/lib/polishgeeks/dev-tools/{command → commands}/rubycritic.rb +1 -1
  23. data/lib/polishgeeks/dev-tools/{command/coverage.rb → commands/simplecov.rb} +22 -9
  24. data/lib/polishgeeks/dev-tools/{command → commands}/tasks_files_names.rb +1 -1
  25. data/lib/polishgeeks/dev-tools/{command → commands}/yard.rb +1 -1
  26. data/lib/polishgeeks/dev-tools/{command → commands}/yml_parser.rb +1 -1
  27. data/lib/polishgeeks/dev-tools/config.rb +0 -16
  28. data/lib/polishgeeks/dev-tools/errors.rb +25 -0
  29. data/lib/polishgeeks/dev-tools/logger.rb +7 -12
  30. data/lib/polishgeeks/dev-tools/runner.rb +2 -1
  31. data/lib/polishgeeks/dev-tools/validators/base.rb +26 -0
  32. data/lib/polishgeeks/dev-tools/validators/rails.rb +12 -0
  33. data/lib/polishgeeks/dev-tools/validators/simplecov.rb +20 -0
  34. data/lib/polishgeeks/dev-tools/version.rb +1 -1
  35. data/polishgeeks_dev_tools.gemspec +1 -1
  36. data/spec/lib/polishgeeks/dev-tools/{command → commands}/allowed_extensions_spec.rb +1 -1
  37. data/spec/lib/polishgeeks/dev-tools/commands/base_spec.rb +55 -0
  38. data/spec/lib/polishgeeks/dev-tools/{command → commands}/brakeman_spec.rb +10 -9
  39. data/spec/lib/polishgeeks/dev-tools/{command → commands}/empty_method/file_parser_spec.rb +1 -1
  40. data/spec/lib/polishgeeks/dev-tools/{command → commands}/empty_method/string_refinements_spec.rb +1 -1
  41. data/spec/lib/polishgeeks/dev-tools/{command → commands}/empty_method_spec.rb +1 -1
  42. data/spec/lib/polishgeeks/dev-tools/{command → commands}/examples_comparator_spec.rb +1 -1
  43. data/spec/lib/polishgeeks/dev-tools/{command → commands}/expires_in_spec.rb +1 -1
  44. data/spec/lib/polishgeeks/dev-tools/{command → commands}/final_blank_line_spec.rb +1 -1
  45. data/spec/lib/polishgeeks/dev-tools/{command → commands}/haml_lint_spec.rb +1 -1
  46. data/spec/lib/polishgeeks/dev-tools/{command → commands}/readme_spec.rb +1 -1
  47. data/spec/lib/polishgeeks/dev-tools/{command → commands}/rspec_files_names_spec.rb +1 -1
  48. data/spec/lib/polishgeeks/dev-tools/{command → commands}/rspec_files_structure_spec.rb +1 -1
  49. data/spec/lib/polishgeeks/dev-tools/{command → commands}/rspec_spec.rb +1 -1
  50. data/spec/lib/polishgeeks/dev-tools/{command → commands}/rubocop_spec.rb +1 -1
  51. data/spec/lib/polishgeeks/dev-tools/{command → commands}/rubycritic_spec.rb +1 -1
  52. data/spec/lib/polishgeeks/dev-tools/{command/coverage_spec.rb → commands/simplecov_spec.rb} +28 -15
  53. data/spec/lib/polishgeeks/dev-tools/{command → commands}/tasks_files_names_spec.rb +1 -1
  54. data/spec/lib/polishgeeks/dev-tools/{command → commands}/yard_spec.rb +1 -1
  55. data/spec/lib/polishgeeks/dev-tools/{command → commands}/yml_parser_spec.rb +1 -1
  56. data/spec/lib/polishgeeks/dev-tools/config_spec.rb +0 -18
  57. data/spec/lib/polishgeeks/dev-tools/errors_spec.rb +15 -0
  58. data/spec/lib/polishgeeks/dev-tools/logger_spec.rb +3 -3
  59. data/spec/lib/polishgeeks/dev-tools/runner_spec.rb +4 -1
  60. data/spec/lib/polishgeeks/dev-tools/validators/base_spec.rb +34 -0
  61. data/spec/lib/polishgeeks/dev-tools/validators/rails_spec.rb +21 -0
  62. data/spec/lib/polishgeeks/dev-tools/validators/simplecov_spec.rb +34 -0
  63. metadata +78 -69
  64. data/lib/polishgeeks/dev-tools/command/simplecov.rb +0 -32
  65. data/spec/lib/polishgeeks/dev-tools/command/base_spec.rb +0 -127
  66. data/spec/lib/polishgeeks/dev-tools/command/simplecov_spec.rb +0 -53
@@ -1,13 +1,14 @@
1
1
  module PolishGeeks
2
2
  module DevTools
3
- module Command
3
+ module Commands
4
4
  # Command wrapper for Simple code coverage analysing
5
5
  # It informs us if we didn't reach a proper code coverage level
6
- class Coverage < Base
6
+ class Simplecov < Base
7
7
  self.type = :validator
8
+ self.validators = [
9
+ Validators::Simplecov
10
+ ]
8
11
 
9
- # Regexp used to match code coverage level
10
- MATCH_REGEXP = /\(\d+.\d+\%\) covered/
11
12
  # Regexp used to match float number from coverage
12
13
  NUMBER_REGEXP = /(\d+[.]\d+)/
13
14
 
@@ -19,23 +20,35 @@ module PolishGeeks
19
20
  # Executes this command
20
21
  # @return [String] command output
21
22
  def execute
22
- @output = stored_output.rspec[*MATCH_REGEXP]
23
+ @output = stored_output.rspec[*Validators::Simplecov::MATCH_REGEXP]
23
24
  end
24
25
 
25
26
  # @return [Boolean] true if code coverage level is higher or equal to expected
26
27
  def valid?
27
- to_f >= DevTools.config.simplecov_threshold
28
+ to_f >= threshold
28
29
  end
29
30
 
30
31
  # @return [String] default label for this command
31
32
  def label
32
- "Coverage #{to_f}% covered - #{DevTools.config.simplecov_threshold}% required"
33
+ "SimpleCov covered #{to_f}%, required #{threshold}%"
33
34
  end
34
35
 
35
36
  # @return [String] message that should be printed when code coverage level is not met
36
37
  def error_message
37
- threshold = DevTools.config.simplecov_threshold
38
- "Coverage level should more or equal to #{threshold}%. was: #{to_f}"
38
+ 'SimpleCov coverage level needs to be ' \
39
+ "#{threshold}%#{threshold == limit ? '' : ' or more'}, was #{to_f}%"
40
+ end
41
+
42
+ private
43
+
44
+ # @return [Float] desired threshold
45
+ def threshold
46
+ DevTools.config.simplecov_threshold.to_f
47
+ end
48
+
49
+ # @return [Float] maximum threshold value
50
+ def limit
51
+ 100.0
39
52
  end
40
53
  end
41
54
  end
@@ -1,6 +1,6 @@
1
1
  module PolishGeeks
2
2
  module DevTools
3
- module Command
3
+ module Commands
4
4
  # Checks if tasks files (rake and capistrano) have proper extensions
5
5
  class TasksFilesNames < Base
6
6
  self.type = :validator
@@ -1,6 +1,6 @@
1
1
  module PolishGeeks
2
2
  module DevTools
3
- module Command
3
+ module Commands
4
4
  # Command wrapper for Yard statistics
5
5
  # @note It validates if everything is well documented
6
6
  class Yard < Base
@@ -1,6 +1,6 @@
1
1
  module PolishGeeks
2
2
  module DevTools
3
- module Command
3
+ module Commands
4
4
  # Verifying parameters in example YAML config files
5
5
  class YmlParser < Base
6
6
  self.type = :validator
@@ -48,7 +48,6 @@ module PolishGeeks
48
48
  tasks_files_names
49
49
  rspec
50
50
  simplecov
51
- coverage
52
51
  yard
53
52
  examples_comparator
54
53
  rubycritic
@@ -77,24 +76,9 @@ module PolishGeeks
77
76
  def self.setup(&block)
78
77
  self.config = new
79
78
 
80
- config.detect_framework
81
-
82
79
  block.call(config)
83
80
  config.freeze
84
81
  end
85
-
86
- # Detects if we use Rails, Sinatra or nothing
87
- # We need to set it because some of the commands might work only for Rails
88
- # or Sinatra (like brakeman for example - only Rails)
89
- def detect_framework
90
- define_singleton_method :rails? do
91
- !defined?(Rails).nil?
92
- end
93
-
94
- define_singleton_method :sinatra? do
95
- !defined?(App).nil?
96
- end
97
- end
98
82
  end
99
83
  end
100
84
  end
@@ -0,0 +1,25 @@
1
+ module PolishGeeks
2
+ module DevTools
3
+ # Module that encapsulates all the DevTools errrors
4
+ module Errors
5
+ # Base class for all DevTools errors
6
+ class BaseError < StandardError; end
7
+
8
+ # Raised when we want to run method that was not implemented and we have just a stub
9
+ # from parent class
10
+ class NotImplementedError < BaseError; end
11
+
12
+ # Raised when we want to run an command for which pre validation does not pass
13
+ class PreCommandValidationError < BaseError; end
14
+
15
+ # Raised when validators are defined with an unsupported type
16
+ class InvalidValidatorsTypeError < BaseError; end
17
+
18
+ # Raised when it is a type of task that we don't recognize
19
+ class UnknownTaskType < BaseError; end
20
+
21
+ # Raised when any of tasks fail
22
+ class RequirementsError < BaseError; end
23
+ end
24
+ end
25
+ end
@@ -5,13 +5,8 @@ module PolishGeeks
5
5
  # Regexp used to get only the class name without module names
6
6
  CLASS_NAME_REGEXP = /^.*::/
7
7
 
8
- # Raised when it is a type of task that we don't recognize
9
- class UnknownTaskType < StandardError; end
10
- # Raised when any of tasks fail
11
- class RequirementsError < StandardError; end
12
-
13
8
  # Method will print appropriate output with colors and comments
14
- # @param [PolishGeeks::DevTools::Command::Base] task that was executed
9
+ # @param [PolishGeeks::DevTools::Commands::Base] task that was executed
15
10
  # @raise [PolishGeeks::DevTools::Logger::RequirementsError] raised when task
16
11
  # has failed
17
12
  # @example Log output of a current_task
@@ -21,7 +16,7 @@ module PolishGeeks
21
16
  info(task)
22
17
  else
23
18
  fatal(task)
24
- fail RequirementsError
19
+ fail Errors::RequirementsError
25
20
  end
26
21
  end
27
22
 
@@ -29,20 +24,20 @@ module PolishGeeks
29
24
 
30
25
  # Will print message when task didn't fail while running
31
26
  # @note Handles also generators that never fail
32
- # @param [PolishGeeks::DevTools::Command::Base] task that was executed
33
- # @raise [PolishGeeks::DevTools::Logger::UnknownTaskType] raised when task type is
27
+ # @param [PolishGeeks::DevTools::Commands::Base] task that was executed
28
+ # @raise [PolishGeeks::DevTools::Errors::UnknownTaskType] raised when task type is
34
29
  # not supported (we don't know how to handle it)
35
30
  def info(task)
36
31
  msg = 'GENERATED' if task.class.generator?
37
32
  msg = 'OK' if task.class.validator?
38
33
 
39
- fail UnknownTaskType unless msg
34
+ fail Errors::UnknownTaskType unless msg
40
35
 
41
36
  printf('%-40s %2s', "#{label(task)} ", "\e[32m#{msg}\e[0m\n")
42
37
  end
43
38
 
44
39
  # Will print message when task did fail while running
45
- # @param [PolishGeeks::DevTools::Command::Base] task that was executed
40
+ # @param [PolishGeeks::DevTools::Commands::Base] task that was executed
46
41
  def fatal(task)
47
42
  printf('%-30s %20s', "#{label(task)} ", "\e[31mFAILURE\e[0m\n\n")
48
43
  puts task.error_message + "\n"
@@ -50,7 +45,7 @@ module PolishGeeks
50
45
 
51
46
  # Generates a label describing a given task
52
47
  # @note Will use a task class name if task doesn't respond to label method
53
- # @param [PolishGeeks::DevTools::Command::Base] task that was executed
48
+ # @param [PolishGeeks::DevTools::Commands::Base] task that was executed
54
49
  # @return [String] label describing task
55
50
  # @example Get label for a current_task task
56
51
  # label(current_task) #=> 'Rubocop'
@@ -15,8 +15,9 @@ module PolishGeeks
15
15
  next unless DevTools.config.public_send(:"#{command}?")
16
16
 
17
17
  klass = command.to_s.gsub(/(?<=_|^)(\w)/, &:upcase).gsub(/(?:_)(\w)/, '\1')
18
- cmd = Object.const_get("PolishGeeks::DevTools::Command::#{klass}").new
18
+ cmd = Object.const_get("PolishGeeks::DevTools::Commands::#{klass}").new
19
19
  cmd.stored_output = output
20
+ cmd.ensure_executable!
20
21
  cmd.execute
21
22
  output.public_send(:"#{command}=", cmd.output)
22
23
  logger.log(cmd)
@@ -0,0 +1,26 @@
1
+ module PolishGeeks
2
+ module DevTools
3
+ # Module encapsulating all the validators that we use to check/verify code
4
+ module Validators
5
+ # Base class for all the validators
6
+ # @abstract Subclass and use
7
+ class Base
8
+ def initialize(stored_output)
9
+ @stored_output = stored_output
10
+ end
11
+
12
+ # This should be implemented in a subclass
13
+ # @return [Boolean] if validation check is valid or not
14
+ def valid?
15
+ fail Errors::NotImplementedError
16
+ end
17
+
18
+ # @raise [PreCommandValidationError] when valid? return false
19
+ # @return [Boolean] if validation check is valid or not
20
+ def validate!
21
+ fail Errors::PreCommandValidationError unless valid?
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,12 @@
1
+ module PolishGeeks
2
+ module DevTools
3
+ module Validators
4
+ # It verifies if Rails is available
5
+ class Rails < Base
6
+ def valid?
7
+ Object.const_defined?('Rails')
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ module PolishGeeks
2
+ module DevTools
3
+ module Validators
4
+ # It verifies if SimpleCov is available
5
+ class Simplecov < Base
6
+ # Regexp used to match code coverage from Simplecov generated output
7
+ MATCH_REGEXP = /\(\d+.\d+\%\) covered/
8
+
9
+ def valid?
10
+ Object.const_defined?('SimpleCov') || (!output.nil? && output.length > 0)
11
+ end
12
+
13
+ # Searches if we have SimpleCov hooked to rspec
14
+ def output
15
+ @output ||= @stored_output.rspec[*MATCH_REGEXP]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -3,6 +3,6 @@ module PolishGeeks
3
3
  # Dev Tools for PolishGeeks developers
4
4
  module DevTools
5
5
  # Current version of dev tools
6
- VERSION = '1.2.0'
6
+ VERSION = '1.2.1'
7
7
  end
8
8
  end
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.add_development_dependency 'rake'
18
18
 
19
19
  s.add_dependency 'simplecov'
20
- s.add_dependency 'rubycritic', '1.2.1'
20
+ s.add_dependency 'rubycritic'
21
21
  s.add_dependency 'pry'
22
22
  s.add_dependency 'yard'
23
23
  s.add_dependency 'faker'
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe PolishGeeks::DevTools::Command::AllowedExtensions do
3
+ RSpec.describe PolishGeeks::DevTools::Commands::AllowedExtensions do
4
4
  subject { described_class.new }
5
5
 
6
6
  describe '#execute' do
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe PolishGeeks::DevTools::Commands::Base do
4
+ subject { described_class.new }
5
+
6
+ describe '#execute' do
7
+ let(:error) { PolishGeeks::DevTools::Errors::NotImplementedError }
8
+ it { expect { subject.execute }. to raise_error(error) }
9
+ end
10
+
11
+ describe '#valid?' do
12
+ let(:error) { PolishGeeks::DevTools::Errors::NotImplementedError }
13
+ it { expect { subject.valid? }. to raise_error(error) }
14
+ end
15
+
16
+ describe '#error_message' do
17
+ let(:output) { rand.to_s }
18
+
19
+ before do
20
+ subject.instance_variable_set('@output', output)
21
+ end
22
+
23
+ it 'by default should equal raw output' do
24
+ expect(subject.error_message).to eq output
25
+ end
26
+ end
27
+
28
+ describe '#ensure_executable!' do
29
+ context 'when there are validators' do
30
+ let(:validator_class) { PolishGeeks::DevTools::Validators::Base }
31
+
32
+ before do
33
+ expect(described_class)
34
+ .to receive(:validators)
35
+ .and_return([validator_class])
36
+
37
+ expect_any_instance_of(validator_class)
38
+ .to receive(:valid?)
39
+ .and_return(true)
40
+ end
41
+
42
+ it { expect { subject.ensure_executable! }.not_to raise_error }
43
+ end
44
+
45
+ context 'when we dont require any validators' do
46
+ before do
47
+ expect(described_class)
48
+ .to receive(:validators)
49
+ .and_return([])
50
+ end
51
+
52
+ it { expect { subject.ensure_executable! }.not_to raise_error }
53
+ end
54
+ end
55
+ end
@@ -1,16 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe PolishGeeks::DevTools::Command::Brakeman do
4
- subject { described_class.new }
5
- let(:config) { double(rails?: true) }
6
-
7
- before do
8
- expect(PolishGeeks::DevTools)
9
- .to receive(:config)
10
- .and_return(config)
3
+ RSpec.describe PolishGeeks::DevTools::Commands::Brakeman do
4
+ subject { described_class }
11
5
 
12
- subject
6
+ describe '#validators' do
7
+ it 'should work only when we have Rails framework' do
8
+ expect(subject.validators).to eq [PolishGeeks::DevTools::Validators::Rails]
9
+ end
13
10
  end
11
+ end
12
+
13
+ RSpec.describe PolishGeeks::DevTools::Commands::Brakeman do
14
+ subject { described_class.new }
14
15
 
15
16
  describe '#execute' do
16
17
  context 'when we run brakeman' do
@@ -1,4 +1,4 @@
1
- RSpec.describe PolishGeeks::DevTools::Command::EmptyMethod::FileParser do
1
+ RSpec.describe PolishGeeks::DevTools::Commands::EmptyMethod::FileParser do
2
2
  let(:file) { Tempfile.new('foo') }
3
3
  subject { described_class.new(file) }
4
4
 
@@ -1,4 +1,4 @@
1
- RSpec.describe PolishGeeks::DevTools::Command::EmptyMethod::StringRefinements do
1
+ RSpec.describe PolishGeeks::DevTools::Commands::EmptyMethod::StringRefinements do
2
2
  using described_class
3
3
 
4
4
  describe '#defines_method?' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'tempfile'
3
3
 
4
- RSpec.describe PolishGeeks::DevTools::Command::EmptyMethod do
4
+ RSpec.describe PolishGeeks::DevTools::Commands::EmptyMethod do
5
5
  subject { described_class.new }
6
6
  describe '#execute' do
7
7
  let(:file) { [rand.to_s] }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe PolishGeeks::DevTools::Command::ExamplesComparator do
3
+ RSpec.describe PolishGeeks::DevTools::Commands::ExamplesComparator do
4
4
  subject { described_class.new }
5
5
 
6
6
  let(:example_file) { rand.to_s }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe PolishGeeks::DevTools::Command::ExpiresIn do
3
+ RSpec.describe PolishGeeks::DevTools::Commands::ExpiresIn do
4
4
  subject { described_class.new }
5
5
 
6
6
  let(:config) { double }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe PolishGeeks::DevTools::Command::FinalBlankLine do
3
+ RSpec.describe PolishGeeks::DevTools::Commands::FinalBlankLine do
4
4
  subject { described_class.new }
5
5
 
6
6
  describe '#execute' do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe PolishGeeks::DevTools::Command::HamlLint do
3
+ RSpec.describe PolishGeeks::DevTools::Commands::HamlLint do
4
4
  subject { described_class.new }
5
5
 
6
6
  describe '#execute' do