Slide 1

Slide 1 text

Ruby’s
 case Statement by Tim Moore

Slide 2

Slide 2 text

Ruby’s Magical
 case Statement by Tim Moore Magical

Slide 3

Slide 3 text

There is Totally Such a Thing as Magic

Slide 4

Slide 4 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 5

Slide 5 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 6

Slide 6 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 7

Slide 7 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 8

Slide 8 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 9

Slide 9 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 10

Slide 10 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 11

Slide 11 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 12

Slide 12 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 13

Slide 13 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 14

Slide 14 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 15

Slide 15 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 16

Slide 16 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 17

Slide 17 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 18

Slide 18 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 19

Slide 19 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 20

Slide 20 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 21

Slide 21 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301 handle_redirect(http_response) when 302 handle_redirect(http_response) when 303 handle_redirect(http_response) when 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 22

Slide 22 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301, 302, 303, 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 23

Slide 23 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301, 302, 303, 307 handle_redirect(http_response) when 404 handle_not_found(http_response) else handle_unknown_error(http_response) end end

Slide 24

Slide 24 text

def handle_response(http_response) case http_response.status when 200 handle_success(http_response) when 301, 302, 303, 307 handle_redirect(http_response) when 404 handle_not_found(http_response) when 400...500 handle_client_error(http_response) when 500...600 handle_server_error(http_response) else handle_unknown_error(http_response) end end

Slide 25

Slide 25 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 26

Slide 26 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 27

Slide 27 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 28

Slide 28 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 29

Slide 29 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 30

Slide 30 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 31

Slide 31 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 32

Slide 32 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 33

Slide 33 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 34

Slide 34 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 35

Slide 35 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 36

Slide 36 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 37

Slide 37 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end irb> nickname 'Christopher' => "Chris" irb> nickname 'Abigail' => "Abby" irb> nickname 'Christina' => "Chris" irb> nickname 'Fabio' => "Fabio"

Slide 38

Slide 38 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 39

Slide 39 text

def nickname(first_name) case first_name when 'Abraham' nickname = 'Abe' when 'Abigail' nickname = 'Abby' when 'Christopher', 'Christian', 'Christina' nickname = 'Chris' # etc., etc. else nickname = first_name end nickname end

Slide 40

Slide 40 text

def nickname(first_name) nickname = case first_name when 'Abraham' 'Abe' when 'Abigail' 'Abby' when 'Christopher', 'Christian', 'Christina' 'Chris' # etc., etc. else first_name end nickname end

Slide 41

Slide 41 text

def nickname(first_name) nickname = case first_name when 'Abraham' 'Abe' when 'Abigail' 'Abby' when 'Christopher', 'Christian', 'Christina' 'Chris' # etc., etc. else first_name end nickname end

Slide 42

Slide 42 text

def nickname(first_name) case first_name when 'Abraham' 'Abe' when 'Abigail' 'Abby' when 'Christopher', 'Christian', 'Christina' 'Chris' # etc., etc. else first_name end ! end

Slide 43

Slide 43 text

class Color < Struct.new(:r,:g,:b) ! RED = Color.new( 0xFF, 0x00, 0x00 ) GREEN = Color.new( 0x00, 0xFF, 0x00 ) BLUE = Color.new( 0x00, 0x00, 0xFF ) CYAN = Color.new( 0x00, 0xFF, 0xFF ) MAGENTA = Color.new( 0xFF, 0x00, 0xFF ) YELLOW = Color.new( 0xFF, 0xFF, 0x00 ) ! end def primary?(color, mode) case color when Color::RED, Color::GREEN, Color::BLUE mode == :additive when Color::CYAN, Color::MAGENTA, Color::YELLOW mode == :subtractive else false end end

Slide 44

Slide 44 text

