immosquare-cleaner 0.1.71 → 0.1.73

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8aa35cadcbf70139cbb0af0a069f2a0fe2f0f2eebf7828a2a4f55cd561d244a0
4
- data.tar.gz: 66bf6deadd22989fa4c3b77d3479760e68e0c8a17e2b3d102567686d2cc38e49
3
+ metadata.gz: f88759145c815fbd8ffd6bad11a19a1b4e7395b13cbeac519a436bc498935785
4
+ data.tar.gz: 43a653504b87c0b29015a33db730d53f9af498f37e5fbbf8cd3e953984a4dccd
5
5
  SHA512:
6
- metadata.gz: e5f8431e8415eb8e90fe3373d7c3b2ac26c0753225b52ba4ac22b40323eb2943f7159520f672572c8f74d930f28ece4fef34837c8cefbd0431d801eede1f4e9c
7
- data.tar.gz: 279c5b7297e477b301904215ce3db41d6c610b7fbd07d0a213f3490be33abb535a3fb6b8b4a865736b8a6bc582861e255c2adae6868738fbf6001e604e94dcdc
6
+ metadata.gz: 1ca9026cee77d9404ac8ea54701bd3a7b7751bbbcc53079b4fc428aa784b4d265235dc4a087d88727bc7546fdfd157c6313d3c1b713bc61bd3f967c777a77314
7
+ data.tar.gz: c2cbdb16b2111ba580d8ce333a258510f723b66408c7ac657dd6457c4f8de586d8400c97ef8029fcc33d6cea463adebb47bc8fbc9a7dc900dde9a1b909a0dc60
@@ -1,3 +1,3 @@
1
1
  module ImmosquareCleaner
2
- VERSION = "0.1.71".freeze
2
+ VERSION = "0.1.73".freeze
3
3
  end
@@ -0,0 +1,14 @@
1
+ ---
2
+ EnableDefaultLinters: true
3
+ linters:
4
+ NoJavascriptTagHelper:
5
+ enabled: false
6
+ SpaceInHtmlTag:
7
+ enabled: false
8
+ Rubocop:
9
+ enabled: true
10
+ rubocop_config:
11
+ inherit_from:
12
+ - linters/rubocop-3.2.6.yml
13
+ Layout/TrailingWhitespace:
14
+ Enabled: false
@@ -20,104 +20,148 @@ module RuboCop
20
20
 
21
21
  extend AutoCorrector
22
22
 
23
- MSG = "Align the assignment operators of consecutive assignments.".freeze
24
- ASSIGNMENT_TYPES = [:lvasgn, :casgn, :ivasgn, :cvasgn, :gvasgn].freeze
23
+ MSG = "Align the assignment operators of consecutive assignments.".freeze
25
24
 
26
25
  def on_new_investigation
27
- @assignment_groups = find_assignment_groups
26
+ @assignment_groups = []
27
+ @current_group = []
28
+ @last_assignment_line = nil
28
29
  end
29
30
 
30
- ASSIGNMENT_TYPES.each do |type|
31
- define_method(:"on_#{type}") do |node|
32
- check_alignment(node)
33
- end
31
+ def on_lvasgn(node)
32
+ check_assignment(node)
34
33
  end
35
34
 
36
- private
35
+ def on_ivasgn(node)
36
+ check_assignment(node)
37
+ end
37
38
 
38
- def find_assignment_groups
39
- assignments_by_line = {}
39
+ def on_cvasgn(node)
40
+ check_assignment(node)
41
+ end
40
42
 
41
- processed_source.ast.each_node do |node|
42
- next unless ASSIGNMENT_TYPES.include?(node.type)
43
+ def on_gvasgn(node)
44
+ check_assignment(node)
45
+ end
43
46
 
44
- assignments_by_line[node.source_range.line] = node
45
- end
47
+ def on_casgn(node)
48
+ check_assignment(node)
49
+ end
46
50
 
47
- group_consecutive_assignments(assignments_by_line)
51
+ def on_masgn(node)
52
+ check_assignment(node)
48
53
  end
49
54
 
50
- def group_consecutive_assignments(assignments_by_line)
51
- groups = []
52
- current_group = []
53
- previous_line = nil
55
+ ##============================================================##
56
+ ## Pour les assignments d'index (listing["key"] = ...)
57
+ ##============================================================##
58
+ def on_send(node)
59
+ return unless node.method_name == :[]= && node.arguments.length == 2
54
60
 
