ruby-lsp-refactor 0.1.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.
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "minitest/autorun"
4
+ require "ruby_lsp/test_helper"
5
+
6
+ module RubyLsp
7
+ module Refactor
8
+ class VariableListenerTest < Minitest::Test
9
+ include RubyLsp::Refactor::TestHelper
10
+
11
+ def find_action(actions, title_pattern)
12
+ actions.find { |a| a.title.match?(title_pattern) }
13
+ end
14
+
15
+ def all_edits(action)
16
+ action.edit.changes.values.flatten
17
+ end
18
+
19
+ # ===========================================================================
20
+ # 1. Inline variable
21
+ # ===========================================================================
22
+
23
+ def test_inline_variable_replaces_reads_and_deletes_assignment
24
+ source = <<~RUBY
25
+ result = user.calculate
26
+ puts result
27
+ log result
28
+ RUBY
29
+
30
+ actions = code_actions_for(source, line: 0)
31
+ action = find_action(actions, /Inline variable/)
32
+ refute_nil action
33
+
34
+ edits = all_edits(action)
35
+ # 1 delete + 2 replacements
36
+ assert_equal 3, edits.size
37
+
38
+ delete_edit = edits.find { |e| e.new_text == "" }
39
+ refute_nil delete_edit
40
+ assert_equal 0, delete_edit.range.start.line
41
+
42
+ replace_edits = edits.reject { |e| e.new_text == "" }
43
+ replace_edits.each { |e| assert_equal "user.calculate", e.new_text }
44
+ end
45
+
46
+ def test_inline_variable_title_includes_variable_name
47
+ source = "total = price * qty\nputs total\n"
48
+ actions = code_actions_for(source, line: 0)
49
+ action = find_action(actions, /Inline variable/)
50
+ refute_nil action
51
+ assert_match(/total/, action.title)
52
+ end
53
+
54
+ def test_does_not_offer_inline_when_cursor_not_on_assignment
55
+ source = <<~RUBY
56
+ result = user.calculate
57
+ puts result
58
+ RUBY
59
+
60
+ # Cursor on the `puts` line, not the assignment.
61
+ actions = code_actions_for(source, line: 1)
62
+ assert_nil find_action(actions, /Inline variable/)
63
+ end
64
+
65
+ # ===========================================================================
66
+ # 2. Extract local variable
67
+ # ===========================================================================
68
+
69
+ def test_extract_local_variable_inserts_assignment_above
70
+ source = "user.full_name.upcase\n"
71
+ actions = code_actions_for(source, line: 0)
72
+ action = find_action(actions, "Extract local variable")
73
+ refute_nil action
74
+
75
+ edits = all_edits(action)
76
+ assert_equal 2, edits.size
77
+
78
+ insert_edit = edits.find { |e| e.new_text.include?("variable =") }
79
+ replace_edit = edits.find { |e| e.new_text == "variable" }
80
+
81
+ refute_nil insert_edit
82
+ refute_nil replace_edit
83
+
84
+ assert_match(/variable = user\.full_name\.upcase/, insert_edit.new_text)
85
+ assert_equal 0, insert_edit.range.start.line
86
+ end
87
+
88
+ # ---------------------------------------------------------------------------
89
+ # Resilience
90
+ # ---------------------------------------------------------------------------
91
+
92
+ def test_does_not_raise_on_empty_source
93
+ assert_silent { code_actions_for("", line: 0) }
94
+ end
95
+ end
96
+ end
97
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-lsp-refactor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Aboobacker MK
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ruby-lsp
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0.17'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '2'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0.17'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '2'
32
+ - !ruby/object:Gem::Dependency
33
+ name: prism
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0.29'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0.29'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '5.0'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '5.0'
60
+ - !ruby/object:Gem::Dependency
61
+ name: rake
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '13.0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '13.0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: rubocop
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '1.21'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.21'
88
+ description: A ruby-lsp add-on that provides safe, AST-driven refactoring operations
89
+ (post-conditional conversion, inline variable, etc.) natively within any LSP-supported
90
+ IDE.
91
+ email:
92
+ - aboobackervyd@gmail.com
93
+ executables: []
94
+ extensions: []
95
+ extra_rdoc_files: []
96
+ files:
97
+ - CHANGELOG.md
98
+ - LICENSE.txt
99
+ - README.md
100
+ - Rakefile
101
+ - lib/ruby/lsp/refactor.rb
102
+ - lib/ruby/lsp/refactor/version.rb
103
+ - lib/ruby_lsp/ruby_lsp_refactor/addon.rb
104
+ - lib/ruby_lsp/ruby_lsp_refactor/listeners/array_listener.rb
105
+ - lib/ruby_lsp/ruby_lsp_refactor/listeners/conditional_listener.rb
106
+ - lib/ruby_lsp/ruby_lsp_refactor/listeners/hash_listener.rb
107
+ - lib/ruby_lsp/ruby_lsp_refactor/listeners/method_listener.rb
108
+ - lib/ruby_lsp/ruby_lsp_refactor/listeners/string_listener.rb
109
+ - lib/ruby_lsp/ruby_lsp_refactor/listeners/variable_listener.rb
110
+ - lib/ruby_lsp/ruby_lsp_refactor/support/node_helpers.rb
111
+ - lib/ruby_lsp/test_helper.rb
112
+ - sig/ruby/lsp/refactor.rbs
113
+ - test/ruby_lsp_refactor/array_listener_test.rb
114
+ - test/ruby_lsp_refactor/conditional_listener_test.rb
115
+ - test/ruby_lsp_refactor/hash_listener_test.rb
116
+ - test/ruby_lsp_refactor/method_listener_test.rb
117
+ - test/ruby_lsp_refactor/string_listener_test.rb
118
+ - test/ruby_lsp_refactor/variable_listener_test.rb
119
+ homepage: https://github.com/tachyons/ruby-lsp-refactor
120
+ licenses:
121
+ - MIT
122
+ metadata:
123
+ homepage_uri: https://github.com/tachyons/ruby-lsp-refactor
124
+ source_code_uri: https://github.com/tachyons/ruby-lsp-refactor
125
+ changelog_uri: https://github.com/tachyons/ruby-lsp-refactor/blob/main/CHANGELOG.md
126
+ rdoc_options: []
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: 3.2.0
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubygems_version: 4.0.10
141
+ specification_version: 4
142
+ summary: AST-driven refactoring code actions for the ruby-lsp ecosystem.
143
+ test_files: []