Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Creating a Gem
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Jeff Felchner
March 22, 2013
Technology
1
130
Creating a Gem
Jeff Felchner
March 22, 2013
Tweet
Share
More Decks by Jeff Felchner
See All by Jeff Felchner
Rails Engines as an SOA Middle Ground
jfelchner
1
480
Advanced and Intermediate Git
jfelchner
1
85
Rails Templates
jfelchner
1
68
Other Decks in Technology
See All in Technology
広告の効果検証を題材にした因果推論の精度検証について
zozotech
PRO
0
160
クレジットカード決済基盤を支えるSRE - 厳格な監査とSRE運用の両立 (SRE Kaigi 2026)
capytan
6
2.7k
AWS Network Firewall Proxyを触ってみた
nagisa53
1
220
IaaS/SaaS管理における SREの実践 - SRE Kaigi 2026
bbqallstars
4
2k
[CV勉強会@関東 World Model 読み会] Orbis: Overcoming Challenges of Long-Horizon Prediction in Driving World Models (Mousakhan+, NeurIPS 2025)
abemii
0
120
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
1
130
Agile Leadership Summit Keynote 2026
m_seki
1
580
15 years with Rails and DDD (AI Edition)
andrzejkrzywda
0
190
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
OWASP Top 10:2025 リリースと 少しの日本語化にまつわる裏話
okdt
PRO
3
640
データ民主化のための LLM 活用状況と課題紹介(IVRy の場合)
wxyzzz
2
700
Data Hubグループ 紹介資料
sansan33
PRO
0
2.7k
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
320
Skip the Path - Find Your Career Trail
mkilby
0
54
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Chasing Engaging Ingredients in Design
codingconduct
0
110
How to train your dragon (web standard)
notwaldorf
97
6.5k
Building AI with AI
inesmontani
PRO
1
690
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
170
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.9k
Agile that works and the tools we love
rasmusluckow
331
21k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.3k
Transcript
Creating Your First Gem
What?
Does One Thing Well
Why?
Programming is hard.
Programming well is really hard.
The Problem
Naming
The First Rule
Name It Something Clever
The Second Rule
Don’t Take One Of My Names
None
615.555.1234
None
The Third Rule
Don’t Be Inappropriate
Don't name it something sexual.
Don't name it something misogynistic
Don't name it after crude words for your anatomy
F&%#
None
Why Listen To Me?
rspectacular null_and_void bangers_and_hash envision dolla_dolla_bill stipend use_the_forcible referehencible molten_core dynamo
johnny_five i_am_valid oscillator chronological greenwich get_together enwrap pinpoint chicken_soup apple_cart ruby-progressbar
Our Example
None
“Translating pig latin is fun”.to_pig_latin # => “anslating-tray ig-pay atin-lay
is-ay un-fay”
None
Creating Your Gem
Jewler
Hoe
Bundler
</disclaimer>
gem install bundler bundle gem pope_francis
create pope_francis/Gemfile create pope_francis/Rakefile create pope_francis/LICENSE.txt create pope_francis/README.md create pope_francis/.gitignore
create pope_francis/pope_francis.gemspec create pope_francis/lib/pope_francis.rb create pope_francis/lib/pope_francis/version.rb
create pope_francis/Gemfile create pope_francis/Rakefile create pope_francis/LICENSE.txt create pope_francis/README.md create pope_francis/.gitignore
create pope_francis/pope_francis.gemspec create pope_francis/lib/pope_francis.rb create pope_francis/lib/pope_francis/version.rb
Gem::Specification.new do |gem| gem.name = "pope_francis" gem.version = PopeFrancis::VERSION gem.authors
= ["Jeff Felchner"] gem.email = ["
[email protected]
"] gem.description = %q{TODO: Write a gem description} gem.summary = %q{TODO: Write a gem summary} gem.homepage = "" end
Gem::Specification.new do |gem| gem.name = "pope_francis" gem.version = PopeFrancis::VERSION gem.authors
= ["Jeff Felchner"] gem.email = ["
[email protected]
"] gem.description = %q{ig-pay atin-lay anslator-tray} gem.summary = %q{The one-stop shop for your Pig Latin needs} gem.homepage = "http://github.com/jfelchner/pope_francis" end
Releasing Your Gem
Sign Up on rubygems.org
None
Add Your Gem to Github (optional)
None
rake release
pope_francis 0.0.1 built to pkg/ pope_francis-0.0.1.gem Tagged v0.0.1 Pushed git
commits and tags Pushed pope_francis 0.0.1 to rubygems.org
None
Versioning
Use Semantic Versioning (http://semver.org)
x.y.z Major . Minor . Patch (eg 1.8.4)
Your Gem’s Version
pope_francis/lib/pope_francis/version.rb
module PopeFrancis VERSION = "0.0.1" end
arning-way! Pushing The Same Version Twice Will Fail
> gem push pkg/pope_francis-0.0.1.gem Pushing gem to https://rubygems.org... Repushing of
gem versions is not allowed. Please use `gem yank` to remove bad gem releases.
Yanking Releases
> gem install gemcutter > gem yank pope_francis -v 0.0.1
Yanking gem from RubyGems.org... Pushing gem to https://rubygems.org... Successfully yanked gem: pope_francis (0.0.1)
None
> gem install pope_francis ERROR: Could not find a valid
gem 'pope_francis' (>= 0) in any repository ERROR: Possible alternatives: francis, tolerances
README Driven Development
Waaaaaaiiiiiiiiiiiiitttttttttt a second.....
Your Public API = Your Version
Your Public API is the most important thing when developing
a gem.
None
Write the Code
Fast Forward
pope_francis/lib/pope_francis.rb
require ‘pope_francis’
require ‘pope_francis’ while english_phrase = gets do puts english_phrase.to_pig_latin end
Hacking On It
Fork the Gem
https://github.com/jfelchner/pope_francis
Rename the Gem in Your Fork
pope_francis-nash-rails
pope_francis-nash-rails-jfelchner
Using It In Another Project
gem install pope_francis-nash-rails-jfelchner
require ‘pope_francis’
require ‘pope_francis-nash-rails-jfelchner’
Exercises
Additional Options
“Translating pig latin is fun” .to_pig_latin(:hyphenate => false) # =>
“anslatingtray igpay atinlay isway unfay”
Preserve Capitalization
“Translating Pig Latin is fun”.to_pig_latin # => “Anslating-tray Ig-pay Atin-lay
is-way un-fay”
Rails App
None
Thanks! Jeff Felchner @jfelchner