flu_shot 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9bf1b632233658c920443dcf05c1b80f786210abfbaf49a53fa611b0cafeca2c
4
- data.tar.gz: 53de6450c297df25f17ac891f79f22c36106224f0166bd7955a6ecccf407b2ae
3
+ metadata.gz: d252d5c120bc8b41e6f80b754e2d08727250075f76ef3dca4815f5681d7dcfbd
4
+ data.tar.gz: 0b1f124319d00aa3f4f3c01ed9c068620c231f8b91f12f70a7938d1dfefe7f43
5
5
  SHA512:
6
- metadata.gz: 0d65d96a6f53ed450979fd10106fa278d7602161a0012fc878e11b54d19c6fb87be24abed1c96c8f8ea1e971357a5963ef00e710dfaa0465e13b7e03bd144cac
7
- data.tar.gz: b43fe609f44d25804d07a3908cdd35725551a0f4576fdbe9560786922e6fecc70f624bb86872bf51b40d491dfd9be3e20c8605880e2366166b3315786beb63c8
6
+ metadata.gz: e1f13c53db4a9ea6f28e0f90aa9bcb40091d53120e454254ac034f0bdd14162aaf378ff22707840b22a9885f46ca3ea3ce1baa9acc0521aab0f58ef72af29cdb
7
+ data.tar.gz: c1087095009ae80804ffedcf1a811adc31c177e915acb655b3578cf746341c9d1efc1986f48a057ae97af39f949089690319363e606bb574853512a93f6949c8
@@ -0,0 +1,20 @@
1
+ name: Ruby
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Set up Ruby 2.4.9
13
+ uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.4.9
16
+ - name: Build and test with Rake
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs 4 --retry 3
20
+ bundle exec rake test
data/.gitignore CHANGED
@@ -6,3 +6,6 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ *.gem
10
+
11
+ .DS_Store
data/.travis.yml CHANGED
@@ -5,3 +5,5 @@ cache: bundler
5
5
  rvm:
6
6
  - 2.6.4
7
7
  before_install: gem install bundler -v 1.17.2