class Color < Struct.new(:r,:g,:b) ! RED = Color.new( 0xFF, 0x00, 0x00 ) GREEN = Color.new( 0x00, 0xFF, 0x00 ) BLUE = Color.new( 0x00, 0x00, 0xFF ) CYAN = Color.new( 0x00, 0xFF, 0xFF ) MAGENTA = Color.new( 0xFF, 0x00, 0xFF ) YELLOW = Color.new( 0xFF, 0xFF, 0x00 ) ! end def primary?(color, mode) case color when Color::RED, Color::GREEN, Color::BLUE mode == :additive when Color::CYAN, Color::MAGENTA, Color::YELLOW mode == :subtractive else false end end irb> primary? Color::RED, :additive => true irb> primary? Color::RED, :subtractive => false irb> primary? Color::CYAN, :subtractive => true irb> primary? Color.new(0,0,255), :additive => true irb> primary? Color.new(0,127,255), :additive => false

Slide 45

Slide 45 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 46

Slide 46 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 47

Slide 47 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 48

Slide 48 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 49

Slide 49 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 50

Slide 50 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 51

Slide 51 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 52

Slide 52 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 53

Slide 53 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 54

Slide 54 text

def local_search(query) case query when String specs_by_name(query) when Gem::Dependency search_by_dependency(query) when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification search_by_spec(query) else raise "You can't search for #{query}." end end

Slide 55

Slide 55 text

def want_a_beer?(beer_type) case beer_type when /^Sierra Nevada|IPA/ :yes when /V(ictoria)? ?B(itter)?/, /Bud(weiser)?/ :no else :probably end end

Slide 56

Slide 56 text

def want_a_beer?(beer_type) case beer_type when /^Sierra Nevada|IPA/ :yes when /V(ictoria)? ?B(itter)?/, /Bud(weiser)?/ :no else :probably end end

Slide 57

Slide 57 text

def want_a_beer?(beer_type) case beer_type when /^Sierra Nevada|IPA/ :yes when /V(ictoria)? ?B(itter)?/, /Bud(weiser)?/ :no else :probably end end

Slide 58

Slide 58 text

def want_a_beer?(beer_type) case beer_type when /^Sierra Nevada|IPA/ :yes when /V(ictoria)? ?B(itter)?/, /Bud(weiser)?/ :no else :probably end end

Slide 59

Slide 59 text

def want_a_beer?(beer_type) case beer_type when /^Sierra Nevada|IPA/ :yes when /V(ictoria)? ?B(itter)?/, /Bud(weiser)?/ :no else :probably end end irb> want_a_beer? 'Sierra Nevada Pale Ale' => :yes irb> want_a_beer? 'Sierra Nevada Torpedo IPA' => :yes irb> want_a_beer? 'Mountain Goat IPA' => :yes irb> want_a_beer? 'Victoria Bitter' => :no irb> want_a_beer? 'VB' => :no irb> want_a_beer? 'V Bitter' => :no irb> want_a_beer? 'Budweiser' => :no irb> want_a_beer? 'Bud' => :no irb> want_a_beer? 'Bud Light' => :no irb> want_a_beer? 'Coopers Pale Ale' => :probably irb> want_a_beer? 'Stella Artois' => :probably

Slide 60

Slide 60 text

class Color def more_blue? b > r && b > g end ! def more_red? r > b && r > g end ! def more_green? g > r && g > b end end def describe_color(color) case color when proc {|color| color.more_blue? } "blueish" when proc {|color| color.more_red? } "reddish" when proc {|color| color.more_green? } "greenish" else "pretty" end end

Slide 61

Slide 61 text

class Color def more_blue? b > r && b > g end ! def more_red? r > b && r > g end ! def more_green? g > r && g > b end end def describe_color(color) case color when proc {|color| color.more_blue? } "blueish" when proc {|color| color.more_red? } "reddish" when proc {|color| color.more_green? } "greenish" else "pretty" end end irb> describe_color Color::RED => "reddish" irb> describe_color Color::GREEN => "greenish" irb> describe_color Color.new(0xCC,0x11,0xFF) => "blueish" irb> describe_color Color::CYAN => "pretty"

Slide 62

Slide 62 text

class Color def more_blue? b > r && b > g end ! def more_red? r > b && r > g end ! def more_green? g > r && g > b end end def describe_color(color) case color when proc {|color| color.more_blue? } "blueish" when proc {|color| color.more_red? } "reddish" when proc {|color| color.more_green? } "greenish" else "pretty" end end

Slide 63

Slide 63 text

