rubocop-rake 0.2.0 → 0.3.0

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: 8abee9ef7094059a116c1dcb7ef0c36c9494351fd14f5ee57d064b5736318fa4
4
- data.tar.gz: 24e4b728616fb46f871d917712504961b36ee4aed7f993689af1d20812f54e37
3
+ metadata.gz: 43a2bfee062536e5b93f61f3e3be4a2189ab8b694b4511c5b5be945229940607
4
+ data.tar.gz: 041a6a8562c844204db1757bf2503e33b641fa53eda3555cb7befe384dfe7845
5
5
  SHA512:
6
- metadata.gz: 0a47d61558777d3a42b5fc9e1dcc0ed5e12565cbf99fbadeef9a67eb9a9c604797986f52a1897c16c5eed1f7874590e56f916ebc8a0d44831d9c11d53bb1a310
7
- data.tar.gz: eb65d73cbb79e4f1ab59bad336b7e23f236c221ff03cb46dd4418062f91c44fe0341a052334766dc382c195bfc678c6efdaa9a402175018160eb654020d0bba1
6
+ metadata.gz: b4f7183c42528b767447731b7de87b025ba1f7f15f225658b162e00d204c3d5499c612a01d32ad06e41574daf0e6a8412da92f784de032635a412e171fdb3337
7
+ data.tar.gz: 8499dcd7ab87b21c251af73afde006f61832402277fb842eb05f55a5d5bff8a055f0c81c7963b63628ad60a53df442cd03fdf532c0b3707c1fd1bc03433d2ce7
@@ -0,0 +1,41 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require:
4
+ - rubocop-rake
5
+ - rubocop-rspec
6
+
7
+ AllCops:
8
+ TargetRubyVersion: 2.4
9
+
10
+ Metrics:
11
+ Enabled: false
12
+
13
+ Style/StringLiterals:
14
+ Enabled: false
15
+
16
+ Style/AccessModifierDeclarations:
17
+ EnforcedStyle: inline
18
+
19
+ Style/NumericPredicate:
20
+ Enabled: false
21
+
22
+ Style/UnneededPercentQ:
23
+ Exclude:
24
+ - '*.gemspec'
25
+
26
+ Style/ModuleFunction:
27
+ Enabled: false
28
+
29
+ Style/Documentation:
30
+ Enabled: false
31
+
32
+ Style/PercentLiteralDelimiters:
33
+ Exclude:
34
+ - '*.gemspec'
35
+
36
+ RSpec/ExampleLength:
37
+ Enabled: false
38
+
39
+ Naming/FileName:
40
+ Exclude:
41
+ - 'lib/rubocop-rake.rb'
@@ -0,0 +1,7 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2019-09-18 21:43:54 +0900 using RuboCop version 0.74.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
@@ -12,11 +12,21 @@
12
12
 
13
13
  -->
14
14
 
15
+ ## 0.3.0 (2019-09-25)
16
+
17
+ ### New features
18
+
19
+ * [#6](https://github.com/rubocop-hq/rubocop-rake/issues/6): Add `Rake/ClassDefinitionInTask` cop. ([@pocke][])
20
+
21
+ ### Bug fixes
22
+
23
+ * [#8](https://github.com/rubocop-hq/rubocop-rake/issues/8): Make Rake/Desc to not require description for the default task. ([@pocke][])
24
+
15
25
  ## 0.2.0 (2019-09-17)
16
26
 
17
27
  ### New features
18
28
 
19
- * [#5](https://github.com/pocke/rubocop-rake): Add `Rake/MethodDefinitionInTask`. ([@pocke][])
29
+ * [#5](https://github.com/rubocop-hq/rubocop-rake/pull/5): Add `Rake/MethodDefinitionInTask`. ([@pocke][])
20
30
 
21
31
  ## 0.1.0 (2019-09-04)
22
32
 
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in rubocop-rake.gemspec
@@ -5,3 +7,4 @@ gemspec
5
7
 
6
8
  gem "rake", "~> 12.0"
7
9
  gem 'rspec'
10
+ gem 'rubocop-rspec'
data/README.md CHANGED
@@ -34,5 +34,5 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
34
34
 
35
35
  ## Contributing
36
36
 
37
- Bug reports and pull requests are welcome on GitHub at https://github.com/pocke/rubocop-rake.
37
+ Bug reports and pull requests are welcome on GitHub at https://github.com/rubocop-hq/rubocop-rake.
38
38
 
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
- task :default => :spec
4
+ task default: %i[rubocop spec]
3
5
 
4
6
  require 'rspec/core/rake_task'
5
7
 
@@ -28,3 +30,8 @@ task :new_cop, [:cop] do |_task, args|
28
30
 
29
31
  puts generator.todo
30
32
  end
33
+
34
+ desc 'Run rubocop'
35
+ task :rubocop do
36
+ sh 'rubocop'
37
+ end
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "bundler/setup"
4
5
  require "rubocop/rake"
@@ -1,3 +1,8 @@
1
+ Rake/ClassDefinitionInTask:
2
+ Description: 'Do not define a class or module in rake task, because it will be defined to the top level.'
3
+ Enabled: true
4
+ VersionAdded: '0.3.0'
5
+
1
6
  Rake/Desc:
2
7
  Description: 'Describe the task with `desc` method.'
3
8
  Enabled: true
@@ -8,4 +8,6 @@ require_relative 'rubocop/rake/inject'
8
8
 
9
9
  RuboCop::Rake::Inject.defaults!
10
10
 
11
+ require_relative 'rubocop/cop/rake/helper/class_definition'
12
+ require_relative 'rubocop/cop/rake/helper/task_definition'
11
13
  require_relative 'rubocop/cop/rake_cops'
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rake
6
+ # This cop detects class or module definition in a task or namespace,
7
+ # because it is defined to the top level.
8
+ # It is confusing because the scope looks in the task or namespace,
9
+ # but actually it is defined to the top level.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # task :foo do
14
+ # class C
15
+ # end
16
+ # end
17
+ #
18
+ # # bad
19
+ # namespace :foo do
20
+ # module M
21
+ # end
22
+ # end
23
+ #
24
+ # # good - It is also defined to the top level,
25
+ # # but it looks expected behavior.
26
+ # class C
27
+ # end
28
+ # task :foo do
29
+ # end
30
+ #
31
+ class ClassDefinitionInTask < Cop
32
+ MSG = 'Do not define a %<type>s in rake task, because it will be defined to the top level.'
33
+
34
+ def on_class(node)
35
+ return if Helper::ClassDefinition.in_class_definition?(node)
36
+ return unless Helper::TaskDefinition.in_task_or_namespace?(node)
37
+
38
+ add_offense(node)
39
+ end
40
+
41
+ def message(node)
42
+ format(MSG, type: node.type)
43
+ end
44
+
45
+ alias on_module on_class
46
+ end
47
+ end
48
+ end
49
+ end
@@ -7,6 +7,9 @@ module RuboCop
7
7
  # It is useful as a documentation of task. And Rake does not display
8
8
  # task that does not have `desc` by `rake -T`.
9
9
  #
10
+ # Note: This cop does not require description for the default task,
11
+ # because the default task is executed with `rake` without command.
12
+ #
10
13
  # @example
11
14
  # # bad
12
15
  # task :do_something
@@ -25,7 +28,7 @@ module RuboCop
25
28
  # end
26
29
  #
27
30
  class Desc < Cop
28
- MSG = 'Describe the task with `desc` method.'.freeze
31
+ MSG = 'Describe the task with `desc` method.'
29
32
 
30
33
  def_node_matcher :task?, <<~PATTERN
31
34
  (send nil? :task ...)
@@ -34,6 +37,7 @@ module RuboCop
34
37
  def on_send(node)
35
38
  return unless task?(node)
36
39
  return if task_with_desc?(node)
40
+ return if task_name(node) == :default
37
41
 
38
42
  add_offense(node)
39
43
  end
@@ -49,11 +53,29 @@ module RuboCop
49
53
  desc_candidate.send_type? && desc_candidate.method_name == :desc
50
54
  end
51
55
 
56
+ private def task_name(node)
57
+ first_arg = node.arguments[0]
58
+ case first_arg&.type
59
+ when :sym, :str
60
+ return first_arg.value.to_sym
61
+ when :hash
62
+ return nil if first_arg.children.size != 1
63
+
64
+ pair = first_arg.children.first
65
+ key = pair.children.first
66
+ case key.type
67
+ when :sym, :str
68
+ key.value.to_sym
69
+ end
70
+ end
71
+ end
72
+
52
73
  private def parent_and_task(task_node)
53
74
  parent = task_node.parent
54
75
  return nil, task_node unless parent
55
76
  return parent, task_node unless parent.block_type?
56
77
 
78
+ # rubocop:disable Style/GuardClause
57
79
  if parent.children.find_index(task_node) == 0
58
80
  # when task {}
59
81
  return parent.parent, parent
@@ -61,6 +83,7 @@ module RuboCop
61
83
  # when something { task }
62
84
  return parent, task_node
63
85
  end
86
+ # rubocop:enable Style/GuardClause
64
87
  end
65
88
  end
66
89
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rake
6
+ module Helper
7
+ module ClassDefinition
8
+ extend NodePattern::Macros
9
+ extend self
10
+
11
+ def_node_matcher :class_definition?, <<~PATTERN
12
+ {
13
+ class module sclass
14
+ (block
15
+ (send (const {nil? cbase} {:Class :Module}) :new)
16
+ args
17
+ _
18
+ )
19
+ }
20
+ PATTERN
21
+
22
+ def in_class_definition?(node)
23
+ node.each_ancestor(:class, :module, :sclass, :block).any? do |a|
24
+ class_definition?(a)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rake
6
+ module Helper
7
+ module TaskDefinition
8
+ extend NodePattern::Macros
9
+ extend self
10
+
11
+ def_node_matcher :task_or_namespace?, <<-PATTERN
12
+ (block
13
+ (send _ {:task :namespace} ...)
14
+ args
15
+ _
16
+ )
17
+ PATTERN
18
+
19
+ def in_task_or_namespace?(node)
20
+ node.each_ancestor(:block).any? do |a|
21
+ task_or_namespace?(a)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -31,51 +31,16 @@ module RuboCop
31
31
  # end
32
32
  #
33
33
  class MethodDefinitionInTask < Cop
34
- MSG = 'Do not define a method in rake task, because it will be defined to the top level.'.freeze
35
-
36
- def_node_matcher :bad_method?, <<~PATTERN
37
- (send nil? :bad_method ...)
38
- PATTERN
39
-
40
- def_node_matcher :class_definition?, <<~PATTERN
41
- {
42
- class module sclass
43
- (block
44
- (send (const {nil? cbase} {:Class :Module}) :new)
45
- args
46
- _
47
- )
48
- }
49
- PATTERN
50
-
51
- def_node_matcher :task_or_namespace?, <<-PATTERN
52
- (block
53
- (send _ {:task :namespace} ...)
54
- args
55
- _
56
- )
57
- PATTERN
34
+ MSG = 'Do not define a method in rake task, because it will be defined to the top level.'
58
35
 
59
36
  def on_def(node)
60
- return if in_class_definition?(node)
61
- return unless in_task_or_namespace?(node)
37
+ return if Helper::ClassDefinition.in_class_definition?(node)
38
+ return unless Helper::TaskDefinition.in_task_or_namespace?(node)
62
39
 
63
40
  add_offense(node)
64
41
  end
65
42
 
66
43
  alias on_defs on_def
67
-
68
- private def in_class_definition?(node)
69
- node.each_ancestor(:class, :module, :sclass, :block).any? do |a|
70
- class_definition?(a)
71
- end
72
- end
73
-
74
- private def in_task_or_namespace?(node)
75
- node.each_ancestor(:block).any? do |a|
76
- task_or_namespace?(a)
77
- end
78
- end
79
44
  end
80
45
  end
81
46
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'rake/class_definition_in_task'
3
4
  require_relative 'rake/desc'
4
5
  require_relative 'rake/method_definition_in_task'
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "rubocop/rake/version"
2
4
 
3
5
  module RuboCop
6
+ # :nodoc:
4
7
  module Rake
5
8
  class Error < StandardError; end
6
9
 
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RuboCop
2
4
  module Rake
3
- VERSION = "0.2.0"
5
+ VERSION = "0.3.0"
4
6
  end
5
7
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'lib/rubocop/rake/version'
2
4
 
3
5
  Gem::Specification.new do |spec|
@@ -8,7 +10,7 @@ Gem::Specification.new do |spec|
8
10
 
9
11
  spec.summary = %q{A RuboCop plugin for Rake}
10
12
  spec.description = %q{A RuboCop plugin for Rake}
11
- spec.homepage = "https://github.com/pocke/rubocop-rake"
13
+ spec.homepage = "https://github.com/rubocop-hq/rubocop-rake"
12
14
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
13
15
  spec.licenses = ['MIT']
14
16
 
@@ -16,11 +18,11 @@ Gem::Specification.new do |spec|
16
18
 
17
19
  spec.metadata["homepage_uri"] = spec.homepage
18
20
  spec.metadata["source_code_uri"] = spec.homepage
19
- spec.metadata["changelog_uri"] = "https://github.com/pocke/rubocop-rake/blob/master/CHANGELOG.md"
21
+ spec.metadata["changelog_uri"] = "https://github.com/rubocop-hq/rubocop-rake/blob/master/CHANGELOG.md"
20
22
 
21
23
  # Specify which files should be added to the gem when it is released.
22
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
26
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
27
  end
26
28
  spec.bindir = "exe"
@@ -29,4 +31,3 @@ Gem::Specification.new do |spec|
29
31
 
30
32
  spec.add_runtime_dependency 'rubocop'
31
33
  end
32
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-rake
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masataka Pocke Kuwabara
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-17 00:00:00.000000000 Z
11
+ date: 2019-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -33,6 +33,8 @@ extra_rdoc_files: []
33
33
  files:
34
34
  - ".gitignore"
35
35
  - ".rspec"
36
+ - ".rubocop.yml"
37
+ - ".rubocop_todo.yml"
36
38
  - ".travis.yml"
37
39
  - CHANGELOG.md
38
40
  - Gemfile
@@ -43,21 +45,24 @@ files:
43
45
  - bin/setup
44
46
  - config/default.yml
45
47
  - lib/rubocop-rake.rb
48
+ - lib/rubocop/cop/rake/class_definition_in_task.rb
46
49
  - lib/rubocop/cop/rake/desc.rb
50
+ - lib/rubocop/cop/rake/helper/class_definition.rb
51
+ - lib/rubocop/cop/rake/helper/task_definition.rb
47
52
  - lib/rubocop/cop/rake/method_definition_in_task.rb
48
53
  - lib/rubocop/cop/rake_cops.rb
49
54
  - lib/rubocop/rake.rb
50
55
  - lib/rubocop/rake/inject.rb
51
56
  - lib/rubocop/rake/version.rb
52
57
  - rubocop-rake.gemspec
53
- homepage: https://github.com/pocke/rubocop-rake
58
+ homepage: https://github.com/rubocop-hq/rubocop-rake
54
59
  licenses:
55
60
  - MIT
56
61
  metadata:
57
62
  allowed_push_host: https://rubygems.org
58
- homepage_uri: https://github.com/pocke/rubocop-rake
59
- source_code_uri: https://github.com/pocke/rubocop-rake
60
- changelog_uri: https://github.com/pocke/rubocop-rake/blob/master/CHANGELOG.md
63
+ homepage_uri: https://github.com/rubocop-hq/rubocop-rake
64
+ source_code_uri: https://github.com/rubocop-hq/rubocop-rake
65
+ changelog_uri: https://github.com/rubocop-hq/rubocop-rake/blob/master/CHANGELOG.md
61
66
  post_install_message:
62
67
  rdoc_options: []
63
68
  require_paths: