Ruby (Application)

From campisano.org
Jump to navigation Jump to search

Ruby

Install

Linux

# shared/opt install schema v1.5.6

#### as common user ####
# define applications vars
export SOFTWARE_PATH="/home/shared/opt/software"
export NAME="ruby"
export VERSION="2.7.2"
export URL="https://cache.ruby-lang.org/pub/ruby/2.7/ruby-${VERSION}.tar.gz"
su - -w SOFTWARE_PATH,NAME,VERSION

#### as root ####
# install packages and prepare destination path
apt-get autoremove --purge ruby\*
apt-get -q -y install wget coreutils findutils < /dev/null
apt-get -q -y install libreadline-dev libssl-dev zlib1g-dev libgdbm-dev libqdbm-dev < /dev/null
mkdir -m 777 "${SOFTWARE_PATH}/tmp_install/" "${SOFTWARE_PATH}/${NAME}_${VERSION}/"
exit

#### as common user ####
umask 0027
cd "${SOFTWARE_PATH}/tmp_install"
wget -c --no-check-certificate "${URL}"
tar -xzf "ruby-${VERSION}.tar.gz"
cd "ruby-${VERSION}"
# define compiler flags optimizations (from debian dpkg-buildflags command)
export CFLAGS="-g0 -O2 -fstack-protector-strong -Wformat -Werror=format-security -mtune=native -pipe"
export LDFLAGS="-s -Wl,-z,relro"
# configure, build and install
./configure --prefix="${SOFTWARE_PATH}/${NAME}_${VERSION}"
make -s
make install
cd
su - -w SOFTWARE_PATH,NAME,VERSION

#### as root ####
# ensure permissions to destination path
cd "${SOFTWARE_PATH}"
chown -R root:users "${NAME}_${VERSION}"
find "${NAME}_${VERSION}" -type d -exec chmod a-s,u+rwx,g+rx,g-w,o-rwx {} \;
find "${NAME}_${VERSION}" -type f -exec chmod a-s,u+rw,g+r,g-w,o-rwx {} \;
rm -rf tmp_install
ln -s -f -T "${NAME}_${VERSION}" "${NAME}"
exit

#### as common user ####
# test the application (you can put the follow in ~/.profile)
export SOFTWARE_PATH="/home/shared/opt/software"
GEM_HOME="${HOME}/.gem"
GEM_PATH="${GEM_PATH}"
PATH="${PATH}:${SOFTWARE_PATH}/ruby/bin:${GEM_HOME}/bin"
ruby --version

MacOs

Xcode

  • note: reset xcode
sudo rm -rf /Library/Developer/CommandLineTools/
xcode-select --install
  • note: you may need to setup the follow in your .profile
# from https://github.com/castwide/vscode-solargraph/issues/78#issuecomment-591008159
export SDKROOT=$(xcrun --show-sdk-path)

Homebrew

Ruby from RBenv

brew install rbenv
brew link --overwrite rbenv
rbenv install 2.6.3
rbenv global 2.6.3

configure ~/.profile

HOME_PATH="${HOME}/bin"

# homebrew
BREW_PATH="/usr/local/sbin:/usr/local/bin"

# ruby
export GEM_HOME="${HOME}/.gem"
export GEM_PATH="${GEM_HOME}"
GEM_HOME_PATH="${GEM_HOME}/bin"
export DISABLE_SPRING=1

# rbenv
OLDPATH=${PATH}
eval "$(rbenv init -)"
export PATH=${OLDPATH}
unset OLDPATH
export RBENV_SHELL=bash
RBENV_PATH="${HOME}/.rbenv/shims:${PATH}"
# ...
export PATH="${HOME_PATH}:${BREW_PATH}:${RBENV_PATH}:${GEM_HOME_PATH}:${PATH}:${NODE_PATH}"

enforce bundler 'recent' version

rm -f ~/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/specifications/default/bundler-1.17.2.gemspec
gem install bundler --default
gem list | grep bundler

Node

  • note: node is optional but plugins depend on it
brew install node

Common

Irb

  • You can configure irb behavior in the ~/.irbrc file, for instance:
cat > ~/.irbrc << 'EOF'
require 'irb/completion'

IRB.conf[:ECHO] = false
IRB.conf[:AUTO_INDENT] = true
IRB.conf[:SAVE_HISTORY] = 100000
EOF

Gems

  • You can install global useful tools using gem command, for instance:
gem install bundler
gem install rubocop rubocop-performance rubocop-rspec
gem install solargraph
gem install pry pry-doc
gem install ruby-debug-ide debase

Example

Sample script

cat > hello.rb <<EOF
class HelloWorld
  def initialize(name)
    @name = name.capitalize
  end

  def say_hi
    puts "Hello #{@name}!"
  end
end

hello = HelloWorld.new('World')
hello.say_hi
EOF
ruby hello.rb
# Hello World!

Sample project with tests using RSpec

  • prepare project structure and deps:
mkdir lib spec
cat > Gemfile << 'EOF'
# Gemfile
source 'https://rubygems.org'

gem 'rspec'
EOF
  • create project sources:
cat > main.rb << 'EOF'
#!/usr/bin/env ruby

require_relative 'lib/hello_world'

hello = HelloWorld.new('World')
puts hello.get_hi
EOF
cat > lib/hello_world.rb << 'EOF'
# This is an helloworld sample class
class HelloWorld
  def initialize(name)
    @name = name.capitalize
  end

  def get_hi
    "Hello #{@name}!"
  end
end
EOF
  • create test spec:
cat > spec/hello_world_spec.rb << 'EOF'
require 'hello_world'

describe HelloWorld do
  describe '.new' do
    it 'contains Me' do
      expect(HelloWorld.new('ME').instance_variable_get("@name")).to eql('Me')
    end
  end

  describe '.get_hi with lowercase' do
    it 'return capitalized' do
      expect(HelloWorld.new('lowercase').get_hi).to match(/Lowercase/)
    end
  end

  describe '.get_hi with UPPERCASE' do
    it 'return capitalized' do
      expect(HelloWorld.new('UPPERCASE').get_hi).to match(/Uppercase/)
    end
  end

  describe '.get_hi' do
    it 'say Hello' do
      expect(HelloWorld.new('something').get_hi).to start_with 'Hello'
    end
  end

  describe '.get_hi' do
    it 'exclame' do
      expect(HelloWorld.new('something').get_hi).to end_with '!'
    end
  end
enEOF
  • install deps and run:
bundle install
# ...
bundle exec rspec
# ...
# Finished in 0.00395 seconds (files took 0.04787 seconds to load)
# 5 examples, 0 failures
bundle exec ruby main.rb
# Hello World!