8
+ services:
9
+ - redis-server
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ flu_shot (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ minitest (5.14.0)
10
+ mocha (1.11.2)
11
+ rake (10.5.0)
12
+ redis (4.1.3)
13
+
14
+ PLATFORMS
15
+ ruby
16
+
17
+ DEPENDENCIES
18
+ bundler (~> 1.17)
19
+ flu_shot!
20
+ minitest (~> 5.0)
21
+ mocha (~> 1.11.0)
22
+ rake (~> 10.0)
23
+ redis (~> 4.1.0)
24
+
25
+ BUNDLED WITH
26
+ 1.17.2
data/README.md CHANGED
@@ -1,8 +1,43 @@
1
1
  # FluShot
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/flu_shot`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ <img style="float: right;" src="https://raw.githubusercontent.com/Nucc/flu_shot/assets/logo.png"/>
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ FluShot is a Chaos Testing tool for Ruby applications. It can inject unexpected behaviors into your system, like adding extra latency to a network request, simulating infinite loops, raising exceptions.
6
+
7
+ **The project is currently in `work in progress`**
8
+
9
+ Idea:
10
+
11
+ First we specify the area where the flu shot needs to be injected:
12
+
13
+ ```
14
+ class UserController < ApplicationController
15
+ def show
16
+ FluShot.inject(:user_controller_show) do
17
+ User.find(params[:user_id])
18
+ end
19
+ end
20
+ end
21
+ ```
22
+
23
+ We can specify vaccines that has a certain behaviour, like adding extra latency:
24
+ ```
25
+ class Latency < FluShot::Vaccine
26
+ label :latency
27
+
28
+ def initialize(params = {})
29
+ sleep(rand(params[:max] - params[:min]) + params[:min])
30
+ end
31
+ end
32
+ ```
33
+
34
+ Finally we need to create a prescription for the `user_controller_show` and inject the `latency` vaccine:
35
+
36
+ ```
37
+ FluShot::Prescription.for(:user_controller_show) do |prescription|
38
+ prescription.add(:latency, {min: 1000, max: 3000})
39
+ end
40
+ ```
6
41
 
7
42
  ## Installation
8
43
 
@@ -22,7 +57,6 @@ Or install it yourself as:
22
57
 
23
58
  ## Usage
24
59
 
25
- TODO: Write usage instructions here
26
60
 
27
61
  ## Development
28
62
 
@@ -32,7 +66,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
66
 
33
67
  ## Contributing
34
68
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/flu_shot. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
69
+ Bug reports and pull requests are welcome on GitHub at https://github.com/nucc/flu_shot. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
70
 
37
71
  ## License
38
72
 
data/Rakefile CHANGED
@@ -2,9 +2,9 @@ require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
5
+ t.libs << "specs"
6
6
  t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
7
+ t.test_files = FileList["specs/**/*_spec.rb"]
8
8
  end
9
9
 
10
10
  task :default => :test
data/flu_shot.gemspec CHANGED
@@ -39,4 +39,6 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "bundler", "~> 1.17"
40
40
  spec.add_development_dependency "rake", "~> 10.0"
41
41
  spec.add_development_dependency "minitest", "~> 5.0"
42
+ spec.add_development_dependency "mocha", "~> 1.11.0"
43
+ spec.add_development_dependency "redis", "~> 4.1.0"
42
44
  end
@@ -0,0 +1,11 @@
1
+ module FluShot
2
+ class Config
3
+ def self.storage=(value)
4
+ @@storage = value
5
+ end
6
+
7
+ def self.storage
8
+ @@storage ||= Storage::Memory.new
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ module FluShot
2
+ class Prescription
3
+ def self.spec(name, &block)
4
+ block.call(self.new(name)) if block_given?
5
+ end
6
+
7
+ def initialize(name)
8
+ @name = name
9
+ self.class.prescriptions.add(@name, [])
10
+ end
11
+
12
+ def add(vaccine, params = {})
13
+ current = self.class.prescriptions.get(@name)
14
+ current << { vaccine: vaccine, params: params }
15
+ self.class.prescriptions.add(@name, current)
16
+ end
17
+
18
+ def self.for(name)
19
+ prescriptions.get(name)
20
+ end
21
+
22
+ private
23
+
24
+ def self.prescriptions
25
+ Config.storage
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,9 @@
1
+ module FluShot
2
+ class Sneeze < StandardError
3
+ def initialize(exception)
4
+ @wrapped_exception = exception
5
+ end
6
+
7
+ attr_reader :wrapped_exception
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ module FluShot
2
+ module Storage
3
+ class Memory
4
+ def initialize
5
+ @storage = {}
6
+ end
7
+
8
+ def add(prescription_name, vaccines)
9
+ @storage[prescription_name] ||= []
10
+ vaccines = [vaccines] unless vaccines.is_a?(Array)
11
+ @storage[prescription_name] = vaccines
12
+ end
13
+
14
+ def get(prescription_name)
15
+ @storage[prescription_name] || []
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ require 'redis'
2
+ require 'yaml'
3
+
4
+ module FluShot
5
+ module Storage
6
+ class Redis
7
+ def initialize(connection)
8
+ @connection = connection
9
+ end
10
+
11
+ def add(prescription, vaccines)
12
+ vaccines = [vaccines] unless vaccines.is_a?(Array)
13
+ @connection.hset('flu_shot', prescription.to_s, YAML.dump(vaccines))
14
+ end
15
+
16
+ def get(name)
17
+ value = @connection.hget('flu_shot', name)
18
+ value ? YAML.load(value) : []
19
+ end
20
+
21
+ def reset
22
+ @connection.hgetall('flu_shot').each_key do |x|
23
+ @connection.hdel('flu_shot', x)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,63 @@
1
+ # The idea here is to do something like this in the code:
2
+ #
3
+ # ... your business layer ...
4
+ # FluShot.inject(:user_profile_fetch)
5
+ #
6
+ # Define a latency vaccine that you can inject into your business layer
7
+ # and adds a random delay between 1 and 3 seconds.
8
+ #
9
+ # class Latency < FluShot::Vaccine
10
+ # label :latency
11
+ #
12
+ # def initialize(params)
13
+ # sleep(rand(params[:max] - params[:min]) + params[:min])
14
+ # end
15
+ # end
16
+ #
17
+ # FluShot.on :user_profile_fetch do
18
+ # FluShot::Vaccine.use(:latency, {min: 1000, max: 3000})
19
+ # end
20
+ #
21
+ #
22
+ module FluShot
23
+ class Vaccine
24
+ attr_reader :attributes
25
+
26
+ def initialize(attributes = {})
27
+ @attributes = attributes
28
+ end
29
+
30
+ def self.label(name = nil)
31
+ if name.nil?
32
+ if defined?(@vaccine_name)
33
+ @vaccine_name
34
+ end || :unknown
35
+ else
36
+ @vaccine_name = name
37
+ vaccines[name] = self
38
+ end
39
+ end
40
+
41
+ def self.registered
42
+ self.vaccines.keys
43
+ end
44
+
45
+ def self.find(name)
46
+ self.vaccines[name]
47
+ end
48
+
49
+ def self.use(name, params = {})
50
+ find(name).new(params)
51
+ end
52
+
53
+ def label
54
+ self.class.label
55
+ end
56
+
57
+ private
58
+
59
+ def self.vaccines
60
+ Thread.current[:vaccines] ||= {}
61
+ end
62
+ end
63
+ end
@@ -1,3 +1,3 @@
1
1
  module FluShot
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/flu_shot.rb CHANGED
@@ -1,6 +1,56 @@
1
1
  require "flu_shot/version"
2
+ require 'flu_shot/vaccine'
3
+ require 'flu_shot/prescription'
4
+ require 'flu_shot/config'
5
+ require 'flu_shot/sneeze'
6
+
2
7
 
3
8
  module FluShot
9
+ module Storage
10
+ autoload :Memory, 'flu_shot/storage/memory'
11
+ autoload :Redis, 'flu_shot/storage/redis'
12
+ end
13
+
4
14
  class Error < StandardError; end
5
- # Your code goes here...
15
+
16
+ def self.inject(name, &block)
17
+ if !before_filter.call
18
+ return
19
+ end
20
+
21
+ Prescription.for(name).each do |prescription|
22
+ Vaccine.find(prescription[:vaccine]).new(prescription[:params])
23
+ end
24
+
25
+ # @test
26
+ _before_init
27
+ block_given? ? block.call : nil
28
+
29
+ rescue FluShot::Sneeze => sneeze
30
+ raise sneeze.wrapped_exception
31
+
32
+ rescue
33
+ # @test
34
+ _exception_muted
35
+ block_given? ? block.call : nil
36
+ end
37
+
38
+ def self.inject_only_if(&block)
39
+ Thread.current[:before_filter] = block
40
+ end
41
+
42
+ private
43
+
44
+ def self.before_filter
45
+ Thread.current[:before_filter] ||= Proc.new { true }
46
+ Thread.current[:before_filter]
47
+ end
48
+
49
+ # @test
50
+ def self._before_init
51
+ end
52
+
53
+ # @test
54
+ def self._exception_muted
55
+ end
6
56
  end
@@ -0,0 +1,59 @@
1
+ require "spec_helper"
2
+
3
+ describe FluShot do
4
+ it 'has a VERSION number' do
5
+ refute_nil ::FluShot::VERSION
6
+ end
7
+
8
+ describe '#inject' do
9
+ it 'requires a name' do
10
+ assert_nil FluShot.inject('name')
11
+ end
12
+
13
+ it 'executes the given block' do
14
+ ret = FluShot.inject('name') do
15
+ 'hello'
16
+ end
17
+
18
+ assert_equal 'hello', ret
19
+ end
20
+
21
+ it 'executes the given block even if exception occurs' do
22
+ FluShot.stubs(:_before_init).raises(StandardError, 'should be catched')
23
+ ret = FluShot.inject('name') do
24
+ 'hello'
25
+ end
26
+
27
+ assert_equal 'hello', ret
28
+ end
29
+
30
+ it 'can be switched off' do
31
+ FluShot.inject_only_if do
32
+ false
33
+ end
34
+ FluShot.expects(:_before_init).never
35
+ FluShot.inject('name')
36
+ end
37
+ end
38
+
39
+ describe '#inject_only_if' do
40
+ it 'does not aborts when exception occurs in it' do
41
+ FluShot.inject_only_if do
42
+ raise 'it should be catched'
43
+ end
44
+ FluShot.expects(:_before_init).never
45
+ FluShot.expects(:_exception_muted).once
46
+ FluShot.inject('name')
47
+ end
48
+ end
49
+
50
+ describe 'sneeze' do
51
+ it 'is not rescued' do
52
+ FluShot.stubs(:_before_init).raises(FluShot::Sneeze.new(StandardError.new), 'should not be catched')
53
+
54
+ assert_raises StandardError do
55
+ FluShot.inject('name')
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe :inject do
4
+
5
+ class Rand123 < FluShot::Vaccine
6
+ label :injection_test_vaccine
7
+
8
+ def initialize(*args)
9
+ test
10
+ end
11
+
12
+ def test
13
+ end
14
+ end
15
+
16
+ it 'executes all the vaccines from a prescription' do
17
+ FluShot::Prescription.spec(:injection_name) do |p|
18
+ p.add(:injection_test_vaccine, {})
19
+ end
20
+
21
+ Rand123.any_instance.expects(:test).once
22
+ FluShot.inject(:injection_name)
23
+ end
24
+
25
+ it 'works with Redis store' do
26
+ FluShot::Config.storage = FluShot::Storage::Redis.new(Redis.new)
27
+ FluShot::Prescription.spec(:injection_name) do |p|
28
+ p.add(:injection_test_vaccine, {})
29
+ end
30
+
31
+ Rand123.any_instance.expects(:test).once
32
+ FluShot.inject(:injection_name)
33
+ end
34
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe FluShot::Config do
4
+
5
+ describe '#storage' do
6
+
7
+ before do
8
+ FluShot::Config.storage = nil
9
+ end
10
+
11
+ it 'returns memory storage by default' do
12
+ assert FluShot::Config.storage.is_a?(FluShot::Storage::Memory)
13
+ end
14
+
15
+ it 'returns the same storage instance' do
16
+ assert_equal FluShot::Config.storage.object_id, FluShot::Config.storage.object_id
17
+ end
18
+
19
+ it 'can register other storage objects too' do
20
+ FluShot::Config.storage = FluShot::Storage::Redis.new(Redis.new)
21
+ assert FluShot::Config.storage.is_a?(FluShot::Storage::Redis)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe FluShot::Prescription do
4
+ describe '#spec' do
5
+
6
+ class VaccineMock < FluShot::Vaccine
7
+ label :vaccine_label
8
+
9
+ def initialize(*params)
10
+ params
11
+ end
12
+ end
13
+
14
+ it 'registers vaccines' do
15
+ FluShot::Prescription.spec(:name) do |order|
16
+ order.add(:vaccine_label)
17
+ end
18
+
19
+ assert_equal({:vaccine => :vaccine_label, :params => {}}, FluShot::Prescription.for(:name).first)
20
+ end
21
+
22
+ it 'remembers to the ingridients of the vaccines' do
23
+ FluShot::Prescription.spec(:name) do |p|
24
+ p.add(:vaccine_label, {param: 1})
25
+ p.add(:vaccine_label, {param: 2})
26
+ end
27
+
28
+ assert_equal({:vaccine => :vaccine_label, :params => {:param => 1}}, FluShot::Prescription.for(:name).first)
29
+ assert_equal 2, FluShot::Prescription.for(:name).size
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ # describe FluShot::Receipt do
2
+ # it ''
3
+ # end
4
+
5
+
6
+ # FluShot.describe(:shared_session) do |receipt|
7
+ # receipt.add(Vaccine.use(:latency, {min: 3000, max: 3000}))
8
+ # end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe FluShot::Sneeze do
4
+ it 'can be raised as an exception' do
5
+ assert_raises do
6
+ raise FluShot::Sneeze.new
7
+ end
8
+ end
9
+
10
+ it 'can wrap another exception' do
11
+ sneeze = FluShot::Sneeze.new(StandardError.new)
12
+ assert_equal StandardError, sneeze.wrapped_exception.class
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe FluShot::Storage::Memory do
4
+ before do
5
+ @store = FluShot::Storage::Memory.new
6
+ end
7
+
8
+ it 'returns [] when prescription is missing' do
9
+ assert_equal [], @store.get('prescription_name')
10
+ end
11
+
12
+ it 'stores vaccines for a prescription' do
13
+ @store.add('prescription_name', {vaccine: 'vaccine_name'})
14
+ assert_equal 'vaccine_name', @store.get('prescription_name').first[:vaccine]
15
+ end
16
+
17
+ it 'stores vaccine with parameters' do
18
+ @store.add('prescription_name', {vaccine: 'vaccine_name', params: {param: 'value'}})
19
+ assert_equal 'value', @store.get('prescription_name').first[:params][:param]
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe FluShot::Storage::Redis do
4
+ before do
5
+ connection = Redis.new
6
+ @store = FluShot::Storage::Redis.new(connection)
7
+ @store.reset
8
+ end
9
+
10
+ it 'returns [] when prescription is missing' do
11
+ assert_equal [], @store.get('prescription_name')
12
+ end
13
+
14
+ it 'stores vaccine for a prescription' do
15
+ @store.add('prescription_name', {vaccine: 'vaccine_name'})
16
+ assert_equal 'vaccine_name', @store.get('prescription_name').first[:vaccine]
17
+ end
18
+
19
+ it 'stores vaccine with parameters' do
20
+ @store.add('prescription_name', {vaccine: 'vaccine_name', params: {param: 'value'}})
21
+ assert_equal 'value', @store.get('prescription_name').first[:params][:param]
22
+ end
23
+
24
+ it 'can reset itself' do
25
+ @store.add('prescription_name', {param: 1})
26
+ @store.reset
27
+ assert_equal [], @store.get('prescription_name')
28
+ end
29
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe FluShot::Vaccine do
4
+ it 'has an unknown label by default' do
5
+ vaccine = FluShot::Vaccine.new
6
+ assert_equal :unknown, vaccine.label
7
+ end
8
+
9
+ it 'has a label that registers itself in a repo' do
10
+ Class.new(FluShot::Vaccine) { label :latency }
11
+ assert FluShot::Vaccine.registered.include?(:latency)
12
+ end
13
+
14
+ it 'can have attributes' do
15
+ vaccine = FluShot::Vaccine.new({min: 1000, max: 3000})
16
+ assert_equal 1000, vaccine.attributes[:min]
17
+ assert_equal 3000, vaccine.attributes[:max]
18
+ end
19
+
20
+ describe '#find' do
21
+ it 'can initialize a vaccine from the label' do
22
+ class Vaccine1 < FluShot::Vaccine
23
+ label :vaccine1
24
+ end
25
+ assert_equal Vaccine1, FluShot::Vaccine.find(:vaccine1)
26
+ end
27
+ end
28
+
29
+ describe '#use' do
30
+ it 'finds and executes the vaccine' do
31
+ class Vaccine2 < FluShot::Vaccine
32
+ attr_reader :test_value
33
+ label :latency
34
+
35
+ def initialize(params = {})
36
+ @test_value = :ok
37
+ end
38
+ end
39
+
40
+ assert_equal :ok, FluShot::Vaccine.use(:latency).test_value
41
+ end
42
+
43
+ it 'finds and executes the vaccine with attributes' do
44
+ class Vaccine3 < FluShot::Vaccine
45
+ attr_reader :min, :max
46
+ label :latency
47
+
48
+ def initialize(params = {})
49
+ @min = params[:min]
50
+ @max = params[:max]
51
+ end
52
+ end
53
+
54
+ assert_equal 1000, FluShot::Vaccine.use(:latency, {min: 1000, max: 3000}).min
55
+ assert_equal 3000, FluShot::Vaccine.use(:latency, {min: 1000, max: 3000}).max
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+ require "flu_shot"
3
+
4
+ require "minitest/autorun"
5
+ require "minitest/spec"
6
+ require "mocha/minitest"
7
+
8
+ class Minitest::Spec
9
+ before :each do
10
+ FluShot::Config.storage = FluShot::Storage::Memory.new
11
+ FluShot.inject_only_if { true }
12
+ end
13
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flu_shot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laszlo Papp
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-08 00:00:00.000000000 Z
11
+ date: 2020-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.11.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.11.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: redis
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 4.1.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 4.1.0
55
83
  description: ''
56
84
  email:
57
85
  - nucc@bteam.hu
@@ -59,10 +87,12 @@ executables: []
59
87
  extensions: []
60
88
  extra_rdoc_files: []
61
89
  files:
90
+ - ".github/workflows/ruby.yml"
62
91
  - ".gitignore"
63
92
  - ".travis.yml"
64
93
  - CODE_OF_CONDUCT.md
65
94
  - Gemfile
95
+ - Gemfile.lock
66
96
  - LICENSE.txt
67
97
  - README.md
68
98
  - Rakefile
@@ -70,7 +100,23 @@ files:
70
100
  - bin/setup
71
101
  - flu_shot.gemspec
72
102
  - lib/flu_shot.rb
103
+ - lib/flu_shot/config.rb
104
+ - lib/flu_shot/prescription.rb
105
+ - lib/flu_shot/sneeze.rb
106
+ - lib/flu_shot/storage/memory.rb
107
+ - lib/flu_shot/storage/redis.rb
108
+ - lib/flu_shot/vaccine.rb
73
109
  - lib/flu_shot/version.rb
110
+ - specs/flu_shot_spec.rb
111
+ - specs/integration/inject_spec.rb
112
+ - specs/lib/config_spec.rb
113
+ - specs/lib/prescription_spec.rb
114
+ - specs/lib/receipt_spec.rb
115
+ - specs/lib/sneeze_spec.rb
116
+ - specs/lib/storage/memory_spec.rb
117
+ - specs/lib/storage/redis_spec.rb
118
+ - specs/lib/vaccine_spec.rb
119
+ - specs/spec_helper.rb
74
120
  homepage: https://github.com/Nucc/flu_shot
75
121
  licenses:
76
122
  - MIT