Code Monkey home page Code Monkey logo

gemsmith's Introduction

Gemsmith

Gem Version Code Climate GPA Code Climate Coverage Gemnasium Status Travis CI Status Patreon

A command line interface for smithing new Ruby gems.

Table of Contents

Features

  • Builds a gem skeleton with enhanced Bundler functionality.
  • Uses Versionaire for semantic versioning.
  • Uses Milestoner for consistent project/gem versioning.
  • Uses Tocer for README table of contents generation.
  • Supports Thor.
  • Supports Ruby on Rails.
  • Supports Pry.
  • Supports Guard.
  • Supports RSpec.
  • Supports Rubocop.
  • Supports GitHub.
  • Supports Code Climate.
  • Supports Gemnasium.
  • Supports Travis CI.
  • Supports Patreon.
  • Supports common settings and a structured layout for building new gems.
  • Supports publishing to public or private gem servers.
  • Provides commonly needed README, CHANGELOG, CONTRIBUTING, CODE OF CONDUCT, LICENSE, etc. documentation.
  • Provides the ability to view source code of any gem within your favorite editor.
  • Provides the ability to view the documentation of any gem within your default browser.

Screencasts

asciicast

Requirements

  1. A UNIX-based system.
  2. Ruby 2.3.x.
  3. RubyGems.
  4. Bundler.

Setup

For a secure install, type the following from the command line (recommended):

