Skip to content

Commit 2fc6087

Browse files
[Edit] Ruby: gems (#7119)
* [Edit] SQL: DATEDIFF() * Update datediff.md * [Edit] Ruby: gems * Update content/ruby/concepts/gems/gems.md * Update content/ruby/concepts/gems/gems.md * CHanges ---------
1 parent 5634f45 commit 2fc6087

File tree

1 file changed

+152
-23
lines changed

1 file changed

+152
-23
lines changed

content/ruby/concepts/gems/gems.md

Lines changed: 152 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,179 @@
11
---
22
Title: 'Gems'
3-
Description: 'Gems are open-source Ruby libraries or applications that lend extra utility to other applications.'
3+
Description: 'Packaged libraries of Ruby code that extend or modify functionality in Ruby applications'
44
Subjects:
5-
- 'Web Development'
65
- 'Computer Science'
6+
- 'Web Development'
77
Tags:
8+
- 'Dependency'
89
- 'Libraries'
10+
- 'Packages'
11+
- 'Ruby'
912
CatalogContent:
1013
- 'learn-ruby'
11-
- 'paths/front-end-engineer-career-path'
14+
- 'paths/computer-science'
1215
---
1316

14-
**Gems** are open-source Ruby libraries or applications that lend extra utility to other Ruby programs. Each gem is composed of the following:
17+
**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.
18+
19+
Ruby gems function through the RubyGems package management system, which has been 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.
20+
21+
## Use Cases of Ruby Gems
1522

16-
- The source code it was built with (including any tests).
17-
- Any documentation with metadata such as the name, version, and platform.
18-
- A `.gemspec` file holding all gem-related metadata.
23+
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.
1924

20-
Gems can be referenced, installed, and published from an online registry called [RubyGems](https://rubygems.org/).
25+
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.
2126

22-
To install gems to the local machine:
27+
## How to Install Gems
28+
29+
Installing gems uses the `gem install` command followed by the gem name:
2330

2431
```pseudo
25-
gem install name-of-gem
32+
gem install gem_name
33+
```
34+
35+
For example, to install `bundler`:
36+
37+
```ruby
38+
gem install bundler
39+
```
40+
41+
The installation automatically downloads the gem, installs dependencies, and generates documentation. Specify versions using constraints:
42+
43+
```ruby
44+
gem install rails -v 7.0.0
45+
gem install nokogiri '~> 1.13.0'
46+
```
47+
48+
Use `gem list` to view installed gems and `gem uninstall gem_name` to remove them.
49+
50+
## Popular Ruby Gems
51+
52+
Several gems have become essential tools in the Ruby ecosystem due to their reliability and widespread adoption:
53+
54+
- [**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.
55+
56+
- [**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.
57+
58+
- [**RSpec**](https://rspec.info/): A behavior-driven development framework for testing Ruby code, offering expressive syntax and powerful matchers for writing comprehensive test suites.
59+
60+
- [**Sidekiq**](https://sidekiq.org/): A high-performance background job processor that uses Redis for job storage and multithreading for concurrent job execution.
61+
62+
- [**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.
63+
64+
- [**Puma**](https://puma.io/): A Ruby web server built for speed and parallelism, commonly used in production environments for serving Rails applications.
65+
66+
## Example 1: Using the JSON Gem
67+
68+
This example demonstrates parsing and generating JSON data using the built-in `json` gem:
69+
70+
```rb
71+
require 'json'
72+
73+
# Parse JSON string into Ruby hash
74+
json_string = '{"name": "Alice", "age": 30, "city": "New York"}'
75+
user_data = JSON.parse(json_string)
76+
puts user_data["name"]
77+
78+
# Convert Ruby hash to JSON string
79+
user_hash = { name: "Bob", age: 25, hobbies: ["reading", "coding"] }
80+
json_output = JSON.generate(user_hash)
81+
puts json_output
2682
```
2783

28-
A list of previously installed gems is displayed with the following command:
84+
The output of the above code will be:
2985

3086
```shell
31-
gem list
87+
Alice
88+
{"name":"Bob","age":25,"hobbies":["reading","coding"]}
3289
```
3390

34-
Some popular Ruby gems include:
91+
This example shows how the `json` gem simplifies JSON data handling, automatically converting between Ruby objects and JSON strings.
3592

36-
- [Ruby on Rails](https://www.codecademy.com/resources/docs/ruby/ruby-on-rails) for building robust, full-stack web applications.
37-
- [Active Record](https://rubygems.org/gems/activerecord/versions/5.0.0.1) for object-relational database management in Rails.
38-
- [Pry](https://rubygems.org/gems/pry) for REPL-style inspection of programs at runtime.
39-
- [OmniAuth](https://rubygems.org/gems/omniauth) for third-party authentication in applications.
40-
- [Sinatra](https://rubygems.org/gems/sinatra) for a building relatively minimal, light websites.
93+
## Example 2: HTTP Requests with Rest-Client
4194

42-
Gems can be represented in a `Gemfile` either in general or with a specific version:
95+
This example shows making HTTP requests using the `rest-client` gem:
96+
97+
```rb
98+
require 'rest-client'
99+
require 'json'
100+
101+
# Make a GET request
102+
response = RestClient.get('https://jsonplaceholder.typicode.com/posts/1')
103+
post_data = JSON.parse(response.body)
104+
puts "Post title: #{post_data['title']}"
105+
106+
# Make a POST request with data
107+
new_post = {
108+
title: 'My New Post',
109+
body: 'This is the content of my post',
110+
userId: 1
111+
}
112+
113+
response = RestClient.post(
114+
'https://jsonplaceholder.typicode.com/posts',
115+
new_post.to_json,
116+
{ content_type: :json, accept: :json }
117+
)
118+
119+
created_post = JSON.parse(response.body)
120+
puts "Created post ID: #{created_post['id']}"
121+
```
122+
123+
The above code will result in the following output:
43124

44125
```shell
45-
source 'https://rubygems.org'
126+
Post title: sunt aut facere repellat provident occaecati excepturi optio reprehenderit
127+
Created post ID: 101
128+
```
129+
130+
The `rest-client` gem provides a simple interface for HTTP requests, handling different methods, headers, and responses automatically.
131+
132+
## Example 3: Background Jobs with Sidekiq
133+
134+
This example demonstrates setting up background job processing using the `sidekiq` gem:
135+
136+
```rb
137+
# Gemfile
138+
gem 'sidekiq'
139+
140+
# app/workers/email_worker.rb
141+
class EmailWorker
142+
include Sidekiq::Worker
46143

47-
gem 'pry'
48-
gem 'rails', '3.0.0.beta3'
49-
gem 'omniauth', '>=1.0'
144+
def perform(user_id, email_type)
145+
user = User.find(user_id)
146+
case email_type
147+
when 'welcome'
148+
UserMailer.welcome_email(user).deliver_now
149+
when 'reminder'
150+
UserMailer.reminder_email(user).deliver_now
151+
end
152+
puts "Email sent to #{user.email}"
153+
end
154+
end
155+
156+
EmailWorker.perform_async(user.id, 'welcome')
50157
```
158+
159+
`sidekiq` enables asynchronous job processing, allowing time-consuming tasks like sending emails to run in the background without blocking the main application.
160+
161+
> **Note:** To run this program, a Rails app with Redis, Sidekiq, a User model, and a mailer is required.
162+
163+
## Frequently Asked Questions
164+
165+
### 1. What's the difference between a gem and a library?
166+
167+
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.
168+
169+
### 2. Can I create private gems for my organization?
170+
171+
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.
172+
173+
### 3. Can gems contain executable commands?
174+
175+
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.
176+
177+
### 4. How do I create my own gem?
178+
179+
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.

0 commit comments

Comments
 (0)