Slide 1

Slide 1 text

the next step in gem hosting nick quaranto

Slide 2

Slide 2 text

gemcutter: REVENGE OF THE GEM SOURCES

Slide 3

Slide 3 text

the gemcutter saga: new moon

Slide 4

Slide 4 text

Now, this is a story all about how My gem host got flipped-turned upside down

Slide 5

Slide 5 text

5th year SE & CS major at RIT bills fan rubyist at heroku @qrush litanyagainstfear.com

Slide 6

Slide 6 text

http://next.heroku.com

Slide 7

Slide 7 text

> demo history motivation tech other features on deck

Slide 8

Slide 8 text

demo > history motivation tech other features on deck

Slide 9

Slide 9 text

january: jekyll may: railsconf august: launch? october: transition

Slide 10

Slide 10 text

gemcutter.org == gems.rubyforge.org == rubygems.org

Slide 11

Slide 11 text

demo history > motivation tech other features on deck

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

the default host project approval php

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

the new hotness forked gems hasmygembuiltyet.org

Slide 16

Slide 16 text

accessible info publisher api open source

Slide 17

Slide 17 text

demo history motivation > tech other features on deck

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

class VaultObject < AWS::S3::S3Object set_current_bucket_to "gemcutter_production" end VaultObject.store("gems/awesome-1.0.0.gem", data, options)

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

# app/metal/hostess.rb class Hostess < Sinatra::Default get "/specs.4.8.gz" do content_type('application/x-gzip') serve(current_path) end end

Slide 22

Slide 22 text

require File.join('vendor', 'bundler_gems', 'environment') require File.join('config', 'environment') use Rack::Static, :urls => ["/index.html", "/favicon.ico", "/images", "/stylesheets"], :root => "public/maintenance" use Hostess use Rack::Maintenance, :file => File.join('public', 'maintenance', 'index.html') run Sinatra::Application

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

# lib/rubygems_plugin.rb Gem::CommandManager.instance.register_command :push # lib/commands/push_command.rb class Gem::Commands::PushCommand < Gem::Command def execute send_gem end end

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

class Gemcutter def save write_gem Delayed::Job.enqueue self notify("Successfully registered gem.", 200) end def perform update_index end end

Slide 27

Slide 27 text

testing

Slide 28

Slide 28 text

shoulda factory_girl rr cucumber

Slide 29

Slide 29 text

Feature: Push Gems In order to share code with the world A rubygem developer Should be able to push gems up to Gemcutter Scenario: User pushes new gem Given I am signed up and confirmed as "[email protected]/password" And I have a gem "RGem" with version "1.2.3" And I have an api key for "[email protected]/password" When I push the gem "RGem-1.2.3.gem" with my api key And I visit the gem page for "RGem" Then I should see "RGem" And I should see "1.2.3"

Slide 30

Slide 30 text

demo history motivation tech > other features on deck

Slide 31

Slide 31 text

prerelease versions Gem::Specification.new do |s| s.name = "jekyll" s.version = "0.6.0-pre" end

Slide 32

Slide 32 text

development dependencies Gem::Specification.new do |s| s.name = "jekyll" s.add_development_dependency("shoulda", "2.10.2") end

Slide 33

Slide 33 text

linking to outside resources Gem::Specification.new do |s| s.name = "jekyll" s.links[:code] = "http://github.com/qrush/jekyll" s.links[:docs] = "http://rdoc.info/projects/qrush/jekyll" end

Slide 34

Slide 34 text

demo history motivation tech other features > on deck

Slide 35

Slide 35 text

rdoc.info + YARD

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

READMEs/search

Slide 38

Slide 38 text

gem forking: you.gemcutter.org

Slide 39

Slide 39 text

this is our gem host now let's make it awesome!

Slide 40

Slide 40 text

thanks you! thoughtbot github heroku ruby central

Slide 41

Slide 41 text

gemcutter.org github.com/qrush/gemcutter irc.freenode.net #gemcutter