Ruby Issue Tracking System: Issues
https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2021-01-10T13:17:37Z
Ruby Issue Tracking System
Redmine
Ruby master - Feature #17525 (Open): Implement Happy Eyeballs Version 2 (RFC8305) in Socket.tcp
https://redmine.ruby-lang.org/issues/17525
2021-01-10T13:17:37Z
Glass_saga (Masaki Matsushita)
glass.saga@gmail.com
<p><a href="https://github.com/ruby/ruby/pull/4038" class="external">https://github.com/ruby/ruby/pull/4038</a></p>
<p>This change implements Happy Eyeballs Version 2 (RFC8305) in Socket.tcp.<br>
It enables fallback from IPv6 to IPv4 without a long waiting time.</p>
Ruby master - Feature #17134 (Open): Add resolv_timeout to TCPSocket
https://redmine.ruby-lang.org/issues/17134
2020-08-29T05:26:59Z
Glass_saga (Masaki Matsushita)
glass.saga@gmail.com
<p>Add resolve_timeout to TCPSocket.new.<br>
It makes DNS timeout customizable in the same way as Socket.tcp.</p>
<p><a href="https://github.com/ruby/ruby/pull/3472" class="external">https://github.com/ruby/ruby/pull/3472</a></p>
Ruby master - Feature #15588 (Open): String#each_chunk and #chunks
https://redmine.ruby-lang.org/issues/15588
2019-02-06T01:35:18Z
Glass_saga (Masaki Matsushita)
glass.saga@gmail.com
<p>String#each_chunk iterates chunks of specified size in String.<br>
String#chunks is a shorthand for str.each_chunk(n).to_a.</p>
<p>present:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">str</span> <span class="o">=</span> <span class="o"><<</span><span class="no">EOS</span><span class="sh">
20190101 20190102
20190103 20190104
</span><span class="no">EOS</span>
<span class="n">str</span><span class="p">.</span><span class="nf">scan</span><span class="p">(</span><span class="sr">/.{1,9}/m</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">chunk</span><span class="o">|</span>
<span class="nb">p</span> <span class="n">chunk</span> <span class="c1">#=> "20190101 "</span>
<span class="k">end</span>
<span class="n">str</span><span class="p">.</span><span class="nf">scan</span><span class="p">(</span><span class="sr">/.{1,9}/m</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">chunk</span><span class="o">|</span>
<span class="n">chunk</span><span class="p">.</span><span class="nf">strip!</span>
<span class="nb">p</span> <span class="n">chunk</span> <span class="c1">#=> "20190101"</span>
<span class="k">end</span>
<span class="n">str</span><span class="p">.</span><span class="nf">scan</span><span class="p">(</span><span class="sr">/.{1,9}/m</span><span class="p">)</span> <span class="c1">#=> ["20190101 ", "20190102\n", "20190103 ", "20190104\n"]</span>
<span class="n">str</span><span class="p">.</span><span class="nf">scan</span><span class="p">(</span><span class="sr">/.{1,9}/m</span><span class="p">).</span><span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="ss">:strip</span><span class="p">)</span> <span class="c1">#=> ["20190101", "20190102", "20190103", "20190104"]</span>
</code></pre>
<p>proposal:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">str</span> <span class="o">=</span> <span class="o"><<</span><span class="no">EOS</span><span class="sh">
20190101 20190102
20190103 20190104
</span><span class="no">EOS</span>
<span class="n">str</span><span class="p">.</span><span class="nf">each_chunk</span><span class="p">(</span><span class="mi">9</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">chunk</span><span class="o">|</span>
<span class="nb">p</span> <span class="n">chunk</span> <span class="c1">#=> "20190101 "</span>
<span class="k">end</span>
<span class="n">str</span><span class="p">.</span><span class="nf">each_chunk</span><span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="ss">strip: </span><span class="kp">true</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">chunk</span><span class="o">|</span>
<span class="nb">p</span> <span class="n">chunk</span> <span class="c1">#=> "20190101"</span>
<span class="k">end</span>
<span class="n">str</span><span class="p">.</span><span class="nf">chunks</span><span class="p">(</span><span class="mi">9</span><span class="p">)</span> <span class="c1">#=> ["20190101 ", "20190102\n", "20190103 ", "20190104\n"]</span>
<span class="n">str</span><span class="p">.</span><span class="nf">chunks</span><span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="ss">strip: </span><span class="kp">true</span><span class="p">)</span> <span class="c1">#=> ["20190101", "20190102", "20190103", "20190104"]</span>
</code></pre>
Ruby master - Feature #13696 (Open): Add exchange and noreplace options to File.rename
https://redmine.ruby-lang.org/issues/13696
2017-06-29T03:07:38Z
Glass_saga (Masaki Matsushita)
glass.saga@gmail.com
<p>renameat2(2) introduced in linux kernel 3.15 takes following flags.</p>
<pre><code>RENAME_EXCHANGE: Atomically exchange oldpath and newpath.
RENAME_NOREPLACE: Don't overwrite newpath of the rename. Return an error if newpath already exists.
</code></pre>
<p>This change makes <code>File.rename</code> take these flags as keyword arguments.</p>
<p>Example:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">File</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="s2">"hoge"</span><span class="p">,</span> <span class="s2">"hoge"</span><span class="p">)</span>
<span class="no">File</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="s2">"fuga"</span><span class="p">,</span> <span class="s2">"fuga"</span><span class="p">)</span>
<span class="no">File</span><span class="p">.</span><span class="nf">rename</span><span class="p">(</span><span class="s2">"hoge"</span><span class="p">,</span> <span class="s2">"fuga"</span><span class="p">,</span> <span class="ss">exchange: </span><span class="kp">true</span><span class="p">)</span> <span class="c1"># atomically exchanged</span>
<span class="no">File</span><span class="p">.</span><span class="nf">read</span><span class="p">(</span><span class="s2">"fuga"</span><span class="p">)</span> <span class="c1">#=> "hoge"</span>
<span class="no">File</span><span class="p">.</span><span class="nf">rename</span><span class="p">(</span><span class="s2">"hoge"</span><span class="p">,</span> <span class="s2">"fuga"</span><span class="p">,</span> <span class="ss">noreplace: </span><span class="kp">true</span><span class="p">)</span> <span class="c1">#=> File exists @ syserr_fail2_in - fuga (Errno::EEXIST)</span>
</code></pre>
Ruby master - Feature #7148 (Assigned): Improved Tempfile w/o DelegateClass
https://redmine.ruby-lang.org/issues/7148
2012-10-12T14:04:07Z
Glass_saga (Masaki Matsushita)
glass.saga@gmail.com
<p>I propose improved <code>Tempfile</code> without <code>DelegateClass()</code>.<br>
Present <code>Tempfile</code> has following problems.</p>
<ol>
<li>
<p>confusing inspect</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">t</span> <span class="o">=</span> <span class="no">Tempfile</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s2">"foo"</span><span class="p">)</span> <span class="c1">#=> #<File:/tmp/foo20121012-6762-12w11to></span>
<span class="n">t</span><span class="p">.</span><span class="nf">is_a?</span> <span class="no">File</span> <span class="c1">#=> false</span>
</code></pre>
</li>
<li>
<p><code>#dup</code> doesn't duplicate <code>IO</code></p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">t</span> <span class="o">=</span> <span class="no">Tempfile</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s2">"foo"</span><span class="p">)</span>
<span class="n">t</span><span class="p">.</span><span class="nf">dup</span><span class="p">.</span><span class="nf">close</span>
<span class="n">t</span><span class="p">.</span><span class="nf">read</span> <span class="c1">#=> IOError: closed stream</span>
</code></pre>
</li>
<li>
<p>finalizer performs unlink even when it has been duplicated</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">t</span> <span class="o">=</span> <span class="no">Tempfile</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s2">"foo"</span><span class="p">)</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">t</span><span class="p">.</span><span class="nf">path</span> <span class="c1">#=> "/tmp/foo20121012-7533-1q537gq"</span>
<span class="no">File</span><span class="p">.</span><span class="nf">exist?</span> <span class="n">path</span> <span class="c1">#=> true</span>
<span class="n">tt</span> <span class="o">=</span> <span class="n">t</span><span class="p">.</span><span class="nf">dup</span>
<span class="n">t</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="no">GC</span><span class="p">.</span><span class="nf">start</span>
<span class="no">File</span><span class="p">.</span><span class="nf">exist?</span> <span class="n">path</span> <span class="c1">#=> false</span>
</code></pre>
</li>
</ol>
<p>I think these problems caused by using <code>DelegateClass()</code>.<br>
Therefore, I made a patch to resolve the problems.<br>
The patched Tempfile class is a subclass of File.</p>