how to make a ruby gem - austin on rails, january 2014

Post on 15-Jan-2015

945 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

How to Make a Ruby Gem

Clare Glinka

1

Who is this talk for?•Me, a few months ago

•Someone who is:

•new to Rails

•new to Ruby

•new to programming

2

What is a gem?

• Container that hold widely-reusable code.

• Code that is useable in many different contexts.

3

Tools to help with making gems:•Bundler•Jeweler•gemcutter•others!

4

Building a Gem <that generates cheesey adventure plots>

with Bundler

5

Step 0.5: $ gem install bundler

6

Step 1: $ bundle gem adventure

7

=> create adventure/Gemfile create adventure/Rakefile create adventure/LICENSE.txt create adventure/README.md create adventure/.gitignore create adventure/adventure.gemspec create adventure/lib/adventure.rb create adventure/lib/adventure/version.rbInitializing git repo in /Users/me/code/adventure

8

Gem structureadventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec└── lib ├── adventure.rb └── adventure └── version.rb

9

Step 3: Finish .gemspec

10

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec└── lib ├── adventure.rb └── adventure └── version.rb

11

adventure.gemspeclib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = %q{TODO: Write a short summary. Required.} spec.description = %q{TODO: Write a longer description. Optional.} spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

12

Required specs•name•version•summary•require_paths•files•rubygems_version

13

spec.name

14

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = %q{TODO: Write a short summary. Required.} spec.description = %q{TODO: Write a longer description. Optional.} spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

15

spec.version

16

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = %q{TODO: Write a short summary. Required.} spec.description = %q{TODO: Write a longer description. Optional.} spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

17

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec└── lib ├── adventure.rb └── adventure └── version.rb

18

module Adventure VERSION = "0.0.1"end

lib/adventure/version.rb

19

Versioning• Use semantic versioning.

• 0 . 0 . X - bugfixs

• 0 . X . 0- additional functionality that is backward compatible.

• X . 0 . 0- additional functionality that breaks backwards compatibility.

20

Version constraints• ~> 1.2

- all versions before 2 . 0

• ~> 1 . 3 . 5

- all versions before 1. 4 . 0

21

spec.summary

22

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = %q{TODO: Write a short summary. Required.} spec.description = %q{TODO: Write a longer description. Optional.} spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

23

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

24

spec.require_paths

25

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

26

Protect the load path!$ pry

[1] pry(main)> $LOAD_PATH

=> ["/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/coderay-1.1.0/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/slop-3.4.7/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/method_source-0.8.2/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/pry-0.9.12.4/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/site_ruby/2.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/site_ruby/2.0.0/x86_64-darwin13.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/site_ruby", "/rbenv/versions/2.0.0-p353/lib/ruby/vendor_ruby/2.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/vendor_ruby/2.0.0/x86_64-darwin13.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/vendor_ruby", "/rbenv/versions/2.0.0-p353/lib/ruby/2.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/x86_64-darwin13.0.0"]

27

Protect the load path![2] pry(main)> require 'adventure'=> true

[3] pry(main)> $LOAD_PATH=> ["/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/coderay-1.1.0/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/slop-3.4.7/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/method_source-0.8.2/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/pry-0.9.12.4/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/adventure-0.0.1/lib", "/rbenv/versions/2.0.0-p353/lib/ruby/site_ruby/2.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/site_ruby/2.0.0/x86_64-darwin13.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/site_ruby", "/rbenv/versions/2.0.0-p353/lib/ruby/vendor_ruby/2.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/vendor_ruby/2.0.0/x86_64-darwin13.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/vendor_ruby", "/rbenv/versions/2.0.0-p353/lib/ruby/2.0.0", "/rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/x86_64-darwin13.0.0"]

28

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec└── lib ├── adventure.rb └── adventure └── version.rb

29

spec.files

30

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

31

$ git ls-files

.gitignoreGemfileLICENSE.txtREADME.mdRakefileadventure.gemspeclib/adventure.rblib/adventure/version.rb

32

$  pry

