Skip to content
Self-defense helps prevent unexpected calls to an object within a given duration.
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib
MIT-LICENSE
README.md
gem-public_cert.pem
self-defense.gemspec

README.md

The Self Defense gem in action

The example below demonstrates how Bob the Martial Artist can defend himself 10 times in 30 seconds before adopting a different strategy.

require 'self-defense'

class MartialArtist

  def initialize()

  end

  def defend(manoeuvre={})
    action = ''
    strategy = lambda do |defense|

      coping_with_it = []
      coping_with_it << defense.sustained?(duration: '30s', hit_limit: 10)

      action = coping_with_it.all? ? 'blocked' : 'stop hitting me'
    end

    SelfDefense.new(&strategy) 
    puts Time.now.to_s + ': ' + action.to_s
  end
end


bob = MartialArtist.new

Time.now #=> 2013-08-16 18:42:43 +0100

bob.defend against: :kick  #=> 2013-08-16 18:42:43 +0100: blocked
sleep 5

bob.defend against: :punch #=> 2013-08-16 18:42:48 +0100: blocked
bob.defend against: :kick  #=> 2013-08-16 18:42:48 +0100: blocked
sleep 5

bob.defend against: :push  #=> 2013-08-16 18:42:53 +0100: blocked
bob.defend against: :punch #=> 2013-08-16 18:42:53 +0100: blocked
bob.defend against: :kick  #=> 2013-08-16 18:42:53 +0100: blocked
sleep 5

bob.defend against: :punch #=> 2013-08-16 18:42:58 +0100: blocked
bob.defend against: :kick  #=> 2013-08-16 18:42:58 +0100: blocked
bob.defend against: :kick  #=> 2013-08-16 18:42:58 +0100: blocked
bob.defend against: :punch #=> 2013-08-16 18:42:58 +0100: blocked
sleep 5

bob.defend against: :push  #=> 2013-08-16 18:43:03 +0100: stop hitting me
Time.now #=> 2013-08-16 18:43:03 +0100
sleep 25

bob.defend against: :kick  #=> 2013-08-16 18:43:28 +0100: stop hitting me
sleep 5

bob.defend against: :push  #=> 2013-08-16 18:43:35 +0100: blocked
bob.defend against: :push  #=> 2013-08-16 18:43:40 +0100: blocked

Rapid defense

require 'self-defense'

class MartialArtist

  def initialize()

  end

  def defend(manoeuvre={})
    action = ''
    strategy = lambda do |defense|

      coping_with_it = []
      coping_with_it << defense.rapid?(2)

      action = coping_with_it.all? ? 'blocked' : 'stop hitting me'
    end

    SelfDefense.new(&strategy) 
    puts Time.now.to_s + ': ' + action.to_s
  end
end


bob = MartialArtist.new

bob.defend against: :kick  #=> 2013-08-16 19:40:58 +0100: blocked
sleep 1
bob.defend against: :kick  #=> 2013-08-16 19:40:59 +0100: stop hitting me
sleep 2
bob.defend against: :punch #=> 2013-08-16 19:41:01 +0100: blocked
sleep 1
bob.defend against: :push  #=> 2013-08-16 19:41:02 +0100: stop hitting me
sleep 0.5
bob.defend against: :kick  #=> 2013-08-16 19:41:02 +0100: stop hitting me
sleep 0.5
bob.defend against: :punch #=> 2013-08-16 19:41:03 +0100: stop hitting me
sleep 2
bob.defend against: :kick  #=> 2013-08-16 19:41:05 +0100: blocked
sleep 2
bob.defend against: :kick  #=> 2013-08-16 19:41:07 +0100: blocked
sleep 2.5
bob.defend against: :punch #=> 2013-08-16 19:41:09 +0100: blocked
sleep 2
bob.defend against: :push  #=> 2013-08-16 19:41:11 +0100: blocked
sleep 0.5
bob.defend against: :punch #=> 2013-08-16 19:41:12 +0100: stop hitting me

Sustained and rapid defense together

require 'self-defense'

class MartialArtist

  def initialize()

  end

  def defend(manoeuvre={})
    action = ''
    strategy = lambda do |defense|

      coping_with_it = []
      coping_with_it << defense.rapid?(1)
      coping_with_it << defense.sustained?(duration: '30s', hit_limit: 7)

      action = coping_with_it.all? ? 'blocked' : 'stop hitting me'
    end

    SelfDefense.new(&strategy) 
    puts Time.now.to_s + ': ' + action.to_s
  end
end

bob = MartialArtist.new

bob.defend against: :kick  #=> 2013-08-16 19:51:58 +0100: stop hitting me
sleep 1
bob.defend against: :kick  #=> 2013-08-16 19:51:59 +0100: blocked
sleep 2
bob.defend against: :punch #=> 2013-08-16 19:52:01 +0100: blocked
sleep 1
bob.defend against: :push  #=> 2013-08-16 19:52:02 +0100: blocked
sleep 0.5
bob.defend against: :kick  #=> 2013-08-16 19:52:03 +0100: stop hitting me
sleep 0.5
bob.defend against: :punch #=> 2013-08-16 19:52:03 +0100: stop hitting me
sleep 2
bob.defend against: :kick  #=> 2013-08-16 19:52:05 +0100: blocked
sleep 2
bob.defend against: :kick  #=> 2013-08-16 19:52:07 +0100: blocked
sleep 2.5
bob.defend against: :punch #=> 2013-08-16 19:52:10 +0100: stop hitting me
sleep 2
bob.defend against: :push  #=> 2013-08-16 19:52:12 +0100: stop hitting me
sleep 0.5
bob.defend against: :punch #=> 2013-08-16 19:52:14 +0100: stop hitting me
Something went wrong with that request. Please try again.