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