[1]  pry(main)>  `git  ls-­‐files`=>  ".gitignore\nGemfile\nLICENSE.txt\nREADME.md\nRakefile\nadventure.gemspec\nlib/adventure.rb\nlib/adventure/version.rb\n"[2]  pry(main)>  `git  ls-­‐files`.split($\)=>  [".gitignore",  "Gemfile",  "LICENSE.txt",  "README.md",  "Rakefile",  "adventure.gemspec",  "lib/adventure.rb",  "lib/adventure/version.rb"]

33

$  pry

[1]  pry(main)>  `git  ls-­‐files`=>  ".gitignore\nGemfile\nLICENSE.txt\nREADME.md\nRakefile\nadventure.gemspec\nlib/adventure.rb\nlib/adventure/version.rb\n"[2]  pry(main)>  `git  ls-­‐files`.split($\)=>  [".gitignore",  "Gemfile",  "LICENSE.txt",  "README.md",  "Rakefile",  "adventure.gemspec",  "lib/adventure.rb",  "lib/adventure/version.rb"]

34

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "" spec.license = "MIT"

spec.files = [".gitignore", "Gemfile", "LICENSE.txt", "README.md", "Rakefile", "adventure.gemspec", "lib/adventure.rb", "lib/adventure/version.rb"] spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

35

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

36

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "" spec.license = "MIT"

