← Back to list

ruby-stdlib
by bastos
Bastos' Claude Code Ruby Plugin Marketplace
⭐ 0🍴 0📅 Jan 24, 2026
SKILL.md
name: ruby-stdlib description: This skill should be used when the user asks about "Ruby standard library", "stdlib", "FileUtils", "JSON", "CSV", "YAML", "Net::HTTP", "URI", "OpenStruct", "Struct", "Set", "Date", "Time", "Pathname", "StringIO", "Tempfile", "Logger", "OptionParser", or needs guidance on Ruby's built-in libraries. version: 1.0.0
Ruby Standard Library
Guide to Ruby's built-in standard library modules and classes.
File Operations
FileUtils
require "fileutils"
# Copy files and directories
FileUtils.cp("source.txt", "dest.txt")
FileUtils.cp_r("source_dir", "dest_dir")
# Move/rename
FileUtils.mv("old.txt", "new.txt")
# Remove
FileUtils.rm("file.txt")
FileUtils.rm_rf("directory") # Recursive, force
# Create directories
FileUtils.mkdir_p("path/to/nested/dir")
# Change permissions
FileUtils.chmod(0755, "script.sh")
FileUtils.chmod_R(0644, "directory")
# Touch (create/update timestamp)
FileUtils.touch("file.txt")
Pathname
require "pathname"
path = Pathname.new("/home/user/project/lib/file.rb")
path.dirname # => Pathname("/home/user/project/lib")
path.basename # => Pathname("file.rb")
path.extname # => ".rb"
path.basename(".rb") # => Pathname("file")
path.exist? # => true/false
path.directory? # => false
path.file? # => true
path.read # Read file contents
path.write("content") # Write to file
path.readlines # Array of lines
# Path manipulation
path.parent # => Pathname("/home/user/project/lib")
path.join("sub", "file.txt") # => Pathname(".../sub/file.txt")
path.relative_path_from(Pathname.new("/home/user"))
# => Pathname("project/lib/file.rb")
# Glob
Pathname.glob("**/*.rb").each do |file|
puts file
end
Tempfile and StringIO
require "tempfile"
require "stringio"
# Tempfile - automatically cleaned up
Tempfile.create("prefix") do |file|
file.write("data")
file.rewind
file.read # => "data"
end # File deleted after block
# Persist tempfile
tempfile = Tempfile.new(["report", ".csv"])
tempfile.path # => "/tmp/report20231205-12345.csv"
tempfile.close
# tempfile.unlink when done
# StringIO - in-memory IO
io = StringIO.new
io.puts "line 1"
io.puts "line 2"
io.string # => "line 1\nline 2\n"
io.rewind
io.readline # => "line 1\n"
# Read from string
io = StringIO.new("existing content")
io.read # => "existing content"
Data Formats
JSON
require "json"
# Parse JSON
data = JSON.parse('{"name": "Alice", "age": 30}')
data["name"] # => "Alice"
# Parse with symbol keys
data = JSON.parse('{"name": "Alice"}', symbolize_names: true)
data[:name] # => "Alice"
# Generate JSON
{ name: "Alice", scores: [95, 87, 92] }.to_json
# => '{"name":"Alice","scores":[95,87,92]}'
# Pretty print
JSON.pretty_generate({ name: "Alice", nested: { key: "value" } })
# Stream parsing for large files
File.open("large.json") do |file|
JSON.parse(file)
end
CSV
require "csv"
# Read CSV
CSV.foreach("data.csv", headers: true) do |row|
puts row["name"]
puts row["email"]
end
# Parse string
data = CSV.parse("name,age\nAlice,30\nBob,25", headers: true)
data.each do |row|
puts "#{row['name']} is #{row['age']}"
end
# Read all at once
rows = CSV.read("data.csv", headers: true)
# Write CSV
CSV.open("output.csv", "w") do |csv|
csv << ["name", "email"]
csv << ["Alice", "alice@example.com"]
csv << ["Bob", "bob@example.com"]
end
# Generate CSV string
csv_string = CSV.generate do |csv|
csv << ["header1", "header2"]
csv << ["value1", "value2"]
end
# With options
CSV.foreach("data.csv",
headers: true,
header_converters: :symbol,
converters: :numeric
) do |row|
row[:age] # Numeric, symbol key
end
YAML
require "yaml"
# Parse YAML
config = YAML.load_file("config.yml")
# Parse string
data = YAML.safe_load(<<~YAML)
database:
host: localhost
port: 5432
features:
- auth
- api
YAML
# Generate YAML
{ name: "Alice", tags: %w[ruby rails] }.to_yaml
# Safe loading (recommended)
YAML.safe_load(yaml_string, permitted_classes: [Date, Time])
# With aliases
YAML.safe_load(yaml_string, aliases: true)
Networking
Net::HTTP
require "net/http"
require "uri"
require "json"
# Simple GET
uri = URI("https://api.example.com/users")
response = Net::HTTP.get_response(uri)
response.body
# GET with headers
uri = URI("https://api.example.com/users")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer token"
request["Accept"] = "application/json"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
# POST with JSON body
uri = URI("https://api.example.com/users")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.path)
request["Content-Type"] = "application/json"
request.body = { name: "Alice", email: "alice@example.com" }.to_json
response = http.request(request)
case response
when Net::HTTPSuccess
JSON.parse(response.body)
when Net::HTTPRedirection
# Handle redirect
when Net::HTTPClientError
raise "Client error: #{response.code}"
when Net::HTTPServerError
raise "Server error: #{response.code}"
end
# With timeout
http = Net::HTTP.new(uri.host, uri.port)
http.open_timeout = 5
http.read_timeout = 10
URI
require "uri"
uri = URI("https://user:pass@example.com:8080/path?query=value#fragment")
uri.scheme # => "https"
uri.userinfo # => "user:pass"
uri.host # => "example.com"
uri.port # => 8080
uri.path # => "/path"
uri.query # => "query=value"
uri.fragment # => "fragment"
# Build URI
uri = URI::HTTPS.build(
host: "api.example.com",
path: "/v1/users",
query: URI.encode_www_form(page: 1, limit: 10)
)
# => "https://api.example.com/v1/users?page=1&limit=10"
# Parse query string
URI.decode_www_form("name=Alice&age=30")
# => [["name", "Alice"], ["age", "30"]]
URI.decode_www_form("name=Alice&age=30").to_h
# => {"name"=>"Alice", "age"=>"30"}
Data Structures
Struct
# Define a simple class
Person = Struct.new(:name, :age, keyword_init: true) do
def adult?
age >= 18
end
end
person = Person.new(name: "Alice", age: 30)
person.name # => "Alice"
person.adult? # => true
person.to_h # => {name: "Alice", age: 30}
# With positional args
Point = Struct.new(:x, :y)
point = Point.new(10, 20)
OpenStruct
require "ostruct"
# Dynamic attributes
person = OpenStruct.new(name: "Alice", age: 30)
person.name # => "Alice"
person.email = "alice@example.com" # Add new attribute
person.email # => "alice@example.com"
person.to_h # => {name: "Alice", age: 30, email: "..."}
# From hash
data = { host: "localhost", port: 3000 }
config = OpenStruct.new(data)
config.host # => "localhost"
Set
require "set"
set = Set.new([1, 2, 3])
set.add(4)
set.add(2) # No duplicate
set.to_a # => [1, 2, 3, 4]
set.include?(2) # => true
set.member?(5) # => false
# Set operations
a = Set[1, 2, 3]
b = Set[2, 3, 4]
a | b # Union: Set[1, 2, 3, 4]
a & b # Intersection: Set[2, 3]
a - b # Difference: Set[1]
a ^ b # Symmetric difference: Set[1, 4]
a.subset?(b) # => false
a.superset?(b) # => false
# SortedSet (requires 'sorted_set' gem in Ruby 3+)
Date and Time
Date
require "date"
today = Date.today
date = Date.new(2024, 12, 25)
date = Date.parse("2024-12-25")
date = Date.strptime("25/12/2024", "%d/%m/%Y")
date.year # => 2024
date.month # => 12
date.day # => 25
date.wday # => 3 (Wednesday)
date.monday? # => false
date + 7 # 7 days later
date >> 1 # 1 month later
date << 1 # 1 month earlier
date.next_month
date.prev_year
date.strftime("%Y-%m-%d") # => "2024-12-25"
date.strftime("%B %d, %Y") # => "December 25, 2024"
# Ranges
(Date.today..Date.today + 7).each { |d| puts d }
Time
now = Time.now
utc = Time.now.utc
time = Time.new(2024, 12, 25, 10, 30, 0)
time = Time.parse("2024-12-25 10:30:00") # requires 'time'
time.hour # => 10
time.min # => 30
time.sec # => 0
time.zone # => "EST" or similar
time.utc? # => false
time + 3600 # 1 hour later
time - 86400 # 1 day earlier
time.to_i # Unix timestamp
Time.at(1703505000) # From timestamp
time.strftime("%Y-%m-%d %H:%M:%S")
time.iso8601 # => "2024-12-25T10:30:00-05:00"
Logging
Logger
require "logger"
# Basic usage
logger = Logger.new($stdout)
logger = Logger.new("application.log")
logger = Logger.new("app.log", "daily") # Daily rotation
logger.level = Logger::INFO
logger.debug("Debug message")
logger.info("Info message")
logger.warn("Warning message")
logger.error("Error message")
logger.fatal("Fatal message")
# With block (only evaluated if level matches)
logger.debug { "Expensive debug: #{expensive_computation}" }
# Custom formatter
logger.formatter = proc do |severity, datetime, progname, msg|
"[#{datetime.strftime('%Y-%m-%d %H:%M:%S')}] #{severity}: #{msg}\n"
end
# Tagged logging
logger.info("Processing") { "order_id=123" }
CLI Parsing
OptionParser
require "optparse"
options = { verbose: false, output: "result.txt" }
OptionParser.new do |opts|
opts.banner = "Usage: script.rb [options]"
opts.on("-v", "--verbose", "Enable verbose output") do
options[:verbose] = true
end
opts.on("-o", "--output FILE", "Output file") do |file|
options[:output] = file
end
opts.on("-n", "--count NUM", Integer, "Number of items") do |n|
options[:count] = n
end
opts.on("-t", "--type TYPE", %w[json xml csv], "Output type") do |type|
options[:type] = type
end
opts.on("-h", "--help", "Show help") do
puts opts
exit
end
end.parse!
# Remaining args in ARGV
files = ARGV
Score
Total Score
65/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
✓LICENSE
ライセンスが設定されている
+10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
✓最近の活動
1ヶ月以内に更新
+10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
✓タグ
1つ以上のタグが設定されている
+5
Reviews
💬
Reviews coming soon
