ducalis 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|