TopHome
<2020-11-20 Fri>techscripting

Some initial learnings from Ruby scripting

While scripting stuff, to load and use a module from the CLI:

irb -r <path to rb file>

Also, out of the box, irb does not enable autocomplete and history. The fix is as easy as adding the following to .irbrc:

require 'irb/completion'
IRB.conf[:SAVE_HISTORY] = 10000

slop is a decent option parsing lib. General search online keeps leading one to OptionParser which is just way too much manual for a language as powerful as Ruby. This lib is a fine example of how a language should serve you.

To run some operation on an array concurrently, this simple formulation serves instead of reaching out specific external gems:

def Concurrently(src, &block)
  tids = src.map do |s|
    Thread.new do
        yield s
    end
  end
  tids.each do |tid|
    tid.join
  end
end

Reopening standard classes is now one of my favorite move while scripting.

To make it easier to deal with folders and files:

class String
  def /(other)
    File.join(self, other.to_s)
  end
end

This allows one to now refer to nested folders as easily as "toplevel"/dir/"output". Notice how we have mixed strings and vars easily.

Consider the following:

class Integer
  def seconds
    return self
  end
  def minutes
    return self * 60
  end
end

We can now use constructs like sleep 2.minutes and sleep 15.seconds.

When using rescue, apparently you can retry:

begin
  retries ||= 0
  # main logic here
rescue => e
  retry if (retries += 1) < 10
  raise e
end

This can easily be wrapped into a function with yield.

I use select quite frequently and have founded the related (lesser known?) function detect quite handy too. The latter is equivalent to finding a single element instead of filtering out an array.

Feeling the lack of tuples, but able to get away with just using arrays for now. This thankfully works with destructuring, so you can do things like a, b, c = [1, 1.04, "haha"].

Been using Faraday as a http client. Irrespective of what the comments say, its Connection object does not seem to be thread safe, but otherwise no other complaints.