Skip to content

[Edit] Ruby: gems #7119

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 24 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d0dd9bd
[Edit] SQL: DATEDIFF()
mamtawardhani May 21, 2025
9f5c19b
Update datediff.md
mamtawardhani May 21, 2025
c32e9f3
Merge branch 'Codecademy:main' into main
mamtawardhani May 23, 2025
4170ba2
Merge branch 'Codecademy:main' into main
mamtawardhani May 23, 2025
8325585
Merge branch 'Codecademy:main' into main
mamtawardhani May 26, 2025
8f6f8e8
Merge branch 'Codecademy:main' into main
mamtawardhani May 27, 2025
e4c54e8
Merge branch 'Codecademy:main' into main
mamtawardhani May 28, 2025
7b3b9c0
Merge branch 'Codecademy:main' into main
mamtawardhani May 29, 2025
27ecefd
Merge branch 'Codecademy:main' into main
mamtawardhani May 29, 2025
0392da4
Merge branch 'Codecademy:main' into main
mamtawardhani May 30, 2025
d550fa7
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 2, 2025
793be7d
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 3, 2025
2f03b61
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 3, 2025
25eb0ab
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 3, 2025
73e0e3b
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 4, 2025
44f4c63
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 5, 2025
545a8da
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 6, 2025
49d85cd
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 9, 2025
f488437
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 10, 2025
9b642e6
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 11, 2025
afb1cf5
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 12, 2025
dc740fb
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 13, 2025
6a579a7
Merge branch 'Codecademy:main' into main
mamtawardhani Jun 16, 2025
90c5072
[Edit] Ruby: gems
mamtawardhani Jun 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 139 additions & 25 deletions content/ruby/concepts/gems/gems.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,164 @@
---
Title: 'Gems'
Description: 'Gems are open-source Ruby libraries or applications that lend extra utility to other applications.'
Description: 'Packaged libraries of Ruby code that extend or modify functionality in Ruby applications'
Subjects:
- 'Web Development'
- 'Computer Science'
- 'Web Development'
Tags:
- 'Dependency'
- 'Libraries'
- 'Packages'
- 'Ruby'
CatalogContent:
- 'learn-ruby'
- 'paths/front-end-engineer-career-path'
- 'paths/computer-science'
---

**Gems** are open-source Ruby libraries or applications that lend extra utility to other Ruby programs. Each gem is composed of the following:
**Ruby gems** are packaged libraries of Ruby code that extend or modify functionality in Ruby applications. A gem contains Ruby code, documentation, and metadata bundled together for easy distribution and installation. Gems serve as the building blocks of the Ruby ecosystem, allowing developers to share reusable code and avoid reinventing common functionality.

Ruby gems function through the RubyGems package management system, included with Ruby since version 1.9. When installed, RubyGems downloads the packaged code, resolves dependencies, builds extensions if needed, and generates documentation. The system maintains a central repository at rubygems.org with thousands of publicly available gems.

- The source code it was built with (including any tests).
- Any documentation with metadata such as the name, version, and platform.
- A `.gemspec` file holding all gem-related metadata.
## Use Cases of Ruby Gems

