ruby-next-core 0.14.1 → 0.15.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 +14 -0
- data/README.md +34 -0
- data/lib/.rbnext/2.1/ruby-next/language.rb +3 -0
- data/lib/.rbnext/2.3/ruby-next/commands/nextify.rb +13 -0
- data/lib/.rbnext/2.3/ruby-next/language/rewriters/base.rb +1 -1
- data/lib/ruby-next/commands/nextify.rb +13 -0
- data/lib/ruby-next/irb.rb +24 -0
- data/lib/ruby-next/language/rewriters/2.5/rescue_within_block.rb +39 -0
- data/lib/ruby-next/language/rewriters/base.rb +1 -1
- data/lib/ruby-next/language/setup.rb +1 -1
- data/lib/ruby-next/language.rb +3 -0
- data/lib/ruby-next/pry.rb +90 -0
- data/lib/ruby-next/version.rb +1 -1
- data/lib/uby-next/irb.rb +3 -0
- data/lib/uby-next/pry.rb +3 -0
- metadata +7 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 28083aad6fa1b32e00c885533e4c9c732a2401057f9ed6a939cd78ff3b1b58bb
|
|
4
|
+
data.tar.gz: 55734dd6e38699ff7e03c2723633ecd063f8fd97fe8878ca553772dbdac08ab3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7d42096d6a616470a402493894d5a7e65b7f08fd935dc8acfd0b91bf66016030edc93fd9c742aeed2fe8653dceb51c7b08c669e48ed1ff11373202cd738c9abc
|
|
7
|
+
data.tar.gz: a5740b48cb70283a3848d9415205baf7d17f4ee859562937b7f597bea0de43edba09f59bead4418284b395e6132cec92222b93cb1c1dc0c985adc3eda7b36986
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
## master
|
|
4
4
|
|
|
5
|
+
## 0.15.0 (2022-03-21)
|
|
6
|
+
|
|
7
|
+
- Support IRB ([@palkan][])
|
|
8
|
+
|
|
9
|
+
- Create empty `.rbnext` folder during `nextify` if nothing to transpile. ([@palkan][])
|
|
10
|
+
|
|
11
|
+
This would prevent from auto-transpiling a library every time when no files should be transpiled.
|
|
12
|
+
|
|
13
|
+
- Auto-transpile using the current Ruby version. ([@palkan][])
|
|
14
|
+
|
|
15
|
+
- Support Pry. ([@baygeldin][])
|
|
16
|
+
|
|
17
|
+
- Add `rescue/ensure/else` within block rewriter for Ruby < 2.5. ([@fargelus][])
|
|
18
|
+
|
|
5
19
|
## 0.14.1 (2022-01-21)
|
|
6
20
|
|
|
7
21
|
- Fix nested find patterns transpiling. ([@palkan][])
|
data/README.md
CHANGED
|
@@ -71,6 +71,8 @@ _Please, submit a PR to add your project to the list!_
|
|
|
71
71
|
- [`ruby -ruby-next`](#uby-next)
|
|
72
72
|
- [Logging & Debugging](#logging-and-debugging)
|
|
73
73
|
- [RuboCop](#rubocop)
|
|
74
|
+
- [Using with IRB](#irb)
|
|
75
|
+
- [Using with Pry](#pry)
|
|
74
76
|
- [Using with EOL Rubies](#using-with-eol-rubies)
|
|
75
77
|
- [Proposed & edge features](#proposed-and-edge-features)
|
|
76
78
|
- [Known limitations](#known-limitations)
|
|
@@ -454,6 +456,38 @@ AllCops:
|
|
|
454
456
|
|
|
455
457
|
**NOTE:** you need `ruby-next` gem available in the environment where you run RuboCop (having `ruby-next-core` is not enough).
|
|
456
458
|
|
|
459
|
+
## IRB
|
|
460
|
+
|
|
461
|
+
Ruby Next supports IRB. In order to enable edge Ruby features for your REPL, add the following line to your `.irbrc`:
|
|
462
|
+
|
|
463
|
+
```ruby
|
|
464
|
+
require "ruby-next/irb"
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Alternatively, you can require it at startup:
|
|
468
|
+
|
|
469
|
+
```sh
|
|
470
|
+
irb -r ruby-next/irb
|
|
471
|
+
# or
|
|
472
|
+
irb -ruby-next/irb
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
## Pry
|
|
476
|
+
|
|
477
|
+
Ruby Next supports Pry. In order to enable edge Ruby features for your REPL, add the following line to your `.pryrc`:
|
|
478
|
+
|
|
479
|
+
```ruby
|
|
480
|
+
require "ruby-next/pry"
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
Alternatively, you can require it at startup:
|
|
484
|
+
|
|
485
|
+
```sh
|
|
486
|
+
pry -r ruby-next/pry
|
|
487
|
+
# or
|
|
488
|
+
pry -ruby-next/pry
|
|
489
|
+
```
|
|
490
|
+
|
|
457
491
|
## Using with EOL Rubies
|
|
458
492
|
|
|
459
493
|
We currently provide support for Ruby 2.2, 2.3 and 2.4.
|
|
@@ -186,6 +186,9 @@ module RubyNext
|
|
|
186
186
|
require "ruby-next/language/rewriters/2.3/safe_navigation"
|
|
187
187
|
rewriters << Rewriters::SafeNavigation
|
|
188
188
|
|
|
189
|
+
require "ruby-next/language/rewriters/2.5/rescue_within_block"
|
|
190
|
+
rewriters << Rewriters::RescueWithinBlock
|
|
191
|
+
|
|
189
192
|
require "ruby-next/language/rewriters/2.7/args_forward"
|
|
190
193
|
rewriters << Rewriters::ArgsForward
|
|
191
194
|
|
|
@@ -24,6 +24,8 @@ module RubyNext
|
|
|
24
24
|
contents = File.read(path)
|
|
25
25
|
transpile path, contents
|
|
26
26
|
end
|
|
27
|
+
|
|
28
|
+
ensure_rbnext!
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
def parse!(args)
|
|
@@ -185,6 +187,17 @@ module RubyNext
|
|
|
185
187
|
FileUtils.rm_r(next_dir_path)
|
|
186
188
|
end
|
|
187
189
|
|
|
190
|
+
def ensure_rbnext!
|
|
191
|
+
return if CLI.dry_run? || stdout?
|
|
192
|
+
|
|
193
|
+
return if File.directory?(next_dir_path)
|
|
194
|
+
|
|
195
|
+
return if next_dir_path.end_with?(".rb")
|
|
196
|
+
|
|
197
|
+
FileUtils.mkdir_p next_dir_path
|
|
198
|
+
File.write(File.join(next_dir_path, ".keep"), "")
|
|
199
|
+
end
|
|
200
|
+
|
|
188
201
|
def next_dir_path
|
|
189
202
|
@next_dir_path ||= (out_path || File.join(lib_path, RUBY_NEXT_DIR))
|
|
190
203
|
end
|
|
@@ -65,7 +65,7 @@ module RubyNext
|
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
class << self
|
|
68
|
-
# Returns true if the syntax is supported
|
|
68
|
+
# Returns true if the syntax is not supported
|
|
69
69
|
# by the current Ruby (performs syntax check, not version check)
|
|
70
70
|
def unsupported_syntax?
|
|
71
71
|
save_verbose, $VERBOSE = $VERBOSE, nil
|
|
@@ -24,6 +24,8 @@ module RubyNext
|
|
|
24
24
|
contents = File.read(path)
|
|
25
25
|
transpile path, contents
|
|
26
26
|
end
|
|
27
|
+
|
|
28
|
+
ensure_rbnext!
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
def parse!(args)
|
|
@@ -185,6 +187,17 @@ module RubyNext
|
|
|
185
187
|
FileUtils.rm_r(next_dir_path)
|
|
186
188
|
end
|
|
187
189
|
|
|
190
|
+
def ensure_rbnext!
|
|
191
|
+
return if CLI.dry_run? || stdout?
|
|
192
|
+
|
|
193
|
+
return if File.directory?(next_dir_path)
|
|
194
|
+
|
|
195
|
+
return if next_dir_path.end_with?(".rb")
|
|
196
|
+
|
|
197
|
+
FileUtils.mkdir_p next_dir_path
|
|
198
|
+
File.write(File.join(next_dir_path, ".keep"), "")
|
|
199
|
+
end
|
|
200
|
+
|
|
188
201
|
def next_dir_path
|
|
189
202
|
@next_dir_path ||= (out_path || File.join(lib_path, RUBY_NEXT_DIR))
|
|
190
203
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "ruby-next"
|
|
4
|
+
# Include RubyNext into TOPLEVEL_BINDING for polyfills to work
|
|
5
|
+
eval("using RubyNext", TOPLEVEL_BINDING, __FILE__, __LINE__)
|
|
6
|
+
|
|
7
|
+
require "ruby-next/language"
|
|
8
|
+
|
|
9
|
+
# IRB extension to transpile code before evaluating
|
|
10
|
+
module RubyNext
|
|
11
|
+
module IRBExt
|
|
12
|
+
def evaluate(context, statements, *args)
|
|
13
|
+
new_statements = ::RubyNext::Language.transform(
|
|
14
|
+
statements,
|
|
15
|
+
rewriters: ::RubyNext::Language.current_rewriters,
|
|
16
|
+
using: false
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
super(context, new_statements, *args)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
IRB::WorkSpace.prepend(RubyNext::IRBExt)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RubyNext
|
|
4
|
+
module Language
|
|
5
|
+
module Rewriters
|
|
6
|
+
class RescueWithinBlock < Base
|
|
7
|
+
NAME = "rescue-within-block"
|
|
8
|
+
SYNTAX_PROBE = "lambda do
|
|
9
|
+
raise 'err'
|
|
10
|
+
rescue
|
|
11
|
+
$! # => #<RuntimeError: err>
|
|
12
|
+
end.call"
|
|
13
|
+
|
|
14
|
+
MIN_SUPPORTED_VERSION = Gem::Version.new("2.5.0")
|
|
15
|
+
|
|
16
|
+
def on_block(block_node)
|
|
17
|
+
exception_node = block_node.children.find do |node|
|
|
18
|
+
node.type == :rescue || node.type == :ensure
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
return unless exception_node
|
|
22
|
+
|
|
23
|
+
context.track! self
|
|
24
|
+
|
|
25
|
+
insert_before(exception_node.loc.expression, "begin;")
|
|
26
|
+
insert_after(exception_node.loc.expression, ";end")
|
|
27
|
+
|
|
28
|
+
new_childrens = block_node.children.map do |child|
|
|
29
|
+
next s(:kwbegin, exception_node) if child == exception_node
|
|
30
|
+
|
|
31
|
+
child
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
block_node.updated(:block, new_childrens)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -66,7 +66,7 @@ module RubyNext
|
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
class << self
|
|
69
|
-
# Returns true if the syntax is supported
|
|
69
|
+
# Returns true if the syntax is not supported
|
|
70
70
|
# by the current Ruby (performs syntax check, not version check)
|
|
71
71
|
def unsupported_syntax?
|
|
72
72
|
save_verbose, $VERBOSE = $VERBOSE, nil
|
|
@@ -12,7 +12,7 @@ module RubyNext
|
|
|
12
12
|
return if File.directory?(target_dir)
|
|
13
13
|
|
|
14
14
|
Dir.chdir(root_dir) do
|
|
15
|
-
unless system("bundle exec ruby-next nextify ./#{lib_dir} -o #{target_dir} > /dev/null 2>&1")
|
|
15
|
+
unless system("bundle exec ruby-next nextify ./#{lib_dir} -o #{target_dir} --min-version=#{RUBY_VERSION} > /dev/null 2>&1")
|
|
16
16
|
RubyNext.warn "Traspiled files are missing in: #{target_dir}. \n" \
|
|
17
17
|
"Make sure you have gem 'ruby-next' in your Gemfile to auto-transpile the required files from source on load. " \
|
|
18
18
|
"Otherwise the code from #{root_dir} may not work correctly."
|
data/lib/ruby-next/language.rb
CHANGED
|
@@ -186,6 +186,9 @@ module RubyNext
|
|
|
186
186
|
require "ruby-next/language/rewriters/2.3/safe_navigation"
|
|
187
187
|
rewriters << Rewriters::SafeNavigation
|
|
188
188
|
|
|
189
|
+
require "ruby-next/language/rewriters/2.5/rescue_within_block"
|
|
190
|
+
rewriters << Rewriters::RescueWithinBlock
|
|
191
|
+
|
|
189
192
|
require "ruby-next/language/rewriters/2.7/args_forward"
|
|
190
193
|
rewriters << Rewriters::ArgsForward
|
|
191
194
|
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This file contains patches for Pry integration.
|
|
4
|
+
# It's supposed to be required inside .pryrc files.
|
|
5
|
+
|
|
6
|
+
require "ruby-next/language/setup"
|
|
7
|
+
require "ruby-next/language/runtime"
|
|
8
|
+
|
|
9
|
+
# Enables refinements by injecting "using RubyNext"
|
|
10
|
+
# before Pry copies and memorizes the TOPLEVEL_BINDING.
|
|
11
|
+
Pry.singleton_class.prepend(Module.new do
|
|
12
|
+
def toplevel_binding
|
|
13
|
+
unless defined?(@_using_injected) && @_using_injected
|
|
14
|
+
orig_binding = super
|
|
15
|
+
|
|
16
|
+
# Copy TOPLEVEL_BINDING without local variables.
|
|
17
|
+
TOPLEVEL_BINDING.eval <<-RUBY
|
|
18
|
+
using RubyNext
|
|
19
|
+
|
|
20
|
+
def self.__pry__
|
|
21
|
+
binding
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
Pry.toplevel_binding = __pry__
|
|
25
|
+
|
|
26
|
+
class << self; undef __pry__; end
|
|
27
|
+
RUBY
|
|
28
|
+
|
|
29
|
+
# Inject local variables from the original binding.
|
|
30
|
+
orig_binding.local_variables.each do |var|
|
|
31
|
+
value = orig_binding.local_variable_get(var)
|
|
32
|
+
@toplevel_binding.local_variable_set(var, value)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
@_using_injected = true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
super
|
|
39
|
+
end
|
|
40
|
+
end)
|
|
41
|
+
|
|
42
|
+
# Enables edge Ruby syntax by transpiling the code
|
|
43
|
+
# before it's evaluated in the context of a binding.
|
|
44
|
+
Pry.prepend(Module.new do
|
|
45
|
+
def current_binding
|
|
46
|
+
super.tap do |obj|
|
|
47
|
+
next if obj.respond_to?(:__nextified__)
|
|
48
|
+
|
|
49
|
+
obj.instance_eval do
|
|
50
|
+
def eval(code, *args)
|
|
51
|
+
new_code = ::RubyNext::Language::Runtime.transform(code, using: false)
|
|
52
|
+
|
|
53
|
+
super(new_code, *args)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def __nextified__
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end)
|
|
62
|
+
|
|
63
|
+
# Enables edge Ruby syntax for multi-line input.
|
|
64
|
+
Pry::Code.singleton_class.prepend(Module.new do
|
|
65
|
+
def complete_expression?(str)
|
|
66
|
+
silence_stderr do
|
|
67
|
+
::Parser::RubyNext.parse(str)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
true
|
|
71
|
+
rescue Parser::SyntaxError => ex
|
|
72
|
+
case ex.message
|
|
73
|
+
when /unexpected token \$end/
|
|
74
|
+
false
|
|
75
|
+
else
|
|
76
|
+
true
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
def silence_stderr
|
|
83
|
+
stderr = StringIO.new
|
|
84
|
+
orig_stderr, $stderr = $stderr, stderr
|
|
85
|
+
|
|
86
|
+
yield
|
|
87
|
+
|
|
88
|
+
$stderr = orig_stderr
|
|
89
|
+
end
|
|
90
|
+
end)
|
data/lib/ruby-next/version.rb
CHANGED
data/lib/uby-next/irb.rb
ADDED
data/lib/uby-next/pry.rb
ADDED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ruby-next-core
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.15.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Vladimir Dementyev
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-03-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: ruby-next-parser
|
|
@@ -103,6 +103,7 @@ files:
|
|
|
103
103
|
- lib/ruby-next/core/time/floor.rb
|
|
104
104
|
- lib/ruby-next/core/unboundmethod/bind_call.rb
|
|
105
105
|
- lib/ruby-next/core_ext.rb
|
|
106
|
+
- lib/ruby-next/irb.rb
|
|
106
107
|
- lib/ruby-next/language.rb
|
|
107
108
|
- lib/ruby-next/language/bootsnap.rb
|
|
108
109
|
- lib/ruby-next/language/eval.rb
|
|
@@ -112,6 +113,7 @@ files:
|
|
|
112
113
|
- lib/ruby-next/language/rewriters/2.3/safe_navigation.rb
|
|
113
114
|
- lib/ruby-next/language/rewriters/2.3/squiggly_heredoc.rb
|
|
114
115
|
- lib/ruby-next/language/rewriters/2.4/dir.rb
|
|
116
|
+
- lib/ruby-next/language/rewriters/2.5/rescue_within_block.rb
|
|
115
117
|
- lib/ruby-next/language/rewriters/2.6/endless_range.rb
|
|
116
118
|
- lib/ruby-next/language/rewriters/2.7/args_forward.rb
|
|
117
119
|
- lib/ruby-next/language/rewriters/2.7/numbered_params.rb
|
|
@@ -136,11 +138,14 @@ files:
|
|
|
136
138
|
- lib/ruby-next/language/setup.rb
|
|
137
139
|
- lib/ruby-next/language/unparser.rb
|
|
138
140
|
- lib/ruby-next/logging.rb
|
|
141
|
+
- lib/ruby-next/pry.rb
|
|
139
142
|
- lib/ruby-next/rubocop.rb
|
|
140
143
|
- lib/ruby-next/setup_self.rb
|
|
141
144
|
- lib/ruby-next/utils.rb
|
|
142
145
|
- lib/ruby-next/version.rb
|
|
143
146
|
- lib/uby-next.rb
|
|
147
|
+
- lib/uby-next/irb.rb
|
|
148
|
+
- lib/uby-next/pry.rb
|
|
144
149
|
homepage: http://github.com/palkan/ruby-next
|
|
145
150
|
licenses:
|
|
146
151
|
- MIT
|