55
- assignments_by_line.keys.sort.each do |line|
56
- if previous_line&.+(1) == line
57
- current_group << assignments_by_line[previous_line] if current_group.empty?
58
- current_group << assignments_by_line[line]
59
- else
60
- groups << current_group if current_group.size > 1
61
- current_group = [assignments_by_line[line]]
62
- end
63
- previous_line = line
64
- end
61
+ check_assignment(node)
62
+ end
65
63
 
66
- groups << current_group if current_group.size > 1
67
- groups
64
+ def on_investigation_end
65
+ finalize_current_group
66
+ process_groups
68
67
  end
69
68
 
70
- def check_alignment(node)
71
- group = @assignment_groups.find {|g| g.include?(node) }
72
- return unless group
69
+ private
73
70
 
74
- target_column = calculate_target_column(group)
75
- current_column = assignment_operator_column(node)
71
+ ##============================================================##
72
+ ## Vérifier que c'est bien un assignment simple (=) et pas (>=, <=, =>, etc.)
73
+ ##============================================================##
74
+ def check_assignment(node)
75
+ return unless assignment_operator?(node)
76
76
 
77
- return if current_column == target_column
77
+ add_to_group(node)
78
+ end
78
79
 
79
- spaces_needed = target_column - current_column
80
- return if spaces_needed <= 0
80
+ ##============================================================##
81
+ ## Vérifier si l'opérateur est un simple "=" (pas >=, <=, =>, etc.)
82
+ ##============================================================##
83
+ def assignment_operator?(node)
84
+ ##============================================================##
85
+ ## Pour les send nodes (index assignment)
86
+ ##============================================================##
87
+ return true if node.respond_to?(:method_name) && node.method_name == :[]=
88
+
89
+ ##============================================================##
90
+ ## Pour les assignments classiques
91
+ ##============================================================##
92
+ source = node.source.strip
93
+ return false unless source.include?("=")
81
94
 
82
- add_offense(node.source_range, :message => MSG) do |corrector|
83
- corrector.insert_before(assignment_operator_range(node), " " * spaces_needed)
84
- end
85
- end
95
+ equals_pos = source.index("=")
96
+ return false if equals_pos > 0 && [">", "<"].include?(source[equals_pos - 1])
97
+ return false if equals_pos < source.length - 1 && source[equals_pos + 1] == ">"
86
98
 
87
- def calculate_target_column(group)
88
- base_column = group.first.source_range.column
89
- max_var_length = group.map {|node| variable_name_length(node) }.max
90
- base_column + max_var_length + 1
99
+ true
91
100
  end
92
101
 
93
- def variable_name_length(node)
94
- case node.type
95
- when :lvasgn, :ivasgn, :cvasgn, :gvasgn
96
- node.children[0].to_s.length
97
- when :casgn
98
- if node.children[0]
99
- "#{node.children[0].source}::#{node.children[1]}".length
100
- else
101
- node.children[1].to_s.length
102
- end
102
+ ##============================================================##
103
+ ## Ajouter un assignment au groupe courant ou créer un nouveau groupe
104
+ ##============================================================##
105
+ def add_to_group(node)
106
+ current_line = node.location.line
107
+ if @current_group.empty?
108
+ @current_group = [node]
109
+ elsif consecutive_lines?(@last_assignment_line, current_line)
110
+ @current_group << node
111
+ else
112
+ finalize_current_group
113
+ @current_group = [node]
103
114
  end
115
+ @last_assignment_line = current_line
104
116
  end
105
117
 
106
- def assignment_operator_column(node)
107
- assignment_operator_range(node).column
118
+ ##============================================================##
119
+ ## Retourne true si les deux lignes sont consécutives (pas de ligne vide entre elles)
120
+ ##============================================================##
121
+ def consecutive_lines?(line1, line2)
122
+ gap = line2 - line1 - 1
123
+ gap == 0
108
124
  end
109
125
 
110
- def assignment_operator_range(node)
111
- source = node.source
112
- equals_pos = source.index("=")
113
- return node.source_range if equals_pos.nil?
126
+ ##============================================================##
127
+ ## Finaliser le groupe courant s'il contient plus d'un assignment
128
+ ##============================================================##
129
+ def finalize_current_group
130
+ @assignment_groups << @current_group.dup if @current_group.length > 1
131
+ @current_group = []
132
+ @last_assignment_line = nil
133
+ end
114
134
 