Gems can be referenced, installed, and published from an online registry called [RubyGems](https://rubygems.org/).
Ruby gems accelerate development by providing pre-built solutions for common programming tasks. Web applications rely heavily on gems like `devise` for user authentication, `sidekiq` for background jobs, and `nokogiri` for HTML parsing. Gems enable rapid prototyping by offering ready-made components that integrate immediately rather than building from scratch.

To install gems to the local machine:
The gem ecosystem supports specialized development across different domains. Data processing benefits from gems like `json` for parsing data and various database adapters. Web APIs use gems such as `grape` for REST services. Testing relies on gems like `rspec` and `minitest`. Gems also facilitate integration with external services, cloud platforms, and third-party APIs.

## How to Install Gems

Installing gems uses the `gem install` command followed by the gem name:

```pseudo
gem install name-of-gem
gem install gem_name
```

For example, to install `bundler`:

```ruby
gem install bundler
```

The installation automatically downloads the gem, installs dependencies, and generates documentation. Specify versions using constraints:

```ruby
gem install rails -v 7.0.0
gem install nokogiri '~> 1.13.0'
```

Use `gem list` to view installed gems and `gem uninstall gem_name` to remove them.

## Popular Ruby Gems

Several gems have become essential tools in the Ruby ecosystem due to their reliability and widespread adoption:

- [**Bundler**](https://bundler.io/): The dependency management tool that ensures consistent gem environments across different machines and deployments. With over 2 billion downloads, Bundler reads a `Gemfile` to install exact gem versions and their dependencies.

- [**Rails**](https://rubyonrails.org/): The full-stack web application framework that includes everything needed to create database-backed web applications following the Model-View-Controller pattern.

- [**RSpec**](https://rspec.info/): A behavior-driven development framework for testing Ruby code, offering expressive syntax and powerful matchers for writing comprehensive test suites.

- [**Sidekiq**](https://sidekiq.org/): A high-performance background job processor that uses Redis for job storage and multithreading for concurrent job execution.

- [**Nokogiri**](https://nokogiri.org/index.html): An HTML, XML, SAX, and Reader parser with XPath and CSS selector support, essential for web scraping and document processing.

- [**Puma**](https://puma.io/): A Ruby web server built for speed and parallelism, commonly used in production environments for serving Rails applications.

## Example 1: Using the JSON Gem

This example demonstrates parsing and generating JSON data using the built-in `json` gem:

```ruby
require 'json'

# Parse JSON string into Ruby hash
json_string = '{"name": "Alice", "age": 30, "city": "New York"}'
user_data = JSON.parse(json_string)
puts user_data["name"] # Output: Alice

# Convert Ruby hash to JSON string
user_hash = { name: "Bob", age: 25, hobbies: ["reading", "coding"] }
json_output = JSON.generate(user_hash)
puts json_output # Output: {"name":"Bob","age":25,"hobbies":["reading","coding"]}
```

A list of previously installed gems is displayed with the following command:
This example shows how the `json` gem simplifies JSON data handling, automatically converting between Ruby objects and JSON strings.

## Example 2: HTTP Requests with Rest-Client

This example shows making HTTP requests using the `rest-client` gem:

```shell
gem list
```ruby
require 'rest-client'
require 'json'

# Make a GET request
response = RestClient.get('https://jsonplaceholder.typicode.com/posts/1')
post_data = JSON.parse(response.body)
puts "Post title: #{post_data['title']}"

# Make a POST request with data
new_post = {
title: 'My New Post',
body: 'This is the content of my post',
userId: 1
}

response = RestClient.post(
'https://jsonplaceholder.typicode.com/posts',
new_post.to_json,
{ content_type: :json, accept: :json }
)

created_post = JSON.parse(response.body)
puts "Created post ID: #{created_post['id']}"
```

Some popular Ruby gems include:
The `rest-client` gem provides a simple interface for HTTP requests, handling different methods, headers, and responses automatically.

## Example 3: Background Jobs with Sidekiq

- [Ruby on Rails](https://www.codecademy.com/resources/docs/ruby/ruby-on-rails) for building robust, full-stack web applications.
- [Active Record](https://rubygems.org/gems/activerecord/versions/5.0.0.1) for object-relational database management in Rails.
- [Pry](https://rubygems.org/gems/pry) for REPL-style inspection of programs at runtime.
- [OmniAuth](https://rubygems.org/gems/omniauth) for third-party authentication in applications.
- [Sinatra](https://rubygems.org/gems/sinatra) for a building relatively minimal, light websites.
This example demonstrates setting up background job processing using the `sidekiq` gem:

Gems can be represented in a `Gemfile` either in general or with a specific version:
```ruby
# Gemfile
gem 'sidekiq'

```shell
source 'https://rubygems.org'
# app/workers/email_worker.rb
class EmailWorker
include Sidekiq::Worker

gem 'pry'
gem 'rails', '3.0.0.beta3'
gem 'omniauth', '>=1.0'
def perform(user_id, email_type)
user = User.find(user_id)
case email_type
when 'welcome'
UserMailer.welcome_email(user).deliver_now
when 'reminder'
UserMailer.reminder_email(user).deliver_now
end
puts "Email sent to #{user.email}"
end
end

# In your application code
EmailWorker.perform_async(user.id, 'welcome')
```

Sidekiq enables asynchronous job processing, allowing time-consuming tasks like sending emails to run in the background without blocking the main application.

## Frequently Asked Questions

### 1. What's the difference between a gem and a library?

In Ruby, the terms are often used interchangeably, but technically a gem is the packaged format that contains a library along with metadata, documentation, and dependency information. A library is the actual code that provides functionality.

### 2. Can I create private gems for my organization?

Yes, you can create private gems and host them on private gem servers, in private Git repositories, or use services like Gemfury or GitHub Packages to distribute gems within your organization.

### 3. Can gems contain executable commands?

Yes, many gems include executable files that become available in your system's PATH after installation. For example, the `rails` gem provides the `rails` command, and `bundler` provides the `bundle` command.

### 4. How do I create my own gem?

You can use `bundle gem gem_name` to scaffold a new gem. RubyGems provides tools for packaging, documenting, and publishing your custom gem to rubygems.org or private repositories.