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 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.