Just thought I should try to write down at least one thing per day that I have learned trying to figure out some programming issue. These are intended to be small little posts that I can easily refer back to and hopefully you also find them helpful.
In ruby when you want to get a value out of a hash you can use
h.fetch('key') instead of
I ran across
.fetch while debugging this code:
and found out that it raises a
KeyError exception when it can’t find the key in a hash.
The cool thing is that the next day I was fixing a bug in some other internal program of ours and needed to display a helpful error message if the key was missing from a hash and because I took the time to understand the code I was working on the previous day I knew exactly what to do!
def hello(key) @h.fetch(key) rescue KeyError puts "Error: Could not find key" exit 1 end
So this is the 2nd day in a row now that I looked this up, so I thought I should post it here. What I want to do when I finish up working on a code change is clean up any files that I have made changes to, but that I don’t actually want to commit.
I’m in the habit of using
git add . so I don’t really want to just do
git add <file> for each file that I want to keep, I’d rather do the opposite. But what is the opposite of
git add <file>?
At first I found this answer, which does do what I want:
git stash push -m asdf <file>
which will stash each file you specify. The thing with this command though is that I have no intention of ever popping this files off of the stash and I have to specify an arbitrary name for the stash.
I much prefer this method:
git checkout -- <file>
It is simple enough I can just remember it and it discards any changes to files that I don’t want to commit. Once I’ve removed all the files I don’t want to commit I can safely run
git add . and then commit my changes.
I use silver-searcher (
ag) a lot for searching the contents of files. Because our code base consists of ruby and js files I often want to search based on file extension. This can be done like so
ag <search-term> --ruby
ag <search-term> --js
require 'xorcist' require 'xorcist/refinements' using Xorcist::Refinements a, b = 'a', 'b' a.xor(b) a.xor!(b)
Here are some blog posts about refinements that I found:
In a Gemfile I’ve always seen
require have a value of
false, but I wasn’t sure what this syntax was doing:
gem 'discourse_image_optim', require: 'image_optim'
I thought it meant that it would also install the
image_optim gem, but if you run
gem list | grep image_optim it only lists our discourse_ version:
blake@pop-os ~/code/discourse (master) $ gem list | grep image_optim discourse_image_optim (0.26.2) blake@pop-os ~/code/discourse (master) $
But, turns out, according to the docs
If a gem’s main file is different than the gem name, specify how to require it.
gem 'rack-cache', :require => 'rack/cache'
So, because we forked image_optim and didn’t rename anything we still need to call it by its original name.