spec.files = Dir.glob(‘**/*’) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

37

$  pry

[1]  pry(main)>  Dir.glob('**/**')=>  ["adventure.gemspec",  "Gemfile",  "lib",  "lib/adventure",  "lib/adventure/random.txt",  "lib/adventure/version.rb",  "lib/adventure.rb",  "LICENSE.txt",  "Rakefile",  "README.md"]

38

spec.rubygems_version

39

Other Specs:•authors•email•homepage• license•executables•test_files•add_development_dependency•add_dependency

40

spec.authorsspec.email

spec.homepage

41

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

42

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "http://www.github.com/cglinka/adventure" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

43

spec.license

44

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "http://www.github.com/cglinka/adventure" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

45

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec└── lib ├── adventure.rb └── adventure └── version.rb

46

spec.executablesspec.test_files

47

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "http://github.com/cglinka/adventure" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

48

Step 4: Write some code!

49

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec└── lib ├── adventure.rb └── adventure └── version.rb

50

require  "adventure/version"

module  Adventure    #  Your  code  goes  here...end

51

“There is a disgruntled shopkeeper with a secret past and a grad student with a knack for cooking.

They fight crime!”

Desired output:

52

require  "adventure/version"

module  Adventure    class  Plot        def  make_plot            characters  =  ["a  clever  dragon",                                          "a  ruthless  detective",                                          "a  disgruntled  shopkeeper",                                          "an  aging  cowboy",                                          "a  grad  student",                                          "a  mystical  lizard"]            with  =  ["nothing  left  to  loose",                            "a  secret  past",                              "an  enchanted  sword",                              "a  grudge",                              "a  knack  for  cooking"]            who  =  ["likes  kebabs",                            "organizes  poetry  nights",                            "is  a  world-­‐famous  cyclist",                            "lived  in  a  circus"]

           "There  is  #{characters.sample}  with  #{with.sample}  and  #{characters.sample}  who  #{who.sample}.  They  fight  crime!"        end    endend

53

Step 5: build and install the gem

54

$ gem build adventure.gemspec

WARNING: no description specified Successfully built RubyGem Name: adventure Version: 0.0.1 File: adventure-0.0.1.gem

55

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec├── adventure-0.0.1.gem└── lib ├── adventure.rb └── adventure └── version.rb

56

$ gem install adventure-0.0.1.gem

Successfully installed adventure-0.0.11 gem installed

57

$  pry

[1]  pry(main)>  require  'adventure'=>  true[2]  pry(main)>  plot  =  Adventure::Plot.new=>  #<Adventure::Plot:0x007fe2a4106498>[3]  pry(main)>  plot.make_plot=>  "There  is  a  grad  student  with  a  knack  for  cooking  and  a  ruthless  detective  who  likes  kebabs.  They  fight  crime!"

58

The easier way... Rake tasks!

59

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "http://github.com/cglinka/adventure" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

60

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec└── lib ├── adventure.rb └── adventure └── version.rb

61

source  'https://rubygems.org'

#  Specify  your  gem's  dependencies  in  adventure.gemspecgemspec

Gemfile

62

Rakefile

require  "bundler/gem_tasks"

63

$  rake  -­‐T

rake  build        #  Build  adventure-­‐0.0.1.gem  into  the  pkg  directory.rake  install    #  Build  and  install  adventure-­‐0.0.1.gem  into  system  gems.rake  release    #  Create  tag  v0.0.1  and  build  and  push  adventure-­‐0.0.1.gem  to  Rubygems

64

$  rake  build

adventure  0.0.1  built  to  pkg/adventure-­‐0.0.1.gem.

65

$  rake  install

adventure  0.0.1  built  to  pkg/adventure-­‐0.0.1.gem.adventure  (0.0.1)  installed.

66

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├──.gitignore├── adventure.gemspec├── pkg│ └── adventure-0.0.1.gem└── lib ├── adventure.rb └── adventure └── version.rb

67

Step 6: Release the gem!

68

69

$  rake  release

70

And if everything has gone terribly wrong...

$ gem yank

*** Use with caution71

No More Hardcoding!

72

adventure.json{        "characters":  [                "a  clever  dragon",                "a  ruthless  detective",                "a  disgruntled  shopkeeper",                "an  aging  cowboy",                "a  grad  student",                "a  mystical  lizard"        ],        "with":  [                "nothing  left  to  loose",                "a  secret  past",                "an  enchanted  sword",                "a  grudge",                "a  knack  for  cooking"        ],        "who":  [                "likes  kebabs",                "organizes  poetry  nights",                "is  a  world-­‐famous  cyclist",                "lived  in  a  circus"        ]}

73

spec.add_dependency

74

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "http://github.com/cglinka/adventure" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_dependency "json"

spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependency "rake"end

75

$ bundle install

Resolving dependencies...Using bundler (1.5.2)Using json (1.7.7)Using rake (0.9.6)Using adventure (0.0.1) from source at .Your bundle is complete!

76

require  "adventure/version"

module  Adventure    class  Plot        def  make_plot            characters  =  ["a  clever  dragon",                                          "a  ruthless  detective",                                          "a  disgruntled  shopkeeper",                                          "an  aging  cowboy",                                          "a  grad  student",                                          "a  mystical  lizard"]            with  =  ["nothing  left  to  loose",                            "a  secret  past",                              "an  enchanted  sword",                              "a  grudge",                              "a  knack  for  cooking"]            who  =  ["likes  kebabs",                            "organizes  poetry  nights",                            "is  a  world-­‐famous  cyclist",                            "lived  in  a  circus"]

           "There  is  #{characters.sample}  with  #{with.sample}  and  #{characters.sample}  who  #{who.sample}.  They  fight  crime!"        end    endend

77

require  "adventure/version"require  "json"

module  Adventure    class  Plot        def  make_plot(plotdevice)            plotholes  =  JSON.load(File.new(plotdevice))

           characters  =  plotholes["characters"]            with              =  plotholes["with"]            who                =  plotholes["who"]

           "There  is  #{characters.sample}  with  #{with.sample}  and  #{characters.sample}  who  #{who.sample}.  They  fight  crime!"        end    endend

lib/adventure.rb

78

$  rake  install

adventure  0.0.1  built  to  pkg/adventure-­‐0.0.1.gem.adventure  (0.0.1)  installed.

79

module Adventure VERSION = "0.0.1"end

lib/adventure/version.rb

80

module Adventure VERSION = "1.0.0"end

lib/adventure/version.rb

81

$  rake  install

adventure  1.0.0  built  to  pkg/adventure-­‐1.0.0.gem.adventure  (1.0.0)  installed.

82

$  pry

[1]  pry(main)>  require  'adventure'=>  true[2]  pry(main)>  plot  =  Adventure::Plot.new=>  #<Adventure::Plot:0x007fc079139e80>[3]  pry(main)>  plot.make_plot('adventure.json')=>  "There  is  a  clever  dragon  with  a  secret  past  and  a  clever  dragon  who  is  a  world-­‐famous  cyclist.  They  fight  crime!"

83

Set Up Testing with <RSpec>

84

# coding: utf-8lib = File.expand_path('../lib', __FILE__)$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)require 'adventure/version'

Gem::Specification.new do |spec| spec.name = "adventure" spec.version = Adventure::VERSION spec.authors = ["Clare Glinka"] spec.email = ["glinka.cb@gmail.com"] spec.summary = "Adventure plot generator" spec.description = "" spec.homepage = "http://github.com/cglinka/adventure" spec.license = "MIT"

spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"]

spec.add_dependency "json" spec.add_development_dependency "bundler", "~> 1.4" spec.add_development_dependencyependency "rake" spec.add_development_dependencyependency "rspec"end

85

$ rspec --init

create spec/spec_helper.rb create .rspec

86

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├── .gitignore├── .rspec├── adventure.gemspec├── pkg├── lib└── spec └── spec_helper.rb

87

spec/spec_helper.rb

#  This  file  was  generated  by  the  `rspec  -­‐-­‐init`  command.  Conventionally,  all#  specs  live  under  a  `spec`  directory,  which  RSpec  adds  to  the  `$LOAD_PATH`.#  Require  this  file  using  `require  "spec_helper"`  to  ensure  that  it  is  only#  loaded  once.##  See  http://rubydoc.info/gems/rspec-­‐core/RSpec/Core/ConfigurationRSpec.configure  do  |config|    config.treat_symbols_as_metadata_keys_with_true_values  =  true    config.run_all_when_everything_filtered  =  true    config.filter_run  :focus

   #  Run  specs  in  random  order  to  surface  order  dependencies.  If  you  find  an    #  order  dependency  and  want  to  debug  it,  you  can  fix  the  order  by  providing    #  the  seed,  which  is  printed  after  each  run.    #          -­‐-­‐seed  1234    config.order  =  'random'end

88

spec/spec_helper.rbrequire  'adventure'

#  This  file  was  generated  by  the  `rspec  -­‐-­‐init`  command.  Conventionally,  all#  specs  live  under  a  `spec`  directory,  which  RSpec  adds  to  the  `$LOAD_PATH`.#  Require  this  file  using  `require  "spec_helper"`  to  ensure  that  it  is  only#  loaded  once.##  See  http://rubydoc.info/gems/rspec-­‐core/RSpec/Core/ConfigurationRSpec.configure  do  |config|    config.treat_symbols_as_metadata_keys_with_true_values  =  true    config.run_all_when_everything_filtered  =  true    config.filter_run  :focus

   #  Run  specs  in  random  order  to  surface  order  dependencies.  If  you  find  an    #  order  dependency  and  want  to  debug  it,  you  can  fix  the  order  by  providing    #  the  seed,  which  is  printed  after  each  run.    #          -­‐-­‐seed  1234    config.order  =  'random'end

89

adventure├── Gemfile├── Rakefile├── LICENSE.txt├── README.md├── .gitignore├── .rspec├── adventure.gemspec├── pkg├── lib└── spec ├── spec_adventure.rb └── spec_helper.rb

90

spec/adventure_spec.rb

require  'spec_helper'

describe  Adventure::Plot  do    describe  "#make_plot"  do        it  "does  something"  do

       end    endend

91

$ bundle exec rspec

Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}.

Finished in 0.00052 seconds1 example, 0 failures

Randomized with seed 38431

92

Rakefile

require  "bundler/gem_tasks"require  "rspec/core/rake_task"

RSpec::Core::RakeTask.new('spec')

93

Rakefile

require  "bundler/gem_tasks"require  "rspec/core/rake_task"

RSpec::Core::RakeTask.new('spec')

94

$ rake spec

Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}.

Finished in 0.00052 seconds1 example, 0 failures

Randomized with seed 38431

95

96

Resources

guides.rubygems.org

link to slides @ClareGlinka_

97

top related