doc/TaskJuggler/SyntaxReference.html in taskjuggler-0.0.7 vs doc/TaskJuggler/SyntaxReference.html in taskjuggler-0.0.8

- old
+ new

@@ -165,16 +165,22 @@ <li><a href="../TaskJuggler/ChargeSet.html">TaskJuggler::ChargeSet</a></li> <li><a href="../TaskJuggler/ChargeSetListAttribute.html">TaskJuggler::ChargeSetListAttribute</a></li> + <li><a href="../TaskJuggler/CollisionDetector.html">TaskJuggler::CollisionDetector</a></li> + <li><a href="../TaskJuggler/ColumnListAttribute.html">TaskJuggler::ColumnListAttribute</a></li> <li><a href="../TaskJuggler/ColumnTable.html">TaskJuggler::ColumnTable</a></li> <li><a href="../TaskJuggler/Daemon.html">TaskJuggler::Daemon</a></li> + <li><a href="../TaskJuggler/DataCache.html">TaskJuggler::DataCache</a></li> + + <li><a href="../TaskJuggler/DataCacheEntry.html">TaskJuggler::DataCacheEntry</a></li> + <li><a href="../TaskJuggler/DateAttribute.html">TaskJuggler::DateAttribute</a></li> <li><a href="../TaskJuggler/DefinitionListAttribute.html">TaskJuggler::DefinitionListAttribute</a></li> <li><a href="../TaskJuggler/DependencyListAttribute.html">TaskJuggler::DependencyListAttribute</a></li> @@ -277,11 +283,11 @@ <li><a href="../TaskJuggler/NikuResource.html">TaskJuggler::NikuResource</a></li> <li><a href="../TaskJuggler/NodeListAttribute.html">TaskJuggler::NodeListAttribute</a></li> - <li><a href="../TaskJuggler/OnShiftCache.html">TaskJuggler::OnShiftCache</a></li> + <li><a href="../TaskJuggler/PlaceHolderCell.html">TaskJuggler::PlaceHolderCell</a></li> <li><a href="../TaskJuggler/ProcessIntercom.html">TaskJuggler::ProcessIntercom</a></li> <li><a href="../TaskJuggler/ProcessIntercomIface.html">TaskJuggler::ProcessIntercomIface</a></li> @@ -457,10 +463,14 @@ <li><a href="../TaskJuggler/TextParser/Rule.html">TaskJuggler::TextParser::Rule</a></li> <li><a href="../TaskJuggler/TextParser/StackElement.html">TaskJuggler::TextParser::StackElement</a></li> + <li><a href="../TaskJuggler/TextParser/State.html">TaskJuggler::TextParser::State</a></li> + + <li><a href="../TaskJuggler/TextParser/StateTransition.html">TaskJuggler::TextParser::StateTransition</a></li> + <li><a href="../TaskJuggler/TextParser/TextParserResultArray.html">TaskJuggler::TextParser::TextParserResultArray</a></li> <li><a href="../TaskJuggler/TextParser/TokenDoc.html">TaskJuggler::TextParser::TokenDoc</a></li> <li><a href="../TaskJuggler/TextReport.html">TaskJuggler::TextReport</a></li> @@ -1019,43 +1029,43 @@ <div class="method-source-code" id="attributes-source"> <pre> - <span class="ruby-comment cmt"># File lib/SyntaxReference.rb, line 224</span> -224: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">token</span>, <span class="ruby-identifier">scenarioSpecific</span>) -225: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Token #{token} must reference a rule&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-value">!!</span> -226: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">token</span>.<span class="ruby-identifier">slice</span>(<span class="ruby-value">1</span>, <span class="ruby-identifier">token</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>) -227: <span class="ruby-comment cmt"># Find the matching rule.</span> -228: <span class="ruby-identifier">rule</span> = <span class="ruby-ivar">@parser</span>.<span class="ruby-identifier">rules</span>[<span class="ruby-identifier">token</span>] -229: <span class="ruby-identifier">attrs</span> = {} -230: <span class="ruby-comment cmt"># Now we look at the first token of each pattern.</span> -231: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pattern</span><span class="ruby-operator">|</span> -232: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">__</span> -233: <span class="ruby-comment cmt"># If it's a terminal symbol, we found what we are looking for. We add</span> -234: <span class="ruby-comment cmt"># it to the attrs hash and mark it as non scenario specific.</span> -235: <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-identifier">scenarioSpecific</span> -236: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'!scenarioIdCol'</span> -237: <span class="ruby-comment cmt"># A reference to the !scenarioId rule marks the next token of the</span> -238: <span class="ruby-comment cmt"># pattern as a reference to a rule with all scenario specific</span> -239: <span class="ruby-comment cmt"># attributes.</span> -240: <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">1</span>], <span class="ruby-keyword kw">true</span>)) -241: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">!!</span> -242: <span class="ruby-comment cmt"># In case we have a reference to another rule, we just follow the</span> -243: <span class="ruby-comment cmt"># reference. If the pattern is documented we don't have to follow the</span> -244: <span class="ruby-comment cmt"># reference. We can use the pattern instead.</span> -245: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">doc</span>.<span class="ruby-identifier">nil?</span> -246: <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">scenarioSpecific</span>)) -247: <span class="ruby-keyword kw">else</span> -248: <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-identifier">scenarioSpecific</span> -249: <span class="ruby-keyword kw">end</span> -250: <span class="ruby-keyword kw">else</span> -251: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Hit unknown token #{token}&quot;</span> -252: <span class="ruby-keyword kw">end</span> -253: <span class="ruby-keyword kw">end</span> -254: <span class="ruby-identifier">attrs</span> -255: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/SyntaxReference.rb, line 223</span> +223: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">token</span>, <span class="ruby-identifier">scenarioSpecific</span>) +224: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Token #{token} must reference a rule&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-value">:reference</span> +225: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>] +226: <span class="ruby-comment cmt"># Find the matching rule.</span> +227: <span class="ruby-identifier">rule</span> = <span class="ruby-ivar">@parser</span>.<span class="ruby-identifier">rules</span>[<span class="ruby-identifier">token</span>] +228: <span class="ruby-identifier">attrs</span> = {} +229: <span class="ruby-comment cmt"># Now we look at the first token of each pattern.</span> +230: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pattern</span><span class="ruby-operator">|</span> +231: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:literal</span> +232: <span class="ruby-comment cmt"># If it's a terminal symbol, we found what we are looking for. We add</span> +233: <span class="ruby-comment cmt"># it to the attrs hash and mark it as non scenario specific.</span> +234: <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-identifier">scenarioSpecific</span> +235: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:reference</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:scenarioIdCol</span> +236: <span class="ruby-comment cmt"># A reference to the !scenarioId rule marks the next token of the</span> +237: <span class="ruby-comment cmt"># pattern as a reference to a rule with all scenario specific</span> +238: <span class="ruby-comment cmt"># attributes.</span> +239: <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">1</span>], <span class="ruby-keyword kw">true</span>)) +240: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:reference</span> +241: <span class="ruby-comment cmt"># In case we have a reference to another rule, we just follow the</span> +242: <span class="ruby-comment cmt"># reference. If the pattern is documented we don't have to follow the</span> +243: <span class="ruby-comment cmt"># reference. We can use the pattern instead.</span> +244: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">doc</span>.<span class="ruby-identifier">nil?</span> +245: <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">scenarioSpecific</span>)) +246: <span class="ruby-keyword kw">else</span> +247: <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-identifier">scenarioSpecific</span> +248: <span class="ruby-keyword kw">end</span> +249: <span class="ruby-keyword kw">else</span> +250: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Hit unknown token #{token}&quot;</span> +251: <span class="ruby-keyword kw">end</span> +252: <span class="ruby-keyword kw">end</span> +253: <span class="ruby-identifier">attrs</span> +254: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1082,33 +1092,33 @@ <div class="method-source-code" id="check-eyword-source"> <pre> - <span class="ruby-comment cmt"># File lib/SyntaxReference.rb, line 257</span> -257: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkKeyword</span>(<span class="ruby-identifier">keyword</span>) -258: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">keyword</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@keywords</span>[<span class="ruby-identifier">keyword</span>].<span class="ruby-identifier">nil?</span> -259: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">keyword</span>.<span class="ruby-identifier">nil?</span> -260: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;ERROR: #{keyword} is not a known keyword.\n\n&quot;</span> -261: <span class="ruby-keyword kw">end</span> -262: <span class="ruby-comment cmt"># Create list of top-level keywords.</span> -263: <span class="ruby-identifier">kwdStr</span> = <span class="ruby-value str">''</span> -264: <span class="ruby-ivar">@keywords</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">kwd</span><span class="ruby-operator">|</span> -265: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span> -266: (<span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">kwd</span>) -267: <span class="ruby-identifier">kwdStr</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">', '</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">kwdStr</span>.<span class="ruby-identifier">empty?</span> -268: <span class="ruby-identifier">kwdStr</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">keyword</span> -269: <span class="ruby-keyword kw">end</span> -270: <span class="ruby-keyword kw">end</span> -271: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;Try one of the following keywords as argument to this &quot;</span> <span class="ruby-operator">+</span> -272: <span class="ruby-value str">&quot;program:\n&quot;</span> -273: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;#{kwdStr}&quot;</span> -274: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> -275: <span class="ruby-keyword kw">end</span> -276: -277: <span class="ruby-keyword kw">true</span> -278: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/SyntaxReference.rb, line 256</span> +256: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkKeyword</span>(<span class="ruby-identifier">keyword</span>) +257: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">keyword</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@keywords</span>[<span class="ruby-identifier">keyword</span>].<span class="ruby-identifier">nil?</span> +258: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">keyword</span>.<span class="ruby-identifier">nil?</span> +259: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;ERROR: #{keyword} is not a known keyword.\n\n&quot;</span> +260: <span class="ruby-keyword kw">end</span> +261: <span class="ruby-comment cmt"># Create list of top-level keywords.</span> +262: <span class="ruby-identifier">kwdStr</span> = <span class="ruby-value str">''</span> +263: <span class="ruby-ivar">@keywords</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">kwd</span><span class="ruby-operator">|</span> +264: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span> +265: (<span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">kwd</span>) +266: <span class="ruby-identifier">kwdStr</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">', '</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">kwdStr</span>.<span class="ruby-identifier">empty?</span> +267: <span class="ruby-identifier">kwdStr</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">keyword</span> +268: <span class="ruby-keyword kw">end</span> +269: <span class="ruby-keyword kw">end</span> +270: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;Try one of the following keywords as argument to this &quot;</span> <span class="ruby-operator">+</span> +271: <span class="ruby-value str">&quot;program:\n&quot;</span> +272: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;#{kwdStr}&quot;</span> +273: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> +274: <span class="ruby-keyword kw">end</span> +275: +276: <span class="ruby-keyword kw">true</span> +277: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1150,29 +1160,28 @@ 194: <span class="ruby-keyword kw">return</span> {} <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">stack</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">doc</span> 195: 196: <span class="ruby-comment cmt"># Push pattern onto 'stack'.</span> 197: <span class="ruby-identifier">stack</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-keyword kw">true</span> 198: -199: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'_{'</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">2</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'_}'</span> +199: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'{'</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">2</span>][<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'}'</span> 200: <span class="ruby-comment cmt"># We have found an optional attribute pattern!</span> 201: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">1</span>], <span class="ruby-keyword kw">false</span>) 202: <span class="ruby-keyword kw">end</span> 203: 204: <span class="ruby-comment cmt"># If a token of the pattern is a reference, we recursively</span> 205: <span class="ruby-comment cmt"># follow the reference to the next pattern.</span> -206: <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">token</span><span class="ruby-operator">|</span> -207: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">!!</span> -208: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">token</span>.<span class="ruby-identifier">slice</span>(<span class="ruby-value">1</span>, <span class="ruby-identifier">token</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>) -209: <span class="ruby-identifier">rule</span> = <span class="ruby-ivar">@parser</span>.<span class="ruby-identifier">rules</span>[<span class="ruby-identifier">token</span>] -210: <span class="ruby-comment cmt"># Rules with multiple patterns won't lead to attributes.</span> -211: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span> -212: -213: <span class="ruby-identifier">attrs</span> = <span class="ruby-identifier">optionalAttributes</span>(<span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">stack</span>) -214: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">attrs</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">empty?</span> -215: <span class="ruby-keyword kw">end</span> -216: <span class="ruby-keyword kw">end</span> -217: {} -218: <span class="ruby-keyword kw">end</span></pre> +206: <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">type</span>, <span class="ruby-identifier">name</span><span class="ruby-operator">|</span> +207: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-value">:reference</span> +208: <span class="ruby-identifier">rule</span> = <span class="ruby-ivar">@parser</span>.<span class="ruby-identifier">rules</span>[<span class="ruby-identifier">name</span>] +209: <span class="ruby-comment cmt"># Rules with multiple patterns won't lead to attributes.</span> +210: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span> +211: +212: <span class="ruby-identifier">attrs</span> = <span class="ruby-identifier">optionalAttributes</span>(<span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">stack</span>) +213: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">attrs</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">empty?</span> +214: <span class="ruby-keyword kw">end</span> +215: <span class="ruby-keyword kw">end</span> +216: {} +217: <span class="ruby-keyword kw">end</span></pre> </div> </div>