Project

railwaymen

0.0
No commit activity in last 3 years
No release in over 3 years
This gem was created for presentation purposes.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

~> 1.16
~> 10.0
~> 3.0
 Project Readme
  1. Starting Up
  2. Folder Structure
  3. Gem Specification
  4. Configuration
  5. Generators (Rails)
  6. Modules & Errors
  7. Publishing

1. Starting Up

gem install bundler
bundle gem railwaymen

cd railwaymen
git commit -m "Initial commit"
git remote add origin https://github.com/krzysztofbuszewicz-railwaymen/railwaymen.git
git push -u origin master

(using bundler 1.16.1) 3 questions: specs (chosen rspec), license, coc.

2. Folder Structure

.
├── .git                     # git repository
├── bin
│   ├── console              # console loader with dependencies
│   └── setup                # automated setup script
├── Gemfile                  # dependencies management
├── .gitignore               # initially configured .gitignore
├── lib
│   ├── railwaymen           # main folder for gem's classes etc.
│   │   └── version.rb       # gem versioning file
│   └── railwaymen.rb        # maing gem's file required when gem loaded
├── LICENSE.txt              # license file
├── railwaymen.gemspec       # gem and dependencies specification
├── Rakefile                 # file for rake tasks including gem tasks
├── README.md                # readme for describing gem
├── .rspec                   # rspec configuration
├── spec
│   ├── railwaymen_spec.rb   # maing module spec
│   └── spec_helper.rb       # rspec config
└── .travis.yml              # travis CI config

3. Gem Specification

# railwaymen.gemspec
lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "railwaymen/version"

Gem::Specification.new do |spec|
  spec.name = "railwaymen"
  spec.version = Railwaymen::VERSION
  spec.authors = ["Krzysztof Buszewicz"]
  spec.email = ["krzysztof.buszewicz@railwaymen.org"]

  spec.summary = "Example gem"
  spec.description = "This gem was created for presentation purposes."
  spec.homepage = "https://github.com/krzysztofbuszewicz-railwaymen/railwaymen"
  spec.license = "MIT"

  spec.files = `git ls-files -z`.split("\x0").reject do |f|
    f.match(%r{^(test|spec|features)/})
  end

  spec.bindir = "exe"
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.16"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "rspec", "~> 3.0"
end
bundle
git add -A
git commit -m "filled .gemspec"
git push

4. Configuration

# lib/railwaymen/configuration.rb
module Railwaymen
  class Configuration
    attr_reader :names

    def initialize
      @names = %w(Krzysztof)
    end

    def names=(names)
      raise(StandardError, 'names must be an array of strings') if !valid_names?(names)
      @names = names
    end

    private

    def valid_names?(names)
      names.is_a?(Array) && names.all? { |n| n.is_a?(String) }
    end
  end
end
# lib/railwaymen.rb
require "railwaymen/version"
require "railwaymen/configuration"

module Railwaymen
  class << self
    def configuration
      @configuration ||= Configuration.new
    end

    def configure
      yield(configuration) if block_given?
      configuration
    end
  end
end
git add -A
git commit -m "added configuration"
git push

5. Generators (Rails)

Our goal is to generate initializer in Rails projects using our gem by:

bundle exec rails g railwaymen:install
# lib/generators/railwaymen/templates/initializer.rb
Railwaymen.configure do |c|
  c.names = %w(Krzysiek Zdzisiek Misiek)
end
# lib/generators/railwaymen/install_generator.rb
require 'rails/generators'

module Railwaymen
  class InstallGenerator < ::Rails::Generators::Base
    namespace 'railwaymen:install'
    source_root File.expand_path('../templates', __FILE__)
    desc 'Generates railwaymen gem initializer.'

    def install
      template 'initializer.rb', 'config/initializers/railwaymen.rb'
    end
  end
end
git add -A
git commit -m "add install generator for Rails"
git push

6. Modules and Errors

a) Add classes and modules under lib/railwaymen directory

# lib/railwaymen/conductor.rb
module Railwaymen
  module Conductor
    def check_ticket!(ticket)
      raise Errors::MissingTicket if ticket.nil?
      "OK"
    end
  end
end

b) Create gem's own error classes under lib/railwaymen/errors and Errors namespace

# lib/railwaymen/errors/missing_ticket.rb
module Railwaymen
  module Errors
    class MissingTicket < StandardError
      def initialize
        super('Ticket is nil and it cannot be!')
      end
    end
  end
end

c) Include them in lib/railwaymen.rb

# lib/railwaymen.rb
require "railwaymen/version"
require "railwaymen/configuration"
require "railwaymen/errors/missing_ticket"
require "railwaymen/conductor"

module Railwaymen
  class << self
    def configuration
      @configuration ||= Configuration.new
    end

    def configure
      yield(configuration) if block_given?
      configuration
    end
  end
end

d) Fix & write specs

RSpec.describe Railwaymen do
  it "has a version number" do
    expect(Railwaymen::VERSION).not_to be nil
  end

  # LOL, remove this
  it "does something useful" do
    expect(false).to eq(true)
  end
end
git add -A
git commit -m "sample module, error, and fixed specs"
git push

7. Publishing

bundle exec rake release

# railwaymen 0.1.0 built to pkg/railwaymen-0.1.0.gem.
# Tagged v0.1.0.
# Pushed git commits and tags.
# rake aborted!
# Your rubygems.org credentials aren't set. Run `gem push` to set them.
gem push pkg/railwaymen-0.1.0.gem