https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112020-06-12T00:29:28ZRuby Issue Tracking SystemRuby master - Feature #16954: A new mode `Warning[:deprecated] = :error` for 2.7https://redmine.ruby-lang.org/issues/16954?journal_id=861122020-06-12T00:29:28Zjeremyevans0 (Jeremy Evans)merch-redmine@jeremyevans.net
<ul></ul><p>mame (Yusuke Endoh) wrote:</p>
<blockquote>
<p>There are two (orthogonal) approaches to make the first solution:</p>
<ol>
<li>
<code>Warning[:deprecated] = :error</code>, to make the warning into an error which produces a full backtrace (and stops the execution).</li>
<li>
<code>Warning[:deprecated] = :debug</code>, to make the warning print a full backtrace (and continues the execution).</li>
</ol>
</blockquote>
<p>Note that by overriding <code>Warning.warn</code> (e.g. by using the warning gem), both behaviors can be implemented in pure Ruby, though that approach does require parsing the warning message.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">require</span> <span class="s1">'warning'</span> <span class="c1"># warning gem</span>
<span class="no">Warning</span><span class="p">.</span><span class="nf">process</span> <span class="k">do</span> <span class="o">|</span><span class="n">message</span><span class="o">|</span>
<span class="k">if</span> <span class="n">message</span> <span class="o">=~</span> <span class="sr">/: warning: (?:Using the last argument (?:for `.+' )?as keyword parameters is deprecated; maybe \*\* should be added to the call|Passing the keyword argument (?:for `.+' )?as the last hash parameter is deprecated|Splitting the last argument (?:for `.+' )?into positional and keyword parameters is deprecated)\n\z/</span>
<span class="k">if</span> <span class="kp">false</span> <span class="c1"># :error</span>
<span class="k">raise</span> <span class="n">message</span>
<span class="k">else</span> <span class="c1"># :debug</span>
<span class="vg">$stderr</span><span class="p">.</span><span class="nf">puts</span> <span class="n">message</span>
<span class="vg">$stderr</span><span class="p">.</span><span class="nf">puts</span> <span class="nb">caller</span>
<span class="k">end</span>
<span class="k">else</span>
<span class="vg">$stderr</span><span class="p">.</span><span class="nf">puts</span> <span class="n">message</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">a</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">1</span><span class="p">);</span> <span class="k">end</span>
<span class="n">a</span><span class="p">(</span><span class="ss">b: </span><span class="mi">2</span><span class="p">)</span> <span class="c1"># keyword to positional</span>
<span class="k">def</span> <span class="nf">a</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">1</span><span class="p">);</span> <span class="k">end</span>
<span class="n">a</span><span class="p">({</span><span class="ss">b: </span><span class="mi">1</span><span class="p">,</span> <span class="s1">'a'</span><span class="o">=></span><span class="mi">1</span><span class="p">})</span> <span class="c1"># split positional</span>
<span class="n">a</span><span class="p">(</span><span class="ss">b: </span><span class="mi">1</span><span class="p">,</span> <span class="s1">'a'</span><span class="o">=></span><span class="mi">1</span><span class="p">)</span> <span class="c1"># split keyword</span>
<span class="k">def</span> <span class="nf">a</span><span class="p">(</span><span class="ss">b: </span><span class="mi">1</span><span class="p">);</span> <span class="k">end</span>
<span class="n">a</span><span class="p">({</span><span class="ss">b: </span><span class="mi">1</span><span class="p">})</span> <span class="c1"># positional to keyword</span>
</code></pre> Ruby master - Feature #16954: A new mode `Warning[:deprecated] = :error` for 2.7https://redmine.ruby-lang.org/issues/16954?journal_id=861152020-06-12T02:30:08Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul></ul><p><a class="user active user-mention" href="https://redmine.ruby-lang.org/users/1604">@jeremyevans0 (Jeremy Evans)</a> I have never thought of it. It may lead to a better solution:</p>
<ol>
<li>We publish a gem namely <code>warning_diagnosis</code>
</li>
<li>A user installs the gem and runs their code with environment variable:</li>
</ol>
<pre><code>$ WARNING_DIAGNOSIS="/path/to/ruby/file.rb:100: warning: Using the last argument" ruby user_code.rb
...full backtrace whose warning matches WARNING_DIAGNOSIS...
</code></pre>
<p><a class="user active user-mention" href="https://redmine.ruby-lang.org/users/25259">@kamipo (Ryuta Kamizono)</a> <a class="user active user-mention" href="https://redmine.ruby-lang.org/users/94">@matsuda (Akira Matsuda)</a> What do you think?</p> Ruby master - Feature #16954: A new mode `Warning[:deprecated] = :error` for 2.7https://redmine.ruby-lang.org/issues/16954?journal_id=861162020-06-12T08:53:56Zdecuplet (Nikita Shilnikov)fg@flashgordon.ru
<ul></ul><p>For the record, I used Jeremy's gem to deal with all 2.7 warnings, it saved me a lot of time. My typical setup in tests looks like</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">Warning</span><span class="p">.</span><span class="nf">ignore</span><span class="p">(</span><span class="sr">/some-gem-issuing-warnings-i-don-t-care-about/</span><span class="p">)</span>
<span class="no">Warning</span><span class="p">.</span><span class="nf">ignore</span><span class="p">(</span><span class="sr">/another-gem/</span><span class="p">)</span>
<span class="no">Warning</span><span class="p">.</span><span class="nf">process</span> <span class="p">{</span> <span class="o">|</span><span class="n">w</span><span class="o">|</span> <span class="k">raise</span> <span class="no">RuntimeError</span><span class="p">,</span> <span class="n">w</span> <span class="p">}</span> <span class="k">unless</span> <span class="no">ENV</span><span class="p">[</span><span class="s1">'NO_RAISE_ON_WARNING'</span><span class="p">]</span>
</code></pre> Ruby master - Feature #16954: A new mode `Warning[:deprecated] = :error` for 2.7https://redmine.ruby-lang.org/issues/16954?journal_id=861272020-06-12T20:00:24Zjeremyevans0 (Jeremy Evans)merch-redmine@jeremyevans.net
<ul></ul><p>mame (Yusuke Endoh) wrote in <a href="#note-2">#note-2</a>:</p>
<blockquote>
<p><a class="user active user-mention" href="https://redmine.ruby-lang.org/users/1604">@jeremyevans0 (Jeremy Evans)</a> I have never thought of it. It may lead to a better solution:</p>
<ol>
<li>We publish a gem namely <code>warning_diagnosis</code>
</li>
<li>A user installs the gem and runs their code with environment variable:</li>
</ol>
<pre><code>$ WARNING_DIAGNOSIS="/path/to/ruby/file.rb:100: warning: Using the last argument" ruby user_code.rb
...full backtrace whose warning matches WARNING_DIAGNOSIS...
</code></pre>
<p><a class="user active user-mention" href="https://redmine.ruby-lang.org/users/25259">@kamipo (Ryuta Kamizono)</a> <a class="user active user-mention" href="https://redmine.ruby-lang.org/users/94">@matsuda (Akira Matsuda)</a> What do you think?</p>
</blockquote>
<p>I've released version 1.1.0 of the warning gem, which allows what you want:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">Warning</span><span class="p">.</span><span class="nf">process</span><span class="p">(</span><span class="s1">'/path/to/ruby/file.rb:100'</span><span class="p">){</span><span class="ss">:backtrace</span><span class="p">}</span>
</code></pre>
<p>It can also easily handle this more globally:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="c1"># Print backtrace for keyword separation warnings by default</span>
<span class="no">Warning</span><span class="p">.</span><span class="nf">process</span><span class="p">(</span><span class="s1">''</span><span class="p">,</span> <span class="ss">keyword_separation: :backtrace</span><span class="p">)</span>
<span class="c1"># For keyword separation warnings in files in app directory, raise them as RuntimeErrors</span>
<span class="no">Warning</span><span class="p">.</span><span class="nf">process</span><span class="p">(</span><span class="s1">'/path/to/app/'</span><span class="p">,</span> <span class="ss">keyword_separation: :raise</span><span class="p">)</span>
</code></pre> Ruby master - Feature #16954: A new mode `Warning[:deprecated] = :error` for 2.7https://redmine.ruby-lang.org/issues/16954?journal_id=862562020-06-19T07:57:54Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Rejected</i></li></ul><p>I explained this proposal at the developers' meeting, and we agreed that it is not necessary. It does not make sense to commit a unnecessary change to the released version 2.7, so this ticket was rejected.</p>
<p><a class="user active user-mention" href="https://redmine.ruby-lang.org/users/1604">@jeremyevans0 (Jeremy Evans)</a> I'd appreciate if you could explain how to use your gem in <a href="https://discuss.rubyonrails.org/t/new-2-7-3-0-keyword-argument-pain-point/74980" class="external">the Rails discourse thread</a>.</p> Ruby master - Feature #16954: A new mode `Warning[:deprecated] = :error` for 2.7https://redmine.ruby-lang.org/issues/16954?journal_id=862672020-06-19T19:57:06Zjeremyevans0 (Jeremy Evans)merch-redmine@jeremyevans.net
<ul></ul><p>mame (Yusuke Endoh) wrote in <a href="#note-5">#note-5</a>:</p>
<blockquote>
<p><a class="user active user-mention" href="https://redmine.ruby-lang.org/users/1604">@jeremyevans0 (Jeremy Evans)</a> I'd appreciate if you could explain how to use your gem in <a href="https://discuss.rubyonrails.org/t/new-2-7-3-0-keyword-argument-pain-point/74980" class="external">the Rails discourse thread</a>.</p>
</blockquote>
<p>I attempted to post a detailed response, but apparently it wasn't accepted and my account there now states it is temporarily on hold.</p>