The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
This file was generated by Devel::Cover Version 1.26
Devel::Cover is copyright 2001-2012, Paul Johnson (paul@pjcj.net)
Devel::Cover is free. It is licensed under the same terms as Perl itself.
The latest version of Devel::Cover should be available from my homepage:
http://www.pjcj.net
-->
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
    <meta http-equiv="Content-Language" content="en-us"></meta>
    <link rel="stylesheet" type="text/css" href="cover.css"></link>
    <link rel="stylesheet" type="text/css" href="cover.css"></link>
    <title>File Coverage: lib/Yukki/Model/User.pm</title>
</head>
<body>
<h1>File Coverage</h1>
<table>
<tr><td class="h" align="right">File:</td><td align="left">lib/Yukki/Model/User.pm</td></tr>
<tr><td class="h" align="right">Coverage:</td><td align="left" class="c0">57.3%</td></tr>
</table>
<div><br/></div>
<table>
<tr><th>line</th><th>stmt</th><th>bran</th><th>cond</th><th>sub</th><th>pod</th><th>time</th><th>code</th></tr>
<tr><td class="h">1</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">package Yukki::Model::User;</td></tr>
<tr><td class="h">2</td><td colspan="7"></td></tr><tr><td class="h">3</td><td><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L3">2</a></div></td><td></td><td><div>971</div><div>7</div></td><td class="s">use v5.24;</td></tr>
<tr><td class="h">4</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L4">2</a></div></td><td></td><td><div>5</div><div>3</div><div>10</div></td><td class="s">use utf8;</td></tr>
<tr><td class="h">5</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L5">2</a></div></td><td></td><td><div>23</div><div>4</div><div>7</div></td><td class="s">use Moo;</td></tr>
<tr><td class="h">6</td><td colspan="7"></td></tr><tr><td class="h">7</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">extends &#39;Yukki::Model&#39;;</td></tr>
<tr><td class="h">8</td><td colspan="7"></td></tr><tr><td class="h">9</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L9">2</a></div></td><td></td><td><div>455</div><div>2</div><div>15</div></td><td class="s">use Yukki::Types qw( LoginName );</td></tr>
<tr><td class="h">10</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L10">2</a></div></td><td></td><td><div>773</div><div>2</div><div>11</div></td><td class="s">use Yukki::TextUtil qw( load_file );</td></tr>
<tr><td class="h">11</td><td colspan="7"></td></tr><tr><td class="h">12</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L12">2</a></div></td><td></td><td><div>470</div><div>3</div><div>10</div></td><td class="s">use Type::Params qw( validate );</td></tr>
<tr><td class="h">13</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L13">2</a></div></td><td></td><td><div>316</div><div>3</div><div>9</div></td><td class="s">use Type::Utils;</td></tr>
<tr><td class="h">14</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L14">2</a></div></td><td></td><td><div>1955</div><div>4</div><div>14</div></td><td class="s">use Types::Path::Tiny;</td></tr>
<tr><td class="h">15</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L15">2</a></div></td><td></td><td><div>384</div><div>3</div><div>12</div></td><td class="s">use Types::Standard qw( slurpy Dict );</td></tr>
<tr><td class="h">16</td><td colspan="7"></td></tr><tr><td class="h">17</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L17">2</a></div></td><td></td><td><div>1234</div><div>4</div><div>24</div></td><td class="s">use Yukki::User;</td></tr>
<tr><td class="h">18</td><td colspan="7"></td></tr><tr><td class="h">19</td><td><div class="c3">2</div><div class="c3">2</div><div class="c3">2</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L19">2</a></div></td><td></td><td><div>15</div><div>3</div><div>13</div></td><td class="s">use namespace::clean;</td></tr>
<tr><td class="h">20</td><td colspan="7"></td></tr><tr><td class="h">21</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"># ABSTRACT: lookup users</td></tr>
<tr><td class="h">22</td><td colspan="7"></td></tr><tr><td class="h">23 - 46</td><td colspan="6"></td><td class="s"><pre>=head1 SYNOPSIS