class Color def more_blue? b > r && b > g end ! def more_red? r > b && r > g end ! def more_green? g > r && g > b end end def describe_color(color) case color when :more_blue?.to_proc "blueish" when :more_red?.to_proc "reddish" when :more_green?.to_proc "greenish" else "pretty" end end

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

=== “case equality operator”

Slide 66

Slide 66 text

=== “threequals”

Slide 67

Slide 67 text

case object when case1 do_something when case2 do_another_thing else do_something_else end

Slide 68

Slide 68 text

object case1 do_something case2 do_another_thing else do_something_else end

Slide 69

Slide 69 text

! if case1 === object do_something elsif case2 === object do_another_thing else do_something_else end

Slide 70

Slide 70 text

class Range def ===(value) self.include?(value) end end

Slide 71

Slide 71 text

class Module def ===(object) object.is_a?(self) end end

Slide 72

Slide 72 text

class Regexp def ===(string) if self =~ string true else false end end end

Slide 73

Slide 73 text

class Proc def ===(object) self.call(object) end end

Slide 74

Slide 74 text

class Object def ===(other) self == other end end

Slide 75

Slide 75 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 76

Slide 76 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 77

Slide 77 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 78

Slide 78 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 79

Slide 79 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 80

Slide 80 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 81

Slide 81 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 82

Slide 82 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 83

Slide 83 text

class VersionMatcher < Struct.new(:operator, :req_version) def ===(version) case operator when "=" version == req_version when ">" version > req_version when "<" version < req_version when ">=" version >= req_version when "<=" version <= req_version else false end end end

Slide 84

Slide 84 text

class VersionMatcher < Struct.new(:operator, :req_version) def ===(version) case operator when "=" version == req_version when ">" version > req_version when "<" version < req_version when ">=" version >= req_version when "<=" version <= req_version else false end end end

Slide 85

Slide 85 text

class VersionMatcher < Struct.new(:operator, :req_version) def ===(version) case operator when "=" version == req_version when ">" version > req_version when "<" version < req_version when ">=" version >= req_version when "<=" version <= req_version else false end end end

Slide 86

Slide 86 text

class VersionMatcher < Struct.new(:operator, :req_version) def ===(version) case operator when "=" version == req_version when ">" version > req_version when "<" version < req_version when ">=" version >= req_version when "<=" version <= req_version else false end end end

Slide 87

Slide 87 text

class VersionMatcher < Struct.new(:operator, :req_version) def ===(version) case operator when "=" version == req_version when ">" version > req_version when "<" version < req_version when ">=" version >= req_version when "<=" version <= req_version else false end end end

Slide 88

Slide 88 text

class VersionMatcher::All < Struct.new(:version_matchers) ! def ===(version) version_matchers .all? {|matcher| matcher === version } end ! end

Slide 89

Slide 89 text

class VersionMatcher::All < Struct.new(:version_matchers) ! def ===(version) version_matchers .all? {|matcher| matcher === version } end ! end

Slide 90

Slide 90 text

class VersionMatcher::All < Struct.new(:version_matchers) ! def ===(version) version_matchers .all? {|matcher| matcher === version } end ! end

Slide 91

Slide 91 text

class VersionMatcher::All < Struct.new(:version_matchers) ! def ===(version) version_matchers .all? {|matcher| matcher === version } end ! end

Slide 92

Slide 92 text

class VersionMatcher::All < Struct.new(:version_matchers) ! def ===(version) version_matchers .all? {|matcher| matcher === version } end ! end

Slide 93

Slide 93 text

def version(requirements) case requirements when String op, req_version = requirements.split VersionMatcher.new(op, req_version) when Array matchers = requirements.map {|r| version(r)} VersionMatcher::All.new(matchers) end end

Slide 94

Slide 94 text

def version(requirements) case requirements when String op, req_version = requirements.split VersionMatcher.new(op, req_version) when Array matchers = requirements.map {|r| version(r)} VersionMatcher::All.new(matchers) end end

Slide 95

Slide 95 text

def version(requirements) case requirements when String op, req_version = requirements.split VersionMatcher.new(op, req_version) when Array matchers = requirements.map {|r| version(r)} VersionMatcher::All.new(matchers) end end

