From 71c794d0f90640c0bcbaae955d58f24990abe551 Mon Sep 17 00:00:00 2001 From: mhenrixon Date: Sun, 2 Feb 2020 13:38:46 +0100 Subject: [PATCH] Use shared configuration and dependencies --- .rubocop.yml | 31 ++------- .ruby-version | 2 +- .simplecov | 7 +- Gemfile | 6 +- Rakefile | 66 +++++++++++++++---- lib/rspec/subject_as_lambda.rb | 4 +- lib/stub_requests/concerns/register_verb.rb | 12 ++-- .../webmock/stub_registry_extension.rb | 2 +- lib/tasks/changelog.rake | 11 ++-- lib/tasks/gem.rake | 15 ----- lib/tasks/git.rake | 40 ----------- spec/rspec/subject_as_lambda_spec.rb | 20 +++--- spec/spec_helper.rb | 2 +- .../concerns/property/property_spec.rb | 20 +++--- .../concerns/register_verb_spec.rb | 8 ++- stub_requests.gemspec | 24 +++---- update_docs.sh | 6 +- 17 files changed, 128 insertions(+), 148 deletions(-) delete mode 100644 lib/tasks/gem.rake delete mode 100644 lib/tasks/git.rake diff --git a/.rubocop.yml b/.rubocop.yml index 0c1d20b..8b6a3b3 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,39 +1,21 @@ -require: - - rubocop-rspec - -inherit_mode: - merge: - - Exclude +inherit_gem: + rubocop-mhenrixon: + - config/default.yml AllCops: TargetRubyVersion: 2.5 - Include: - - "Rakefile" - - "lib/**/*" - - "bin/**/*" - - "spec/**/*" - - ".simplecov" Exclude: - "lib/stub_requests/core_ext/**/*" - "Gemfile.lock" - "bin/setup" - "gemfiles/**/*" -Layout/IndentArray: +Layout/FirstArrayElementIndentation: EnforcedStyle: consistent Metrics/AbcSize: Max: 38 -Metrics/CyclomaticComplexity: - Max: 7 - -Metrics/LineLength: - Max: 120 - -Metrics/MethodLength: - Max: 13 - Metrics/BlockLength: Exclude: - '**/spec/**/*.rb' @@ -46,14 +28,11 @@ Naming/FileName: Exclude: - '**/Gemfile' -Naming/UncommunicativeMethodParamName: +Naming/MethodParameterName: AllowedNames: - ex - id -AlignLeftLetBrace: - Enabled: true - RSpec/ContextWording: Prefixes: - when diff --git a/.ruby-version b/.ruby-version index d4bcea9..d7edb56 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -ruby-2.5.3 +ruby-2.6.5 diff --git a/.simplecov b/.simplecov index 87d2d3d..57864a8 100644 --- a/.simplecov +++ b/.simplecov @@ -1,11 +1,12 @@ # frozen_string_literal: true -require "simplecov-json" +require "simplecov-oj" +require "simplecov-material" SimpleCov.formatters = SimpleCov::Formatter::MultiFormatter.new([ - SimpleCov::Formatter::HTMLFormatter, - SimpleCov::Formatter::JSONFormatter, + SimpleCov::Formatter::MaterialFormatter, + SimpleCov::Formatter::OjFormatter, ]) SimpleCov.configure do diff --git a/Gemfile b/Gemfile index 60377ea..8df5a8e 100644 --- a/Gemfile +++ b/Gemfile @@ -3,4 +3,8 @@ source "https://rubygems.org" # Specify your gem's dependencies in stub_requests.gemspec gemspec -gem "rb-readline" +platform :mri do + gem "redcarpet" + gem "rb-readline" + gem "rubocop-mhenrixon", path: '../rubocop-mhenrixon' +end diff --git a/Rakefile b/Rakefile index cb3308b..03d58ef 100644 --- a/Rakefile +++ b/Rakefile @@ -1,30 +1,68 @@ # frozen_string_literal: true -require "bundler/gem_tasks" +require "reek/rake/task" +require "rspec/core/rake_task" +require "rubocop/rake_task" Dir.glob("#{File.expand_path(__dir__)}/lib/tasks/**/*.rake").each { |f| import f } -require "rspec/core/rake_task" -RSpec::Core::RakeTask.new(:spec) +Reek::Rake::Task.new(:reek) do |t| + t.name = "reek" + t.config_file = ".reek.yml" + t.source_files = "." + t.reek_opts = %w[ + --line-numbers + --color + --documentation + --progress + --single-line + --sort-by smelliness + ].join(" ") + t.fail_on_error = true + t.verbose = true +end + +def changed_files(pedantry) + `git diff-tree --no-commit-id --name-only -r HEAD~#{pedantry} HEAD` + .split("\n").select { |f| f.match(/(\.rb\z)|Rakefile/) && File.exist?(f) && !f.match(/db/) } +end + +RuboCop::RakeTask.new(:rubocop) do |task| + # task.patterns = changed_files(5) + task.options = %w[-DEP --require fuubar --format fuubar] +end + +desc "Runs validation of ruby styles" +task style: [:reek, :rubocop] + +RSpec::Core::RakeTask.new(:rspec) do |t| + t.rspec_opts = "--require fuubar --format Fuubar --format Nc" +end require "yard" -YARD::Rake::YardocTask.new do |t| - t.files = %w[lib/stub_requests/**/*.rb"] +YARD::Rake::YardocTask.new(:yard) do |t| + t.files = %w[lib/stub_requests/**/*.rb] t.options = %w[ --no-private + --embed-mixins --markup=markdown --markup-provider=redcarpet --readme README.md + --files CHANGELOG.md + ] + t.stats_options = %w[ + --no-private + --compact + --list-undoc ] end -task default: :spec - -namespace :stub_requests do - task :release do - sh("./update_docs.sh") - sh("gem release --tag --push") - Rake::Task["changelog"].invoke - sh("gem bump") - end +desc "Releases a new gem, updates changelog and documentation" +task :release do + sh("./update_docs.sh") + sh("gem release --tag --push") + Rake::Task["changelog"].invoke + sh("gem bump --file lib/stub_requests/version.rb") end + +task default: [:style, :rspec, :yard] diff --git a/lib/rspec/subject_as_lambda.rb b/lib/rspec/subject_as_lambda.rb index 8e73496..ef68ef5 100644 --- a/lib/rspec/subject_as_lambda.rb +++ b/lib/rspec/subject_as_lambda.rb @@ -106,7 +106,7 @@ module SubjectAsLambda # its(:age) { should eq(25) } # end # - def it!(*options, &block) + def it!(*options, &block) # rubocop:disable Metrics/MethodLength it_lambda_caller = caller.reject { |file_line| file_line =~ %r{/rspec/subject_as_lambda} } describe(nil, caller: it_lambda_caller) do let(:__it_lambda_subject) do @@ -134,4 +134,4 @@ def is_expected # rubocop:disable Lint/NestedMethodDefinition, Naming/PredicateN rspec.backtrace_exclusion_patterns << %r{/lib/rspec/subject_as_lambda} end -RSpec::SharedContext.send(:include, RSpec::SubjectAsLambda) +RSpec::SharedContext.include RSpec::SubjectAsLambda diff --git a/lib/stub_requests/concerns/register_verb.rb b/lib/stub_requests/concerns/register_verb.rb index 8c65bb9..35a556a 100644 --- a/lib/stub_requests/concerns/register_verb.rb +++ b/lib/stub_requests/concerns/register_verb.rb @@ -22,7 +22,7 @@ module RegisterVerb # # @return [Endpoint] the registered endpoint # - def any(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName + def any(path, as:) # rubocop:disable Naming/MethodParameterName register(as, __method__, path) end @@ -38,7 +38,7 @@ def any(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName # # @return [Endpoint] the registered endpoint # - def get(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName + def get(path, as:) # rubocop:disable Naming/MethodParameterName register(as, __method__, path) end @@ -54,7 +54,7 @@ def get(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName # # @return [Endpoint] the registered endpoint # - def post(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName + def post(path, as:) # rubocop:disable Naming/MethodParameterName register(as, __method__, path) end @@ -70,7 +70,7 @@ def post(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName # # @return [Endpoint] the registered endpoint # - def patch(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName + def patch(path, as:) # rubocop:disable Naming/MethodParameterName register(as, __method__, path) end @@ -86,7 +86,7 @@ def patch(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName # # @return [Endpoint] the registered endpoint # - def put(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName + def put(path, as:) # rubocop:disable Naming/MethodParameterName register(as, __method__, path) end @@ -102,7 +102,7 @@ def put(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName # # @return [Endpoint] the registered endpoint # - def delete(path, as:) # rubocop:disable Naming/UncommunicativeMethodParamName + def delete(path, as:) # rubocop:disable Naming/MethodParameterName register(as, __method__, path) end end diff --git a/lib/stub_requests/webmock/stub_registry_extension.rb b/lib/stub_requests/webmock/stub_registry_extension.rb index f81f6e2..e7724fb 100644 --- a/lib/stub_requests/webmock/stub_registry_extension.rb +++ b/lib/stub_requests/webmock/stub_registry_extension.rb @@ -43,4 +43,4 @@ def request_stub_for_ext(request_signature) end end -::WebMock::StubRegistry.send(:include, StubRequests::WebMock::StubRegistryExtension) +::WebMock::StubRegistry.include StubRequests::WebMock::StubRegistryExtension diff --git a/lib/tasks/changelog.rake b/lib/tasks/changelog.rake index 66d15ee..cc7dd13 100644 --- a/lib/tasks/changelog.rake +++ b/lib/tasks/changelog.rake @@ -5,15 +5,16 @@ task :changelog do # rubocop:disable Style/MutableConstant CHANGELOG_CMD ||= %w[ github_changelog_generator - -u + --no-verbose + --no-http-cache + --user mhenrixon - -p + --project stub_requests - --no-verbose --token ] - ADD_CHANGELOG_CMD ||= "git add --all" - COMMIT_CHANGELOG_CMD ||= "git commit -a -m 'Update changelog'" + ADD_CHANGELOG_CMD ||= "git add --all" + COMMIT_CHANGELOG_CMD ||= "git commit -a -m 'Update changelog'" # rubocop:enable Style/MutableConstant sh("git checkout master") diff --git a/lib/tasks/gem.rake b/lib/tasks/gem.rake deleted file mode 100644 index 7600028..0000000 --- a/lib/tasks/gem.rake +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -namespace :gem do - task :bump do - system("gem bump ") - end - - task :release do - system("gem release ") - end - - task :tag do - system("gem tag") - end -end diff --git a/lib/tasks/git.rake b/lib/tasks/git.rake deleted file mode 100644 index 47b3d14..0000000 --- a/lib/tasks/git.rake +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true - -namespace :git do - desc "Run ssh-add to enter password for your ssh key a single time" - task :setup do - sh "ssh-add" - end - - desc "Stage any deleted files to prepare for commit" - task :delete do - sh "git ls-files --deleted -z | xargs -0 git rm" - end - - desc "Add files, commit them, push them" - task :checkin do - do_checkin - end - - desc "Tests showing argument" - task :show_arg, [:param1] do |_t, args| - puts "Param1 is: #{args.param1}" - end - - desc "Git Status" - task :status do - sh "git status" - end - - def do_checkin - print "Enter commit message to add, commit and push files, or blank to quit:\n" - commit_message = STDIN.gets.chomp - if commit_message.nil? - print "Commit aborted." - return - end - sh "git add ." - sh "git commit -m\"#{commit_message}\"" - sh "git push" - end -end diff --git a/spec/rspec/subject_as_lambda_spec.rb b/spec/rspec/subject_as_lambda_spec.rb index c81b7cc..be3a3ff 100644 --- a/spec/rspec/subject_as_lambda_spec.rb +++ b/spec/rspec/subject_as_lambda_spec.rb @@ -3,18 +3,22 @@ require "spec_helper" RSpec.describe RSpec::SubjectAsLambda do - class NullFormatter - private - - def method_missing(method, *args, &block) # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing - # ignore - end - end - let(:stub) { double } let(:error) { ArgumentError } let(:message) { "nice message" } + before do + null_formatter_class = Class.new do + private + + def method_missing(method, *args, &block) # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing + # ignore + end + end + + stub_const("NullFormatter", null_formatter_class) + end + describe "#it!" do before { allow(stub).to receive(:message).and_raise(error, message) } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index dea4b56..c7ce80d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -17,7 +17,7 @@ require "rspec/its" require "rspec/subject_as_lambda" -Dir[File.join(File.dirname(__FILE__), "support", "**", "*.rb")].each { |f| require f } +Dir[File.join(File.dirname(__FILE__), "support", "**", "*.rb")].sort.each { |f| require f } RSpec.configure do |config| config.after do diff --git a/spec/stub_requests/concerns/property/property_spec.rb b/spec/stub_requests/concerns/property/property_spec.rb index 367aa82..6e0fe63 100644 --- a/spec/stub_requests/concerns/property/property_spec.rb +++ b/spec/stub_requests/concerns/property/property_spec.rb @@ -3,21 +3,21 @@ require "spec_helper" RSpec.describe StubRequests::Concerns::Property, ".property" do - subject { test_class } - - let(:test_instance) { test_class.new } - let(:test_class) do - class TestProperty - include StubRequests::Concerns::Property - end - end + subject { TestProperty } let(:property_name) { :a_method } let(:property_type) { String } let(:property_default) { "test string" } + let(:test_instance) { TestProperty.new } before do - Docile.dsl_eval(test_class) do + test_class = Class.new do + include StubRequests::Concerns::Property + end + + stub_const("TestProperty", test_class) + + Docile.dsl_eval(TestProperty) do property property_name, type: property_type, default: property_default end end @@ -26,7 +26,7 @@ class TestProperty let(:properties) { { property_name => { type: [property_type], default: property_default } } } context "for class" do - subject { test_class } + subject { TestProperty } its(:properties) { are_expected.to eq(properties) } end diff --git a/spec/stub_requests/concerns/register_verb_spec.rb b/spec/stub_requests/concerns/register_verb_spec.rb index f05da38..dd1f47b 100644 --- a/spec/stub_requests/concerns/register_verb_spec.rb +++ b/spec/stub_requests/concerns/register_verb_spec.rb @@ -3,7 +3,11 @@ require "spec_helper" RSpec.describe StubRequests::Concerns::RegisterVerb do - class Registrator - include StubRequests::Concerns::RegisterVerb + before do + registrator_class = Class.new do + include StubRequests::Concerns::RegisterVerb + end + + stub_const("Registrator", registrator_class) end end diff --git a/stub_requests.gemspec b/stub_requests.gemspec index 3f254fa..6b13bbf 100644 --- a/stub_requests.gemspec +++ b/stub_requests.gemspec @@ -37,20 +37,20 @@ Gem::Specification.new do |spec| spec.add_dependency "jaro_winkler", "~> 1.0", "< 2" # ===== Basics ===== - spec.add_development_dependency "bundler", ">= 2.0" + spec.add_development_dependency "bundler", ">= 2.1" spec.add_development_dependency "rake", ">= 10.0" # ===== Testing ===== - spec.add_development_dependency "appraisal", ">= 2.2.0" - spec.add_development_dependency "json_spec", ">= 1.1.5" - spec.add_development_dependency "fuubar", ">= 2.3" - spec.add_development_dependency "rspec", ">= 3.8" - spec.add_development_dependency "rspec-its", ">= 1.2" - spec.add_development_dependency "rubocop", "~> 0.63.1" - spec.add_development_dependency "rubocop-rspec", "~> 1.32" - spec.add_development_dependency "simplecov", ">= 0.16.1" - spec.add_development_dependency "simplecov-json", ">= 0.2" - spec.add_development_dependency "reek", ">= 5.0" + spec.add_development_dependency "appraisal", ">= 2.2.0" + spec.add_development_dependency "json_spec", ">= 1.1.5" + spec.add_development_dependency "fuubar", ">= 2.3" + spec.add_development_dependency "rspec", ">= 3.8" + spec.add_development_dependency "rspec-its", ">= 1.2" + spec.add_development_dependency "rubocop-mhenrixon", "~> 0.79.2" + spec.add_development_dependency "simplecov", ">= 0.18" + spec.add_development_dependency "simplecov-material", ">= 0.5" + spec.add_development_dependency "simplecov-oj", ">= 0.18" + spec.add_development_dependency "reek", ">= 5.0" # ===== Debugging ===== spec.add_development_dependency "pry", ">= 0.12" @@ -59,7 +59,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency "travis", ">= 1.8.9" # ===== Documentation ===== - spec.add_development_dependency "yard", "~> 0.9.18" + spec.add_development_dependency "yard" , "~> 0.9.24" spec.add_development_dependency "redcarpet", "~> 3.4" spec.add_development_dependency "github-markup", "~> 3.0" spec.add_development_dependency "github_changelog_generator", "~> 1.14" diff --git a/update_docs.sh b/update_docs.sh index 085a995..ed528bf 100755 --- a/update_docs.sh +++ b/update_docs.sh @@ -15,6 +15,10 @@ rake yard git checkout gh-pages +if [[ "$(git branch | grep \* | cut -d ' ' -f2)" != "gh-pages" ]]; then + git checkout -b gh-pages +fi; + echo "Cleaning up current documentation" find . ! -path '*/.git*' ! -path '*/doc*' ! -path '*/update_docs.sh*' ! -path '*/_config.yml*' ! -path '*/_index.html*' ! -path '.' | xargs rm -rf @@ -24,7 +28,7 @@ mv doc/* ./ echo "Sending new documentation to github" git add --all git commit -a -m 'Update documentation' -git push --force +git push --set-upstream origin gh-pages --force if [[ $stash_created == 1 ]]; then git stash pop