rubocop-sketchup 1.2.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +20 -19
- data/assets/output.html.erb +301 -301
- data/config/default.yml +379 -379
- data/lib/rubocop/sketchup/config.rb +63 -63
- data/lib/rubocop/sketchup/cop/bugs/material_name.rb +108 -108
- data/lib/rubocop/sketchup/cop/bugs/render_mode.rb +72 -72
- data/lib/rubocop/sketchup/cop/bugs/uniform_scaling.rb +36 -36
- data/lib/rubocop/sketchup/cop/deprecations/add_separator_to_menu.rb +25 -25
- data/lib/rubocop/sketchup/cop/deprecations/operation_next_transparent.rb +30 -30
- data/lib/rubocop/sketchup/cop/deprecations/require_all.rb +27 -27
- data/lib/rubocop/sketchup/cop/deprecations/set_texture_projection.rb +26 -26
- data/lib/rubocop/sketchup/cop/deprecations/show_ruby_panel.rb +25 -25
- data/lib/rubocop/sketchup/cop/deprecations/sketchup_set.rb +30 -30
- data/lib/rubocop/sketchup/cop/performance/openssl.rb +41 -41
- data/lib/rubocop/sketchup/cop/performance/operation_disable_ui.rb +33 -33
- data/lib/rubocop/sketchup/cop/performance/selection_bulk.rb +79 -79
- data/lib/rubocop/sketchup/cop/performance/type_check.rb +63 -63
- data/lib/rubocop/sketchup/cop/performance/typename.rb +24 -24
- data/lib/rubocop/sketchup/cop/requirements/api_namespace.rb +30 -30
- data/lib/rubocop/sketchup/cop/requirements/exit.rb +33 -33
- data/lib/rubocop/sketchup/cop/requirements/extension_namespace.rb +125 -125
- data/lib/rubocop/sketchup/cop/requirements/file_structure.rb +97 -97
- data/lib/rubocop/sketchup/cop/requirements/gem_install.rb +45 -45
- data/lib/rubocop/sketchup/cop/requirements/get_extension_license.rb +95 -95
- data/lib/rubocop/sketchup/cop/requirements/global_constants.rb +38 -38
- data/lib/rubocop/sketchup/cop/requirements/global_include.rb +42 -42
- data/lib/rubocop/sketchup/cop/requirements/global_methods.rb +65 -65
- data/lib/rubocop/sketchup/cop/requirements/global_variables.rb +95 -95
- data/lib/rubocop/sketchup/cop/requirements/language_handler_globals.rb +46 -46
- data/lib/rubocop/sketchup/cop/requirements/load_path.rb +83 -83
- data/lib/rubocop/sketchup/cop/requirements/minimal_registration.rb +73 -73
- data/lib/rubocop/sketchup/cop/requirements/observers_start_operation.rb +161 -161
- data/lib/rubocop/sketchup/cop/requirements/register_extension.rb +45 -45
- data/lib/rubocop/sketchup/cop/requirements/ruby_core_namespace.rb +291 -291
- data/lib/rubocop/sketchup/cop/requirements/ruby_stdlib_namespace.rb +634 -634
- data/lib/rubocop/sketchup/cop/requirements/shipped_extensions_namespace.rb +61 -61
- data/lib/rubocop/sketchup/cop/requirements/sketchup_extension.rb +119 -119
- data/lib/rubocop/sketchup/cop/requirements/sketchup_require.rb +150 -149
- data/lib/rubocop/sketchup/cop/suggestions/add_group.rb +49 -49
- data/lib/rubocop/sketchup/cop/suggestions/compatibility.rb +128 -128
- data/lib/rubocop/sketchup/cop/suggestions/dc_internals.rb +34 -34
- data/lib/rubocop/sketchup/cop/suggestions/file_encoding.rb +78 -78
- data/lib/rubocop/sketchup/cop/suggestions/model_entities.rb +58 -58
- data/lib/rubocop/sketchup/cop/suggestions/monkey_patched_api.rb +45 -45
- data/lib/rubocop/sketchup/cop/suggestions/operation_name.rb +137 -137
- data/lib/rubocop/sketchup/cop/suggestions/sketchup_find_support_file.rb +39 -39
- data/lib/rubocop/sketchup/cop/suggestions/tool_drawing_bounds.rb +45 -45
- data/lib/rubocop/sketchup/cop/suggestions/tool_invalidate.rb +68 -68
- data/lib/rubocop/sketchup/cop/suggestions/tool_user_input.rb +41 -41
- data/lib/rubocop/sketchup/cop/suggestions/toolbar_timer.rb +65 -65
- data/lib/rubocop/sketchup/cop.rb +110 -110
- data/lib/rubocop/sketchup/dc_globals.rb +24 -24
- data/lib/rubocop/sketchup/dc_methods.rb +130 -130
- data/lib/rubocop/sketchup/extension_project.rb +65 -65
- data/lib/rubocop/sketchup/features.rb +1477 -1420
- data/lib/rubocop/sketchup/formatter/extension_review.rb +269 -269
- data/lib/rubocop/sketchup/inject.rb +19 -19
- data/lib/rubocop/sketchup/namespace.rb +49 -49
- data/lib/rubocop/sketchup/namespace_checker.rb +103 -46
- data/lib/rubocop/sketchup/no_comment_disable.rb +17 -17
- data/lib/rubocop/sketchup/range_help.rb +52 -52
- data/lib/rubocop/sketchup/sketchup_target_range.rb +75 -75
- data/lib/rubocop/sketchup/sketchup_version.rb +129 -128
- data/lib/rubocop/sketchup/tool_checker.rb +41 -43
- data/lib/rubocop/sketchup/version.rb +7 -7
- data/lib/rubocop/sketchup.rb +14 -14
- data/lib/rubocop-sketchup.rb +53 -53
- data/rubocop-sketchup.gemspec +29 -29
- metadata +8 -8
@@ -1,63 +1,63 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module SketchUp
|
5
|
-
module Config
|
6
|
-
|
7
|
-
DEFAULT_CONFIGURATION =
|
8
|
-
SketchUp::CONFIG.fetch('AllCops').fetch('SketchUp')
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def all_cops_config
|
13
|
-
config.for_all_cops
|
14
|
-
end
|
15
|
-
|
16
|
-
def sketchup_cops_config
|
17
|
-
config.for_all_cops.fetch('SketchUp', DEFAULT_CONFIGURATION)
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
def sketchup_config_key?(key)
|
22
|
-
return unless all_cops_config.key?('SketchUp')
|
23
|
-
|
24
|
-
all_cops_config.fetch('SketchUp').key?(key)
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
def sketchup_target_version?
|
29
|
-
sketchup_config_key?('TargetSketchUpVersion')
|
30
|
-
end
|
31
|
-
|
32
|
-
def sketchup_target_version
|
33
|
-
version = sketchup_cops_config.fetch('TargetSketchUpVersion')
|
34
|
-
version ? SketchUpVersion.new(version) : nil
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
def extension_source_path_config?
|
39
|
-
sketchup_config_key?('SourcePath')
|
40
|
-
end
|
41
|
-
|
42
|
-
def extension_source_path_config
|
43
|
-
sketchup_cops_config.fetch('SourcePath')
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
|
-
def encrypted_extension?
|
48
|
-
sketchup_config_key?('EncryptedExtension') &&
|
49
|
-
sketchup_cops_config.fetch('EncryptedExtension')
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
def extension_binaries?
|
54
|
-
sketchup_config_key?('ExtensionBinaries')
|
55
|
-
end
|
56
|
-
|
57
|
-
def extension_binaries
|
58
|
-
sketchup_cops_config.fetch('ExtensionBinaries')
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module SketchUp
|
5
|
+
module Config
|
6
|
+
|
7
|
+
DEFAULT_CONFIGURATION =
|
8
|
+
SketchUp::CONFIG.fetch('AllCops').fetch('SketchUp')
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def all_cops_config
|
13
|
+
config.for_all_cops
|
14
|
+
end
|
15
|
+
|
16
|
+
def sketchup_cops_config
|
17
|
+
config.for_all_cops.fetch('SketchUp', DEFAULT_CONFIGURATION)
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def sketchup_config_key?(key)
|
22
|
+
return unless all_cops_config.key?('SketchUp')
|
23
|
+
|
24
|
+
all_cops_config.fetch('SketchUp').key?(key)
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def sketchup_target_version?
|
29
|
+
sketchup_config_key?('TargetSketchUpVersion')
|
30
|
+
end
|
31
|
+
|
32
|
+
def sketchup_target_version
|
33
|
+
version = sketchup_cops_config.fetch('TargetSketchUpVersion')
|
34
|
+
version ? SketchUpVersion.new(version) : nil
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def extension_source_path_config?
|
39
|
+
sketchup_config_key?('SourcePath')
|
40
|
+
end
|
41
|
+
|
42
|
+
def extension_source_path_config
|
43
|
+
sketchup_cops_config.fetch('SourcePath')
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def encrypted_extension?
|
48
|
+
sketchup_config_key?('EncryptedExtension') &&
|
49
|
+
sketchup_cops_config.fetch('EncryptedExtension')
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def extension_binaries?
|
54
|
+
sketchup_config_key?('ExtensionBinaries')
|
55
|
+
end
|
56
|
+
|
57
|
+
def extension_binaries
|
58
|
+
sketchup_cops_config.fetch('ExtensionBinaries')
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -1,108 +1,108 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module SketchupBugs
|
6
|
-
# Prior to SketchUp 2018 it was possible for the Ruby API to cause
|
7
|
-
# materials to have duplicate names. This is not a valid SketchUp model
|
8
|
-
# as SketchUp expects material names to be unique identifiers.
|
9
|
-
#
|
10
|
-
# `model.materials.add('Example')` have always made materials unique by
|
11
|
-
# appending a numeric post-fix to the name.
|
12
|
-
#
|
13
|
-
# However, `material.name = 'Example'` did not perform such check. It
|
14
|
-
# would blindly set the new name.
|
15
|
-
#
|
16
|
-
# As of SketchUp 2018 the API behavior was changed to prevent this.
|
17
|
-
# `material.name = 'Example'` will now raise an `ArgumentError` is the
|
18
|
-
# name is not unique.
|
19
|
-
#
|
20
|
-
# A new method was added to allow a unique material name to be generated:
|
21
|
-
# `model.material.unique_name('Example')`.
|
22
|
-
#
|
23
|
-
# Changing the name of materials can now follow the same pattern as layers
|
24
|
-
# and component definitions.
|
25
|
-
#
|
26
|
-
# Note that in SketchUp 2018 there was also a second bug introduced. A
|
27
|
-
# name cache was introduced to speed up the lookup and generation of
|
28
|
-
# unique names. Unfortunately this got out of sync between changing name
|
29
|
-
# via the UI versus via the API. This has been fixed in SketchUp 2019.
|
30
|
-
#
|
31
|
-
# @example Pattern for setting material name from SketchUp 2018
|
32
|
-
# material.name = model.materials.unique_name('Example')
|
33
|
-
#
|
34
|
-
# @example Pattern for setting name prior to SketchUp 2018
|
35
|
-
# # Works with SketchUp 2014 or newer:
|
36
|
-
# require 'set'
|
37
|
-
#
|
38
|
-
# module Example
|
39
|
-
#
|
40
|
-
# def self.rename_material(material, name)
|
41
|
-
# materials = material.model.materials
|
42
|
-
# material.name = self.unique_name(materials, name)
|
43
|
-
# end
|
44
|
-
#
|
45
|
-
# def self.unique_material_name(materials, name)
|
46
|
-
# if materials.respond_to?(:unique_name)
|
47
|
-
# # Use fast native implementation if possible.
|
48
|
-
# materials.unique_name(name)
|
49
|
-
# else
|
50
|
-
# # Cache names in a Set for fast lookup.
|
51
|
-
# names = Set.new(materials.map(&:name))
|
52
|
-
# unique_name = name
|
53
|
-
# # Extract the base name and post-fix.
|
54
|
-
# match = unique_name.match(/^\D.*?(\d*)$/)
|
55
|
-
# base, postfix = match ? match.captures : [unique_name, 0]
|
56
|
-
# # Ensure basename has length and postfix is an integer.
|
57
|
-
# base = unique_name if base.empty?
|
58
|
-
# postfix = postfix.to_i
|
59
|
-
# # Iteratively find a unique name.
|
60
|
-
# until !names.include?(unique_name)
|
61
|
-
# postfix = postfix.next
|
62
|
-
# unique_name = "#{base}#{postfix}"
|
63
|
-
# end
|
64
|
-
# unique_name
|
65
|
-
# end
|
66
|
-
# end
|
67
|
-
#
|
68
|
-
# end
|
69
|
-
class MaterialName < SketchUp::Cop
|
70
|
-
|
71
|
-
include SketchUp::SketchUpTargetRange
|
72
|
-
|
73
|
-
define_sketchup_target_max_version 'SketchUp 2017'
|
74
|
-
|
75
|
-
MATERIAL_VARIABLES = %i[material mat].freeze
|
76
|
-
|
77
|
-
def_node_matcher :material_set_name?, <<-PATTERN
|
78
|
-
(send #material? :name= _)
|
79
|
-
PATTERN
|
80
|
-
|
81
|
-
MSG_SET_NAME = '`material.name=` might add duplicate materials in '\
|
82
|
-
'SU2017 and older versions.'
|
83
|
-
|
84
|
-
def on_send(node)
|
85
|
-
return unless valid_for_target_sketchup_version?
|
86
|
-
return unless material_set_name?(node)
|
87
|
-
|
88
|
-
add_offense(node, message: MSG_SET_NAME)
|
89
|
-
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
def material?(node)
|
94
|
-
return false unless node && (node.send_type? || node.variable?)
|
95
|
-
|
96
|
-
name = variable_name(node.children.last)
|
97
|
-
MATERIAL_VARIABLES.include?(name)
|
98
|
-
end
|
99
|
-
|
100
|
-
# Returns the name without the @ or $ prefix.
|
101
|
-
def variable_name(symbol)
|
102
|
-
symbol.to_s.tr('$@', '').to_sym
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module SketchupBugs
|
6
|
+
# Prior to SketchUp 2018 it was possible for the Ruby API to cause
|
7
|
+
# materials to have duplicate names. This is not a valid SketchUp model
|
8
|
+
# as SketchUp expects material names to be unique identifiers.
|
9
|
+
#
|
10
|
+
# `model.materials.add('Example')` have always made materials unique by
|
11
|
+
# appending a numeric post-fix to the name.
|
12
|
+
#
|
13
|
+
# However, `material.name = 'Example'` did not perform such check. It
|
14
|
+
# would blindly set the new name.
|
15
|
+
#
|
16
|
+
# As of SketchUp 2018 the API behavior was changed to prevent this.
|
17
|
+
# `material.name = 'Example'` will now raise an `ArgumentError` is the
|
18
|
+
# name is not unique.
|
19
|
+
#
|
20
|
+
# A new method was added to allow a unique material name to be generated:
|
21
|
+
# `model.material.unique_name('Example')`.
|
22
|
+
#
|
23
|
+
# Changing the name of materials can now follow the same pattern as layers
|
24
|
+
# and component definitions.
|
25
|
+
#
|
26
|
+
# Note that in SketchUp 2018 there was also a second bug introduced. A
|
27
|
+
# name cache was introduced to speed up the lookup and generation of
|
28
|
+
# unique names. Unfortunately this got out of sync between changing name
|
29
|
+
# via the UI versus via the API. This has been fixed in SketchUp 2019.
|
30
|
+
#
|
31
|
+
# @example Pattern for setting material name from SketchUp 2018
|
32
|
+
# material.name = model.materials.unique_name('Example')
|
33
|
+
#
|
34
|
+
# @example Pattern for setting name prior to SketchUp 2018
|
35
|
+
# # Works with SketchUp 2014 or newer:
|
36
|
+
# require 'set'
|
37
|
+
#
|
38
|
+
# module Example
|
39
|
+
#
|
40
|
+
# def self.rename_material(material, name)
|
41
|
+
# materials = material.model.materials
|
42
|
+
# material.name = self.unique_name(materials, name)
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# def self.unique_material_name(materials, name)
|
46
|
+
# if materials.respond_to?(:unique_name)
|
47
|
+
# # Use fast native implementation if possible.
|
48
|
+
# materials.unique_name(name)
|
49
|
+
# else
|
50
|
+
# # Cache names in a Set for fast lookup.
|
51
|
+
# names = Set.new(materials.map(&:name))
|
52
|
+
# unique_name = name
|
53
|
+
# # Extract the base name and post-fix.
|
54
|
+
# match = unique_name.match(/^\D.*?(\d*)$/)
|
55
|
+
# base, postfix = match ? match.captures : [unique_name, 0]
|
56
|
+
# # Ensure basename has length and postfix is an integer.
|
57
|
+
# base = unique_name if base.empty?
|
58
|
+
# postfix = postfix.to_i
|
59
|
+
# # Iteratively find a unique name.
|
60
|
+
# until !names.include?(unique_name)
|
61
|
+
# postfix = postfix.next
|
62
|
+
# unique_name = "#{base}#{postfix}"
|
63
|
+
# end
|
64
|
+
# unique_name
|
65
|
+
# end
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# end
|
69
|
+
class MaterialName < SketchUp::Cop
|
70
|
+
|
71
|
+
include SketchUp::SketchUpTargetRange
|
72
|
+
|
73
|
+
define_sketchup_target_max_version 'SketchUp 2017'
|
74
|
+
|
75
|
+
MATERIAL_VARIABLES = %i[material mat].freeze
|
76
|
+
|
77
|
+
def_node_matcher :material_set_name?, <<-PATTERN
|
78
|
+
(send #material? :name= _)
|
79
|
+
PATTERN
|
80
|
+
|
81
|
+
MSG_SET_NAME = '`material.name=` might add duplicate materials in ' \
|
82
|
+
'SU2017 and older versions.'
|
83
|
+
|
84
|
+
def on_send(node)
|
85
|
+
return unless valid_for_target_sketchup_version?
|
86
|
+
return unless material_set_name?(node)
|
87
|
+
|
88
|
+
add_offense(node, message: MSG_SET_NAME)
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def material?(node)
|
94
|
+
return false unless node && (node.send_type? || node.variable?)
|
95
|
+
|
96
|
+
name = variable_name(node.children.last)
|
97
|
+
MATERIAL_VARIABLES.include?(name)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns the name without the @ or $ prefix.
|
101
|
+
def variable_name(symbol)
|
102
|
+
symbol.to_s.tr('$@', '').to_sym
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -1,72 +1,72 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module SketchupBugs
|
6
|
-
# A regression was introduced in SketchUp 2017 that cause invalid render
|
7
|
-
# modes to crash SketchUp. The crash might not happen exactly when the
|
8
|
-
# new mode is set, but later when the viewport re-draws.
|
9
|
-
#
|
10
|
-
# Valid render modes are: (Internal enum names in parentheses)
|
11
|
-
#
|
12
|
-
# * `0` (`kRenderWireframe`)
|
13
|
-
# * `1` (`kRenderHidden`)
|
14
|
-
# * `2` (`kRenderFlat`)
|
15
|
-
# * `3` (`kRenderSmooth`)
|
16
|
-
# * `5` (`kRenderNoMaterials`)
|
17
|
-
#
|
18
|
-
# @example This obsolete render mode will crash SketchUp 2017 and newer
|
19
|
-
# Sketchup.active_model.rendering_options["RenderMode"] = 4
|
20
|
-
#
|
21
|
-
# @example This invalid render mode will crash SketchUp 2017 and newer
|
22
|
-
# Sketchup.active_model.rendering_options["RenderMode"] = 99
|
23
|
-
class RenderMode < SketchUp::Cop
|
24
|
-
|
25
|
-
include SketchUp::SketchUpTargetRange
|
26
|
-
|
27
|
-
define_sketchup_target_min_version 'SketchUp 2017'
|
28
|
-
|
29
|
-
RENDER_MODE_VALID = [
|
30
|
-
0, # kRenderWireframe,
|
31
|
-
1, # kRenderHidden,
|
32
|
-
2, # kRenderFlat,
|
33
|
-
3, # kRenderSmooth,
|
34
|
-
5, # kRenderNoMaterials
|
35
|
-
].freeze
|
36
|
-
|
37
|
-
RENDER_MODE_OBSOLETE = [
|
38
|
-
4, # kRenderTextureObsolete,
|
39
|
-
].freeze
|
40
|
-
|
41
|
-
def_node_matcher :set_render_mode, <<-PATTERN
|
42
|
-
(send _ :[]= (str "RenderMode") (int $_))
|
43
|
-
PATTERN
|
44
|
-
|
45
|
-
MSG_OBSOLETE = 'Obsolete render mode will crash in SU2017 and '\
|
46
|
-
'newer versions.'
|
47
|
-
|
48
|
-
MSG_INVALID = 'Invalid render mode will crash in SU2017 and '\
|
49
|
-
'newer versions.'
|
50
|
-
|
51
|
-
def on_send(node)
|
52
|
-
return unless valid_for_target_sketchup_version?
|
53
|
-
|
54
|
-
value = set_render_mode(node)
|
55
|
-
return if value.nil?
|
56
|
-
return if RENDER_MODE_VALID.include?(value)
|
57
|
-
|
58
|
-
value_node = node.arguments.last
|
59
|
-
message = obsolete?(value) ? MSG_OBSOLETE : MSG_INVALID
|
60
|
-
add_offense(value_node, message: message)
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
def obsolete?(value)
|
66
|
-
RENDER_MODE_OBSOLETE.include?(value)
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module SketchupBugs
|
6
|
+
# A regression was introduced in SketchUp 2017 that cause invalid render
|
7
|
+
# modes to crash SketchUp. The crash might not happen exactly when the
|
8
|
+
# new mode is set, but later when the viewport re-draws.
|
9
|
+
#
|
10
|
+
# Valid render modes are: (Internal enum names in parentheses)
|
11
|
+
#
|
12
|
+
# * `0` (`kRenderWireframe`)
|
13
|
+
# * `1` (`kRenderHidden`)
|
14
|
+
# * `2` (`kRenderFlat`)
|
15
|
+
# * `3` (`kRenderSmooth`)
|
16
|
+
# * `5` (`kRenderNoMaterials`)
|
17
|
+
#
|
18
|
+
# @example This obsolete render mode will crash SketchUp 2017 and newer
|
19
|
+
# Sketchup.active_model.rendering_options["RenderMode"] = 4
|
20
|
+
#
|
21
|
+
# @example This invalid render mode will crash SketchUp 2017 and newer
|
22
|
+
# Sketchup.active_model.rendering_options["RenderMode"] = 99
|
23
|
+
class RenderMode < SketchUp::Cop
|
24
|
+
|
25
|
+
include SketchUp::SketchUpTargetRange
|
26
|
+
|
27
|
+
define_sketchup_target_min_version 'SketchUp 2017'
|
28
|
+
|
29
|
+
RENDER_MODE_VALID = [
|
30
|
+
0, # kRenderWireframe,
|
31
|
+
1, # kRenderHidden,
|
32
|
+
2, # kRenderFlat,
|
33
|
+
3, # kRenderSmooth,
|
34
|
+
5, # kRenderNoMaterials
|
35
|
+
].freeze
|
36
|
+
|
37
|
+
RENDER_MODE_OBSOLETE = [
|
38
|
+
4, # kRenderTextureObsolete,
|
39
|
+
].freeze
|
40
|
+
|
41
|
+
def_node_matcher :set_render_mode, <<-PATTERN
|
42
|
+
(send _ :[]= (str "RenderMode") (int $_))
|
43
|
+
PATTERN
|
44
|
+
|
45
|
+
MSG_OBSOLETE = 'Obsolete render mode will crash in SU2017 and ' \
|
46
|
+
'newer versions.'
|
47
|
+
|
48
|
+
MSG_INVALID = 'Invalid render mode will crash in SU2017 and ' \
|
49
|
+
'newer versions.'
|
50
|
+
|
51
|
+
def on_send(node)
|
52
|
+
return unless valid_for_target_sketchup_version?
|
53
|
+
|
54
|
+
value = set_render_mode(node)
|
55
|
+
return if value.nil?
|
56
|
+
return if RENDER_MODE_VALID.include?(value)
|
57
|
+
|
58
|
+
value_node = node.arguments.last
|
59
|
+
message = obsolete?(value) ? MSG_OBSOLETE : MSG_INVALID
|
60
|
+
add_offense(value_node, message: message)
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def obsolete?(value)
|
66
|
+
RENDER_MODE_OBSOLETE.include?(value)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -1,36 +1,36 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module SketchupBugs
|
6
|
-
# Until SketchUp 2018 `Geom::Transformation.scaling(scale)` modified the
|
7
|
-
# 16th value in the transformation matrix. This way of scaling the matrix
|
8
|
-
# isn't fully accounted in all places in SketchUp. There are also a number
|
9
|
-
# of exporters and render engines which also doesn't fully handle this.
|
10
|
-
#
|
11
|
-
# @example Workaround for SketchUp versions older than SketchUp 2018
|
12
|
-
# tr = Geom::Transformation.scaling(scale, scale, scale)
|
13
|
-
class UniformScaling < SketchUp::Cop
|
14
|
-
|
15
|
-
include SketchUp::SketchUpTargetRange
|
16
|
-
|
17
|
-
define_sketchup_target_max_version 'SketchUp 2017'
|
18
|
-
|
19
|
-
def_node_matcher :transformation_scaling?, <<-PATTERN
|
20
|
-
(send (const (const nil? :Geom) :Transformation) :scaling _)
|
21
|
-
PATTERN
|
22
|
-
|
23
|
-
MSG = 'Resulting transformation matrix might yield unexpected '\
|
24
|
-
'results.'
|
25
|
-
|
26
|
-
def on_send(node)
|
27
|
-
return unless valid_for_target_sketchup_version?
|
28
|
-
return unless transformation_scaling?(node)
|
29
|
-
|
30
|
-
add_offense(node.arguments.first)
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module SketchupBugs
|
6
|
+
# Until SketchUp 2018 `Geom::Transformation.scaling(scale)` modified the
|
7
|
+
# 16th value in the transformation matrix. This way of scaling the matrix
|
8
|
+
# isn't fully accounted in all places in SketchUp. There are also a number
|
9
|
+
# of exporters and render engines which also doesn't fully handle this.
|
10
|
+
#
|
11
|
+
# @example Workaround for SketchUp versions older than SketchUp 2018
|
12
|
+
# tr = Geom::Transformation.scaling(scale, scale, scale)
|
13
|
+
class UniformScaling < SketchUp::Cop
|
14
|
+
|
15
|
+
include SketchUp::SketchUpTargetRange
|
16
|
+
|
17
|
+
define_sketchup_target_max_version 'SketchUp 2017'
|
18
|
+
|
19
|
+
def_node_matcher :transformation_scaling?, <<-PATTERN
|
20
|
+
(send (const (const nil? :Geom) :Transformation) :scaling _)
|
21
|
+
PATTERN
|
22
|
+
|
23
|
+
MSG = 'Resulting transformation matrix might yield unexpected ' \
|
24
|
+
'results.'
|
25
|
+
|
26
|
+
def on_send(node)
|
27
|
+
return unless valid_for_target_sketchup_version?
|
28
|
+
return unless transformation_scaling?(node)
|
29
|
+
|
30
|
+
add_offense(node.arguments.first)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,25 +1,25 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module SketchupDeprecations
|
6
|
-
# Avoid adding separators to top level menus. If you require grouping use
|
7
|
-
# a sub-menu instead.
|
8
|
-
class AddSeparatorToMenu < SketchUp::Cop
|
9
|
-
|
10
|
-
MSG = 'Method is deprecated.'
|
11
|
-
|
12
|
-
def_node_matcher :add_separator_to_menu?, <<-PATTERN
|
13
|
-
(send nil? :add_separator_to_menu _)
|
14
|
-
PATTERN
|
15
|
-
|
16
|
-
def on_send(node)
|
17
|
-
return unless add_separator_to_menu?(node)
|
18
|
-
|
19
|
-
add_offense(node, location: :selector)
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module SketchupDeprecations
|
6
|
+
# Avoid adding separators to top level menus. If you require grouping use
|
7
|
+
# a sub-menu instead.
|
8
|
+
class AddSeparatorToMenu < SketchUp::Cop
|
9
|
+
|
10
|
+
MSG = 'Method is deprecated.'
|
11
|
+
|
12
|
+
def_node_matcher :add_separator_to_menu?, <<-PATTERN
|
13
|
+
(send nil? :add_separator_to_menu _)
|
14
|
+
PATTERN
|
15
|
+
|
16
|
+
def on_send(node)
|
17
|
+
return unless add_separator_to_menu?(node)
|
18
|
+
|
19
|
+
add_offense(node, location: :selector)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,30 +1,30 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module SketchupDeprecations
|
6
|
-
# If set to true, then whatever operation comes after this one will be
|
7
|
-
# appended into one combined operation, allowing the user the undo both
|
8
|
-
# actions with a single undo command.
|
9
|
-
#
|
10
|
-
# This flag is a highly difficult one, since there are so many ways that a
|
11
|
-
# SketchUp user can interrupt a given operation with one of their own.
|
12
|
-
#
|
13
|
-
# Only use this flag if you have no other option, for instance to work
|
14
|
-
# around bug in how `Sketchup::Model#place_component` starts operations.
|
15
|
-
class OperationNextTransparent < SketchUp::Cop
|
16
|
-
MSG = 'Third argument is deprecated.'
|
17
|
-
|
18
|
-
def on_send(node)
|
19
|
-
_, method_name, *args = *node
|
20
|
-
return unless method_name == :start_operation
|
21
|
-
return if args.size < 3
|
22
|
-
|
23
|
-
argument = args[2]
|
24
|
-
next_transparent = (argument.type == :true)
|
25
|
-
add_offense(argument, location: :expression) if next_transparent
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module SketchupDeprecations
|
6
|
+
# If set to true, then whatever operation comes after this one will be
|
7
|
+
# appended into one combined operation, allowing the user the undo both
|
8
|
+
# actions with a single undo command.
|
9
|
+
#
|
10
|
+
# This flag is a highly difficult one, since there are so many ways that a
|
11
|
+
# SketchUp user can interrupt a given operation with one of their own.
|
12
|
+
#
|
13
|
+
# Only use this flag if you have no other option, for instance to work
|
14
|
+
# around bug in how `Sketchup::Model#place_component` starts operations.
|
15
|
+
class OperationNextTransparent < SketchUp::Cop
|
16
|
+
MSG = 'Third argument is deprecated.'
|
17
|
+
|
18
|
+
def on_send(node)
|
19
|
+
_, method_name, *args = *node
|
20
|
+
return unless method_name == :start_operation
|
21
|
+
return if args.size < 3
|
22
|
+
|
23
|
+
argument = args[2]
|
24
|
+
next_transparent = (argument.type == :true)
|
25
|
+
add_offense(argument, location: :expression) if next_transparent
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|