synvert 0.11.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a6497202b00d143ebee65b85a45fb0fa0e1130d44984955f817799c16376424
4
- data.tar.gz: e0befd502bd9414ef93ad6368044983a5f5d9a677a86d2ff63de637ab1740ece
3
+ metadata.gz: 5087621370472c9553a89bfe5b75dfed595f07516adba6a421a6b44cffb33e9c
4
+ data.tar.gz: bd29c43ab204f043121b5ce85e49bdc18b8eff2f3ca707a48833d2b773634243
5
5
  SHA512:
6
- metadata.gz: cfa2c293ba1330dcccb3cd2ee43bd1ac47d45a8e0ce011615fcef575842405f27fec6b070061d6567461046a2d7c445ee0440b903baca3ca3c2c47bd00399577
7
- data.tar.gz: 79d690b0576dc8083bfc451003ef50d8f3ab968908b774a10f6613a77172751979d93b9746b0e80617998ca0efc84a29ec4b5a61af907b17835c07af440dceaf
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: [], 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
@@ -108,12 +95,19 @@ module Synvert
108
95
  @options[:command] = 'sync'
109
96
  end
110
97
  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)
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(default_snippets_path, 'lib/**/*.rb')).each { |file| require file }
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 default_snippets_path
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
- else
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
- 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
- }
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
- puts JSON.generate(output)
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(default_snippets_path, "lib/#{@options[:snippet_name]}.rb"))
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
- 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
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(default_snippets_path).sync
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
- def default_snippets_path
247
- File.join(ENV['HOME'], '.synvert')
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Synvert
4
- VERSION = '0.11.0'
4
+ VERSION = '0.14.0'
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.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.11.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-02-15 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.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.20.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.1.4
126
+ rubygems_version: 3.0.3
127
127
  signing_key:
128
128
  specification_version: 4
129
129
  summary: synvert = syntax + convert.