synvert 0.11.0 → 0.14.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/CHANGELOG.md +19 -0
- data/lib/synvert/cli.rb +121 -61
- data/lib/synvert/version.rb +1 -1
- data/spec/synvert/snippet_spec.rb +9 -9
- data/synvert.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5087621370472c9553a89bfe5b75dfed595f07516adba6a421a6b44cffb33e9c
|
|
4
|
+
data.tar.gz: bd29c43ab204f043121b5ce85e49bdc18b8eff2f3ca707a48833d2b773634243
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d3bf4ec96210d9a4dbf1804267809f1e19e9de8147ff3998831428ab3397d23bf38b24519a70850dbd20141b6b0172b636dabaa425c1bf079374e4578f5e36e4
|
|
7
|
+
data.tar.gz: 6b90bd131751a8a50956cdadc21572e70a938a975b71e7deb97c5f48c04184f55b16b3f1fe5b06d95de746df40da3275ce2a19cb50222cf0ebdfc8a3496317c7
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 0.14.0 (2021-03-13)
|
|
4
|
+
|
|
5
|
+
* Add CLI option `--format`
|
|
6
|
+
* Run one snippet once
|
|
7
|
+
|
|
8
|
+
## 0.13.0 (2021-03-02)
|
|
9
|
+
|
|
10
|
+
* Use `ENV['SYNVERT_SNIPPETS_HOME']` to change default snippets home
|
|
11
|
+
* Display snippet source code for showing a snippet
|
|
12
|
+
|
|
13
|
+
## 0.12.0 (2021-03-01)
|
|
14
|
+
|
|
15
|
+
* Display `synvert-core` and `parser` version
|
|
16
|
+
* Generate a new snippet
|
|
17
|
+
|
|
18
|
+
## 0.11.1 (2021-02-20)
|
|
19
|
+
|
|
20
|
+
* Use `Synvert::VERSION` instead of `Synvert::Core::VERSION`
|
|
21
|
+
|
|
3
22
|
## 0.11.0 (2021-02-15)
|
|
4
23
|
|
|
5
24
|
* Add `--list-all` option
|
data/lib/synvert/cli.rb
CHANGED
|
@@ -15,7 +15,7 @@ module Synvert
|
|
|
15
15
|
|
|
16
16
|
# Initialize a CLI.
|
|
17
17
|
def initialize
|
|
18
|
-
@options = { command: 'run', custom_snippet_paths: [],
|
|
18
|
+
@options = { command: 'run', custom_snippet_paths: [], format: 'plain' }
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
# Run the CLI.
|
|
@@ -28,9 +28,6 @@ module Synvert
|
|
|
28
28
|
when 'list'
|
|
29
29
|
load_rewriters
|
|
30
30
|
list_available_rewriters
|
|
31
|
-
when 'list-all'
|
|
32
|
-
load_rewriters
|
|
33
|
-
list_all_rewriters_in_json
|
|
34
31
|
when 'open'
|
|
35
32
|
open_rewriter
|
|
36
33
|
when 'query'
|
|
@@ -41,19 +38,12 @@ module Synvert
|
|
|
41
38
|
show_rewriter
|
|
42
39
|
when 'sync'
|
|
43
40
|
sync_snippets
|
|
41
|
+
when 'generate'
|
|
42
|
+
generate_snippet
|
|
44
43
|
else
|
|
45
44
|
# run
|
|
46
45
|
load_rewriters
|
|
47
|
-
|
|
48
|
-
puts "===== #{snippet_name} started ====="
|
|
49
|
-
group, name = snippet_name.split('/')
|
|
50
|
-
rewriter = Core::Rewriter.call group, name
|
|
51
|
-
rewriter.warnings.each do |warning|
|
|
52
|
-
puts '[Warn] ' + warning.message
|
|
53
|
-
end
|
|
54
|
-
puts rewriter.todo if rewriter.todo
|
|
55
|
-
puts "===== #{snippet_name} done ====="
|
|
56
|
-
end
|
|
46
|
+
run_snippet
|
|
57
47
|
end
|
|
58
48
|
true
|
|
59
49
|
rescue SystemExit
|
|
@@ -80,9 +70,6 @@ module Synvert
|
|
|
80
70
|
'load custom snippets, snippet paths can be local file path or remote http url' do |snippet_paths|
|
|
81
71
|
@options[:custom_snippet_paths] = snippet_paths.split(',').map(&:strip)
|
|
82
72
|
end
|
|
83
|
-
opts.on '--list-all', 'list all available snippets name and description in json format' do
|
|
84
|
-
@options[:command] = 'list-all'
|
|
85
|
-
end
|
|
86
73
|
opts.on '-l', '--list', 'list all available snippets' do
|
|
87
74
|
@options[:command] = 'list'
|
|
88
75
|
end
|
|
@@ -108,12 +95,19 @@ module Synvert
|
|
|
108
95
|
@options[:command] = 'sync'
|
|
109
96
|
end
|
|
110
97
|
opts.on '-r',
|
|
111
|
-
'--run
|
|
112
|
-
'run specified
|
|
113
|
-
@options[:
|
|
98
|
+
'--run SNIPPET_NAME',
|
|
99
|
+
'run specified snippet, e.g. ruby/new_hash_syntax' do |snippet_name|
|
|
100
|
+
@options[:snippet_name] = snippet_name
|
|
101
|
+
end
|
|
102
|
+
opts.on '-g', '--generate NEW_SNIPPET_NAME', 'generate a new snippet' do |name|
|
|
103
|
+
@options[:command] = 'generate'
|
|
104
|
+
@options[:snippet_name] = name
|
|
105
|
+
end
|
|
106
|
+
opts.on '-f', '--format FORMAT', 'output format' do |format|
|
|
107
|
+
@options[:format] = format
|
|
114
108
|
end
|
|
115
109
|
opts.on '-v', '--version', 'show this version' do
|
|
116
|
-
puts Core::VERSION
|
|
110
|
+
puts "#{VERSION} (with synvert-core #{Core::VERSION} and parser #{Parser::VERSION})"
|
|
117
111
|
exit
|
|
118
112
|
end
|
|
119
113
|
end
|
|
@@ -131,7 +125,7 @@ module Synvert
|
|
|
131
125
|
|
|
132
126
|
# Load all rewriters.
|
|
133
127
|
def load_rewriters
|
|
134
|
-
Dir.glob(File.join(
|
|
128
|
+
Dir.glob(File.join(default_snippets_home, 'lib/**/*.rb')).each { |file| require file }
|
|
135
129
|
|
|
136
130
|
@options[:custom_snippet_paths].each do |snippet_path|
|
|
137
131
|
if /^http/.match?(snippet_path)
|
|
@@ -142,7 +136,7 @@ module Synvert
|
|
|
142
136
|
end
|
|
143
137
|
end
|
|
144
138
|
rescue StandardError
|
|
145
|
-
FileUtils.rm_rf
|
|
139
|
+
FileUtils.rm_rf default_snippets_home
|
|
146
140
|
retry
|
|
147
141
|
end
|
|
148
142
|
|
|
@@ -150,7 +144,10 @@ module Synvert
|
|
|
150
144
|
def list_available_rewriters
|
|
151
145
|
if Core::Rewriter.availables.empty?
|
|
152
146
|
puts 'There is no snippet under ~/.synvert, please run `synvert --sync` to fetch snippets.'
|
|
153
|
-
|
|
147
|
+
return
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
if plain_output?
|
|
154
151
|
Core::Rewriter.availables.each do |group, rewriters|
|
|
155
152
|
puts group
|
|
156
153
|
rewriters.each do |name, _rewriter|
|
|
@@ -158,29 +155,22 @@ module Synvert
|
|
|
158
155
|
end
|
|
159
156
|
end
|
|
160
157
|
puts
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
rewriter.process_with_sandbox
|
|
174
|
-
output << {
|
|
175
|
-
group: group,
|
|
176
|
-
name: name,
|
|
177
|
-
description: rewriter.description,
|
|
178
|
-
sub_snippets: rewriter.sub_snippets.map(&:name)
|
|
179
|
-
}
|
|
158
|
+
elsif json_output?
|
|
159
|
+
output = []
|
|
160
|
+
Core::Rewriter.availables.each do |group, rewriters|
|
|
161
|
+
rewriters.each do |name, rewriter|
|
|
162
|
+
rewriter.process_with_sandbox
|
|
163
|
+
output << {
|
|
164
|
+
group: group,
|
|
165
|
+
name: name,
|
|
166
|
+
description: rewriter.description,
|
|
167
|
+
sub_snippets: rewriter.sub_snippets.map(&:name)
|
|
168
|
+
}
|
|
169
|
+
end
|
|
180
170
|
end
|
|
181
|
-
end
|
|
182
171
|
|
|
183
|
-
|
|
172
|
+
puts JSON.generate(output)
|
|
173
|
+
end
|
|
184
174
|
end
|
|
185
175
|
|
|
186
176
|
# Open one rewriter.
|
|
@@ -188,7 +178,7 @@ module Synvert
|
|
|
188
178
|
editor = [ENV['SYNVERT_EDITOR'], ENV['EDITOR']].find { |e| !e.nil? && !e.empty? }
|
|
189
179
|
return puts 'To open a synvert snippet, set $EDITOR or $SYNVERT_EDITOR' unless editor
|
|
190
180
|
|
|
191
|
-
path = File.expand_path(File.join(
|
|
181
|
+
path = File.expand_path(File.join(default_snippets_home, "lib/#{@options[:snippet_name]}.rb"))
|
|
192
182
|
if File.exist? path
|
|
193
183
|
system editor, path
|
|
194
184
|
else
|
|
@@ -216,18 +206,9 @@ module Synvert
|
|
|
216
206
|
|
|
217
207
|
# Show and print one rewriter.
|
|
218
208
|
def show_rewriter
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
rewriter.process_with_sandbox
|
|
223
|
-
puts rewriter.description
|
|
224
|
-
rewriter.sub_snippets.each do |sub_rewriter|
|
|
225
|
-
puts
|
|
226
|
-
puts '=' * 80
|
|
227
|
-
puts "snippet: #{sub_rewriter.name}"
|
|
228
|
-
puts '=' * 80
|
|
229
|
-
puts sub_rewriter.description
|
|
230
|
-
end
|
|
209
|
+
path = File.expand_path(File.join(default_snippets_home, "lib/#{@options[:snippet_name]}.rb"))
|
|
210
|
+
if File.exist?(path)
|
|
211
|
+
puts File.read(path)
|
|
231
212
|
else
|
|
232
213
|
puts "snippet #{@options[:snippet_name]} not found"
|
|
233
214
|
end
|
|
@@ -235,7 +216,7 @@ module Synvert
|
|
|
235
216
|
|
|
236
217
|
# sync snippets
|
|
237
218
|
def sync_snippets
|
|
238
|
-
Snippet.new(
|
|
219
|
+
Snippet.new(default_snippets_home).sync
|
|
239
220
|
puts 'synvert snippets are synced'
|
|
240
221
|
core_version = Snippet.fetch_core_version
|
|
241
222
|
if Gem::Version.new(core_version) > Gem::Version.new(Synvert::Core::VERSION)
|
|
@@ -243,8 +224,87 @@ module Synvert
|
|
|
243
224
|
end
|
|
244
225
|
end
|
|
245
226
|
|
|
246
|
-
|
|
247
|
-
|
|
227
|
+
# run snippets
|
|
228
|
+
def run_snippet
|
|
229
|
+
snippet_name = @options[:snippet_name]
|
|
230
|
+
if plain_output?
|
|
231
|
+
puts "===== #{snippet_name} started ====="
|
|
232
|
+
group, name = snippet_name.split('/')
|
|
233
|
+
rewriter = Core::Rewriter.call group, name
|
|
234
|
+
rewriter.warnings.each do |warning|
|
|
235
|
+
puts '[Warn] ' + warning.message
|
|
236
|
+
end
|
|
237
|
+
puts rewriter.todo if rewriter.todo
|
|
238
|
+
puts "===== #{snippet_name} done ====="
|
|
239
|
+
elsif json_output?
|
|
240
|
+
group, name = snippet_name.split('/')
|
|
241
|
+
rewriter = Core::Rewriter.call group, name
|
|
242
|
+
puts JSON.generate({
|
|
243
|
+
affected_files: rewriter.affected_files.union(rewriter.sub_snippets.map(&:affected_files).reduce(:+)).to_a,
|
|
244
|
+
warnings: rewriter.warnings.union(rewriter.sub_snippets.map(&:warnings).reduce(:+)),
|
|
245
|
+
todo: rewriter.todo
|
|
246
|
+
})
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# generate a new snippet
|
|
251
|
+
def generate_snippet
|
|
252
|
+
group, name = @options[:snippet_name].split('/')
|
|
253
|
+
FileUtils.mkdir_p("lib/#{group}")
|
|
254
|
+
FileUtils.mkdir_p("spec/#{group}")
|
|
255
|
+
lib_content = <<~EOF
|
|
256
|
+
# frozen_string_literal: true
|
|
257
|
+
|
|
258
|
+
Synvert::Rewriter.new '#{group}', '#{name}' do
|
|
259
|
+
description <<~EOS
|
|
260
|
+
It converts Foo to Bar
|
|
261
|
+
|
|
262
|
+
```ruby
|
|
263
|
+
Foo
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
=>
|
|
267
|
+
|
|
268
|
+
```ruby
|
|
269
|
+
Bar
|
|
270
|
+
```
|
|
271
|
+
EOS
|
|
272
|
+
|
|
273
|
+
within_files '**/*.rb' do
|
|
274
|
+
with_node type: 'const', to_source: 'Foo' do
|
|
275
|
+
replace_with 'Bar'
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
EOF
|
|
280
|
+
spec_content = <<~EOF
|
|
281
|
+
# frozen_string_literal: true
|
|
282
|
+
|
|
283
|
+
require 'spec_helper'
|
|
284
|
+
|
|
285
|
+
RSpec.describe 'Convert Foo to Bar' do
|
|
286
|
+
let(:rewriter_name) { '#{group}/#{name}' }
|
|
287
|
+
let(:fake_file_path) { 'foobar.rb' }
|
|
288
|
+
let(:test_content) { 'Foo' }
|
|
289
|
+
let(:test_rewritten_content) { 'Bar' }
|
|
290
|
+
|
|
291
|
+
include_examples 'convertable'
|
|
292
|
+
end
|
|
293
|
+
EOF
|
|
294
|
+
File.write("lib/#{group}/#{name}.rb", lib_content)
|
|
295
|
+
File.write("spec/#{group}/#{name}_spec.rb", spec_content)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def default_snippets_home
|
|
299
|
+
ENV['SYNVERT_SNIPPETS_HOME'] || File.join(ENV['HOME'], '.synvert')
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def plain_output?
|
|
303
|
+
@options[:format] == 'plain'
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def json_output?
|
|
307
|
+
@options[:format] == 'json'
|
|
248
308
|
end
|
|
249
309
|
end
|
|
250
310
|
end
|
data/lib/synvert/version.rb
CHANGED
|
@@ -8,6 +8,15 @@ module Synvert
|
|
|
8
8
|
let(:snippet) { Snippet.new(snippets_path) }
|
|
9
9
|
after { FileUtils.rmdir(snippets_path) if File.exist?(snippets_path) }
|
|
10
10
|
|
|
11
|
+
describe '.fetch_core_version' do
|
|
12
|
+
it 'gets remote version' do
|
|
13
|
+
stub_request(:get, 'https://rubygems.org/api/v1/versions/synvert-core.json').to_return(
|
|
14
|
+
body: '[{"number":"0.4.2"}]'
|
|
15
|
+
)
|
|
16
|
+
expect(Snippet.fetch_core_version).to eq '0.4.2'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
11
20
|
describe 'sync' do
|
|
12
21
|
it 'git clones snippets' do
|
|
13
22
|
expect(Kernel).to receive(:system).with(
|
|
@@ -23,14 +32,5 @@ module Synvert
|
|
|
23
32
|
FileUtils.cd File.dirname(__FILE__)
|
|
24
33
|
end
|
|
25
34
|
end
|
|
26
|
-
|
|
27
|
-
describe 'fetch_core_version' do
|
|
28
|
-
it 'gets remote version' do
|
|
29
|
-
stub_request(:get, 'https://rubygems.org/api/v1/versions/synvert-core.json').to_return(
|
|
30
|
-
body: '[{"number":"0.4.2"}]'
|
|
31
|
-
)
|
|
32
|
-
expect(snippet.fetch_core_version).to eq '0.4.2'
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
35
|
end
|
|
36
36
|
end
|
data/synvert.gemspec
CHANGED
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
spec.require_paths = ['lib']
|
|
21
21
|
spec.post_install_message = 'Please run `synvert --sync` first to sync snippets remotely.'
|
|
22
22
|
|
|
23
|
-
spec.add_runtime_dependency 'synvert-core', '>= 0.
|
|
23
|
+
spec.add_runtime_dependency 'synvert-core', '>= 0.22.0'
|
|
24
24
|
|
|
25
25
|
spec.add_development_dependency 'bundler'
|
|
26
26
|
spec.add_development_dependency 'rake'
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: synvert
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.14.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Richard Huang
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-03-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: synvert-core
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.
|
|
19
|
+
version: 0.22.0
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.
|
|
26
|
+
version: 0.22.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: bundler
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -123,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
124
|
version: '0'
|
|
125
125
|
requirements: []
|
|
126
|
-
rubygems_version: 3.
|
|
126
|
+
rubygems_version: 3.0.3
|
|
127
127
|
signing_key:
|
|
128
128
|
specification_version: 4
|
|
129
129
|
summary: synvert = syntax + convert.
|