rubocop-sketchup 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +7 -1
- data/assets/logo.png +0 -0
- data/assets/output.html.erb +301 -0
- data/config/default.yml +141 -36
- data/lib/rubocop/sketchup/config.rb +28 -8
- data/lib/rubocop/sketchup/cop/deprecations/add_separator_to_menu.rb +4 -1
- data/lib/rubocop/sketchup/cop/deprecations/operation_next_transparent.rb +11 -2
- data/lib/rubocop/sketchup/cop/deprecations/require_all.rb +7 -2
- data/lib/rubocop/sketchup/cop/deprecations/set_texture_projection.rb +6 -2
- data/lib/rubocop/sketchup/cop/deprecations/show_ruby_panel.rb +4 -1
- data/lib/rubocop/sketchup/cop/deprecations/sketchup_set.rb +8 -0
- data/lib/rubocop/sketchup/cop/performance/openssl.rb +5 -3
- data/lib/rubocop/sketchup/cop/performance/operation_disable_ui.rb +10 -2
- data/lib/rubocop/sketchup/cop/performance/selection_bulk.rb +11 -4
- data/lib/rubocop/sketchup/cop/performance/type_check.rb +63 -0
- data/lib/rubocop/sketchup/cop/performance/typename.rb +6 -1
- data/lib/rubocop/sketchup/cop/requirements/api_namespace.rb +8 -2
- data/lib/rubocop/sketchup/cop/requirements/exit.rb +7 -3
- data/lib/rubocop/sketchup/cop/requirements/extension_namespace.rb +32 -2
- data/lib/rubocop/sketchup/cop/requirements/file_structure.rb +22 -10
- data/lib/rubocop/sketchup/cop/requirements/gem_install.rb +45 -0
- data/lib/rubocop/sketchup/cop/requirements/get_extension_license.rb +95 -0
- data/lib/rubocop/sketchup/cop/requirements/global_constants.rb +10 -1
- data/lib/rubocop/sketchup/cop/requirements/global_include.rb +9 -2
- data/lib/rubocop/sketchup/cop/requirements/global_methods.rb +10 -1
- data/lib/rubocop/sketchup/cop/requirements/global_variables.rb +13 -4
- data/lib/rubocop/sketchup/cop/requirements/language_handler_globals.rb +6 -4
- data/lib/rubocop/sketchup/cop/requirements/load_path.rb +9 -6
- data/lib/rubocop/sketchup/cop/requirements/minimal_registration.rb +26 -2
- data/lib/rubocop/sketchup/cop/requirements/observers_start_operation.rb +28 -2
- data/lib/rubocop/sketchup/cop/requirements/register_extension.rb +12 -2
- data/lib/rubocop/sketchup/cop/requirements/ruby_core_namespace.rb +14 -8
- data/lib/rubocop/sketchup/cop/requirements/ruby_stdlib_namespace.rb +594 -588
- data/lib/rubocop/sketchup/cop/requirements/shipped_extensions_namespace.rb +6 -6
- data/lib/rubocop/sketchup/cop/requirements/sketchup_extension.rb +28 -9
- data/lib/rubocop/sketchup/cop/requirements/sketchup_require.rb +163 -0
- data/lib/rubocop/sketchup/cop/suggestions/add_group.rb +49 -0
- data/lib/rubocop/sketchup/cop/suggestions/compatibility.rb +35 -6
- data/lib/rubocop/sketchup/cop/suggestions/dc_internals.rb +6 -3
- data/lib/rubocop/sketchup/cop/suggestions/file_encoding.rb +3 -0
- data/lib/rubocop/sketchup/cop/suggestions/model_entities.rb +9 -2
- data/lib/rubocop/sketchup/cop/suggestions/monkey_patched_api.rb +5 -1
- data/lib/rubocop/sketchup/cop/suggestions/operation_name.rb +20 -9
- data/lib/rubocop/sketchup/cop/suggestions/sketchup_find_support_file.rb +13 -2
- data/lib/rubocop/sketchup/cop/suggestions/tool_drawing_bounds.rb +44 -0
- data/lib/rubocop/sketchup/cop/suggestions/tool_invalidate.rb +66 -0
- data/lib/rubocop/sketchup/cop/suggestions/tool_user_input.rb +41 -0
- data/lib/rubocop/sketchup/cop/suggestions/toolbar_timer.rb +65 -0
- data/lib/rubocop/sketchup/cop.rb +38 -18
- data/lib/rubocop/sketchup/dc_globals.rb +1 -1
- data/lib/rubocop/sketchup/dc_methods.rb +27 -27
- data/lib/rubocop/sketchup/extension_project.rb +19 -2
- data/lib/rubocop/sketchup/formatter/extension_review.rb +35 -15
- data/lib/rubocop/sketchup/inject.rb +1 -1
- data/lib/rubocop/sketchup/namespace.rb +1 -0
- data/lib/rubocop/sketchup/namespace_checker.rb +4 -1
- data/lib/rubocop/sketchup/no_comment_disable.rb +1 -1
- data/lib/rubocop/sketchup/range_help.rb +52 -0
- data/lib/rubocop/sketchup/sketchup_version.rb +4 -2
- data/lib/rubocop/sketchup/tool_checker.rb +43 -0
- data/lib/rubocop/sketchup/version.rb +1 -1
- data/lib/rubocop/sketchup.rb +1 -1
- data/lib/rubocop-sketchup.rb +9 -0
- data/rubocop-sketchup.gemspec +8 -11
- metadata +18 -6
- data/lib/rubocop/sketchup/cop/suggestions/sketchup_require.rb +0 -67
@@ -3,6 +3,8 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module SketchupRequirements
|
6
|
+
# Do not modify the load path. Modifying `$LOAD_PATH` is bad practice
|
7
|
+
# because it can cause extensions to inadvertently load the wrong file.
|
6
8
|
class LoadPath < SketchUp::Cop
|
7
9
|
|
8
10
|
include SketchUp::NoCommentDisable
|
@@ -16,11 +18,11 @@ module RuboCop
|
|
16
18
|
)
|
17
19
|
PATTERN
|
18
20
|
|
19
|
-
LOAD_PATH_ALIASES = %i
|
21
|
+
LOAD_PATH_ALIASES = %i[
|
20
22
|
$: $LOAD_PATH
|
21
|
-
|
23
|
+
].freeze
|
22
24
|
|
23
|
-
MUTATORS = %i
|
25
|
+
MUTATORS = %i[
|
24
26
|
<<
|
25
27
|
[]=
|
26
28
|
clear
|
@@ -51,7 +53,7 @@ module RuboCop
|
|
51
53
|
sort_by!
|
52
54
|
uniq!
|
53
55
|
unshift
|
54
|
-
|
56
|
+
].freeze
|
55
57
|
|
56
58
|
def load_path?(sym)
|
57
59
|
LOAD_PATH_ALIASES.include?(sym)
|
@@ -63,15 +65,16 @@ module RuboCop
|
|
63
65
|
|
64
66
|
def on_gvasgn(node)
|
65
67
|
global_var, = *node
|
68
|
+
return unless load_path?(global_var)
|
66
69
|
|
67
|
-
add_offense(node, location: :
|
70
|
+
add_offense(node, location: :expression)
|
68
71
|
end
|
69
72
|
|
70
73
|
def on_send(node)
|
71
74
|
method_name = load_path_mutator?(node)
|
72
75
|
return unless method_name
|
73
76
|
|
74
|
-
add_offense(node, location: :expression
|
77
|
+
add_offense(node, location: :expression)
|
75
78
|
end
|
76
79
|
|
77
80
|
end
|
@@ -7,12 +7,33 @@ module RuboCop
|
|
7
7
|
module SketchupRequirements
|
8
8
|
# Don't load extension files in the root file registering the extension.
|
9
9
|
# Extensions should not load additional files when it's disabled.
|
10
|
+
#
|
11
|
+
# @example Bad - Extension will always load.
|
12
|
+
# module Example
|
13
|
+
# require 'example/main' # BAD! This will load even when extension
|
14
|
+
# # is disabled.
|
15
|
+
# unless file_loaded?(__FILE__)
|
16
|
+
# extension = SketchupExtension.new('Hello World', 'example/main')
|
17
|
+
# Sketchup.register_extension(extension, true)
|
18
|
+
# file_loaded(__FILE__)
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# @example Good - Extension doesn't load anything unless its enabled.
|
23
|
+
# module Example
|
24
|
+
# unless file_loaded?(__FILE__)
|
25
|
+
# extension = SketchupExtension.new('Hello World', 'example/main')
|
26
|
+
# Sketchup.register_extension(extension, true)
|
27
|
+
# file_loaded(__FILE__)
|
28
|
+
# end
|
29
|
+
# end
|
10
30
|
class MinimalRegistration < SketchUp::Cop
|
11
31
|
|
12
32
|
include SketchUp::NoCommentDisable
|
13
33
|
include SketchUp::ExtensionProject
|
14
34
|
|
15
|
-
MSG = "Don't load extension files in the root file registering the
|
35
|
+
MSG = "Don't load extension files in the root file registering the "\
|
36
|
+
'extension.'.freeze
|
16
37
|
|
17
38
|
# Reference: http://rubocop.readthedocs.io/en/latest/node_pattern/
|
18
39
|
def_node_matcher :require_filename, <<-PATTERN
|
@@ -31,16 +52,19 @@ module RuboCop
|
|
31
52
|
|
32
53
|
def extension_file?(filename)
|
33
54
|
return false unless filename.include?('/')
|
55
|
+
|
34
56
|
first_directory = filename.split('/').first
|
35
57
|
@extension_basename.casecmp(first_directory) == 0
|
36
58
|
end
|
37
59
|
|
38
60
|
def on_send(node)
|
39
61
|
return unless @extension_basename
|
62
|
+
|
40
63
|
filename = require_filename(node)
|
41
64
|
return if filename.nil?
|
42
65
|
return unless extension_file?(filename)
|
43
|
-
|
66
|
+
|
67
|
+
add_offense(node)
|
44
68
|
end
|
45
69
|
|
46
70
|
end
|
@@ -3,6 +3,30 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module SketchupRequirements
|
6
|
+
# Observers that perform model changes must create transparent operations
|
7
|
+
# to ensure the user can easily undo.
|
8
|
+
#
|
9
|
+
# An important part of SketchUp's user experience is to be able to easily
|
10
|
+
# undo any modification to the model. This is important to prevent
|
11
|
+
# accidental loss of work.
|
12
|
+
#
|
13
|
+
# If you for example have an observer that assigns a material to new faces
|
14
|
+
# then the user would still expect to undo this in a single operation.
|
15
|
+
#
|
16
|
+
# To achieve this, set the fourth argument in `model.start_operation` to
|
17
|
+
# `true` in order to chain your observer operation to the previous
|
18
|
+
# operation.
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# class ExampleObserver < Sketchup::EntitiesObserver
|
22
|
+
# def onElementAdded(entities, entity)
|
23
|
+
# return unless entity.valid?
|
24
|
+
# return unless entity.is_a?(Sketchup::Face)
|
25
|
+
# entity.model.start_operation('Paint Face', true, false, true)
|
26
|
+
# entity.material = 'red'
|
27
|
+
# entity.model.commit_operation
|
28
|
+
# end
|
29
|
+
# end
|
6
30
|
class ObserversStartOperation < SketchUp::Cop
|
7
31
|
|
8
32
|
include SketchUp::NoCommentDisable
|
@@ -95,16 +119,18 @@ module RuboCop
|
|
95
119
|
onToolStateChanged
|
96
120
|
|
97
121
|
onViewChanged
|
98
|
-
]
|
122
|
+
].freeze
|
99
123
|
|
100
124
|
def on_def(node)
|
101
125
|
return unless observer_event?(node)
|
126
|
+
|
102
127
|
operations = start_operation(node)
|
103
128
|
operations.each { |operation|
|
104
129
|
_name, _disable_ui, _next_tr, transparent = operation.arguments
|
105
130
|
next unless transparent.nil? || transparent.falsey_literal?
|
131
|
+
|
106
132
|
location = operation_location(operation)
|
107
|
-
add_offense(operation, location: location
|
133
|
+
add_offense(operation, location: location)
|
108
134
|
}
|
109
135
|
end
|
110
136
|
|
@@ -5,6 +5,15 @@ module RuboCop
|
|
5
5
|
module SketchupRequirements
|
6
6
|
# Always register extensions to load by default. Otherwise it might
|
7
7
|
# confuse users to think the extension isn't working.
|
8
|
+
#
|
9
|
+
# @example Good - Extension will load upon first run.
|
10
|
+
# module Example
|
11
|
+
# unless file_loaded?(__FILE__)
|
12
|
+
# extension = SketchupExtension.new('Hello World', 'example/main')
|
13
|
+
# Sketchup.register_extension(extension, true)
|
14
|
+
# file_loaded(__FILE__)
|
15
|
+
# end
|
16
|
+
# end
|
8
17
|
class RegisterExtension < SketchUp::Cop
|
9
18
|
|
10
19
|
include SketchUp::NoCommentDisable
|
@@ -20,12 +29,13 @@ module RuboCop
|
|
20
29
|
def on_send(node)
|
21
30
|
sketchup_register_extension(node).each { |args|
|
22
31
|
if args.size < 2
|
23
|
-
add_offense(node,
|
32
|
+
add_offense(node, location: :selector)
|
24
33
|
next
|
25
34
|
end
|
26
35
|
load_arg = args[1]
|
27
36
|
next if load_arg.true_type?
|
28
|
-
|
37
|
+
|
38
|
+
add_offense(load_arg)
|
29
39
|
}
|
30
40
|
end
|
31
41
|
|
@@ -3,6 +3,12 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module SketchupRequirements
|
6
|
+
# Extensions in SketchUp all share the same Ruby environment on the user's
|
7
|
+
# machine. Because of this it's important that each extension isolate
|
8
|
+
# itself to avoid clashing with other extensions.
|
9
|
+
#
|
10
|
+
# Extensions submitted to Extension Warehouse is expected to not modify
|
11
|
+
# core Ruby functionality.
|
6
12
|
class RubyCoreNamespace < SketchUp::Cop
|
7
13
|
|
8
14
|
include SketchUp::NoCommentDisable
|
@@ -13,7 +19,7 @@ module RuboCop
|
|
13
19
|
# We check only against the top level namespaces. The core define more
|
14
20
|
# objects, but they are under one of the top level namespaces listed.
|
15
21
|
|
16
|
-
NAMESPACES_RUBY_186 = %w
|
22
|
+
NAMESPACES_RUBY_186 = %w[
|
17
23
|
ArgumentError
|
18
24
|
Array
|
19
25
|
Bignum
|
@@ -84,9 +90,9 @@ module RuboCop
|
|
84
90
|
TypeError
|
85
91
|
UnboundMethod
|
86
92
|
ZeroDivisionError
|
87
|
-
|
93
|
+
].freeze
|
88
94
|
|
89
|
-
NAMESPACES_RUBY_200 = %w
|
95
|
+
NAMESPACES_RUBY_200 = %w[
|
90
96
|
ARGF
|
91
97
|
ArgumentError
|
92
98
|
Array
|
@@ -172,9 +178,9 @@ module RuboCop
|
|
172
178
|
TypeError
|
173
179
|
UnboundMethod
|
174
180
|
ZeroDivisionError
|
175
|
-
|
181
|
+
].freeze
|
176
182
|
|
177
|
-
NAMESPACES_RUBY_220 = %w
|
183
|
+
NAMESPACES_RUBY_220 = %w[
|
178
184
|
ArgumentError
|
179
185
|
Array
|
180
186
|
BasicObject
|
@@ -263,15 +269,15 @@ module RuboCop
|
|
263
269
|
UnboundMethod
|
264
270
|
UncaughtThrowError
|
265
271
|
ZeroDivisionError
|
266
|
-
|
272
|
+
].freeze
|
267
273
|
|
268
274
|
NAMESPACES = (
|
269
275
|
(
|
270
276
|
NAMESPACES_RUBY_186 |
|
271
277
|
NAMESPACES_RUBY_200 |
|
272
278
|
NAMESPACES_RUBY_220
|
273
|
-
|
274
|
-
|
279
|
+
# Remove Object because this is the global namespace and there are
|
280
|
+
# other checks for this.
|
275
281
|
) - ['Object']
|
276
282
|
).freeze
|
277
283
|
|