Gems
What is a gem?
Structure
├── Gemfile
├── Gemfile.lock
├── README.md
├── lib
│ ├── padder
│ │ ├── center.rb
│ │ ├── left.rb
│ │ ├── right.rb
│ │ └── version.rb
│ └── padder.rb
├── padder.gemspec
└── spec
├── center_spec.rb
├── left_spec.rb
├── right_spec.rb
└── spec_helper.rb
lib/gem_name.rb
# lib/hot_girls_finder.rb
module HotGirlsFinder
require 'hot_girls_finder/base_importer.rb'
require 'hot_girls_finder/facebook_importer.rb'
require 'hot_girls_finder/twitter_importer.rb'
require 'hot_girls_finder/linkedin_importer.rb'
end
Examples
Capybara
module Capybara
# ...
class CapybaraError < StandardError; end
class DriverNotFoundError < CapybaraError; end
class FrozenInTime < CapybaraError; end
class ElementNotFound < CapybaraError; end
# ...
end
Rack
module Rack
# ...
GET = 'GET'.freeze
POST = 'POST'.freeze
PUT = 'PUT'.freeze
PATCH = 'PATCH'.freeze
# ...
autoload :Builder, "rack/builder"
autoload :BodyProxy, "rack/body_proxy"
autoload :Cascade, "rack/cascade"
# ...
end
The Gemspec
require "devise/version"
Gem::Specification.new do |s|
s.name = "devise"
s.version = Devise::VERSION.dup
s.platform = Gem::Platform::RUBY
s.licenses = ["MIT"]
s.summary = "Flexible authentication solution for Rails with Warden"
s.email = "contact@plataformatec.com.br"
s.homepage = "https://github.com/plataformatec/devise"
s.description = "Flexible authentication solution for Rails with Warden"
s.authors = ['José Valim', 'Carlos Antônio']
s.files = Dir["{app,config,lib}/**/*", "CHANGELOG.md", "MIT-LICENSE", "README.md"]
s.require_paths = ["lib"]
s.required_ruby_version = '>= 2.1.0'
s.add_dependency("warden", "~> 1.2.3")
s.add_dependency("orm_adapter", "~> 0.1")
s.add_dependency("bcrypt", "~> 3.0")
s.add_dependency("railties", ">= 4.1.0")
s.add_dependency("responders")
end
The version file
module Devise
VERSION = "4.6.2".freeze
end
Generators
class MyAwesomeGem::InitializerGenerator < Rails::Generators::Base
def create_initializer_file
create_file "config/initializers/awesome_gem_initializer.rb", "# Add initialization content here"
end
end
Config Block
MyGem.configure do |config|
config.api_key = 'ABC12345789'
end
module MyGem
class << self
attr_accessor :configuration
end
def self.configure
self.configuration ||= Configuration.new
yield(configuration)
end
class Configuration
attr_accessor :mailer_sender
def initialize
@mailer_sender = 'donotreply@example.com'
end
end
end
Creating a gem with Bundler
Creating .gem file
$ gem build acts_as_crazy.gemspec
WARNING: licenses is empty, but is recommended. Use a license identifier from
http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
WARNING: See http://guides.rubygems.org/specification-reference/ for help
Successfully built RubyGem
Name: acts_as_crazy
Version: 0.1.0
File: acts_as_crazy-0.1.0.gem
$
$ gem install acts_as_crazy.gem
Publish to rubygems
$ gem push acts_as_crazy-0.1.0.gem
Enter your RubyGems.org credentials.
Don't have an account yet? Create one at https://rubygems.org/sign_up
Email: youremail@example.com
Password:
Signed in.
Pushing gem to https://rubygems.org...
Successfully registered gem: acts_as_crazy (0.1.0)
$
$ gem install acts_as_crazy
Fetching acts_as_crazy-0.1.0.gem
Successfully installed acts_as_crazy-0.1.0
Parsing documentation for acts_as_crazy-0.1.0
Installing ri documentation for acts_as_crazy-0.1.0
Done installing documentation for acts_as_crazy after 0 seconds
1 gem installed
Gems
By israeldelahoz
Gems
- 264