synvert 0.11.1 → 0.14.1

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: 4ffaa68ee9700864133744f9c3a3ad39424f955d934dc30a59e097865aaff915
4
- data.tar.gz: 9f05b924aabfc116b108235b448114fb84cf35bf867e13d217da6210a736d0a2
3
+ metadata.gz: e99142ef7ed4127f66b23dba5d3ab0ec04d2b8edb315ac48945c15fb6056c294
4
+ data.tar.gz: dbcbfffa5f570522d6385660663a8438d55ae7216f49cd8964787b31e916aa88
5
5
  SHA512:
6
- metadata.gz: 4c1fb489d17c2588442a5b5f6c195d39b9001250f4a0228ee734171f94260265d552a5fa4690b2349a1f57a817086dc693b40b29d9556d3764b130b4f3247727
7
- data.tar.gz: 2af58834be39f558a11dcc43f752a1949b478711a2f8026e301ddf45e817391bdf161e7b0d91239f2628a268ad48d3904f618c4de4dbfa587509d0e4cb0a4e36
6
+ metadata.gz: 5346a5cc7fba0bc0aba045206c716d98fc8ac46b5beb109dffa62885e6caa5b09f0e31e9a84b3df324e8dae96f30164782f8211deb66b29a0890ce6b71efbedc
7
+ data.tar.gz: f2b2b6a0ea082757d333a6c68aabcb03d1ae8ec99a5b95cbe5013bb52af5a4adbcd95dd278103f7f125dea2dc04cdf8ad72ddf70077a85c25af8bdf36f9955b0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.14.1 (2021-03-13)
4
+
5
+ * Fix reduce on empty array
6
+
7
+ ## 0.14.0 (2021-03-13)
8
+
9
+ * Add CLI option `--format`
10
+ * Run one snippet once
11
+
12
+ ## 0.13.0 (2021-03-02)
13
+
14
+ * Use `ENV['SYNVERT_SNIPPETS_HOME']` to change default snippets home
15
+ * Display snippet source code for showing a snippet
16
+
17
+ ## 0.12.0 (2021-03-01)
18
+
19
+ * Display `synvert-core` and `parser` version
20
+ * Generate a new snippet
21
+
3
22
  ## 0.11.1 (2021-02-20)
4
23
 
5
24
  * Use `Synvert::VERSION` instead of `Synvert::Core::VERSION`
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: [], snippet_names: [] }
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
- @options[:snippet_names].each do |snippet_name|
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
@@ -107,13 +94,18 @@ module Synvert
107
94
  opts.on '--sync', 'sync snippets' do
108
95
  @options[:command] = 'sync'
109
96
  end
110
- opts.on '-r',
111
- '--run SNIPPET_NAMES',
112
- 'run specified snippets, each SNIPPET_NAME is combined by group and name, e.g. ruby/new_hash_syntax,ruby/new_lambda_syntax' do |snippet_names|
113
- @options[:snippet_names] = snippet_names.split(',').map(&:strip)
97
+ opts.on '-r', '--run SNIPPET_NAME', 'run specified snippet, e.g. ruby/new_hash_syntax' do |snippet_name|
98
+ @options[:snippet_name] = snippet_name
99
+ end
100
+ opts.on '-g', '--generate NEW_SNIPPET_NAME', 'generate a new snippet' do |name|
101
+ @options[:command] = 'generate'
102
+ @options[:snippet_name] = name
103
+ end
104
+ opts.on '-f', '--format FORMAT', 'output format' do |format|
105
+ @options[:format] = format
114
106
  end
115
107
  opts.on '-v', '--version', 'show this version' do
116
- puts VERSION
108
+ puts "#{VERSION} (with synvert-core #{Core::VERSION} and parser #{Parser::VERSION})"
117
109
  exit
118
110
  end
119
111
  end
@@ -131,7 +123,7 @@ module Synvert
131
123
 
132
124
  # Load all rewriters.
133
125
  def load_rewriters
134
- Dir.glob(File.join(default_snippets_path, 'lib/**/*.rb')).each { |file| require file }
126
+ Dir.glob(File.join(default_snippets_home, 'lib/**/*.rb')).each { |file| require file }
135
127
 
136
128
  @options[:custom_snippet_paths].each do |snippet_path|
137
129
  if /^http/.match?(snippet_path)
@@ -142,7 +134,7 @@ module Synvert
142
134
  end
143
135
  end
144
136
  rescue StandardError
145
- FileUtils.rm_rf default_snippets_path
137
+ FileUtils.rm_rf default_snippets_home
146
138
  retry
147
139
  end
148
140
 
@@ -150,7 +142,10 @@ module Synvert
150
142
  def list_available_rewriters
151
143
  if Core::Rewriter.availables.empty?
152
144
  puts 'There is no snippet under ~/.synvert, please run `synvert --sync` to fetch snippets.'
153
- else
145
+ return
146
+ end
147
+
148
+ if plain_output?
154
149
  Core::Rewriter.availables.each do |group, rewriters|
155
150
  puts group
156
151
  rewriters.each do |name, _rewriter|
@@ -158,29 +153,22 @@ module Synvert
158
153
  end
159
154
  end
160
155
  puts
161
- end
162
- end
163
-
164
- def list_all_rewriters_in_json
165
- if Core::Rewriter.availables.empty?
166
- puts 'There is no snippet under ~/.synvert, please run `synvert --sync` to fetch snippets.'
167
- return
168
- end
169
-
170
- output = []
171
- Core::Rewriter.availables.each do |group, rewriters|
172
- rewriters.each do |name, rewriter|
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
- }
156
+ elsif json_output?
157
+ output = []
158
+ Core::Rewriter.availables.each do |group, rewriters|
159
+ rewriters.each do |name, rewriter|
160
+ rewriter.process_with_sandbox
161
+ output << {
162
+ group: group,
163
+ name: name,
164
+ description: rewriter.description,
165
+ sub_snippets: rewriter.sub_snippets.map(&:name)
166
+ }
167
+ end
180
168
  end
