ducalis 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +1 -1
- data/.rubocop.yml +1 -1
- data/.travis.yml +8 -0
- data/Gemfile.lock +13 -12
- data/Rakefile +2 -2
- data/bin/ducalis +1 -1
- data/bin/legacy_versions_test.sh +21 -0
- data/ducalis.gemspec +1 -1
- data/lib/ducalis.rb +5 -1
- data/lib/ducalis/commentators/console.rb +1 -1
- data/lib/ducalis/commentators/github.rb +1 -1
- data/lib/ducalis/cops/callbacks_activerecord.rb +2 -2
- data/lib/ducalis/cops/controllers_except.rb +2 -2
- data/lib/ducalis/cops/extensions/rubocop_cast.rb +13 -0
- data/lib/ducalis/cops/extensions/type_resolving.rb +7 -6
- data/lib/ducalis/cops/multiple_times.rb +4 -4
- data/lib/ducalis/cops/preferable_methods.rb +5 -4
- data/lib/ducalis/cops/regex_cop.rb +2 -2
- data/lib/ducalis/cops/rest_only_cop.rb +1 -1
- data/lib/ducalis/cops/strings_in_activerecords.rb +3 -3
- data/lib/ducalis/cops/too_long_workers.rb +3 -7
- data/lib/ducalis/cops/uncommented_gem.rb +2 -2
- data/lib/ducalis/cops/unlocked_gem.rb +1 -1
- data/lib/ducalis/cops/useless_only.rb +2 -2
- data/lib/ducalis/documentation.rb +2 -2
- data/lib/ducalis/patched_rubocop/git_files_access.rb +1 -1
- data/lib/ducalis/version.rb +1 -1
- metadata +5 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cebb8b9bfce243520e492e14428a31520166d57
|
4
|
+
data.tar.gz: 71377e24c677052deba2729e4d6edad9d5661408
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a80ee7b95acfc74476566eb5c5cf4b02dd94889a27f1832772e30d6e85cc923443dcf3e659847e455c3884dde71b1fcb75e09a85bb2e1ebd3cc4cbe81af3ebd8
|
7
|
+
data.tar.gz: 113862c9e97fd9c418f31ccd172153660daf9406307fa5e8fbb5756658b173ebda5ce8e7dde7f5dfe00cfcf1d0e157fad33d3daca70d84fd5c514702e5709a81
|
data/.codeclimate.yml
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
+
- 2.1.1
|
3
4
|
- 2.2.9
|
4
5
|
- 2.3.6
|
5
6
|
- 2.4.3
|
@@ -7,3 +8,10 @@ before_install:
|
|
7
8
|
- gem update --system
|
8
9
|
- gem --version
|
9
10
|
- gem install bundler
|
11
|
+
script:
|
12
|
+
- bundle exec rake
|
13
|
+
- bash bin/legacy_versions_test.sh
|
14
|
+
matrix:
|
15
|
+
include:
|
16
|
+
- rvm: 2.5.0
|
17
|
+
env: IGNORE_LEGACY=true
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ducalis (0.
|
4
|
+
ducalis (0.7.0)
|
5
5
|
git (~> 1.3, >= 1.3.0)
|
6
6
|
policial (= 0.0.4)
|
7
7
|
regexp-examples (~> 1.3, >= 1.3.2)
|
8
|
-
rubocop (
|
8
|
+
rubocop (>= 0.45.0)
|
9
9
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
@@ -37,6 +37,7 @@ GEM
|
|
37
37
|
multipart-post (2.0.0)
|
38
38
|
octokit (4.8.0)
|
39
39
|
sawyer (~> 0.8.0, >= 0.5.3)
|
40
|
+
parallel (1.12.1)
|
40
41
|
parser (2.5.0.0)
|
41
42
|
ast (~> 2.4.0)
|
42
43
|
policial (0.0.4)
|
@@ -45,19 +46,18 @@ GEM
|
|
45
46
|
octokit (~> 4.3)
|
46
47
|
rubocop (~> 0.39)
|
47
48
|
powerpack (0.1.1)
|
48
|
-
pry (0.11.
|
49
|
+
pry (0.11.3)
|
49
50
|
coderay (~> 1.1.0)
|
50
51
|
method_source (~> 0.9.0)
|
51
52
|
public_suffix (3.0.2)
|
52
|
-
rainbow (
|
53
|
-
|
54
|
-
rake (12.1.0)
|
53
|
+
rainbow (3.0.0)
|
54
|
+
rake (12.3.0)
|
55
55
|
regexp-examples (1.4.2)
|
56
56
|
rspec (3.7.0)
|
57
57
|
rspec-core (~> 3.7.0)
|
58
58
|
rspec-expectations (~> 3.7.0)
|
59
59
|
rspec-mocks (~> 3.7.0)
|
60
|
-
rspec-core (3.7.
|
60
|
+
rspec-core (3.7.1)
|
61
61
|
rspec-support (~> 3.7.0)
|
62
62
|
rspec-expectations (3.7.0)
|
63
63
|
diff-lcs (>= 1.2.0, < 2.0)
|
@@ -65,11 +65,12 @@ GEM
|
|
65
65
|
rspec-mocks (3.7.0)
|
66
66
|
diff-lcs (>= 1.2.0, < 2.0)
|
67
67
|
rspec-support (~> 3.7.0)
|
68
|
-
rspec-support (3.7.
|
69
|
-
rubocop (0.
|
70
|
-
|
68
|
+
rspec-support (3.7.1)
|
69
|
+
rubocop (0.52.1)
|
70
|
+
parallel (~> 1.10)
|
71
|
+
parser (>= 2.4.0.2, < 3.0)
|
71
72
|
powerpack (~> 0.1)
|
72
|
-
rainbow (>=
|
73
|
+
rainbow (>= 2.2.2, < 4.0)
|
73
74
|
ruby-progressbar (~> 1.7)
|
74
75
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
75
76
|
ruby-progressbar (1.9.0)
|
@@ -89,4 +90,4 @@ DEPENDENCIES
|
|
89
90
|
rspec (~> 3.0)
|
90
91
|
|
91
92
|
BUNDLED WITH
|
92
|
-
1.16.
|
93
|
+
1.16.1
|
data/Rakefile
CHANGED
@@ -5,8 +5,8 @@ require 'rspec/core/rake_task'
|
|
5
5
|
require 'rubocop/rake_task'
|
6
6
|
|
7
7
|
RuboCop::RakeTask.new do |task|
|
8
|
-
task.options = %w
|
8
|
+
task.options = %w[--auto-correct]
|
9
9
|
end
|
10
10
|
|
11
11
|
RSpec::Core::RakeTask.new(:spec)
|
12
|
-
task default: %i
|
12
|
+
task default: %i[rubocop spec]
|
data/bin/ducalis
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
if [ -n "${IGNORE_LEGACY-}" ]; then
|
6
|
+
echo "$(tput bold)Nothing to test!"
|
7
|
+
exit 0;
|
8
|
+
fi
|
9
|
+
|
10
|
+
echo "$(tput bold)Enforcing old RuboCop version: $(tput sgr0)"
|
11
|
+
sed -i.bak "s/'>= 0.45.0'/'>= 0.45.0', '0.46.0'/" ducalis.gemspec
|
12
|
+
bundle install --no-deployment --quiet --no-color
|
13
|
+
bundle show rubocop
|
14
|
+
echo "$(tput bold)Running rspec on old RuboCop version: $(tput sgr0)"
|
15
|
+
bundle exec rspec --format progress
|
16
|
+
echo "$(tput bold)Enforcing new RuboCop version: $(tput sgr0)"
|
17
|
+
mv ducalis.gemspec.bak ducalis.gemspec
|
18
|
+
bundle install --no-deployment --quiet --no-color
|
19
|
+
bundle show rubocop
|
20
|
+
echo "$(tput bold)Running rspec on new RuboCop version: $(tput sgr0)"
|
21
|
+
bundle exec rspec --format progress
|
data/ducalis.gemspec
CHANGED
@@ -31,5 +31,5 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_dependency 'git', '~> 1.3', '>= 1.3.0'
|
32
32
|
spec.add_dependency 'policial', '0.0.4'
|
33
33
|
spec.add_dependency 'regexp-examples', '~> 1.3', '>= 1.3.2'
|
34
|
-
spec.add_dependency 'rubocop', '>= 0.45.0'
|
34
|
+
spec.add_dependency 'rubocop', '>= 0.45.0'
|
35
35
|
end
|
data/lib/ducalis.rb
CHANGED
@@ -4,7 +4,7 @@ require 'parser/current'
|
|
4
4
|
require 'policial'
|
5
5
|
|
6
6
|
module Ducalis
|
7
|
-
DOTFILE = '.ducalis.yml'
|
7
|
+
DOTFILE = '.ducalis.yml'.freeze
|
8
8
|
DUCALIS_HOME = File.realpath(File.join(File.dirname(__FILE__), '..'))
|
9
9
|
DEFAULT_FILE = File.join(DUCALIS_HOME, 'config', DOTFILE)
|
10
10
|
end
|
@@ -61,3 +61,7 @@ require 'ducalis/cops/too_long_workers'
|
|
61
61
|
require 'ducalis/cops/uncommented_gem'
|
62
62
|
require 'ducalis/cops/unlocked_gem'
|
63
63
|
require 'ducalis/cops/useless_only'
|
64
|
+
|
65
|
+
require 'ducalis/cops/extensions/rubocop_cast'
|
66
|
+
|
67
|
+
RuboCop::Cop::Cop.prepend(RubocopCast)
|
@@ -15,7 +15,7 @@ module Ducalis
|
|
15
15
|
| You can read more [here](https://medium.com/planet-arkency/a61fd75ab2d3).
|
16
16
|
MESSAGE
|
17
17
|
|
18
|
-
METHODS_BLACK_LIST = %i
|
18
|
+
METHODS_BLACK_LIST = %i[
|
19
19
|
after_commit
|
20
20
|
after_create
|
21
21
|
after_destroy
|
@@ -35,7 +35,7 @@ module Ducalis
|
|
35
35
|
before_save
|
36
36
|
before_update
|
37
37
|
before_validation
|
38
|
-
|
38
|
+
].freeze
|
39
39
|
|
40
40
|
def on_send(node)
|
41
41
|
return unless in_model?
|
@@ -8,8 +8,8 @@ module Ducalis
|
|
8
8
|
| Prefer to use `:only` over `:except` in controllers because it's more explicit and will be easier to maintain for new developers.
|
9
9
|
MESSAGE
|
10
10
|
|
11
|
-
FILTERS = %i
|
12
|
-
before_action after_action around_action
|
11
|
+
FILTERS = %i[before_filter after_filter around_filter
|
12
|
+
before_action after_action around_action].freeze
|
13
13
|
|
14
14
|
def on_send(node)
|
15
15
|
_, method_name, *args = *node
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubocopCast
|
4
|
+
OLD_RUBOCOP_VERSION = Gem::Version.new('0.46.0')
|
5
|
+
|
6
|
+
def add_offense(node, loc, message = nil, severity = nil)
|
7
|
+
if Gem::Version.new(RuboCop::Version.version) > OLD_RUBOCOP_VERSION
|
8
|
+
super(node, location: loc, message: message, severity: severity)
|
9
|
+
else
|
10
|
+
super(node, loc, message, severity)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module TypeResolving
|
3
|
-
MODELS_CLASS_NAMES = %w
|
4
|
+
MODELS_CLASS_NAMES = %w[
|
4
5
|
ApplicationRecord
|
5
6
|
ActiveRecord::Base
|
6
|
-
|
7
|
+
].freeze
|
7
8
|
|
8
|
-
WORKERS_SUFFIXES = %w
|
9
|
+
WORKERS_SUFFIXES = %w[
|
9
10
|
Worker
|
10
11
|
Job
|
11
|
-
|
12
|
+
].freeze
|
12
13
|
|
13
|
-
CONTROLLER_SUFFIXES = %w
|
14
|
+
CONTROLLER_SUFFIXES = %w[
|
14
15
|
Controller
|
15
|
-
|
16
|
+
].freeze
|
16
17
|
|
17
18
|
SERVICES_PATH = File.join('app', 'services')
|
18
19
|
|
@@ -42,9 +42,9 @@ module Ducalis
|
|
42
42
|
alias on_defs on_def
|
43
43
|
alias on_send on_def
|
44
44
|
|
45
|
-
def_node_search :date_today, '(send (const
|
46
|
-
def_node_search :date_current, '(send (const
|
47
|
-
def_node_search :time_current, '(send (const
|
48
|
-
def_node_search :time_now, '(send (const
|
45
|
+
def_node_search :date_today, '(send (const _ :Date) :today)'
|
46
|
+
def_node_search :date_current, '(send (const _ :Date) :current)'
|
47
|
+
def_node_search :time_current, '(send (const _ :Time) :current)'
|
48
|
+
def_node_search :time_now, '(send (const _ :Time) :now)'
|
49
49
|
end
|
50
50
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'rubocop'
|
3
4
|
|
4
5
|
module Ducalis
|
@@ -7,13 +8,13 @@ module Ducalis
|
|
7
8
|
| Prefer to use %<alternative>s method instead of %<original>s because of %<reason>s.
|
8
9
|
MESSAGE
|
9
10
|
|
10
|
-
WHITE_LIST = %w
|
11
|
+
WHITE_LIST = %w[cache file params attrs options].freeze
|
11
12
|
|
12
13
|
ALWAYS_TRUE = ->(_who, _what, _args) { true }
|
13
14
|
|
14
15
|
DELETE_CHECK = lambda do |who, _what, args|
|
15
|
-
!%i
|
16
|
-
args.count <= 1 &&
|
16
|
+
!%i[sym str].include?(args.first && args.first.type) &&
|
17
|
+
args.count <= 1 && WHITE_LIST.none? { |regex| who.to_s.include?(regex) }
|
17
18
|
end
|
18
19
|
|
19
20
|
VALIDATE_CHECK = lambda do |_who, _what, args|
|
@@ -64,7 +65,7 @@ module Ducalis
|
|
64
65
|
}.freeze
|
65
66
|
|
66
67
|
DETAILS = "Dangerous methods are:
|
67
|
-
#{DESCRIPTION.keys.map { |name| "`#{name}`" }.join(', ')}."
|
68
|
+
#{DESCRIPTION.keys.map { |name| "`#{name}`" }.join(', ')}.".freeze
|
68
69
|
|
69
70
|
def on_send(node)
|
70
71
|
who, what, *args = *node
|
@@ -37,9 +37,9 @@ module Ducalis
|
|
37
37
|
).freeze
|
38
38
|
|
39
39
|
DETAILS = "Available regexes are:
|
40
|
-
#{SELF_DESCRIPTIVE.map { |name| "`#{name}`" }.join(', ')}"
|
40
|
+
#{SELF_DESCRIPTIVE.map { |name| "`#{name}`" }.join(', ')}".freeze
|
41
41
|
|
42
|
-
DEFAULT_EXAMPLE = 'some_example'
|
42
|
+
DEFAULT_EXAMPLE = 'some_example'.freeze
|
43
43
|
|
44
44
|
def on_begin(node)
|
45
45
|
not_defined_regexes(node).each do |regex|
|
@@ -17,7 +17,7 @@ module Ducalis
|
|
17
17
|
| [About RESTful architecture](<https://confreaks.tv/videos/railsconf2017-in-relentless-pursuit-of-rest>)
|
18
18
|
MESSAGE
|
19
19
|
|
20
|
-
WHITELIST = %i
|
20
|
+
WHITELIST = %i[index show new edit create update destroy].freeze
|
21
21
|
|
22
22
|
def on_def(node)
|
23
23
|
return unless in_controller?
|
@@ -10,10 +10,10 @@ module Ducalis
|
|
10
10
|
MESSAGE
|
11
11
|
|
12
12
|
VALIDATEBLE_METHODS =
|
13
|
-
::Ducalis::CallbacksActiverecord::METHODS_BLACK_LIST + %i
|
13
|
+
::Ducalis::CallbacksActiverecord::METHODS_BLACK_LIST + %i[
|
14
14
|
validates
|
15
15
|
validate
|
16
|
-
|
16
|
+
]
|
17
17
|
|
18
18
|
def on_send(node)
|
19
19
|
_, method_name, *args = *node
|
@@ -30,7 +30,7 @@ module Ducalis
|
|
30
30
|
def skip_node?(current_node)
|
31
31
|
key, value = *current_node
|
32
32
|
return true unless current_node.type == :pair
|
33
|
-
return true unless %w
|
33
|
+
return true unless %w[if unless].include?(key.source)
|
34
34
|
return true unless value.type == :str
|
35
35
|
false
|
36
36
|
end
|
@@ -16,13 +16,9 @@ module Ducalis
|
|
16
16
|
|
17
17
|
def on_class(node)
|
18
18
|
return unless in_worker?
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def message(length, max_length)
|
25
|
-
format("#{OFFENSE} [%d/%d]", length, max_length)
|
19
|
+
length = code_length(node)
|
20
|
+
return unless length > max_length
|
21
|
+
add_offense(node, :expression, "#{OFFENSE} [#{length}/#{max_length}]")
|
26
22
|
end
|
27
23
|
end
|
28
24
|
end
|
@@ -12,7 +12,7 @@ module Ducalis
|
|
12
12
|
| It will increase [bus-factor](<https://en.wikipedia.org/wiki/Bus_factor>).
|
13
13
|
MESSAGE
|
14
14
|
|
15
|
-
ALLOWED_KEYS = %w
|
15
|
+
ALLOWED_KEYS = %w[require group :require :group].freeze
|
16
16
|
|
17
17
|
def investigate(processed_source)
|
18
18
|
return unless processed_source.ast
|
@@ -27,7 +27,7 @@ module Ducalis
|
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
-
def_node_search :gem_declarations, '(send
|
30
|
+
def_node_search :gem_declarations, '(send _ :gem str #allowed_args?)'
|
31
31
|
|
32
32
|
def commented?(processed_source, node)
|
33
33
|
processed_source.comments
|
@@ -25,8 +25,8 @@ module Ducalis
|
|
25
25
|
|
26
26
|
MESSAGE
|
27
27
|
|
28
|
-
FILTERS = %i
|
29
|
-
before_action after_action around_action
|
28
|
+
FILTERS = %i[before_filter after_filter around_filter
|
29
|
+
before_action after_action around_action].freeze
|
30
30
|
|
31
31
|
def on_send(node)
|
32
32
|
_, method_name, *args = *node
|
@@ -65,8 +65,8 @@ class SpecsProcessor < Parser::AST::Processor
|
|
65
65
|
end
|
66
66
|
|
67
67
|
class Documentation
|
68
|
-
SIGNAL_WORD = 'raises'
|
69
|
-
RULE_WORD = '[rule]'
|
68
|
+
SIGNAL_WORD = 'raises'.freeze
|
69
|
+
RULE_WORD = '[rule]'.freeze
|
70
70
|
|
71
71
|
def call
|
72
72
|
Dir[File.join(File.dirname(__FILE__), 'cops', '*.rb')].sort.map do |f|
|
data/lib/ducalis/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ducalis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ignat Zakrevsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: git
|
@@ -71,9 +71,6 @@ dependencies:
|
|
71
71
|
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
73
|
version: 0.45.0
|
74
|
-
- - "~>"
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 0.46.0
|
77
74
|
type: :runtime
|
78
75
|
prerelease: false
|
79
76
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -81,15 +78,13 @@ dependencies:
|
|
81
78
|
- - ">="
|
82
79
|
- !ruby/object:Gem::Version
|
83
80
|
version: 0.45.0
|
84
|
-
- - "~>"
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: 0.46.0
|
87
81
|
description: " Ducalis is RuboCop based static code analyzer for enterprise Rails
|
88
82
|
\ applications.\n"
|
89
83
|
email:
|
90
84
|
- iezakrevsky@gmail.com
|
91
85
|
executables:
|
92
86
|
- ducalis
|
87
|
+
- legacy_versions_test.sh
|
93
88
|
extensions: []
|
94
89
|
extra_rdoc_files: []
|
95
90
|
files:
|
@@ -105,6 +100,7 @@ files:
|
|
105
100
|
- README.md
|
106
101
|
- Rakefile
|
107
102
|
- bin/ducalis
|
103
|
+
- bin/legacy_versions_test.sh
|
108
104
|
- config/.ducalis.yml
|
109
105
|
- ducalis.gemspec
|
110
106
|
- lib/ducalis.rb
|
@@ -122,6 +118,7 @@ files:
|
|
122
118
|
- lib/ducalis/cops/data_access_objects.rb
|
123
119
|
- lib/ducalis/cops/enforce_namespace.rb
|
124
120
|
- lib/ducalis/cops/evlis_overusing.rb
|
121
|
+
- lib/ducalis/cops/extensions/rubocop_cast.rb
|
125
122
|
- lib/ducalis/cops/extensions/type_resolving.rb
|
126
123
|
- lib/ducalis/cops/fetch_expression.rb
|
127
124
|
- lib/ducalis/cops/keyword_defaults.rb
|