&nbsp;&nbsp;my $users = $app-&gt;model(&#39;User&#39;);
&nbsp;&nbsp;my $user&nbsp;&nbsp;= $users-&gt;find(&#39;bob&#39;);

&nbsp;&nbsp;my $login_name = $user-&gt;login_name;
&nbsp;&nbsp;my $password&nbsp;&nbsp;&nbsp;= $user-&gt;password;
&nbsp;&nbsp;my $name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $user-&gt;name;
&nbsp;&nbsp;my $email&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $user-&gt;email;
&nbsp;&nbsp;my @groups&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $user-&gt;groups-&gt;@*;

=head1 DESCRIPTION

Read access to the current list of authorized users.

=head1 METHODS

=head2 set_password

&nbsp;&nbsp;&nbsp;&nbsp;$users-&gt;set_password($user, $cleartext);

Given a password in cleartext, this will hash the password using the application&#39;s hasher. The second argument containing the cleartext password is optional. When omitted, the value returned by the C&lt;password&gt; accessor of the C&lt;$user&gt; object will be used instead.

=cut</pre></td></tr>
<tr><td class="h">47</td><td colspan="7"></td></tr><tr><td class="h">48</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub set_password {</td></tr>
<tr><td class="h">49</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Model-User-pm--subroutine.html#L49">0</a></div></td><td><div class="c3">1</div></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my ($self, $user, $clear_password) = @_;</td></tr>
<tr><td class="h">50</td><td><div class="c0">0</div></td><td></td><td><div class="c0"><a href="lib-Yukki-Model-User-pm--condition.html#L50">0</a></div></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$clear_password //= $user-&gt;password;</td></tr>
<tr><td class="h">51</td><td colspan="7"></td></tr><tr><td class="h">52</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $digest = $self-&gt;app-&gt;hasher;</td></tr>
<tr><td class="h">53</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$digest-&gt;add($clear_password);</td></tr>
<tr><td class="h">54</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$user-&gt;password($digest-&gt;generate);</td></tr>
<tr><td class="h">55</td><td colspan="7"></td></tr><tr><td class="h">56</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return;</td></tr>
<tr><td class="h">57</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">58</td><td colspan="7"></td></tr><tr><td class="h">59 - 65</td><td colspan="6"></td><td class="s"><pre>=head2 save

&nbsp;&nbsp;&nbsp;&nbsp;$users-&gt;save($user, create_only =&gt; 1);

Writes a L&lt;Yukki::User&gt; object to the users database. If the C&lt;create_only&gt; flag is set, the method will fail with an exception when the user already exists.

=cut</pre></td></tr>
<tr><td class="h">66</td><td colspan="7"></td></tr><tr><td class="h">67</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub save {</td></tr>
<tr><td class="h">68</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Model-User-pm--subroutine.html#L68">0</a></div></td><td><div class="c3">1</div></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my ($self, $user, %opt) = @_;</td></tr>
<tr><td class="h">69</td><td colspan="7"></td></tr><tr><td class="h">70</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $user_file = $self-&gt;locate(&#39;user_path&#39;, $user-&gt;login_name);</td></tr>
<tr><td class="h">71</td><td colspan="7"></td></tr><tr><td class="h">72</td><td><div class="c0">0</div></td><td><div class="c0" title="-/-"><a href="lib-Yukki-Model-User-pm--branch.html#L72">0</a></div></td><td><div class="c0"><a href="lib-Yukki-Model-User-pm--condition.html#L72">0</a></div></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;if ($opt{create_only} &amp;&amp; $user_file-&gt;exists) {</td></tr>
<tr><td class="h">73</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die &quot;User &quot;, $user-&gt;login_name, &quot; already exists.&quot;;</td></tr>
<tr><td class="h">74</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">75</td><td colspan="7"></td></tr><tr><td class="h">76</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$user_file-&gt;parent-&gt;mkpath;</td></tr>
<tr><td class="h">77</td><td><div class="c0">0</div></td><td><div class="c0" title="-/-"><a href="lib-Yukki-Model-User-pm--branch.html#L77">0</a></div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$user_file-&gt;chmod(0600) if $user_file-&gt;exists;</td></tr>
<tr><td class="h">78</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$user_file-&gt;spew_utf8($user-&gt;dump_yaml);</td></tr>
<tr><td class="h">79</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$user_file-&gt;chmod(0400);</td></tr>
<tr><td class="h">80</td><td colspan="7"></td></tr><tr><td class="h">81</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return;</td></tr>
<tr><td class="h">82</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">83</td><td colspan="7"></td></tr><tr><td class="h">84 - 90</td><td colspan="6"></td><td class="s"><pre>=head2 delete

&nbsp;&nbsp;&nbsp;&nbsp;$users-&gt;delete($user);

Given a L&lt;Yukki::User&gt;, this method deletes the user file for that object.

=cut</pre></td></tr>
<tr><td class="h">91</td><td colspan="7"></td></tr><tr><td class="h">92</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub delete {</td></tr>
<tr><td class="h">93</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Model-User-pm--subroutine.html#L93">0</a></div></td><td><div class="c3">1</div></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my ($self, $user) = @_;</td></tr>
<tr><td class="h">94</td><td colspan="7"></td></tr><tr><td class="h">95</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $user_file = $self-&gt;locate(&#39;user_path&#39;, $user-&gt;login_name);</td></tr>
<tr><td class="h">96</td><td><div class="c0">0</div></td><td><div class="c0" title="-/-"><a href="lib-Yukki-Model-User-pm--branch.html#L96">0</a></div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$user_file-&gt;remove if $user_file-&gt;is_file;</td></tr>
<tr><td class="h">97</td><td colspan="7"></td></tr><tr><td class="h">98</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return;</td></tr>
<tr><td class="h">99</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">100</td><td colspan="7"></td></tr><tr><td class="h">101 - 107</td><td colspan="6"></td><td class="s"><pre>=head2 find

&nbsp;&nbsp;my $user = $users-&gt;find(login_name =&gt; $login_name);

Returns a hash containing the information related to a specific user named by login name.

=cut</pre></td></tr>
<tr><td class="h">108</td><td colspan="7"></td></tr><tr><td class="h">109</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub find {</td></tr>
<tr><td class="h">110</td><td><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Model-User-pm--subroutine.html#L110">1</a></div></td><td><div class="c3">1</div></td><td><div>2219</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my ($self, $opt)</td></tr>
<tr><td class="h">111</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= validate(\@_, class_type(__PACKAGE__),</td></tr>
<tr><td class="h">112</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slurpy Dict[</td></tr>
<tr><td class="h">113</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;login_name =&gt; LoginName</td></tr>
<tr><td class="h">114</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],</td></tr>
<tr><td class="h">115</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">116</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>13</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $login_name = $opt-&gt;{login_name};</td></tr>
<tr><td class="h">117</td><td colspan="7"></td></tr><tr><td class="h">118</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>68</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $user_file = $self-&gt;locate(&#39;user_path&#39;, $login_name);</td></tr>
<tr><td class="h">119</td><td><div class="c3">1</div></td><td><div class="c0" title="T/-"><a href="lib-Yukki-Model-User-pm--branch.html#L119">50</a></div></td><td></td><td></td><td></td><td><div>4</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;if ($user_file-&gt;exists) {</td></tr>
<tr><td class="h">120</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>28</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Yukki::User-&gt;load_yaml($user_file-&gt;slurp_utf8);</td></tr>
<tr><td class="h">121</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">122</td><td colspan="7"></td></tr><tr><td class="h">123</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return;</td></tr>
<tr><td class="h">124</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">125</td><td colspan="7"></td></tr><tr><td class="h">126 - 132</td><td colspan="6"></td><td class="s"><pre>=head2 list

&nbsp;&nbsp;&nbsp;&nbsp;my @names = $users-&gt;list;

Returns a list of login names for all users configured.

=cut</pre></td></tr>
<tr><td class="h">133</td><td colspan="7"></td></tr><tr><td class="h">134</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub list {</td></tr>
<tr><td class="h">135</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Model-User-pm--subroutine.html#L135">0</a></div></td><td><div class="c3">1</div></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;</td></tr>
<tr><td class="h">136</td><td colspan="7"></td></tr><tr><td class="h">137</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $user_dir = $self-&gt;locate(&#39;user_path&#39;);</td></tr>
<tr><td class="h">138</td><td><div class="c0">0</div><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return map { $_-&gt;basename } $user_dir-&gt;children;</td></tr>
<tr><td class="h">139</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">140</td><td colspan="7"></td></tr><tr><td class="h">141</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">1;</td></tr>
</table>
</body>
</html>