gem cert --add <(curl --location --silent https://www.alchemists.io/gem-public.pem)
gem install gemsmith --trust-policy MediumSecurity

NOTE: A HighSecurity trust policy would be best but MediumSecurity enables signed gem verification while allowing the installation of unsigned dependencies since they are beyond the scope of this gem.

For an insecure install, type the following (not recommended):

gem install gemsmith

You can configure common settings for future gem builds by creating the following file:

~/.gemsmithrc

...using the following settings (as a simple example):

:author:
  :name: "Joe Smith"
  :email: "[email protected]"
  :url: "https://www.example.com"
:organization:
  :name: "ExampleSoft"
  :url: "https://www.example.com"

The following defaults are used when no options are configured:

:year: <current year>
:github_user: <git config GitHub user>
:gem:
  :platform: "Gem::Platform::RUBY"
  :home_url: ""
  :license: "MIT"
  :private_key: "~/.ssh/gem-private.pem"
  :public_key: "~/.ssh/gem-public.pem"
:author:
  :name: <git config user name>
  :email: <git config user email>
  :url: ""
:organization:
  :name: ""
  :url: ""
:versions:
  :ruby: <current Ruby version>
  :rails: "4.2"
:create:
  :cli: false
  :rails: false
  :security: true
  :pry: true
  :guard: true
  :rspec: true
  :rubocop: true
  :git-hub: false
  :code_climate: true
  :gemnasium: true
  :travis: true
  :patreon: true

While Gemsmith is fully customizable, please keep in mind that these are global settings and, once set, will affect all future gem creations. Further customization is also provided via the CLI for a customizable experience per gem if necessary.

Usage

Command Line Interface (CLI)

From the command line, type: gemsmith --help

gemsmith -c, [--create=CREATE]      # Create new gem. DEPRECATED (use --generate).
gemsmith -e, [--edit]               # Edit gem settings in default editor.
gemsmith -g, [--generate=GENERATE]  # Generate new gem.
gemsmith -h, [--help=HELP]          # Show this message or get help for a command.
gemsmith -o, [--open=OPEN]          # Open a gem in default editor.
gemsmith -r, [--read=READ]          # Open a gem in default browser.
gemsmith -v, [--version]            # Show gem version.

For more gem creation options, type: gemsmith --help --generate

-c, [--cli], [--no-cli]                    # Add CLI support.
-r, [--rails], [--no-rails]                # Add Rails support.
-S, [--security], [--no-security]          # Add security support.
                                           # Default: true
-p, [--pry], [--no-pry]                    # Add Pry support.
                                           # Default: true
-g, [--guard], [--no-guard]                # Add Guard support.
                                           # Default: true
-s, [--rspec], [--no-rspec]                # Add RSpec support.
                                           # Default: true
-R, [--rubocop], [--no-rubocop]            # Add Rubocop support.
                                           # Default: true
-H, [--git-hub], [--no-git-hub]            # Add GitHub support.
-C, [--code-climate], [--no-code-climate]  # Add Code Climate support.
                                           # Default: true
-G, [--gemnasium], [--no-gemnasium]        # Add Gemnasium support.
                                           # Default: true
-t, [--travis], [--no-travis]              # Add Travis CI support.
                                           # Default: true
-P, [--patreon], [--no-patreon]            # Add Patreon support.
                                           # Default: true

Rake

Once a gem skeleton has been created, the following tasks are available (i.e. bundle exec rake -T):

rake build                 # Build example-0.1.0.gem into the pkg directory
rake clean                 # Remove any temporary products / Clean gem artifacts
rake clobber               # Remove any generated files
rake console               # Open IRB console for gem development environment
rake doc                   # Update README (table of contents)
rake install               # Build and install example-0.1.0.gem into system gems
rake install:local         # Build and install example-0.1.0.gem into system gems without network access
rake publish               # Build, tag v0.1.0 (signed), and push example-0.1.0.gem to RubyGems
rake release[remote]       # Build, tag v0.1.0 (unsigned), and push example-0.1.0.gem to RubyGems
rake rubocop               # Run RuboCop
rake rubocop:auto_correct  # Auto-correct RuboCop offenses
rake spec                  # Run RSpec code examples

Out of all Rake tasks listed above, the following are provided by Bundler and enhanced by Gemsmith:

rake build - Cleans and regenerates the README table of contents in addition to building the gem.
rake install - Inherits the `build` modifications mentioned above.
rake install:local - Inherits the `build` modifications mentioned above.
rake release - Identical to the `publish` tasks but does not securely sign the Git tag.

When building/testing your gem locally, a typical workflow is:

  1. gem uninstall <your gem name>
  2. bundle exec rake install
  3. Test your gem locally.
  4. Repeat until satisfied.

When satified with your gem, builds are green, and ready to publish, run:

bundle exec rake publish

Alternatively, you can run bundle exec rake release if you don't wish to sign your gem releases (i.e default Bundler behavior) but the added security that publish provides is strongly recommended.

Tests

To test, run:

bundle exec rake

Security

Git Signing Key

To securely sign your Git tags, install and configure GPG:

brew install gpg
gpg --gen-key

When creating your GPG key, choose these settings:

  • Key kind: RSA and RSA (default)
  • Key size: 4096
  • Key validity: 0
  • Real Name: <your name>
  • Email: <your email>
  • Passphrase: <your passphrase>

To obtain your key, run the following and take the part after the forward slash:

gpg --list-keys | grep pub

Add your key to your global Git configuration in the [user] section. Example:

[user]
  signingkey = <your GPG key>

Now, when publishing your gems with Gemsmith (i.e. bundle exec rake publish), signing of your Git tag will happen automatically. You will be prompted for the GPG Passphrase each time but that is to be expected.

Gem Certificates

To create a certificate for your gems, run the following:

cd ~/.ssh
gem cert --build [email protected]
chmod 600 gem-*.pem

The resulting *.pem key files can be referenced via the :private_key: and :public_key: keys within the ~/.gemsmithrc file.

To learn more about gem certificates, read the following:

Private Gem Servers

By default, the following Rake tasks will publish your gem to RubyGems:

rake release
rake publish

You can change this behavior by adding metadata to your gemspec that will allow the Rake tasks, mentioned above, to publish your gem to an alternate/private gem server instead. This can be done by updating your gem specification and RubyGems credentials.

Gem Specification Metadata

Add the following metadata to your gemspec:

Gem::Specification.new do |spec|
  spec.metadata = {
    "allowed_push_key" => "example_key",
    "allowed_push_host" => "https://gems.example.com"
  }
end

The gemspec metadata keys and values must be strings per the RubyGems Specification. Each key represents the following:

  • allowed_push_key: Provides a reference (look up) to the key defined the RubyGems credentials file so that sensitive credentials are not used within your gemspec.
  • allowed_push_host: Provides the URL of the private gem server to push your gem to.

Gem Credentials

With your gem specification metadata established, you are ready to publish your gem to a public or private server. If this is your first time publishing a gem and no gem credentials have been configured, you'll be prompted for them. Gem credentials are stored in the RubyGems ~/.gem/credentials file. From this point forward, future gem publishing will use your stored credentials instead. Multiple credentials can be stored in the ~/.gem/credentials file. Example:

---
:rubygems_api_key: 2a0b460650e67d9b85a60e183defa376
:example_key: "Basic dXNlcjpwYXNzd29yZA=="

Should you need to delete a credential (due to a bad login/password for example), you can open the ~/.gem/credentials in your default editor and remove the line(s) you don't need. Upon next publish of your gem, you'll be prompted for the missing credentials.

Promotion

Once your gem is released, you might want to let the world know about your accomplishment:

Versioning

Read Semantic Versioning for details. Briefly, it means:

  • Patch (x.y.Z) - Incremented for small, backwards compatible bug fixes.
  • Minor (x.Y.z) - Incremented for new, backwards compatible public API enhancements and/or bug fixes.
  • Major (X.y.z) - Incremented for any backwards incompatible public API changes.

Code of Conduct

Please note that this project is released with a CODE OF CONDUCT. By participating in this project you agree to abide by its terms.

Contributions

Read CONTRIBUTING for details.

License

Copyright (c) 2011 Alchemists. Read the LICENSE for details.

History

Read the CHANGELOG for details.

Credits

Developed by Brooke Kuhlmann at Alchemists.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.