<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Learn-a-holic Geek Notes]]></title>
  <link href="http://learnaholic.me/atom.xml" rel="self"/>
  <link href="http://learnaholic.me/"/>
  <updated>2015-07-05T14:46:32+02:00</updated>
  <id>http://learnaholic.me/</id>
  <author>
    <name><![CDATA[Kornelije Sajler]]></name>
    <email><![CDATA[xajler@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Ubuntu VPS Step-By-Step Configuration Notes]]></title>
    <link href="http://learnaholic.me/2014/01/09/ubuntu-vps-step-by-step-config-notes/"/>
    <updated>2014-01-09T14:54:00+01:00</updated>
    <id>http://learnaholic.me/2014/01/09/ubuntu-vps-step-by-step-config-notes</id>
    <content type="html"><![CDATA[<p><strong>UPDATED</strong> (June 30th, 2015)</p>

<p><strong>Changes</strong>:</p>

<p><em>June 30th, 2015</em></p>

<ul>
<li>Covering <em>Ubuntu 14.04 LTS</em>.</li>
<li>Adde extra <em>SSH</em> security, using <em>Public Keys</em> and some more tweaks in <code>sshd_config</code>.</li>
<li>Added usual <em>PHP</em> &amp; <em>MySQL</em> install and configure.</li>
<li>Using <code>service &lt;COMMAND&gt; &lt;ACTION&gt;</code> seems <em>Ubuntu</em> nowdays have problem with <code>/etc/init.d</code>, it is old school, but I&#8217;ve liked it. (Thanks to <em>Rapha</em> for mention it in comments).</li>
<li>Latest Ruby <code>2.2.2</code></li>
</ul>


<p><em>January 9th, 2014</em></p>

<ul>
<li>First version covering <em>Ubuntu 13</em>.</li>
</ul>


<p>Here are notes and step-by-step tutorial to set <em>Ubuntu VPS</em> secure and with <em>nginx</em>, <em>node.js</em>, <em>ruby</em>, <em>PostgreSQL</em>, &#8230;</p>

<p>It should work for <em>Ubuntu</em> 12 or 13 or 14 versions. My <em>VPS</em> provider still doesn&#8217;t have support <em>Ubuntu</em> 15, but I don&#8217;t think that there would be any problem using this for <em>Ubuntu</em> 15.</p>

<p>It assumes knowledge of <em>SSH</em> and connecting to your fresh VPS install.</p>

<p>Throughout the install process for editing I’m using <em>vi</em>, you can use what ever makes you happy: <em>emacs</em>, <em>nano</em>, &#8230;</p>

<p>Those are just my notes, if someone has something better or can improve it please do comment!</p>

<h2>Security</h2>

<h3>Update and installing essential software</h3>

<pre><code>sudo apt-get -y update
sudo apt-get -y install curl git-core python-software-properties software-properties-common
</code></pre>

<h3>Locale problem</h3>

<p>Very annoying error in apt: <em>locale: Cannot set LC_CTYPE</em>. It is probably due to your local machine, add this to your <code>.bashrc</code> or <code>.zshrc</code>:</p>

<pre><code>export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
</code></pre>

<h3>User - Admin Group &amp; SSH</h3>

<pre><code>sudo groupadd admin
sudo adduser &lt;USERNAME&gt;
sudo usermod -a -G admin &lt;USERNAME&gt;
sudo dpkg-statoverride --update --add root admin 4750 /bin/su
</code></pre>

<p>Test new user and test that has <code>sudo</code> privileges:</p>

<pre><code>su &lt;USERNAME&gt;
</code></pre>

<p>Secure SSH:</p>

<pre><code>sudo vi /etc/ssh/sshd_config
</code></pre>

<p>Make these changes:</p>

<ul>
<li><code>Port</code> <DESIRED_PORT_NUMBER> (Don&#8217;t use default 22)</li>
<li><code>PermitRootLogin</code> <code>no</code></li>
<li><code>X11Forwarding</code> <code>no</code></li>
<li><code>AllowTcpForwarding</code> <code>no</code></li>
<li><code>AllowUsers</code> USERNAME USERNAME2</li>
</ul>


<p>If your SSH is very slow setting <code>X11Forwarding</code> to <code>no</code> can really help in this case!</p>

<pre><code>sudo service ssh restart
</code></pre>

<p>Connect to <em>VPS SSH</em>:</p>

<pre><code>ssh &lt;USERNAME&gt;@&lt;VPS_DOMAIN_OR_IP&gt; -p &lt;PORT&gt;
</code></pre>

<h3>SSH Extra Security</h3>

<p>The idea is to not permit passwords and use <em>SSH</em> keys for authentication, and some other tweaks to <em>SSH</em>.</p>

<pre><code>mkdir ~/.ssh
vi ~/.ssh/authorized_keys
</code></pre>

<p>And paste the content of your local machine <em>Public Key</em> file: <code>.ssh/id_rsa.pub</code> and make it <code>rw</code> only for current user:</p>

<pre><code>chmod 600 ~/.ssh/authorized_keys
</code></pre>

<p>Or use <code>ssh-copy-id</code> from your local machine, which isn&#8217;t on <em>Mac</em>, and can be installed with <code>brew</code> but I have no luck:</p>

<pre><code>brew install ssh-copy-id
ssh-copy-id "&lt;USERNAME&gt;@&lt;VPS_DOMAIN_OR_IP&gt; -p &lt;PORT&gt;"
</code></pre>

<p>Try to connect to <em>SSH</em> and it should not ask you for password, it should be instant login:</p>

<pre><code>ssh &lt;USERNAME&gt;@&lt;VPS_DOMAIN_OR_IP&gt; -p &lt;PORT&gt;
</code></pre>

<p>Open <em>SSH</em> config file, uncomment <code>PasswordAuthentication</code> which is by default set to <code>yes</code>:</p>

<pre><code>sudo vi /etc/ssh/sshd_config
</code></pre>

<p>Change it to <code>no</code>:</p>

<pre><code>PasswordAuthentication no
</code></pre>

<p>Restart <em>SSH</em> and try to connect again:</p>

<pre><code>sudo service ssh restart
</code></pre>

<p>Exit the VPS shell and try to connect to VPS <em>SSH</em>.</p>

<h3>Firewall</h3>

<p>To have <code>ping</code> and <code>apt-get</code> working, add the following into <em>iptables</em>, as <em>ufw</em> just interfaces with it.</p>

<pre><code>sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

sudo apt-get -y install ufw
sudo vi /etc/default/ufw
</code></pre>

<p>Make this change:</p>

<pre><code>IPV6=no
</code></pre>

<p>Allow some ports and services:</p>

<pre><code>sudo ufw allow &lt;PORT_NUMBER_CHANGED_TO_SSH&gt;
sudo ufw limit ssh
sudo ufw allow 80/tcp
sudo ufw allow out 53
sudo ufw logging on
</code></pre>

<p>Be sure that you allowed the changed port for <em>SSH</em> because otherwise, you’ll be unable to get into VPS!!!</p>

<pre><code>sudo ufw enable
</code></pre>

<p>Check the Firewall status with:</p>

<pre><code>sudo ufw status verbose
</code></pre>

<h3>sysctl</h3>

<pre><code>sudo mv /etc/sysctl.conf /etc/sysctl.conf.orig
sudo vi /etc/sysctl.conf
</code></pre>

<p>Add this to a <code>sysctl.conf</code>:</p>

<pre><code># IP Spoofing protection
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Ignore ICMP broadcast requests
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Disable source packet routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0

# Ignore send redirects
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# Block SYN attacks
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5

# Log Martians
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# Ignore Directed pings
net.ipv4.icmp_echo_ignore_all = 1
</code></pre>

<p>  Then run, there can be possible some errors, especially on <em>VPS</em> with <em>OpenVZ</em>&#8230;</p>

<pre><code>sudo sysctl -p
</code></pre>

<h3>Denyhost or Fail2Ban</h3>

<p>Before <em>Denyhost</em> was uset but it seems it is no longer maintained and there is no Ubuntu package anymore so the <em>Fail2Ban</em> is alternative, but since the SSH is set to permit only <em>SSH</em> keys, both of those are redundant.</p>

<h3>Remove Samba File Sharing</h3>

<p>If for some reason you have completely unnecessary <em>Samba</em> installed by default on VPS you can remove it with:</p>

<pre><code>sudo apt-get -y remove --purge samba
</code></pre>

<h3>Remove Bind DNS Server</h3>

<p>Same with Bind, if you don’t need it, remove it!</p>

<pre><code>sudo apt-get -y remove --purge bind9
sudo rm -rf /var/cache/bind
sudo rm -rf /usr/share/bind9
sudo rm -rf /etc/bind
</code></pre>

<h2>SSH Key and GitHub</h2>

<p>Check if <code>~/.ssh</code> has <code>*.pub</code> files, if not generate the <em>SSH</em> key:</p>

<pre><code>ssh-keygen -t rsa -C "&lt;YOUR_EMAIL&gt;"
</code></pre>

<p>Use default place to store: <code>~/.ssh</code></p>

<p>Do not use passphrase, unless you want to type every time you commit to <em>GitHub</em>. <em>(Or anyone knows better way?).</em></p>

<pre><code>cat ~/.ssh/id_rsa.pub
</code></pre>

<p>Copy the contents to clipboard.
Go to <em>GitHub</em> > Account Settings > SSH Keys.
Hit <code>Add SSH Key</code> give title and in <code>Key</code> paste public key from clipboard.</p>

<pre><code>ssh git@github.com
eval `ssh-agent -s`
ssh-add -k
</code></pre>

<h2>Software Install</h2>

<h3>Instal nginx</h3>

<pre><code>sudo add-apt-repository ppa:nginx/stable
sudo apt-get -y update
sudo apt-get -y install nginx
sudo service start nginx
</code></pre>

<p>If error is <code>nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)</code> then probably <em>Apache</em> is installed beforehand:</p>

<pre><code>sudo apt-get remove apache2-mpm-prefork
sudo apt-get remove apache2-mpm-worker
sudo apt-get remove apache2
</code></pre>

<p>You can check and purge installed <em>Apache</em>:</p>

<pre><code>sudo dpkg --get-selections | grep  apache
# Purge others that are given as result from above command
sudo dpkg --purge apache2
sudo service nginx start
</code></pre>

<p>If something is wrong look for nginx logs:</p>

<pre><code>sudo vi /var/log/nginx/error.log
</code></pre>

<h3>Install and configure PostgreSQL, create DB and DB User</h3>

<pre><code>sudo add-apt-repository ppa:pitti/postgresql
sudo apt-get -y update
sudo apt-get install -y postgresql libpq-dev
</code></pre>

<p>Log into <code>postgres</code> change main password, create db user with password and create new database with previously created user as owner:</p>

<pre><code>sudo -u postgres psql
\password  "&lt;PASSWORD&gt;"
create user &lt;USERNAME&gt; with password '&lt;USER_PASSWORD&gt;';
create database &lt;DB_NAME&gt; owner &lt;USERNAME&gt;;
\q
</code></pre>

<h3>Install MySQL, create DB and DB User</h3>

<pre><code>sudo apt-get install mysql-server
</code></pre>

<p>The install will prompt you for <code>root</code> user password that needs to be re-entered, choose password wisely and try to remember it! After install log into <em>MySQL</em>:</p>

<pre><code>mysql -u root -p # After enter there is need to write password and hit enter again
</code></pre>

<p>Use mysql command line app for interacting with <em>MySQL</em>, lets create user and DB with user granted on this DB:</p>

<pre><code>mysql&gt; CREATE DATABASE &lt;DB_NAME&gt;;
mysql&gt; SHOW DATABASES;  # The new db should be listed.
mysql&gt; CREATE USER '&lt;DB_USERNAME&gt;'@'localhost';
mysql&gt; SELECT User,Host FROM mysql.user; # The new user should be listed on host localhost.
mysql&gt; GRANT ALL ON &lt;DB_NAME&gt;.* to '&lt;DB_USERNAME&gt;'@'localhost' identified by '&lt;DB_PASSWORD&gt;'; # It will grant all on this DB by this user.
mysql&gt; exit # Or new command \q
</code></pre>

<p>If you need to run <em>SQL</em> script for database, use this from command line:</p>

<pre><code>mysql -u &lt;DB_USERNAME&gt; -p &lt;DB_NAME&gt; &lt; &lt;SCRIPT_NAME&gt;.sql
</code></pre>

<h3>Install Ruby with rbenv and rbenv-installer</h3>

<pre><code>cd
curl https://raw.github.com/fesplugas/rbenv-installer/master/bin/rbenv-installer | bash
vi .bashrc
</code></pre>

<p>At top add:</p>

<pre><code>export RBENV_ROOT="${HOME}/.rbenv"

if [ -d "${RBENV_ROOT}" ]; then
  export P
  ATH="${RBENV_ROOT}/bin:${PATH}"
  eval "$(rbenv init -)"
fi
</code></pre>

<p>Reset <code>.bashrc</code>:</p>

<pre><code>. ~/.bashrc
</code></pre>

<p>Note that <code>bootstrap-ubuntu-12-04</code> works fine for <em>Ubuntu</em> 13 &amp; 14 (probably 15 too):</p>

<pre><code>rbenv bootstrap-ubuntu-12-04
</code></pre>

<p>Firstly list <em>rbenv</em> available <em>Ruby</em> versions and pick one to install:</p>

<pre><code>rbenv install -l
rbenv install 2.2.2
</code></pre>

<p>Set chosen <em>Ruby</em> version to be &#8220;global&#8221;, and test it:</p>

<pre><code>rbenv global 2.2.2
ruby -v
</code></pre>

<h3>Install PHP &amp; friends</h3>

<p>The long list of <em>PHP</em> packages covering <em>Imagemagick</em>, <em>MySQL</em>, <em>bcrypt</em>,&#8230;:</p>

<pre><code>sudo apt-get install imagemagick php5-fpm php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-xcache
</code></pre>

<p>Change usaul suspects of <code>php.ini</code> properties:</p>

<pre><code>sudo vi /etc/php5/fpm/php.ini
</code></pre>

<ul>
<li><code>upload_max_filesize</code> = (SOME_NUMBER)M (Default 2Mb - safe to use 25M)</li>
<li><code>post_max_size</code> = (SOME_NUMBER)M (Default 8Mb - safe to use 25M)</li>
<li><code>memory_limit</code> = (SOME_NUMBER)M (Default 128Mb - safe to use 512M)</li>
</ul>


<p>Restart <em>PHP-FPM</em> and <em>Nginx</em>:</p>

<pre><code>sudo pkill php5-fpm; service php5-fpm start
sudo service nginx restart
</code></pre>

<h3>Install node.js</h3>

<pre><code>sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get -y update
sudo apt-get install -y nodejs
</code></pre>

<h3>Install and Configure redis</h3>

<pre><code>sudo apt-get -y install redis-server
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.default
</code></pre>

<ul>
<li><code>pidfile /var/run/redis-server.pid</code></li>
<li><code>logfile /var/log/redis-server.log</code></li>
</ul>


<h2>Esoteric Installments</h2>

<h3>Install erlang</h3>

<pre><code>sudo apt-get -y install erlang-nox
</code></pre>

<h3>Install and Configure riak</h3>

<pre><code>curl http://apt.basho.com/gpg/basho.apt.key | sudo apt-key add -
sudo bash -c "echo deb http://apt.basho.com $(lsb_release -sc) main &gt; /etc/apt/sources.list.d/basho.list"
</code></pre>

<p>If <em>Ubuntu</em> is not <em>LTS</em> instead of <code>lsb_release -sc</code> use name of <em>LTS</em>, eg. <em>Ubuntu</em> 14.10 (<em>Utopic</em>) is not LTS use 14.04 codename <em>trusty</em> instead. Use this <a href="https://en.wikipedia.org/wiki/List_of_Ubuntu_releases#Table_of_versions">Wikipedia table</a> to help with names for particular <em>Ubuntu</em> version(s).</p>

<pre><code>sudo apt-get -y update
sudo apt-get -y install riak
</code></pre>

<h4>Change PAM Based Limits for riak</h4>

<pre><code>sudo vi /etc/pam.d/common-session
</code></pre>

<p>Add at the end of file:</p>

<pre><code>session required    pam_limits.so
</code></pre>

<p>Update <code>limits.conf</code>:</p>

<pre><code>sudo vi /etc/security/limits.conf

# Add this to limits.conf
*               soft     nofile          65536
*               hard     nofile          65536
</code></pre>

<p>If accessing riak nodes via <em>SSH</em>:</p>

<pre><code>sudo vi /etc/ssh/sshd_config
UseLogin yes
</code></pre>

<p>Reboot machine and test that limit of open files is <code>65536</code> with:</p>

<pre><code>ulimit -a
&gt; open files                      (-n) 65536
</code></pre>

<p>or with:</p>

<pre><code>ulimit -n
</code></pre>

<p>Hope it helps, please give feedback and comments with any missing/wrong parts to this
<em>Ubunt VPS</em> install, because I&#8217;m far from <em>Linux</em> guru, but appreciate secure and stable <em>Linux</em> machine!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Enable NTFS write on Mac OS X Mavericks for free and geeky way]]></title>
    <link href="http://learnaholic.me/2013/11/11/enable-ntfs-write-on-mac-os-x-mavericks/"/>
    <updated>2013-11-11T16:03:00+01:00</updated>
    <id>http://learnaholic.me/2013/11/11/enable-ntfs-write-on-mac-os-x-mavericks</id>
    <content type="html"><![CDATA[<p>By default Mac OS X Mavericks (same goes for older distribution) has <em>Microsoft</em> file system <em>NTFS</em> read-only. There are proprietary software like <em>Tuxera</em> that can enable to write to NTFS. Interesting point is that you don&#8217;t need to buy it is for free, you just need to geek a bit to make it writable.</p>

<p>Are you geeky enough?</p>

<p>Surely you guessed it, this will not go without console application in <em>Mac</em> this is <em>Terminal</em>, and some of us may us better one <em>iTerm2</em>, either way you&#8217;ll need to know how to open it.</p>

<p>Easiest way is to use <em>Spotlight</em> just hit <code>Cmd + Space</code> and write <em>Terminal</em> and here we go&#8230;
The other way is in your <em>Finder</em> <code>Applications &gt; Utilities &gt; Terminal</code>. (Those who use <em>iTerm2</em>, I bet they know how to open it :D)</p>

<p>Before we start on, <strong>MAKE SURE</strong> that your USB stick, external HDD, has single name to it, or better yet without spaces in name! e.g. &#8221;<code>MyPrecious</code>&#8221; is fine, &#8221;<code>My Precious</code>&#8221; is not!<br/>
And what I mean by name is the label name that you get in <em>Finder</em> or <em>Desktop</em> when you plug your device, that is underneath the HDD icon, this is mostly set by manufacture, and if you know how to format on <em>Windows</em>, you can also set custom name!</p>

<p>In <em>Terminal</em>  create <code>/etc/fstab</code> with <code>nano</code>, easier for most users, others can use <code>vim</code>, <code>emacs</code>&#8230; (it will ask you for your username password if you have it, write it, if not just hit enter):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo nano /etc/fstab
</span></code></pre></td></tr></table></div></figure>


<p>When is created enter this content inside of <code>/etc/fstab</code>, be sure that you know the name of your device:</p>

<p><img src="http://learnaholic.me/images/mounted_disk_label_name.png"></p>

<p>In my case in image is <code>Elements</code>, be sure to change below &#8220;device-name&#8221; to name you got, and there is no spaces in name!!!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">LABEL</span><span class="o">=</span>device-name  none    ntfs    rw,auto,nobrowse
</span></code></pre></td></tr></table></div></figure>


<p>When you finished entering content, use <code>Ctrl + X</code> (it is lowercase x), it will prompt you to save it or not, enter <code>y</code>, you&#8217;ll get another prompt to write to file, just hit enter.<br/>
And that&#8217;s essentially it, I will not even try to explain what we just did, it will melt brain for most users, just believe me&#8230; I know what I&#8217;m doing!</p>

<p>The only problem is now, when you plug your device, you&#8217;re not gonna get a icon on <em>Desktop</em> or <em>Finder</em>.<br/>
Mac stores its mounted devices in hidden folder <code>/Volumes</code>, so while we have <em>Terminal</em> up and running, make symbolic link of it to the <em>Desktop</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo ln -s /Volumes ~/Desktop/Volumes
</span></code></pre></td></tr></table></div></figure>


<p>Afterwards unmount your device (right click on device icon and choose <code>Eject</code>), sometimes is needed to reboot (restart) your Mac, so it is safe to do so!</p>

<p>Now on your <em>Desktop</em>, you&#8217;ll have a &#8220;folder&#8221; named <code>Volumes</code>, and when you plug your <em>NTFS</em> device, go into this folder, and you&#8217;ll find there your device armed and ready!<br/>
If you want to save from some other application, when the dialog is open, got to <code>Desktop &gt; Volumes &gt; [Name of Device]</code> and save it!</p>

<p>And best thing is, if you are in no need to have support for NTFS anymore, remove <code>/etc/fstab</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo rm /etc/fstab
</span></code></pre></td></tr></table></div></figure>


<p>&#8230; and everything is as before and live happily ever after!</p>

<p>This is how you can have writable <em>NTFS</em> support on your <em>Mac</em>, totally for free, and for bonus feeling geeky :)</p>

<p>But nevertheless, if you want to buy the software that does it for you, sure, be my guest&#8230; nobody is geek!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ArchLinux VirtualBox Install Notes]]></title>
    <link href="http://learnaholic.me/2013/11/10/archlinux-virtualbox-install-notes/"/>
    <updated>2013-11-10T14:54:00+01:00</updated>
    <id>http://learnaholic.me/2013/11/10/archlinux-virtualbox-install-notes</id>
    <content type="html"><![CDATA[<p>For a few years now I really wanted to get some time to learn/install and play around with <a href="https://www.archlinux.org/">ArchLinux</a>. <em>ArchLinux</em> is very minimal, highly customizable, but powerful distribution of <em>Linux</em> based on one of oldest distribution <em>Slackware</em> and <em>BSD</em> like Unix.</p>

<p><em>ArchLinux</em> is not for everybody, if you want everything out-of-box, then probably <em>Ubuntu</em>, <em>Mint</em>, <em>Fedora</em> or like are for you. But for me, and I have <em>Mac</em>, I see no difference between <em>Ubuntu</em> and <em>Mac</em>. Because for both, out-of-box you&#8217;ll get a predefined UI, apps. I&#8217;m not going into discussion that most of this can be change in <em>Ubuntu</em>, but how much of them really change?</p>

<p><em>ArchLinux</em> is completely opposite, the install is not really easy (for average PC user), nor GUI like, and after install you are left with bare minimal packages needed for OS to run and configure, and without GUI too.</p>

<p>This installation is not for Linux <em>n00bs</em>, some familiarity with console and Linux commands should be expected, because some of notes are really not in depth and there are thing assumed, like basic knowledge of <code>vim</code> (or you can replace <code>vim</code> with <code>nano</code>).</p>

<p>This is all part of my learning <em>ArchLinux</em>, and then to dual boot it on my <em>Mac</em> with <em>Mac OS X</em>. And even though I really like <em>Mac</em>, I really have huge respect and likeness for <em>Linux</em>, and my minimalistic side was in real need of distribution like <em>ArchLinux</em>. Why <em>ArchLinux</em>?</p>

<p>Just look into their <a href="https://wiki.archlinux.org/">wiki</a>, that much of content and expressiveness (sometimes maybe too much) it is really what it makes <em>ArchLinux</em> great, and second is the <a href="https://aur.archlinux.org/"><em>Arch User Repository</em> (<em>AUR</em>)</a> where you can search for packages, install and comment them (very helpful comments!).</p>

<p>Another strength is that <em>ArchLinux</em> has no release versions, it is rolling released distribution, and if you update weekly or monthly, you&#8217;ll always have latest versions of your applications and <em>ArchLinux</em> respectively. Another strength (that is for someone is weakness) is that mostly <em>ArchLinux</em> packages are latest stable releases of software, and even this can get you to <em>dependency hell</em>, in most cases, you&#8217;ll end up with latest software with all new features and bug fixes immediately, and not waiting for next version release of OS distribution.</p>

<blockquote><p>Note:</p>

<p>I use <a href="http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard">Dvorak keyboard layout</a> and it is throughout the installation, if you use <code>us</code> layout ignore all of it, but if you use some other layout e.g. <code>hr</code> then replace where <code>dvorak</code> to <code>hr</code>!</p></blockquote>

<h2>VirtualBox Pre-installation</h2>

<ul>
<li><a href="https://www.virtualbox.org/wiki/Downloads">Download</a>, install and create new <em>VirtualBox</em> machine, for <em>ArchLinux</em> x64.</li>
<li>Download &#8220;dual&#8221; ISO from <a href="https://www.archlinux.org/download/">ArchLinux mirrors</a>.</li>
<li>Add <em>ISO</em> to <em>VirtualBox</em> and set it for CD/DVD.</li>
</ul>


<h2>Installation</h2>

<p>Choose <code>x86_64</code> version.<br/>
Change to <code>Dvorak</code> layout:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>loadkeys dvorak</span></code></pre></td></tr></table></div></figure>


<p>Ping <em>google.com</em> to see if there is Internet connection, if not run:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>dhcpcd</span></code></pre></td></tr></table></div></figure>


<p>Update <code>pacman</code> package manager repository:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -Sy</span></code></pre></td></tr></table></div></figure>


<p>Install <code>vim</code> as a default editor for installation (even though you can use installed plain old <code>vi</code> or <code>nano</code>):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -S vim</span></code></pre></td></tr></table></div></figure>


<p>See what disk structure there is:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>lsblk</span></code></pre></td></tr></table></div></figure>


<p>For <strong>MBR</strong> installation use <code>cfdisk</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cfdisk /dev/sda</span></code></pre></td></tr></table></div></figure>


<p>Create new partition with choosing <code>[ New ]</code> with 1024 Mb for <code>boot</code> directory (not necessary!).</p>

<p>Make it bootable by choosing <code>[ Bootable ]</code>.</p>

<p>Create new partition with choosing <code>[ New ]</code> with rest of your disk space for <code>root</code> folder.</p>

<p>Create filesystems:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mkfs.ext4 /dev/sda1
</span><span class='line'>mkfs.ext4 /dev/sda2</span></code></pre></td></tr></table></div></figure>


<p>Mount partitions and create <code>boot</code> dir, for boot partition:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mount /dev/sda2 /mnt
</span><span class='line'>mkdir /mnt/boot
</span><span class='line'>mount /dev/sda1 /mnt/boot</span></code></pre></td></tr></table></div></figure>


<p>Change mirror for <code>pacman</code>, I use anything in <em>Germany</em>, and paste to top of <code>mirrorlist</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/pacman.d/mirrorlist</span></code></pre></td></tr></table></div></figure>


<p>Install base and devel system (this can take for while, so better choose good mirror to be fast as possible!):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>
</span><span class='line'>pacstrap -i /mnt base base-devel</span></code></pre></td></tr></table></div></figure>


<p>Generate <code>fstab</code> and check it:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>genfstab -U -p /mnt &gt;&gt; /mnt/etc/fstab
</span><span class='line'>vim /mnt/etc/fstab</span></code></pre></td></tr></table></div></figure>


<h3>Chroot and configure system</h3>

<p>Chroot to <code>mnt</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>arch-chroot /mnt</span></code></pre></td></tr></table></div></figure>


<p>Create custom Keyboard Layout in <code>vconsole.conf</code>, and and add keyboard map for <em>Dvorak</em>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/vconsole.conf
</span><span class='line'>
</span><span class='line'> # add content to it 
</span><span class='line'>
</span><span class='line'>"KEYMAP=dvorak"</span></code></pre></td></tr></table></div></figure>


<p>Update with <code>pacman</code> and install <code>vim</code> (again, omit if you&#8217;re using <code>vi</code> or <code>nano</code>):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -Sy
</span><span class='line'>pacman -S vim</span></code></pre></td></tr></table></div></figure>


<p>Set up locale, for me uncomment <code>en_US UTF-8</code> in <code>locale.gen</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/locale.gen
</span><span class='line'>locale-gen</span></code></pre></td></tr></table></div></figure>


<p>Create <code>locale.conf</code> and export locale:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>echo LANG=en_US.UTF-8 &gt; /etc/locale.conf
</span><span class='line'>export LANG=en_US.UTF-8</span></code></pre></td></tr></table></div></figure>


<p>Set Time Zone by linking to time zone info to <code>localtime</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'> # use to see all zone infos
</span><span class='line'>ls /usr/share/zoneinfo
</span><span class='line'>
</span><span class='line'> # use to see all zone sub infos
</span><span class='line'>ls /usr/share/zoneinfo/Europe
</span><span class='line'>
</span><span class='line'>ln -s /usr/share/zoneinfo/Europe/Zagreb /etc/localtime</span></code></pre></td></tr></table></div></figure>


<p>Set Hardware Clock to UTC:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>hwclock --systohc --utc</span></code></pre></td></tr></table></div></figure>


<p>Set Hostname:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>echo vbox-arch &gt; /etc/hostname</span></code></pre></td></tr></table></div></figure>


<p>Configure Network:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>systemctl enable dhcpcd.service</span></code></pre></td></tr></table></div></figure>


<h3>Root passwd and new sudo user</h3>

<p>Set <code>root</code> password:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>passwd</span></code></pre></td></tr></table></div></figure>


<p>Create new user that will be sudo:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>useradd -m -g users -G wheel,video -s /bin/bash &lt;username&gt;</span></code></pre></td></tr></table></div></figure>


<p>Install <code>sudo</code> with <code>pacman</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -S sudo</span></code></pre></td></tr></table></div></figure>


<p>Uncomment <code>wheel</code> group from sudoers &#8221;<code>%wheel ALL=(ALL)</code>&#8221;, so that user just created can be sudo:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>visudo</span></code></pre></td></tr></table></div></figure>


<p>Set password to created user:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>passwd &lt;username&gt;</span></code></pre></td></tr></table></div></figure>


<h3>Bootloader</h3>

<p>Since we use <strong>MBR</strong> not <strong>GPT</strong> lets install <code>GRUB BIOS</code> bootloader:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -S grub-bios</span></code></pre></td></tr></table></div></figure>


<p>Install and configure <code>GRUB</code> to <code>/dev/sda</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>grub-install --recheck /dev/sda
</span><span class='line'>grub-mkconfig -o /boot/grub/grub.cfg</span></code></pre></td></tr></table></div></figure>


<p>Exit <code>chroot</code>, unmount mounted partitions and reboot:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>exit
</span><span class='line'>umount -R /mnt/boot
</span><span class='line'>umount -R /mnt
</span><span class='line'>reboot</span></code></pre></td></tr></table></div></figure>


<h2>Post Install</h2>

<p>Install <em>Yaourt</em> from <em>archlinuxfr</em>, for easier interaction/installation from <em>AUR</em>.<br/>
Add <em>archlinuxfr</em> repository to <code>/etc/pacman.conf</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>[archlinuxfr]
</span><span class='line'>SigLevel = Never
</span><span class='line'>Server = http://repo.archlinux.fr/$arch</span></code></pre></td></tr></table></div></figure>


<p>Update <code>pacman</code> and install <code>yaourt</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -Sy yaourt</span></code></pre></td></tr></table></div></figure>


<h3>GUI</h3>

<p>Install X server:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -S xorg-server xorg-server-utils xorg-xinit</span></code></pre></td></tr></table></div></figure>


<p>Install <code>mesa</code> for 3D support</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -S mesa</span></code></pre></td></tr></table></div></figure>


<h3>VirtualBox</h3>

<p>Install Guest additions:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -S virtualbox-guest-utils
</span><span class='line'>modprobe -a vboxguest vboxsf vboxvideo</span></code></pre></td></tr></table></div></figure>


<p>Create <code>virtualbox.conf</code> in <code>/etc/modules-load.d</code></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vim /etc/modules-load.d/virtualbox.conf</span></code></pre></td></tr></table></div></figure>


<p>Add modules guest and video to <code>virtualbox.conf</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>vboxguest
</span><span class='line'>vboxsf
</span><span class='line'>vboxvideo</span></code></pre></td></tr></table></div></figure>


<p>Log or <code>su</code> as created user.
Copy <code>.xinitrc</code> and add following content:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cp /etc/X11/xinit/xinitrc ~/.xinitrc
</span><span class='line'>vim ~/.xinitrc
</span><span class='line'>
</span><span class='line'> # add this inside .xinitrc (at the top!)
</span><span class='line'>
</span><span class='line'>/usr/bin/VBoxClient-all</span></code></pre></td></tr></table></div></figure>


<h3>Setup keyboard (non US)</h3>

<p>We did setup for console now we need to set up for X:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>localectl set-x11-keymap dvorak</span></code></pre></td></tr></table></div></figure>


<h3>Test X</h3>

<p>Install <code>xterm</code>, <code>xclock</code> and <code>lwm</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>pacman -S xorg-twm xorg-xclock xterm</span></code></pre></td></tr></table></div></figure>


<p>Start X</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>startx</span></code></pre></td></tr></table></div></figure>


<p><img src="http://learnaholic.me/images/arch-alsi.png"></p>

<p>This is a first part of <em>ArchLinux</em> covering installation, configuration and testing that <em>X</em> or <em>GUI</em> is functioning properly.
Next part is installing and configuring <em>Window Manager</em>. And since the <em>Gnome</em> and <em>KDE</em> are most popular, we will not use them at all!
Intention is to use <em>Tiled Window Manager</em>&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Configuring TeamCity 7 with Git revision short hash, Uploading to Amazon S3 and sending email with release link and Developer commit details]]></title>
    <link href="http://learnaholic.me/2013/06/05/configuring-teamcity-7-with-git-revisions-uploading-to-amazon-s3-and-sending-email-with-release-link/"/>
    <updated>2013-06-05T20:37:00+02:00</updated>
    <id>http://learnaholic.me/2013/06/05/configuring-teamcity-7-with-git-revisions-uploading-to-amazon-s3-and-sending-email-with-release-link</id>
    <content type="html"><![CDATA[<p>Here is a short tutorial (with extra long title!) how to improve the <a href="http://www.jetbrains.com/">JetBrains</a>
<a href="http://www.jetbrains.com/teamcity/">TeamCity</a> Build Server for <em>CI</em> (Continuos Integration).</p>

<p>This is what wiill do to improve <em>TeamCity 7</em>:</p>

<ul>
<li>Change the Build version number to include Git short hash (7 chars) as Revison e.g. <em>1.0.1.53e7986</em>.</li>
<li>Upload file to <a href="http://aws.amazon.com/s3/">Amazon S3</a>.</li>
<li>Send email via Gmail with:

<ul>
<li>Latest downloadable link of release from <em>Amazon S3</em>.</li>
<li>Developer commit message details.</li>
</ul>
</li>
</ul>


<blockquote><p>Note:</p>

<p>This is not blog post how to set up <em>TeamCity</em>, this is usually really straight forward thing to do.
So in this blog post I assume that there is <em>TeamCity</em> project and at least one <em>Build Configuration</em>
already created!</p></blockquote>

<h2>Setting Git Short Hash as Revision of TeamCity Build Number</h2>

<ul>
<li>In <em>TeamCity</em> go to desired named &#8221;<em>Build Configuration</em>&#8221; in our case &#8221;<em>aeon</em>&#8221;.</li>
<li>Click somewhere on right side on <em>Edit Configuration Settings</em> to enter <em>aeon Configuration Steps</em>.</li>
<li>In <em>(1) General Settings</em> set <em>Build format number</em> to something like 1.0.{0} and <em>Save</em>.</li>
<li>In <em>(3) Build Steps</em> click <em>Add build step</em> choose <em>Powershell</em> in listbox.</li>
<li>Set <em>Name</em> if you want like &#8221;<em>Get Build Number with short Git Hash</em>&#8221;.</li>
<li>For <em>Script</em> choose &#8221;<em>Source code</em>&#8221; from drop down box.</li>
<li>In <em>Script Source</em> add following <em>Powershell</em> code and click <em>Save</em>:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='powershell'><span class='line'><span class="nv">$BuildNumber</span> <span class="p">=</span> <span class="s2">&quot;%build.number%&quot;</span>
</span><span class='line'><span class="nv">$Hash</span> <span class="p">=</span> <span class="s2">&quot;%build.vcs.number%&quot;</span>
</span><span class='line'><span class="nv">$ShortHash</span> <span class="p">=</span> <span class="nv">$Hash</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="n">0</span><span class="p">,</span><span class="n">7</span><span class="p">)</span>
</span><span class='line'><span class="nb">Write-Host</span> <span class="s2">&quot;##teamcity[buildNumber &#39;$BuildNumber.$ShortHash&#39;]&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><em>Script execution mode</em> should not matter, mine is &#8220;Execute .ps1 script&#8230;&#8221;.</li>
<li>After save <strong>make sure that this <em>Build Step</em> is first</strong>!!!!</li>
<li>Use <em>Reorder build steps</em> link, if you have existing build setps.</li>
</ul>


<blockquote><p>Note:</p>

<p>When build starts by Agent, it will be 1.0.1 and at the end it will change to
1.0.1.53e7986!</p></blockquote>

<h3>Shell version (<em>Linux</em> or <em>Mac</em>)</h3>

<ul>
<li>All same as <em>Powershell</em> until <em>(3) Build Steps</em>.</li>
<li>In <em>(3) Build Steps</em> click <em>Add build step</em> choose <em>Command line</em> in listbox.</li>
<li>In <em>Custom Script</em> add following <em>shell</em> script and click <em>Save</em>:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">BUILD_NUMBER</span><span class="o">=</span>%build.number%
</span><span class='line'><span class="nv">GIT_HASH</span><span class="o">=</span>%build.vcs.number%
</span><span class='line'><span class="nv">GIT_HASH_SHORT</span><span class="o">=</span><span class="k">${</span><span class="nv">GIT_HASH</span><span class="p">:</span><span class="nv">0</span><span class="p">:</span><span class="nv">7</span><span class="k">}</span>
</span><span class='line'><span class="nb">echo</span> <span class="s2">&quot;##teamcity[buildNumber &#39;$BUILD_NUMBER.${GIT_HASH_SHORT}&#39;]&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Note:</p>

<p>I didn&#8217;t test <em>shell</em> version, it should work, but maybe some tweaks are necessary!</p></blockquote>

<h2>Powershell script for sending file to Amazon S3 and sending email via Gmail</h2>

<ul>
<li>Download and install <a href="http://aws.amazon.com/powershell">AWS Tools for Windows Powershell</a>.</li>
<li>With this SDK is really easy to upload file to Amazon S3.</li>
<li>Amazon S3 account is needed and also <em>Access Key</em> and <em>Secret Key</em>.</li>
<li>Assumes that Amazon S3 <em>bucket</em> name is &#8221;<em>aeon</em>&#8221; and region is &#8221;<em>eu-west-1</em>&#8221;.</li>
<li>This will produce <em>https://s3-eu-west-1.amazonaws.com/aeon/<release-file>&#8221;</em>.</li>
<li>The script is lousy written, it should be better, especially when it is needed to be reused for multiple Builded apps.</li>
<li>The thing needed to be entered will be inside &#8220;&lt;something-to-do&gt;&#8221;.</li>
<li>In my case the uploaded file is &#8220;.exe&#8221; file so it is harcoded in Amazon S3 URL.</li>
<li>Make sure that file name is not really crazy and there are no spaces in it (it is always easier this way)!</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
</pre></td><td class='code'><pre><code class='powershell'><span class='line'><span class="nv">$bucketName</span> <span class="p">=</span> <span class="s1">&#39;aeon&#39;</span>
</span><span class='line'><span class="nv">$hasCredentials</span> <span class="p">=</span> <span class="nv">$false</span><span class="err">;</span>
</span><span class='line'><span class="nv">$filePath</span> <span class="p">=</span> <span class="s1">&#39;&lt;absolute-path-to-folder-where-file-for-upload-is&gt;&#39;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="n">GetLastGitLog</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$sourcePath</span> <span class="p">=</span> <span class="s1">&#39;&lt;absolute-path-to-where-teamcity-pulls-repo&gt;&#39;</span>
</span><span class='line'>    <span class="nv">$isSourcePathExist</span> <span class="p">=</span> <span class="nb">Test-Path</span> <span class="nv">$sourcePath</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(!</span><span class="nv">$isSourcePathExist</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="s2">&quot;source folder ($sourcePath) for file is not existent! Exiting...&quot;</span>
</span><span class='line'>        <span class="n">exit</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nb">Set-Location</span> <span class="nv">$sourcePath</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">git</span> <span class="n">log</span> <span class="n">-n</span> <span class="n">1</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="n">MessageBody</span><span class="p">(</span><span class="nv">$version</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$url</span> <span class="p">=</span> <span class="s2">&quot;https://s3-eu-west-1.amazonaws.com/{0}/{1}.exe&quot;</span> <span class="o">-f</span> <span class="nv">$bucketName</span><span class="p">,</span> <span class="nv">$version</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$commitMessage</span> <span class="p">=</span> <span class="n">GetLastGitLog</span> <span class="p">|</span> <span class="nb">Out-String</span>
</span><span class='line'>
</span><span class='line'>    <span class="s2">&quot;&lt;h2&gt;My Fabulos Product - New Version&lt;/h2&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="s2">     &lt;p&gt;&lt;strong&gt;Version:&lt;/strong&gt; {0}&lt;/p&gt;</span>
</span><span class='line'><span class="s2">     &lt;p&gt;&lt;strong&gt;Download Link:&lt;/strong&gt; &lt;a href=&#39;{1}&#39;&gt;{2}.exe&lt;/a&gt;&lt;/p&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="s2">     &lt;p&gt;&lt;/p&gt;</span>
</span><span class='line'><span class="s2">     &lt;p&gt;&lt;strong&gt;Developer Commit Details:&lt;/strong&gt;&lt;/p&gt;</span>
</span><span class='line'><span class="s2">     &lt;pre&gt;{3}&lt;/pre&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="s2">     &lt;p&gt;&lt;/p&gt;</span>
</span><span class='line'><span class="s2">     &lt;p&gt;Regards,&lt;/p&gt;</span>
</span><span class='line'><span class="s2">     &lt;p&gt;My Fabulous Team City Build Server (example.com)&lt;/p&gt;</span>
</span><span class='line'><span class="s2">     &quot;</span> <span class="o">-f</span> <span class="nv">$version</span><span class="p">,</span> <span class="nv">$url</span><span class="p">,</span> <span class="nv">$version</span><span class="p">,</span> <span class="nv">$commitMessage</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="n">SendEmail</span><span class="p">(</span><span class="nv">$binaryName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$version</span> <span class="p">=</span> <span class="nv">$binaryName</span><span class="p">.</span><span class="n">TrimEnd</span><span class="p">(</span><span class="s1">&#39;.exe&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="nv">$mailTo</span> <span class="p">=</span> <span class="s2">&quot;&lt;first-email&gt;,&lt;second-email&gt;&quot;</span>
</span><span class='line'>    <span class="nv">$subject</span> <span class="p">=</span> <span class="s2">&quot;[New Version]: $version&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$smtp</span> <span class="p">=</span> <span class="nb">new-object</span> <span class="n">Net</span><span class="p">.</span><span class="n">Mail</span><span class="p">.</span><span class="n">SmtpClient</span><span class="p">(</span><span class="s1">&#39;smtp.gmail.com&#39;</span><span class="p">,</span> <span class="n">587</span><span class="p">)</span>
</span><span class='line'>    <span class="nv">$smtp</span><span class="p">.</span><span class="n">EnableSsl</span> <span class="p">=</span> <span class="nv">$true</span>
</span><span class='line'>    <span class="nv">$smtp</span><span class="p">.</span><span class="n">Credentials</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">System</span><span class="p">.</span><span class="n">Net</span><span class="p">.</span><span class="n">NetworkCredential</span><span class="p">(</span><span class="s2">&quot;&lt;my-gmail-username&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;&lt;my-gmail-password&gt;&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$message</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">Net</span><span class="p">.</span><span class="n">Mail</span><span class="p">.</span><span class="n">MailMessage</span>
</span><span class='line'>    <span class="nv">$message</span><span class="p">.</span><span class="n">From</span> <span class="p">=</span> <span class="s2">&quot;&lt;my-gmail-username&gt;@gmail.com&quot;</span>
</span><span class='line'>    <span class="nv">$message</span><span class="p">.</span><span class="n">IsBodyHtml</span> <span class="p">=</span> <span class="nv">$true</span>
</span><span class='line'>    <span class="nv">$message</span><span class="p">.</span><span class="n">Subject</span> <span class="p">=</span> <span class="nv">$subject</span>
</span><span class='line'>    <span class="nv">$message</span><span class="p">.</span><span class="n">Body</span> <span class="p">=</span> <span class="n">MessageBody</span><span class="p">(</span><span class="nv">$version</span><span class="p">)</span>
</span><span class='line'>    <span class="nv">$message</span><span class="p">.</span><span class="n">To</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="nv">$mailTo</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$smtp</span><span class="p">.</span><span class="n">Send</span><span class="p">(</span><span class="nv">$message</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$credentials</span> <span class="p">=</span> <span class="nb">Get-AWSCredentials</span> <span class="n">-ListStoredCredentials</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nv">$currentCredentials</span> <span class="o">-and</span> <span class="nv">$currentCredentials</span><span class="p">.</span><span class="n">Count</span> <span class="o">-gt</span> <span class="n">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$hasCredentials</span> <span class="p">=</span> <span class="nv">$true</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="p">(!</span><span class="nv">$hasCredentials</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>     <span class="n">Initialize-AWSDefaults</span> <span class="n">-AccessKey</span> <span class="p">&lt;</span><span class="n">your-amazon-access-key</span><span class="p">&gt;</span> <span class="n">-SecretKey</span> <span class="p">&lt;</span><span class="n">your-amazon-secret-key</span><span class="p">&gt;</span> <span class="n">-Region</span> <span class="n">eu-west</span><span class="p">-</span><span class="n">1</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$isFilePathExist</span> <span class="p">=</span> <span class="nb">Test-Path</span> <span class="nv">$filePath</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="p">(!</span><span class="nv">$isFilePathExist</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;Folder ($filePath) for file is not existent! Exiting...&quot;</span>
</span><span class='line'>    <span class="n">exit</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Filename and extension of file.</span>
</span><span class='line'><span class="nv">$key</span> <span class="p">=</span> <span class="p">(</span><span class="nb">Get-ChildItem</span> <span class="nv">$filePath</span><span class="p">)[</span><span class="n">0</span><span class="p">].</span><span class="n">Name</span><span class="err">;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$file</span> <span class="p">=</span> <span class="p">(</span><span class="nb">Get-ChildItem</span> <span class="nv">$filePath</span><span class="p">)[</span><span class="n">0</span><span class="p">].</span><span class="n">FullName</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nv">$key</span> <span class="o">-and</span> <span class="nv">$file</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nb">Write-S3Object</span> <span class="n">-BucketName</span> <span class="nv">$bucketName</span> <span class="o">-File</span> <span class="nv">$file</span> <span class="n">-Key</span> <span class="nv">$key</span> <span class="n">-PublicReadOnly</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">SendEmail</span><span class="p">(</span><span class="nv">$key</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>Save this script to &lt;whatever-you-want-to-call-it&gt;.ps1.</li>
<li>This <em>Powershell</em> script can be added to <em>TeamCity</em> as a final <em>Build Step</em>.</li>
<li>In <em>(3) Build Steps</em> click <em>Add build step</em> choose <em>Powershell</em> in listbox.</li>
<li>For <em>Script</em> choose <em>File</em> from drop down box.</li>
<li>For <em>Script File</em> add absolute path to saved <em>Powershell</em> script saved as <em>ps1</em>.</li>
</ul>


<blockquote><p>Note:</p>

<p>Sorry, no <em>Linux</em> or <em>Mac</em> <em>shell</em> version of this script.</p></blockquote>

<h2>Conclusion</h2>

<p>Having short <em>Git</em> hash for a <em>Revision</em> in your versioning is very helpful and seven chars
are mostly always enough to uniquely identify this release build with commit in your <em>Git</em> repository.</p>

<p>The amazon S3 upload + send email with developer commit deatails is not state of art
<em>Powershell</em> script, it is very buggy and not that much flexible, but it can help a
lot in communication with QA (or outside beta testers) and having release build version binary,
right after Developer commit!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Converting Mercurial (hg) to Git repository on Mac]]></title>
    <link href="http://learnaholic.me/2013/02/01/converting-mercurial-hg-to-git-repository-on-mac/"/>
    <updated>2013-02-01T14:16:00+01:00</updated>
    <id>http://learnaholic.me/2013/02/01/converting-mercurial-hg-to-git-repository-on-mac</id>
    <content type="html"><![CDATA[<p>I had to convert the <em>Mercurial</em> (hg) repository to <em>Git</em> repository, and by lot of advises
on the Internet, I&#8217;ve decided to use <a href="http://repo.or.cz/w/fast-export.git">Fast Export</a>.</p>

<h2>Clone Fast Export</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git clone git://repo.or.cz/fast-export.git
</span></code></pre></td></tr></table></div></figure>


<h2>Create a new repository</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>mkdir git_repo
</span><span class='line'><span class="nv">$ </span><span class="nb">cd </span>git_repo
</span><span class='line'><span class="nv">$ </span>git init .
</span></code></pre></td></tr></table></div></figure>


<h2>Problems running Fast Export</h2>

<h3>Getting to know Python with the Mercurial</h3>

<p>By running <em>Fast Export</em> I got error message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="s1">&#39;ImportError: No module named mercurial&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Essentially this means that <em>Python</em> does not know about <em>Mercurial</em>.
The fix for that would be to install <em>Mercurial</em> as a <em>Python</em> module. I&#8217;ve used <code>easy_install</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>sudo easy_install -U mercurial
</span></code></pre></td></tr></table></div></figure>


<h3>Using &#8220;force&#8221; option</h3>

<p>The next error was:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="s1">&#39;Error: repository has at least one unnamed head...&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>To fix it there was need to set <em>Fast Export</em> with parameter <code>--force</code>.</p>

<h2>Starting Fast Export</h2>

<p>Make sure you are in the <em>Git</em> repository that you want to convert to:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span><span class="nb">cd </span>git_repo
</span></code></pre></td></tr></table></div></figure>


<p>Run from it a <em>Fast Export</em> like this:</p>

<blockquote><p><em>Note</em>:</p>

<p>Assumes that the <em>Fast Export</em> in directory up and the <code>hg_repo</code> is the <em>Mercurial</em>
repository directory from where you want to convert from!</p></blockquote>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>./../fast-export/hg-fast-export.sh -r ../hg_repo --force
</span></code></pre></td></tr></table></div></figure>


<p>After few moments, your <em>Mercurial (hg)</em> repository will be converted to <em>Git</em> one!</p>

<p>And aftrer the conversion is applied run the checkout:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git checkout HEAD
</span></code></pre></td></tr></table></div></figure>


<p>Beware if you have a lots of branches, that pushing <code>master</code> will only push master. To push evrything to the remote
use:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git push --all origin
</span></code></pre></td></tr></table></div></figure>


<p>And now all commits and previous branches are converted to Git!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xcode 4.5: Source Version Control wit Git and Github]]></title>
    <link href="http://learnaholic.me/2012/11/29/xcode-4-dot-5-source-version-control-wit-git-and-github/"/>
    <updated>2012-11-29T04:30:00+01:00</updated>
    <id>http://learnaholic.me/2012/11/29/xcode-4-dot-5-source-version-control-wit-git-and-github</id>
    <content type="html"><![CDATA[<p>OK, so we created the skeleton of App. While creating the <em>Xcode Project</em> we could add the project
to <em>Git</em> repository, but we didn&#8217;t, we shall do it manually and finally at the end we shall
push it to the <em>Github</em> hosted repository.</p>

<h2>Git Repository</h2>

<p>Firstly we really want to add a proper <em>Xcode</em> and <em>Objective-C</em> <code>.gitignore</code> file. Here is the
<em>Gist</em> link to one proper <a href="https://gist.github.com/3786883">.gitingnore</a>. Download and copy
it to the App root, before doing the first commit or use <code>wget</code> as I did!</p>

<p>Since we didn&#8217;t create the <em>Git</em> repository when the <em>Xcode</em> was offering. We shall create
repository, add <code>.gitignore</code> and create initial commit:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>wget https://raw.github.com/gist/3786883/93e8364b202f691abc4cf3e22001a45e799011cc/.gitignore
</span><span class='line'>git init .
</span><span class='line'>git add .
</span><span class='line'>git status
</span><span class='line'>git commit -m 'Initial commit'</span></code></pre></td></tr></table></div></figure>


<p><img src="http://learnaholic.me/images/02-01.png"></p>

<blockquote><p>Note</p>

<p>I would recommend creating repository without <em>Xcode</em> help. Because it will create no <code>.gitignore</code>
and by it will commit a lot of junk to repository.</p>

<p>Folders like <code>xcuserdata</code> will change frequently and polluting your
repository with not needed files and even more in teams, it can overwrite another developer&#8217;s
<code>xcuserdata</code>  every time with not wanted user data from other developer!</p></blockquote>

<h2>XCode Organizer</h2>

<p>The <em>Xcode Organizer</em> is where the <em>Repositories</em> can be viewed.</p>

<blockquote><p>Note</p>

<p>If you had a <em>Xcode</em> open during the creation of repository through Terminal, reopen the
the <em>Xcode</em> because it will not detect the repository in <em>Organizer</em>.</p></blockquote>

<p>To open <em>Organizer</em> go to <code>Window &gt; Organizer</code> or with keyboard shortcut <strong>⇧ ⌘ 2</strong>.
There should be a repository <em>Casa</em>:</p>

<p><img src="http://learnaholic.me/images/02-02.png"></p>

<h2>Add Github Remote</h2>

<p>To add the <em>Github</em> remote so that we can push the commits to it, we first need to create
a <em>Github</em> repository, I&#8217;ve already created repository <a href="https://github.com/xajler/casa-app-xcode">casa-app-xcode</a>.</p>

<p>Let&#8217;s add this remote with <em>Xcode</em>:</p>

<ul>
<li>Go to <em>Organizer Repositories</em>.</li>
<li>Select <em>Casa</em> repository.</li>
<li>In <em>Casa</em> repository select <em>Remotes</em>.</li>
<li>Hit the <code>Add Remote</code> circled plus button.</li>
<li>For <em>Remote Name</em> enter: <code>casa-app-xcode</code>.</li>
<li>For <em>Location</em> enter: <code>https://github.com/xajler/casa-app-xcode</code>.</li>
</ul>


<p>Ignore the git username and password if you have <em>Github SSH</em> set up.</p>

<p><img src="http://learnaholic.me/images/02-03.png"></p>

<h2>Push changes to Github</h2>

<ul>
<li>Choose <code>File &gt; Source Control &gt; Push...</code>.</li>
<li>Wait availe for first time.</li>
</ul>


<p><img src="http://learnaholic.me/images/02-04.png"></p>

<p>The commit is pushed to <em>Githb</em>.</p>

<p><img src="http://learnaholic.me/images/02-05.png"></p>

<h2>Commiting changes with Xcode</h2>

<p>From the main app delegate <code>MIAppDelegate.m</code> we shall remove the generated comments and
commit it with Xcode:</p>

<ul>
<li>Applay changes to the <code>MIAppDelegate.m</code> by removing commented code in methods.</li>
<li>Commit it by going to <code>File &gt; Source Control &gt; Commit...</code> or use keyboard <strong>⌥ ⌘ C</strong>.</li>
<li>Enter the commit message.</li>
<li>Hit the <code>Commit 1 File</code> button.</li>
</ul>


<p><img src="http://learnaholic.me/images/02-06.png"></p>

<ul>
<li>Push changes to <a href="https://github.com/xajler/casa-app-xcode">Github repository</a>.</li>
</ul>


<h2>Branching in Xcode</h2>

<p>On commit it can be chosen to commit to branch with button <code>Commit to Branch...</code>. Where
the branch can be chosen or even newly one created.</p>

<p>Alternatively branches can be created in <em>Organizer Repositories</em> by selecting wanted
repository and selecting <em>Branches</em>, and hitting <code>Add Branch</code> button.</p>

<h2>Diff in Xcode</h2>

<p>Anytime while coding the <em>Version editor</em> can be turned on to see changes with current <code>HEAD</code>
but also it is possible to change to past revisions.</p>

<p><em>Xcode Version editor</em> is really nice and with visuals that helping in better understanding of the code changes.</p>

<p><img src="http://learnaholic.me/images/02-07.png"></p>

<h2>Conclusion</h2>

<p>As I said in last post <em>Xcode 4</em> is great IDE, filled with lots of features. Respect to
have <em>Git</em> as default Version control. The <em>SVN</em> is also supported, but who would want to use
it in 21st Century. But in my opinion the Diff part is the greatest feature of it all!</p>

<p>But with all of this, I&#8217;m still not impressed with managing <em>Git</em> with IDE, and I will
still be using my favorite <em>iTerm2</em> to interact with <em>Git</em> and <em>Github</em>.</p>

<h2>What&#8217;s next</h2>

<p>So we past the <em>Xcode</em> project creation (from ground up!) and in this post the Version Control
as <em>Git</em> and creating remote to the <em>Github</em>.</p>

<p>In next <em>Xcode</em> post we will have an broad overview of <em>Xcode</em> support of Testing. What
Testing Frameworks are available, which is the default <em>Xcode</em> Testing Framework.</p>

<p>Look for the <em>BDD</em> Testing Frameworks and picking one for more in depth examine of it. And also
the available Mocking Frameworks and its usage.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xcode 4.5: Workspace, Project and Target Setup from Scratch]]></title>
    <link href="http://learnaholic.me/2012/11/28/xcode-4-dot-5-workspace-project-and-target-from-scratch/"/>
    <updated>2012-11-28T10:35:00+01:00</updated>
    <id>http://learnaholic.me/2012/11/28/xcode-4-dot-5-workspace-project-and-target-from-scratch</id>
    <content type="html"><![CDATA[<p>In aim to learn more about <em>Apple</em>&#8217;s Development stack and because I will be creating an
<em>iPhone</em> and will include <em>iPad</em> App as <code>Universal</code> App. I&#8217;ll be going through creation of
the minimal as possible project setup for current stable version of <em>Xcode 4.5.2</em> and <em>iOS 6</em>.</p>

<h2>Workspace</h2>

<p>So first, what exactly is a <em>Workspace</em>, as I remember it was introduced with <em>Xcode</em> 4, and it
is a simply a container for combining multiple projects if they are needed, if not only <em>Project</em>
will due. But in our case, we know that we shall have multiple projects, so the <em>Workspace</em> is way to go.</p>

<blockquote><p><strong>Note</strong></p>

<p>Maybe the desired workflow by <em>Apple</em> was first to create a <em>Project</em> and then if there is
need for another project to bundle them into <em>Workspace</em>. But I wanted show the hierarchical
structure of <em>Xcode</em> project, so on the top is a <em>Workspace</em> then <em>Project</em>.</p></blockquote>

<p>Create it by:</p>

<ul>
<li>First create a folder (with Finder or Terminal), name it whatever the App will be called in my case <em>Casa</em>.</li>
<li>Create <em>Workspace</em> by going to <code>File &gt; New &gt; Workspace...</code> or better with the keyboard key <strong>⌃ ⌘ N</strong>.</li>
<li>Enter desired name, in my case <code>Casa</code> and save it to <em>Casa</em> folder already created.</li>
</ul>


<p><img src="http://learnaholic.me/images/01-01.png"></p>

<ul>
<li>It will create <em>Workspace</em> as folder named <code>Casa.xcworkspace</code>.</li>
<li>Do not close the <em>Workspace</em> or <em>Xcode</em> for now.</li>
</ul>


<blockquote><p><strong>Geek Tip</strong></p>

<p>For hard-core coders open <em>Xcode</em> and <em>Workspace</em> from <em>Terminal</em> with <code>open Casa.xcworkspace</code>.</p></blockquote>

<h2>Empty Project</h2>

<p>The <em>Xcode</em> project is the thing that is usually what it is created in most examples.
This way <em>Project</em> and the <em>Target(s)</em> will be created together.</p>

<p>But not to get the ahead of myself, we will not use this pattern, since we broke it with
creation of <em>Workspace</em> in first place, we will broke it even more by creating empty project.</p>

<p>Because when you start with the <em>Empty Project</em> you can actually see what <em>Project</em> is, basically
nothing, just another container, that will hold <em>Targets</em>.</p>

<ul>
<li>Create <em>Empty Project</em> by going to <code>File &gt; New &gt; Project...</code> or by keyboard shortcut <strong>⇧ ⌘ N</strong>.</li>
<li>Something strange will happen, another instance of <em>Xcode</em> will open!!!</li>
<li>From <em>iOS</em> group choose <em>Other</em> in left pane and in right pane choose <em>Empty</em> as blue <em>Project</em> icon.</li>
</ul>


<p><img src="http://learnaholic.me/images/01-02.png"></p>

<ul>
<li>Hit the <code>Next</code> button, add <em>Product Name</em>, in my case, still <em>Casa</em>.</li>
<li>Again hit <code>Next</code> button, go to <em>Casa</em> folder, because we want the project to be created there.</li>
<li>Uncheck the <em>Create local git repository for this project</em>, we will set it later.</li>
<li>And for <em>Add to</em> we want to add it to <em>Casa Workspace</em> so choose <em>Casa</em>.</li>
</ul>


<p><img src="http://learnaholic.me/images/01-03.png"></p>

<ul>
<li>It will close this instance of <em>Xcode</em>, but second instance will have a <em>Workspace</em> and <em>Project</em> all together!</li>
</ul>


<p><img src="http://learnaholic.me/images/01-04.png"></p>

<h2>Target (Empty Application)</h2>

<p>So finally we&#8217;re getting to the meat of <em>Xcode</em>, the <em>Target</em> is what will hold all you code, resources,
settings for build or deployment. If we had not chosen <em>Empty Project</em> in last part,
it would create <em>Project</em> and <em>Target</em> all together, even if we chose the <em>Empty Application</em>.</p>

<p>But we are learning all the parts so we shall in this case create a simple as possible <em>Target</em>
for <em>iOS</em> - <em>Empty Application</em>.</p>

<ul>
<li>Make sure the <code>Casa</code> <em>Project</em> is selected and at bottom hit a big plus button <code>Add Target</code>.</li>
<li>In <em>iOS</em> group choose <em>Application</em> on left and on the right choose <em>Empty Application</em>. Hit <code>Next</code>.</li>
</ul>


<p><img src="http://learnaholic.me/images/01-05.png"></p>

<ul>
<li>For <em>Product Name</em> we will add, you guessed it: <em>Casa</em>.</li>
<li>Add the <em>Organization Name</em> and <em>Company Identifier</em>.</li>
<li>I tend to add <em>Class Prefix</em> (<code>MI</code> as <em>Metaintellect</em>), because there is no namespacing in <code>Objective-C</code>.</li>
<li>Depending what are you targeting, you&#8217;ll choose <em>Devices</em>, I&#8217;m feeling lucky so I&#8217;m going with hardest <code>Universal</code> (iPhone and iPad support).</li>
<li><em>ARC (Automatic Reference Counting)</em> should be left checked!</li>
<li><em>Include Unit Test</em> should be unchecked, because we will set it later, from ground up!</li>
</ul>


<p><img src="http://learnaholic.me/images/01-06.png"></p>

<ul>
<li>Hit <code>Finish</code> button and we have a target created.</li>
<li>Build it by <code>Project &gt; Build</code> or with <strong>⌘ B</strong> and we can ship it :)</li>
</ul>


<p><img src="http://learnaholic.me/images/01-07.png"></p>

<h2>My Thoughts on Objective-C</h2>

<p>So there are many ways to get to <em>AppStore</em> and not using the default <em>Apple</em> language: <em>Objective-C</em>.
One of many are <em>RubyMotion</em> (<em>Ruby</em>), <em>MonoTouch</em> (<em>C#</em>), <em>PhoneGap</em> (<em>HTML</em>, <em>CSS</em>, <em>JS</em>),&#8230;, but
<em>Objective-C</em> is still used as preferred language.</p>

<p>There is a lot of criticism on <em>Objective-C</em> language, even though it is a <em>C</em> based language,
like <em>C++</em>, <em>Java</em> and <em>C#</em>. But those are kind of similar language where transition is very
easy, but transition to <em>Objective-C</em> is awkward, even more than to <em>JavaScript</em>. And this
is mostly because <em>Objective-C</em> has a not only strong legacy in <em>C</em> (static and procedural part) but
also in one of the underestimated language <em>Smalltalk</em> (dynamic and object or better message driven part).</p>

<p>And even though the <em>Objective-C</em> looks very awkward, but because it has a legacy from two great
languages that are in my opinion pretty hard and crazy to merge, has my everlasting respect. And I
find my self writing <em>Objective-C</em> better and with more joy than the <em>Java</em> or <em>C#</em>.</p>

<p>What I dislike about the <em>Objective-C</em> is that code snippets, examples found on web are mostly so
poorly written, and same for most paid Video Tutorials. So much repetitive code, huge methods,
<strong>copy-paste driven development</strong> everywhere, same as in most <em>.NET</em> (especially VB.NET), <em>PHP</em>,
and also in <em>Rails</em> (excluding pure <em>Ruby</em> programmers) examples!</p>

<p>There is quite a lot resources how to create <em>iOS</em> apps but mainly focusing on the features
like Table Views, MapKit, and so on. But it is really hard to find good source on
Design Patterns, refactoring and best coding practices, or how to structure the <em>iOS</em>
app into Groups (there are no Folders, files are all in root of <em>Target</em>).</p>

<p>But there are quite neat features in <em>Objective-C</em> features like protocols and categories.
I also like the progress or evolution of <em>Objective-C</em> for embracing properties, <em>ARC</em> (Automatic
Reference Counting), Blocks, GCD (Grand Central Dispatch) and new literals for Arrays, Dictionaries,&#8230;</p>

<p>And for the end abandoning the old <em>GCC</em> compiler and embracing and involving in creating
<em>LLVM</em> compiler, much faster, and now with really great code inspection built in to <em>Xcode</em>&#8230;</p>

<h2>My Thoughts on Xcode 4</h2>

<p>And there is <em>Xcode</em>, the version 3 was too funky too me, especially separate <em>Interface Builder</em>
and Apple old-school floating inspectors and controls all around the desktop.</p>

<p>Bet then came the version 4 and even though I really dislike the IDEs, must admit that it is to me
the best IDE. Especially comparing to <em>Eclipse</em> and <em>Visual Studio</em>. Responsiveness is great,
integration with <em>Git</em> (even though I still prefer using it by Terminal) and diff viewer
is really what was expected of Apple, also <em>StoryBoard</em> and integrated <em>Inerface Builder</em>.
Multi monitor friendly, assistant editor, help integrated, I think you get it, the best IDE I&#8217;ve
worked! Don&#8217;t get me wrong there is still place for improvements but in my opinion <em>Apple</em> is on the
right track.</p>

<h2>What&#8217;s Next</h2>

<p>In next post we&#8217;ll examine <em>Xcode</em> SCM (Source Control Management) capabilities using built-in
support for <em>Git</em>. Also we&#8217;ll push this project to <em>GitHub</em>, examine <em>Xcode</em> <em>Git</em> Diffing and History.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails App from Scratch: User Save and Update]]></title>
    <link href="http://learnaholic.me/2012/11/08/rails-app-from-scratch-user-save-and-update/"/>
    <updated>2012-11-08T01:25:00+01:00</updated>
    <id>http://learnaholic.me/2012/11/08/rails-app-from-scratch-user-save-and-update</id>
    <content type="html"><![CDATA[<p>After we implemented logic around User attributes, it is time to finally save and update
the User to the database.</p>

<p>But first, we shall change a mistake from the post on creating Sign Up page, the <code>password</code>
fields in the View are set as normal text. We shall make sure that it is a password field!</p>

<p>Change the <code>text_field</code> to <code>password_field</code> in <code>app/views/users/_form.html.haml</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">label</span> <span class="ss">:password</span><span class="p">,</span> <span class="s1">&#39;Password:&#39;</span>
</span><span class='line'><span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">password_field</span> <span class="ss">:password</span>
</span><span class='line'><span class="nt">%br</span>
</span><span class='line'>
</span><span class='line'><span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">label</span> <span class="ss">:password_confirmation</span><span class="p">,</span> <span class="s1">&#39;Confirm Password:&#39;</span>
</span><span class='line'><span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">password_field</span> <span class="ss">:password_confirmation</span>
</span><span class='line'><span class="nt">%br</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Saving Valid User Test</h2>

<p>Now when the password fields are fixed, lets create a test to save a Valid User to the
database.</p>

<p>Create a new <code>context</code> for <code>POST</code> in <code>spec/requests/users_spec.rb</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">context</span> <span class="s1">&#39;POST /users&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">it</span> <span class="s1">&#39;creates and saves the valid user&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>    <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>    <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;The User is successfully saved!&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test is pretty simple, we fill up the form with data, click &#8216;Sign Up&#8217; button, and
expect to be redirected again to &#8220;Sign Up&#8221; page (in new post when we create a Login page
the <code>create</code> action will be redirecting to it!) and we expect that the flash notice will show that
User is successfully saved.</p>

<p>The test should fail on the clicking the <em>Sign Up</em> button, because there is no <code>create</code>
action in <code>UsersController</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">Users</span> <span class="no">POST</span> <span class="sr">/users creates and saves the valid user</span>
</span><span class='line'><span class="sr">   Failure/</span><span class="no">Error</span><span class="p">:</span> <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>   <span class="no">AbstractController</span><span class="o">::</span><span class="no">ActionNotFound</span><span class="p">:</span>
</span><span class='line'>     <span class="no">The</span> <span class="n">action</span> <span class="s1">&#39;create&#39;</span> <span class="n">could</span> <span class="ow">not</span> <span class="n">be</span> <span class="n">found</span> <span class="k">for</span> <span class="no">UsersController</span>
</span></code></pre></td></tr></table></div></figure>


<p>So to pass this test we need to add a <code>create</code> method to the <code>UsersController</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">create</span>
</span><span class='line'>  <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">new</span> <span class="n">params</span><span class="o">[</span><span class="ss">:user</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="vi">@user</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>    <span class="n">flash</span><span class="o">[</span><span class="ss">:notice</span><span class="o">]</span> <span class="o">=</span> <span class="s1">&#39;The User is successfully saved!&#39;</span>
</span><span class='line'>    <span class="n">redirect_to</span> <span class="n">signup_path</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>First we storing a User to instance variable <code>@user</code> from the data given in User Sign Up
Form as <code>params[:user]</code>. Then we try to save it, and on success, we assign the flash notice
and redirect back to Sign Up Page.</p>

<p>The test should pass:</p>

<pre><code>Finished in 1.37 seconds
11 examples, 0 failures
</code></pre>

<p>The happy path is working, now lets test all the possible ways the Sign Up might go wrong!</p>

<h2>Invalid User Tests</h2>

<h3>Password Confirmation</h3>

<p>Lets first check <code>password</code>s matching is working, by applying the two different passwords.
We shall crate the new <code>context</code> inside <code>POST /users</code> <code>context</code> and call it &#8221;<em>not saving invalid user</em>&#8221;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">context</span> <span class="s1">&#39;not saving invalid user&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">it</span> <span class="s1">&#39;when passwords mismatch&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x123&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>    <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>    <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Password doesn&#39;t match confirmation&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>After running test we shall get odd message that there is no View Template for <code>create</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">Users</span> <span class="no">POST</span> <span class="sr">/users not saving invalid user when passwords mismatch</span>
</span><span class='line'><span class="sr">   Failure/</span><span class="no">Error</span><span class="p">:</span> <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>   <span class="no">ActionView</span><span class="o">::</span><span class="no">MissingTemplate</span><span class="p">:</span>
</span><span class='line'>     <span class="no">Missing</span> <span class="n">template</span> <span class="n">users</span><span class="o">/</span><span class="n">create</span><span class="p">,</span> <span class="n">application</span><span class="o">/</span><span class="n">create</span> <span class="n">with</span> <span class="p">{</span><span class="ss">:locale</span><span class="o">=&gt;[</span><span class="ss">:en</span><span class="o">]</span><span class="p">,</span> <span class="ss">:formats</span><span class="o">=&gt;[</span><span class="ss">:html</span><span class="o">]</span><span class="p">,</span> <span class="ss">:handlers</span><span class="o">=&gt;[</span><span class="ss">:erb</span><span class="p">,</span> <span class="ss">:builder</span><span class="p">,</span> <span class="ss">:coffee</span><span class="p">,</span> <span class="ss">:haml</span><span class="o">]</span><span class="p">}</span><span class="o">.</span> <span class="no">Searched</span> <span class="k">in</span><span class="p">:</span>
</span><span class='line'>       <span class="o">*</span> <span class="s2">&quot;/Users/xajler/src/rb/just-todo-it/app/views&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We don&#8217;t need a new View Template but rather change the <code>UserController</code> method <code>create</code>
to do something if the user is not saved. And when is not saved we shall flash an error message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">create</span>
</span><span class='line'>  <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">new</span> <span class="n">params</span><span class="o">[</span><span class="ss">:user</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="vi">@user</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>    <span class="n">flash</span><span class="o">[</span><span class="ss">:notice</span><span class="o">]</span> <span class="o">=</span> <span class="s1">&#39;The User is successfully saved!&#39;</span>
</span><span class='line'>    <span class="n">redirect_to</span> <span class="n">signup_path</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="n">flash</span><span class="o">[</span><span class="ss">:error</span><span class="o">]</span> <span class="o">=</span> <span class="vi">@user</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">full_messages</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>    <span class="n">redirect_to</span> <span class="n">signup_path</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We are setting as a flash message from a User instance errors and getting first <code>full_message</code>
that will be set upon having problem saving user and in this case message will be
&#8221;<em>Password doesn&#8217;t match confirmation</em>&#8221;.</p>

<p>After applying the given code, the test should pass:</p>

<pre><code>Finished in 1.54 seconds
12 examples, 0 failures
</code></pre>

<p>With this code applied we also satisfy the tests that are yet to come, but we still need
tests to prove that <code>create</code> method is working and proper error messages are thrown to
guide the users of Application to resolve them!</p>

<h3>Required Fields</h3>

<p>We have three required fields:</p>

<ul>
<li><code>email</code></li>
<li><code>password</code></li>
<li><code>full_name</code></li>
</ul>


<p>Lets write three more test, they should all be green since the implementation is written
to satisfy the previous test.</p>

<p>We will add them to the &#8221;<em>not saving invalid user</em>&#8221; <code>context</code> below the latest test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;when email is blank&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>  <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>  <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Email can&#39;t be blank&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">it</span> <span class="s1">&#39;when password is blank&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>  <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>  <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Password digest can&#39;t be blank&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">it</span> <span class="s1">&#39;when full name is blank&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>  <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>  <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Full name can&#39;t be blank&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, in first test we test required Email, by sending blank one. In second the Passwords
are blank and in third the Full Name is blank. And each test expect that meaningful messages
are shown to the user of application!</p>

<p>And if all was OK then all tests should pass:</p>

<pre><code>Finished in 1.79 seconds
15 examples, 0 failures
</code></pre>

<h3>Email Uniqueness</h3>

<p>The saving User with entered existing <code>email</code> should fail. Lets create the test to prove
it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;when email is not unique&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">create</span> <span class="ss">:user</span>
</span><span class='line'>  <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>  <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>  <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Email has already been taken&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, first we insert User from our created factory via <em>Factory Girl</em>. The factory of User
inserted has the same email that we try to save it from the User Sign Up Form. And again
we test to get meaningful message when email is not unique.</p>

<p>The test should pass, because the code is implemented:</p>

<pre><code>Finished in 2.02 seconds
16 examples, 0 failures
</code></pre>

<h3>Password with at least 8 characters</h3>

<p>The User cannot be saved if both passwords length is at least 8 characters long:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;when password is less than 8 characters&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;123&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;123&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>  <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>  <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Password is too short (minimum is 8 characters)&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test applies the Passwords that are of 3 characters long and we expect to get right message
that is telling the right expectations of Password in this case minimum of 8 characters.</p>

<p>This was easy, all tests should pass still:</p>

<pre><code>Finished in 2.07 seconds
17 examples, 0 failures
</code></pre>

<blockquote><p>Note:</p>

<p>If you using <em>Guard</em> as I do, for running test, you may need to enter <code>r</code> command to
<em>Guard</em> console to reload all, only if your tests are passing and they should not be or vice versa!</p></blockquote>

<p>And with this test we have test for all User Create problems, now we&#8217;ll add test for User Update.</p>

<h2>Valid Update Test</h2>

<p>Essentially, the valid update only lets to change User <code>password</code> and <code>full_name</code>. Create
new <code>context</code> called &#8221;<em>PUT users/:id</em>&#8221; and new <code>it</code> block &#8221;<em>valid user update</em>&#8221;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">context</span> <span class="s1">&#39;PUT users/:id&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">it</span> <span class="s1">&#39;valid user update&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">user</span> <span class="o">=</span> <span class="n">create</span> <span class="ss">:user</span>
</span><span class='line'>    <span class="n">visit</span> <span class="n">edit_user_path</span> <span class="n">user</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Email&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>    <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Full Name&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>    <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler - xajler&#39;</span>
</span><span class='line'>    <span class="n">click_button</span> <span class="s1">&#39;Update User&#39;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">edit_user_path</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
</span><span class='line'>    <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;The User is successfully updated!&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>First we create a User from factory and save it as variable, because we are simulating edit,
so we need the User id when we want to edit him. This is why we pass the <code>user</code> variable to the
<code>edit_user_path</code>.</p>

<p>Before we fill in the User Update Form we shall test it if the Form fields are actually binded with
data from User that will be updated.</p>

<p>OK, same thing as for new/create it will fail, first, because there is no method <code>edit</code> in
<code>UsersController</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">Users</span> <span class="no">POST</span> <span class="sr">/users PUT users/</span><span class="ss">:id</span> <span class="n">valid</span> <span class="n">user</span> <span class="n">update</span>
</span><span class='line'>   <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">visit</span> <span class="n">edit_user_path</span> <span class="c1">#user</span>
</span><span class='line'>   <span class="no">ActionController</span><span class="o">::</span><span class="no">RoutingError</span><span class="p">:</span>
</span><span class='line'>     <span class="no">No</span> <span class="n">route</span> <span class="n">matches</span> <span class="p">{</span><span class="ss">:action</span><span class="o">=&gt;</span><span class="s2">&quot;edit&quot;</span><span class="p">,</span> <span class="ss">:controller</span><span class="o">=&gt;</span><span class="s2">&quot;users&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>To pass this error lets create the <code>edit</code> method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">edit</span>
</span><span class='line'>  <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span> <span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So we need the User to get him from the given <em>params id</em> so that we can have it in
instance variable <code>@user</code> and share it to the View and then fill the form with existing
User data.</p>

<p>The test should still fail, because there is no edit View Template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">Users</span> <span class="no">POST</span> <span class="sr">/users PUT users/</span><span class="ss">:id</span> <span class="n">valid</span> <span class="n">user</span> <span class="n">update</span>
</span><span class='line'>   <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">visit</span> <span class="n">edit_user_path</span> <span class="n">user</span>
</span><span class='line'>   <span class="no">ActionView</span><span class="o">::</span><span class="no">MissingTemplate</span><span class="p">:</span>
</span><span class='line'>     <span class="no">Missing</span> <span class="n">template</span> <span class="n">users</span><span class="o">/</span><span class="n">edit</span><span class="p">,</span> <span class="n">application</span><span class="o">/</span><span class="n">edit</span> <span class="n">with</span> <span class="p">{</span><span class="ss">:locale</span><span class="o">=&gt;[</span><span class="ss">:en</span><span class="o">]</span><span class="p">,</span> <span class="ss">:formats</span><span class="o">=&gt;[</span><span class="ss">:html</span><span class="o">]</span><span class="p">,</span> <span class="ss">:handlers</span><span class="o">=&gt;[</span><span class="ss">:erb</span><span class="p">,</span> <span class="ss">:builder</span><span class="p">,</span> <span class="ss">:coffee</span><span class="p">,</span> <span class="ss">:haml</span><span class="o">]</span><span class="p">}</span><span class="o">.</span> <span class="no">Searched</span> <span class="k">in</span><span class="p">:</span>
</span><span class='line'>       <span class="o">*</span> <span class="s2">&quot;/Users/xajler/src/rb/just-todo-it/app/views&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Long time ago when we are creating View Template for Sign Up we&#8217;ve created <code>new.html.haml</code>
and also separated form to partial <code>_form.html.haml</code> so it can be shared with Edit User View.</p>

<p>Lets create <code>edit.html.haml</code> View page that calls the Form partial and passing to it the
<code>@user</code> so that the Form will display User data:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nt">%h1</span> Update User
</span><span class='line'>
</span><span class='line'><span class="p">=</span> <span class="n">render</span> <span class="n">partial</span><span class="p">:</span> <span class="s1">&#39;form&#39;</span><span class="p">,</span> <span class="n">locals</span><span class="p">:</span> <span class="p">{</span> <span class="n">user</span><span class="p">:</span> <span class="vi">@user</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test will fail because there is no button &#8220;Update User&#8221;, and this is because we hard-coded
the &#8220;Sign Up&#8221; text to submit element in the form partial <code>_form.html.haml</code>. We will fix it now,
not very pretty but it will work:</p>

<p>Change <code>submit</code> in <code>_form.html.haml</code> from:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">submit</span> <span class="s1">&#39;Sign Up&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>To:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">submit</span> <span class="vi">@user</span><span class="o">.</span><span class="n">id</span> <span class="p">?</span> <span class="s1">&#39;Update User&#39;</span> <span class="p">:</span> <span class="s1">&#39;Sign Up&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test should still fail because we are after all trying to update, and there in no
<code>update</code> method it <code>UsersController</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'>1) Users POST /users PUT users/:id valid user update
</span><span class='line'>   Failure/Error: click_button &#39;Update User&#39;
</span><span class='line'>   AbstractController::ActionNotFound:
</span><span class='line'>     The action &#39;update&#39; could not be found for UsersController
</span></code></pre></td></tr></table></div></figure>


<p>So, we shall impelment the <code>update</code> method for the <code>UsersController</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">update</span>
</span><span class='line'>  <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span> <span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="vi">@user</span><span class="o">.</span><span class="n">update_attributes</span> <span class="n">params</span><span class="o">[</span><span class="ss">:user</span><span class="o">]</span>
</span><span class='line'>    <span class="n">flash</span><span class="o">[</span><span class="ss">:notice</span><span class="o">]</span> <span class="o">=</span> <span class="s1">&#39;The User is successfully updated!&#39;</span>
</span><span class='line'>    <span class="n">redirect_to</span> <span class="n">edit_user_path</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>First we getting User from the database from given User Id, and then call <code>update_atrributes</code>
from the data send via Form as <code>params[:user]</code>. Set the flash notice that User is updated
and redirect to Update User page where we can see that User is actually updated.</p>

<p>And at last the test is passing:</p>

<pre><code>Finished in 2.3 seconds
18 examples, 0 failures
</code></pre>

<p>The only problem here is that to Update User the <code>password</code>s needed to be entered every
time. There are better solutions, like if they are blank, to ignore them on update, instead
currently it will be validated. And blank password is not allowed!</p>

<h2>Password Mismatch</h2>

<p>We will not try all the tests that we tried for User Sign Up, but only one. If you remember,
this was the only test that was needed a code, others were just a proof of existing code,
that is more about User Model than actual User View, but we&#8217;ve needed to run them all to
ensure that flash messages are proper and expected.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;invalid when passwords mismatch&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span> <span class="o">=</span> <span class="n">create</span> <span class="ss">:user</span>
</span><span class='line'>  <span class="n">visit</span> <span class="n">edit_user_path</span> <span class="n">user</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeu&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>  <span class="n">click_button</span> <span class="s1">&#39;Update User&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">edit_user_path</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
</span><span class='line'>  <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Password doesn&#39;t match confirmation&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the test fails, complaining about View, but actually we need the code in Controller,
to send message of what went wrong to User Update Form:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">update</span>
</span><span class='line'>  <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span> <span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="vi">@user</span><span class="o">.</span><span class="n">update_attributes</span> <span class="n">params</span><span class="o">[</span><span class="ss">:user</span><span class="o">]</span>
</span><span class='line'>    <span class="n">flash</span><span class="o">[</span><span class="ss">:notice</span><span class="o">]</span> <span class="o">=</span> <span class="s1">&#39;The User is successfully updated!&#39;</span>
</span><span class='line'>    <span class="n">redirect_to</span> <span class="n">edit_user_path</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>      <span class="n">flash</span><span class="o">[</span><span class="ss">:error</span><span class="o">]</span> <span class="o">=</span> <span class="vi">@user</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">full_messages</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>      <span class="n">redirect_to</span> <span class="n">edit_user_path</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>After adding the else clause to <code>update</code> method that handles all errors, the test
should pass:</p>

<pre><code>Finished in 2.6 seconds
19 examples, 0 failures
</code></pre>

<h2>Ensure Email is not changed after User creation</h2>

<p>The only test that is left is to ensure that <code>email</code> given on create should never ever
be possible to change!</p>

<p>In this test we shall try to change the email of existing User and it needs to be the same
after update, even though the <code>email</code> sent to update is quite different from the one when
User is created:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;keeps the User Email intact while other fields do change&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span> <span class="o">=</span> <span class="n">create</span> <span class="ss">:user</span>
</span><span class='line'>  <span class="n">visit</span> <span class="n">edit_user_path</span> <span class="n">user</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Email&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Full Name&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xxx@example.com&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>  <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler - xajler&#39;</span>
</span><span class='line'>  <span class="n">click_button</span> <span class="s1">&#39;Update User&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">edit_user_path</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
</span><span class='line'>  <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Email&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Full Name&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;Kornelije Sajler - xajler&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above test ensures that the <code>email</code> after creation will stay intact, while other fields
will change, there will be no errors having different <code>email</code>. The <code>email</code> for update will
be silently ignored.</p>

<p>The implementation code of this validation is actually in User Model,
making the <code>email</code> as <code>attr_readonly</code> that we did in previous post, this test only ensures
that validation is implemented from View perspective.</p>

<p>And now all 20 test should pass, and we use RSpec format to show them all:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>User
</span><span class='line'>  #email must not ever change after it is created
</span><span class='line'>  is valid
</span><span class='line'>  is invalid
</span><span class='line'>    when required #email is not given
</span><span class='line'>    when #email format is not valid
</span><span class='line'>    when #email is not unique
</span><span class='line'>    when required #full_name is not given
</span><span class='line'>    when required #password is not given
</span><span class='line'>    when #password is not at least 8 characters
</span><span class='line'>
</span><span class='line'>Users
</span><span class='line'>  GET /signup
</span><span class='line'>    displays the sign up page
</span><span class='line'>  PUT users/:id
</span><span class='line'>    valid user update
</span><span class='line'>    invalid when passwords mismatch
</span><span class='line'>    keeps the User Email intact while other fields do change
</span><span class='line'>  POST /users
</span><span class='line'>    creates and saves the valid user
</span><span class='line'>    not saving invalid user
</span><span class='line'>      when passwords mismatch
</span><span class='line'>      when email is not unique
</span><span class='line'>      when full name is blank
</span><span class='line'>      when password is blank
</span><span class='line'>      when email is blank
</span><span class='line'>      when password is less than 8 characters
</span><span class='line'>  GET /users/new
</span><span class='line'>    displays the create new user page
</span><span class='line'>
</span><span class='line'>Finished in 2.86 seconds
</span><span class='line'>20 examples, 0 failures
</span></code></pre></td></tr></table></div></figure>


<h2>Users Controller</h2>

<p>The whole Users Controller <code>app/controllers/users_controllers.rb</code> after this post should look like this:</p>

<figure class='code'><figcaption><span>app/controllers/users_controllers.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">UsersController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">new</span>
</span><span class='line'>    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">create</span>
</span><span class='line'>    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">new</span> <span class="n">params</span><span class="o">[</span><span class="ss">:user</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="vi">@user</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>      <span class="n">flash</span><span class="o">[</span><span class="ss">:notice</span><span class="o">]</span> <span class="o">=</span> <span class="s1">&#39;The User is successfully saved!&#39;</span>
</span><span class='line'>      <span class="n">redirect_to</span> <span class="n">signup_path</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="n">flash</span><span class="o">[</span><span class="ss">:error</span><span class="o">]</span> <span class="o">=</span> <span class="vi">@user</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">full_messages</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>      <span class="n">redirect_to</span> <span class="n">signup_path</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">edit</span>
</span><span class='line'>    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span> <span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">update</span>
</span><span class='line'>    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span> <span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="vi">@user</span><span class="o">.</span><span class="n">update_attributes</span> <span class="n">params</span><span class="o">[</span><span class="ss">:user</span><span class="o">]</span>
</span><span class='line'>      <span class="n">flash</span><span class="o">[</span><span class="ss">:notice</span><span class="o">]</span> <span class="o">=</span> <span class="s1">&#39;The User is successfully updated!&#39;</span>
</span><span class='line'>      <span class="n">redirect_to</span> <span class="n">edit_user_path</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>        <span class="n">flash</span><span class="o">[</span><span class="ss">:error</span><span class="o">]</span> <span class="o">=</span> <span class="vi">@user</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">full_messages</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>        <span class="n">redirect_to</span> <span class="n">edit_user_path</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Users Request Spec (Tests)</h2>

<p>The whole Users Request Spec <code>spec/requests/users_spec.rb</code> after this post should look like this:</p>

<figure class='code'><figcaption><span>spec/requests/users_spec.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
<span class='line-number'>175</span>
<span class='line-number'>176</span>
<span class='line-number'>177</span>
<span class='line-number'>178</span>
<span class='line-number'>179</span>
<span class='line-number'>180</span>
<span class='line-number'>181</span>
<span class='line-number'>182</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;spec_helper&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">describe</span> <span class="s1">&#39;Users&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">context</span> <span class="s1">&#39;GET /users/new&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;displays the create new user page&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Full Name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Confirm Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;full_name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password_confirmation&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_button?</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">context</span> <span class="s1">&#39;GET /signup&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;displays the sign up page&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">signup_path</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Full Name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Confirm Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;full_name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password_confirmation&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_button?</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">context</span> <span class="s1">&#39;POST /users&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;creates and saves the valid user&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>      <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;The User is successfully saved!&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">context</span> <span class="s1">&#39;not saving invalid user&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">it</span> <span class="s1">&#39;when passwords mismatch&#39;</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x123&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>        <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>        <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Password doesn&#39;t match confirmation&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">it</span> <span class="s1">&#39;when email is blank&#39;</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>        <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>        <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Email can&#39;t be blank&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">it</span> <span class="s1">&#39;when password is blank&#39;</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>        <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>        <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Password digest can&#39;t be blank&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">it</span> <span class="s1">&#39;when full name is blank&#39;</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>        <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>        <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Full name can&#39;t be blank&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">it</span> <span class="s1">&#39;when email is not unique&#39;</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">create</span> <span class="ss">:user</span>
</span><span class='line'>        <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>        <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>        <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Email has already been taken&#39;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">it</span> <span class="s1">&#39;when password is less than 8 characters&#39;</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;123&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;123&#39;</span>
</span><span class='line'>        <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>        <span class="n">click_button</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">signup_path</span>
</span><span class='line'>        <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Password is too short (minimum is 8 characters)&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">context</span> <span class="s1">&#39;PUT users/:id&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;valid user update&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span> <span class="o">=</span> <span class="n">create</span> <span class="ss">:user</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">edit_user_path</span> <span class="n">user</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Email&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>      <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Full Name&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler - xajler&#39;</span>
</span><span class='line'>      <span class="n">click_button</span> <span class="s1">&#39;Update User&#39;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">edit_user_path</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;The User is successfully updated!&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;invalid when passwords mismatch&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span> <span class="o">=</span> <span class="n">create</span> <span class="ss">:user</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">edit_user_path</span> <span class="n">user</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeu&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>      <span class="n">click_button</span> <span class="s1">&#39;Update User&#39;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">edit_user_path</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s2">&quot;Password doesn&#39;t match confirmation&quot;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;keeps the User Email intact while other fields do change&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span> <span class="o">=</span> <span class="n">create</span> <span class="ss">:user</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">edit_user_path</span> <span class="n">user</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Email&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>      <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Full Name&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Email&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;xxx@example.com&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Confirm Password&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;aoeuidht&#39;</span>
</span><span class='line'>      <span class="n">fill_in</span> <span class="s1">&#39;Full Name&#39;</span><span class="p">,</span> <span class="n">with</span><span class="p">:</span> <span class="s1">&#39;Kornelije Sajler - xajler&#39;</span>
</span><span class='line'>      <span class="n">click_button</span> <span class="s1">&#39;Update User&#39;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">current_path</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">edit_user_path</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
</span><span class='line'>      <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Email&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>      <span class="n">find_field</span><span class="p">(</span><span class="s1">&#39;Full Name&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="s1">&#39;Kornelije Sajler - xajler&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>In this post we made sure that User Model Validation that is tested through actual User
Sign Up and Update Views. And all aspects of Validation are tested in integration Broweser
Tests simulated with <em>Capybara</em>.</p>

<p>In next post we shall finally tackle the Login page and implementing Authentication for
Application.</p>

<h2>Code</h2>

<p>The code is hosted on GitHub and can be cloned from the <a href="https://github.com/xajler/just-todo-it">xajler/just-todo-it</a>.</p>

<blockquote><p>Github xajler/just-todo-it commits for this post:</p>

<p><a href="https://github.com/xajler/just-todo-it/commit/ebbd2b0e48b3b6d94571f8d593d8d194bd6aec46">The User Create and Update Integration Tests, Users Controller and new Edit View Template.</a></p>

<p><a href="https://github.com/xajler/just-todo-it/commit/4da7186bd475e6465f35ee404b2c50b4bbfdf996">A PUT tests are now top context, not child of POST context tests.</a></p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails App from Scratch: User Validation]]></title>
    <link href="http://learnaholic.me/2012/11/05/rails-app-from-scratch-user-validation/"/>
    <updated>2012-11-05T13:30:00+01:00</updated>
    <id>http://learnaholic.me/2012/11/05/rails-app-from-scratch-user-validation</id>
    <content type="html"><![CDATA[<p>On the last post we&#8217;ve created a User Sign Up page and in this post we&#8217;ll continue to add
some validation to the User to make sure that User is valid so it is safe to save or update
User to the Database.</p>

<h2>Validation</h2>

<p>There are few rules that we&#8217;ve mention in last post about some validation logic:</p>

<ul>
<li><em>Email</em> - Required, Unique, valid email format and after creation it cannot be updated anymore or for short read-only.</li>
<li><em>Password</em> - Required and at least 8 characters long.</li>
<li><em>Full Name</em> - Required.</li>
</ul>


<h2>Validation for Required Attributes</h2>

<p>We had one pending test up till now in <code>spec/models/user_spec.rb</code>. We will use this test
file to set up the Validation for User in TDD way.</p>

<p>First remove pending part generated on User Model:</p>

<pre><code>pending "add some examples to (or delete) #{__FILE__}"
</code></pre>

<h3>User Factory</h3>

<p>First lets create a Factory of User that we&#8217;ll use in tests. This will be a valid Model of User:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">FactoryGirl</span><span class="o">.</span><span class="n">define</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">factory</span> <span class="ss">:user</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">email</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>    <span class="n">password</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>    <span class="n">password_confirmation</span> <span class="s1">&#39;x1234567&#39;</span>
</span><span class='line'>    <span class="n">full_name</span> <span class="s1">&#39;Kornelije Sajler&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h3>RSpec let and subject and Factory Girl build</h3>

<p>Then we&#8217;ll learn some of RSpec and Factory Girl, but first add this beneath the <code>describe</code> block:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">let</span> <span class="ss">:user</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">build</span> <span class="ss">:user</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">subject</span> <span class="k">do</span>
</span><span class='line'> <span class="n">user</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>RSpec <code>let</code> description borrowed from the RSpec documentation:</p>

<blockquote><p>Use let to define a memoized helper method. The value will be cached across multiple calls in the same example but not across examples.</p>

<p>Note that let is lazy-evaluated: it is not evaluated until the first time the method it defines is invoked. You can use let! to force the method&#8217;s invocation before each example.</p></blockquote>

<p>RSpec <code>subject</code></p>

<blockquote><p>Use subject in the group scope to explicitly define the value that is returned by the subject method in the example scope.</p></blockquote>

<p>There is also used a Factory Girl <code>build</code> that returns a User instance that&#8217;s not saved, use <code>create</code>
if it is mandatory that Model is saved to database before getting it in tests.</p>

<h3>Required Fields Model Tests</h3>

<p>The <code>email</code>, <code>password</code> and <code>full_name</code> are required so we create the RSpec <code>context</code> named
<em>is invalid</em> and even though we should go one by one test for each attribute, for quickness we&#8217;ll
do them at once:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">context</span> <span class="s1">&#39;is invalid&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">it</span> <span class="s1">&#39;when required #email is not given&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">email</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>    <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">it</span> <span class="s1">&#39;when required #password is not given&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>    <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">it</span> <span class="s1">&#39;when required #full_name is not given&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">full_name</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>    <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Note:</p>

<p>The <code>#</code> is used to denote the Ruby way of describing the <em>instance methods</em>, the <code>.</code> is
used for the <em>class methods</em>!</p></blockquote>

<p>The <code>should_not</code> can be used since we set a <code>subject</code> to be instance of User built from
Factory Girl <code>:user</code> factory so the RSpec knows to what the <code>should_not</code> refers to.</p>

<p>The <code>be_valid</code> method is a RSpec shorthand for the Rails <code>valid?</code> method that returns
boolean hence the <code>?</code>, every Ruby method with <code>?</code> can be called in RSpec with <code>be_&lt;name_of_method&gt;</code>.</p>

<p>The running tests should failing with message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">Failures</span><span class="p">:</span>
</span><span class='line'>
</span><span class='line'>  <span class="mi">1</span><span class="p">)</span> <span class="no">User</span> <span class="n">is</span> <span class="n">invalid</span> <span class="k">when</span> <span class="n">required</span> <span class="c1">#full_name is not given</span>
</span><span class='line'>     <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>       <span class="n">expected</span> <span class="n">valid?</span> <span class="n">to</span> <span class="k">return</span> <span class="kp">false</span><span class="p">,</span> <span class="n">got</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'>  <span class="mi">2</span><span class="p">)</span> <span class="no">User</span> <span class="n">is</span> <span class="n">invalid</span> <span class="k">when</span> <span class="n">required</span> <span class="c1">#email is not given</span>
</span><span class='line'>     <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>       <span class="n">expected</span> <span class="n">valid?</span> <span class="n">to</span> <span class="k">return</span> <span class="kp">false</span><span class="p">,</span> <span class="n">got</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'>  <span class="mi">3</span><span class="p">)</span> <span class="no">User</span> <span class="n">is</span> <span class="n">invalid</span> <span class="k">when</span> <span class="n">required</span> <span class="c1">#password is not given</span>
</span><span class='line'>     <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>       <span class="n">expected</span> <span class="n">valid?</span> <span class="n">to</span> <span class="k">return</span> <span class="kp">false</span><span class="p">,</span> <span class="n">got</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>To make the test green, add the <code>validates presence</code> for all three required properties
in the <code>app/models/user.rb</code>:</p>

<figure class='code'><figcaption><span>app/models/user.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">has_secure_password</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">attr_accessible</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:password</span><span class="p">,</span> <span class="ss">:password_confirmation</span><span class="p">,</span> <span class="ss">:full_name</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:email</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:password</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:full_name</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The tests should all pass:</p>

<pre><code>Finished in 0.81772 seconds
5 examples, 0 failures
</code></pre>

<h2>Validation of Email Uniqueness</h2>

<p>Another validation for <code>email</code> is that is need to be unique or there should not be two same
<code>email</code>s stored in the database.</p>

<p>Add the new <code>it</code> test to <code>spec/models/user_spec.rb</code> in <em>is invalid</em> <code>context</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;when #email is not unique&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>  <span class="n">user1</span> <span class="o">=</span> <span class="n">build</span> <span class="ss">:user</span>
</span><span class='line'>  <span class="n">user1</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">user1</span><span class="o">.</span><span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>  <span class="n">user1</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">full_messages</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">should</span> <span class="n">match</span> <span class="s1">&#39;Email has already been taken&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This test is little sketchy, firstly because there are two assertions and secondly of
saving our <code>subject</code> User, then <code>build</code> identical User, store him to <code>user1</code> variable, and
then try to save User to database.</p>

<p>The second assertion is just to make sure that error is raised because of the <code>email</code> uniqueness.</p>

<p>The failing message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">User</span> <span class="n">is</span> <span class="n">invalid</span> <span class="k">when</span> <span class="c1">#email is not unique</span>
</span><span class='line'>   <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">user1</span><span class="o">.</span><span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>     <span class="n">expected</span> <span class="n">valid?</span> <span class="n">to</span> <span class="k">return</span> <span class="kp">false</span><span class="p">,</span> <span class="n">got</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>So the only thing is for us to prevent having <code>email</code> stored to database more than once
with <code>uniqueness</code> added to existing <code>email vaildates</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">validates</span> <span class="ss">:email</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span><span class="p">,</span> <span class="n">uniqueness</span><span class="p">:</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>This should make the test green:</p>

<pre><code>Finished in 0.8653 seconds
6 examples, 0 failures
</code></pre>

<h2>Validation of Email format</h2>

<p>Next there is need to make sure that the <code>email</code> format is valid. The <em>Regular Expression</em>
is used to validate the <code>email</code> format.</p>

<blockquote><p><strong>Note</strong>: There are better ways to do the complex Mail validation in Ruby or Rails, but it is out of scope of this simple app!</p></blockquote>

<p>Add test below latest one, still in the <em>is invalid</em> <code>context</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;when #email format is not valid&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">email</span> <span class="o">=</span> <span class="s1">&#39;invalid mail&#39;</span>
</span><span class='line'>  <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test should fail with message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">User</span> <span class="n">is</span> <span class="n">invalid</span> <span class="k">when</span> <span class="c1">#email format is not valid</span>
</span><span class='line'>   <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>     <span class="n">expected</span> <span class="n">valid?</span> <span class="n">to</span> <span class="k">return</span> <span class="kp">false</span><span class="p">,</span> <span class="n">got</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>To fix it simple as possible add the <code>format</code> to <code>email validates</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">validates</span> <span class="ss">:email</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span><span class="p">,</span> <span class="n">uniqueness</span><span class="p">:</span> <span class="kp">true</span><span class="p">,</span>
</span><span class='line'>          <span class="nb">format</span><span class="p">:</span> <span class="p">{</span> <span class="n">with</span><span class="p">:</span> <span class="sr">/\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/</span><span class="p">,</span>
</span><span class='line'>                    <span class="n">message</span><span class="p">:</span> <span class="s1">&#39;The format of Email is invalid&#39;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This should make to pass the test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">Finished</span> <span class="k">in</span> <span class="mi">1</span><span class="o">.</span><span class="mi">3</span> <span class="n">seconds</span>
</span><span class='line'><span class="mi">7</span> <span class="n">examples</span><span class="p">,</span> <span class="mi">0</span> <span class="n">failures</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Validation of at least 8 chars for Password</h2>

<p>The User entered <code>password</code> must be at least 8 characters.
The <code>password</code> will also be simple as possible without checking that there are at least
one number or symbol, but rather, just to have at least 8 characters!</p>

<p>Add new test as last in <code>context</code> <em>is invalid</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;when #password is not at least 8 characters&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="s1">&#39;abc123&#39;</span>
</span><span class='line'>  <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test should fail with message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">User</span> <span class="n">is</span> <span class="n">invalid</span> <span class="k">when</span> <span class="c1">#password is not at least 8 characters</span>
</span><span class='line'>   <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>     <span class="n">expected</span> <span class="n">valid?</span> <span class="n">to</span> <span class="k">return</span> <span class="kp">false</span><span class="p">,</span> <span class="n">got</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>To make test pass add the <code>length</code> to the <code>password validates</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">validates</span> <span class="ss">:password</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span><span class="p">,</span> <span class="n">length</span><span class="p">:</span> <span class="p">{</span> <span class="n">minimum</span><span class="p">:</span> <span class="mi">8</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test should pass now:</p>

<pre><code>Finished in 1.09 seconds
8 examples, 0 failures
</code></pre>

<h2>The Email must be read-only</h2>

<p>The <code>email</code> can only be set when is created and after saving to the database that <code>email</code>
must not ever be possible to change.</p>

<p>Outside of the <code>context</code> <em>is invalid</em> create the new <code>it</code> test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s1">&#39;#email must not ever change after it is created&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">update_attributes</span> <span class="n">email</span><span class="p">:</span> <span class="s1">&#39;ksajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">reload</span><span class="o">.</span><span class="n">email</span><span class="o">.</span><span class="n">should</span> <span class="n">eql</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This test is a little bit weird, what it ensures that when attributes are updated and
reloaded from the database, that the <code>email</code> is still same as when it was created even
though is changed to new value.</p>

<p>The test should fail with message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">User</span><span class="c1">#email must not ever change after it is created</span>
</span><span class='line'>   <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">user</span><span class="o">.</span><span class="n">reload</span><span class="o">.</span><span class="n">email</span><span class="o">.</span><span class="n">should</span> <span class="n">match</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>     <span class="n">expected</span> <span class="s2">&quot;ksajler@gmail.com&quot;</span> <span class="n">to</span> <span class="n">match</span> <span class="s2">&quot;xajler@gmail.com&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>To make sure that <code>email</code> is never changed after creation and all attempts to change the
<code>email</code> will be silently ignored, use Rails <code>attr_readonly</code> for <code>email</code>.</p>

<p>Then the <code>app/models/user.rb</code> should look like this:</p>

<figure class='code'><figcaption><span>app/models/user</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">has_secure_password</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">attr_accessible</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:password</span><span class="p">,</span> <span class="ss">:password_confirmation</span><span class="p">,</span> <span class="ss">:full_name</span>
</span><span class='line'>  <span class="n">attr_readonly</span> <span class="ss">:email</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:email</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span><span class="p">,</span> <span class="n">uniqueness</span><span class="p">:</span> <span class="kp">true</span><span class="p">,</span>
</span><span class='line'>            <span class="nb">format</span><span class="p">:</span> <span class="p">{</span> <span class="n">with</span><span class="p">:</span> <span class="sr">/\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/</span><span class="p">,</span>
</span><span class='line'>                      <span class="n">message</span><span class="p">:</span> <span class="s1">&#39;The format of Email is invalid&#39;</span><span class="p">}</span>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:password</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span><span class="p">,</span> <span class="n">length</span><span class="p">:</span> <span class="p">{</span> <span class="n">minimum</span><span class="p">:</span> <span class="mi">8</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:full_name</span><span class="p">,</span> <span class="n">presence</span><span class="p">:</span> <span class="kp">true</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the test should pass:</p>

<pre><code>Finished in 1.28 seconds
9 examples, 0 failures
</code></pre>

<h2>Test that User is valid</h2>

<p>We tested all invalid combinations of the User to make sure that the logic we wanted is
implemented, now for sanity check we&#8217;ll add the test to make sure when all given is valid
then the User should be valid and saving of the User can be executed.</p>

<p>Add new test <code>is valid</code> and the whole <code>spec/models/user_spec.rb</code> should look like this:</p>

<figure class='code'><figcaption><span>spec/models/user_spec.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;spec_helper&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">describe</span> <span class="no">User</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">let</span> <span class="ss">:user</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">build</span> <span class="ss">:user</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">subject</span> <span class="k">do</span>
</span><span class='line'>   <span class="n">user</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">context</span> <span class="s1">&#39;is invalid&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;when required #email is not given&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span><span class="o">.</span><span class="n">email</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;when required #password is not given&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;when required #full_name is not given&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span><span class="o">.</span><span class="n">full_name</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;when #email is not unique&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>      <span class="n">user1</span> <span class="o">=</span> <span class="n">build</span> <span class="ss">:user</span>
</span><span class='line'>      <span class="n">user1</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">user1</span><span class="o">.</span><span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>      <span class="n">user1</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">full_messages</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">should</span> <span class="n">match</span> <span class="s1">&#39;Email has already been taken&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;when #email format is not valid&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span><span class="o">.</span><span class="n">email</span> <span class="o">=</span> <span class="s1">&#39;invalid mail&#39;</span>
</span><span class='line'>      <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;when #password is not at least 8 characters&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">user</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="s1">&#39;abc123&#39;</span>
</span><span class='line'>      <span class="n">should_not</span> <span class="n">be_valid</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">it</span> <span class="s1">&#39;#email must not ever change after it is created&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">update_attributes</span> <span class="n">email</span><span class="p">:</span> <span class="s1">&#39;ksajler@gmail.com&#39;</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">reload</span><span class="o">.</span><span class="n">email</span><span class="o">.</span><span class="n">should</span> <span class="n">match</span> <span class="s1">&#39;xajler@gmail.com&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">it</span> <span class="s1">&#39;is valid&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">should</span> <span class="n">be_valid</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all 10 tests, Integration and Model should pass:</p>

<pre><code>Finished in 1.24 seconds
10 examples, 0 failures
</code></pre>

<h2>Prettier RSpec Tests</h2>

<p>By default the RSpec tests are represented as dots (<code>.</code>) if they are passed and <code>F</code> if they fail.</p>

<p>To display <code>describe</code>, <code>context</code> and <code>it</code> titles while running RSpec, add <code>format</code> to
<code>.rspec</code> file:</p>

<figure class='code'><figcaption><span>.rspec</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>--color
</span><span class='line'>--format documentation
</span></code></pre></td></tr></table></div></figure>


<p>Run all test and the format of RSpec test should look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>User
</span><span class='line'>  #email must not ever change after it is created
</span><span class='line'>  is valid
</span><span class='line'>  is invalid
</span><span class='line'>    when #password is not at least 8 characters
</span><span class='line'>    when required #password is not given
</span><span class='line'>    when #email format is not valid
</span><span class='line'>    when required #full_name is not given
</span><span class='line'>    when #email is not unique
</span><span class='line'>    when required #email is not given
</span><span class='line'>
</span><span class='line'>Users
</span><span class='line'>  GET /users/new
</span><span class='line'>    displays the create new user page
</span><span class='line'>  GET /signup
</span><span class='line'>    displays the sign up page
</span><span class='line'>
</span><span class='line'>Finished in 1.81 seconds
</span><span class='line'>10 examples, 0 failures
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>This post was all about the Rails Validation, there are few interesting samples how to
test Rails application. The TDD in this post is solely done on User Model instead of on
request browser based testes done with <em>Capybara</em>.</p>

<p>Now when we are sure that User Model validation logic is implemented and tested in next
post, we will Save and Update User Views, Controller methods and create browser based
test to make sure that User Model logic actually works in real usage!</p>

<h2>Code</h2>

<p>The code is hosted on GitHub and can be cloned from the <a href="https://github.com/xajler/just-todo-it">xajler/just-todo-it</a>.</p>

<blockquote><p>Github xajler/just-todo-it commit for this post:</p>

<p><a href="https://github.com/xajler/just-todo-it/commit/f2edd5551c915bba59b3aabb8c894325cf4f5414">Implemented User Model validation and tested in user_spec.rb, the tests using users factory.</a></p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails App from Scratch: User Sign Up page]]></title>
    <link href="http://learnaholic.me/2012/10/24/rails-app-from-scratch-user-signup-page/"/>
    <updated>2012-10-24T05:25:00+02:00</updated>
    <id>http://learnaholic.me/2012/10/24/rails-app-from-scratch-user-signup-page</id>
    <content type="html"><![CDATA[<p>The aim of post is to create only the User Sign Up Page through TDD cycle of creating User
Resource, Controller, Model and View.</p>

<p>The <code>User</code> Model will be very simple having only:</p>

<ul>
<li><em>Email</em> - required, update is disabled once it is created.</li>
<li><em>Password</em> - required, should be greater or equal than 8 characters.</li>
<li><em>Full Name</em> - required, just for human readable displaying of the user name instead of email.</li>
</ul>


<blockquote><p>Note:</p>

<p>The first intention of this blog post was full User authentication, but since it uses
TDD step-by-step development, and there is a lot from creating Route, Controller, Model and View
this post will be only creating Sign Up page. Second and maybe third post will have
validation, saving, authenticating and updating user!</p></blockquote>

<h2>Generate User Integration Test</h2>

<p>First we will start with generating Rails <code>integration_test</code> residing in <code>spec/requests</code> folder:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rails g integration_test users
</span><span class='line'>      invoke  rspec
</span><span class='line'>      create    spec/requests/users_spec.rb
</span></code></pre></td></tr></table></div></figure>


<p>First we will remove a <code>GET /users</code> as <code>describe</code> block generated by default in <code>spec/requests/users_spec.rb</code>
and left simple as:</p>

<figure class='code'><figcaption><span>spec/requests/users_sepec.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;spec_helper&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">describe</span> <span class="s1">&#39;Users&#39;</span> <span class="k">do</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Create User Test</h2>

<p>In the <code>users_spec.rb</code> we will add a <code>context</code> block that will call the <code>new</code> route and
expect to have fields for <code>email</code>, <code>password</code>, <code>password_confirmation</code>, <code>full_name</code> and button <code>Sign Up</code>:</p>

<figure class='code'><figcaption><span>spec/requests/users_sepec.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;spec_helper&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">describe</span> <span class="s1">&#39;Users&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">context</span> <span class="s1">&#39;GET /users/new&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;displays the create new user page&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Full Name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Confirm Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;full_name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password_confirmation&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_button?</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are quite few asserts in this test, that is certainly not good practice in testing,
but to make this post shorter, it is like this!</p>

<h2>TDD Step 1: Routing (Resource)</h2>

<p>After running <em>RSpec</em> test or viewing from <code>Guard</code> the expected error on saving file should be:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>1) Users GET /users/new displays the create new user page
</span><span class='line'>   Failure/Error: visit new_user_path
</span><span class='line'>   NameError:
</span><span class='line'>     undefined local variable or method `new_user_path&#39; for #&lt;RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fcf4a5a30b8&gt;
</span><span class='line'>   # ./spec/requests/users_spec.rb:6:in `block (3 levels) in &lt;top (required)&gt;&#39;
</span></code></pre></td></tr></table></div></figure>


<p>The problem is that there is no users route created.
Open <code>config/routes.rb</code>, remove all commented code and add <code>users</code> resource:</p>

<figure class='code'><figcaption><span>config/routes.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">JustToDoIt</span><span class="o">::</span><span class="no">Application</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">draw</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">resources</span> <span class="ss">:users</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>After run command to examine <em>Rails</em> routes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake routes
</span><span class='line'>    users GET    /users<span class="o">(</span>.:format<span class="o">)</span>          users#index
</span><span class='line'>          POST   /users<span class="o">(</span>.:format<span class="o">)</span>          users#create
</span><span class='line'> new_user GET    /users/new<span class="o">(</span>.:format<span class="o">)</span>      users#new
</span><span class='line'>edit_user GET    /users/:id/edit<span class="o">(</span>.:format<span class="o">)</span> users#edit
</span><span class='line'>     user GET    /users/:id<span class="o">(</span>.:format<span class="o">)</span>      users#show
</span><span class='line'>          PUT    /users/:id<span class="o">(</span>.:format<span class="o">)</span>      users#update
</span><span class='line'>          DELETE /users/:id<span class="o">(</span>.:format<span class="o">)</span>      users#destroy
</span></code></pre></td></tr></table></div></figure>


<p>You will see the <code>new_user</code> path, but to actually get the path it is needed to be called
with <code>_path</code> added to the route name as we called it in first test <code>visit new_user_path</code>.</p>

<p>For this simple authentication we will only need creating and updating of user account,
but in future, we may need, a full administration of users, including listing all and destroy
them as well!</p>

<h3>Guard Routing Error</h3>

<p>If there is a <code>LoadError</code> after applying the route in <em>Guard</em> terminal:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Exception encountered: <span class="c">#&lt;LoadError: cannot load such file -- /Users/xajler/src/rb/just-todo-it/spec/routing&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Create a <code>spec/routing</code> folder, to fix the issue:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>mkdir spec/routing
</span></code></pre></td></tr></table></div></figure>


<p>After applying the user route (and <em>Guard</em> fix), there is a expected message complaining
for existence of users controller.</p>

<h2>TDD Step 2: Controller</h2>

<p>To make test green, we need to create a user controller and the action or method called <code>new</code>
in the <code>app/controllors/users_controller.rb</code>:</p>

<figure class='code'><figcaption><span>app/controllers/users_controller.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">UsersController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">new</span>
</span><span class='line'>    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We are creating a new <code>User</code> and setting it to a instance variable <code>@user</code>, so it will be
visible within the View page!</p>

<p>The RSpec test will be failing since it doesn&#8217;t know what the <code>User</code> is:</p>

<figure class='code'><figcaption><span>app/controllers/users_controller.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">Users</span> <span class="no">GET</span> <span class="sr">/users/ne</span><span class="n">w</span> <span class="n">displays</span> <span class="n">the</span> <span class="n">create</span> <span class="kp">new</span> <span class="n">user</span> <span class="n">page</span>
</span><span class='line'>   <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>   <span class="no">NameError</span><span class="p">:</span>
</span><span class='line'>     <span class="n">uninitialized</span> <span class="n">constant</span> <span class="no">UsersController</span><span class="o">::</span><span class="no">User</span>
</span></code></pre></td></tr></table></div></figure>


<h2>TDD Step 3: Model</h2>

<p>To make test green, we need to create a <code>User</code> model in <code>app/models</code> and it will have
<code>email</code>, <code>passmord_digest</code> and <code>full_name</code>.</p>

<p>Having a <code>password_digest</code> field is important as it&#8217;s the default name that&#8217;s used with Rails
<code>has_secure_password</code> feature and we&#8217;ll be using this feature later.</p>

<p>Use this command to generate User:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rails g model User email password_digest full_name
</span><span class='line'>      invoke  active_record
</span><span class='line'>      create    db/migrate/20121023234400_create_users.rb
</span><span class='line'>      create    app/models/user.rb
</span><span class='line'>      invoke    rspec
</span><span class='line'>      create      spec/models/user_spec.rb
</span><span class='line'>      invoke      factory_girl
</span><span class='line'>      create        spec/factories/users.rb
</span></code></pre></td></tr></table></div></figure>


<p>Change the generate <code>attr_accessible</code> to include  <code>email</code>, <code>password</code>, <code>password_confirmation</code>
and <code>full_name</code> needed for user create and edit form:</p>

<figure class='code'><figcaption><span>app/models/user.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">has_secure_password</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">attr_accessible</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:password</span><span class="p">,</span> <span class="ss">:password_confirmation</span><span class="p">,</span> <span class="ss">:full_name</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We also added <code>has_secure_password</code> to the User model. This was introduced in Rails 3.1
and adds some simple authentication support to the model using that <code>password_digest</code> column.</p>

<blockquote><p>Note:</p>

<p>To have this <code>bcrypt-ruby</code> gem must be in <code>Gemfile</code> (we included it in first post)
as this gem handles hashing the password before its stored in the database.</p></blockquote>

<p>The generator will create a Model, Migration, RSpec test and
a Factory Girl factory since we use it instead default Rails fixtures!</p>

<p>We will have another error regarding database:</p>

<figure class='code'><figcaption><span>app/models/user.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">Users</span> <span class="no">GET</span> <span class="sr">/users/ne</span><span class="n">w</span> <span class="n">displays</span> <span class="n">the</span> <span class="n">create</span> <span class="kp">new</span> <span class="n">user</span> <span class="n">page</span>
</span><span class='line'>   <span class="no">Failure</span><span class="o">/</span><span class="no">Error</span><span class="p">:</span> <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>   <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">StatementInvalid</span><span class="p">:</span>
</span><span class='line'>     <span class="no">Could</span> <span class="ow">not</span> <span class="n">find</span> <span class="n">table</span> <span class="s1">&#39;users&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Migration</h3>

<p>To have a database and make green our test, run command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake db:migrate
</span><span class='line'><span class="o">==</span>  CreateUsers: <span class="nv">migrating</span> <span class="o">====================================================</span>
</span><span class='line'>-- create_table<span class="o">(</span>:users<span class="o">)</span>
</span><span class='line'>   -&gt; 0.0025s
</span><span class='line'><span class="o">==</span>  CreateUsers: migrated <span class="o">(</span>0.0027s<span class="o">)</span> <span class="o">===========================================</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Note:</p>

<p>This migration will create <code>development.sqlite3</code> <em>SQLite 3</em> database in <code>db</code> folder and <code>users</code> table.</p></blockquote>

<p>We also need to prepare database for testing with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake db:test:prepare
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Note:</p>

<p>This migration will create <code>test.sqlite3</code> <em>SQLite 3</em> database in <code>db</code> folder, and <code>users</code> table.</p></blockquote>

<p>The RSpec test still will be failing with complaint on not having a view for user:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>1<span class="o">)</span> Users GET /users/new displays the create new user page
</span><span class='line'>   Failure/Error: visit new_user_path
</span><span class='line'>   ActionView::MissingTemplate:
</span><span class='line'>     Missing template users/new, application/new with <span class="o">{</span>:locale<span class="o">=</span>&gt;<span class="o">[</span>:en<span class="o">]</span>, :formats<span class="o">=</span>&gt;<span class="o">[</span>:html<span class="o">]</span>, :handlers<span class="o">=</span>&gt;<span class="o">[</span>:erb, :builder, :coffee, :haml<span class="o">]}</span>. Searched in:
</span><span class='line'>       * <span class="s2">&quot;/Users/xajler/src/rb/just-todo-it/app/views&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>TDD Step 4: View</h2>

<p>As we noted in first tutorial, instead of default <em>Template View Engine</em> <code>erb</code>, we will use
far more better <code>haml</code> View Engine.</p>

<h3>Converting the erb layout to haml</h3>

<p>But before using the <code>haml</code> View Engine we need to convert default layout generated with
application:</p>

<figure class='code'><figcaption><span>app/views/layouts/application.html.erb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='erb'><span class='line'><span class="x">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="x">&lt;html&gt;</span>
</span><span class='line'><span class="x">&lt;head&gt;</span>
</span><span class='line'><span class="x">  &lt;title&gt;JustToDoIt&lt;/title&gt;</span>
</span><span class='line'><span class="x">  </span><span class="cp">&lt;%=</span> <span class="n">stylesheet_link_tag</span>    <span class="s2">&quot;application&quot;</span><span class="p">,</span> <span class="ss">:media</span> <span class="o">=&gt;</span> <span class="s2">&quot;all&quot;</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">  </span><span class="cp">&lt;%=</span> <span class="n">javascript_include_tag</span> <span class="s2">&quot;application&quot;</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">  </span><span class="cp">&lt;%=</span> <span class="n">csrf_meta_tags</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">&lt;/head&gt;</span>
</span><span class='line'><span class="x">&lt;body&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">&lt;%=</span> <span class="k">yield</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'>
</span><span class='line'><span class="x">&lt;/body&gt;</span>
</span><span class='line'><span class="x">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>to much more readable <code>haml</code> default layout for application:</p>

<figure class='code'><figcaption><span>app/views/layouts/application.html.haml</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nn">!!! 5</span>
</span><span class='line'><span class="nt">%html</span>
</span><span class='line'><span class="nt">%head</span>
</span><span class='line'>  <span class="nt">%title</span> JustToDoIt
</span><span class='line'>  <span class="p">=</span> <span class="n">stylesheet_link_tag</span>    <span class="s1">&#39;application&#39;</span><span class="p">,</span> <span class="n">media</span><span class="p">:</span> <span class="s1">&#39;all&#39;</span>
</span><span class='line'>  <span class="p">=</span> <span class="n">javascript_include_tag</span> <span class="s1">&#39;application&#39;</span>
</span><span class='line'>  <span class="p">=</span> <span class="n">csrf_meta_tags</span>
</span><span class='line'>
</span><span class='line'><span class="nt">%body</span>
</span><span class='line'>  <span class="p">=</span> <span class="k">yield</span>
</span></code></pre></td></tr></table></div></figure>


<h3>New User View page</h3>

<p>We need to create a view for user called <code>new</code>, and it needs to have a fields for <code>email</code>,
<code>full_name</code>, <code>password</code>, <code>confirm password</code> and <code>Sign Up</code> button.</p>

<p>Create a <code>app/views/users/new.html.haml</code>:</p>

<figure class='code'><figcaption><span>app/views/users/new.html.haml</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nt">%h1</span> Sign Up
</span><span class='line'>
</span><span class='line'><span class="p">=</span> <span class="n">render</span> <span class="n">partial</span><span class="p">:</span> <span class="s1">&#39;form&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>User Form Partial</h3>

<p>Since the creating and updating User form will be identical, we shall create a <code>partial</code> to reuse
user form on create and update views:</p>

<figure class='code'><figcaption><span>app/views/users/_form.html.haml</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="p">=</span> <span class="n">form_for</span> <span class="vi">@user</span> <span class="k">do</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span>
</span><span class='line'>  <span class="p">-</span> <span class="k">if</span> <span class="vi">@user</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">any?</span>
</span><span class='line'>    <span class="nt">%div</span><span class="nc">.error_messages</span>
</span><span class='line'>      <span class="nt">%h2</span> Form is invalid
</span><span class='line'>      <span class="nt">%ul</span>
</span><span class='line'>        <span class="p">-</span> <span class="vi">@user</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">full_messages</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">message</span><span class="o">|</span>
</span><span class='line'>          <span class="nt">%li</span><span class="p">=</span> <span class="n">message</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">label</span> <span class="ss">:email</span><span class="p">,</span> <span class="s1">&#39;Email:&#39;</span>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">text_field</span> <span class="ss">:email</span>
</span><span class='line'>  <span class="nt">%br</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">label</span> <span class="ss">:password</span><span class="p">,</span> <span class="s1">&#39;Password:&#39;</span>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">text_field</span> <span class="ss">:password</span>
</span><span class='line'>  <span class="nt">%br</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">label</span> <span class="ss">:password_confirmation</span><span class="p">,</span> <span class="s1">&#39;Confirm Password:&#39;</span>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">text_field</span> <span class="ss">:password_confirmation</span>
</span><span class='line'>  <span class="nt">%br</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">label</span> <span class="ss">:full_name</span><span class="p">,</span> <span class="s1">&#39;Full Name:&#39;</span>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">text_field</span> <span class="ss">:full_name</span>
</span><span class='line'>  <span class="nt">%br</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">=</span> <span class="n">f</span><span class="o">.</span><span class="n">submit</span> <span class="s1">&#39;Sign Up&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And finally the test will be green, ignore for now that <code>spec/models/user_spec.rb</code> is currently pending!</p>

<h2>Testing Sign Up Page with Browser</h2>

<p>The beauty of it all, is that we didn&#8217;t even start browser, so we can do it now for test by running
Rails server (<em>Thin</em>):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rails <span class="nv">s</span>
</span><span class='line'><span class="o">=</span>&gt; Booting <span class="nv">Thin</span>
</span><span class='line'><span class="o">=</span>&gt; Rails 3.2.8 application starting in development on http://0.0.0.0:3000
</span><span class='line'><span class="o">=</span>&gt; Call with -d to <span class="nv">detach</span>
</span><span class='line'><span class="o">=</span>&gt; Ctrl-C to shutdown server
</span><span class='line'>&gt;&gt; Thin web server <span class="o">(</span>v1.5.0 codename Knife<span class="o">)</span>
</span><span class='line'>&gt;&gt; Maximum connections <span class="nb">set </span>to 1024
</span><span class='line'>&gt;&gt; Listening on 0.0.0.0:3000, CTRL+C to stop
</span></code></pre></td></tr></table></div></figure>


<p>Open page:</p>

<pre><code>http://localhost:3000/users/new
</code></pre>

<p>The design it is not really attractive at all, but it was not scope of the post, and should
not be while creating application. When designers create full design it can be applied very
easily. Functionality matters for now!</p>

<h2>Creating the SignUp route</h2>

<p>The <code>/users/new</code> route name is descriptive but having just <code>/signup</code>, I think is far more
better route name!</p>

<h3>SignUp Route Test</h3>

<p>Create a new test context in <code>spec/resources/users_spec.rb</code>:</p>

<figure class='code'><figcaption><span>spec/requests/users_sepec.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;spec_helper&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">describe</span> <span class="s1">&#39;Users&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">context</span> <span class="s1">&#39;GET /users/new&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;displays the create new user page&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">new_user_path</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Full Name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Confirm Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;full_name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password_confirmation&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_button?</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">context</span> <span class="s1">&#39;GET /signup&#39;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">it</span> <span class="s1">&#39;displays the sign up page&#39;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">visit</span> <span class="n">signup_path</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Full Name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">should</span> <span class="n">have_content</span> <span class="s1">&#39;Confirm Password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;email&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;full_name&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_field?</span> <span class="s1">&#39;password_confirmation&#39;</span>
</span><span class='line'>      <span class="n">page</span><span class="o">.</span><span class="n">has_button?</span> <span class="s1">&#39;Sign Up&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>GET /signup</code> context is added that is now visiting the <code>signup_path</code>!</p>

<p>Test fails:</p>

<figure class='code'><figcaption><span>spec/requests/users_sepec.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="p">)</span> <span class="no">Users</span> <span class="no">GET</span> <span class="sr">/signup displays the sign up page</span>
</span><span class='line'><span class="sr">   Failure/</span><span class="no">Error</span><span class="p">:</span> <span class="n">visit</span> <span class="n">signup_path</span>
</span><span class='line'>   <span class="no">NameError</span><span class="p">:</span>
</span><span class='line'>     <span class="n">undefined</span> <span class="n">local</span> <span class="n">variable</span> <span class="ow">or</span> <span class="nb">method</span> <span class="sb">`signup_path&#39; for #&lt;RSpec::Core::ExampleGroup::Nested_1::Nested_2:0x007f9f8b6459d8&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is no <code>signup_path</code> so we need to create it in <code>routes</code>:</p>

<figure class='code'><figcaption><span>config/routes.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">JustToDoIt</span><span class="o">::</span><span class="no">Application</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">draw</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">resources</span> <span class="ss">:users</span>
</span><span class='line'>  <span class="n">get</span> <span class="s1">&#39;signup&#39;</span><span class="p">,</span> <span class="n">to</span><span class="p">:</span> <span class="s1">&#39;users#new&#39;</span><span class="p">,</span> <span class="n">as</span><span class="p">:</span> <span class="s1">&#39;signup&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test passes and it is green, you can now try testing it in browser:</p>

<pre><code>localhost:3000/signup
</code></pre>

<p>It should work just fine!</p>

<h2>Conclusion</h2>

<p>This post intended to absorb whole authentication of user, but currently is just too long
and I will stop here and in second post will introduce validation, saving and maybe yet
in third post authenticating and updating user!</p>

<h2>Code</h2>

<p>The code is hosted on GitHub and can be cloned from the <a href="https://github.com/xajler/just-todo-it">xajler/just-todo-it</a>.</p>

<blockquote><p>Github xajler/just-todo-it commit for this post:</p>

<p><a href="https://github.com/xajler/just-todo-it/commit/7ee07ec64ca652f4840da8463ad3ce0d1efe64c6">Created User Controller, Model and View for Sign Up or Create User, created two integration tests, changed spec_helper due issues between the database_cleaner and sprok.</a></p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails App from Scratch: Create and Configure for Testing]]></title>
    <link href="http://learnaholic.me/2012/10/19/rails-app-from-scratch-create-and-configure-testing/"/>
    <updated>2012-10-19T06:28:00+02:00</updated>
    <id>http://learnaholic.me/2012/10/19/rails-app-from-scratch-create-and-configure-testing</id>
    <content type="html"><![CDATA[<p>This blog post will be one many showing how to create <em>Todo</em> the <em>Rails 3</em> application.
The first post will be creating the Rails application and setting up the testing environment.</p>

<p> The app will be called <em>Just ToDo it</em>, just as famous
 <a href="https://en.wikipedia.org/wiki/Just_Do_It_(Nike)" target="_blank">Nike slogan</a>. And also Gods of DNS where
 good to me so the <em>Domain</em> <code>justtodoit.com</code> is free so I bought it and the final stage of this
 Rails posts will be deployment to <em>VPS</em> and pointing to the domain <a href="http://justtodoit.com">JustToDoIt</a>
 (Currently displays my domain <a href="http://metaintellect.com">metaintellect</a>).</p>

<h2>Create application</h2>

<p>The command to create new Rails application and omitting default testing framework <em>Unit::Test</em>
with switch <code>-T</code> or longer version is <code>--skip-test-unit</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rails new JustToDoIt -T
</span><span class='line'>create
</span><span class='line'>create  README.rdoc
</span><span class='line'>create  Rakefile
</span><span class='line'>create  config.ru
</span><span class='line'>create  .gitignore
</span><span class='line'>create  Gemfile
</span><span class='line'>create  app
</span><span class='line'>...
</span></code></pre></td></tr></table></div></figure>


<p>I had capitalized <code>JustToDoIt</code> before, because the name is used as Ruby class and Pascal case is convention
for Ruby classes.</p>

<p>Then rename folder to <code>just-todo-it</code> to be more in *nix folder naming convention:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>mv JustToDoIt just-todo-it
</span></code></pre></td></tr></table></div></figure>


<p>The fun starts when the directory is changed to Rails app directory:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span><span class="nb">cd </span>just-todo-it
</span></code></pre></td></tr></table></div></figure>


<h2>Text editor</h2>

<p>I&#8217;ll use <em>vim</em> as a default text editor, for <em>TextMate</em> use <code>mate</code> and for the <em>Sublime Text 2</em> use
<code>subl</code> terminal commands for editing files instead of <code>vim</code>.</p>

<h2>Gemfile</h2>

<p>First open the <code>Gemfile</code>, we need to add some <em>gems</em> that will be used in the app and also
for testing:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>vim Gemfile
</span></code></pre></td></tr></table></div></figure>


<p>Edit it to include this gems:</p>

<figure class='code'><figcaption><span>Gemfile</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">source</span> <span class="s1">&#39;https://rubygems.org&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;rails&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;bcrypt-ruby&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;unicorn&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;haml&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;thin&#39;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;pg&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">group</span> <span class="ss">:test</span><span class="p">,</span> <span class="ss">:development</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;sqlite3&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;rspec-rails&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;pry&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;factory_girl_rails&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;database_cleaner&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;awesome_print&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;capybara&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;rb-fsevent&#39;</span><span class="p">,</span> <span class="ss">:require</span> <span class="o">=&gt;</span> <span class="kp">false</span> <span class="k">if</span> <span class="no">RUBY_PLATFORM</span> <span class="o">=~</span> <span class="sr">/darwin/i</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;guard-rspec&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;spork&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;guard-spork&#39;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">group</span> <span class="ss">:assets</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;sass-rails&#39;</span><span class="p">,</span>   <span class="s1">&#39;~&gt; 3.2.3&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;coffee-rails&#39;</span><span class="p">,</span> <span class="s1">&#39;~&gt; 3.2.1&#39;</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;uglifier&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt;= 1.0.3&#39;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;jquery-rails&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>After changing the <code>Gemfile</code> run <em>bundler</em> to update and download entered <em>gems</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>bundle install
</span></code></pre></td></tr></table></div></figure>


<h3>Main and Production Ruby Gems</h3>

<ul>
<li><a href="http://rubyonrails.org/">rails</a> - The latest one <code>3.2.8</code> for this time of writing.</li>
<li><a href="https://github.com/codahale/bcrypt-ruby">bcrypt-ruby</a> - Needed for password hashing.</li>
<li><a href="https://github.com/defunkt/unicorn">unicorn</a> - For production, it will run as <a href="https://github.com/rack/rack">Rack</a> HTTP Server.</li>
<li><a href="http://haml.info/">haml</a> - My favorite View rendering engine.</li>
<li><a href="http://code.macournoyer.com/thin/">thin</a> - <em>Thin</em> as local server instead of default <em>Webrick</em>.</li>
<li><a href="https://bitbucket.org/ged/ruby-pg">pg</a> - My default database for production usage.</li>
</ul>


<h3>Test and Development Ruby Gems</h3>

<ul>
<li><a href="https://github.com/luislavena/sqlite3-ruby">sqlite3</a> - The database used for development and testing environments.</li>
<li><a href="https://www.relishapp.com/rspec/rspec-rails/docs">rspec-rails</a> - RSpec as default testing framework.</li>
<li><a href="http://pryrepl.org/">pry</a> - Using as default <em>Interactive Ruby</em> console instead of <code>irb</code>. Needs some configuration to be hooked as <code>rails console</code>.</li>
<li><a href="https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md">factory_girl_rails</a> - The testing factory framework, used instead of the default <em>Fixtures</em>.</li>
<li><a href="https://github.com/bmabey/database_cleaner">database_cleaner</a> - Used to speed-up tests, in my case to encapsulate the tests into db transaction.</li>
<li><a href="https://github.com/michaeldv/awesome_print">awesome_print</a> - Used by <em>Pry</em> to pretty prints Ruby objects in full color exposing their internal structure with proper indentation.</li>
<li><a href="http://jnicklas.github.com/capybara/">capybara</a> - for simulating the web interaction in the tests.</li>
<li><a href="https://github.com/guard/guard-rspec">guard-rspec</a> - To refresh and run the tests upon saving via <a href="https://github.com/thibaudgg/rb-fsevent">rb-fsevent</a>.</li>
<li><a href="https://github.com/sporkrb/spork">spork</a> - The server to speed up tests, how?, see provided link.</li>
<li><a href="https://github.com/guard/guard-spork">guard-spork</a> - Refreshes the spork server on changes, so that we don&#8217;t need to.</li>
</ul>


<h2>Testing configuration</h2>

<h3>RSpec</h3>

<p><em>RSpec</em> will be used as the test framework for the <code>Just ToDo it</code> app.</p>

<p>Run generator to install <em>RSpec</em> to <em>Rails</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rails g rspec:install
</span><span class='line'>create  .rspec
</span><span class='line'>create  spec
</span><span class='line'>create  spec/spec_helper.rb
</span></code></pre></td></tr></table></div></figure>


<h3>Guard</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>bundle <span class="nb">exec </span>guard init
</span><span class='line'>rspec guard added to Guardfile, feel free to edit it
</span><span class='line'>spork guard added to Guardfile, feel free to edit it
</span></code></pre></td></tr></table></div></figure>


<p>Configure <code>Guardfile</code> set the <em>Spork</em> on top and <em>RSpec</em> in bottom:</p>

<figure class='code'><figcaption><span>Guardfile</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">guard</span> <span class="s1">&#39;spork&#39;</span><span class="p">,</span> <span class="ss">:cucumber_env</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="s1">&#39;RAILS_ENV&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;test&#39;</span> <span class="p">},</span> <span class="ss">:rspec_env</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="s1">&#39;RAILS_ENV&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;test&#39;</span> <span class="p">}</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">watch</span><span class="p">(</span><span class="s1">&#39;config/application.rb&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">watch</span><span class="p">(</span><span class="s1">&#39;config/environment.rb&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">watch</span><span class="p">(</span><span class="sr">%r{^config/environments/.+\.rb$}</span><span class="p">)</span>
</span><span class='line'>  <span class="n">watch</span><span class="p">(</span><span class="sr">%r{^config/initializers/.+\.rb$}</span><span class="p">)</span>
</span><span class='line'>  <span class="n">watch</span><span class="p">(</span><span class="s1">&#39;spec/spec_helper.rb&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">watch</span><span class="p">(</span><span class="sr">%r{^spec/support/.+\.rb$}</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">guard</span> <span class="s1">&#39;rspec&#39;</span><span class="p">,</span> <span class="n">cli</span><span class="p">:</span> <span class="s2">&quot;--drb&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Spork</h3>

<p>Bootstrap the <em>Spork</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>spork --bootstrap
</span><span class='line'>Using RSpec
</span><span class='line'>Bootstrapping /Users/xajler/src/rb/just-todo-it/spec/spec_helper.rb.
</span><span class='line'>Done. Edit /Users/xajler/src/rb/just-todo-it/spec/spec_helper.rb now with your favorite text editor and follow the instructions.
</span></code></pre></td></tr></table></div></figure>


<h3>RSpec Helper</h3>

<p>Edit RSpec helper:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>vim spec/spec_helper.rb
</span></code></pre></td></tr></table></div></figure>


<p>And edit to include this content:</p>

<figure class='code'><figcaption><span>spec_helper.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rubygems&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;spork&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;database_cleaner&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">Spork</span><span class="o">.</span><span class="n">prefork</span> <span class="k">do</span>
</span><span class='line'>  <span class="no">ENV</span><span class="o">[</span><span class="s2">&quot;RAILS_ENV&quot;</span><span class="o">]</span> <span class="o">||=</span> <span class="s1">&#39;test&#39;</span>
</span><span class='line'>  <span class="nb">require</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s2">&quot;../../config/environment&quot;</span><span class="p">,</span> <span class="bp">__FILE__</span><span class="p">)</span>
</span><span class='line'>  <span class="nb">require</span> <span class="s1">&#39;rspec/rails&#39;</span>
</span><span class='line'>  <span class="nb">require</span> <span class="s1">&#39;capybara/rspec&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="no">Dir</span><span class="o">[</span><span class="no">Rails</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot;spec/support/**/*.rb&quot;</span><span class="p">)</span><span class="o">].</span><span class="n">each</span> <span class="p">{</span><span class="o">|</span><span class="n">f</span><span class="o">|</span> <span class="nb">require</span> <span class="n">f</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="no">DatabaseCleaner</span><span class="o">.</span><span class="n">strategy</span> <span class="o">=</span> <span class="ss">:truncation</span>
</span><span class='line'>
</span><span class='line'>  <span class="no">RSpec</span><span class="o">.</span><span class="n">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">mock_with</span> <span class="ss">:rspec</span>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">include</span> <span class="no">FactoryGirl</span><span class="o">::</span><span class="no">Syntax</span><span class="o">::</span><span class="no">Methods</span>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">use_transactional_fixtures</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">infer_base_class_for_anonymous_controllers</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">order</span> <span class="o">=</span> <span class="s2">&quot;random&quot;</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">Spork</span><span class="o">.</span><span class="n">each_run</span> <span class="k">do</span>
</span><span class='line'>  <span class="no">FactoryGirl</span><span class="o">.</span><span class="n">reload</span>
</span><span class='line'>  <span class="no">DatabaseCleaner</span><span class="o">.</span><span class="n">clean</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>It uses <em>Spork</em> server and the aim is to have most things in <code>prefork</code> block where is
stuff run on load of <em>Spork</em>.</p>

<p>In <code>each_run</code> block we want put only necessary things, because it runs each time,
we are now having only reloading of <em>Factory Girl</em> factories, but maybe we will add something
from <code>prefork</code> if we would have some troubles with testing data.</p>

<p><em>DatabaseCleaner</em> is used to start, on before and clean it, on after running.
The strategy used for <em>DatabaseCleaner</em> is transaction, meaning to rollback
changes after the transaction queries are finished.</p>

<h3>Run Guard</h3>

<p>The testing environment is now configured, the <em>Guard</em> can be run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>guard
</span><span class='line'>uard could not detect any of the supported notification libraries.
</span><span class='line'>Guard is now watching at <span class="s1">&#39;/Users/xajler/src/rb/just-todo-it&#39;</span>
</span><span class='line'>Starting Spork <span class="k">for </span>RSpec
</span><span class='line'>Using RSpec
</span><span class='line'>Preloading Rails environment
</span><span class='line'>Loading Spork.prefork block...
</span><span class='line'>Spork is ready and listening on 8989!
</span><span class='line'>Spork server <span class="k">for </span>RSpec successfully started
</span><span class='line'>Guard::RSpec is running
</span><span class='line'>Running all specs
</span><span class='line'>Running tests with args <span class="o">[</span><span class="s2">&quot;--drb&quot;</span>, <span class="s2">&quot;-f&quot;</span>, <span class="s2">&quot;progress&quot;</span>, <span class="s2">&quot;-r&quot;</span>, <span class="s2">&quot;/Users/xajler/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/guard-rspec-2.1.0/lib/guard/rspec/formatter.rb&quot;</span>, <span class="s2">&quot;-f&quot;</span>, <span class="s2">&quot;Guard::RSpec::Formatter&quot;</span>, <span class="s2">&quot;--out&quot;</span>, <span class="s2">&quot;/dev/null&quot;</span>, <span class="s2">&quot;--failure-exit-code&quot;</span>, <span class="s2">&quot;2&quot;</span>, <span class="s2">&quot;spec&quot;</span><span class="o">]</span>...
</span><span class='line'>No examples found.
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>Finished in 0.11748 seconds
</span><span class='line'>0 examples, 0 failures
</span><span class='line'>
</span><span class='line'>Randomized with seed 7715
</span><span class='line'>
</span><span class='line'>Done.
</span></code></pre></td></tr></table></div></figure>


<p>or use <code>bundle exec guard</code> to remove displayed warning.</p>

<p>To exit or stop the <code>guard</code> command use <code>Ctrl+C</code>.</p>

<h2>Pry as Rails Console</h2>

<p>And for the end we will set <em>Pry</em> as our default <em>Interactive Ruby</em> console.</p>

<p>Open the <code>development.rb</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>vim config/enironments/development.rb
</span></code></pre></td></tr></table></div></figure>


<p>At the end of source file add code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">silence_warnings</span> <span class="k">do</span>
</span><span class='line'>  <span class="nb">require</span> <span class="s1">&#39;pry&#39;</span>
</span><span class='line'>  <span class="no">IRB</span> <span class="o">=</span> <span class="no">Pry</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Try it out with <code>.pwd</code> and close the <em>Pry</em> with <code>exit</code> command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rails c
</span><span class='line'>Loading development environment <span class="o">(</span>Rails 3.2.8<span class="o">)</span>
</span><span class='line'>1.9.3 <span class="o">(</span>main<span class="o">)</span>:0 &gt; .pwd
</span><span class='line'>/Users/xajler/src/rb/just-todo-it
</span><span class='line'>1.9.3 <span class="o">(</span>main<span class="o">)</span>:0 &gt; <span class="nb">exit</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Commit Source</h2>

<p>First remove the <code>README.rdoc</code> file and create markdown <code>README.md</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rm README.rdoc
</span><span class='line'><span class="nv">$ </span>vim README.md
</span></code></pre></td></tr></table></div></figure>


<p>Add simple description:</p>

<figure class='code'><figcaption><span>README.md</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>The simple ToDo Rails App!
</span></code></pre></td></tr></table></div></figure>


<h3>Initialize</h3>

<p>Initialize the <em>git</em> repository:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git init
</span><span class='line'>Initialized empty Git repository in /Users/xajler/src/rb/just-todo-it/.git/
</span></code></pre></td></tr></table></div></figure>


<h3>Status</h3>

<p>See the status:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git status
</span><span class='line'><span class="c"># On branch master</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Initial commit</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Untracked files:</span>
</span><span class='line'><span class="c"># .gitignore</span>
</span><span class='line'><span class="c"># .rspec</span>
</span><span class='line'><span class="c"># Gemfile</span>
</span><span class='line'><span class="c"># Gemfile.lock</span>
</span><span class='line'><span class="c"># Guardfile</span>
</span><span class='line'><span class="c"># README.md</span>
</span><span class='line'><span class="c"># Rakefile</span>
</span><span class='line'><span class="c"># app/</span>
</span><span class='line'><span class="c"># config.ru</span>
</span><span class='line'><span class="c"># config/</span>
</span><span class='line'><span class="c"># db/</span>
</span><span class='line'><span class="c"># doc/</span>
</span><span class='line'><span class="c"># lib/</span>
</span><span class='line'><span class="c"># log/</span>
</span><span class='line'><span class="c"># public/</span>
</span><span class='line'><span class="c"># script/</span>
</span><span class='line'><span class="c"># spec/</span>
</span><span class='line'><span class="c"># vendor/</span>
</span><span class='line'>nothing added to commit but untracked files present
</span></code></pre></td></tr></table></div></figure>


<h3>Add</h3>

<p>Then add all files:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git add .
</span><span class='line'><span class="c"># On branch master</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Initial commit</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Changes to be committed:</span>
</span><span class='line'><span class="c"># new file:   .gitignore</span>
</span><span class='line'><span class="c"># new file:   .rspec</span>
</span><span class='line'><span class="c"># new file:   Gemfile</span>
</span><span class='line'>...
</span></code></pre></td></tr></table></div></figure>


<h3>Commit</h3>

<p>Commit the files to local repository:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git commit -m <span class="s1">&#39;Initial Commit. Created initial Rails app, added all needed Gems, testing configured&#39;</span>
</span><span class='line'><span class="o">[</span>master <span class="o">(</span>root-commit<span class="o">)</span> e4517a6<span class="o">]</span> Initial Commit. Created initial Rails app, added all needed Gems, testing configured
</span><span class='line'> 38 files changed, 1086 insertions<span class="o">(</span>+<span class="o">)</span>
</span><span class='line'> create mode 100644 .gitignore
</span><span class='line'> create mode 100644 .rspec
</span><span class='line'> create mode 100644 Gemfile
</span></code></pre></td></tr></table></div></figure>


<h3>Set Github Remote</h3>

<p>The app will be on <em>Github</em>. So after the new repository is created on <em>Github</em>, we can add
remote to the local repository:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git remote add origin git@github.com:xajler/just-todo-it.git
</span></code></pre></td></tr></table></div></figure>


<h3>Push to the Github</h3>

<p>After we add remote, it is now safe to push changes to <em>Github</em> remote repository:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git push -u origin master
</span><span class='line'>Counting objects: 63, <span class="k">done</span>.
</span><span class='line'>Delta compression using up to 4 threads.
</span><span class='line'>Compressing objects: 100% <span class="o">(</span>47/47<span class="o">)</span>, <span class="k">done</span>.
</span><span class='line'>Writing objects: 100% <span class="o">(</span>63/63<span class="o">)</span>, 23.32 KiB, <span class="k">done</span>.
</span><span class='line'>Total 63 <span class="o">(</span>delta 2<span class="o">)</span>, reused 0 <span class="o">(</span>delta 0<span class="o">)</span>
</span><span class='line'>To git@github.com:xajler/just-todo-it.git
</span><span class='line'> * <span class="o">[</span>new branch<span class="o">]</span>      master -&gt; master
</span><span class='line'>Branch master <span class="nb">set </span>up to track remote branch master from origin.
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>It this first part we have created a <code>JustToDoIt</code> Rails application.</p>

<p>And because we shall use <em>TDD</em> (Test Driven Development) to drive this app, we first
configure the testing environment including:</p>

<ul>
<li>RSpec</li>
<li>Factory Girl</li>
<li>Database Cleaner</li>
<li>Guard</li>
<li>Spork</li>
</ul>


<p>And for the end we setup the <em>Pry</em> to be a default for <em>Rails</em> console and commit the
source to the <em>Github</em> repository <a href="https://github.com/xajler/just-todo-it">xajler/just-todo-it</a>.</p>

<p>In second post we shall go with the creating the app logic in <em>TDD</em> way!</p>

<h2>Code</h2>

<p>The code is hosted on GitHub and can be cloned from the <a href="https://github.com/xajler/just-todo-it">xajler/just-todo-it</a>.</p>

<blockquote><p>Github xajler/just-todo-it commit for this post:</p>

<p><a href="https://github.com/xajler/just-todo-it/commit/e4517a6390f912850c63cc60085cbd57770d22ed">Initial Commit. Created initial Rails app, added all needed Gems, testing configured</a></p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Octopress SEO and disabling the blog route]]></title>
    <link href="http://learnaholic.me/2012/10/15/octopress-seo-and-disabling-the-blog-route/"/>
    <updated>2012-10-15T08:36:00+02:00</updated>
    <id>http://learnaholic.me/2012/10/15/octopress-seo-and-disabling-the-blog-route</id>
    <content type="html"><![CDATA[<p>The SEO on Octopress by default is moderate, but it can be better, too bad that the <code>rake new_post</code>
doesn&#8217;t generate <em>Meta description</em> and the <em>keywords</em>. The other problem is
redirect to single page which is broken since there is <em>learnaholic.me</em> and <em>www.learnaholic.me</em>
which can affect site ranking.</p>

<p>The third problem is that Octopress by default has a <code>&lt;domain&gt;/blog</code> route path which is awkward
and unnecessary, domain is sufficient enough without <code>/blog</code>.</p>

<p>The most SEO fixes are from the <a href="http://www.yatishmehta.in/seo-for-octopress">SEO for Octopress,Heroku</a>
post by Yatish Mehta.</p>

<h2>Keywords and Description for every page</h2>

<p>The provided <em>keywords</em> and <em>description</em> should be a goal for each page, the problem is
that <code>rake new_post</code> doesn&#8217;t generate <em>keywords</em> and <em>description</em>, so it should be added
manually.</p>

<p>I&#8217;ve added the <em>keywords</em> and <em>description</em> to all my posts created in this few days
and the post Octopress metadata looks like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>---
</span><span class='line'>layout: post
</span><span class='line'>title: "Make Powershell, SSH Github and git suck less on Windows"
</span><span class='line'>date: 2012-10-12 03:41
</span><span class='line'>comments: true
</span><span class='line'>categories: [powershell, git, github]
</span><span class='line'>keywords: powershell, git, github, windows, ssh key, posh-git, msysgit
</span><span class='line'>description: Installing the msysgit, configuring git, creating SSH keys for Github, customize the Powershell, installing posh-git. Windows suck less after.
</span><span class='line'>---</span></code></pre></td></tr></table></div></figure>


<h2>Home page Keywords and Description</h2>

<p>The Octopress by default shows latest post as home page, I choose not to go this way, my
default home page is archive list. So there is no post from where it should include the
<em>keywords</em> and <em>description</em>.</p>

<h3>Setting Keywords and Description for Home page in _config.yml</h3>

<p>Open the <code>_config.yml</code> and add the <em>kewords</em> and <em>description</em> keys:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>description: Kornelije Sajler (xajler) Learn-a-holic Geek Notes. Human compiled Brainwork by Kornelije Sajler (xajler).
</span><span class='line'>keywords: Kornelije Sajler, xajler, metaintellect, learnaholic, learn-a-holic, coding, programming, Ruby, Ruby On Rails, RSpec TDD, cucumber, jasmine, bacbone.js, postgresql, mongodb</span></code></pre></td></tr></table></div></figure>


<h3>Change head.html template to be aware of Home page SEO</h3>

<p>In <code>.themes/classic/source/_includes/head.html</code> after meta tag for <code>author</code> replace the
current <em>description</em>/<em>keywords</em> code with this one:</p>

<div><script src='https://gist.github.com/2460469.js?file='></script>
<noscript><pre><code>&lt;meta name=&quot;author&quot; content=&quot;{{ site.author }}&quot;&gt;
{% capture description %}{% if page.description %}{{ page.description }}{% elsif site.description %}{{ site.description }}{%else%}{{ content | raw_content }}{% endif %}{% endcapture %}
&lt;meta name=&quot;description&quot; content=&quot;{{ description | strip_html | condense_spaces | truncate:150 }}&quot;&gt;
{% if page.keywords %}&lt;meta name=&quot;keywords&quot; content=&quot;{{ page.keywords }}&quot;&gt;{%else%}&lt;meta name=&quot;keywords&quot; content=&quot;{{ site.keywords }}&quot;&gt;{% endif %}
</code></pre></noscript></div>


<h2>Single domain rewrite</h2>

<p>To make sure that there is no differnce between <em>learnaholic.me</em> and <em>www.learnaholic.me</em>
request, we shall include rewriting with <em>gem rack-rewrite</em>.</p>

<p>To Octopress <em>Gemfile</em> add:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gem 'rack-rewrite'</span></code></pre></td></tr></table></div></figure>


<p>To top of <code>config.ru</code> (before <code>SinatraStaticServer</code>) add:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RACK_ENV&#39;</span><span class="o">]</span> <span class="o">||=</span> <span class="s1">&#39;development&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;SITE_URL&#39;</span><span class="o">]</span> <span class="o">||=</span> <span class="s1">&#39;www.learnaholic.me&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">use</span> <span class="no">Rack</span><span class="o">::</span><span class="no">Rewrite</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">r301</span> <span class="sr">%r{.*}</span><span class="p">,</span> <span class="s2">&quot;http://</span><span class="si">#{</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;SITE_URL&#39;</span><span class="o">]</span><span class="si">}</span><span class="s2">$&amp;&quot;</span><span class="p">,</span> <span class="ss">:if</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">rack_env</span><span class="o">|</span>
</span><span class='line'>      <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RACK_ENV&#39;</span><span class="o">]</span> <span class="o">==</span> <span class="s1">&#39;production&#39;</span> <span class="o">&amp;&amp;</span> <span class="n">rack_env</span><span class="o">[</span><span class="s1">&#39;SERVER_NAME&#39;</span><span class="o">]</span> <span class="o">!=</span> <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;SITE_URL&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="n">r301</span> <span class="sr">%r{^(.+)/$}</span><span class="p">,</span> <span class="s1">&#39;$1&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Don&#8217;t forget to add a require on the top of the <code>config.ru</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rack-rewrite&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Complete <code>config.ru</code> should look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;bundler/setup&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;sinatra/base&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;rack-rewrite&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># The project root directory</span>
</span><span class='line'><span class="vg">$root</span> <span class="o">=</span> <span class="o">::</span><span class="no">File</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="bp">__FILE__</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RACK_ENV&#39;</span><span class="o">]</span> <span class="o">||=</span> <span class="s1">&#39;development&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;SITE_URL&#39;</span><span class="o">]</span> <span class="o">||=</span> <span class="s1">&#39;www.learnaholic.me&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">use</span> <span class="no">Rack</span><span class="o">::</span><span class="no">Rewrite</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">r301</span> <span class="sr">%r{.*}</span><span class="p">,</span> <span class="s2">&quot;http://</span><span class="si">#{</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;SITE_URL&#39;</span><span class="o">]</span><span class="si">}</span><span class="s2">$&amp;&quot;</span><span class="p">,</span> <span class="ss">:if</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">rack_env</span><span class="o">|</span>
</span><span class='line'>      <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RACK_ENV&#39;</span><span class="o">]</span> <span class="o">==</span> <span class="s1">&#39;production&#39;</span> <span class="o">&amp;&amp;</span> <span class="n">rack_env</span><span class="o">[</span><span class="s1">&#39;SERVER_NAME&#39;</span><span class="o">]</span> <span class="o">!=</span> <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;SITE_URL&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="n">r301</span> <span class="sr">%r{^(.+)/$}</span><span class="p">,</span> <span class="s1">&#39;$1&#39;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">SinatraStaticServer</span> <span class="o">&lt;</span> <span class="no">Sinatra</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">get</span><span class="p">(</span><span class="sr">/.+/</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">send_sinatra_file</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="p">{</span><span class="mi">404</span><span class="p">}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">not_found</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">send_sinatra_file</span><span class="p">(</span><span class="s1">&#39;404.html&#39;</span><span class="p">)</span> <span class="p">{</span><span class="s2">&quot;Sorry, I cannot find </span><span class="si">#{</span><span class="n">request</span><span class="o">.</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">send_sinatra_file</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">missing_file_block</span><span class="p">)</span>
</span><span class='line'>    <span class="n">file_path</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="bp">__FILE__</span><span class="p">),</span> <span class="s1">&#39;public&#39;</span><span class="p">,</span>  <span class="n">path</span><span class="p">)</span>
</span><span class='line'>    <span class="n">file_path</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s1">&#39;index.html&#39;</span><span class="p">)</span> <span class="k">unless</span> <span class="n">file_path</span> <span class="o">=~</span> <span class="sr">/\.[a-z]+$/i</span>
</span><span class='line'>    <span class="no">File</span><span class="o">.</span><span class="n">exist?</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="p">?</span> <span class="n">send_file</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="p">:</span> <span class="n">missing_file_block</span><span class="o">.</span><span class="n">call</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">run</span> <span class="no">SinatraStaticServer</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Set the route without unnecessary /blog route path</h2>

<p>The Octopres by defult has a weird <em>&lt;domain&gt;/blog/2012/10&#8230;</em> route path, the <code>blog</code>
part of URL is totally unnecessary, so I removed it all together.</p>

<p>In <code>_config.yml</code> change:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">permalink</span><span class="p">:</span> <span class="sr">/blog/</span><span class="ss">:year</span><span class="o">/</span><span class="ss">:month</span><span class="o">/</span><span class="ss">:day</span><span class="o">/</span><span class="ss">:title</span><span class="o">/</span>
</span><span class='line'><span class="n">category_dir</span><span class="p">:</span> <span class="n">blog</span><span class="o">/</span><span class="n">categories</span>
</span></code></pre></td></tr></table></div></figure>


<p>to:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">permalink</span><span class="p">:</span> <span class="sr">/:year/</span><span class="ss">:month</span><span class="o">/</span><span class="ss">:day</span><span class="o">/</span><span class="ss">:title</span><span class="o">/</span>
</span><span class='line'><span class="n">category_dir</span><span class="p">:</span> <span class="n">categories</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now the url should look like this:</p>

<pre><code>http://learnaholic.me/2012/10/15/octopress-seo-and-disabling-the-blog-route/
</code></pre>

<p>But by default it would be:</p>

<pre><code>http://learnaholic.me/blog/2012/10/15/octopress-seo-and-disabling-the-blog-route/
</code></pre>

<h2>Conclusion</h2>

<p>Improved SEO of the Octopress site:</p>

<ul>
<li>Including the <em>keywords</em> and <em>description</em> to each post.</li>
<li>Home page is now with <em>keywords</em> and <em>description</em>, generic for the whole site.</li>
<li>Redirect to single domain. The <em>www.learnholic.me</em> request will be redirected to <em>learnaholic.me</em>.</li>
</ul>


<p>The cleaner site path by removing the unnecessary <code>/blog</code> from the URL route.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Make Powershell, SSH Github and git suck less on Windows]]></title>
    <link href="http://learnaholic.me/2012/10/12/make-powershell-and-git-suck-less-on-windows/"/>
    <updated>2012-10-12T03:41:00+02:00</updated>
    <id>http://learnaholic.me/2012/10/12/make-powershell-and-git-suck-less-on-windows</id>
    <content type="html"><![CDATA[<p>There are two Terminals in Windows <em>Command Prompt</em> and <em>Powershell</em>, and they both suck by far.
I can understand that <em>Command Prompt</em> is no good, but why the <em>Powershell</em> wasn&#8217;t done better?!</p>

<p>The things missing in <em>Powershell</em>:</p>

<ul>
<li>Maximizing is just so mid &#8216;90.</li>
<li>History for a session only (So annoying).</li>
<li>Painful adding of Aliases.</li>
<li>Emacs navigation (<code>Ctrl+a</code>,<code>Ctrl+e</code>,&#8230;).</li>
<li>Full screen and Tranparency (Oh I just want too much).</li>
<li>The config dir is in <code>Documents\WindowsPowerShell</code> (WTF).</li>
</ul>


<p>Maybe to most Windows users this is strange because this kind of stuff is never used, but if
you&#8217;re coming from <em>Linux</em> or <em>Mac</em> then the frustration is certain. Because <em>Linux</em> or <em>Mac</em> are
having great Terminal and working in them is just a joy.</p>

<p>The aim of post is to install <em>git</em> on Windowns and then configure it.
Then customize a little bit the <em>Powershell</em> because the defaults are just crime against humanity.
Configure <em>SSH</em> on machine and register <em>SSH</em> key with Github.
Install must-have <a href="https://github.com/dahlbyk/posh-git">posh-git</a> that will add the branch/status
to <em>Powershell</em> prompt plus auto-completion for <em>git</em>.</p>

<p>Note that I&#8217;m using Windows 8 and <em>Powershell</em> version 3.0.</p>

<h2>Git Install</h2>

<p>For those who might don&#8217;t know the <em>git</em> is created by Linus Torvalds the creator of <em>Linux Kernel</em>.
<em>Git</em> was a  product of his frustration maintaining <em>Linux Kernel</em>. He is not really the
huge fan of Windows (nor am I) so <em>git</em> Windows implementation was hard to do because it
really relies on <em>Unix/Linux</em> commands and philosophies that are lacking on Windows.</p>

<p>I know there was a problem I while back with the <a href="http://git-scm.com/downloads">official Git version for Windows</a>
and I was always using the <a href="https://code.google.com/p/msysgit">msysgit</a>,
don&#8217;t know if still is the case but I will use <em>msysgit</em> in this post.</p>

<p>Download the latest <a href="https://code.google.com/p/msysgit/downloads/list">msysgit</a> and install it
with just clicking next few times.  There are few things to configure, but using defaults is safest way.</p>

<blockquote><p>Note:</p>

<p>There is also a <a href="http://windows.github.com/">Github for Windows</a>. Probably even easier way to
install and configure <em>git</em> on Windows, but I like to complicate things.</p></blockquote>

<h2>Add Git to PATH</h2>

<p>By default the <em>git</em> binaries are not set in to PATH, so add it by going to:</p>

<pre><code>Control Panel/System and Security/System/Advanced system settings
</code></pre>

<p>Then in <em>System Properties</em> click on <em>Environment Variables&#8230;</em> and in <em>System Variables</em> list box
scroll to <em>Variable</em> <code>Path</code>, double-click it and add at the end:</p>

<pre><code>;C:\Program Files (x86)\Git\cmd;C:\Program Files (x86)\Git\bin;
</code></pre>

<p>Test that the <em>git</em> is available by opening the <em>Powershell</em>. Easiest way to open te <em>Powershell</em>
(if there is no shortcut) especially in Windows 8 is <code>Win+r</code> and type <code>powershell</code> to prompt.</p>

<p>In <em>Powershell</em> type:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>C:\&gt; git
</span><span class='line'>usage: git [--version] [--exec-path[=&lt;path&gt;]] [--html-path] [--man-path] [--info-path]
</span><span class='line'>           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
</span><span class='line'>           [--git-dir=&lt;path&gt;] [--work-tree=&lt;path&gt;] [--namespace=&lt;name&gt;]
</span><span class='line'>           [-c name=value] [--help]
</span><span class='line'>           &lt;command&gt; [&lt;args&gt;]
</span><span class='line'>
</span><span class='line'>...</span></code></pre></td></tr></table></div></figure>


<p>If you get something like <em>usage: git</em>, then the <em>git</em> is ready!</p>

<h2>Configure Git</h2>

<p>Set the user name that will be readable in <em>git</em> log or history:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>C:\&gt; git config --global user.name &quot;Kornelije Sajler&quot;
</span></code></pre></td></tr></table></div></figure>


<p>Then set your email:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>C:\&gt; git config --global user.email &quot;xajler@gmail.com&quot;
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Note:</p>

<p>Your email address for Git should be the same one associated with your GitHub account.</p></blockquote>

<h2>Generate SSH key</h2>

<p>With <em>msysgit</em> comes a <em>Git Bash</em> needed to generate <em>SSH</em> keys. If you have one skip this step!</p>

<p>To open <em>Git Bash</em> right-click on any folder in <em>Windows Explorer</em> and choose <em>Git Bash</em>.
In <em>Git Bash</em> enter:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>ssh-keygen -t rsa -C <span class="s2">&quot;xajler@gmail.com&quot;</span>
</span><span class='line'>Generating public/private rsa key pair.
</span><span class='line'>Enter file in which to save the key <span class="o">(</span>/c/Users/Kornelije/.ssh/id_rsa<span class="o">)</span>:
</span></code></pre></td></tr></table></div></figure>


<p>Keygen will ask you for passphrase. In my first attempt I&#8217;ve added one, but on each commit I have to enter
passphrase. That is so annoying.</p>

<p>If you have a <em>SSH</em> key passphrase and it annoys you then enter:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>ssh-keygen -p
</span></code></pre></td></tr></table></div></figure>


<p>It will ask you for current passphrase, enter the current passphrasse, and with two enters,
you&#8217;ll now have a blank passphrase!</p>

<h3>Git Bash Copy/Paste</h3>

<p>The copy/paste is so awful in <em>Git Bash</em>. To paste you need to click the icon in top left corner,
go to <code>Edit</code> then <code>Paste</code>.</p>

<p>The copy is even more cumbersome, I&#8217;ll just give you a hint, choose <code>Select All</code>!</p>

<p><img src="http://i47.tinypic.com/kei238.png"></p>

<p>Or read at the end in <em>Options Tab</em> part of <em>Powershell Customization</em> to enable <em>QuickEdit Mode</em>.</p>

<h2>Set SSH key to Github</h2>

<p>To set the public <em>SSH</em> key in <a href="http://github.com">Github</a> there is need for getting it from a
<code>~/.ssh/id_rsa.pub</code>.</p>

<p>Again open <em>Git Bash</em> right-click on any folder in <em>Windows Explorer</em> and choose <em>Git Bash</em>.
In <em>Git Bash</em> enter:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>clip &lt; ~/.ssh/id_rsa.pub
</span></code></pre></td></tr></table></div></figure>


<p>This command will copy your public <em>SSH</em> key to clipboard. Then go to
<a href="https://github.com/settings/ssh">Github / Account Settngs / SSH Keys</a> and click the button
<code>Add SSH Key</code>.</p>

<p>Enter Title (sorry about my title):</p>

<pre><code>win-shit
</code></pre>

<p>Enter Key:</p>

<pre><code>Just paste from clipboard
</code></pre>

<p>By clicking <code>Add Key</code> you have successfully added <em>SSH</em> key to <a href="http://github.com">Github</a> and
the <em>git</em> pushing to <a href="http://github.com">Github</a> is now super easy.</p>

<h2>Powershell customization</h2>

<p>The visual features of <em>Powershell</em> probably didn&#8217;t change since Windows 95, and defaults
are probably still dating from &#8216;95 and selecting, copy, pasting is awkward, hard and unusable!</p>

<h3>Suck less Powershell</h3>

<p>Click the small <em>Powershell</em> icon in top left corner, and in the context menu click on <code>Properties</code>.</p>

<h4>Options Tab</h4>

<p>In <code>Edit Options</code> check the <code>QuickEdit Mode</code>. Quick edit mode enables selecting text from
anywhere in <em>Powershell</em> and with right-click it will copy the selected content.
Also with single right-click pastes the text where the blinking cursor
currently is, similar to <em>putty</em>.</p>

<p>This option really boosts the productivity in <em>Powershell</em>, it is too bad that this is
not set by default!</p>

<h4>Font Tab</h4>

<p>Even we are in 21st century but the <em>Powershell</em> is still set by default to <code>Raster Fonts</code> with
awkward sizes like 16x12, 6x8, that I never really get the meaning of.</p>

<p>In <code>Font</code> list choose the <em>Consolas</em> font (or other available mono-space font) and you can check the
<code>Bold fonts</code> if you like to have bold text. As for <code>Size</code> in list choose whatever you want
I&#8217;ll stick to <code>18</code>.</p>

<h4>Layout Tab</h4>

<p>The <em>Powershell</em> by default is very small, at least to me, maximize is totally unusable, there is
no full screen!</p>

<p><code>Screen Buffer Size</code> and <code>Window Position</code> <em>Width</em> height should be same size if you dont want
to have ugly horizontal scroll bar. I set <em>Width</em> to <code>125</code> and <code>Window Position</code> <em>Height</em> to <code>35</code>.</p>

<p>This are all customization, it is not too much but <em>Powershell</em> suck a little less after it,
but there is a room for lots and lots of improvements, while Microsoft spends time on
useless technologies like <em>Light Switch</em>.</p>

<h2>Posh-Git: Make your Git shine in Powershell</h2>

<p>A set of <em>Powershell</em> scripts which provide <em>Git/PowerShell</em> integration. Includes:</p>

<ul>
<li>Prompt for Git repositories - shows the current branch and the state of files (additions, modifications, deletions) within.</li>
<li>Tab completion for <em>git</em> commands.</li>
</ul>


<h3>Install</h3>

<p>Clone it from <em>Github</em> to any folder, I&#8217;ll clone it in <code>source</code> folder:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>C:\source &gt; git clone git://github.com/dahlbyk/posh-git.git
</span></code></pre></td></tr></table></div></figure>


<p>Verify execution of <em>Powershell</em> scripts is allowed with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>C:\source &gt; Get-ExecutionPolicy
</span></code></pre></td></tr></table></div></figure>


<p>The result should be <em>RemoteSigned</em>  or <em>Unrestricted</em>.</p>

<p>If scripts are not enabled, run <em>Powershell</em> as Administrator and call:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>C:\source &gt; Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Confirm
</span></code></pre></td></tr></table></div></figure>


<p>Then <code>cd</code> to <code>posh-git</code> folder and run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>C:\source\posh-git &gt; .\install.ps1
</span><span class='line'>Creating PowerShell profile...
</span><span class='line'>D:\MyData\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
</span><span class='line'>Adding posh-git to profile...
</span><span class='line'>posh-git successfully installed!
</span><span class='line'>Please reload your profile for the changes to take effect:
</span><span class='line'>    . $PROFILE
</span></code></pre></td></tr></table></div></figure>


<p>Then reload your profile, as noted in <em>posh-git</em> after install note:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>C:\source\posh-git &gt; . $PROFILE
</span></code></pre></td></tr></table></div></figure>


<p>If you&#8217;re done everything from this post then everything should work just fine!</p>

<p>The outcome of whole post is to have something at the end of the day:</p>

<p><img src="http://i46.tinypic.com/25ian4n.png"></p>

<p>And just for comparison the <em>Terminal iTerm2</em> on my <em>Mac OS X Mountain Lion</em> with <em>zsh shell</em>
and very short aliases, pure awesomeness:</p>

<p><img src="http://i46.tinypic.com/33fggut.png"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Deploying Octopress to Github Pages and setting custom subdomain CNAME]]></title>
    <link href="http://learnaholic.me/2012/10/10/deploying-octopress-to-github-pages-and-setting-custom-subdomain-cname/"/>
    <updated>2012-10-10T23:49:00+02:00</updated>
    <id>http://learnaholic.me/2012/10/10/deploying-octopress-to-github-pages-and-setting-custom-subdomain-cname</id>
    <content type="html"><![CDATA[<p>Blogging was really never easy task for me, I started in 2006 with <a href="http://wordpress.com">WordPress</a> but with short life.
The more about my blogging history can be read in my blog post
<a href="http://www.learnaholic.me/2009/04/26/hello-world/">and finally comes time for Blogging!</a> on my
old blogging site <a href="http://www.learnaholic.me">Learn-a-holic</a>.</p>

<h2>Blog Engines</h2>

<p>So far I was on this blog engines, chronologically:</p>

<ul>
<li><a href="http://wordpress.com">WordPress</a> (2006 - 2008)</li>
<li><a href="https://graffiticms.codeplex.com/">Graffiti CMS</a> (2008)</li>
<li><a href="http://www.dotnetblogengine.net/">BlogEngine.NET</a> (2009)</li>
<li><a href="http://wordpress.com">WordPress</a> (2009 - 2012)</li>
</ul>


<p>So far I was always coming back to <a href="http://wordpress.com">WordPress</a>, but I was never actually satisfied in writing
posts in it, everything other than that is plain perfect on <a href="http://wordpress.com">WordPress</a>.
This is why I haven&#8217;t blogging for nearly two years.</p>

<p>Nowdays I really like <a href="http://daringfireball.net/projects/markdown/">markdown</a>
or any similar kind of markup language (<a href="http://redcloth.org/textile">textile</a>,
<a href="http://www.wikicreole.org/wiki/Home">creole</a>,&#8230;), and
I would prefer writing blog posts with <a href="http://daringfireball.net/projects/markdown/">markdown</a>.
In my case blog posts are more notes than the blog posts,
because they are more technical, and there is lots of code snippets!</p>

<h2>Octopress</h2>

<p><a href="http://octopress.org/">Octopress</a> is the very easy framework on top of <a href="https://github.com/mojombo/jekyll">Jekyll</a>, and
Jekyll is a blog-aware, static site generator in <a href="http://ruby-lang.org">Ruby</a>.</p>

<h3>Install</h3>

<p>The official <a href="http://octopress.org/">Octopress</a> install is just to clone or fork the
<a href="https://github.com/imathis/octopress">Octopress repo</a>. I&#8217;ve chose to do fork then
clone it from my forked repo.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git clone git@github.com:xajler/octopress.git
</span></code></pre></td></tr></table></div></figure>


<blockquote><p><strong>Notes:</strong></p>

<p>You&#8217;ll need to change the clone to your repository, since there is need for Read+Write access!</p>

<p>I&#8217;m lying a bit the first attempt was a clone, but afterwards I&#8217;ve chose to fork it, why?,
you&#8217;ll need to read about it a little bit later.</p></blockquote>

<h2>Using Octopress with Rake</h2>

<p>The <a href="http://octopress.org/">Octopress</a> uses Jim Weirich&#8217;s great make-like build utility
<a href="https://github.com/jimweirich/rake">Rake</a>,
for creating posts/pages, deploying, generating,&#8230;</p>

<h3>Rake Install</h3>

<p>The <a href="http://octopress.org/">Octopress</a> needs for the first time to generate the sandbox with theme and placeholder
folder for posts. It can be achieved by running (needs to be in forked/cloned directory):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake install
</span><span class='line'><span class="c">## Copying classic theme into ./source and ./sass</span>
</span><span class='line'>mkdir -p <span class="nb">source</span>
</span><span class='line'>cp -r .themes/classic/source/. <span class="nb">source</span>
</span><span class='line'>mkdir -p sass
</span><span class='line'>cp -r .themes/classic/sass/. sass
</span><span class='line'>mkdir -p <span class="nb">source</span>/_posts
</span><span class='line'>mkdir -p public
</span></code></pre></td></tr></table></div></figure>


<p>The command will create <code>source</code> and <code>sass</code> folders. The <code>source/_posts</code> folder is where the markdown
posts will reside.</p>

<p>This is why I forked the <a href="http://octopress.org/">Octopress</a>, so that I can commit the posts as
the markdown files, if I would clone it, I should have the write access to <a href="http://octopress.org/">Octopress</a>,
to commit, this way I have my forked version and still I can always pull changes from
upsteramed original <a href="http://octopress.org/">Octopress</a>, but more of this in separate post.</p>

<h3>Creating first post</h3>

<p>Create post with <code>new_post['post name here']</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake new_post<span class="o">[</span><span class="s1">&#39;Deploying Octopress to Github Pages and setting custom subdomain CNAME&#39;</span><span class="o">]</span>
</span><span class='line'>mkdir -p <span class="nb">source</span>/_posts
</span><span class='line'>Creating new post: <span class="nb">source</span>/_posts/2012-10-10-deploying-octopress-to-github-pages-and-setting-custom-subdomain-cname.markdown
</span></code></pre></td></tr></table></div></figure>


<p>By opening it in your favorite editor you&#8217;ll get:</p>

<figure class='code'><figcaption><span>2012-10-10-deploying-octopress-to-github-pages-and-setting-custom-subdomain-cname.markdown</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>---
</span><span class='line'>layout: post
</span><span class='line'>title: &quot;Deploying Octopress to Github Pages and setting custom subdomain CNAME&quot;
</span><span class='line'>date: 2012-10-11 01:01
</span><span class='line'>comments: true
</span><span class='line'>categories:
</span><span class='line'>---
</span></code></pre></td></tr></table></div></figure>


<p>Categories can be add in few ways, my way is one-liner:</p>

<pre><code>categories: [octopress, github, github pages]
</code></pre>

<h3>Generating the Site</h3>

<p>Add some content to your first post and then run <code>generate</code> command that generates whole site:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake generate
</span><span class='line'><span class="c">## Generating Site with Jekyll</span>
</span><span class='line'>directory <span class="nb">source</span>/stylesheets/
</span><span class='line'>   create <span class="nb">source</span>/stylesheets/screen.css
</span><span class='line'>Configuration from /Users/xajler/src/octopress-orig/_config.yml
</span><span class='line'>Building site: <span class="nb">source</span> -&gt; public
</span><span class='line'>Successfully generated site: <span class="nb">source</span> -&gt; public
</span></code></pre></td></tr></table></div></figure>


<h3>Preview Site</h3>

<p>To locally preview generated Site use:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake preview
</span><span class='line'>Starting to watch <span class="nb">source </span>with Jekyll and Compass. Starting Rack on port 4000
</span><span class='line'><span class="o">[</span>2012-10-11 01:16:08<span class="o">]</span> INFO  WEBrick 1.3.1
</span><span class='line'><span class="o">[</span>2012-10-11 01:16:08<span class="o">]</span> INFO  ruby 1.9.3 <span class="o">(</span>2012-04-20<span class="o">)</span> <span class="o">[</span>x86_64-darwin12.0.0<span class="o">]</span>
</span><span class='line'><span class="o">[</span>2012-10-11 01:16:08<span class="o">]</span> INFO  WEBrick::HTTPServer#start: <span class="nv">pid</span><span class="o">=</span>62929 <span class="nv">port</span><span class="o">=</span>4000
</span><span class='line'>Configuration from /Users/xajler/src/octopress-orig/_config.yml
</span><span class='line'>
</span><span class='line'>...
</span></code></pre></td></tr></table></div></figure>


<p>Then in browser navigate to:</p>

<pre><code>http://localhost:4000/
</code></pre>

<p>The beauty of the <code>preview</code> is that <em>Auto-regenerating</em> is enabled by default.
Meaning every save of blog post file will trigger <code>generate</code> command making it as live preview.</p>

<h3>Configuring the Octopress</h3>

<p>The <a href="http://octopress.org/">Octopress</a> configuration is in the root <code>_config.yml</code> file.</p>

<p>There you can change <code>url</code>, <code>title</code>, <code>subtitle</code>, <code>permalink</code>, <code>twitter account</code>, <code>github account</code>,
and set site comments via <a href="http://disqus.com/">disqus</a> by providing <code>disqus_short_name</code>.</p>

<h2>Deployment</h2>

<p><a href="http://octopress.org/">Octopress</a> supports <a href="http://heroku.com">Heroku</a>, rsync and
<a href="http://pages.github.com">Github Pages</a> deployment.
I chose the <a href="http://pages.github.com">Github Pages</a> because
<a href="http://www.github.com">Github</a> provide the CNAME changes, so the site can be on your desired domain.</p>

<h3>Github Pages setup</h3>

<p>There are two ways of having pages on the <a href="http://www.github.com">Github</a>.</p>

<p>The User/Organization pages <code>http://username.github.com</code> and project pages <code>gh-pages</code>.</p>

<p>The my way was the User/Organization pages.</p>

<h4>Setting up the repository on Github</h4>

<p>Create new repository on <a href="http://www.github.com">Github</a> and named it as your User/Organization name plus <code>.github.com</code>
in my case was <code>xajler.github.com</code>.</p>

<h4>Configure Octopress for Github Pages</h4>

<p>To prepare <a href="http://octopress.org/">Octopress</a> for deployment to <a href="http://pages.github.com">Github Pages</a>
run commannd and write <code>Repository url</code> (<code>git@github.com:xajler/xajler.github.com</code>):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake setup_github_pages
</span><span class='line'>Enter the <span class="nb">read</span>/write url <span class="k">for </span>your repository
</span><span class='line'><span class="o">(</span>For example, <span class="err">&#39;</span>git@github.com:your_username/your_username.github.com<span class="o">)</span>
</span><span class='line'>Repository url: git@github.com:xajler/xajler.github.com
</span><span class='line'>rm -rf _deploy
</span><span class='line'>mkdir _deploy
</span><span class='line'><span class="nb">cd </span>_deploy
</span><span class='line'>Initialized empty Git repository in /Users/xajler/src/octopress-orig/_deploy/.git/
</span><span class='line'><span class="o">[</span>master <span class="o">(</span>root-commit<span class="o">)</span> ac273d4<span class="o">]</span> Octopress init
</span><span class='line'> 1 file changed, 1 insertion<span class="o">(</span>+<span class="o">)</span>
</span><span class='line'> create mode 100644 index.html
</span><span class='line'><span class="nb">cd</span> -
</span><span class='line'>
</span><span class='line'>---
</span><span class='line'><span class="c">## Now you can deploy to http://xajler.github.com with `rake deploy` ##</span>
</span></code></pre></td></tr></table></div></figure>


<p>This command will change <code>git remote origin</code> from <a href="http://octopress.org/">Octopress</a> forked/cloned url to:</p>

<pre><code>git@github.com:xajler/xajler.github.com
</code></pre>

<p>And also add a <code>_deploy</code> folder, actual root of your <a href="http://pages.github.com">Github Pages</a> repository
(<code>github.com/xajler/xajler.github.com</code>).</p>

<h4>Deployment to Github Pages</h4>

<p>The final <code>rake</code> command is <code>deploy</code>. It will create commit and push to <a href="http://www.github.com">Github</a>
repo and you&#8217;ll get notification to your mail.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>rake deploy
</span><span class='line'><span class="c">## Deploying branch to Github Pages</span>
</span><span class='line'>rm -rf _deploy/index.html
</span><span class='line'>
</span><span class='line'><span class="c">## copying public to _deploy</span>
</span><span class='line'>cp -r public/. _deploy
</span><span class='line'><span class="nb">cd </span>_deploy
</span><span class='line'>
</span><span class='line'><span class="c">## Commiting: Site updated at 2012-10-11 00:14:34 UTC</span>
</span><span class='line'>...
</span></code></pre></td></tr></table></div></figure>


<p>After deployment in your mail box will be a notification:</p>

<pre><code>[xajler.github.com] Page build successful

Your page has been built. If this is the first time you've pushed, it may take a few minutes to appear, otherwise your changes should appear immediately.
</code></pre>

<p>And if you navigate to <code>http://xajler.github.com</code> (change xajler to your User/Organization name)
you&#8217;ll see the post and site online!</p>

<h2>The custom domain via CNAME</h2>

<p>The <code>http://xajler.github.com</code> is not really the URL that you&#8217;ll want to have for the blog.
<a href="http://www.github.com">Github</a> provides the way to customize the domain name.</p>

<h3>Setting custom domain name</h3>

<p>To setup the custom domain name that will point to your Github pages, there is need to
create the <code>CNAME</code> file in <code>source</code> folder. This <code>CNAME</code> will be copied to <code>_deploy</code> folder
when executing <code>rake deploy</code> and will be used by <a href="http://www.github.com">Github</a> to point to the provided domain.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>vim <span class="nb">source</span>/CNAME
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;ve added my subdomain for my domain <a href="http://metaintellect.com">metaintellect</a>.</p>

<pre><code>blog.metaintellect.com
</code></pre>

<p>Deploy with <code>rake deploy</code> and it should now be pushed and visible in your
<a href="http://www.github.com">Github</a> repo (<code>xajler.github.com</code>).</p>

<h2>Setting DNS for subdomain</h2>

<p>The DNS nameservers for my domain <a href="http://metaintellect.com">metaintellect</a> are declared on
<a href="http://dynadot.com">dynadot</a>.</p>

<p>Here is my configuration to make the <code>blog.metaintellect.com</code> CNAME work with <a href="http://pages.github.com">Github Pages</a>:</p>

<p><img src="https://pbs.twimg.com/media/A44tgDACAAAsDwn.png:large"></p>

<h2>Conclusion</h2>

<p>I hope that I will now blog my notes about so many tehnical IT stuff I do everyday, and
now with markdown and the <a href="http://www.github.com">Github</a> it is fairly easy and fun!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backing up PostgreSQL with backup and whatever gems on VPS]]></title>
    <link href="http://learnaholic.me/2012/10/10/backing-up-postgresql-with-backup-and-whatever-gems/"/>
    <updated>2012-10-10T07:12:00+02:00</updated>
    <id>http://learnaholic.me/2012/10/10/backing-up-postgresql-with-backup-and-whatever-gems</id>
    <content type="html"><![CDATA[<h2>Mission</h2>

<p>A few months ago I&#8217;ve created a <a href="https://github.com/xajler/mi-guest">simple Rails app</a> (after 6 years!!!)
that essentially stores guests and keeping track of accommodations for my friend&#8217;s villa.</p>

<p>After a month in production I&#8217;ve started thinking about backup of the database. Code is on
the <a href="http://github.com">Github</a> so I have only need to worry about database.</p>

<p>My first initial thoughts were on <a href="http://dropbox.com">Dropbox</a>, I&#8217;ve installed the <a href="http://dropbox.com">Dropbox</a> client on my no GUI
Ubuntu Server, but when I ran the <a href="http://dropbox.com">Dropbox</a> the memory usage got doubled and I remove it all together!</p>

<p>Then I started thinking about good old FTP backup, I was sure that I want backup somewhere else
than the VPS where the database is running. I have one  account at <a href="http://arvixe.com">Arvixe</a>, Unlimited Linux hosting
and I&#8217;ve created the FTP user and even found this <a href="https://github.com/meskyanichi/backup">backup gem</a> back then
but I just drop all together until today.</p>

<p>I have VPS at <a href="http://buyvm.net">BuyVM (ex Frantech)</a> and they are offering a free storage
VPS of 5Gb which is more than enough for my backup. I signed for an account and idea came again to use
it as backup&#8230;</p>

<p>&#8230;and the idea expanded to include every day schedule of backup.</p>

<p>Incidentally, to day I finally get started my <a href="http://octopress.org">Octopress</a> blog
deployed via <a href="http://pages.github.com">Github Pages</a>, so I&#8217;m
writting all the steps as notes for futre usage, or if someone can be useful&#8230;</p>

<h2>backup Gem</h2>

<p>The <a href="https://github.com/meskyanichi/backup">backup gem</a> is one great gem with a lot of
backup options like databases, storages, compressions, encrypt-ors,&#8230;</p>

<h3>Install</h3>

<p>Installation is a straight forward like any Ruby Gem:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>gem install backup
</span></code></pre></td></tr></table></div></figure>


<h3>Backup Model Generator</h3>

<p>backup gem have its own backup &#8220;model&#8221; generator that creates backup config files, this is a comprehensive usage:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Usage:
</span><span class='line'>  backup generate:model --trigger<span class="o">=</span>TRIGGER
</span><span class='line'>
</span><span class='line'>Options:
</span><span class='line'>  --trigger<span class="o">=</span>TRIGGER
</span><span class='line'>  <span class="o">[</span>--config-path<span class="o">=</span>CONFIG_PATH<span class="o">]</span>  <span class="c"># Path to your Backup configuration directory</span>
</span><span class='line'>  <span class="o">[</span>--databases<span class="o">=</span>DATABASES<span class="o">]</span>      <span class="c"># (mongodb, mysql, postgresql, redis, riak)</span>
</span><span class='line'>  <span class="o">[</span>--storages<span class="o">=</span>STORAGES<span class="o">]</span>        <span class="c"># (cloudfiles, dropbox, ftp, local, ninefold, rsync, s3, scp, sftp)</span>
</span><span class='line'>  <span class="o">[</span>--syncers<span class="o">=</span>SYNCERS<span class="o">]</span>          <span class="c"># (cloud_files, rsync_local, rsync_pull, rsync_push, s3)</span>
</span><span class='line'>  <span class="o">[</span>--encryptors<span class="o">=</span>ENCRYPTORS<span class="o">]</span>    <span class="c"># (gpg, openssl)</span>
</span><span class='line'>  <span class="o">[</span>--compressors<span class="o">=</span>COMPRESSORS<span class="o">]</span>  <span class="c"># (bzip2, gzip, lzma, pbzip2)</span>
</span><span class='line'>  <span class="o">[</span>--notifiers<span class="o">=</span>NOTIFIERS<span class="o">]</span>      <span class="c"># (campfire, hipchat, mail, presently, prowl, twitter)</span>
</span><span class='line'>  <span class="o">[</span>--archives<span class="o">]</span>
</span><span class='line'>  <span class="o">[</span>--splitter<span class="o">]</span>                 <span class="c"># use `--no-splitter` to disable</span>
</span><span class='line'>                              <span class="c"># Default: true</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Generate a Backup model file</h3>

<p>Let&#8217;s create simple config file with backup generator:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>backup generate:model --trigger miguest_backup --databases<span class="o">=</span><span class="s2">&quot;postgresql&quot;</span> <span class="se">\</span>
</span><span class='line'>  --storages<span class="o">=</span><span class="s2">&quot;ftp&quot;</span> --compressors<span class="o">=</span><span class="s2">&quot;bzip2&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will create a <code>config.rb</code> and <code>models/miguest_backup.rb</code> files in <code>~/Backup</code> folder.</p>

<h3>Refine backup Configuration</h3>

<p>Backup generator will create boilerplate model template needing more refinement. It looks something like this:</p>

<figure class='code'><figcaption><span>Boilerplate backup model template - miguest_backup.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># encoding: utf-8</span>
</span><span class='line'>
</span><span class='line'><span class="c1">##</span>
</span><span class='line'><span class="c1"># Backup Generated: miguest_backup</span>
</span><span class='line'><span class="c1"># Once configured, you can run the backup with the following command:</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1"># $ backup perform -t miguest_backup [-c &lt;path_to_configuration_file&gt;]</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="no">Backup</span><span class="o">::</span><span class="no">Model</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">:miguest_backup</span><span class="p">,</span> <span class="s1">&#39;Description for miguest_backup&#39;</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>  <span class="c1">##</span>
</span><span class='line'>  <span class="c1"># Split [Splitter]</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1"># Split the backup file in to chunks of 250 megabytes</span>
</span><span class='line'>  <span class="c1"># if the backup file size exceeds 250 megabytes</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="n">split_into_chunks_of</span> <span class="mi">250</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">##</span>
</span><span class='line'>  <span class="c1"># PostgreSQL [Database]</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="n">database</span> <span class="no">PostgreSQL</span> <span class="k">do</span> <span class="o">|</span><span class="n">db</span><span class="o">|</span>
</span><span class='line'>    <span class="n">db</span><span class="o">.</span><span class="n">name</span>               <span class="o">=</span> <span class="s2">&quot;my_database_name&quot;</span>
</span><span class='line'>    <span class="n">db</span><span class="o">.</span><span class="n">username</span>           <span class="o">=</span> <span class="s2">&quot;my_username&quot;</span>
</span><span class='line'>    <span class="n">db</span><span class="o">.</span><span class="n">password</span>           <span class="o">=</span> <span class="s2">&quot;my_password&quot;</span>
</span><span class='line'>    <span class="n">db</span><span class="o">.</span><span class="n">host</span>               <span class="o">=</span> <span class="s2">&quot;localhost&quot;</span>
</span><span class='line'>    <span class="n">db</span><span class="o">.</span><span class="n">port</span>               <span class="o">=</span> <span class="mi">5432</span>
</span><span class='line'>    <span class="c1"># db.socket             = &quot;/tmp/pg.sock&quot;</span>
</span><span class='line'>    <span class="c1"># db.additional_options = [&quot;-xc&quot;, &quot;-E=utf8&quot;]</span>
</span><span class='line'>    <span class="c1"># Optional: Use to set the location of this utility</span>
</span><span class='line'>    <span class="c1">#   if it cannot be found by name in your $PATH</span>
</span><span class='line'>    <span class="c1"># db.pg_dump_utility = &quot;/opt/local/bin/pg_dump&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">##</span>
</span><span class='line'>  <span class="c1"># FTP (File Transfer Protocol) [Storage]</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="n">store_with</span> <span class="no">FTP</span> <span class="k">do</span> <span class="o">|</span><span class="n">server</span><span class="o">|</span>
</span><span class='line'>    <span class="n">server</span><span class="o">.</span><span class="n">username</span>     <span class="o">=</span> <span class="s2">&quot;my_username&quot;</span>
</span><span class='line'>    <span class="n">server</span><span class="o">.</span><span class="n">password</span>     <span class="o">=</span> <span class="s2">&quot;my_password&quot;</span>
</span><span class='line'>    <span class="n">server</span><span class="o">.</span><span class="n">ip</span>           <span class="o">=</span> <span class="s2">&quot;1.2.3.4&quot;</span>
</span><span class='line'>    <span class="n">server</span><span class="o">.</span><span class="n">port</span>         <span class="o">=</span> <span class="mi">21</span>
</span><span class='line'>    <span class="n">server</span><span class="o">.</span><span class="n">path</span>         <span class="o">=</span> <span class="s2">&quot;~/backups/&quot;</span>
</span><span class='line'>    <span class="n">server</span><span class="o">.</span><span class="n">keep</span>         <span class="o">=</span> <span class="mi">5</span>
</span><span class='line'>    <span class="n">server</span><span class="o">.</span><span class="n">passive_mode</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">##</span>
</span><span class='line'>  <span class="c1"># Bzip2 [Compressor]</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="n">compress_with</span> <span class="no">Bzip2</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Fairly straight forward refinements are needed, usernames, passwords,&#8230; After adding all
the secret stuff, the backup can be run as easy as:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>backup perform --trigger miguest_backup
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:26<span class="o">][</span>message<span class="o">]</span> Performing Backup <span class="k">for</span> <span class="s1">&#39;Description for miguest_backup (miguest_backup)&#39;</span>!
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:26<span class="o">][</span>message<span class="o">]</span> <span class="o">[</span> backup 3.0.25 : ruby 1.9.3p194 <span class="o">(</span>2012-04-20 revision 35410<span class="o">)</span> <span class="o">[</span>x86_64-linux<span class="o">]</span> <span class="o">]</span>
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:26<span class="o">][</span>message<span class="o">]</span> Database::PostgreSQL started dumping and archiving <span class="s1">&#39;miguest&#39;</span>.
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:26<span class="o">][</span>message<span class="o">]</span> Using Compressor::Bzip2 <span class="k">for </span>compression.
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:26<span class="o">][</span>message<span class="o">]</span>   Command: <span class="s1">&#39;/bin/bzip2&#39;</span>
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:26<span class="o">][</span>message<span class="o">]</span>   Ext: <span class="s1">&#39;.bz2&#39;</span>
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:28<span class="o">][</span>message<span class="o">]</span> Database::PostgreSQL Complete!
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:28<span class="o">][</span>message<span class="o">]</span> Packaging the backup files...
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:28<span class="o">][</span>message<span class="o">]</span> Splitter configured with a chunk size of 250MB.
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:28<span class="o">][</span>message<span class="o">]</span> Packaging Complete!
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:28<span class="o">][</span>message<span class="o">]</span> Cleaning up the temporary files...
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:29<span class="o">][</span>message<span class="o">]</span> Storage::FTP started transferring <span class="s1">&#39;2012.10.10.12.21.26.miguest_backup.tar&#39;</span> to <span class="s1">&#39;ftp.services.buyvm.net&#39;</span>.
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:29<span class="o">][</span>message<span class="o">]</span> Storage::FTP: Cycling Started...
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:29<span class="o">][</span>message<span class="o">]</span> Storage::FTP: Cycling Complete!
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:29<span class="o">][</span>message<span class="o">]</span> Cleaning up the package files...
</span><span class='line'><span class="o">[</span>2012/10/10 12:21:29<span class="o">][</span>warning<span class="o">]</span> Backup <span class="k">for</span> <span class="s1">&#39;Description for miguest_backup (miguest_backup)&#39;</span> Completed Successfully <span class="o">(</span>with Warnings<span class="o">)</span> in 00:00:03
</span></code></pre></td></tr></table></div></figure>


<p>And after the connecting to the storage server via FTP, there is backup:</p>

<p><img src="https://pbs.twimg.com/media/A44syBuCEAELa98.png:large"></p>

<h3>But there is more to backup gem</h3>

<p>Really, what I&#8217;m using for backup is just minimal what backup gem can offer, here is detailed
impressive list of backup features:</p>

<h4>Databases</h4>

<p>MySQL, PostgreSQL, MongoDB, Redis, Riak</p>

<h4>Compression</h4>

<p>bzip2, gzip, lzma, pbzip2</p>

<h4>Storages</h4>

<p>cloudfiles, Dropbox, FTP, local, ninefold, rsync, S3, scp, SFTP</p>

<h4>Notifiers</h4>

<p>campfire, hipchat, mail, presently, prowl, twitter</p>

<h4>Encryption</h4>

<p>GPG, OpenSSL</p>

<h2>Scheduling the backups with whenever Gem</h2>

<p><a href="https://github.com/javan/whenever">Whenever</a> is a Ruby gem that provides a clear syntax for
writing and deploying cron jobs. And this is what I need to schedule the backups to run everyday.</p>

<h3>Install</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>gem install whenever
</span></code></pre></td></tr></table></div></figure>


<h3>Configure (Wheneverize)</h3>

<p>Configure the whenever, but first make sure that we are in backup folder <code>~/Backup</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span><span class="nb">cd</span> ~/Backup
</span></code></pre></td></tr></table></div></figure>


<p>Then create config folder:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>mkdir config
</span></code></pre></td></tr></table></div></figure>


<p>And then run the command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>wheneverize .
</span><span class='line'>~ <span class="o">[</span>add<span class="o">]</span> writing <span class="s1">&#39;./config/schedule.rb&#39;</span>
</span><span class='line'>~ <span class="o">[</span><span class="k">done</span><span class="o">]</span> wheneverized!
</span></code></pre></td></tr></table></div></figure>


<p>Open the <code>config/schedule.rb</code> file and add the following:</p>

<figure class='code'><figcaption><span>whenever schedule config - config/schedule.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">every</span> <span class="mi">1</span><span class="o">.</span><span class="n">day</span><span class="p">,</span> <span class="ss">:at</span> <span class="o">=&gt;</span> <span class="s1">&#39;4:30 am&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">command</span> <span class="s2">&quot;backup perform --trigger miguest_backup&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Schedule to crontab</h3>

<p>Run <code>whenever</code> with no arguments see the <code>crontab</code> entry this will create:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>whenever
</span><span class='line'>30 4 * * * /bin/bash -l -c <span class="s1">&#39;backup perform --trigger miguest_backup&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c">## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.</span>
</span><span class='line'><span class="c">## [message] Run `whenever --help&#39; for more options.</span>
</span></code></pre></td></tr></table></div></figure>


<p>To write (or update) this job in your <code>crontab</code>, use:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>whenever --update-crontab
</span><span class='line'>~ <span class="o">[</span>write<span class="o">]</span> crontab file written
</span></code></pre></td></tr></table></div></figure>


<p>And that&#8217;s it, so what is included:</p>

<ul>
<li>Backup of postgres database.</li>
<li>Sending compressed backup via FTP.</li>
<li>Scheduled backup every day at 4:30 am.</li>
</ul>


<h2>Update</h2>

<p>The scheduled backups are working and here is the picture as proof!</p>

<p><img src="http://i47.tinypic.com/xndh7r.png"></p>

<p>Note that servers are not in same Time Zone hence offset of two hours. I know that one
is in Chicago, and second is in California or New York, but either way the scheduled backup
works!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing nginx in Mac OS X Mountain Lion with homebrew]]></title>
    <link href="http://learnaholic.me/2012/10/10/installing-nginx-in-mac-os-x-mountain-lion/"/>
    <updated>2012-10-10T03:45:00+02:00</updated>
    <id>http://learnaholic.me/2012/10/10/installing-nginx-in-mac-os-x-mountain-lion</id>
    <content type="html"><![CDATA[<h2>Install with brew</h2>

<p>Use <code>brew</code> to install the <code>nginx</code> with command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>brew install nginx
</span></code></pre></td></tr></table></div></figure>


<p>After install run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>sudo nginx
</span></code></pre></td></tr></table></div></figure>


<h2>Testing</h2>

<p>Test it by going to URL:</p>

<pre><code>http://localhost:8080
</code></pre>

<h2>Configuration</h2>

<p>The default place of <code>nginx.conf</code> on Mac after installing with <code>brew</code> is:</p>

<pre><code>/usr/local/etc/nginx/nginx.conf
</code></pre>

<h3>Changing the default port</h3>

<p>The nginx default port is 8080, we shall change it to 80. First stop the nginx server if it is running by:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>sudo nginx -s stop
</span></code></pre></td></tr></table></div></figure>


<p>Then open <code>nginx.conf</code> with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>vim /usr/local/etc/nginx/nginx.conf
</span></code></pre></td></tr></table></div></figure>


<p>and change the:</p>

<figure class='code'><figcaption><span>/usr/local/etc/nginx/nginx.conf</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='nginx'><span class='line'><span class="k">server</span> <span class="p">{</span>
</span><span class='line'>    <span class="kn">listen</span>       <span class="mi">8080</span><span class="p">;</span>
</span><span class='line'>    <span class="kn">server_name</span>  <span class="s">localhost</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">#access_log  logs/host.access.log  main;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span><span class='line'>        <span class="kn">root</span>   <span class="s">html</span><span class="p">;</span>
</span><span class='line'>        <span class="kn">index</span>  <span class="s">index.html</span> <span class="s">index.htm</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>to:</p>

<figure class='code'><figcaption><span>/usr/local/etc/nginx/nginx.conf</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='nginx'><span class='line'><span class="k">server</span> <span class="p">{</span>
</span><span class='line'>    <span class="kn">listen</span>       <span class="mi">80</span><span class="p">;</span>
</span><span class='line'>    <span class="kn">server_name</span>  <span class="s">localhost</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">#access_log  logs/host.access.log  main;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span><span class='line'>        <span class="kn">root</span>   <span class="s">html</span><span class="p">;</span>
</span><span class='line'>        <span class="kn">index</span>  <span class="s">index.html</span> <span class="s">index.htm</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Save configuration and start nginx by</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>sudo nginx
</span></code></pre></td></tr></table></div></figure>


<h2>Changing the path of defualt web location</h2>

<p>The nginx html folder (brew install only) is by the defult in:</p>

<pre><code>/usr/local/Cellar/nginx/1.2.3/html
</code></pre>

<p><strong>Note</strong>: change <code>1.2.3</code> to your nginx version.</p>

<p>The defualt path configuration:</p>

<figure class='code'><figcaption><span>/usr/local/etc/nginx/nginx.conf</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='nginx'><span class='line'><span class="k">server</span> <span class="p">{</span>
</span><span class='line'>    <span class="kn">listen</span>       <span class="mi">80</span><span class="p">;</span>
</span><span class='line'>    <span class="kn">server_name</span>  <span class="s">localhost</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">#access_log  logs/host.access.log  main;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span><span class='line'>        <span class="kn">root</span>   <span class="s">html</span><span class="p">;</span>
</span><span class='line'>        <span class="kn">index</span>  <span class="s">index.html</span> <span class="s">index.htm</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>To let say <code>Users/xajler/www</code>:</p>

<figure class='code'><figcaption><span>/usr/local/etc/nginx/nginx.conf</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='nginx'><span class='line'><span class="k">server</span> <span class="p">{</span>
</span><span class='line'>    <span class="kn">listen</span>       <span class="mi">80</span><span class="p">;</span>
</span><span class='line'>    <span class="kn">server_name</span>  <span class="s">localhost</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">#access_log  logs/host.access.log  main;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span><span class='line'>        <span class="kn">root</span>   <span class="s">/Users/xajler/www</span><span class="p">;</span>
</span><span class='line'>        <span class="kn">index</span>  <span class="s">index.html</span> <span class="s">index.htm</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>After change stop and start nginix server and nginx is now serving pages from your custom folder!</p>
]]></content>
  </entry>
  
</feed>