Slide 96

Slide 96 text

def version(requirements) case requirements when String op, req_version = requirements.split VersionMatcher.new(op, req_version) when Array matchers = requirements.map {|r| version(r)} VersionMatcher::All.new(matchers) end end

Slide 97

Slide 97 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 98

Slide 98 text

def somegem_adapter case OtherGem::VERSION when version("< 1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 99

Slide 99 text

def somegem_adapter case OtherGem::VERSION when VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 100

Slide 100 text

def somegem_adapter case OtherGem::VERSION when VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new when version([">= 1.0", "< 2.0"]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 101

Slide 101 text

def somegem_adapter case OtherGem::VERSION when VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new when VersionMatcher::All.new([ version(">= 1.0"), version("< 2.0") ]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 102

Slide 102 text

def somegem_adapter case OtherGem::VERSION when VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new when VersionMatcher::All.new([ version(">= 1.0"), version("< 2.0") ]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 103

Slide 103 text

def somegem_adapter case OtherGem::VERSION when VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new when VersionMatcher::All.new([ VersionMatcher.new(">=", "1.0"), VersionMatcher.new("<" , "2.0") ]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 104

Slide 104 text

def somegem_adapter case OtherGem::VERSION when VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new when VersionMatcher::All.new([ VersionMatcher.new(">=", "1.0"), VersionMatcher.new("<" , "2.0") ]) OtherGemAdapter::Version1x.new when version(">= 2.0") OtherGemAdapter::Current.new end end

Slide 105

Slide 105 text

def somegem_adapter case OtherGem::VERSION when VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new when VersionMatcher::All.new([ VersionMatcher.new(">=", "1.0"), VersionMatcher.new("<" , "2.0") ]) OtherGemAdapter::Version1x.new when VersionMatcher.new(">=", "2.0") OtherGemAdapter::Current.new end end

Slide 106

Slide 106 text

def somegem_adapter case OtherGem::VERSION when VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new when VersionMatcher::All.new([ VersionMatcher.new(">=", "1.0"), VersionMatcher.new("<" , "2.0") ]) OtherGemAdapter::Version1x.new when VersionMatcher.new(">=", "2.0") OtherGemAdapter::Current.new end end

Slide 107

Slide 107 text

def somegem_adapter OtherGem::VERSION VersionMatcher.new("<", "1.0") OtherGemAdapter::Prerelease.new VersionMatcher::All.new([ VersionMatcher.new(">=", "1.0"), VersionMatcher.new("<" , "2.0") ]) OtherGemAdapter::Version1x.new VersionMatcher.new(">=", "2.0") OtherGemAdapter::Current.new end end

Slide 108

Slide 108 text

def somegem_adapter ! if VersionMatcher.new("<", "1.0") \ === OtherGem::VERSION OtherGemAdapter::Prerelease.new elsif VersionMatcher::All.new([ VersionMatcher.new(">=", "1.0"), VersionMatcher.new("<" , "2.0") ]) \ === OtherGem::VERSION OtherGemAdapter::Version1x.new elsif VersionMatcher.new(">=", "2.0") \ === OtherGem::VERSION OtherGemAdapter::Current.new end ! end

Slide 109

Slide 109 text

def somegem_adapter ! if VersionMatcher.new("<", "1.0") \ === OtherGem::VERSION OtherGemAdapter::Prerelease.new elsif VersionMatcher::All.new([ VersionMatcher.new(">=", "1.0"), VersionMatcher.new("<" , "2.0") ]) \ === OtherGem::VERSION OtherGemAdapter::Version1x.new elsif VersionMatcher.new(">=", "2.0") \ === OtherGem::VERSION OtherGemAdapter::Current.new end ! end irb> OtherGem::VERSION = '0.9' irb> somegem_adapter => # irb> OtherGem::VERSION = '1.0' irb> somegem_adapter => # irb> OtherGem::VERSION = '1.2' irb> somegem_adapter => # irb> OtherGem::VERSION = '2.0' irb> somegem_adapter => # irb> OtherGem::VERSION = '4.0' irb> somegem_adapter => #

Slide 110

Slide 110 text

Thank you!