From 8641ef97c1387b03ecb300dfef38aab123c77067 Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Fri, 22 Mar 2019 12:01:50 +0900 Subject: [PATCH] Add changelog This commit adds changelog. And it adds .gitattributes to solve the merge conflict in the feature. And this commit adds spec/project_spec.rb based on part of ruboscop-hq/rubocop repository. https://github.com/rubocop-hq/rubocop/blob/v0.66.0/spec/project_spec.rb#L78-L185 --- .gitattributes | 1 + CHANGELOG.md | 11 +++++ spec/project_spec.rb | 112 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 .gitattributes create mode 100644 CHANGELOG.md create mode 100644 spec/project_spec.rb diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..a19ade077d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +CHANGELOG.md merge=union diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..cb648cb4e1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change log + +## master (unreleased) + +### New features + +* Extract Rails cops from rubocop-hq/rubocop repository. ([@koic][]) +* [#19](https://github.com/rubocop-hq/rubocop-rails/issues/19): Add new `Rails/HelperInstanceVariable` cop. ([@andyw8][]) + +[@koic]: https://github.com/koic +[@andyw8]: https://github.com/andyw8 diff --git a/spec/project_spec.rb b/spec/project_spec.rb new file mode 100644 index 0000000000..814718f688 --- /dev/null +++ b/spec/project_spec.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true + +RSpec.describe 'RuboCop Rails Project', type: :feature do + describe 'changelog' do + subject(:changelog) do + path = File.join(File.dirname(__FILE__), '..', 'CHANGELOG.md') + File.read(path) + end + + let(:lines) { changelog.each_line } + + let(:non_reference_lines) do + lines.take_while { |line| !line.start_with?('[@') } + end + + it 'has newline at end of file' do + expect(changelog.end_with?("\n")).to be true + end + + it 'has either entries, headers, or empty lines' do + expect(non_reference_lines).to all(match(/^(\*|#|$)/)) + end + + it 'has link definitions for all implicit links' do + implicit_link_names = changelog.scan(/\[([^\]]+)\]\[\]/).flatten.uniq + implicit_link_names.each do |name| + expect(changelog.include?("[#{name}]: http")) + .to be(true), "CHANGELOG.md is missing a link for #{name}. " \ + 'Please add this link to the bottom of the file.' + end + end + + describe 'entry' do + subject(:entries) { lines.grep(/^\*/).map(&:chomp) } + + it 'has a whitespace between the * and the body' do + expect(entries).to all(match(/^\* \S/)) + end + + context 'after version 0.14.0' do + let(:lines) do + changelog.each_line.take_while do |line| + !line.start_with?('## 0.14.0') + end + end + + it 'has a link to the contributors at the end' do + expect(entries).to all(match(/\(\[@\S+\]\[\](?:, \[@\S+\]\[\])*\)$/)) + end + end + + describe 'link to related issue' do + let(:issues) do + entries.map do |entry| + entry.match(/\[(?[#\d]+)\]\((?[^\)]+)\)/) + end.compact + end + + it 'has an issue number prefixed with #' do + issues.each do |issue| + expect(issue[:number]).to match(/^#\d+$/) + end + end + + it 'has a valid URL' do + issues.each do |issue| + number = issue[:number].gsub(/\D/, '') + pattern = %r{^https://github\.com/rubocop-hq/rubocop-rails/(?:issues|pull)/#{number}$} # rubocop:disable Metrics/LineLength + expect(issue[:url]).to match(pattern) + end + end + + it 'has a colon and a whitespace at the end' do + entries_including_issue_link = entries.select do |entry| + entry.match(/^\*\s*\[/) + end + + expect(entries_including_issue_link).to all(include('): ')) + end + end + + describe 'contributor name' do + subject(:contributor_names) { lines.grep(/\A\[@/).map(&:chomp) } + + it 'has a unique contributor name' do + expect(contributor_names.uniq.size).to eq contributor_names.size + end + end + + describe 'body' do + let(:bodies) do + entries.map do |entry| + entry + .gsub(/`[^`]+`/, '``') + .sub(/^\*\s*(?:\[.+?\):\s*)?/, '') + .sub(/\s*\([^\)]+\)$/, '') + end + end + + it 'does not start with a lower case' do + bodies.each do |body| + expect(body).not_to match(/^[a-z]/) + end + end + + it 'ends with a punctuation' do + expect(bodies).to all(match(/[\.\!]$/)) + end + end + end + end +end