115
- start_pos = node.source_range.begin_pos + equals_pos
116
- range(processed_source.buffer, start_pos, start_pos + 1)
135
+ ##============================================================##
136
+ ## Traiter tous les groupes d'assignments pour vérifier l'alignement
137
+ ##============================================================##
138
+ def process_groups
139
+ @assignment_groups.each do |group|
140
+ check_and_correct_alignment(group)
141
+ end
117
142
  end
118
143
 
119
- def range(buffer, start_pos, end_pos)
120
- Parser::Source::Range.new(buffer, start_pos, end_pos)
144
+ ##============================================================##
145
+ ## Vérifier l'alignement d'un groupe et corriger si nécessaire
146
+ ##============================================================##
147
+ def check_and_correct_alignment(group)
148
+ lefts = group.map {|node| node.source.split("=")[0].to_s.strip.gsub(/\s+/, "").gsub(",", ", ") }
149
+ required_size = lefts.map(&:length).max + 1
150
+
151
+ group.each.with_index do |node, index|
152
+ current_source = node.source
153
+ new_left = lefts[index]
154
+ new_left += " " * (required_size - new_left.length)
155
+ split = current_source.split("=")
156
+ split[0] = new_left
157
+ expected_source = split.join("=")
158
+
159
+ if current_source != expected_source
160
+ add_offense(node, :message => MSG) do |corrector|
161
+ corrector.replace(node, expected_source)
162
+ end
163
+ end
164
+ end
121
165
  end
122
166
 
123
167
  end
@@ -98,5 +98,9 @@ CustomCops/Style/CommentNormalization:
98
98
  Enabled: true
99
99
  CustomCops/Style/FontAwesomeNormalization:
100
100
  Enabled: true
101
+ CustomCops/Style/AlignAssignments:
102
+ Enabled: true
103
+ Layout/SpaceAroundOperators:
104
+ Enabled: false
101
105
  Gemspec/RequireMFA:
102
106
  Enabled: false
data/linters/rubocop.yml CHANGED
@@ -102,6 +102,8 @@ Style/WordArray:
102
102
  EnforcedStyle: brackets # Pour formater les arrays de la forme ["a", "b", "c] et pas %w[a b c]
103
103
  Style/SymbolArray:
104
104
  EnforcedStyle: brackets # Pour formater les arrays de la forme [:a, :b, :c] et pas %i[a b c]
105
+ Style/RescueModifier:
106
+ Enabled: false # On veut pouvoir utiliser rescue modifier inline (some_method rescue SomeException)
105
107
 
106
108
  #################### OVERWRITE ###########################
107
109
  Style/MethodCallWithArgsParentheses:
data/package.json CHANGED
@@ -2,14 +2,14 @@
2
2
  "name": "immosquare-cleaner",
3
3
  "private": true,
4
4
  "dependencies": {
5
- "@eslint/js": "^9.29.0",
6
- "eslint": "^9.29.0",
5
+ "@eslint/js": "^9.31.0",
6
+ "eslint": "^9.31.0",
7
7
  "eslint-plugin-align-assignments": "^1.1.2",
8
8
  "eslint-plugin-align-import": "^1.0.0",
9
9
  "eslint-plugin-erb": "^2.1.1",
10
10
  "eslint-plugin-prefer-arrow": "^1.2.3",
11
- "eslint-plugin-sonarjs": "^3.0.3",
12
- "prettier": "^3.6.0"
11
+ "eslint-plugin-sonarjs": "^3.0.4",
12
+ "prettier": "^3.6.2"
13
13
  },
14
14
  "scripts": {"morning": "bundle update && bundle clean --force && bun update && bundle exec immosquare-cleaner 'package.json'"}
15
15
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: immosquare-cleaner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.71
4
+ version: 0.1.73
5
5
  platform: ruby
6
6
  authors:
7
7
  - immosquare
@@ -146,6 +146,7 @@ files:
146
146
  - lib/immosquare-cleaner/railtie.rb
147
147
  - lib/immosquare-cleaner/version.rb
148
148
  - lib/tasks/immosquare_cleaner.rake
149
+ - linters/erb-lint-3.2.6.yml
149
150
  - linters/erb-lint-3.4.1.yml
150
151
  - linters/erb-lint.yml
151
152
  - linters/eslint.config.mjs
@@ -176,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
177
  - !ruby/object:Gem::Version
177
178
  version: '0'
178
179
  requirements: []
179
- rubygems_version: 3.7.0
180
+ rubygems_version: 3.7.1
180
181
  specification_version: 4
181
182
  summary: A gem to lint and organize files in a Rails application.
182
183
  test_files: []