ruby_crystal_codemod 0.1.0 → 0.1.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 +4 -4
- data/.circleci/config.yml +0 -16
- data/README.md +6 -3
- data/lib/ruby_crystal_codemod.rb +1 -0
- data/lib/ruby_crystal_codemod/command.rb +19 -12
- data/lib/ruby_crystal_codemod/post_process_crystal.rb +46 -0
- data/lib/ruby_crystal_codemod/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bdee5c536c92fee24314a9164c4284bf95434d0420aef21fb43cc16a838bce3
|
4
|
+
data.tar.gz: f408e7e716bc30bbec7fc22af88755f44831f3e01bf1e1fd314485b08706d491
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1271dce196b637376838ab7a498cddf460ebcc4282b631dcb3c0b745ed7fc712424d17d6c38e7968fc65bad7b0b35d566c839f6c9cb882e11719fcbc4ed882fb
|
7
|
+
data.tar.gz: dbf1c4d4b43162a6f93391aeb7d3d63a84c1566ba9d5b203374359b4967b69a7d0bc8e421df896b8ebc723d0460a99531519a06cf79109f03d6be0954f8873e9
|
data/.circleci/config.yml
CHANGED
@@ -33,15 +33,6 @@
|
|
33
33
|
name: Bundle Install
|
34
34
|
command: bundle check || bundle install
|
35
35
|
|
36
|
-
# Restore crystal cache
|
37
|
-
- restore_cache:
|
38
|
-
keys:
|
39
|
-
- crystal-shards-{{ checksum "util/post_process_crystal/shard.lock" }}
|
40
|
-
|
41
|
-
- run:
|
42
|
-
name: Compile ./util/post_process tool
|
43
|
-
command: ./bin/compile_post_process
|
44
|
-
|
45
36
|
- run:
|
46
37
|
name: Run rspec
|
47
38
|
command: |
|
@@ -58,13 +49,6 @@
|
|
58
49
|
command: |
|
59
50
|
bundle exec rufo -c lib/ spec/lib/
|
60
51
|
|
61
|
-
# Store crystal cache
|
62
|
-
- save_cache:
|
63
|
-
key: crystal-shards-{{ checksum "util/post_process_crystal/shard.lock" }}
|
64
|
-
paths:
|
65
|
-
- util/post_process_crystal/lib/
|
66
|
-
- util/post_process_crystal/shard.lock
|
67
|
-
|
68
52
|
# Store bundle cache
|
69
53
|
- save_cache:
|
70
54
|
key: bundler-packages-v2-{{ checksum "ruby-version-for-ci.txt" }}-{{ checksum "ruby_crystal_codemod.gemspec" }}
|
data/README.md
CHANGED
@@ -8,7 +8,12 @@ This project is a fork of [Rufo](https://github.com/ruby-formatter/rufo). (Rufo
|
|
8
8
|
|
9
9
|
The formatting rules have been modified in an attempt to produce some semi-valid Crystal code. Then you need to add some type annotations and fix any other issues manually. See the [Crystal for Rubyists](https://github.com/crystal-lang/crystal/wiki/Crystal-for-Rubyists) wiki page to learn more about the syntax differences.
|
10
10
|
|
11
|
-
> Ruby => Crystal Codemod / Rufo supports all Ruby versions >= 2.4
|
11
|
+
> Ruby => Crystal Codemod / Rufo supports all Ruby versions >= 2.4.5, due to a bug in Ruby's Ripper parser.
|
12
|
+
|
13
|
+
## Requirements
|
14
|
+
|
15
|
+
* Ruby >= `2.4.5`
|
16
|
+
* [Crystal](https://crystal-lang.org/install/) >= `0.31.1`
|
12
17
|
|
13
18
|
## Installation
|
14
19
|
|
@@ -45,8 +50,6 @@ When transpiling a Ruby file into Crystal, the transpiler will remove all of the
|
|
45
50
|
|
46
51
|
The `BEGIN` / `END` comments can start with either `#~#` or `# ~#`. (Code formatters / linters often enforce a space after the `#` character for comments.)
|
47
52
|
|
48
|
-
> This comment post-processing step is done by a Crystal program in `./util/post_process_crystal`. Run `./bin/compile_post_process` to compile the binary at `./util/post_process`.
|
49
|
-
|
50
53
|
For example, here's how you can define a class that works for both Ruby and Crystal:
|
51
54
|
(Crystal requires type annotations here.)
|
52
55
|
|
data/lib/ruby_crystal_codemod.rb
CHANGED
@@ -17,3 +17,4 @@ require_relative "ruby_crystal_codemod/settings"
|
|
17
17
|
require_relative "ruby_crystal_codemod/formatter"
|
18
18
|
require_relative "ruby_crystal_codemod/version"
|
19
19
|
require_relative "ruby_crystal_codemod/file_finder"
|
20
|
+
require_relative "ruby_crystal_codemod/post_process_crystal"
|
@@ -20,6 +20,7 @@ class RubyCrystalCodemod::Command
|
|
20
20
|
@dot_file = RubyCrystalCodemod::DotFile.new
|
21
21
|
@squiggly_warning_files = []
|
22
22
|
@logger = RubyCrystalCodemod::Logger.new(loglevel)
|
23
|
+
@post_processor = PostProcessCrystal.new
|
23
24
|
end
|
24
25
|
|
25
26
|
def exit_code(status_code)
|
@@ -113,18 +114,24 @@ class RubyCrystalCodemod::Command
|
|
113
114
|
logger.log("Format: #{filename} => #{crystal_filename}")
|
114
115
|
end
|
115
116
|
|
116
|
-
# Run the post-processing
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
end
|
117
|
+
# Run the post-processing step to remove Ruby code and uncomment Crystal.
|
118
|
+
@post_processor.filename = crystal_filename
|
119
|
+
@post_processor.post_process_crystal
|
120
|
+
File.write(crystal_filename, @post_processor.contents)
|
121
|
+
|
122
|
+
# UPDATE: It's difficult to package/compile the Crystal binary in a Ruby gem.
|
123
|
+
# But it was really easy to port it to Ruby!
|
124
|
+
# post_process_cmd = File.expand_path(File.join(__dir__, "../../util/post_process"))
|
125
|
+
# unless File.exist?(post_process_cmd)
|
126
|
+
# raise "Please run ./bin/compile_post_process to compile the post-processing command " \
|
127
|
+
# "at: #{post_process_cmd}"
|
128
|
+
# end
|
129
|
+
# stdout, stderr, status = Open3.capture3(post_process_cmd, crystal_filename)
|
130
|
+
# unless status.success?
|
131
|
+
# warn "'./util/post_process' failed with status: #{status.exitstatus}\n\n" \
|
132
|
+
# "stdout: #{stdout}\n\n" \
|
133
|
+
# "stderr: #{stderr}"
|
134
|
+
# end
|
128
135
|
|
129
136
|
# Format the Crystal file with the Crystal code formatter
|
130
137
|
stdout, stderr, status = Open3.capture3("crystal", "tool", "format", crystal_filename)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class PostProcessCrystal
|
2
|
+
attr_reader :filename, :contents
|
3
|
+
|
4
|
+
def self.file_read_lines(path)
|
5
|
+
File.read(path).lines.map(&:chomp)
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(filename = "")
|
9
|
+
@filename = filename
|
10
|
+
@contents = ""
|
11
|
+
end
|
12
|
+
|
13
|
+
def filename=(filename)
|
14
|
+
@filename = filename
|
15
|
+
@contents = ""
|
16
|
+
end
|
17
|
+
|
18
|
+
def post_process_crystal
|
19
|
+
@contents = +""
|
20
|
+
lines = self.class.file_read_lines(@filename)
|
21
|
+
|
22
|
+
current_lang = nil
|
23
|
+
regex = /^\s*# ?~# (?<action>(BEGIN|END)) (?<lang>(ruby|crystal))/
|
24
|
+
uncomment_regex = /^(?<indent>\s*)# ?/
|
25
|
+
lines.each do |line|
|
26
|
+
matches = regex.match(line)
|
27
|
+
if matches
|
28
|
+
case matches["action"]
|
29
|
+
when "BEGIN"
|
30
|
+
current_lang = matches["lang"]
|
31
|
+
when "END"
|
32
|
+
current_lang = nil
|
33
|
+
end
|
34
|
+
next
|
35
|
+
end
|
36
|
+
case current_lang
|
37
|
+
when "ruby"
|
38
|
+
next
|
39
|
+
when "crystal"
|
40
|
+
line = line.sub(uncomment_regex, "\\k<indent>")
|
41
|
+
end
|
42
|
+
|
43
|
+
@contents << line << "\n"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_crystal_codemod
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ary Borenszweig
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-12-
|
12
|
+
date: 2019-12-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: awesome_print
|
@@ -170,6 +170,7 @@ files:
|
|
170
170
|
- lib/ruby_crystal_codemod/file_finder.rb
|
171
171
|
- lib/ruby_crystal_codemod/formatter.rb
|
172
172
|
- lib/ruby_crystal_codemod/logger.rb
|
173
|
+
- lib/ruby_crystal_codemod/post_process_crystal.rb
|
173
174
|
- lib/ruby_crystal_codemod/settings.rb
|
174
175
|
- lib/ruby_crystal_codemod/version.rb
|
175
176
|
- rakelib/ruby_crystal_codemod.rake
|