181
- end
182
169
 
183
- puts JSON.generate(output)
170
+ puts JSON.generate(output)
171
+ end
184
172
  end
185
173
 
186
174
  # Open one rewriter.
@@ -188,7 +176,7 @@ module Synvert
188
176
  editor = [ENV['SYNVERT_EDITOR'], ENV['EDITOR']].find { |e| !e.nil? && !e.empty? }
189
177
  return puts 'To open a synvert snippet, set $EDITOR or $SYNVERT_EDITOR' unless editor
190
178
 
191
- path = File.expand_path(File.join(default_snippets_path, "lib/#{@options[:snippet_name]}.rb"))
179
+ path = File.expand_path(File.join(default_snippets_home, "lib/#{@options[:snippet_name]}.rb"))
192
180
  if File.exist? path
193
181
  system editor, path
194
182
  else
@@ -216,18 +204,9 @@ module Synvert
216
204
 
217
205
  # Show and print one rewriter.
218
206
  def show_rewriter
219
- group, name = @options[:snippet_name].split('/')
220
- rewriter = Core::Rewriter.fetch(group, name)
221
- if rewriter
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
207
+ path = File.expand_path(File.join(default_snippets_home, "lib/#{@options[:snippet_name]}.rb"))
208
+ if File.exist?(path)
209
+ puts File.read(path)
231
210
  else
232
211
  puts "snippet #{@options[:snippet_name]} not found"
233
212
  end
@@ -235,7 +214,7 @@ module Synvert
235
214
 
236
215
  # sync snippets
237
216
  def sync_snippets
238
- Snippet.new(default_snippets_path).sync
217
+ Snippet.new(default_snippets_home).sync
239
218
  puts 'synvert snippets are synced'
240
219
  core_version = Snippet.fetch_core_version
241
220
  if Gem::Version.new(core_version) > Gem::Version.new(Synvert::Core::VERSION)
@@ -243,8 +222,88 @@ module Synvert
243
222
  end
244
223
  end
245
224
 
246
- def default_snippets_path
247
- File.join(ENV['HOME'], '.synvert')
225
+ # run snippets
226
+ def run_snippet
227
+ snippet_name = @options[:snippet_name]
228
+ if plain_output?
229
+ puts "===== #{snippet_name} started ====="
230
+ group, name = snippet_name.split('/')
231
+ rewriter = Core::Rewriter.call group, name
232
+ rewriter.warnings.each do |warning|
233
+ puts '[Warn] ' + warning.message
234
+ end
235
+ puts rewriter.todo if rewriter.todo
236
+ puts "===== #{snippet_name} done ====="
237
+ elsif json_output?
238
+ group, name = snippet_name.split('/')
239
+ rewriter = Core::Rewriter.call group, name
240
+ output = {
241
+ affected_files: rewriter.affected_files.union(rewriter.sub_snippets.map(&:affected_files).reduce([], :+)).to_a,
242
+ warnings: rewriter.warnings.union(rewriter.sub_snippets.map(&:warnings).reduce([], :+)),
243
+ todo: rewriter.todo
244
+ }
245
+ puts JSON.generate(output)
246
+ end
247
+ end
248
+
249
+ # generate a new snippet
250
+ def generate_snippet
251
+ group, name = @options[:snippet_name].split('/')
252
+ FileUtils.mkdir_p("lib/#{group}")
253
+ FileUtils.mkdir_p("spec/#{group}")
254
+ lib_content = <<~EOF
255
+ # frozen_string_literal: true
256
+
257
+ Synvert::Rewriter.new '#{group}', '#{name}' do
258
+ description <<~EOS
259
+ It converts Foo to Bar
260
+
261
+ ```ruby
262
+ Foo
263
+ ```
264
+
265
+ =>
266
+
267
+ ```ruby
268
+ Bar
269
+ ```
270
+ EOS
271
+
272
+ within_files '**/*.rb' do
273
+ with_node type: 'const', to_source: 'Foo' do
274
+ replace_with 'Bar'
275
+ end
276
+ end
277
+ end
278
+ EOF
279
+ spec_content = <<~EOF
280
+ # frozen_string_literal: true
281
+
282
+ require 'spec_helper'
283
+
284
+ RSpec.describe 'Convert Foo to Bar' do
285
+ let(:rewriter_name) { '#{group}/#{name}' }
286
+ let(:fake_file_path) { 'foobar.rb' }
287
+ let(:test_content) { 'Foo' }
288
+ let(:test_rewritten_content) { 'Bar' }
289
+
290
+ include_examples 'convertable'
291
+ end
292
+ EOF
293
+ File.write("lib/#{group}/#{name}.rb", lib_content)
294
+ File.write("spec/#{group}/#{name}_spec.rb", spec_content)
295
+ end
296
+
297
+ def default_snippets_home
298
+ ENV['SYNVERT_SNIPPETS_HOME'] || File.join(ENV['HOME'], '.synvert')
299
+ end
300
+
301
+ def plain_output?
302
+ @options[:format] == 'plain'
303
+ end
304
+
305
+ def json_output?
306
+ @options[:format] == 'json'
248
307
  end
249
308
  end
250
309
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Synvert
4
- VERSION = '0.11.1'
4
+ VERSION = '0.14.1'
5
5
  end
@@ -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.20.1'
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.11.1
4
+ version: 0.14.1
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-02-20 00:00:00.000000000 Z
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.20.1
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.20.1
26
+ version: 0.22.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement